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
Scarica

Telecontrollo escavatore LEGO con board Arduino - CARL-O.