Arduino incontra matlab!

I prodotti Arduino e Matlab sono ormai consolidati nel mercato internazionale e vantano di estese comunità utenti dove è possibile discutere dei più svariati problemi e delle possibili soluzioni, i due siti di riferimento sono http://www.mathworks.com/ e http://www.arduino.cc.
Entrambi vengono utilizzati nel campi più disparati: università, aziende e privati.
La loro grande differenza è dovuta ai loro connotati. Arduino è un prodotto principalmente hardware, matlab è un prodotto software.
L’idea di “fondere” questi due prodotti porta ovvi vantaggi. Vediamo più da vicino la potenza del binomio Arduino-Matlab:

Punti di forza del matlab

Versione studenti a prezzo accessibile
Ottimizzazione del calcolo matriciale
Calcolo Simbolico.
Possibilità di creazione interfacce grafiche tramite il tool “GuiDe”.
Linguaggio di programmazione molto semplice (livello più alto di astrazione,le variabili non necessiatano di inizializzazone, gestione array dinamici)
Presenza di un ottimo debugger.

Punti di forza dell’arduino
Prezzo basso.
Gestione I-O analogici e digitali
Progetti di automazione richiedono l’utilizzo motori DC- sensori e PWM
Una comunità consolidata fornisce diversi tipi di progetti, tutorial e supporto tecnico

È possibile scaricare del sito ufficiale della Matworks il tool che permette la comuncazione con arduino. Con questa soluzione è possibile utilizzare il Matlab per effettuare tutti i calcoli necessari al controllo di un dispositivo utilizzando la scheda arduino come interfaccia I-O.
Da notare che non è necessario utilizzare l’IDE dell’arduino e programmare l’atmega per ogni prova con ogni vantaggio del caso.

Si passa ora all’analisi dettagliata dei passi procedurali per la comunicazione:

Ambiente Arduino:
Per prima cosa è necessario scaricare il tool dal sito ufficiale ed estrarre il contenuto della cartella compressa, poi caricare nel microcontrollore lo sketch adiosrv.pde.

Ambiente matlab:
Salvare il file arduino.m nella cartella corrente del matlab.
Aprire matlab e creare l’oggetto “arduino”digitando il comando
a=arduino(‘indirizzo porta’);
Se si è in ambiente windows la porta in genere ha un nominativo del tipo “com”
es: a=arduino(‘COM1’);
In ambiente linux la porta corrisponde ad un file salvato nella cartella /dev/
es: a=arduino(‘/dev/ttyUSB0’);
Nota: in ambiente linux per poter scrivere sulla porta seriale è necessario avere i privilegi di root.

A questo è stato creato l’oggetto arduino, tale oggetto vanta metodi che presentano la stessa sintassi del linguaggio utilizzata negli sketch arduino. Ad esempio per inizializzare una porta come input o output la sintassi è:
a.pinMode(#, ‘output’);
a.pinMode(#,’input’);

per eseguire lettura/scrittura da una porta la sintassi è la seguente
letturaDigitale=a.digitalRead(#);
letturaAnalogica=a.analogRead(#);
a.analogWrite(#,*);
a.digitalWrite(#,*);

con: # numero porta,* valore da inviare.

alla fine del programma è necessario chiudere il collegamento con il microcontrollore, la routine viene gestita dal comando:

delete(a);

Si nota subito che tradurre uno sketch arduino in uno script matlab è molto semplice,per avere un quadro completo di come si effettua questa “traduzione” si veda come tradurre uno sketch funzionante, preso dalla cartella examples, in uno script:
Lo sketch arduino presenta la seguente sintassi:

void setup() {
Serial.begin(9600);
pinMode(2, INPUT);
}

void loop() {
int sensorValue = digitalRead(2);
Serial.println(sensorValue, DEC);
}

per creare lo script matlab la prima cosa da fare è creare l’oggetto arduino

a=arduino(‘/dev/ttyUSB0’);

A questo punto si effettuano le operazioni di inizializzazione. Soffermandosi a ragionare sulla logica del tool in questione si intuisce che l’utilizzo della porta seriale diviene inutile, poiché la variabile da leggere è già presente nel workspace, quindi non è necessaria alcuna comunicazione per visualizzare il valore di tale variabile nel PC, con tutti i vantaggi che ne seguono.

a.pinMode(2, INPUT);

Per creare il loop una soluzione può essere data dall’utilizzo del ciclo while nel seguente modo.

while 1
sensorValue = a.digitalRead(2);
end

delete(a)

I lettori più scaltri avranno notato un difetto che caratterizza questa soluzione, ovvero il ciclo “loop” costituito da while 1 non permette la chiusura del programma e quindi della porta.

In genere in ambiente matlab quando ci si trova in un loop infinito si esce da questo con la pressione CTRL+C, interrompendo brutalmente l’esecuzione dello script, ma tale soluzione non permette comunque la chiusura della porta. Una soluzione più elegante è data da kbhit uno script che permette di monitorare i pulsanti premuti sulla tastiera, tale script è stato modificato del sottoscritto per questa applicazione. lo script modificato è disponibile qui. Tale script controlla se è stato premuto il tasto “c” sulla tastiera durante l’esecuzione di un programma in matlab. Il file kbhit.m deve essere copiato nella cartella corrente del matlab.

Il programma quindi viene modificato nel seguente modo


a=arduino(‘/dev/ttyUSB0’);

a.pinMode(2, INPUT);

kbhit(‘init’)% bisogna inizializzare il monitor di tastiera
while 1
[key, ctrlc] = kbhit(‘event’); %controlla se è stato premuto il tasto ‘c’ per uscire dal loop
if ctrlc
break
end
sensorValue = a.digitalRead(2);
end

delete(a)
kbhit(‘stop’);% si esclude il monitor di tastiera

A questo punto è possibile sbizzarrirsi provando nuove soluzioni utilizzando script malab.
Putroppo c’è da dire che il tool è ancora in fase di sviluppo e non consente la gestione di tutti i comandi dell’arduino.

Michele Colledanchise
Tags: ,
By Michele Colledanchise | giugno 8th, 2011 | SHOW COMMENTS (2)

2 Responses

  1. carmin19 says

    Ciao, sono ai primi approcci della programmazione di Arduino tramite Matlab e anche io sta avendo il problema che Matlab rimane in esecuzione sulla porta dov’è collegato Arduino rimanendo occupato (Busy).
    Mi potreste dire come fare per caricare completamente il codice sulla scheda Arduino chiudendo il collegamento con la porta seriale?

  2. Arduino&Matlab: real time plot | Automazione Open Source says

    […] stabilire una comunicazione client-server tra Arduino e Matlab, rifacendoci al precedente articolo “Arduino incontra Matlab!” i passi necessari per installare il pacchetto […]