Progetto Esame di Stato a.s. 2013/2014 di Nicola Bozzini - cl. 5ATE I.S. “Carlo Anti” Telecontrollo escavatore LEGO con board Arduino Elenco materiale: - Arduino Uno R3 - LEGO® Technic set 42006 - 3 Motori M di Lego (9V) - 2 integrati L293NE (ponte H) - 1838T (ricevitore infrarossi) - THDZ (speaker) - Telecomando infrarossi - 6 pile da 1,5V l'una - 4 Diodi led - Resistenza da 220Ω 2 150 Ω - Breadboard - Cavetteria Strumentazione: - Saldatore stagno - Nastro isolante di protezione delle parti saldate del cavo Spiegazione relazione: Dopo aver verificato che i motori fossero in c.c bipolari, per poter essere comandati da Arduino bisognava utilizzare un ponte H. Un buon integrato è stato L'L293NE costituito da due "ponti", uno sul lato sinistro del chip ed uno sul lato destro,il quale può controllare 2 motori nello stesso istante. Funziona tra i 4.5 V e i 36 V e può controllare fino ad 1 A. Pin 1: Attiva/disattiva il primo motore in base se è HIGH o LOW Pin 2: Insieme al pin 7 regola il verso di rotazione in base se è HIGH o LOW Pin 3: Qui colleghiamo uno dei 2 terminali del motore Pin 4: Massa Pin 5: Massa Pin 6: Qui colleghiamo l'altro terminale del motore Pin 7: Insieme al pin 2 regola il verso di rotazione in base se è HIGH o LOW Pin 8: Alimentazione per il motore Pin 9: Attiva/disattiva il secondo motore in base se è HIGH o LOW Pin 10: Insieme al pin 15 regola il verso di rotazione in base se è HIGH o LOW Pin 11: Qui colleghiamo uno dei 2 terminali del motore Pin 12: Massa Pin 13: Massa Pin 14: Qui colleghiamo l'altro terminale del motore Pin 15: Insieme al pin 10 regola il verso di rotazione in base se è HIGH o LOW Pin 16: Alimentazione per il motore 1 Progetto Esame di Stato a.s. 2013/2014 di Nicola Bozzini - cl. 5ATE I.S. “Carlo Anti” Ho fatto una prova per verificare che tutto funzionasse correttamente eseguendo il seguente sketch: int int int int switchPin motor1Pin motor2Pin enablePin = = = = 2; 3; 4; 9; void setup() { pinMode(switchPin, pinMode(motor1Pin, pinMode(motor2Pin, pinMode(enablePin, } // Regola il verso di rotazione del motore, mediato da interruttore //Pin logici che regolano il senso di rotazione in base che siano high o low //Pin logici che regolano il senso di rotazione in base che siano high o low // Abilita il motore INPUT); OUTPUT); OUTPUT); OUTPUT); void loop() { if (digitalRead(switchPin) == HIGH) {// se l'interrutore è premuto, il motore gira in una direzione digitalWrite(motor1Pin, LOW); digitalWrite(motor2Pin, HIGH); } else { digitalWrite(motor1Pin, HIGH); digitalWrite(motor2Pin, LOW); } } // se l'interruttore non è premuto, il motore gira nell'altra direzione Ho scelto poi di comandare il tutto attraverso infrarossi. Innanzitutto dopo aver collegato secondo il datasheet il 1838T a Arduino e aggiunta la libreria IR.remote.h, scaricata da Internet al software, ho eseguito lo sketch per la rilevazione dei codici inviati dal telecomando. #include <IRremote.h> //Utilizza la libreria aggiunta int receiver = 11; // L'uscita del sensore infrarossi collegato al pin 11 di Arduino IRrecv irrecv(RECV_PIN); decode_results results; void setup() { Serial.begin(9600); //Connessione con il terminale per vedere da PC i dati letti irrecv.enableIRIn(); // Abilitata la ricezione } void loop() { if (irrecv.decode(&results)) { // Se riceve il segnale Serial.println(results.value, HEX); irrecv.resume(); } } // Stampa sul monitor seriale il valore in esadecimale // Prossima ricezione Ho poi unito i 2 sketch in uno solo impostando i tasti del telecomando in sostituzione all'interruttore, per il pilotaggio di un solo motore per verificare la funzionalità: #include <IRremote.h> int receiver = 11; 2 Progetto Esame di Stato a.s. 2013/2014 di Nicola Bozzini - cl. 5ATE I.S. “Carlo Anti” IRrecv irrecv(receiver); decode_results results; int switchPin = 2; int motor1Pin = 3; int motor2Pin = 4; int enablePin = 9; void setup() { Serial.begin(9600); irrecv.enableIRIn(); pinMode(2, OUTPUT); pinMode(switchPin, INPUT); pinMode(motor1Pin, OUTPUT); pinMode(motor2Pin, OUTPUT); pinMode(enablePin, OUTPUT); } void loop(){ if (irrecv.decode(&results)) { Serial.println(results.value, HEX); irrecv.resume(); } if ( results.value == 0xFF30CF ){ digitalWrite(enablePin, HIGH); digitalWrite(motor1Pin, LOW); digitalWrite(motor2Pin, HIGH); } if ( results.value == 0xFF18E7 ){ // Ho impostato il tasto 1 del telecomando a far partire il motore in un verso // Ho impostato il tasto 2 del telecomando a far girare il motore nell'altro verso digitalWrite(enablePin, HIGH); digitalWrite(motor1Pin, HIGH); digitalWrite(motor2Pin, LOW); } if ( results.value == 0xFF7A85 ){ // Ho impostato il tasto 3 del telecomando spegnere il motore digitalWrite(enablePin, LOW); } } Di seguito una foto della prova finita e funzionante: 3 Progetto Esame di Stato a.s. 2013/2014 di Nicola Bozzini - cl. 5ATE I.S. “Carlo Anti” Ora utilizzando 3 motori, avrò quindi bisogno di 2 integrati. Per funzionare correttamente, ogni motore ha bisogno di 9V, posso usufruire dell'alimentazione di Arduino perche essa può reggere un massimo di 12V e quindi posso evitare l'utilizzo di un'alimentazione esterna. Per i restanti 2 motori mi basta collegarne uno alla seconda parte dello stesso integrato e l'altro al secondo integrato. Fatto questo, copio le istruzioni del programma, modificando solamente i pin di Arduino e i tasti del telecomando con i vari valori esadecimale rilevati. Aggiunti poi segnalatori acustico (THDZ) e visivi (led). L'acustico è stato impostato in un suono a intermittenza solamente quando, almeno un motore è in funzione, mentre i led sono regolati da 2 tasti, accensione e spegnimento. #include <IRremote.h> int receiver = 11; IRrecv irrecv(receiver); decode_results results; int switchPin = 2; int motor1Pin = 3; int motor2Pin = 4; int enable1Pin = 10; int enable2Pin = 9; int enable3Pin = 8; int sound = 13; int ill; int luci = 12; int luci2 = A0; void setup() { Serial.begin(9600); irrecv.enableIRIn(); pinMode(2, OUTPUT); pinMode(switchPin, INPUT); pinMode(motor1Pin, OUTPUT); pinMode(motor2Pin, OUTPUT); pinMode(enablePin, OUTPUT); pinMode(sound, OUTPUT); pinMode(luci, OUTPUT); pinMode(luci2, OUTPUT); } void loop(){ if (irrecv.decode(&results)) { Serial.println(results.value, irrecv.resume();// receive the next value } if ( results.value == 0xFF30CF ){ digitalWrite(enable1Pin, HIGH); digitalWrite(motor1Pin, LOW); digitalWrite(motor2Pin, HIGH); } if ( results.value == 0xFF18E7 ){ 4 Progetto Esame di Stato a.s. 2013/2014 di Nicola Bozzini - cl. 5ATE I.S. “Carlo Anti” digitalWrite(enable1Pin, HIGH); digitalWrite(motor1Pin, HIGH); digitalWrite(motor2Pin, LOW); } if ( results.value == 0xFF7A85 ){ digitalWrite(enable1Pin, LOW); } if ( results.value == 0xFF10EF ){ digitalWrite(enable2Pin, HIGH); digitalWrite(motor3Pin, LOW); digitalWrite(motor4Pin, HIGH); } if ( results.value == 0xFF38C7 ){ digitalWrite(enable2Pin, HIGH); digitalWrite(motor3Pin, HIGH); digitalWrite(motor4Pin, LOW); } if ( results.value == 0xFF5AA5 ){ digitalWrite(enable2Pin, LOW); } if ( results.value == 0xFF42BD ){ digitalWrite(enable3Pin, HIGH); digitalWrite(motor5Pin, LOW); digitalWrite(motor6Pin, HIGH); } if ( results.value == 0xFF4AB5){ digitalWrite(enable3Pin, HIGH); digitalWrite(motor5Pin, HIGH); digitalWrite(motor6Pin, LOW); } if ( results.value == 0xFF52AD ){ digitalWrite(enable3Pin, LOW); } //Adesso suono e illuminazione ill=digitalRead(10); if(ill==HIGH) { digitalWrite (sound,HIGH); delay(200); digitalWrite (sound,LOW); delay(200); } else { digitalWrite (sound,LOW); } ill=digitalRead(9); if(ill==HIGH) { digitalWrite (sound,HIGH); delay(200); digitalWrite (sound,LOW); delay(200); } else { digitalWrite (sound,LOW); } ill=digitalRead(8); if(ill==HIGH) { // Legge nel pin 9 se è high o low //Se è high parte il suono //Se è low non c'è il suono // Legge nel pin 9 se è high o low //Se è high parte il suono //Intermittenza suono //Se è low non c'è il suono // Legge nel pin 8 se è high o low 5 Progetto Esame di Stato a.s. 2013/2014 digitalWrite (sound,HIGH); delay(200); digitalWrite (sound,LOW); delay(200); } else { digitalWrite (sound,LOW); } if ( results.value == 0xFF9867 digitalWrite(luci, HIGH); } if ( results.value == 0xFFB04F digitalWrite(luci, LOW); } if ( results.value == 0xFF9867 digitalWrite(luci2, HIGH); } if ( results.value == 0xFFB04F digitalWrite(luci2, LOW); } } di Nicola Bozzini - cl. 5ATE I.S. “Carlo Anti” //Intermittenza suono //Se è low non c'è il suono ){ //Quando viene premuto il tasto le luci si accendono ){ //Quando viene premuto il tasto le luci si spengono ){ //Quando viene premuto il tasto le luci si accendono ){ //Quando viene premuto il tasto le luci si spengono In figura è mostrato il circuito equivalente di tutto il progetto: 6