vuoi
o PayPal
tutte le volte che vuoi
Progetto: Macchinina comandata tramite bluetooth
Componenti utilizzati
Una macchinina radiocomandata Gig Nikko con 2 motori in corrente continua
Una scheda Arduino 2009
Interfaccia motor shield (controllo motori per Arduino)
Modulo LLC
Una scheda bluetooth
2 Sensori di distanza Sharp
4 LED
Pacco batterie contenente 6 pile AA
Un notebook fornito di bluetooth
Visual Basic 6 Schema a blocchi dei collegamenti
Arduino Logic
Level
Converter
Bluetooth PC
Motor Shield
Motore Motore
Trazione Sterzo
Hardware
Cenni su Arduino
Il progetto Arduino ha preso il via ad Ivrea
all'Interaction Design Institute di Olivetti e
Telecom nel 2005 ed è completamente Open
Source, ovvero chiunque può replicarsi la
piastrina in casa oppure modificarla a
piacimento senza violare alcuna licenza.
Arduino Duemilanove (anno di uscita di
questa versione) è una scheda basata su un
microcontroller ATmega 328, è provvista di La scheda Arduino Duemilanove
Mattia Lancieri VB Informatica Pag. 3
Progetto: Macchinina comandata tramite bluetooth
14 entrate/uscite digitali, 6 di queste possono essere usate come uscite PWM. La
scheda può essere connessa a un computer tramite un cavo USB (Universal Serial Bus)
emulando una porta seriale, da dove prende anche l’alimentazione a 5V necessaria al
suo funzionamento, in caso si debbano alimentare anche motori si può provvedere a
una alimentazione esterna. Arduino si programma attraverso il computer, con un
ambiente di sviluppo apposito in C++, più avanti verrà trattato il codice in modo più
approfondito. La piastrina può essere accoppiata a vari shield, ovvero schede
specifiche che permettono di estendere le sue capacità come l’ethernet shield che
permette di connettere Arduino ad una rete per essere controllato a distanza o il motor
shield. Al momento Arduino si è diffuso in tutto il mondo, è usato in ogni campo, anche
quello ospedaliero, in quanto semplicemente programmandolo correttamente gli si
può fare eseguire qualsiasi funzione, dalla semplice accensione di una lampadina per
un certo tempo fino al controllo di apparecchiature complesse. La scheda esiste in
varie versioni, la duemilanove usata nel progetto è la versione base, adatta alla
maggior parte degli utenti, esiste poi una versione Mega con più entrate\uscite, la
versione mini per piccoli progetti e una versione LilyPad da usare per T-Shirt con
display incorporato (ad esempio con barre che si muovono a ritmo di musica).
Versione Lilypad Versione Mega
Motor shield
La piastrina motor shield è una delle tante estensioni applicabili ad Arduino, essa
permette di controllare più motori elettrici, nel nostro caso i 2 motori della macchinina:
quello dello sterzo e il motore di trazione. Si applica al di sopra di Arduino e viene
collegata a una alimentazione supplementare per permettere di azionare i motori,
dato che l’alimentazione usb non fornisce abbastanza potenza, sopra di essa è
presente un LED che ne indica lo stato. Tramite apposite librerie è possibile il controllo
via software. Piastrina motor shield collegata su Arduino
Mattia Lancieri VB Informatica Pag. 4
Progetto: Macchinina comandata tramite bluetooth
LLC (Logic Level Converter)
Il ricevitore bluetooth è alimentato a 3,3V, mentre Arduino è alimentato a 5V, questo
comporta una disparità nei livelli logici, per ovviare a questo inconveniente si usa un
convertitore di livelli logici (llc) che si preoccupa di adattare i livelli logici tra le 2
architetture. LLC usato per il progetto
Bluetooth
Il modulo installato
permette di trasferire i
dati ricevuti dall’interfaccia direttamente alla porta seriale di Logo
Arduino, come se si stesse comandando via cavo. È un sistema di
comunicazione wireless a corto raggio nella banda a 2,4GHz con velocità massima di
2Mbps, la trasmissione dei dati è seriale, ovvero 1 bit dopo l’altro in successione. Sono
permessi collegamenti point to point o tramite un access point centrale, l’unità
centrale è chiamata master mentre le periferiche sono gli slave, il master comunica
agli slave quali indirizzi usare, quando trasmettere, per quanto e le frequenze da
utilizzare. La piconet è l’unità base di Bluetooth, è composta da un master e massimo
7 nodi slave, più piconet connesse formano una scatternet. Oltre ai 7 nodi attivi ci
possono essere 256 nodi sospesi, un nodo è sospeso quando ad esempio è in stato di
risparmio energetico. Tra 2 slave non avviene mai la comunicazione. Il bluetooth
fornisce vari profili ovvero:
Accesso generico: è quello principale, permette di stabilire e mantenere canali
protetti tra master e slave.
Scoperta del servizio: molto importante perché permette ad un dispositivo
bluetooth di scoprire i servizi che possono offrire gli altri parecchi che si trovano
nel raggio di scansione del dispositivo.
Porta seriale: permette di emulare una porta
seriale via bluetooth, viene offerto dal ricevitore
della macchinina, permettendo così il
collegamento all’interfaccia visual basic tramite il
componente mscomm.
Accesso dial-up: permette di collegarsi senza filo
ad un modem esterno (un comune cellulare
dotato di bluetooth ha un modem), il progetto
bluetooth è nato per questo scopo.
Telefonia Cordless: permette la comunicazione
Modulo Bluetooth tra un cordless e la sua base.
Auricolare wireless: permette di collegarsi ad un
auricolare senza fili.
Invio di file: permette l’invio di file tra un dispositivo e l’altro come immagini,
mp3, video, ha sostituito in breve la porta irda dei telefoni.
Il bluetooth può essere utilizzato per realizzare una rete locale con il profilo accesso
LAN, effettuando la ricerca e connettendosi ad un access point dotato di tale
Mattia Lancieri VB Informatica Pag. 5
Progetto: Macchinina comandata tramite bluetooth
tecnologia ci si può collegare tramite password alla rete. Dato che la banda di 2,4 GHz
è usata anche dal wi-fi una trasmissione bluetooth potrebbe disturbarla.
Sensori di distanza Sharp Sensore Sharp 2Y0A02
Sulla macchina vi sono 2 sensori di distanza, uno sul paraurti
davanti e l’altro sul retro, quando questi sensori rilevano un
ostacolo a circa 30cm di distanza arrestano il motore di trazione.
Questi 2 sensori hanno un’uscita analogica, collegata alle relative
entrate di Arduino, l’uscita varia da 0,4V a 2,8V. Arduino trasforma
questi valori in un numero decimale, secondo questi criteri:
LED LED di vari colori
L.E.D. sta per Light Emitting Diode, è composto da vari
materiali, che attraversati da una corrente (anche molto
bassa) emettono luce. I led emettono luce fredda, per
questo sono molto affidabili e possono lampeggiare
molto velocemente. Per il loro basso consumo energetico
stanno velocemente sostituendo le classiche lampadine
ad incandescenza, ne esistono di diversi colori. Vista
anche la loro alta luminosità si stanno anche imponendo
nelle automobili come luci diurne o come stop. Devono
avere in serie una resistenza, più avanti si tratterà il modo per calcolarla.
Software
Arduino
Per la programmazione di Arduino si
utilizza come già detto un software
derivato dal C++ con un compilatore
open source, esso, dopo aver
selezionato la porta seriale (in questo
caso una seriale virtuale bluetooth),
permette di trasferire il codice nella
memoria di Arduino, dove sarà in
esecuzione continua fino allo
spegnimento del piastrino.
Screenshot del software (Versione 0018)
Mattia Lancieri VB Informatica Pag. 6
Progetto: Macchinina comandata tramite bluetooth
Codice attualmente in uso
#include <AFMotor.h> //Libreria del Motor Shield
AF_DCMotor motor3(3, MOTOR12_64KHZ); // Definisce I 2 motori
AF_DCMotor motor1(1, MOTOR12_64KHZ);
// Dichiarazione delle variabili
byte inSerByte = 0;
int ledPin = 16; // LED freccia connesso al pin digitale 16
int ledPin2 = 17; // LED freccia connesso al pin digitale 17
int ledPinDietro = 18; //LED sensore dietro collegato al pin analogico 4 (digitale 18)
int ledPinDavanti = 19; //LED sensore davanti collegato al pin analogico 5 (digitale 19)
const int analogInPin0 = 0; // Sensore distanza dietro
const int analogInPin1 = 1; // Sensore distanza davanti
int sensorValue = 0; // Valore letto dal sensore
int outputValue = 0; // Valore restituito in forma numerica
int sensorValue2 = 0; // Valore letto dal sensore
int outputValue2 = 0; // Valore restituito in forma numerica
int L1 = 0; //Variabili usate nell’interfaccia
int L2 = 0;
void setup(void)
{ // Inizializzazione dei pin in output
pinMode(ledPin, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(ledPinDietro, OUTPUT);
pinMode(ledPinDavanti, OUTPUT);
// Configurazione della porta seriale
Serial.begin(115200); //Definizione del baud rate
}
void loop(void) //Parte di codice sempre in esecuzione
{ byte dato;
sensorValue = analogRead(analogInPin0); //Configurazione dei sensori
outputValue = map(sensorValue, 0, 1023, 0, 255);
if (sensorValue > 330 && sensorValue < 390) //Se il valore letto è compreso tra 330 e 390
{ motor3.setSpeed(180); //Ferma il motore
motor3.run(RELEASE);
digitalWrite(ledPinDietro, HIGH); //Accende il led VERDE che corrisponde al sensore
L1=1;
}
else
{
digitalWrite(ledPinDietro, LOW); //Il led VERDE rimane spento se la distanza non è
quella esatta
L1=0;
} ///////////////////////////////////////////////////////////////////////
sensorValue2 = analogRead(analogInPin1);
outputValue2 = map(sensorValue2, 0, 1023, 0, 255);
Mattia Lancieri VB Informatica Pag. 7
Progetto: Macchinina comandata tramite bluetooth
if (sensorValue2 > 330 && sensorValue2 < 390) //Se il valore letto è compreso tra 330 e 390
{ motor3.setSpeed(180); //Ferma il motore
motor3.run(RELEASE);
digitalWrite(ledPinDavanti, HIGH); //Accende il led VERDE che corrisponde al sensore
L2=1;
}
else
{
digitalWrite(ledPinDavanti, LOW); //Il led VERDE rimane spento se la distanza non è quella
esatta
L2=0;
}
/////////////////////////////////////////////////////////////////////////// Controllo led per l’
interfaccia
if (L1==1) //Se il led è acceso
{ Serial.print("a"); //Visualizzo “a” tramite porta seriale
}
if (L2==1) //Se il led è acceso
{ Serial.print("b"); //Visualizzo “b” tramite porta seriale
}
/////////////////////////////////////////////////////////////////////////
if (Serial.available() > 0) { //In questa parte si Definisce un menù, ovvero per ogni
carattere inviato dall’interfaccia Arduino esegue un’azione
int result = 0;
inSerByte = Serial.read();
switch (inSerByte) {
case 'l': //test LED
Serial.println("Test dei LED");
digitalWrite(ledPin, HIGH);
delay(1000);
digitalWrite(ledPin, LOW);
delay(1000);
digitalWrite(ledPin2, HIGH);
delay(1000);
digitalWrite(ledPin2, LOW);
delay(1000);
digitalWrite(ledPinDietro, HIGH);
delay(1000);
digitalWrite(ledPinDietro, LOW);
delay(1000);
digitalWrite(ledPinDavanti, HIGH);
delay(1000);
digitalWrite(ledPinDavanti, LOW);
Serial.println("Test Concluso");
result = 0;
break;
case 'w': //Quando ricevo w faccio
Serial.println("Avanti");
motor3.setSpeed(180);
motor3.run(FORWARD); // Motore avanti
result = 0;
break;
case 's':
Serial.println("Indietro");
motor3.setSpeed(180);
motor3.run(BACKWARD); // Motore indietro
result = 0;
break;
case 'd':
Serial.println("Destra");
motor1.setSpeed(255);
motor1.run(BACKWARD); // Gira a destra
result = 0;
digitalWrite(ledPin2, HIGH); //Freccia destra
delay(100); // Ritardo di 0,1 secondi
digitalWrite(ledPin2, LOW);
delay(100);
Mattia Lancieri VB Informatica Pag. 8
Progetto: Macchinina comandata tramite bluetooth
digitalWrite(ledPin2, HIGH);
delay(100);
digitalWrite(ledPin2, LOW);
delay(100);
digitalWrite(ledPin2, HIGH);
delay(100);
digitalWrite(ledPin2, LOW);
break;
case 'a':
Serial.println("Sinistra");
motor1.setSpeed(255);
motor1.run(FORWARD); // Gira a sinistra
result = 0;
digitalWrite(ledPin, HIGH); // Freccia sinistra
delay(100);
digitalWrite(ledPin, LOW);
delay(100);
digitalWrite(ledPin, HIGH);
delay(100);
digitalWrite(ledPin, LOW);
delay(100);
digitalWrite(ledPin, HIGH);
delay(100);
digitalWrite(ledPin, LOW);
break;
case 'q':
Serial.println("Raddrizza le ruote");
motor1.setSpeed(255);
motor1.run(RELEASE); // Raddrizza sterzo
result = 0;
digitalWrite(ledPin, HIGH);
digitalWrite(ledPin2, HIGH); // Lampeggio veloce di entrambe le frecce
delay(100);
digitalWrite(ledPin, LOW);
digitalWrite(ledPin2, LOW);
break;
case ' ':
Serial.println("Ferma");
motor3.setSpeed(180);