Progetto autovelox

Salve, io ed i miei compagni di gruppo stiamo cercando di costruire un autovelox con dei diodi acquistati su ebay QEC112-QEC113 emettitore&ricevitore (10X LED 5mm INFRAROSSO EMETTITORE RICEVITORE 940 nM fotodiodo ricevente diodi | eBay) e con arduino, ovviamente.
Stiamo seguendo questo schema, però collegando sulla parte digital, invece di analog in.

Cosi.

E abbiamo usato questo codice su arduino.

int sens1=9; 
int sens2=8;

double spazio=0.010; // Inserire lo spazio tra i due ricevitori sulla scheda [m]
double tempo=0.0;
double velocita=0.0;
unsigned long t1=0.0;
unsigned long t2=0.0;


void setup()
{
  pinMode(sens1,INPUT); 
  pinMode(sens2,INPUT);
  Serial.begin(9600); 
  lcd.begin (16, 3);
  lcd.setCursor(0, 0);
  lcd.print ("VELOCITA': ");
}

void loop() {
 

  

  int Val1=digitalRead(sens1);
  int Val2=digitalRead(sens2);
  
  if(Val1==LOW)
  {
   t1=millis();
   
  }
  
  if(Val2==LOW){
        t2=millis(); 

        
  tempo=(t2-t1)*1000;  //la funzione millis() restituisce un tempo in millesimi di secondi, moltiplicando per 1000 ottengo i secondi
        velocita=(spazio/tempo)*3.6; //Velocità in km/h
        Serial.print(velocita);
        Serial.println(" km/h");
        getchar();
}
      
}

Problema: Quando faccio partire il monitor seriale, appena interrompo il fascio di luce fra i primi due diodi mi esce scritto "inf km/h".

E questo continua a ripetersi all'infinito; Ho provato ad usare un getchar(); per provare a non farlo andare all'infinito, ma niente.

Ciao,
essendo il tuo primo post, ti chiederei di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione) e di leggere con attenzione il REGOLAMENTO ... Grazie.

Guglielmo

Ci sono alcuni errori sia nello sketch che nello schema.

I ricevitori sono montati alla rovescia, cioè il resistore deve essere collegato a +5V e l'anodo del diodo a massa, mentre la loro congiunzione va collegata all'ingresso digitale.

Infatti il risultato è che l'ingresso è sempre a massa e quindi Val1 e Val2 sono sempre LOW.

Potresti anche solo invertire la logica nello sketch usando HIGH al posto di LOW.

Nello sketch hai indicato t1 e t2 come unsigned long, ma le hai inizializzate usando un float (0.0).

Lo spazio indicato è uguale ad 1cm (0.01) mentre dovrebbe essere 10cm (0.1).

Per avere misure più precise, dovresti usare i due external interrupt collegati ai pin 2 e 3.

getchar() su Arduino restituisce sempre EOF, per questo non fa fermare il loop.

Ci sono alcune cose ceh non capisco.

Nell'annuncio EBAY non leggo nessun modello di LED ma solo una descrizione generale e sbaglata.
Un LED non é un ricevitore Infrarosso. Un LEd é un emettitore di luce. Funziona se male anche come ricevitore ma come ricevitore IR mi aspetterei un fotodiodo o fototransistore.

La sigla QEC112-QEC113 da dove l' hai presa? sono comunque LED al infrarosso con un involucro trasparente non nero.

Da dove viene il "inf" che viene stampato sul terminale?

Ciao Uwe

cyberhs:
Potresti anche solo invertire la logica nello sketch usando HIGH al posto di LOW.

Nello sketch hai indicato t1 e t2 come unsigned long, ma le hai inizializzate usando un float (0.0).

Per avere misure più precise, dovresti usare i due external interrupt collegati ai pin 2 e 3.

Ho messo apposto i resistore sui +5V e collegato l'anodo del diodo a massa, quindi non serve sustituire LOW a HIGH (?)
Non ho capito... ho utilizzato le int... in che senso inizializzate usando un float (0.0)?
Pin 2 e 3? Quindi dovrei sostituire 8 e 9 in digital con i pin 2 e 3 in digital?

garro:
getchar() su Arduino restituisce sempre EOF, per questo non fa fermare il loop.

Quindi in questo sketch è inutile.

uwefed:
Ci sono alcune cose ceh non capisco.

Nell'annuncio EBAY non leggo nessun modello di LED ma solo una descrizione generale e sbaglata.
Un LED non é un ricevitore Infrarosso. Un LEd é un emettitore di luce. Funziona se male anche come ricevitore ma come ricevitore IR mi aspetterei un fotodiodo o fototransistore.

La sigla QEC112-QEC113 da dove l' hai presa? sono comunque LED al infrarosso con un involucro trasparente non nero.

Da dove viene il "inf" che viene stampato sul terminale?

Ciao Uwe

Ho trovato questo datasheet che rispecchiava i diodi acquistati ecco perchè QEC112-QEC113 ( Intelligent Power and Sensing Technologies | onsemi).
Quel "inf" non so assolutamente da dove provenga e il perche! :S

Insigne69:
Ho messo apposto i resistore sui +5V e collegato l'anodo del diodo a massa, quindi non serve sustituire LOW a HIGH (?)

Esatto. Le possibili soluzioni erano due: o cambiare l'elettronica o cambiare il software.

Insigne69:
Non ho capito... ho utilizzato le int... in che senso inizializzate usando un float (0.0)?

0.0 è un numero reale, non un intero. 0 è un numero intero. In pratica il fatto di aver messo il "." fa si che il compilatore lo veda come un float. Comunque persino il compilatore del C non fa tanti capricci per questa cosa, infatti il numero viene automaticamente troncato. Giusto per una maggiore chiarezza formale del codice direi che è meglio togliere la parte decimale

Insigne69:
Quindi in questo sketch è inutile.

Non ne sono sicuro ma credo che in generale con Arduino UNO sia abbastanza inutile la getchar come ogni altra funzione di i/o da file e per tutte le schede siano inutili le funzioni di i/o da console.

Ottimo, vedi qualche altro errore nello sketch? Che magari ho scritto anche giusto, ma serve per questo tipo di progetto?

//la funzione millis() restituisce un tempo in millesimi di secondi, moltiplicando per 1000 ottengo i secondi

Ovviamente questo è falso, per ottenere i secondi devi dividere per 1000ms/s (da una semplice analisi delle unità di misura, considerando ad esempio 2 secondi, ovvero 2000ms, hai 2000ms/(1000ms/s) i secondi vanno a numeratore e i ms si semplificano, ottenendo 2s).
Inoltre ti consiglierei per la definizione dei pin di usare delle costanti (const) o dei simboli di costante(#define) piuttosto che delle variabili. In questo modo se inavvertitamente una parte di programma dovesse tentare di modificarle, il compilatore ti avvertirebbe e comunque i valori memorizzati lì non verrebbero modificati.
Ti consiglio anche di sistemare l'indentazione, di evitare troppe righe bianche e di usare le parentesi graffe in modo coerente (o le metti sempre anche quando hai un istruzione sola oppure in caso di istruzione singola non ce le metti) per migliorare la leggibilità del codice.

garro:
Ti consiglio anche di sistemare l'indentazione, di evitare troppe righe bianche e di usare le parentesi graffe in modo coerente (o le metti sempre anche quando hai un istruzione sola oppure in caso di istruzione singola non ce le metti) per migliorare la leggibilità del codice.

Ho riordinato e corretto lo sketch. Eh si, faccio un pò di caos con le parentesi graffe!

#define sens1 9 
#define sens2 8

double spazio=0.11; // Inserire lo spazio tra i due ricevitori sulla scheda [m]
double tempo=0;
double velocita=0;
unsigned long t1=0;
unsigned long t2=0;
void setup()
{
  pinMode(sens1,INPUT); 
  pinMode(sens2,INPUT);
  Serial.begin(9600); 
  }
void loop() 
    {
    int Val1=digitalRead(sens1);
    int Val2=digitalRead(sens2);
  
       if(Val1==LOW)
    {
          t1=millis();
    }
       if(Val2==LOW)
        {
          t2=millis(); 
          tempo=(t2-t1)*1000;
          velocita=(spazio/tempo)*3.6; //Velocità in km/h
        Serial.print(velocità);
        Serial.println(" km/h");
   }
}

Ecco cosa mi esce dal monitor seriale, con lo skectch messo nel post prima.

Però adesso quei "0 km/h" partono da soli dopo 2 secondi, senza che debba interrompere il segnale dei due diodi.

Prova inserendo una stampa in caso di attivazione del sensore.. tipo

#define sens1 9
#define sens2 8

double spazio = 0.11; // Inserire lo spazio tra i due ricevitori sulla scheda [m]
double tempo = 0.0;
double velocita = 0.0;
unsigned long t1 = 0;
unsigned long t2 = 0;

void setup()
{
  pinMode(sens1, INPUT);
  pinMode(sens2, INPUT);
  Serial.begin(9600);
}


void loop()
{
  int Val1 = digitalRead(sens1);
  int Val2 = digitalRead(sens2);

  if (Val1 == LOW)
  {
    t1 = millis();
    Serial.println("Sensore 1");
  }

  if (Val2 == LOW)
  {
    t2 = millis();
    Serial.println("Sensore 2");

    tempo = (t2 - t1) * 1000.0;
    velocita = (double)(spazio / tempo) * 3.6; //Velocità in km/h
    Serial.print(velocita);
    Serial.println(" km/h");
  }
}

Dear "progetto autovelox"
sorry for asking a simple question in english. Within your sketch, you #define sens1 9 and #define sens2 8. On the other hand, your Fritzing layout uses Arduino ANALOG 2 (IR RX2) and 5 (IR RX1) for your sensor inputs. As a newcomer with Arduino, I'm a bit confused. You may reply in Italian, mia mogle parla italiana.
Tante grazie, Walter

Hi plw1946,
reading the source code I'm quite sure that the connection on the Fritzing layout are wrong. He do some digitalRead() on these pins, so ... no need for analog pins.

Guglielmo

Please note that the english language is not allowed on the Italian section. This time is OK, next time, please use the English section of the forum.