0
Offline
Newbie
Karma: 0
Posts: 6
Arduino rocks
|
 |
« on: January 10, 2011, 07:40:45 am » |
Salve volevo realizzare questo esempio ComandareArduinoConUnTelecomandoqualsiasi (non riesco a postare il link al playground) non riesco a trovare il TSOP 1738 e volevo sapere se il TSOP 31238 è uguale. Poi una domanda da ignorante (mi sono avvicinato all'elettronica da poco), perchè questo tipo di componenti ha 3 pin?. Grazie mille
|
|
|
|
|
Logged
|
|
|
|
|
Fidenza, Parma
Offline
God Member
Karma: 7
Posts: 736
Arduino rocks
|
 |
« Reply #1 on: January 10, 2011, 08:10:17 am » |
Se vuoi comandare l'arduino con un telecomando da TV ti serve un ricevitore IR 38kHz poi per il resto penso siano tutti uguali, il ricevitore che uso io l'ho tolto da un videoregistratore. Ha 3 pin perchè un è il +, l'altro il - e il terzo è per i dati!
Ciao!
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Jr. Member
Karma: 0
Posts: 53
Arduino rocks
|
 |
« Reply #2 on: January 10, 2011, 08:13:01 am » |
Per le differenze tra i due ricevitori puoi confrontare i relativi datasheet: TSOP1738, TSOP31238. Un altro esempio di utilizzo può essere questo: immagine schemadove R1: 10K[ch937] R2, R3: 220[ch937] Sketch: /* * Controllo di due led tramite telecomando IR. */
#include <IRremote.h>
int RECV_PIN = 3; //Pin su cui è connesso il ricevitore IR int RED_LED_PIN = 9; //Pin del led rosso int GREEN_LED_PIN = 8; //Pin del led verde int BUTTON_PIN = 2; //Pin del bottone
int STATUS_RED = LOW; //Stato del led rosso int STATUS_GREEN = LOW; //Stato del led verde
int RED_IR_CODE = 0xFFFF9867; //Codice per comandare il led rosso int GREEN_IR_CODE = 0x58A7; //Codice per comandare il led verde
IRrecv irrecv(RECV_PIN); //Inizializza il pin del ricevitore IR
decode_results results; //Comando ricevuto dal ricevitore IR
/* * Switcha lo stato "ledStatus" del led "ledpin", "count" volte, * con una pausa, tra uno stato ed il successivo, "pause" millisecondi. * Ritorna l'ultimo stato del led. */ int blinkled(int ledpin, int count, int ledStatus, int pause){ for (; count > 0; --count){ if(ledStatus == LOW) ledStatus = HIGH; else ledStatus = LOW; digitalWrite(ledpin, ledStatus); delay(pause); } return ledStatus; }
void setup() { Serial.begin(9600); //Impostazione modalità dei pin pinMode(RED_LED_PIN, OUTPUT); pinMode(GREEN_LED_PIN, OUTPUT); pinMode(BUTTON_PIN, INPUT); //Blink dei led STATUS_RED = blinkled(RED_LED_PIN, 14, LOW, 50); STATUS_GREEN = blinkled(GREEN_LED_PIN, 14, LOW, 50); //Avvio della ricezione IR irrecv.enableIRIn(); }
/* * Riceve e ritorna il codice IR da associare al led "ledpin". */ int recIRCode(int ledpin){ int code = 0; //Codice ricevuto dal ricevitore IR int statusLed; //Stato del led //Accende il led ed esegue un blink statusLed = blinkled(ledpin, 1, LOW, 0); statusLed = blinkled(ledpin, 4, statusLed, 50); while(code == 0) //Fin quando il codice ricevuto non è valido (0) if (irrecv.decode(&results)){ //Riceve e decodifica il codice IR //Se il codice è decodificabile dalla libreria ed il codice non è quello di REPEAT if (results.decode_type != -1 && results.value != REPEAT){ code = results.value; //Codice ricevuto Serial.print("rec code: "); Serial.print(code, HEX); Serial.print(" -> pin "); Serial.println(ledpin); statusLed = blinkled(ledpin, 5, statusLed, 50); //Blink del led } irrecv.resume(); //Riceve il valore successivo dall'IR } statusLed = blinkled(ledpin, 1, HIGH, 0); //Spegne il led return code; //Ritorna il codice ricevuto }
void loop() { int code; //Codice IR ricevuto //Se il pulsante di registrazione dei codice è stato premuto... if (digitalRead(BUTTON_PIN) == HIGH){ //Spegne i led STATUS_RED = blinkled(RED_LED_PIN, 1, HIGH, 0); STATUS_GREEN = blinkled(GREEN_LED_PIN, 1, HIGH, 0); //Rivece e memorizza i codici per il led rosso e verde RED_IR_CODE = recIRCode(RED_LED_PIN); GREEN_IR_CODE = recIRCode(GREEN_LED_PIN); } //Se è disponibile un segnale IR if (irrecv.decode(&results)) { code = results.value; //Memorizza il codice ricevuto Serial.print(code, HEX); if (code == REPEAT) //Codice relativo ad un bottone non ancora rilasciato Serial.print(" [repeat code]"); if (code == RED_IR_CODE){ //Codice associato al led rosso Serial.print(": switch red led : pin "); Serial.print(RED_LED_PIN); STATUS_RED = blinkled(RED_LED_PIN, 1, STATUS_RED, 0); //Switcha lo stato del led rosso } //senza else consente di usare un bottone per più led if (code == GREEN_IR_CODE){ //Codice associato al led verde Serial.print(": switch green led : pin "); Serial.print(GREEN_LED_PIN); STATUS_GREEN = blinkled(GREEN_LED_PIN, 1, STATUS_GREEN, 0); //Switcha lo stato del led verde } if(results.decode_type == -1){ //Codice non decodificabile dalla libreria //Mostra il codice raw su serial unsigned int rawCodes[RAWBUF]; Serial.println(": UNKNOW code"); Serial.print("\traw len: "); Serial.print(results.rawlen); Serial.print("\n\traw buf: "); int codeLen = results.rawlen - 1; for (int i = 1; i <= codeLen; i++) { if (i % 2) { // Mark rawCodes[i - 1] = results.rawbuf[i]*USECPERTICK - MARK_EXCESS; Serial.print(" m"); } else { // Space rawCodes[i - 1] = results.rawbuf[i]*USECPERTICK + MARK_EXCESS; Serial.print(" s"); } Serial.print(rawCodes[i - 1], DEC); } Serial.println(""); } irrecv.resume(); //Riceve il prossimo valore IR Serial.println(); } }
Il bottone è usato per avviare le associazioni dei tasti del telecomando ai led. E' possibile associare anche lo stesso tasto ad entrambi i led.
|
|
|
|
« Last Edit: January 10, 2011, 07:39:03 pm by vanacore.paolo »
|
Logged
|
|
|
|
|
0
Offline
Newbie
Karma: 0
Posts: 6
Arduino rocks
|
 |
« Reply #3 on: January 10, 2011, 08:14:26 am » |
Grazie mille. Ancora una cosa i dati che mando e ricevo sono in analogico?
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Jr. Member
Karma: 0
Posts: 53
Arduino rocks
|
 |
« Reply #4 on: January 10, 2011, 08:22:46 am » |
Ricevitore IR ed eventuale led IR in digitale.
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Newbie
Karma: 0
Posts: 6
Arduino rocks
|
 |
« Reply #5 on: January 10, 2011, 05:19:26 pm » |
Scusate se insisto ma voglio essere sicuro di quello che acquisto. su rs components cercando tsop1738 mi dice che non è disponibile e mi offre come alternativa il TSOP 31238, la cosa che non mi quadra è che sulla descrizione dice Emettitore IR oscill 38kHz TSOP31238. Ho visto i due datasheets e a me sembrano uguali, ma come ripeto è solo un mesetto che gioco con Arduino e l'elettronica. Grazie. il link di rs components: http://it.rs-online.com/web/2861419.html?cm_mmc=IT-PPC-_-google-_-3_EEM-MPN-_-tsop1738_Broad
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Newbie
Karma: 0
Posts: 6
Arduino rocks
|
 |
« Reply #6 on: January 10, 2011, 06:22:04 pm » |
AIUTOOOOOOOOOOOOO
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Jr. Member
Karma: 0
Posts: 53
Arduino rocks
|
 |
« Reply #7 on: January 10, 2011, 06:48:02 pm » |
credo sia ok.
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Newbie
Karma: 0
Posts: 6
Arduino rocks
|
 |
« Reply #8 on: January 10, 2011, 06:55:06 pm » |
te cosa mi consigli?? perchè dicono Emettitore IR ?? al massimo lascio perdere con questo modello e ne prendo uno dove in modo esplicito c'è scritto ricevitore. L'importante è che sia a 38 khz
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Jr. Member
Karma: 0
Posts: 53
Arduino rocks
|
 |
« Reply #9 on: January 10, 2011, 06:59:14 pm » |
Se ti vendono il TSOP31238 sicuro è un ricevitore... se poi ti mandano un led ir non so ;D Non so perché in quella pag. dica emettitore. Qui e nel relativo datasheet la descrizione è corretta. Io lo prenderei.
|
|
|
|
« Last Edit: January 10, 2011, 07:37:10 pm by vanacore.paolo »
|
Logged
|
|
|
|
|
0
Offline
Newbie
Karma: 0
Posts: 6
Arduino rocks
|
 |
« Reply #10 on: January 16, 2011, 05:21:54 pm » |
Bene ho acquistato il tsop31238 fatto il circuito uploadato il codice e tutto sembra funzionare nel senso che dopo aver digitato un pulsante del telecomando sul Serial monitor vedo comparire delle cose. Ora mi chiedo che significato hanno quelle informazioni? Possono essere utili per capire il tasto premuto (penso di si). Cosa vuol dire Mark e Space? Ci sarebbe qualcuno un poco paziente che mi spiega le basi in modo tale da codificare i pulsanti del mio telecomando Samsung. Vi posto il codice preso da un esempio e commentando ciò che non mi serviva e qualche output del serial monitor #include <IRremote.h>
#define led1 9 #define led2 10 #define led3 6
int RECV_PIN = 7; /*int BUTTON_PIN = 5; int STATUS_PIN = 13;*/ int r = 0; int g = 0; int b = 0; IRrecv irrecv(RECV_PIN); IRsend irsend;
int fading = 0; // se = 1 effetti luminosi
decode_results results;
void setup() { Serial.begin(9600); irrecv.enableIRIn(); // Start the receiver /*pinMode(BUTTON_PIN, INPUT); pinMode(STATUS_PIN, OUTPUT); pinMode(led1, OUTPUT); pinMode(led2, OUTPUT); pinMode(led3, OUTPUT);*/ }
// Storage for the recorded code int codeType = -1; // The type of code unsigned long codeValue; // The code value if not raw unsigned int rawCodes[RAWBUF]; // The durations if raw int codeLen; // The length of the code int toggle = 0; // The RC5/6 toggle state
// Stores the code for later playback // Most of this code is just logging void storeCode(decode_results *results) { codeType = results->decode_type; int count = results->rawlen; if (codeType == UNKNOWN) { Serial.println("Received unknown code, saving as raw"); codeLen = results->rawlen - 1; // To store raw codes: // Drop first value (gap) // Convert from ticks to microseconds // Tweak marks shorter, and spaces longer to cancel out IR receiver distortion for (int i = 1; i <= codeLen; i++) { if (i % 2) { // Mark rawCodes[i - 1] = results->rawbuf[i]*USECPERTICK - MARK_EXCESS; Serial.print(" m"); } else { // Space rawCodes[i - 1] = results->rawbuf[i]*USECPERTICK + MARK_EXCESS; Serial.print(" s"); } Serial.print(rawCodes[i - 1], DEC); } Serial.println(""); } else { if (codeType == NEC) { Serial.print("Received NEC: "); if (results->value == REPEAT) { // Don't record a NEC repeat value as that's useless. Serial.println("repeat; ignoring."); return; } } else if (codeType == SONY) { Serial.print("Received SONY: "); } else if (codeType == RC5) { Serial.print("Received RC5: "); } else if (codeType == RC6) { Serial.print("Received RC6: "); } else { Serial.print("Unexpected codeType "); Serial.print(codeType, DEC); Serial.println(""); } Serial.println(results->value, HEX); codeValue = results->value; codeLen = results->bits; } }
int lastButtonState;
void loop() { if (fading == 1) { /*analogWrite(led1,r); r=r+random(5); r=r-random(5); delay(10); analogWrite(led2,g); g=g+random(5); g=g-random(5); delay(15); analogWrite(led3,b); b=b+random(5); b=b-random(5); delay(5); Serial.println("random");*/
}
if (irrecv.decode(&results)) { //digitalWrite(STATUS_PIN, HIGH); storeCode(&results); //Serial.println(results->value,HEX); if (codeValue == 0xA16EC03F) { //analogWrite(led1,0); //analogWrite(led2,0); //analogWrite(led3,0); Serial.println("spento"); } if (codeValue == 0xA16E34CB) { fading = 0; //analogWrite(led1,255); //analogWrite(led2,0); //analogWrite(led3,0); Serial.println("r"); } if (codeValue == 0xA16ED42B) { fading = 0; //analogWrite(led1,0); //analogWrite(led2,255); //analogWrite(led3,0); Serial.println("g"); } if (codeValue == 0xA16E54AB) { fading = 0; //analogWrite(led1,0); //analogWrite(led2,0); //analogWrite(led3,255); Serial.println("b"); } if (codeValue == 0xA16E0CF3) { fading = 1- fading; }
irrecv.resume(); // resume receiver //digitalWrite(STATUS_PIN, LOW); }
}
Digitando 1 ricevo: Received unknown code, saving as raw m4400 s4500 m500 s1700 m500 s1750 m500 s1700 m500 s650 m450 s650 m500 s600 m500 s600 m500 s650 m500 s1700 m500 s1750 m450 s1750 m500 s600 m500 s650 m450 s650 m500 s600 m500 s600 m500 s650 m500 s600 m500 s1700 m500 s650 m500 s600 m500 s600 m500 s650 m450 s650 m500 s1700 m500 s1750 m500 s600 m500 s1700 m500 s1750 m500 s1700 m500 s1750 m450 s1750 m500 Digitando 2: Received unknown code, saving as raw m4400 s4500 m550 s1700 m500 s1700 m500 s1750 m450 s650 m500 s600 m500 s600 m500 s650 m500 s600 m500 s1700 m500 s1750 m500 s1700 m550 s600 m500 s600 m550 s550 m550 s550 m550 s600 m550 s1650 m550 s550 m550 s1700 m550 s550 m550 s550 m550 s600 m550 s550 m550 s550 m550 s600 m450 s1750 m500 s600 m500 s1750 m500 s1700 m500 s1750 m450 s1750 m500 s1700 m500 Grazie
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Jr. Member
Karma: 0
Posts: 53
Arduino rocks
|
 |
« Reply #11 on: January 16, 2011, 08:55:54 pm » |
La trasmissione del codice (identificativo) di un tasto del telecomando consiste in una serie di impulsi emessi in successione, ognuno con una determinata durata, dal led IR del telecomando. Questi impulsi costituiscono un segnale modulato (credo, per i telecomandi delle tv, sempre modulazioni di un certo tipo sulla portante di 38kHz) che viene rilevato dal ricevitore IR (il tuo tsop31238). Uno degli scopi della libreria è quindi decodificare il segnale ricevuto dal fotodiodo IR e, per far questo, è necessario che "conosca" la codifica utilizzata.
Esistono diverse codifiche per la trasmissione dati nei telecomandi IR. Alcune di esse (NEC, Sony SIRC, Philips RC5, Philips RC6) sono direttamente supportate dalla libreria IRremote di Ken Shirriff. Questo significa che, per ogni tasto del telecomando, la libreria, se conosce la codifica, è in grado di decodificare il relativo segnale e ti dà come risultato un codice numerico (unsigned long) che puoi usare per identificare univocamente il tasto premuto.
Il formato raw rappresenta, invece, il segnale così come è stato rilevato dal ricevitore, quindi, non decodificato. In questo formato il segnale è rappresentato come una successione di livelli logici alti e bassi (mark-space) specificando, per ognuno di essi, la durata (in microsecondi).
Per tutti i segnali ricevuti, per i quali la libreria ne riconosce la codifica, hai a disposizione il codice decodificato (unsigned long) e il raw. Per i segnali ricevuti per i quali la libreria non ne riconosce la codifica hai a disposizione il solo raw (il tuo caso con il samsung).
Se il tuo scopo fosse replicare, tramite un led IR, i codici raw rilevati dal tsop31238, potresti far riferimento al metodo sendRaw della classe IRsend.
Spero di non aver detto inesattezze... aspetta comunque conferme.
|
|
|
|
« Last Edit: January 16, 2011, 08:57:35 pm by vanacore.paolo »
|
Logged
|
|
|
|
|
|