Le principali funzioni
dell'interfaccia sono:
1. compila: serve per convertire lo script in linguaggio
macchina,
2. carica: compila lo script e lo carica sulla scheda,
3. nuovo: crea un nuovo progetto,
4. apri: apre un progetto già creato,
5. salva: salva il progetto su cui si sta lavorando,
6. monitor seriale: il monitor seriale serve per
comunicare "in diretta" con la scheda,
7. spazio per lo script: contiene tutto quello che verrà
compilato e caricato sulla scheda,
8. resoconto: qua appaiono tutti i resoconti di
caricamento e gli eventuali errori di compilazione.
LE SCHEDE
Arduino, dal 2005, ha prodotto molte schede, ecco alcune delle più
conosciute:
- Arduino 10000
- Arduino 2009
- Arduino UNO
- Arduino mega
- Arduino leonardo
Arduino ha prodotto anche delle schede alquanto particolari:
- Arduino mini: la scheda Arduino più piccola, 1,7cm x
3cm
- Arduino lilypad: sottilissima, ideata per essere integrata
nei vestiti
- Arduino mega ADK: creata per interagire in particolare con
telefoni Android
- Arduino esplora: ha la forma di un controller ed è compresa
di microfono, joystick e frecce direzionali
Le schede Arduino sono relativamente economiche i cui prezzi si
aggirano sui 30€.
Alcune aziende producono delle schede compatibili con
Arduino ma meno costose, come la scheda utilizzata per la
costruzione dello SMARS presentato in uesto sito, nello specifico una
scheda WeMos mega con
funzione Wi-Fi che, volendo, si potrebbe connettere a una rete Wi-Fi
esistente o crearne una propria.
LO
SCRIPT
Ecco lo script che
permette di controllare lo SMARS tramite telecomando:
/*
questo proggetto è stato realizzato da Daniele Toniolo per l'utilizzo
del robot "SMARS" con una scheda arduino mega o compatibile,
sito: www.tmcomputer.it/smars/index.html email:
danieletoniolo7@gmail.com */
//inclusione librerie utilizzate
#include
<SR04.h>
// Libreria ultrasuoni
#include <AFMotor.h> //
Libreria motor shield
#include <IRremote.h> //
Libreria sensore IR
#include <IRremoteInt.h> // Libreria sensore IR
//dichiarazione variabili dei motori:
AF_DCMotor motor1(1);
AF_DCMotor motor2(2);
int command;
//dichiarazione variabili del sensore a ultrasuoni:
long duration;
int distance;
#define TRIG_PIN 22 //pin di input del sensore
#define ECHO_PIN 24 //pin di output del sensore
SR04 sr04 = SR04(ECHO_PIN,TRIG_PIN);
//dichiarazione variabili del sensore a luce infrarossa
int receiver1 = 26; //pin di output del sensore
IRrecv irrecv1(receiver1); //creazione istanza
di ricezione del sensore a infrarossi
decode_results results;
//creazione istanza per la traduzione del sensore a infrarossi
/*-----( dichiarazione delle funzioni )-----*/
//****************************************************************************************
void translateIR() //funzione che traduce il codice
ricevuto dal sensore a infrarossi in un comando
{
switch(results.value) //confronto del valore
ricevuto con uno dei casi seguenti
{
case 0xFFA25D: Serial.println("POWER"); command = 0;
break; //
Comando STOP
case 0xFFE21D: Serial.println("FUNC/STOP"); command
= 1; break; // Comando AUTO
case 0xFF629D: Serial.println("VOL+"); command = 2;
break;
// Comando AVANTI
case 0xFF22DD: Serial.println("FAST BACK"); command
= 5; break; // Comando SINISTRA
case 0xFF02FD:
Serial.println("PAUSE"); break;
case 0xFFC23D: Serial.println("FAST FORWARD");
command = 4; break; // Comando DESTRA
case 0xFFE01F:
Serial.println("DOWN"); break;
case 0xFFA857: Serial.println("VOL-"); command =
3;
break; // Comando
INDIETRO
case 0xFF906F:
Serial.println("UP"); break;
case 0xFF9867:
Serial.println("EQ"); break;
case 0xFFB04F:
Serial.println("ST/REPT"); break;
case 0xFF6897:
Serial.println("0"); break;
case 0xFF30CF:
Serial.println("1"); break;
case 0xFF18E7:
Serial.println("2"); break;
case 0xFF7A85:
Serial.println("3"); break;
case 0xFF10EF:
Serial.println("4"); break;
case 0xFF38C7:
Serial.println("5"); break;
case 0xFF5AA5:
Serial.println("6"); break;
case 0xFF42BD:
Serial.println("7"); break;
case 0xFF4AB5:
Serial.println("8"); break;
case 0xFF52AD:
Serial.println("9"); break;
case 0xFFFFFFFF: Serial.println("
REPEAT");break;
default: Serial.println("Other :"); //
se il codice ricevuto è diverso da tutti i casi precedenti
}// End Case
Serial.print("Command :");
Serial.println(command);
}
//****************************************************************************************
void setup() //funzione che viene
eseguita una sola volta all'avvio della scheda
{
Serial.begin(9600);
//impostazione della velocità di aggiornamento del monitor seriale
Serial.println("SMARS avviato");
irrecv1.enableIRIn();
//abilitazione del sensore a infrarossi
motor1.setSpeed(200); //impostazione della velocità motore 1
motor2.setSpeed(200); //impostazione della velocità motore 2
motor1.run(RELEASE); //Stop motore 1
motor2.run(RELEASE); //Stop motore 2
}
//****************************************************************************************
void loop() //funzione che viene
eseguita a ciclo continuo
{
//controlla se vengono ricevuti dati dalla porta seriale
if (Serial.available()>0) //se
vengono ricevuti
{
int dato = Serial.read(); //legge il
dato in entrata
Serial.println(dato);
if
(dato==49)
//se il dato è = 49 che corrispone al codice ascii del carattere "1"
{
command =
1;
// Comando AUTO
Serial.println("Auto");
}
if
(dato==48)
//se il dato è = 48 che corrispone al codice ascii del carattere "0"
{
command =
0;
// Comando STOP
Serial.println("Stop");
}
}
//controlla vengono ricevuti dati dal ricevitori IR
if (irrecv1.decode(&results)) //se vengono ricevuti
{
translateIR();
//richiama la funzione translateIR() per decodificare il messaggio
ricevuto
irrecv1.resume();
//azzera e predispone il ricevitore alla ricezione del prossimo comando
}
//legge la distanza di eventuali ostacoli tramite sensore a Ultrasuoni
distance=sr04.Distance();; //la funzione
restituisce direttamente la distanza dell'ostacolo in cm
//comanda i motori a seconda del comando impostato
// STOP
if (command==0){
motor1.run(RELEASE); //Stop motore
1
motor2.run(RELEASE); //Stop motore
2
}
// AUTO
if (command==1){
if(distance<5){
//se la distanza dell'ostacolo è < 5 cm
motor1.run(BACKWARD);
//Indietro motore 1
motor2.run(BACKWARD);
//Indietro motore 2
delay(1000);
motor1.run(FORWARD);
//Avanti motore 1
motor2.run(BACKWARD);
//Indietro motore 2
delay(1000);
}
else{
//altrimenti
motor1.run(FORWARD);
//Avanti motore 1
motor2.run(FORWARD);
//Avanti motore 2
}
}
// AVANTI
if (command==2){
motor1.run(FORWARD); //Avanti
motore 1
motor2.run(FORWARD); //Avanti
motore 2
}
// INDIETRO
if (command==3){
motor1.run(BACKWARD); //Indietro motore 1
motor2.run(BACKWARD); //Indietro motore 2
}
// DESTRA
if (command==4){
motor1.run(RELEASE); //Stop motore
1
motor2.run(FORWARD); //Avanti
motore 2
delay(1000);
motor1.run(FORWARD); //Avanti
motore 1
motor2.run(FORWARD); //Avanti
motore 2
command = 2;
}
// SINISTRA
if (command==5){
motor1.run(FORWARD); //Avanti
motore 1
motor2.run(RELEASE); //Stop motore
2
delay(1000);
motor1.run(FORWARD); //Avanti
motore 1
motor2.run(FORWARD); //Avanti
motore 2
command = 2;
}
}
Creato da Daniele Toniolo come elaborato
finale per l'esame conclusivo del percorso scolastico, Scuola Secondaria di Primo grado,
come previsto dall'Ordinanza
Ministeriale n. 52 del 03.03.21