
In questo articolo vi presento un progettino che risale ormai a un po' di tempo fa.L'idea era quella di utilizzare il ricevitore infrarossi che ho comprato insieme allo starter kit di arduino e, non avendo alcun led ir trasmettitore, mi son detto "beh, utilizziamo qualcosa che ha già un trasmettitore ir": un telecomando.
Sono andato in cucina, mi sono appropriato in modo furtivo del telecomando dello stereo e sono tornato alla postazione PC per cominciare ciò che avevo intenzione di fare già da un po' di tempo: un telecomando per VLC.Ecco una dimostrazione del progettino 🙂
Quindi ho adoperato:
- Arduino UNO
- un telecomando
- un sensore ir
dove il piedino Vdd sarà collegato ai 5V di Arduino, GND ovviamente a terra e OUT sulla porta ~11 - avere Python 3 (io c'ho quello a 32 bit) installato su Windows
- le librerie che si trovano nell'import dello script in Python tra cui pySerial (import serial) che ci servirà per leggere da seriale i comandi del nostro telecomando
- la libreria per Arduino IRremote
Quando viene pigiato un pulsante di un telecomando il led ir, posto in cima ad esso, emette una determinata sequenza di impulsi ir che corrispondo a quello specifico pulsante.
Questi impulsi poi vengono digitalizzati in un codice che noi poi potremo utilizzare per il software che gestirà le azioni del nostro telecomando.
In particolare l'idea è quella di associare a un pulsante del telecomando, lo shortcut di VLC che fa una determinata azione (ad es. per il play si vuole premere il tasto spazio della tastiera, "s" per fare stop ecc..).
Visto che ormai sappiamo come far comunicare arduino e un programmino in Python, vediamo lo scipt di arduino:
#include "IRremote.h" int RECV_PIN = 11; IRrecv irrecv(RECV_PIN); decode_results results; void setup() { Serial.begin(9600); irrecv.enableIRIn(); // avvia il ricevitore pinMode(13, OUTPUT); // led per il feedback del comando // lanciato dal telecomando } void loop() { if (irrecv.decode(&results)) {//Cerca di ricevere un codice IR. //Ritorna V se il codice viene ricevuto, //F se ancora nulla è stato ricevuto. //Quando un codice viene ricevuto, //l'informazione viene salvata in //"results" Serial.println(results.value, HEX); digitalWrite(13, HIGH); delay(500); digitalWrite(13, LOW); irrecv.resume(); //Dopo la ricezione, si resetta il ricevitore //e si prepara per un altro codice } }
Quello che segue invece è lo script in Python. Come potrete notare, in linea 56 in commands ci sono un po' di stringhe. Queste stringhe rappresentano le interpretazioni in esadecimale di un segnale lanciato da un certo tasto. Quello che inizialmente dovrete fare è riuscire a individuare questi codici in modo da potergli poi assegnare la funzionalità voluta (basta stampare ciò che vi ritorna il readline()). Da linea 57 a 68 vi sono i codici del mio telecomando che dovrete sostituire. Con l'istruzione shell.SendKeys(Key) si simula la selezione del tasto Key della tastiera.
import sys import win32com.client import win32gui import serial import string def power(): shell.SendKeys("%{F4}") def play_pause(speed): if speed==0: shell.SendKeys(" ") else: while speed!=0: if speed >0: shell.SendKeys("{+}") speed=speed-1 else: shell.SendKeys("{-}") speed=speed+1 return 0 return speed def stop(): shell.SendKeys("s") def vol_up(): shell.SendKeys("^{UP}") def vol_down(): shell.SendKeys("^{DOWN}") def faster(speed): shell.SendKeys("{-}") return speed+1 def slower(speed): shell.SendKeys("{+}") return speed-1 def previous_(): shell.SendKeys("p") def next_(): shell.SendKeys("n") def fullscreen(): shell.SendKeys("f") def mute(): shell.SendKeys("m") def proportions(): shell.SendKeys("a") commands= { "b'659A38C7\r\n'": power, "b'659AAE51\r\n'": play_pause, "b'659A09F6\r\n'": stop, "b'659A50AF\r\n'": vol_up, "b'659AD02F\r\n'": vol_down, "b'659A29D6\r\n'": faster, "b'659AC936\r\n'": slower, "b'659A49B6\r\n'": previous_, "b'659A8976\r\n'": next_, "b'45BA7887\r\n'": fullscreen, "b'45BAF807\r\n'": proportions, "b'45BA0AF5\r\n'": mute, } speed=0 ser = serial.Serial('com5', 9600) shell = win32com.client.Dispatch("WScript.Shell") while (1): x=(str)(ser.readline()) if commands.get(x): if x=="b'659AAE51\r\n'" or x=="b'659A29D6\r\n'" or x=="b'659AC936\r\n'": #se il comando è un play, un più veloce o un più lento.. print(speed) speed=commands[x](speed) else: commands[x]()
Per ora è tutto,
Alla prossima! 😉