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:
#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:
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
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
scusa se rispondo solo ora contavo in risposte da altri:
prova questo
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
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.
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:
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?