Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
I.T.I.S. C.Zuccante
Progetto:
Tiro al bersaglio laser
con torretta automatica
Sommario
Introduzione generale: .............................................................................................................. 3
Schema a blocchi: ..................................................................................................................... 4
Blocco A – Elegoo mega 2560 r3 ......................................................................................... 5
Blocco B, D – Sistema dei bersagli e visualizzazione punti con LCD ...................................... 9
Blocco C – Trasduttore segnale laser ................................................................................. 17
Blocco E – Arduino Uno...................................................................................................... 18
Blocco F – Visione artificiale .............................................................................................. 18
Blocco G – Torretta automatica .......................................................................................... 20
Conclusione:............................................................................................................................ 23
2
Introduzione generale:
Il progetto consiste in un gioco di tiro al bersaglio laser con una torretta automatica come
avversario del giocatore.
I bersagli sono posizionati sopra a una struttura in legno e mossi attraverso dei servo-motori; i
bersagli sono in totale 10, tra cui due finali che sono movibili in modo laterale per rendere il
gioco piùdifficile.
La torretta automatica, punta al bersaglio grazie alla visione artificiale mediante telecamera
VF0250 che gli indica le coordinate da seguire.
Il punteggio finale del robot e del giocatore verrà visualizzato infine su un display LCD.
Vince chi prima raggiunge i 10 punti!
3
Schema a blocchi:
4
Blocco A – Elegoo mega 2560 r3
Il microcontrollore Elegoo mega 2560 r3 è uguale all’Arduino mega 2560 Rev 3 con solo il
nome differente. Si è scelto di usare l’Elegoo e non l’Arduino Uno per la sua maggiore
quantitàdi pin digitali di cui abbiamo bisogno.
5
6
7
Visione dall’alto dello Shield per “Elegoo mega 2560 r3”
Visione dal basso dello Shield per “Elegoo mega 2560 r3”
8
Blocco B, D – Sistema dei bersagli e visualizzazione punti con LCD
Questo blocco viene controllato tutto dall’Elegoo mega 2560 r3; qui viene gestito tutta la
parte dei bersagli e del LCD del progetto.
I bersagli cambiano posizione da visibile a non visibile mediante dei servo motori, mentre i
bersagli mobili, oltre al servo, hanno anche motori DC che gli muovono da destra a sinistra e
viceversa.
Ogni bersaglio èdotato di due fototransistor e di una copertura per evitare i disturbi luminosi
dell’ambiente. [questa parte verràspiegata piùspecificatamente nel Blocco C]
Sul display LCD infine viene proiettato i punti guadagnati dal robot e giocatore, inoltre una
frase che dichiara il vincitore della partita.
Componenti
9
Foto del bersaglio
10
Struttura base in legno con canaline e bersagli
11
Codice per sistema di bersagli con lettura segnale laser e visualizzazione
punti con display LCD
#include <Servo.h> //Inserire la libreria Servo
#include "LiquidCrystal.h"
12
//variabile per far partire i motori DC a destra
int i;
void setup() {
void loop() {
//controllo se non ci sono bersagli ON, se non ci sono entro nel ciclo if
if (bersaglio_pronto == 0) {
//se i punti del robot e del giocatore sono inferiori a 11 entro nel ciclio if
13
ServoG5.write(0);
//se il robot guadagna 10 punti, sul LCD viene scritto ROBOT VINCE e si rinizializza
//a 0 i punti sia del robot sia del giocatore e si attende 10s prima che il gioco
//ricominci
if (puntiR == 10) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ROBOT VINCE");
puntiR = 0;
puntiG = 0;
delay(10000);
lcd.clear();
}
//se il giocatore guadagna 10 punti, sul LCD viene scritto GIOCATORE VINCE
//e si rinizializza a 0 i punti sia del robot sia del giocatore e si attende
//10s prima che il gioco ricominci
if (puntiG == 10) {
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("GIOCATORE VINCE");
puntiR = 0;
puntiG = 0;
delay(10000);
lcd.clear();
}
//ciclo switch case per selezionare quale bersaglio robot deve andare ON
switch (n_bersaglio_robot) {
case 1:
bersaglio_pronto = 1;
ServoR1.write(75);
fotocontrol = 1;
break;
case 2:
bersaglio_pronto = 1;
ServoR2.write(90);
14
fotocontrol = 1;
break;
case 3:
bersaglio_pronto = 1;
ServoR3.write(90);
fotocontrol = 1;
break;
case 4:
bersaglio_pronto = 1;
ServoR4.write(75);
fotocontrol = 1;
break;
case 5:
bersaglio_pronto = 1;
ServoR5.write(90);
digitalWrite(MotoreR1, HIGH);
digitalWrite(MotoreR2, LOW);
fotocontrol = 2;
break;
}
//ciclo switch case per selezionare quale bersaglio giocatore deve andare ON
switch (n_bersaglio_giocatore) {
case 1:
bersaglio_pronto = 1;
ServoG1.write(75);
fotocontrol = 1;
break;
case 2:
bersaglio_pronto = 1;
ServoG2.write(75);
fotocontrol = 1;
break;
case 3:
bersaglio_pronto = 1;
ServoG3.write(75);
fotocontrol = 1;
break;
case 4:
bersaglio_pronto = 1;
ServoG4.write(75);
fotocontrol = 1;
break;
case 5:
bersaglio_pronto = 1;
ServoG5.write(110);
digitalWrite(MotoreG1, HIGH);
digitalWrite(MotoreG2, LOW);
fotocontrol = 2;
break;
}
//quando viene beccato un bersaglio col laser, i bersagli si abbassano e se era del robot, verra' aggiunto un punto
al robot
//mentre se era del giocatore, viene aggiunto un punto al giocatore
if (digitalRead(foto_transR1) == 0 || digitalRead(foto_transR2) == 0 || digitalRead(foto_transR3) == 0 ||
digitalRead(foto_transR4) == 0) {
puntiR = puntiR + 1;
bersaglio_pronto = 0;
fotocontrol = 0;
}
if (digitalRead(foto_transG1) == 0 || digitalRead(foto_transG2) == 0 || digitalRead(foto_transG3) == 0 ||
digitalRead(foto_transG4) == 0) {
puntiG = puntiG + 1;
15
bersaglio_pronto = 0;
fotocontrol = 0;
}
}
//ciclo while quando viene selezionato un bersaglio mobile, vengono attivati i motori DC
while (fotocontrol == 2) {
//cicli if quando viene beccato un bersaglio mobile, dipendentemente dal robot o giocatore
//viene assegnato un punto
if (digitalRead(foto_transR5) == 0) {
digitalWrite(MotoreR1, LOW);
digitalWrite(MotoreR2, LOW);
digitalWrite(MotoreG2, LOW);
digitalWrite(MotoreG1, LOW);
puntiR = puntiR + 1;
bersaglio_pronto = 0;
fotocontrol = 0;
}
if (digitalRead(foto_transG5) == 0) {
digitalWrite(MotoreR1, LOW);
digitalWrite(MotoreR2, LOW);
digitalWrite(MotoreG2, LOW);
digitalWrite(MotoreG1, LOW);
puntiG = puntiG + 1;
bersaglio_pronto = 0;
fotocontrol = 0;
}
//ciclo if per far andare destra e sinistra i motori DC con i finecorsa fintanto
//che non vengono beccati i bersagli mobili
if (digitalRead(foto_transR5) == 1 && digitalRead(foto_transG5) == 1) {
if (digitalRead(finecorsaR_sx) == 0) {
digitalWrite(MotoreR1, HIGH);
digitalWrite(MotoreR2, LOW);
}
if (digitalRead(finecorsaR_dx) == 0) {
digitalWrite(MotoreR2, HIGH);
digitalWrite(MotoreR1, LOW);
}
if (digitalRead(finecorsaG_sx) == 0) {
digitalWrite(MotoreG1, HIGH);
digitalWrite(MotoreG2, LOW);
}
if (digitalRead(finecorsaG_dx) == 0) {
digitalWrite(MotoreG2, HIGH);
digitalWrite(MotoreG1, LOW);
}
}
}
}
16
Blocco C – Trasduttore segnale laser
Blocco in cui il segnale del puntatore laser della torretta automatica viene trasportato da
valore luminoso a valore elettronico per il Elegoo mega mediante due foto-transistor collegati
ad ogni bersaglio.
Circuito
Calcoli
Perciò prendiamo una . Inoltre per facilitare la cattura del segnale laser dal
nostro foto-transistor, aumentiamo l’area utile al ricevimento del laser ed il conseguente
innesco del componente mettendo due foto-transistor in parallelo. Il calcolo rimane invariato.
17
Blocco E – Arduino Uno
Microcontrollore usato per controllare la torretta automatica e ricevere dati dalla visione
artificiale tramite il Processing per muovere la torretta in una data coordinata.
Attraverso l’utilizzo della telecamera VF0250, viene visualizzato la posizione del bersaglio
attraverso il suo colore verde, la coordinata della sua posizione viene inviata ad Arduino
mediante il programma Processing .
18
void setup() {
size(400, 460); //dimensione della finestra
String[] cameras = Capture.list();
printArray(cameras);
video = new Capture(this, cameras[13]); //imposto che telecamera utilizzare
video.start();
//inizia
trackColor = color(204, 0, 0);
//colore da cercare
String portName = Serial.list()[0]; //decido che port del USB usare
myPort = new Serial(this, portName, 9600);
}
void draw() {
video.loadPixels();
image(video, 0, 0);
// Before we begin searching, the "world record" for closest color is set to a high number that is easy for the first
pixel to beat.
float worldRecord = 500;
float d = dist(r1, g1, b1, r2, g2, b2); // compariamo il colore voluto con colore attuale
if (d < worldRecord) { //se il pixel analizzato èabbastanza vicino al colore scelto viene salvato le
coordinate
worldRecord = d;
closestX = x;
closestY = y;
}
}
}
19
}
void mousePressed() {
// Salva il colore dove il mouse ha cliccato come colore da cercare
int loc = mouseX + mouseY*video.width;
trackColor = video.pixels[loc];
mouse=1;
}
La torretta automatica èformato da due servo motori che hanno scopo di spostare il puntatore
laser nello spazio mediante le coordinate x ed y ricevuti tramite la visione artificiale.
Componenti
20
Piattaforma di posizionamento telecamera, torretta automatica e
giocatore
void setup()
{
pinMode(Laser, OUTPUT);
//Il Servox e' collegato al pin digitale 3 che comanda le coordinate X
Servox.attach (3);
// Il Servoy e' collegato al pin digitale 6 che comanda le coordinate Y
Servoy.attach(6);
digitalWrite(Laser, 1);
}
void loop()
{
if (Serial.available() > 0) {
int incomingValue = Serial.read();
values[currentValue] = incomingValue;
21
currentValue++;
if (currentValue > 1) {
currentValue = 0;
Servox.write (map(values[0], 0, 255, 68, 95));
//muove il motore Servox in funzione del valore ricevuto
Servoy.write (map(values[1], 0, 255, 119, 146));
//muove il motore Servoy in funzione del valore ricevuto
delay(3);
Servox.write (map(values[0], 0, 255, 68, 95));
Servoy.write (map(values[1], 0, 255, 119, 146) + 1);
delay(3);
Servox.write (map(values[0], 0, 255, 68, 95));/
Servoy.write (map(values[1], 0, 255, 119, 146) - 1);
delay(3);
//Ampliamente del range di puntamento del nostro laser per rimediare l’errore dovuta dal non idealita’ del
webcame con la torreta
}
}
}
22
Conclusione:
Si sono riscontrati molte problematiche sulla parte hardware del progetto, per esempio la
luce ambientale che attivava i fototransistor in modo non voluto, per risolvere questo
problema abbiamo abbassato la resistenza da 10kΩ iniziali a 1,8kΩ e inoltre si è aggiunto
una protezione da luce ambientale sul bersaglio.
Si sono riscontrati anche vari problemi sull’installazione delle cinghie per far muovere a
destra e sinistra i bersagli visto che le torri di sostegno non riescono a rimanere fisse.
Inoltre è difficile calibrare bene le coordinate che si riceve dalla webcam con la direzione che
deve puntare il laser, in quanto la webcam e la piattaforma di posizionamento non
rimangono in una posizione fissa.
https://drive.google.com/open?id=1jpRAaI1MnlYqr8n9EuF60630awDXLr5s
23