E labirinto cronaca di un fallimento

Похожие документы
D sistema d allarme con sensori magnetici

CORSO ARDUINO. Jacopo Belli Giulio Fieramosca Luca Mattii GOLEM Jacopo Belli Giulio Fieramosca Luca Mattii

Display numerico con i LED

FONDAMENTI DI ARDUINO

Relazione progetto Arduino

12 - timer da cucina display a 4 cifre

CORSO ARDUINO. Corso ASEV Giulio Fieramosca Stefano Panichi. Lezione 3 PWM e motori. Stefano Panichi e Giulio Fieramosca

Corso di programmazione Arduino DI MALVEZZI DAVIDE

Far lampeggiare un led o forse un semaforo?

8^ parte: Pilotare Motori passo-passo bipolari usando l integrato SN754410NE. Author: Ing. Sebastiano Giannitto (ITIS M.

Corso Base Arduino ed Elettronica

ACCENDERE E SPEGNERE UN DIODO LED

La Keyes 4 relay non è proprio una shield nel senso classico definito nel mondo arduino in quanto una shield dovrebbe essere concepita per essere

8^ parte : Come pilotare i motori passo-passo unipolari. Author: Ing. Sebastiano Giannitto (ITIS M.BARTOLO PACHINO)

Per vedere tutti i tutorial:

Relazione progetto Arduino

PRIMI PASSI CON ARDUINO

Facciamo lampeggiare un led

In questo tutorial decodificheremo i segnali provenienti da un telecomando qualsiasi e utilizzeremo gli stessi segnali per comandare Arduino a

ARDUINO. Colleghiamolo al PC/MAC - FUNZIONA?

INSEGUITORE SOLARE CON ARDUINO. Dispositivo che insegue il movimento solare realizzato con: 1. Arduino 2. 2 foto resistenze 3.

Arduino: Programmazione

Cos'è Arduino? rilasciata con licenza di tipo open source.

CORSO ARDUINO. Jacopo Belli Giulio Fieramosca Luca Mattii GOLEM Jacopo Belli Giulio Fieramosca Luca Mattii

8^ parte: Pilotare Motori passo-passo unipolari usando l integrato ULN2003A. Author: Ing. Sebastiano Giannitto (ITIS M.

Relazione attività di laboratorio - Arduino

TERMOMETRO LCD BASATO SUL TRASDUTTORE DI TEMPERATURA ANALOGICO LM 35

Alunna: Gennuso Ylenia classe VB a.s. 2014/2015

Corso Base Arduino ed Elettronica

CTU Presenta. Contest Automation con Arduino. IK0XBX - Francesco

Programming with arduino. Lesson 10/05/2017

CORSO ARDUINO. Corso ASEV Giulio Fieramosca Stefano Panichi. Stefano Panichi e Giulio Fieramosca

Tipologie dei dati nell SDK di Arduino come in un vero LP ad alto livello :

Macchina con Arduino Uno comandata tramite dispositivo Android e sensore ultrasuoni per fermarsi istantaneamente di fronte ad un ostacolo

8^ parte : Pilotare Motori passo-passo bipolari usando l integrato L298N. Author: Ing. Sebastiano Giannitto (ITIS M.

14^ parte : Sensore a ultrasuoni HC SR04 e Arduino. Author: Ing. Sebastiano Giannitto (ITIS M.BARTOLO PACHINO)

CONTASECONDI CON DISPLAY A 7 SEGMENTI ARDUINO LIKE

Progetto Esami Di Stato Anno 2014/2015

1.Con il 3GX entrare nel modo di funzionamento, muovere il timone a sinistra oppure a destra, quindi premere il pulsante SET per circa un secondo.

SEA Descrizione. Centralina Controllo Strip LED RGB

SVOLGIMENTO SECONDA PROVA 2017 SISTEMI AUTOMATICI: PARTE 1

Cablaggio ponte H con integrato L293B

Programmazione a blocchi. Algobuild Prof. Sergio Roselli

Introduzione teorica al microcontrollore Arduino UNO

Corso Arduino Maggio Riccardo Binetti Lezione 1 - Blinking LEDs with style

Circuiti antirimbalzo

Controllo di una soglia analogica

7^ parte : Acquisizione della temperatura con LM35 e visualizzazione su display LCD. Author: Ing. Sebastiano Giannitto (ITIS M.

DISPOSITIVO PER LA LETTURA DI UN ENCODER INCREMENTALE

Lezione 6 su Arduino: I sensori di presenza PIR

PROGRAMMA DI SCIENZE E TECNOLOGIE APPLICATE 2015/2016 Classe 2ª Sez. C Tecnologico

Esercizi su Python. 14 maggio Scrivere una procedura che generi una stringa di 100 interi casuali tra 1 e 1000 e che:

Per scrivere una procedura che non deve restituire nessun valore e deve solo contenere le informazioni per le modalità delle porte e controlli

Per controllare un motore DC (funzionante in corrente continua) con Arduino, devi utilizzare il circuito integrato Ponte H (nel mio caso un L293NE

Corso di BASCOM (Capitolo 1 5 ) Corso Teorico/Pratico di programmazione in BASCOM Autore: DAMINO Salvatore. D I S P L A Y L C D (3).

MANUALE UTENTE IMPOSTAZIONE ORA

11^ parte : Come gestire i servomotori con Arduino. Author: Ing. Sebastiano Giannitto (ITIS M.BARTOLO PACHINO)

9^ parte : Come pilotare motori dc utilizzando il motor shield. Author: Ing. Sebastiano Giannitto (ITIS M.BARTOLO PACHINO)

Piattaforma Arduino/microcontrollori Atmel. Ing. Cozzolino Francesco.

5^ parte : Controllare un LED RGB con 3 potenziometri. Author: Ing. Sebastiano Giannitto (ITIS M.BARTOLO PACHINO)

Programma di simulazione per Arduino

pr- controllo accessi via RFID, password e registrazione su SD Access control via rfid, password and datalog (notes at section end)

byte Fase1 = 5; byte Fase2 = 6; byte Fase3 = 7; byte Fase4 = 8; int Ritardo = 15 ; puntatore! // sono equivalenti le sintassi:

HP LED Driver Shield. EtherMania di Signorini Marco Via Cadore MALNATE (VA) P.I REA VA

Programma di Robotica[LEGO EV3]

L abc di Arduino. Rocco Pelosi, Gianluca Palù, Davide Lodi Rizzini 24 febbraio 2016

Termometro digitale. Ivancich Stefano

Relazione finale del progetto Arduino - NIMT

ZAKINPROGRESS COMPONENTI

I SENSORI DI PROSSIMITA

Configurazione di Visualino 01. Collegate la scheda Arduino alla porta USB del computer

============================================================================

Implementazione dell albero binario in linguaggio C++

I.T.T.S. "Cerulli" GIULIANOVA -TE- Laboratorio di Robotica Educativa Tutorial Robot in... 5 minuti!

// Controllo remoto 05/05/2012 // poichè sono ancora ai primi passi ho usato // a larghe mani idee e listati di altri. Ringrazio tutti loro.

Genere DATA Generalità Note Distribuzione

Tutorial Display LCD e PIC

Arduino Tutorial #7 - Nunchuk materiale utilizzato Arduino, cavi elettrici, breadboard, nunchuk, 3 led.

CORSO ARDUINO. Giulio Fieramosca Stefano Panichi. Corsi GOLEM 2014

Arduino. Led, pulsanti, PWM, tastierino, display sette segmenti, display LCD

Metronomo. Realizzato da Andrea Corda

Bytronic s.r.l. via Como, Cairate (VA) Tel. 0331/ Fax. 0331/ Partita IVA SCHEDA TECNICA BY5165T

ELECTRONICS LAB [WITH ARDUINO]

Progetto di Domotica

SMD103 Stepping Motor Drive MANUALE D USO

Introduzione a Arduino

Sviluppo di un sistema di controllo per un plotter tramite un dispositivo FPGA

4. I moduli in Access 2000/2003

SENSORI OTTICI - FOTORESISTENZE

Arduino Uno INTRODUZIONE CONOSCENZE NECESSARIE

Robot Beginner Kit 4WD

N.B: Clicca qui per scaricare il file.zip con tutti gli sketch utilizzati per realizzare la faccia robotica.

Telecontrollo escavatore LEGO con board Arduino

MANUALE ISTRUZIONI PER UNA CORRETTA INSTALLAZIONE DEI MOTORI TUBOLARI ELETTRONICI

Radar con Arduino. da Emanuele Lovera - Blogger

Introduzione 2. Serie P20 4. Serie P28 6. Serie P35 8. Serie P Serie P Serie P Serie P Serie P85 18.

Marcia e Arresto di un Motore elettrico

Транскрипт:

E labirinto cronaca di un fallimento Non tutte le ciambelle riescono con il buco e questa e la relazione di un fallimento, poiche il risultato finale non e stato raggiunto. Ma il prototipo funziona correttamente ed oltretutto e piuttosto interessante, per cui e stata comunque pubblicata questa scheda. L idea e quella di utilizzare Arduino per pilotare una pallina di ferro in un labirinto di legno. Uno di quei giochi vintage che ormai e anche difficile trovare. Prima della fase di pilotaggio bisogna individuare le mosse da compiere per portare la pallina alla meta e, per ogni mossa, la corretta inclinazione dei due piani (alto / basso e destra / sinistra). E stato quindi predisposto l impianto rappresentato in foto, la cui costruzione e stata resa laboriosa dalla preparazione del piano e dei supporti per i componenti e dalla produzione di due manicotti in metallo (con relativi grani di fissaggio), in grado di collegare gli alberi di due motori (originariamente si era pensato di utilizzare dei servomotori) con gli alberi delle manopole del labirinto. Per vincere l inerzia della pallina ed evitare quindi che si muova solo quando i piani sono troppo inclinati e di fatto prenda poi una velocita tale da renderla ingovernabile, si e pensato di aggiungere un sistema di shock meccanico, e cioe una piccola massa, che battendo sulla cassa del labirinto, provoca un microterremoto e, almeno nelle intenzioni, vince l inerzia iniziale mettendo in moto la pallina. L esperimento non e riuscito poiche, nonostante l estrema attenzione posta nell inclinare i piani (un grado per volta, spesso seguiti dalla massa di shock), la pallina, una volta in moto, prende velocita e, per via della sua massa, risulta pressoche impossibile arrestarla prima delle buche disseminate lungo il percorso. Operativamente il sistema consente, in fase iniziale di manovrare i motori per portare, a poco a poco in bolla i piani del labirinto dopodiche' si ferma in attesa che venga premuto il pulsante di shock. Una volta premuto il pulsante, il sistema azzera i contatori di passi ed inizia ad eseguire e ad evidenziare sul display i movimenti dei motori richiesti tramite i quattro pulsanti che comandano: - la scelta della manopola (alto/basso oppure sinistra/destra) - aumento dei gradi di inclinazione - diminuzione dei gradi di inclinazione - effetto shock Il pulsante di scelta della manopola funziona in flip/flop: ogni volta che viene premuto rende operativa la manopola al momento non attiva. I led segnalano la manopola attiva: il led verde segnala alto/ basso mentre quello giallo segnala destra/sinistra

Nota: Questo prototipo e questa nota sono parte di una serie che vede protagonisti arduino ed alcuni dei componenti ad esso collegabili. Per la maggior parte degli esercizi e anche disponibile un filmato su youtube. Esercizi facenti parte della raccolta Filmati presenti su youtube Informazioni su arduino e sui componenti collegabili (PDF scaricato nell area di download) Breve manuale di programmazione (PDF scaricato nell area di download) Per eventuali chiarimenti o suggerimenti sul contenuto di questa scheda scrivere a giocarduino@libero.it Materiali Oltre ai manicotti, ai piani ed ai supporti per il fissaggio dei componenti sono necessari: due motori passo passo con relativi driver un servo sg90 quattro pulsanti quattro resistenze da 10 k ohm un led giallo un led verde due resistenze da 220 ohm Schema

Programma /* questo programma pilota le manopole di un labirinto di legno. Si tratta di un programma di tuning, utilizzato per costruire, passo per passo, la tabella che sara' poi utilizzata dal programma che pilotera la pallina. Il circuito e' formato da due motori passo passo che manovrano le manopole, un servo che manovra la massa di shock (una massa che, su comando, batte sulla cassa del labirinto per provocare un leggero tilt per "innescare" il movimento della pallina), un display lcd, quattro pulsanti e due led. Operativamente il sistema consente, in fase iniziale di manovare i motori passo passo per portare, a poco a poco in bolla i piani del labirinto, dopodiche' si ferma in attesa che venga premuto il pulsante di shock. Una volta premuto il pulsante di shock, il sistema azzera i contatori di passi ed inizia ad eseguire e ad evidenziare sul display i movimenti dei motori richiesti tramite i quattro pulsanti che comandano: - la scelta della manopola (alto/basso oppure sinistra/destra) - aumento dei gradi di inclinazione - diminuzione dei gradi di inclinazione - effetto shock Il pulsante di scelta della manopola funziona in flip/flop, ogni volta che viene premuto rende operativa la manopola al momento non attiva. I led segnalano la manopola attiva. Il led verde segnala alto/ basso mentre il led giallo destra/sinistra E' in questo modo possibile individuare per ogni tratto del labirinto, la giusta inclinazione dei piani e registrala su di un foglio per poi riportarla nella tabella del programma che pilotera' la pallina dall'inizio alla fine */ #include <Wire.h> // libreria wire presente, di fault, nell'ide #include <LiquidCrystal_I2C.h> // libreria di gestione del display lcd a due porte // nota: i terminali SDA e SCL del display devono essere collegati, rispettivamente, alle porte // analogiche 4 e 5 //--------------------addr, en,rw,rs,d4,d5,d6,d7,bl,blpol LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // definisce la tipologia del display #include <Servo.h> // richiama la libreria di gestione dei servomotori Servo shock ; // crea il servo oggetto shock da utilizzare per manovrare la massa di shock. // nota: in un programma possono essere create, al massimo otto servo oggetti #include <Stepper.h> // richiama la libreria di gestione dei motori passo passo Stepper sxdx(32, 13, 11, 12, 10); // numero di impulsi per un giro dell'albero motore (32) // ed elenco delle porte di sxdx, in sequenza di attivazione /* nota: Le porte 13, 12, 11 e 10 di Arduino sono collegate, rispettivamente, ai pin In1, In2, In3 ed In4 del driver sxdx, ma la sequenza di attivazione deve essere In1, In3, In2 ed In4 per cui la dichiarazione delle porte e' 13, 11, 12, e 10 */ Stepper altobasso (32, 14, 16, 15, 17); // numero di impulsi per un giro dell'albero motore (32) // ed elenco delle porte altobasso, in sequenza di attivazione /* nota: le porte 14, 15, 16 e 17 di Arduino (le porte analogiche da A0 ad A3) sono collegate, rispettivamente, ai pin In1, In2, In3 ed In4 del driver altobasso, ma la sequenza di attivazione deve essere In1, In3, In2 ed In4 per cui la dichiarazione delle porte e' 14, 16, 15, e 17 */ ****************** definizione delle costanti ************************* // int batti = 3; // il pulsante di selezione dello shock e' collegato alla porta 3 int giu = 4; // il pulsante di diminuzione dei gradi e' collegato alla porta 4 int su = 5; // il pulsante di aumento dei gradi e' collegato alla porta 5 int manopola = 6; // il pulsante di selezione della manopola (dx sx oppure alto basso) // e' collegato alla porta 6 int ledverde = 9; // il led verde e' collegato alla porta 9 int ledgiallo = 8; // il led giallo e' collegato alla porta 8 **************definzione delle variabili **************************** int statobatti = 0; // variabile in cui viene inserito lo stato del pulsante batti int statogiu = 0; // variabile in cui viene inserito lo stato del pulsante giu int statosu = 0; // variabile in cui viene inserito lo stato del pulsante su int statomanopola = 0; // variabile in cui viene memorizzata la manopola su cui si sta // operando: 1 = sxdx, 2 = altobasso int acquisiscimanopola = 0; // variabile in cui viene inserito lo stato del pulsante manopola int impulsisxdx = 0; // variabile in cui viene inserito il numero di impulsi per il motore sxdx int impulsialtobasso = 0; // variabile in cui viene inserito il numero di impulsi per il // motore altobasso int totimpulsisxdx = 0; // variabile in cui viene inserito il numero totale di impulsi per il // motore sxdx

int totimpulsialtobasso = 0; // variabile in cui viene inserito il numero totale di impulsi per il // motore altobasso int gradishock = 90; // variabile in cui viene inserita l'angolazione di shock int switchprimavolta = 0;// semaforo per separare la fase di equilibratura dalla fase di // gestione delle angolazioni ******************* routine di pulizia del display ************************ void puliscischermo (void) lcd.clear (); ******************** routine di azionamento dei motori ************************ void posizionaservo (void) altobasso.step(impulsialtobasso*4); delay (50); impulsialtobasso = 0; sxdx.step (impulsisxdx*4); delay (50); impulsisxdx = 0; if (gradishock!= 90) shock.write (0); shock.write (160); shock.write (0); gradishock = 90; delay (100); * ************************* routine di gestione delle manopole ***************************** void gestionemanopole (void) // **** individua la manopola sulla quale agire (usa un pulsante in flip/flop)***** acquisiscimanopola = digitalread (manopola); // aquisisce il segnale di settaggio della manopola if (acquisiscimanopola == 1) if(statomanopola == 1) // se il precedente statomanopola era 1 (sxdx) statomanopola = 2; // posiziona manopola su altobasso digitalwrite (ledgiallo, HIGH); // accende il led giallo (opera su manopola altobasso) digitalwrite (ledverde, LOW); else // se invece il precedente statomanopola era 2 (altobasso) statomanopola = 1; // posiziona manopola su dxsx digitalwrite (ledverde, HIGH); // accende il led verde (opera su manopola dxsx) digitalwrite (ledgiallo,low); // ******** diminuzione dei gradi di inclinazione ********* statogiu = digitalread (giu); // acquisisce lo stato del pulsante giu if (statogiu == 1) // se e' stato premuto il pulsante giu if (statomanopola == 1) impulsisxdx = -1; totimpulsisxdx--; if (statomanopola == 2) impulsialtobasso = -1; totimpulsialtobasso--; // ********* aumento dei gradi di inclinazione ************ statosu = digitalread (su); // acquisisce lo stato del pulsante su if (statosu == 1) // se e' stato premuto il pulsante su if (statomanopola == 1)

impulsisxdx = 1; totimpulsisxdx++; if (statomanopola == 2) impulsialtobasso = 1; totimpulsialtobasso++; // ******** posizionamento del sistema di shock ********* statobatti = digitalread (batti); // acquisisce lo stato del pulsante batti if (statobatti == 1) // se e' stato premuto il pulsante batti gradishock = 160; // predispone il movimento del meccanismo di shock ********************* routine di visualizzazione impulsi ************************ void visualizzaimpulsi (void) lcd.setcursor(0,0); // posiziona il cursore all'inizio della prima riga lcd.print ("sxdx = "); lcd.print (totimpulsisxdx); lcd.print (" "); lcd.setcursor(0,1); // posiziona il cursore all'inizio della seconda riga lcd.print ("altobasso = "); lcd.print (totimpulsialtobasso); lcd.print (" "); void setup() lcd.begin(16,2); // inizializza il display (16 caratteri per due righe) sxdx.setspeed(100); // imposta una media velocita' di rotazione dell'albero altobasso.setspeed(100); // dei due motori passo passo: 100 impulsi al secondo, pari a // 3,125 giri al secondo dell albero motore e ad una rotazione di 17,5 gradi al secondo // del perno in uscita shock.attach(2); // assegna il servo oggetto shock alla porta 2 pinmode (batti, INPUT); // definisce il pulsante batti come unita' di input pinmode (giu, INPUT); // definisce il pulsante giu come unita' di input pinmode (su, INPUT); // definisce il pulsante su come unita' di input pinmode (manopola,input); // definisce il pulsante su come unita' di input pinmode (ledverde, OUTPUT); // definisce il led verde come unita' di output pinmode (ledgiallo, OUTPUT); // definisce il led giallo come unita' di output gradishock = 90; // pone il servo shock in posizione intermedia puliscischermo (); // lancia la routine di pulizia dello schermo lcd.setcursor(0,0); // posiziona il cursore all'inizio della prima riga lcd.print ("metti in piano"); lcd.setcursor(0,1); // posiziona il cursore all'inizio della seconda riga lcd.print("e premi shock "); while (switchprimavolta == 0)// loop di messa in piano del labirinto gestionemanopole(); //lancia la routine di gestione delle manopole if ((impulsisxdx!= 0) (impulsialtobasso!= 0)) // verifica se c'e qualcosa da fare posizionaservo (); // se e' cambiata qualche impostazione aziona i motori if (statobatti == HIGH) // se si desidera uscire dal ciclo switchprimavolta = 1; // setta lo switchprimavolta in modo da non ripetere piu' il ciclo statobatti = 0; // rimette a zero il valore del pulsante batti gradishock = 90; // ripristina il valore standard del braccio del servomotore totimpulsialtobasso = 0; // azzera il registroaltobasso totimpulsisxdx = 0; // azzera il registro sxdx puliscischermo (); void loop() gestionemanopole(); //lancia la routine di gestione delle manopole if ((impulsisxdx!= 0) (impulsialtobasso!= 0) (gradishock!= 90)) // verifica se e // cambiato qualcosa posizionaservo (); // se e' cambiata qualche impostazione aziona i motori visualizzaimpulsi ();