Vai al contenuto
PLC Forum


Inseguitore di linea con Arduino


Ale_S

Messaggi consigliati

Ciao a tutti, apro questa discussione dopo aver commesso l'errore di essermi accodato alla discussione "Inseguitore di linea" iniziata da fioresara. Mi scuso per non aver letto attentamente il regolamento.

 

Vorrei realizzare il mio primo robot con Arduino: un inseguitore di linea, ma purtroppo sono un principiante. Ho acquistato la scheda  Pololu qtr-8rc  che presenta 8 sensori di linea perchè, navigando in rete, ho visto che è indicata per questo tipo di robot ed ora vorrei provarla.

Ho alimentato la scheda tramite 5V di Arduino e ho collegato l'uscita di un sensore ad un ingresso digitale di Arduino; ho poi scritto un programma che stampa su monitor seriale l'uscita del sensore. Per il momento non ho utilizzato la libreria per Arduino che viene fornita da Pololu. Il problema è che posizionando il sensore sopra un oggetto nero, il suo stato non cambia; forse perché devo per forza utilizzare la libreria? Sicuramente sto sbagliando qualcosa…

Grazie per l’aiuto.

Link al commento
Condividi su altri siti


Perchè non scrivi la sigla del dispositivo e, magari, non ci dai un link dove si possono leggere le sue specifiche?

Link al commento
Condividi su altri siti

Da una prima lettura veloce dl datasheet dovrebbe funzionare snza problemi, basta alimentare a 5V, assicurarsi prima che non ci sia il cavallotto per i 3.3V.

 

Poi prendi un foglio di carta bianco, disegini una linea nera abbastanza larga (2mm-4mm).

Posizioni  l'emettitore della coppia che vuoi testare sul bianco tenendo il foglio a 3 mm circa dalla basetta. Dovresti leggere una tensione prossima a 0V (0.4V circa).

Poi facendo scorrere il sensore vrso la zona nera dovresti leggere una tensione che cresce, man mano che si intercetta il nero; quando lìemettotore è completamente su nero la tensione saà prossima a 5V

Link al commento
Condividi su altri siti

Grazie Livio per la dritta.

Ho fatto la prova che mi hai consigliato (con un multimetro), ma la tensione non varia tra oggetto bianco e oggetto nero. Allora ho riletto meglio il datasheet e, stando a quello che ho capito, la scheda che fornisce una determinata tensione all'uscita di ogni sensore, in base al colore dell'oggetto riconosciuto, è il qtr-8A. La lettura del qtr-8RC è differente. Ho poi scaricato la libreria fornita da Pololu e mi sono accorto che c'è un programma già pronto che visualizza a monitor l'uscita di ogni sensore, dopo aver calibrato tutti i sensori attivi. Sembra che la scheda funzioni a dovere: dopo averla calibrata (come spiegato nel programma), se in uscita si ha un valore pari a 1000 significa che il sensore è sopra un oggetto nero (ho usato come oggetto un pennarello nero che passavo su ogni sensore). Questo se i sensori sono rivolti verso l'alto. Se rivolgo i sensori verso il pavimento, come poi dovranno essere, i valori dati dai sensori non sono più affidabili, penso sia dovuto alla luce. Ho provato anche a tracciare una linea nera su un foglio bianco e, anche in questa situazione, i valori non sono affidabili e non capisco il motivo. Riassumendo, la situazione "migliore" consiste nel fare riconoscere ai sensori il pennarello nero. 

 

Questo è il programma che ho utlilizzato, fortunatamente ci sono tanti commenti, spero non ci siano problemi ad inviare un messaggio così lungo.

 

#include <QTRSensors.h>

// This example is designed for use with eight QTR-1RC sensors or the eight sensors of a
// QTR-8RC module.  These reflectance sensors should be connected to digital inputs 3 to 10.
// The QTR-8RC's emitter control pin (LEDON) can optionally be connected to digital pin 2, 
// or you can leave it disconnected and change the EMITTER_PIN #define below from 2 to 
// QTR_NO_EMITTER_PIN.

// The setup phase of this example calibrates the sensor for ten seconds and turns on
// the LED built in to the Arduino on pin 13 while calibration is going on.
// During this phase, you should expose each reflectance sensor to the lightest and 
// darkest readings they will encounter.
// For example, if you are making a line follower, you should slide the sensors across the
// line during the calibration phase so that each sensor can get a reading of how dark the
// line is and how light the ground is.  Improper calibration will result in poor readings.
// If you want to skip the calibration phase, you can get the raw sensor readings
// (pulse times from 0 to 2500 us) by calling qtrrc.read(sensorValues) instead of
// qtrrc.readLine(sensorValues).

// The main loop of the example reads the calibrated sensor values and uses them to
// estimate the position of a line.  You can test this by taping a piece of 3/4" black
// electrical tape to a piece of white paper and sliding the sensor across it.  It
// prints the sensor values to the serial monitor as numbers from 0 (maximum reflectance) 
// to 1000 (minimum reflectance) followed by the estimated location of the line as a number
// from 0 to 5000.  1000 means the line is directly under sensor 1, 2000 means directly
// under sensor 2, etc.  0 means the line is directly under sensor 0 or was last seen by
// sensor 0 before being lost.  5000 means the line is directly under sensor 5 or was
// last seen by sensor 5 before being lost.


#define NUM_SENSORS   8     // number of sensors used
#define TIMEOUT       2500  // waits for 2500 microseconds for sensor outputs to go low
#define EMITTER_PIN   2     // emitter is controlled by digital pin 2

// sensors 0 through 7 are connected to digital pins 3 through 10, respectively
QTRSensorsRC qtrrc((unsigned char[]) {3, 4, 5, 6, 7, 8, 9, 10},
  NUM_SENSORS, TIMEOUT, EMITTER_PIN); 
unsigned int sensorValues[NUM_SENSORS];


void setup()
{
  delay(500);
  pinMode(13, OUTPUT);
  digitalWrite(13, HIGH);    // turn on Arduino's LED to indicate we are in calibration mode
  for (int i = 0; i < 400; i++)  // make the calibration take about 10 seconds
  {
    qtrrc.calibrate();       // reads all sensors 10 times at 2500 us per read (i.e. ~25 ms per call)
  }
  digitalWrite(13, LOW);     // turn off Arduino's LED to indicate we are through with calibration

  // print the calibration minimum values measured when emitters were on
  Serial.begin(9600);
  for (int i = 0; i < NUM_SENSORS; i++)
  {
    Serial.print(qtrrc.calibratedMinimumOn);
    Serial.print(' ');
  }
  Serial.println();
  
  // print the calibration maximum values measured when emitters were on
  for (int i = 0; i < NUM_SENSORS; i++)
  {
    Serial.print(qtrrc.calibratedMaximumOn);
    Serial.print(' ');
  }
  Serial.println();
  Serial.println();
  delay(1000);
}


void loop()
{
  // read calibrated sensor values and obtain a measure of the line position from 0 to 5000
  // To get raw sensor values, call:
  //  qtrrc.read(sensorValues); instead of unsigned int position = qtrrc.readLine(sensorValues);
  unsigned int position = qtrrc.readLine(sensorValues);

  // print the sensor values as numbers from 0 to 1000, where 0 means maximum reflectance and
  // 1000 means minimum reflectance, followed by the line position
  for (unsigned char i = 0; i < NUM_SENSORS; i++)
  {
    Serial.print(sensorValues);
    Serial.print('\t');
  }
  //Serial.println(); // uncomment this line if you are using raw values
  Serial.println(position); // comment this line out if you are using raw values
  
  delay(250);
}

 

Link al commento
Condividi su altri siti

Non credo sia un problema di programma, penso sia un problema di luce riflessa.

Sono reminiscenza di un lavoro che feci quasi 50 anni fa: la lettura delle etichette dei codici a barre.

Tutto dipende dall'emettitore, ovvero dal suo angolo di emissione. Se l'angolo è ampio ec'è sufficiente distanza tra il sensore e gli oggetti, il riflesso di fondo è sufficiente a far scattare il ricevitore.

Se non ricordo male la specifica parla di 3 mm come distanza massima tra sensore i oggetto, proprio per evitare che eventuali riflessioni rendano difficoltoso la rilevazione del nero.

 

Se riesco faccio qualche prova con dei sensori simili, ma mono canali.

Link al commento
Condividi su altri siti

Ho fatto alcune prove con i sensori di cui dispongo.

Ne ho un tipo frontale ed uno verticale come il tuo, solo che il mio è singolo ed ha 2 tipi di uscita: quello proporzionale e quello on-off.

Il problema è la larghezza della riga nera e la distanza tra sensore e bersaglio.

Quello che ho io lavora bene attorno ai 5mm di distanza, però la linea nera deve essere abbastanza larga; >5mm.

Ho fatto delle prove molto veloci, magari nei prossimi giorni se ho tempo e voglia ne farò altre.

Non ho nemmeno dovuto usare arduino, basta un alimentatore da 5V ed il tester.

Link al commento
Condividi su altri siti

L'array  QTR-8RC ha il collettore dei fototransistori collegato con un condensatore all'alimentazione ed un resistore all'uscita che va collegata ad Arduino.

Per poter leggere la quantità di luce riflessa bisogna impostare il piedino di Arduino come uscita a livello alto per circa 10 usec quindi reimpostare il piedino come ingresso e calcolare il tempo di scarica del condensatore, come descritto meglio sul sito Pololu. L'altro tipo di array ha invece una uscita analogica che varia con la luce riflessa.

 

Ciao.

Link al commento
Condividi su altri siti

Quote

Per poter leggere la quantità di luce riflessa bisogna impostare il piedino di Arduino come uscita a livello alto per circa 10 usec quindi reimpostare il piedino come ingresso e calcolare il tempo di scarica del condensatore, ....

 

Perbacco! Un vero UCAS.:)

Link al commento
Condividi su altri siti

  • 2 weeks later...
  • 2 weeks later...

Grazie a tutti per l'interessamento; mi scuso se rispondo solo ora.

Mi sono cimentato nell'impresa ma ho deciso di cambiare progetto, data la gestione difficoltosa del sensore.

Link al commento
Condividi su altri siti

  • 2 weeks later...

era all'Iveco di Torino

Noi abbiamo piazzato 3 AGV con geolocalizzatore della Kolmorgen e diverse rulliere spettacolari 

Adesso sono a Salerno per un magazzino automatico a -25° ...entra l'elettrico e il meccanico pero , io rimango al fresco sui 15-16 ° e si mangia benissimo ;)

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...