Robot Beginner Kit fotoresistenze

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 )

beginner robot kit fotoresistenze

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.

robot beginner kit fotoresistenze

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.

beginner fotoresistenze posizione

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:

robot beginner kit fotoresistenze schema

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

Permanent link to this article: https://www.mauroalfieri.it/elettronica/robot-beginner-kit-fotoresistenze.html

Lascia un commento

Your email address will not be published.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.