domenica 22 febbraio 2015

Collegamento Arduino - Matlab

La guida si riferisce al metodo utilizzato prima del rilascio del pacchetto di comunicazione ufficiale da parte di Mathworks per Arduino.

Questa guida vuole unire due strumenti, apparentemente, molto diversi:
Arduino, un micro controllore collegabile a diversi sensori 
Matlab, un programma d'analisi matematica

L'idea di base è utilizzare Arduino per la corretta connessione/accoppiamento di diversi sensori, lasciando a Matlab il compito di raccogliere ed analizzare i risultati.

Di base Arduino comunica in modo seriale con il computer o altri dispositivi, quindi per il corretto collegamento Arduino & Matlab è necessario iniziare - inizializzare - un canale di comunicazione; appunto seriale.

Per prima cosa iniziamo da Arduino, apriamo l'IDE che utilizziamo sempre per scrivere e caricare i nostri programmi dal pc ad Arduino:


Copiamo il programma seguente:
 void setup(){  
Serial.begin(9600);
Serial.println('a');
char a = 'b';
while (a !='a'){
a=Serial.read();
}
}
void loop(){
}

Il semplice programma inizializza una seriale a 9600 baud, scrivendo la lettera 'a' sulla seriale. Il ciclo si conclude  quando dalla seriale viene letto una lettera diversa da 'a' . In questo modo il dispositivo in ascolto avrà comunicato il corretto collegamento. Ora veniamo al codice Matlab:
Per prima cosa dobbiamo comunicare - nativamente - a Matlab la porta utilizzata da Arduino per comunicare, per farlo dobbiamo aprire un nuovo documento di testo ed inserire:
-Dgnu.io.rxtx.SerialPorts=/dev/ttyS0:/dev/ttyUSB0:/dev/ttyACM0
Salviamo il file di testo con il nome "java.opts" , dove 'java' è il nome ed il '.opts'  l'estensione. Ora dobbiamo fare in modo che Matlab  carichi il file quando necessario, scriviamo nella Command Window di Matlab i seguenti comandi, tenendo nota del risultato d'ogni uno:
matlabroot
e successivamente
computer('arch') 
Il file "java.opts" andrà salvato nella locazione: $MATLABROOT/bin/$ARCH
Dove andremo a sostituire i nomi colorati con i percorsi trovati dai comandi applicati prima in Command Window.


Ora apriamo Matlab, nuova funzione e copiamo il seguente programma:
 %scrivere in console  
%instrhwinfo ('serial')
%comPort = '/dev/ttyACM0';
%[ s,flag ] = setupSerial( comPort );

function [s,flag] = setupSerial(comPort)

flag = 1;

s=serial(comPort);
set(s,'DataBits',8);
set(s,'StopBits',1);
set(s,'BaudRate',9600);
set(s,'Parity','none');
fopen(s); % fopen (serial),Connect serial port object to device
a='b';
while (a~='a')
a=fread(s,1,'uchar'); % fread (serial),Read binary data from device
end
if(a=='a')
disp('serial read');
end
fprintf(s,'%c','a'); % fprintf (serial),Write text to device
mbox= msgbox('Serial Communication setup.'); uiwait(mbox);
fscanf(s,'%u'); % fscanf (serial),Read ASCII data from device, and format as text
end

La funzione setupSerial si occupa, nella prima parte, del corretta inizializzazione tramite la seriale con Arduino.
La seconda parte invia una lettera diversa dalla 'a' in ingresso ad Arduino, confermando l'avvenuto collegamento.
Usiamo 'mbox' per visualizzare a schermo un messaggio d'avvenuto collegamento.


Ora basterà caricare nella Command Windows di Matlab i seguenti comandi:

- porta di collegamento con Arduino con il comando:
comPort = '/dev/ttyACM0';
- avviare la funzione con il comando:
[ s,flag ] = setupSerial( comPort );

Se tutto risponde correttamente si visualizzerà un avviso con la scritta "Serial Communication setup" .

NOTE:
Come potete vedere dall'immagine qui sopra di Matlab, la finestra "current folder" è aperta sulla cartella contenente il file della funzione. Se così non fosse, potremmo riscontrare qualche messaggio d'errore tipo: Undefined function 'setupSerial' for input arguments of type 'char'


martedì 17 febbraio 2015

Script python Transmission

Per questione di comodità ho deciso di scrivere due semplici script, uno per collegare rapidamente pc e Raspberry tramite il comando ssh ed uno direttamente sul Raspberry con i comandi più utili.

Raspberry connection script:
Riposto qui lo script, vi basterà copiarlo in un file di testo e cambiare l'estensione da .txt a .py  .
#!/usr/bin/python
import os
print 'Raspberry connection script'
os.system("ssh pi@IP_RASPBERRY")
Ricordate di cambiare IP_RASPBERRY con l'indirizzo del vostro raspberry.
Salvate il tutto, cambiate successivamente l'estensione da .txt a .py .
Per renderlo subito eseguibile lo script clicchiamo con il destro, proprietà, permessi, mettiamo la spunta nell'ultima riga "esecuzione".
Una volta avviato vi verrò chiesto d'inserire la vostra password, e si collegherà automaticamente.


Raspberry Transmission script:
Questo script va scritto direttamente sul nostro raspberry, colleghiamoci tramite lo script appena scritto qui sopra ed iniziamo.
Creiamo lo script con il comando:
sudo nano transmission
ora copiamo lo script riportato qui sotto:
----------
 #!/usr/bin/python  
#code by Dave Calaway http://goo.gl/7yt8Lf
import os
print 'Transmission script'
while True:
numero = int( raw_input('1 stop\n2 edit .json\n3 load setting\n4 reload transmission\n0 exit\n') )
if numero == 1:
os.system("sudo /etc/init.d/transmission-daemon stop")
if numero == 2:
os.system("cd /etc/transmission-daemon && sudo nano settings.json")
if numero == 3:
os.system("sudo /etc/init.d/transmission-daemon reload")
if numero == 4:
os.system("sudo /etc/init.d/transmission-daemon restart")
if numero == 0:
break
print 'bye :D'

Ora salviamo premendo CTRL+O, invio per confermare il nome ed in fine CTRL+X per uscire dall'editor.

Ora proviamo ad avviarlo, scriviamo:
python transmission
ora seguiamo le informazioni a monitor.
Ogni volta che ci collegheremo al Raspberry lo script sarà li e pronto per essere avviato con il comando sopra citato.