Stai guardando > Guide e Tutorials
Arduino + PSP : Lezione 0 - Le basi |
|
| Autore: zero-one | Pubblicato il : 30/04/10 |

#Chillout!
Questo documento è scritto per introdurre chiunque al physical computing con PSP e la piattaforma Arduino.
L'obiettivo di questo documento non è solo quello di mostrare qualche dimostrazione e fare copiare l'esperimento,ma di fornire gli strumenti per sperimentare autonomamente e superare le basi insegnate.
Una volta finito di leggere questo documento avrete le basi per approfondire autonomamente e realizzare progetti complessi nel giro di pochi giorni.
Buona lettura.
#Ringraziamenti e fonti
-Tyranid, per la ricerca pionieristica sulla porta seriale e la stesura della documentazione dell'esempio seriale PSPSKD
-Jean, per l'Open Keyboard Project come fonte di sorgenti di studio.
-Valantin per l'aiuto determinante sulla scrittura e compilazione software seriale per FW 5.xx
#Requisiti
-Pazienza e voglia di imparare
-Una board Arduino (vedi paragrafo relativo)
-Una PSP con porta seriale
-una base di programmazione,possibilmente C/C++ (ma basta sapere i concetti base come variabili,sintassi,assegnazioni e strutture di controllo!)
-Alcuni componenti e fili (se ne discute al momento richiesto)
-Pack lezione 0 : Download Qui - Arduino Tuto Pack Lez0
#Intro
Che cos'è Arduino?
Arduino è una piattaforma di physical computing open source, estremamente semplice da usare, potente e relativamente economica rispetto alle concorrenti parallax o picbasic.
E' stata realizzata con lo scopo di permette la prototipazione rapida di applicazioni di elettronica digitale agli studenti di ingegneria informatica.
Oggi vive in quasi 10 versioni ed è estremamente apprezzata sopratutto negli Stati Uniti,dove sono stati creati dei club/laboratori in cui scambiarsi idee e progetti e passare del tempo costruttivo insieme (come il New York Resistor)
Addirittura un satellite sviluppato da piattaforma Arduino è stato lanciato da un università americana mediante il payload dello shuttle durante la missione STS-125 (estate 2009) e schemi e programma sono stati resi pubblicamente disponibili per chiunque volesse studiarli.
Perchè parlare di Arduino E di PSP?
La psp è una delle piattaforme portatili con più possibilità di sviluppo e versatilità, e possiamo trovare una vecchia psp usata a poche decine di euro, e integrarla in un progetto permanente, o solo a tempo perso per passare qualche ora ricreativa programmando applicazioni fisiche.
Abbiamo visto in passato come oltre 10 000 software amatoriali sono stati sviluppati in oltre 5 anni per questa o quella funzione, che sia ludica (giochi,lettori musicali) o funzionale (applicazioni e utilities).
Alcuni di questi progetti per psp hanno superato i limiti della piattaforma su cui sono nati grazie ad aggiunte hardware.
Cito per esempio PSPmaps che si interfacciava a una antenna GPS (Holux Gpslim) e ha permesso di avere su PSP un navigatore satellitare mesi prima che Sony lanciasse sul mercato GO!maps.
O myPSProbotics ed altri esempi di robotica tramite PSP.
Tra le altre applicazioni esistono anche touch screens per PSP, tastiere, adattatori per joystick vari o sistemi per muovere servomotori o motori passo passo attraverso la PSP e della circuiteria fatta in casa.
Unica pecca di tutte questi progetti è che richiedono un circuito particolare,costruito ad-hoc e che di rado utilizzano schede o componenti condivisi da altri progetti,e per tanto sono unici e difficilmente replicabili.
E' chiaro che tutti questi progetti vengono fatti per diletto o per passione,e non vogliono sostituire o surrogare un prodotto commerciale.
Al termine del progetto spesso si prendono i componenti e si riciclano, rendendo di fatto il progetto un semplice "prototipo".
E torniamo all'Arduino.
Arduino può interfacciarsi con la stra-grande maggioranza delle tecnologie informatiche ed elettroniche con poco sforzo, e controllarle.
Con arduino possiamo per esempio controllare le luci in una stanza,spegnere o accendere un computer, oppure dotare di un certo input una piattaforma.Possiamo creare una testa che ruoti su 3 assi per muovere a 360 gradi una webcam,o un sistema che percepisca la posizione del sole tramite fotoresistenze e orienti la webcam o un pannello solare in quella direzione per ricaricare la batteria oppure per sapere l'ora del giorno sapendo dove è il Nord tramite bussola digitale!
Questo "Lego del futuro" è può funzionare autonomamente con una batteria da 9Volts oppure venire alimentata da USB.
I "mattoncini" ovvero i componenti richiesti, sono facilmente ottenibili a poco prezzo oppure riciclando e aprendo vecchio materiale che si ha a casa.
Interfacciando la PSP con Arduino possiamo creare ogni sorta di automazione o programma interattivo e avere la possibilità di interfacciarci con esso facilmente senza mediazioni.
Una PSP e un Arduino potrebbero per esempio mostrare a schermo il battito del tuo cuore ovunque tu sia,la psp potrebbe quindi interpolare tale informazione con il tempo trascorso e mostrare una media e una proiezione a schermo con grafico.
Allo stesso tempo potrebbe rispondere con un feedback tattile (vibrazioni grazie a un motore DC modificato) per indicare un eccessivo stress cardiovascolare!
Se questo sistema fosse un metodo per tenersi in forma e fossi in giro a fare jogging integrato con un sistema GPS, appena si tornerebbe nel raggio di 200 metri da casa potrebbe interfacciarsi a un vecchio cellulare (usando delle comode librerie) e mandare un messaggio a casa "Sto tornando, fatemi un frullato!" (magari personalizzabile da PSP).
Oppure potremmo usare Arduino per controllare gli input della psp e controllare in remoto le tapparelle di casa, o il computer, o una console fissa.
O al contrario leggere delle informazioni tramite sensori (posizione,accelerazione,temperatura,luce,tensione,campo magnetico...ce n'è per tutti i gusti) e mostrarle a schermo o rielaborarle per qualcosa di più complesso.
Insomma le possibilità di questa unione sono infinite e sono tutte rese possibili da due magnifiche piattaforme per lo sviluppo amatoriale.
La psp, rispetto a un netbook o a un portatile è ancora il dispositivo handheld sul mercato consumer con il più basso prezzo per prestazione e peso, per questo, oltre alla facilità di programmazione e la scena attorno, si configura come la migliore amica della board Arduino.
#Questo Documento
Spesso chi usa l'arduino e possiede una psp non ha mai programmato su PSP,e viceversa chi ha la PSP e programma potrebbe non aver mai avvicinato l'Arduino credendolo fuori portata.
Per la programmazione su Arduino inizierò dalle basi, i programmi proposti e il loro codice saranno spiegati e commentati riga per riga,senza lasciare nulla al caso o al dubbio.
#Disclaimer & Note sulla sicurezza
Paragrafo conosciuto anche come "non mettere le dita nella presa di corrente".

Arduino e la PSP sono dispositivi elettronici delicati e con tensioni di funzionamento specifiche,che spiegheremo più avanti.
Mai e poi mai si devono cortocircuitare porte tra di loro (e spiegheremo perchè) o fare confusione tra le polarità, pena possibili danni a una o l'altra piattaforma (o a entrambe!).
In particolare ,anche se non verranno trattate in questo documenti,oltre ai danni alla console o alla scheda c'e il rischio non remoto che se il vostro progetto utilizza o si interfaccia alla rete a 220 volts di prendere una scossa o di causare un principio di incendio con nefaste conseguenze.
C'e sempre una solida teoria dietro questo genere di applicazioni, informatevi prima sulla Knowledge base di Arduino,dove gente molto più esperta di me e di voi saprà indirizzarvi verso la soluzione più sicura al vostro dubbio.
Nè io nè PSP-ITA ci riterremo responsabili per eventuali danni a persone o a cose.La guida è redatta a solo scopo informativo.
#breve introduzione all'Arduino pratico
Esistono vari modelli della scheda,tra cui cito il Novemila, Diecimila,Mega,Mini,Lilypad. Tra di loro ci sono varie revisioni, ma quel che conta sono le caratteristiche, che rendono più o meno adatta una scheda o l'altra ad uno specifico compito.
Per esempio la Mega è attualmente quella più performante, ha più memoria (quindi applicazioni più grandi) e più porte I/O.
La mini invece ha meno porte e molta meno memoria,ma ha dimensioni ridottissime e quindi, come Lilypad o Nano, può adattarsi a situazioni in cui lo spazio è critico (Arduino Lilypad potrebbe starci nel vano UMD, per esempio!).
Fortunatamente i programmi che andremo a eseguire sono interscambiabili tra di loro,a patto che le richieste in fatto di porte logiche e di capacità della scheda siano uguali.
L'elenco completo di versioni è disponibile qui: http://arduino.cc/en/Main/Hardware
Arduino è fornito assemblato o in kit, esistono anche versioni gratuite (essendo arduino un progetto open source) come Sanguino o Freeduino.
Ovviamente è venduto in Italia come all'estero.
Per informazioni sui rivenditori (http://arduino.cc/en/Main/Buy)
Praticamente tutte le versioni di arduino usano la porta USB per comunicare con il computer, attraverso il quale potremo programmare e debuggare in tempo reale il codice, e anche alimentare la scheda stessa in mancanza di batteria.
#IDE
Per programmare una applicazione su Arduino possiamo usare Arduino IDE, l'ambiente di sviluppo integrato gratuitamente scaricabile dal sito.
L'IDE Arduino è basata sull'IDE di Processing,un linguaggio per applicazion audiovisive ed è scritto in java (ed è pertanto assolutamente multipiattaforma!).
Arduino si programma con sintassi C++ con libreria Wiring.

Wiring è una libreria C/C++ nata dal progetto omonimo, che semplifica enormemente il lavoro per controllare gli input e output della scheda.
Questo è uno dei punti di forza dell'Arduino, e permette di eseguire in 2-3 righe operazioni che altrimenti richiederebbero 50 righe di codice a livello di astrazione basso.
Arduino appunto è sviluppato per essere semplice da usare e permettere queste operazioni per chi non è in grado di programmare a livelli più profondi,ma sotto questo guscio estremamente solido, l'IDE permette l'installazione di librerie personalizzate rilasciate da terzi,e virtualmente permette di tuffarsi nei meandri della programmazione c/c++ in qualsiasi momento abbandonando le funzioni preconfezionate della libreria.
Configuriamo l'IDE:b>
La configurazione dell'IDE dipende dal modello scelto e avviene mediante la selezione di porta e installazione dei driver della scheda nell'OS del vostro pc.
Assicuratevi che la vostra porta USB sia alimentata correttamente (l'USB necessita di 5 volts) altrimenti usate un hub Usb alimentato separatemente per garantire tale voltaggio.
Viste le molteplici versioni riporto qui di seguito le istruzioni in inglese (semplicissime) per svolgere la prima configurazione della scheda:
http://arduino.cc/en/Guide/HomePage
Porte
le porte sono l'interfaccia di arduino con il mondo esterno.
"Fisicamente" sono i pin o le strip nere che vedete a bordo scheda,numerate in modo sequenziale con numeri o scritte.

In realtà ad un pin può essere associata più di una porta logica, ma questo è un discorso che rimandiamo.
Le loro piste corrono fin ai piedi del microprocessore (che su arduino è un Atmel AtmegaXXX a secondo del modello) e si collegano a una delle N porte disponibili.
Tali porte, virtualmente è come se fossero variabili,o meglio registri, che contengono uno stato particolare (l'input o l'output).
Questo è comprensibile quando ad inizio programma dovremo dichiarare quali porte vogliamo usare, come se stessimo dichiarando delle variabili.
Le porte digitali su ogni Arduino possono essere usate sia in scrittura che il lettura attraverso due funzioni digitalWrite e digitalRead (Attenzione: case sensitive!).
Ogni porta può essere usata sia come input digitale che input analogico.
La differenza è sostanziale.
Nella logica TTL della scheda (Transistor-Transistor Logic) è necessario un input di corrente per fare passare una porta digitale da Low(0) a Hight (1).Una porta di questo tipo si dice digitale perchè comunica attraverso due soli stati: 0 o 1, basso o alto.
Quando una porta è settata su Alto (usando digitalWrite) la porta selezionata genererà +5v o +3v,altrimenti non ci sarà differenza di potenziale (tradotto: non ci sarà corrente!).
Una porta Analogica invece avrà valori che oscillano tra 0 e 1023.
Per leggere un valore analogico sarà sufficiente usare la funzione AnalogRead.
Per la scrittura Analogica invece rimandiamo il discorso perchè intervengono molte altre questioni per ora troppo avanti.
ESERCIZIO 1.
Esempio tratto da http://arduino.cc/en/Tutorial/Blink.
Tornando alla realtà concreta vediamo l'esempio base per comprendere come funzionano le porte su arduino,direttamente dall'esempio "Blink":
Componenti richiesti:
-Un Led (facoltativo)
Iniziamo con l'Arduino spento, attacchiamo il led come specificato nel diagramma.Il terminale negativo dei LED è quello più corto, e va su GND = Ground, ovvero massa , il terminale negativo di arduino.

Apriamo L'IDE e incolliamo il seguente codice per usufruire della funzione di code Highlight.
int ledPin = 13; // LED connesso alla porta 13
// dentro setup() andiamo a impostare le porte o eventuali inclusioni.
// setup() viene eseguito una sola volta
void setup() {
// inizializzo il pin dichiarato precedentemente come pin in uscita
pinMode(ledPin, OUTPUT);
}
//ogni cosa in loop() verrà eseguita ininterrottamente, come un while(1)
void loop()
{
digitalWrite(ledPin, HIGH); // setto il pin acceso
delay(1000); // attendo 1000 millisencondi= 1 secondo
digitalWrite(ledPin, LOW); // setto il pin spento
delay(1000); //attendo 1000 millisencondi= 1 secondo
}
Il codice (se non si fosse ancora capito) non fa altro che accendere e spegnere ad intervalli di 1 secondo un LED (un diodo luminoso) che è connesso alla scheda tramite la massa negativa e il pin 13.Come si può vedere, a parte le funzioni che spiegherò a breve, c'è più testo commentato che codice,e questo dovrebbe davvero chiarire la spontaneità della programmazione su arduino.
Nella prima riga dichiariamo una semplice variabile.
[i]int nome = valore;[/i] int perchè INTero ovviamente.
Successivamente vediamo setup(), che racchiude attraverso parentesi graffa le impostazioni del programma, eseguite una volta sola quando l'arduino si accende per la prima volta.
All'interno possiamo fare conoscenza con la funzione pinMode(nomeroporta,INPUT/OUTPUT); che non fa altro che settare una porta per ricevere o inviare un segnale.
"[i]pinMode(ledPin, OUTPUT);[/i]" in questo caso setta la porta indicata dalla variabile ledPin in modalità OUTPUT.
void loop() Invece racchiude tra parentesi graffe la sequenza di istruzioni da eseguire all'infinito.è paragonabile al Main() di un programma C/C++ ma a differenza di esso appunto non richiede un while(1) all'interno per essere eseguito all'infinito.
Arduino esegue il codice ininterrottamente secondo la sequenza definita in void loop().
Per realizzare l'effetto di lampeggiamento bisogna intervallare l'accensione e lo spegnimento del led distanziando queste due operaizoni di 1 secondo e ripetendo all'infinito.
Ecco che quindi abbiamo digitalWrite(ledpin, HIGH) che eleva il pin al livello logico Alto=1 (acceso) seguito da un intervallo di 1000 millisecondi delay(1000); seguito a sua volta da digitalWrite(ledpin, LOW) che abbassa il pin al livello logico Basso=0 (spento).
A concludere il ciclo un altro delay(1000) che separa lo spegnimento dall'accensione che avviene all'inizio del ciclo di 1 secondo.
Fin qui sono certo che sia difficile perdersi,come si può vedere realizzare un piccolo lampeggiatore è poco più di un helloworld.
-Programmiamo la board.
Se questa è la prima volta che accendete Arduino,c'è una buona probabilità che questo codice sia stato già scritto nella scheda come test di funzionamento, pertanto teoricamente dovreste già trovarvi di fronte al led che lampeggia sulla porta 13.Inoltre, Arduino mega è provvisto di un Led diagnostico integrato sulla porta 13 (di colore verde). se la scheda funziona correttamente dovreste vederlo lampeggiare a intervalli di 1 secondo.
Vediamo comunque come programmare di nostro pugno la scheda,visto che d'ora in poi sarà una procedura piuttosto regolare.
Niente di più semplice, basta premere sul bottone di verifica sintattica nell'IDE e verificare che il programma (detto Sketch nel gergo di Arduino) sia corretto.

L'IDE non programmerà mai su arduino uno Sketch non valido, se il codice ha qualche errore di sintassi o simili non verrà scritto nella scheda e l'errore che ha causato il blocco verrà mostrato in rosso nella barra di diagnostica (in basso).

Se la verifica invece ha successo la board verrà programmata e quindi resettata (circa 5-10 secondi in tutto) e il programma partità,come di consueto, appena Arduino sarà operativo (questo avviene solitamente 2 secondi dopo il reset).
Ovviamente qualsiasi programma o dato in memoria che era stato registrato da arduino verrà perso insieme allo sketch precedente,tenete quindi traccia dei vostri lavori e non salvate sempre sullo stesso sketch per evitare sovrascritture indesiderate.
Questo vale appunto sia per eventuali variabili di runtime del programma che gira su arduino (che vengono persi ad ogni reset, ovviamente) e allo sketch nell'IDE, che è bene copiare ogni qual volta si ritenga saggio fare un backup del file *.pde.
In caso di errore di compilazione invece, l'IDE mostrerà gli errori o l'errore incontrato.
Spesso si tratta di dimenticanze, altre volte possono essere altre cose.Visto che in futuro faremo riferimento alla porta seriale su arduino è bene chiarire ora che per riprogrammare il microcontroller è necessario che le porte TX e RX dell'arduino siano libere da connessioni al momento della riprogrammazione, in caso contrario il pc non riuscirà a stabilire una connessione, dando errore sulla porta USB COM designata.
ESERCIZIO 2.
Esempio tratto da http://arduino.cc/en/Tutorial/Button.
Abbiamo visto come fare accendere e spegnere un diodo led,una operazione che potremmo definire di output (di fatto il led illuminandosi mostra/visualizza lo stato della porta logica sul pin 13!).
Adesso vedremo come lavorare con alcuni semplici inputs: interruttori, potenziometri e fotoresistenze, e la logica che sta dietro.
Prima di tutto facciamo una distinzione.
Tra i dispositivi di input citati sopra gli interruttori o bottoni si comportano come input digitali, mentre i potenziometri o le fotoresistenze come input analogici.
Detto altrimenti un bottone o interruttore potrà essere solamente premuto o non premuto, aperto o chiuso al passaggio di corrente.
In riferimento a quanto detto nell'esempio del led Un interruttore potrà essere HIGH o LOW, non esistono stati intermedi.
Se invece parliamo di un potenziometro, detto anche [i]Resistore variabile[/i] in virtù del fatto che è una resistenza variabile nel suo valore , ruotando la manopola avremo valori da 0 a N, nel caso di arduino da 0 a 1023 (solo valori interi!).
L'aumento o il diminuire della resistenza in base al verso di rotazione della manopola dipende dal tipo di potenziometro,ma ovviamente possiamo rielaborare il segnale tramite Arduino per conformarlo alle nostre esigenze come vedremo tra breve.
Le fotoresistenze non sono altro che resistenze variabili in base alla luce che li colpisce.Una fotoresistenza produrrà valori da 0 a N, nel caso dell'arduino da 0 a 1023.
Le fotoresistenze, in base al meccanismo elettro/chimico/fisico che le regola, funzionano all'opposto: più luce li colpisce meno resistenza opporranno al passaggio di corrente.
Questo vuol dire che con molta luce i valori di resistenza registrati dalla funzione analogRead(pin) saranno bassi,mettiamo 10 su 1023, mentre saranno alti se la stanza è al buio.
Alcune fotoresistenze percepiscono la luce ultravioletta e infrarossa, quindi avremo sempre un rumore di fondo anche se la stanza è buia.
Quando abbiamo a che fare con valori analogici, infatti, non otterremo mai valori "puri" come 1023 se la manopola è al massimo o 0 se è al minimo.
Per ora lavoreremo con semplici input digitali.
Per questo ultimo esempio pratico i componenti che servono sono:
3 fili da proto board o in rame di circa 15 mm
1 interruttore a bottone , finecorsa o simili (ma si può anche collegare a mano i fili simulando la chiusura del circuito)
1 resistenza da 10K Ohm
1 Led
Opzionale: 1 multimetro con funzione controllo corto circuito.
Il multimetro è uno strumento a dir poco utile nell'elettronica digitale. al di là del misurare le tensioni potremo testare gli stati HIGH o LOW delle porte usandolo.
Iniziamo con l'Arduino spento, attacchiamo il led come nel primo esempio.
colleghiamo quindi un capo della resistenza da 10K Ohm al pin GND (la massa) e l'altro capo ad uno dei terminali del bottone.
Tra la resistenza e il bottone attacchiamo un filo che vada da lì al pin analogico 2 dell'Arduino.
Colleghiamo infine l'altro terminale del bottone con il pin positivo +5v sulla scheda Arduino.
Dovremmo trovarci quindi con qualcosa del genere:

incolliamo e programmiamo ora il codice.
// setto i pin usati
const int buttonPin = 2; // Pin del bottone
const int ledPin = 13; // Pin del led
int buttonState = 0; // Stato bottone 1= premuto. Inizializzo come non premuto
void setup() {
pinMode(ledPin, OUTPUT); //inizializzo led come output
pinMode(buttonPin, INPUT); //inizializzo bottone come input
}
void loop(){
// leggo lo stato del bottone
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH) { //se il bottone è premuto
// accende il led
digitalWrite(ledPin, HIGH);
}
else { //...altrimenti..
// spegne il led!
digitalWrite(ledPin, LOW);
}
}
Oltre ad avere inizializzato come input la porta 2, la vera novità è l'introduzione della chiamata buttonState = digitalRead(buttonPin);.
In breve assegniamo alla variabile buttonState il valore 1 (HIGH) se il bottone è premuto (chiuso) o 0 (LOW) se il bottone non è premuto (aperto).
Subito dopo controlliamo con un semplice if/then/else lo stato della variabile e eseguiamo di conseguenza l'azione richiesta.
Nota:
Se prendete un filo conduttore libero e lo collegate ai due capi per misurarne la differenza di potenziale potreste misurare un voltaggio, anche se estremamente basso.
Questo è dovuto ai campi magnetici che riempiono l'aria, sopratutto nelle case moderne.
Se tenete l'arduino vicino a uno di questi dispositivi (basta anche un auricolare a 10 cm di distanza) i vostri valori analogici potrebbero oscillare.
Anche lo schermo del computer che usate per programmare l'arduino attraverso l'IDE può interferire nelle misurazioni, per risolvere basta "normalizzare" l'input a ignorare le oscillazioni.
Ovvero contare sempre un margine di sicurezza per cui qualsiasi azione non sia dovuta a una interferenza magnetica!
-Approfondire
I due esempi trattati sopra sono le basi teoriche e pratiche per permettere al lettore di comprendere tutto ciò che verrà detto da ora in poi,se questo non è il vostro primo progetto di elettronica digitale con Arduino e masticate timidamente c/c++, potete saltare quanto segue.
Prima di partire con l'interfacciamento tra PSP e arduino consiglio infatti di approfondire i temi trattati svolgendo i semplici esercizi presenti nella knowledge base di arduino.
Approfondendo i temi consigliati si avranno inoltre più idee per eventuali progetti futuri, davvero una lettura quasi obbligata!
Tuttavia per non dilungarmi troppo nell'introduzione della piattaforma Arduino riporterò di seguito una selezione di temi dalla Knowledge base di Arduino, in modo da facilitare il percorso di apprendimento.
Sono consigliati i seguenti progetti dimostrativi da realizzare:
http://arduino.cc/en/Tutorial/ButtonStateChange
http://arduino.cc/en/Tutorial/Fading
http://arduino.cc/en/Tutorial/Sweep
http://arduino.cc/en/Tutorial/Knob
Realizzando questi esempi appena citati e quelli consigliati dalla Knowledgebase di Arduino.cc possiamo in poche ore prendere padronanza dei concetti base.
Non potendo trattare tutto ciò che è possibile fare singolarmente con arduino senza andare fuori tema, vi rimando al sito ufficiale,sopratutto per le nozioni sull'elettronica digitale.
Continuiamo quindi con l'integrazione di Arduino con la PSP,torneremo in futuro su applicazioni pratiche più complesse.
Continua: Lezione 1