Go Down

Topic: Progetto autovelox (Read 1 time) previous topic - next topic

Insigne69

Jan 08, 2016, 06:22 pm Last Edit: Jan 08, 2016, 06:33 pm by Insigne69
Salve, io ed i miei compagni di gruppo stiamo cercando di costruire un autovelox con dei diodi acquistati su ebay QEC112-QEC113 emettitore&ricevitore (http://m.ebay.it/itm/10X-LED-5mm-INFRAROSSO-EMETTITORE-RICEVITORE-940-nM-fotodiodo-ricevente-diodi-/261923831775) 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.
Code: [Select]
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.

gpb01

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
Search is Your friend ... or I am Your enemy !

cyberhs

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.




garro

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

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



Insigne69

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?

getchar() su Arduino restituisce sempre EOF, per questo non fa fermare il loop.
Quindi in questo sketch è inutile.

Insigne69

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 ( https://www.fairchildsemi.com/datasheets/QE/QEC113.pdf).
Quel "inf" non so assolutamente da dove provenga e il perche! :S


garro

#7
Jan 08, 2016, 10:39 pm Last Edit: Jan 08, 2016, 10:44 pm by garro
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.
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

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.

Insigne69

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

garro

Quote
Code: [Select]
//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.

Insigne69

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!
Code: [Select]
#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");
   }
}

Insigne69

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.

PaoloP

Prova inserendo una stampa in caso di attivazione del sensore.. tipo
Code: [Select]
#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");
  }
}

plw1946

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

gpb01

#14
Oct 07, 2016, 04:38 pm Last Edit: Oct 07, 2016, 04:40 pm by gpb01
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.
Search is Your friend ... or I am Your enemy !

Go Up