Go Down

Topic: Esperimenti con una fotocellula (Read 7027 times) previous topic - next topic

lorenz90

Sono andato in cerca dei componenti, ma nella mia cittadina purtroppo non li tengono perchè considerati troppo "di nicchia" :~

Mi sa che aspetterò che esca la nuova shield wifi e ordinerò su internet tutto assieme, mi secca pagare 11 euro di spedizione per pochi euro di sensore..

lorenz90

Riesumo come promesso questo vecchio topic perchè finalmente mi sono procurato i componenti 8)
Il ricevitore non è proprio un TSOP, ma è un integrato equivalente, cambia solo la posizione dei tre piedini. Come emettitore ho usato un normale led rosso a media intensità, per gli esperimenti da vicino funziona.

Come primi test ho usato la libreria IR remote per arduino. Puntando il telecomando della tv sul ricevitore la libreria mi fornisce il codice del tasto premuto, e puntando il led rosso che uso come emettitore sulla tv sono riuscito a spegnerla (non vi dico l'emozione :)). Poi ho effettuato una prova di comunicazione tra i due componenti (collegati a due diversi arduino) ed è andata a buon fine.

Testato l'hardware, ho iniziato con il mio primo programmino, non vorrei fare tutto soltanto con le librerie senza capire niente. Il programma è il più semplice possibile, quando l'integrato riceve qualche segnale dal ricevitore, cioè quando il pin digitale dove è collegato il ricevitore passa a HIGH, il programma scrive tramite seriale "ricevuto". Il problema è che anche senza niente collegato al pin 11 (intendo proprio la board senza niente nel connettore) a video vedo continuamente la scritta "ricevuto" che appare in continuo riempiendomi pagine e pagine di pormpt. Un problema di circuiteria lo escluderei, dato che con la libreria funzionava tutto perfattamente. Visto che il codice è molto breve mi permetto di postarlo, magari qualche anima buona avrà voglia di aiutarmi :)
Code: [Select]
const int IRPin =  11;   // pin dove è collegato il piedino OUT del ricevitore

int IRState = 0;    // variabile per leggere lo stato del pin a cui è collegato i lricevitere IR

void setup() { 
  //inizializza comuicazione seriale
  Serial.begin(9600);
  // Inizializza come pin di input il pin dove è collegato il ricevitore IR
  pinMode(IRPin, INPUT);     
}

void loop(){
  // read the state of the IR value:
  IRState = digitalRead(IRPin);

  // check if the IR out is HIGH:
  if (IRState == HIGH) {     
    // Stampa a video il messaggio di avvenuta ricezione 
    Serial.println("Ricevuto"); 
  }
}


Veramente non capisco, magari sarà una stupidaggine di errore, ma il programma l'ho fatto copiando l'esempio "Button" del compilatore di arduino, quindi non mi spiego cosa.

Ringrazio in anticipo per l'aiuto, Lorenzo

lorenz90

Sto facendo degli esperimenti, quindi un piccolo aggiornamento:
Se attacco il pin 11 a massa finalmente non ricevo scritte a terminale. Anche staccando il cafo tutto bene, ma se tocco la parte in rame con le dita schizza subito HIGH. Sembra un problema di disturbi, ma come può essere che prima con la libreria non si presentava? :s

MauroTec

Quote
Sto facendo degli esperimenti, quindi un piccolo aggiornamento:
Se attacco il pin 11 a massa finalmente non ricevo scritte a terminale. Anche staccando il cafo tutto bene, ma se tocco la parte in rame con le dita schizza subito HIGH. Sembra un problema di disturbi, ma come può essere che prima con la libreria non si presentava? :s


Tutti i pin del micro sono (se posti in Input) ad alta impedenza di ingresso, per questo è sempre consigliabile chidere i pin non usati a GND.
Nel tuo caso, la libreria probabilmente imposta il pin in Input ma con pull-up che fissa il pin ad High e gestisce la logica inversa.

Ciao.
AvrDudeQui front end per avrdude https://gitorious.org/avrdudequi/pages/Home

Testato

Sono col cell e non riesco a leggere tutto il codice, ma mi sbilancio, metti una resistenza da 10k verso gnd sul pin del sensore. fai un pulldown
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

lorenz90

Problema risolto, anche se sinceramente non ho capito esattamente come :s
Come primo tentativo ho provato con la resistenza da 10kohm e non ha funzionato.
Poi ho provato con il tester per vedere a quanti volt è effettivamente l'uscita dell'integrato, e me la segnava sempre a 4.5 volt circa, come se stesse sempre ricevendo :smiley-eek:
Infine ho modificato il programma, in modo che segnalasse soltanto le variazioni di stato da LOW ad HIGH del pin collegato al ricevitore e...funziona! (cioè la scritta "ricevuto" appare soltanto quando invio l'impulso IR)

Ecco il nuovo codice:
Code: [Select]
//Il programma invia un messaggio a video quando c'è una variazione di stato da LOW a HIGH sul pin IRPin
const int IRPin =  11;   // pin dove è collegato il piedino OUT del ricevitore

int IRState = 0;    // variabile per leggere lo stato del pin a cui è collegato i lricevitere IR
int statoPrecedente=0; // memorizza lo stato di IRPin trovato dalla lettura precedente

void setup() { 
  //inizializza comuicazione seriale
  Serial.begin(9600);
  // Inizializza come pin di input il pin dove è collegato il ricevitore IR
  pinMode(IRPin, INPUT);     
}

void loop(){
  // read the state of the IR value:
  IRState = digitalRead(IRPin);

  // Controlla se c'è un cambio di stato da 0 a +5 sul pin IRPin
  if (IRState == HIGH && statoPrecedente==0) {     
    // Stampa a video il messaggio di avvenuta ricezione 
    Serial.println("Ricevuto");
    statoPrecedente=1;
  }
  // Se IRPin è allo stato Low cambia lo stato precedente
  if (IRState == LOW && statoPrecedente == 1){
    statoPrecedente = 0;
  }
}


Ed ecco l'impiantino di prova: (i piedini del ricevitore sono OUT GND +5V da sinistra a destra)


Secondo voi da cosa potrebbe dipendere il fatto che ora tutto funziona?

lorenz90

Ho cantato vittroia troppo presto :(
Ad un'analisi più approfondita ho riscontrato che non appena apro il panello di comunicazione seriale del computer appare una singola scritta "ricevuto" quindi qualcosa che non va c'è. Poi però la scritta appare di nuovo soltanto quando uso effettivamente il telecomando, quindi non è poi tanto grave, solo che non mi capacito del perchè accada.
Ho provato anche in questo caso con la resistenza da 10Kohm tra il piedino OUT e la massa, ma con qualla la scritta "ricevuto" non appare nemmeno col telecomando.

Testato

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

lorenz90

Il sensore si chiama IR38DM, e questa è la sua pagina: http://www.futurashop.it/allegato/8220-IR38DM.asp?L2=CORRELATI&L1=8220-K8050&L3=&cd=8220-IR38DM&nVt=
Il datasheet sembra non esistere, ma cercando su google dicono cha sia uguale al ben più noto TSOP1738, e che ciò che cambia sia soltanto la piedinatura.

Ho fatto un'altro test:
-un arduino (emittente) invia un segnale continuo a 38KHz
-l'arduino ricevitore, con lo stesso circuito di prima, riceve il segnale e mostra a video (10 volte al secondo)lo stato del pin dove è collegato il ricevitore. Se il pin è a +5 il programma segna 1, mentre se è a GND il programma segna 0.
Avviato il test appena apro il serial monitor ricevo una serie continua di 1, poi metto il dito davanti alla fotocellula tenendola coperta e continuo a ricevere 1. Solo nel momento in cui tolgo il dito appare un singolo 0, e poi continua la fila di 1.

Chissà che funzionamento bizzarro cha ha questo sensore :s

Go Up