Il progetto Robot Beginner Kit fotoresistenze è l’evoluzione del progetto di Michele, allievo del corso base ed avanzato, che ha condiviso qualche settima fa ( leggi articolo )
Lascio la parola a Michele che ha descritto perfettamente il suo progetto:
Il progetto si è evoluto in un Robot Beginner Kit fotoresistenze che, oltre a ruotare a destra e a sinistra inseguendo la fonte luminosa, si può spostare anche in avanti o rimanere immobile se non c’è una fonte luminosa che colpisce direttamente le sue fotoresistenze.
Per realizzarlo, oltre al Robot Beginner Kit, sono state utilizzate 3 fotoresistenze, 2 potenziometri per regolare i parametri di risposta del robot e 2 diodi utili a conoscere i valori dei suddetti parametri.
Come funziona il Robot Beginner Kit fotoresistenze
Il principio di funzionamento è simile a quello dell’articolo precedente ma, per poter individuare la presenza di una sorgente luminosa diretta nella maggior parte delle condizioni di luce, i parametri di sensibilità (variabili soglia e varianza nello sketch) sono regolabili con 2 potenziometri.
La logica è la seguente:
individuati il valore massimo ed il valore minimo per le 3 fotoresistenze ed individuata la fotoresistenza su cui il valore massimo è stato letto, si calcola il rapporto (massimo-minimo)/minimo.
Se questo valore è superiore al valore della variabile varianza ed il massimo letto è maggiore del valore della variabile soglia, allora il robot gira o si sposta a seconda che il valore massimo sia letto sulla fotoresistenza centrale, destra o sinistra.
Se almeno una delle suddette condizioni è falsa, il robot resta fermo.
A cosa serve regolare il valore di soglia e varianza?
La soglia indica qual è l’intensità luminosa mimina che deve colpire una certa fotoresistenza perché si possa parlare di fonte luminosa diretta. Più l’ambiente è luminoso più deve essere alta.
La varianza indica quanto il valore massimo (luce che la colpisce) di una fotoresistenza è più grande di quello relativo alla fotoresistenza più in ombra. Più l’ambiente è buio più deve essere alto perché i valori letti dalle fotoresistenze saranno bassi quindi le differenze tra massimo e mino alte e quindi da filtrare.
Puoi abbassare questo valore in caso di luce diffusa mentre va alzato in caso di luce localizzata.
Il collegamento elettrico
Il collegamento elettrico è il seguente:
Lo sketch del Robot
#define PWMA 5 #define PWMB 6 #define AIN1 1 #define AIN2 2 #define BIN1 8 #define BIN2 9 #define STBY 0 int pinSx = A5; // Pin fotoresistenza sinistra int pinC=A4; // Pin fotoresistenza centrale int pinDx= A3; // Pin fotoresistenza destra int Dx,C,Sx; // Valori letti dalle fotoresistenze int vel = 75; // velocità di rotazione e avanzamento int soglia,varianza; // parametri per filtrare le interferenze luminose esterne int minimo(int x, int y, int z); int massimo(int x, int y, int z); void setup() { pinMode( STBY, OUTPUT ); pinMode( PWMA, OUTPUT ); pinMode( PWMB, OUTPUT ); pinMode( AIN1, OUTPUT ); pinMode( AIN2, OUTPUT ); pinMode( BIN1, OUTPUT ); pinMode( BIN2, OUTPUT ); pinMode( pinSx, INPUT ); pinMode( pinC, INPUT ); pinMode( pinDx, INPUT ); digitalWrite( STBY, HIGH ); pinMode(10,OUTPUT); // pin del led che segnala aumento del parametro pinMode(11,OUTPUT); // pin del led che segnala diminuzione del parametro analogWrite( PWMA, vel ); analogWrite( PWMB, vel ); varianza = map(analogRead(A0),0,1023,0,5); soglia=map(analogRead(A1),0,1023,0,10); } void loop() { float delta; int minvalue,maxvalue,varianza2,soglia2; Sx = analogRead(pinSx); C=analogRead(pinC); Dx=analogRead(pinDx); soglia2=map(analogRead(A1),0,1023,0,10); varianza2 = map(analogRead(A0),0,1023,0,5); if (varianza2>varianza) { digitalWrite(10,HIGH); delay(100); digitalWrite(10,LOW); varianza = varianza2; } if (varianza2<varianza) { digitalWrite(11,HIGH); delay(100); digitalWrite(11,LOW); varianza = varianza2; } if (soglia2>soglia) { digitalWrite(10,HIGH); delay(100); digitalWrite(10,LOW); soglia = soglia2; } if (soglia2<soglia) { digitalWrite(11,HIGH); delay(100); digitalWrite(11,LOW); soglia = soglia2; } minvalue= minimo(Sx,C,Dx); maxvalue= massimo(Sx,C,Dx); if (minvalue>0) delta = (maxvalue-minvalue)/minvalue; else delta = maxvalue; if (delta > varianza) { if (maxvalue==Sx && Sx > (soglia*75)) { girasx(); } if (maxvalue==Dx && Dx > (soglia*75)) { giradx(); } if (maxvalue==C && C > (soglia*75)) { avanti(); } } else alt(); delay (30); } void avanti() { digitalWrite( AIN1, LOW ); digitalWrite( AIN2, HIGH ); digitalWrite( BIN1, LOW ); digitalWrite( BIN2, HIGH ); } void alt() { digitalWrite( AIN1, LOW ); digitalWrite( AIN2, LOW ); digitalWrite( BIN1, LOW ); digitalWrite( BIN2, LOW ); } void giradx() { digitalWrite( AIN1, HIGH ); digitalWrite( AIN2, LOW ); digitalWrite( BIN1, LOW ); digitalWrite( BIN2, HIGH ); } void girasx() { digitalWrite( AIN1, LOW ); digitalWrite( AIN2, HIGH ); digitalWrite( BIN1, HIGH ); digitalWrite( BIN2, LOW ); } int minimo(int x, int y, int z) { if (x <= y && x <=z) return x; else if (y<=z) return y; else return z; } int massimo(int x, int y, int z) { if (x >= y && x >=z) return x; else if (y>=z) return y; else return z; }
Ti spiego lo sketch illustrando le differenze con il precedente articolo:
Linee 8-13: definiscono le variabili:
- pinSx, pinC e pinDx pin a cui sono collegate le 3 fotoresistenze
- Dx, C e Sx variabili che ospiteranno i valori letti dalle fotoresistenze
- Vel contiene il valore della velocità di rotazione dei motori
- Soglia: valore minimo letto dalla fotoresistenza con valore massimo per considerarla investita dalla fonte luminosa
- Varianza: valore minimo del rapporto (max-min)/min per decidere che una delle fotorestenze è investita da una fonte luminosa
linee 15 e 16: definiscono 2 funzioni custom per calcolare il minimo ed il massimo di 3 valori;
linee 20-32: per ciascun pin definito imposta la modalità di INPUT o OUTPUT di funzionamento;
linee 33 e 34: impostano la velocità di rotazione dei motori;
linee 35 e 36: impostano i valori iniziali di varianza e soglia leggendo i potenziometri. Soglia può variare tra 0 e 10, varianza tra 0 e 5;
linee 41 e 42: definiscono le variabili utilizzate all’interno del loop;
linee 43-45 leggono i valori delle fotoresistenze;
linee46 e 47 leggono i valori dei potenziometri e li valorizzano in 2 variabili temporanee per individuare le variazioni;
linee 48-54: controllano se il valore temporaneo di varianza è maggiore del precedente valore. Se è maggiore accende per 100 ms il led collegato al pin 10 (led rosso) e cambia il valore di varianza;
linee 55-61: controllano se il valore temporaneo di varianza è minore del precedente valore. Se è minore accende per 100 ms il led collegato al pin 10 (led blu) e cambia il valore di varianza;
linee da 48 a 61 servono per poter sapere, in ogni istante, a quanto è impostato il parametro varianza.
linee 62-75: come per le linee 28-61 ma sul parametro soglia;
linee 76 e 77: calcolano i valori minimo e massimo letti sulle fotoresistenze;
linee 78 e 79: calcolano il valore della varianza dei valori letti. L’if si rende necessario per evitare divisioni per 0 nel caso in cui il minimo sia 0 (fotoresistenza al buio);
linee 80-95: confrontano i valori letti e la varianza con i parametri varianza e soglia *75 e determinano quale sia la fotoresistenza con il valore massimo ed eseguono il movimento. In particolare: se la varianza non è maggiore del valore del parametro varianza passa all’else della riga 95 e ferma i motori. Se invece la varianza è maggiore prende il valore letto sulla fotoresistenza sinistra e lo compara col valore massimo se questi coincidono (massimo sulla fotoresistenza sinistra) e il valore è maggiore del parametro soglia, allora fa ruotare il robota a sinistra (linee da 82 a 85).
Gli stessi confronti vengono fatti sulla fotoresistenza destra e frontale nelle righe 86-89 e 90-93;
linea 96: attendi 30 ms prima di ricomnciare il ciclo.
linee 99-128: funzioni per controllare il movimento dei motori
linee 130-135: funzione custom che restituisce il valore minimo di 3 valori letti in ingresso. Confronta il primo con il secondo ed il terzo. Se è <= di entrambi restituisce questo altrimenti se il secondo è <= del terzo restituisce il secondo altrimenti restituisce il terzo.
linee 137-142: funzione custom che restituisce il valore massimo. Analoga a quella che restituisce il minimo.
Il video del robot beginner kit
Il video mostra il robot in azione.
Inizialmente i valori di soglia e varianza sono impostati a zero e si vede come il robot sia in balia delle sorgenti luminose ambientali.
In un secondo tempo vengono settati dei valori adeguati per l’ambiente in cui si trova (2 e 2 cioè il massimo deve essere almeno il doppio del minimo e il valore letto sulla fotoresistenza almeno 150 (2*75)) ed il robot si muove in maniera corretta seguendo la fonte luminosa.
Alla fine i valori di soglia e varianza sono impostati al massimo (10 e 5) ed il robot, sebbene sollecitato, non si muove perché si rende necessario un valore massimo pari ad almeno 5 volte il valore minimo e un valore massimo pari almeno a 750 (10*75) (con le luci utilizzate nel video il valore massimo letto sulle fotoresistenze è intorno a 400)
Prima di inserire un commento, per favore, leggi il regolamento
8 pings
Skip to comment form