Pages: [1]   Go Down
Author Topic: Aiuto Arduino con infrarossi  (Read 1653 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 5
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Inizio dicendo a grandi linee il progetto che vorrei fare. Ho preso l'idea dall'arpa laser e vorrei adattare il tutto con dei fasci ad infrarossi.

Vorrei riuscire a far funzionare almeno un fascio facendo quindi emettere un suono e poi aggiungerò i fasci per le diverse note musicali.
A disposizione ho un ricevitore OP803SL e un trasmettitore OPB707A.
Navigando ho trovato dei pezzetti di codice e volevo provare con questo:
Code:
#include <IRremote.h>


int RECV_PIN = 0; // collego la base del ricevitore al piedino 0 dell'arduino

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  pinMode(13, OUTPUT);
  IRrecv.enableIRIn(); // Inizia a ricevere
}

void loop()
{
  if (IRrecv.decode(&results))
     {
      Serial.println(results.value, HEX); //Restituisce il codice in esadecimale.
      IRrecv.resume();
     }
}

con questa parte inizio a vedere che codice viene restituito quando il fascio è interrotto o no. poi aggiungerei:
Code:
if (results.value == 0x[codice_hex])
      {
       //qua faccio emettere una nota
      }

il problema è che non so se come ragionamento sia giusto ma prima di tutto mi da degli errori quando compilo che non capisco come risolvere.

ecco gli errori:
infra:13: error: expected unqualified-id before '.' token
infra.cpp: In function 'void loop()':
infra:19: error: expected primary-expression before '.' token
infra:22: error: expected unqualified-id before '.' token

Spero in un vostro aiuto perchè non riesco proprio ad andare avanti. Grazie in anticipo
Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 266
Posts: 21665
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Coaí noi non possiamo aiutarTi; postaci tutto il codice completo.
Ciao Uwe
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 5
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao, grazie per l'attenzione =)
comunque il codice è tutto qua:
Code:
#include <IRremote.h>


int RECV_PIN = 0; // OUT ricevitore Ir.

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  IRrecv.enableIRIn(); // Inizia a ricevere
}

void loop()
{
  if (IRrecv.decode(&results))
     {
      Serial.println(results.value, HEX); //Eestituisce il codice in esadecimale.
      IRrecv.resume();
     }

  // if (results.value == 0x[codice_hex])
   //   {
       //faccio fare il suono
    //  }
}

sono proprio all'inizio però mi dà quegli errori e non so come risolverli.
Logged

Riva del Garda, TN / Forlì
Offline Offline
Edison Member
*
Karma: 8
Posts: 2246
Il piu' modesto al mondo
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ma domanda, prendi un led infrarosso con basso angolo di vista (oppure fai diventare la punta piatta, in alcuni casi dimezz al'angolo di vista) poi lo colleghi al positivo, allinei sul fascio il ricevitore.

il ricevitore è uno di quelli da 50 centesimi che hanno 3 pin, un positivo un negativo e un segnale? se si colleghi il positivo a 5V massa ad arduino (massa) e il segnale su un pin digitale, poi metti l'arduino in ascolto (usa un while) finchè non riceve una variazione di segnale (da alto il segnale diventa basso se viene interrotto altrimenti il contrario) e ti basi su questo per avviare o interrompere la nota..

detto a parole è complicato, in fase di codice è un while e se vuoi semplificare la vita una funzione
Logged

Il nuovo forum italiano sull'elettronica: http://www.electroit.tk/ <--- Nuovamente online!

0
Offline Offline
Newbie
*
Karma: 0
Posts: 5
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ma infatti è quello che voglio fare. come ragionamento il codice dovrebbe funzionare però in compilazione mi da degli errori.
Logged

Riva del Garda, TN / Forlì
Offline Offline
Edison Member
*
Karma: 8
Posts: 2246
Il piu' modesto al mondo
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

scusa se rispondo solo ora contavo in risposte da altri:

prova questo
Code:
int pinric = 0; //pin del ricevitore, non 0 o 1 o interferisce con la seriale

void setup() {
   Serial.begin(9600);
}

void loop() {
   while(digitalRead(pinric) != LOW); //aspetto manchi il segnale
   Serial.println("Hey, togli quel dito di mezzo!!");
   // qui il resto del codice quando è interrotta la comunicazione
}

non l'ho provato ma dovrebbe andare ed essere molto più facile del tuo precedente senza dover chiamare librerie esterne smiley-wink
Logged

Il nuovo forum italiano sull'elettronica: http://www.electroit.tk/ <--- Nuovamente online!

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 266
Posts: 21665
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ciao xxGIOxx

Il tuo errore é che i comandi C del IDE sono keysensitive, che vuol dire che un carattere minuscolo é diverso dallo stesso in maiuscolo.

IRrecv.enableIRIn(); é sbagliato.
Giusto é:
irrecv.enableIRIn();
Se lo cambi in tutte le righe funziona la compilazione.

Ciao Uwe
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 5
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao Superlol, grazie per l'idea. Ho provato il tuo codice e in teoria sarebbe davvero utile così risparmio l'utilizzo di librerie esterne e compila perfettamente. quando vado però a fare l'upload su arduino mi dice:

avrdude: stk500_getsync(): not in sync: resp=0x00
avrdude: stk500_disable(): protocol error, expect=0x14, resp=0x51

Ciao Uwe, grazie anche a te. In effetti avevo pensato a quello che mi hai detto tu allora avevo aperto la libreria però le funzioni avevano proprio il nome così e adesso se lo complilo con irrecv mi dice:
infra.cpp.o: In function `__static_initialization_and_destruction_0':
C:\...\build7818193702170017451.tmp/infra.cpp:9: undefined reference to `IRrecv::IRrecv(int)'
infra.cpp.o: In function `loop':
C:\...\build7818193702170017451.tmp/infra.cpp:23: undefined reference to `IRrecv::decode(decode_results*)'
C:\...\build7818193702170017451.tmp/infra.cpp:26: undefined reference to `IRrecv::resume()'
infra.cpp.o: In function `setup':
C:\...\build7818193702170017451.tmp/infra.cpp:17: undefined reference to `IRrecv::enableIRIn()'

penso che ci sia qualcosa di sbagliato nella libreria che ho scaricato. Se tu mi sai dire dove posso trovare quella corretta magari risolvo il problema.

Grazie in anticipo.
Ps Per dei problemi forse fino a martedì non potrò lavorare su arduino però ho l'IDE dietro e posso provare a compilare.

Ciao xxGIOxx
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 5
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sono riuscito ad andare avanti col lavoro e alla fine ho utilizzato dei sensori di luminosità. adesso riesco a collegare 6 sensori ad arduino e quando vengono "sollecitati" emettono un tono con lo speaker. questo è il codice:
Code:
int nota0 = 0;

.... e così via fina a ....
int nota5 = 5;
int val5;

void setup() {
   Serial.begin(9600);
   pinMode(0,INPUT);
   ...e così via fina a...
   pinMode(5,INPUT);
}

void loop() {
   val0=analogRead(nota0);
   val0 = map(val0, 0, 1024,0,255);
   ... e così via fino a ...
   val5=analogRead(nota5);
   val5 = map(val5, 0, 1024,0,255);
  
   if(val0<= 20)
   {
   //aspetto manchi il segnale
     tone(7, 100,8);  
       Serial.println("nota 0 ------------");
   }
   .... e così via fino a .....
  
   if(val5<= 20)  //scuola 24
   {
   //aspetto manchi il segnale
     tone(7, 4978,8);  
       Serial.println("nota 5 --------------");
   }
}

sono soddisfatto e devo ringraziarvi però a questo punto mi piacerebbe migliorare un po le cose e volevo chiedere se era possibile al posto di utilizzare lo speaker, modificando solo la frequenza ed avendo quindi un suono non gradevole, fare eseguire un suono dal pc mediante le casse. magari un file wav, o altre estensioni. Sapete aiutarmi?

Grazie xxGIOxx
« Last Edit: January 19, 2011, 01:25:50 pm by xxGIOxx » Logged

Pages: [1]   Go Up
Jump to: