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)

Cortesemente, prima di inserire i commenti leggi il regolamento

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

8 comments

Skip to comment form

    • Angelo on 2 agosto 2015 at 18:15
    • Reply

    ciao Mauro
    forse la domanda risulta banale ma non capisco un passaggio : i motori del robot non dovrebbero essere collegati ala scheda arduino ?

    1. Ciao Angelo,
      arduino é in grado di erogare solo una corrente parziale per ciascun pin, non sufficiente al controllo dei motori, ecco perché l’uso dei driver motori o ponte-H é consigliato quanto indispensabile.

    • Giovanni on 10 dicembre 2016 at 15:46
    • Reply

    Ciao… Innanzitutto complimenti per il progetto! E’ da un po che cercavo qualcosa da portare come progetto alla maturità di quest’anno! 😉
    Volevo chiederti se volessi avere informazioni più dettagliate di come hai costruito l’inseguitore, dove potrei trovarli?
    PS: con “informazioni più dettagliate” intendo ad esempio: la lista completa dei materiali, lo sketch…..ecc

    1. Ciao Giovanni,
      su questo blog trovi tutte le info che ti potrebbero occorrere sul progetto, quello che non è decritto è lasciato come esercizio alla tua manualità e capacità

    • Federico on 24 maggio 2017 at 19:23
    • Reply

    Ciao Mauro,
    Vorrei sapere come devo collegare arduino con i due motorini compresi nel beginner kit. Grazie anticipatamente.

    1. Ciao Federico,
      se cerchi nel blog “beginner kit” trovi le istruzioni passo dopo passo, trovi anche un PDF con tutte le istruzioni sul sito del produttore.

    • Federico on 9 giugno 2017 at 15:28
    • Reply

    Ciao mauro, sto provando a realizzare questo inseguitore di luce con 3 fotoresistenze, molto interessante! Purtroppo però non riesco a capire come siano i collegamenti da Arduino al motor driver. Ho provato a guardare anche da altri tutorial ma sono diversi da questo determinato progetto. Se tu potessi darmi una mano, magari anche con qualche foto più dettagliata sul resto del progetto, te ne sarei enormemente grato.

    1. Ciao Federico,
      trovi tutto il dettaglio del montaggio se segui i tutorial dedicati al Robot Beginner Kit in questo Blog.

Lascia un commento

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.