Le pistole sono sempre brutte, così diciamo subito che le armi non ci piacciono.
Questo non è un tutorial vero e proprio, ma un riassunto di un progetto nato per gioco.
Una vecchia pistola giocattolo, per altro con un suono molto fastidioso, può essere modificata in un misuratore di distanze. Diventa cioè una pistola ad ultrasuoni che fa come i pipistrelli, spara impulsi non udibili ad orecchio umano e legge il tempo che impiega l’ultrasuono per il ritorno dell’onda rimbalzata sull’ostacolo.
Dalla misura del tempo intercorso si puà calcolare la distanza dell’oggetto.
Occorrente:
- Arduino Nano
- sensore di ultrasuoni HC-SR04
- display backpack 14 segmenti
- due led e due resistenze
- buzzer
- pila 9V
Schema:
La parte di prototipazione fatela con la classica breadboard e l’Arduino Nano collegato al PC, seguendo lo schema qua sopra e utilizzando il programma che trovate più sotto. Una volta trovato l’equilibrio cominciate a cablare tutto con del filo elettrico. Noi abbiamo deciso di saldare il filo direttamente ai pin dei componenti, ma è stato un massacro. Molto più intelligente e conveniente è saldare solo dove è necessario e utilizzare dei comuni connettori femmina-femmina per collegare i componenti tramite i loro pin.
Man mano che collegate tutto con i fili vi troverete ad avere una matassa di fili e di componenti elettronici appoggiata sul tavolo, un bel casino. Già. Ma non perdetevi d’animo.
Aprite il giocattolo da riciclare (cosa che avrete già fatto, vero?), estraete tutta l’elettronica che non vi serve, mettete da parte qualche pezzo che magari utilizzerete altrove e tenete, in particolare, la parte di circuito costituita dal grilletto della pistola giocattolo a cui dovete collegare il vostro Arduino nano (ai pin Vin e GND).
Cercate di figurarvi dove piazzare i vari pezzi e provando un po’ cercate di incastrate il tutto, noi abbiamo dovuto rimuovere delle parti di plastica della pistola per permettere l’alloggiamento di una pila da 9V perché le 3 pile AAA da 1.5V con cui funzionava la pistola non fornivano abbastanza corrente per accendere il display, per cui abbiamo dovuto fare un po’ di spazio.
Ogni tanto mentre montate, provate a vedere se tutto funziona ancora. Per questo conviene montare/saldare tutti i fili a partire dall’alimentazione e quindi dal grilletto della pistola.
Man mano piazzate dei punti di colla a caldo per tenere un po’ fermi i fili, specie se avete dei contatti non isolati che potrebbero muoversi nel muovere il giocattolo, toccarsi e causare cortocircuiti fatali.
Ecco le varie parti inserite nella pistola giocattolo:
Ricordatevi di non bloccare l’accesso alla porta micro usb del microcontroller (l’Arduino Nano nel nostro caso) perché potrebbe essere necessario ricollegarlo al computer per modificarne il programma.
Il programma che abbiamo fatto spara bip col buzzer, insieme al bip facciamo lampeggiare un led (led impulsi nell’immgine) e mandare impulsi con l’ultrasuono. Se riesce a fare 3 misure con un errore di più o meno un cm di fila allora mostra il risultato sul display.
Mentre fa le misure sul display fa un’animazione a caratteri, giusto per non farci mancare nulla.
Programma:
#include <Wire.h> #include "Adafruit_LEDBackpack.h" #include "Adafruit_GFX.h" Adafruit_AlphaNum4 alpha4 = Adafruit_AlphaNum4(); int trigPin = 3; int cic = 7; int echoPin = A1; void ledprint(char* str, Adafruit_AlphaNum4 *alphanum) { int pos = 0; for (int index = 0; (index < strlen(str) && pos < 4); index++) //for each character in str { if ('.' == str[index+1]) //if the next character after this one is '.' { alphanum->writeDigitAscii(pos, str[index], true); //write the '.' along with the character index++; //skip over the '.' } else { alphanum->writeDigitAscii(pos, str[index]); //write the character } pos++; } alphanum->writeDisplay(); //write to the display. } void setup() { alpha4.begin(0x70); // pass in the address alpha4.clear(); alpha4.writeDisplay(); pinMode(echoPin, INPUT); pinMode(trigPin, OUTPUT); pinMode(cic, OUTPUT); digitalWrite(cic,LOW); } String s[8] = {"> "," > "," > "," >"," <"," < "," < ","< "}; void loop() { long duration, cm, cm0; unsigned int ok = 0; unsigned int i = 0; cm0 = 0; // loop to get 3 good measures, ok=0 1 2 while (ok<=2) { // The sensor is triggered by a HIGH pulse of 10 or more microseconds. // Give a short LOW pulse beforehand to ensure a clean HIGH pulse: digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); // Read the signal from the sensor: a HIGH pulse whose // duration is the time (in microseconds) from the sending // of the ping to the reception of its echo off of an object. duration = pulseIn(echoPin, HIGH); // convert the time into a distance cm = duration / 29.1 / 2; if(cm>=500||cm<=0) { // noise } else { if(cm0!=cm && cm0!=cm+1 cm0!=cm-1) { // first good measure or found a bad measure cm0=cm; ok = 0; } else { // another good measure ok++; } } // display animation alpha4.clear();alpha4.writeDisplay(); ledprint(s[i%8].c_str(),&alpha4); // beep and light analogWrite(cic,200); delay(4); analogWrite(cic,0); delay(110); i++; } // enaugh good measures found // display result alpha4.clear();alpha4.writeDisplay(); String s; if(cm<100) { s = "cm"; if(cm<10) s+=" "; s += String(cm); } else { s = "m"+String(float(cm)/100); } ledprint(s.c_str(),&alpha4); delay(3000); }
Infortuni / cose che ho imparato:
- potresti bruciare un Arduino Nano accidentalmente tenendolo appoggiato su una superificie piena di roba, con scampoli di fili elettrici in giro
- se alimenti il sensore ad ultrasuoni direttamente con la pila potresti ottenere risultati random, se vuoi risultati corretti utilizza i 5V stabilizzati forniti dall’Arduino Nano
- nel passaggio dalla breadboard alla prototipo funzionante con i vari componenti collegati e sganciato dal computer usa i connettori femmina-femmina o maschio-maschio, o mix di questi, non scegliere di saldare tutto, se non hai un buon saldatore potresti arrabbiarti molto
- per bloccare i componenti in una posizione usa la colla a caldo, stai attento a non bloccarti l’accesso ai vari componenti, rimuovere la colla a caldo non è sempre semplice
- il sensore ad ultrasuoni arriva ad un massimo di 5m, ma l’errore aumenta, ci vorrebbe o un sensore ad infrarossi o al laser per misurare con più precisione e ad una maggiore distanza