In precedenti articoli abbiamo descritto il robot Little BOT, con le sue caratteristiche. La prima versione del robot prevedeva il controllo tramite dei componenti montati sulla scheda di controllo rappresentata dalla ESPLORA. La stazione di controllo di Little BOT è formata dai seguenti componenti:
-
Scheda Arduino esplora con display TFT
-
Batteria Li-ion
-
Scheda caricabatteria/alimentazione con Batteria Li-ion
-
Cavi di collegamento
-
Modulo Bluetooth BlueSMiRF Silver
La diffusione degli smartphone ha portato alla possibilità di utilizzare quest’ultimo come dispositivo di comando. Vediamo come.
Indice
Funzioni della stazione di controllo
La stazione di controllo permette di comandare il robot e di mostrare i dati della telemetria forniti dai sensori posti sul robot.
Tramite la pressione dei tasti e l’azionamento del Joystick presenti sulla scheda Esplora è possibile:
- Muovere il Servo frontale a destra, sinistra o cento
- Muovere il robot nelle 4 direzioni
- Richiedere la trasmissione telemetria.
- Emissione di un Beep dal buzzer;
- Accensione/spegnimento faro;
- Accensione/spegnimento LED sul Modulo Arduino Nano.
Sul display sono mostrati i valori:
- Tensione della batteria;
- Temperatura tramite il Sensore LM35;
- Distanza di un oggetto con sensore GP2D120X;
- Valore della luminosità da fotoresistenza;
La stazione è alimentata tramite una batteria ricaricabile, mentre il dialogo con il robot è effettuato tramite un modulo bluetooth.
Arduino Esplora
La scheda utilizzata nella stazione di controllo del robot Little Bot è basata sulla scheda Arduino Esplora, con le seguenti caratteristiche:
- Processore ATMEGA32U4 con bus a 8 bit prodotto dalla Atmel con architettura di tipo RISC, Velocità di clock 16 MHz, memoria Flash da 32 KB di cui 4 KB utilizzati dal bootloader, memoria EEPROM da 1KB, 20 porte Digital pin I / O, 12 Canali di ingresso analogici, 7 canali PWM, tensione di funzionamento 5V, 1 porta USB Full speed
- Un joystick analogico a due assi (X e Y) con pulsante centrale
- 4 pulsanti disposti a rombo
- Un potenziometro lineare a cursore
- Un microfono per rilevare il rumore ambientale.
- Un sensore di luce per la misurazione dell’intensità luminosa
- Un sensore per la misurazione della temperatura ambiente
- Un accelerometro triassiale (X, Y e Z)
- Un buzzer per produrre suoni
- Un led luminoso a LED tipo RGB con elementi Rosso Verde e Blu.
- 2 Ingressi per collegare i moduli sensore della serie Tinkerkit.
- 2 uscite per collegare i moduli attuatori della serie Tinkerkit.
- Un connettore per l’inserimento del display TFT a colori, dotato di uno slot per scheda SD
- Per sfruttare le caratteristiche della scheda Arduino Esplora occorrerà dotarla del suo display LCD TFT.
Caratteristiche del display
Le caratteristiche principali del display sono:
- lo schermo che misura 40x44mm circa e la presenza di uno slot micro-SD nella parte posteriore (non utilizzata nella presente applicazione) che è di tipo TFT (Thin Film Transistor).
- La tecnologia TFT è applicata ai display a cristalli liquidi (LCD) o OLED che vengono in questo modo, identificati come display a matrice attiva.
Il display TFT utilizzato è di tipo retroilluminato e misura 1,77″ di diagonale, con risoluzione di 160 x 128 pixel, per 262K colori. La gestione avviene tramite un’interfaccia SPI. I dati possono essere memorizzati all’interno della memoria RAM on-chip. La retroilluminazione del display è dimmerabile.
Batteria Li-ion
La batteria di tipo Li-ion potrà essere di qualunque modello, per esempio quella commercializzato dalla Seeedstudio, (codice POW103C1P ) si tratta di una batteria da 3,7V 2000 mA.
Scheda caricabatteria/alimentazione
Per caricare la batteria della stazione di controllo di Little Bot e fornire l’alimentazione alla scheda Arduino Esplora viene utilizzata una scheda Lipo Rider Pro ( prodotta dalla Seeed Studio ditta con sede a Shenzhen, China, creatrice di molti prodotti elettronici).
Ecco alcune caratteristiche della scheda:
- Corrente massima del carico 1A;
- Uscita stabile di 5V dalla presa USB indipendentemente dalla fonte;
- Algoritmi di ricarica batteria integrati in chip di controllo;
- Possibilità di carica della batteria tramite USB o pannello solare;
- Indicazioni tramite led della carica della batteria o del suo completamento;
- Indicazione tramite 4 led verdi dello stato di carica residua della batteria.
Come si può vedere nella foto sulla scheda sono identificabili tre sezioni tra loro dipendenti:
- Power Supply;
- Step-Up (Boost) Converter;
- Battery Monitor.
Più alcuni connettori, un pulsante e un interruttore a levetta.
Cavo di collegamento
Per la realizzazione del cavo di collegamento occorrono i seguenti componenti:
- 2 connettori tipo MOLEX – 22-01-1032- Femmina 3 pin (Codice RS 687-7897);
- 6 Terminali a crimpare, Femmina ,stagnato per cavo 22-28awg
- 1 Pin strip femmina 6×1
- 1 presa USB tipo A volante a saldare completa di guscio in plastica
- Cavi di collegamento
- Del tubo termo restringente
Con l’aiuto delle foto non dovrebbe essere difficile realizzare i collegamenti; per quanto riguarda la presa USB, il cavo rosso andrà saldato al pin 1 e il cavo nero al pin 4.
Per il collegamento del modulo bluetooth, il cavo giallo RX andrà inserito nel pin centrale del connettore collegato a OUT A, mentre il cavo bianco TX, andrà inserito nel pin centrale del connettore collegato a OUT B.
Modulo Bluetooth BlueSMiRF Silver
Il modulo BlueSMiRF Silver è un modem wireless Bluetooth prodotto dalla SparkFun, basato sull’integrato BlueSMiRF-42 RN prodotto dalla ROVING Networks acquisita recentemente dalla Micochip.
Specifiche tecniche:
- Approvazione FCC Classe 2 Bluetooth Modem Radio
- Piccole dimensioni- 51.5×15.8×5.6mm
- Collegamento molto robusto sia in integrità che come distanza di trasmissione (18m)
- Hardy frequency hopping scheme – opera in ambienti RF come il Wi-Fi, 802.11g, e Zigbee
- Connessione crittografata
- Frequenza: 2.4 ~ 2,524 GHz
- Tensione di funzionamento: 3.3V-6V
- Comunicazione seriale: 2400-115200 bps
- Temperatura di funzionamento: -40 ~ +70 C
- Antenna integrata
Per ulteriori informazioni vedere l’apposita pagina
Dettagli del montaggio della scheda di controllo
Il codice utilizzato
Segue il codice caricato nella memoria della scheda Esplora
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 |
// caricamento librerie #include <SoftwareSerial.h> #include <SPI.h> #include <Esplora.h> #include <TFT.h> //Definizione variabile di servizio int iBattVoltage = 0; int dBattVoltage = 0; char tensione1 [10]; int itemperatura = 0; int dtemperatura = 0; char temperatura1 [10]; char fotocellula1[10]; char distanza1[10]; boolean buttonStates[8]; SoftwareSerial mySerial(11, 3); // Definizione RX, TX per collegamento // Modulo bluetooth /* Questa matrice contiene i nomi dei pulsanti che sono letti. Più tardi, nello sketch, questi nomi saranno usati con il metodo Esplora.readButton (x), dove x è uno di questi pulsanti. */ const byte buttons[] = { JOYSTICK_DOWN, // Indietro JOYSTICK_LEFT, // Sinistra JOYSTICK_UP, // Avanti JOYSTICK_RIGHT,// Destra SWITCH_RIGHT, // Servo destra SWITCH_LEFT, // Servo sinistra SWITCH_UP, // Accende faro SWITCH_DOWN, // Suono }; /* Questo array dice qaule carattere inviare a seconda del tasto premuto. */ const char keystrokes[] = { '2', // Indietro '4', // Sinistra '8', // Avanti '6', // Destra 'i', // Servo DX 'p', // Servo Sx 'k', // Gestione faro 'q' // Bip }; // Impostazione del programma void setup() { Serial.begin(115200); //Imposta il modulo BlueSMiRF SILVER come MASTER //e setta il numera MAC del ricevente slave mySerial.begin(115200); mySerial.print("$"); mySerial.print("$"); mySerial.print("$"); delay(100); mySerial.println("SM,1"); delay(100); //inserire il codice MAC del modulo Slave mySerial.println("C,000666644021"); delay(100); mySerial.println("U,9600,N"); // Cambia temporaneamente il baudrate a 9600, no parity mySerial.println("---"); //Uscita command mode delay (100); mySerial.begin(9600); // Reinizializza la seriale bluetooth 9600 delay (100); //------------------- Esplora.tone(500, 150); mySerial.setTimeout(200); EsploraTFT.begin(); EsploraTFT.background(0,0,0); //sfondo nero EsploraTFT.setTextSize(2); EsploraTFT.stroke(0,255,0); //colore del testo verde EsploraTFT.text("Comando Robot",0,0); EsploraTFT.stroke(255,0,0); //colore del testo rosso EsploraTFT.text("LittleBot",25,25); EsploraTFT.setTextSize(1); EsploraTFT.stroke(255,255,255); //colore del testo bianco EsploraTFT.text("By adrirobot - ver. 1.0",10,45); EsploraTFT.stroke(0,255,255); //colore del testo cyano EsploraTFT.text("JOYSTICK -Direzione",0,80); EsploraTFT.text("SWITCH 1 -Accensione faro",0,90); EsploraTFT.text("SWITCH 2-4-SX-DX Servo",0,100); EsploraTFT.text("SWITCH 3 -Emissione suono",0,110); Esplora.tone(500, 150); delay (2000); //pausa per mostrare i comandi EsploraTFT.stroke(0,0,0); EsploraTFT.fill(0,0,0); EsploraTFT.rect(0,80, 200, 7); //Cancellazione valore EsploraTFT.rect(0,90, 200, 7); EsploraTFT.rect(0,100, 200, 7); EsploraTFT.rect(0,110, 200, 7); EsploraTFT.setTextSize(2); EsploraTFT.stroke(0,255,255); //colore del testo ciano EsploraTFT.text("Telemetria",20,60); EsploraTFT.setTextSize(1); EsploraTFT.stroke(0,255,0); //colore del testo verde EsploraTFT.text("Batteria :",0,90); EsploraTFT.text("Luminosita' :",0,100); EsploraTFT.text("Temperatura :",0,110); EsploraTFT.text("Distanza :",0,120); Esplora.tone(800, 300); } /* Dopo che il setup () è finito, questo codice viene eseguito in modo continuo. Qui controlliamo costantemente lo stato dei pulsanti e del Joystik. */ void loop() // LOOP di lettura tasti e invio carattere { // Lettura pulsanti: for (byte thisButton=0; thisButton<8; thisButton++) { boolean lastState = buttonStates[thisButton]; boolean newState = Esplora.readButton(buttons[thisButton]); if (lastState != newState) { // Il tasto è cambiato! /* La biblioteca Keyboard consente di di riconoscere "pressione" e "rilascio" dei tasti come due azioni distinte. Queste azioni possono essere legati ai pulsanti che stiamo azionando. */ if (newState == PRESSED) { mySerial.print(keystrokes[thisButton]); } else if (newState == RELEASED) { mySerial.print("0"); } } // Memorizza il nuovo stato del pulsante, in modo da poter percepire successivamente la differenza buttonStates[thisButton] = newState; telemetria (); //stampa telemetria su display } delay(50); //Leggera attesa tra un controllo e l'altro. } void telemetria () { while (mySerial.available()>1) { //Lettura valori int BatteryValue = mySerial.parseInt(); int luce = mySerial.parseInt(); int temperatura = mySerial.parseInt(); int distanza = mySerial.parseInt(); int www = mySerial.parseInt();//valore non utilizzato //Preparazione valori per stampa su display //Tensione batteria Robot float fBattVoltage = ((BatteryValue/10.0)-5); iBattVoltage = (int)fBattVoltage; // Unita' valore della tensione dBattVoltage = (fBattVoltage-iBattVoltage)*10; // Decimali valore della tensione sprintf(tensione1,"%d.%d V",iBattVoltage,dBattVoltage); Serial.print("Tensione batteria: "); Serial.println(tensione1); //Valore luminosita' sprintf(fotocellula1,"%d",luce); Serial.print("Valore Luce: "); Serial.println(fotocellula1); //Valore temperatura float ftemperatura = (temperatura/10.0); itemperatura = (int)ftemperatura; // Unita' valore della tensione dtemperatura = (ftemperatura-itemperatura)*10; // Decimali valore della tensione sprintf(temperatura1,"%d.%d C",itemperatura,dtemperatura); Serial.print("Temperatura: "); Serial.println(temperatura1); //Valore distanza // char distanzaStr[5]; //Asseganzione a char sprintf(distanza1,"%d cm",distanza); Serial.print("Distanza: "); Serial.println(distanza1); //Stampa valori su display EsploraTFT.stroke(0,0,0);//colore nero EsploraTFT.fill(0,0,0); EsploraTFT.rect(100,90, 40, 7); //Cancellazione valore EsploraTFT.rect(100,100, 40, 7); EsploraTFT.rect(100,110, 40, 7); EsploraTFT.rect(100,120, 40, 7); EsploraTFT.stroke(255,255,0); //colore del testo giallo EsploraTFT.text(tensione1, 100, 90); EsploraTFT.text(fotocellula1, 100, 100); EsploraTFT.text(temperatura1,100,110); EsploraTFT.text(distanza1,100,120); Esplora.tone(800, 150); // Dati completati } } |
Articolo pubblicato su Elettronica Open Source
La stazione di controllo descritta in questo articolo è stata oggetto di un articolo più completo pubblicato sul Blog Elettronica Open Source con cui ho collaborato e scritto molti articoli.