logo





ARDUINO
Arduino è un progetto ideato all'Interaction Design Institute di Ivrea, un istituto di formazione post universitario fondato da Olivetti e Telecom.
Il progetto originale, ideato da Hernando Barragan nel 2003, si chiamava Wiring che consisteva in una piccola scheda elettronica programmabile.
Nel 2005 Massimo Banzi, che si era interessato al lavoro di Barragan, decise di sviluppare una scheda più facilmente programmabile e economica.
"Arduino" prende il nome dal bar di Ivrea dove il team di progettisti, composto da Massimo Banzi, David Cuartielles, Tom Igoe, Gianluca Martino e David Mellis, si trovava  a prendere l'aperitivo; il progetto consiste in una scheda che avvicina designer e creativi al mondo della programmazione e dell'elettronica, per programmarla è necessario solo il software "Arduino IDE", un cavetto USB, un po' di conoscenza di programmazione e un pizzico di fantasia.
Arduino è inoltre open-source, quindi i progetti e il loro utilizzo, anche per scopi commerciali, è gratuito.







Ecco come appare l'interfaccia di "Arduino IDE":

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