VLC hacking – Infrared Remote Py-Control 2.0
Lieto di annunciarvi, la nuova versione dell’Infrared Remote py-control, giunto dunque alla 2.0.
Nella precedente versione, non veniva sfruttata alcuna interfaccia nativa di VLC.
Dunque il risultato poteva essere alquanto macchinoso, e alterato da eventuali focus su finestre diverse da quella di VLC (da qui la necessità nella vecchia versione di assicurarsi che la finestra vlc fosse sempre in primo piano).
In questa nuova versione, vengono introdotti molteplici e fondamentali miglioramenti:
– Il client python interagisce direttamente con VLC attraverso l’interfaccia telnet offerta nativamente dal software (non vi è più alcun uso della libreria pywin32, win32api etc.).
– Nessuna necessità di aver la finestra di VLC in primo piano per potervi lanciare comandi sopra.
– Il protocollo telnet è facilmente integrabile in python, con l’import della libreria telnetlib.
– Il codice risulta più compatto e il software più stabile.
Alcune accortezze per garantre il funzionamento e la messa in funzione del progetto:
– Assicuratevi di avere VLC aperto e che abbiate selezionato dal menu l’interfaccia Telnet. Per farlo, da VLC, Visualizza > Aggiungi Interfaccia > Telnet.
– Potete interagire con l’interfaccia telnet di VLC, sfruttando il client telnet presente in Windows, oppure scaricando PUTTY. (Il software Python sfrutta invece la libreria telnetlib).
A quel punto vi è sufficiente, inserire l’ip (127.0.0.1 se vlc gira in locale) e la porta a cui volete connettervi (di default per vlc 4212, altrimenti la classica telnet è la 23).
Una volta entrati, vi chiederà una password, di default: admin. Dunque potrete dare l’invio e sarete dentro l’interfaccia telnet di VLC, con il comando help, avrete una lista di possibili comandi.
– Volutamente nel client in Python è stata data la possibilità di inserire l’ip sul quale gira l’interfaccia telnet di vlc, così da poter eventualmente controllare anche pc locali con vlc aperto e interfaccia telnet attiva (quindi non per forza vlc deve girare sul pc a cui connettete il ricevitore infrarosso e l’arduino).
– Assicurarsi che i segnali in seriale vengano letti correttamente (potete verificarlo attraverso il Serial Monitor dall’IDE del software Arduino).
– Dall’ide di arduino potete vedere quale è l’attuale porta seriale assegnata al dispositivo, inoltre spesso è probabile che eseguendo due volte il codice python, o prima il serial monitor e poi il client in python, la porta seriale risulti occupata, a quel punto è consigliabile riavviare il pc.
– Il serial monitor di arduino vi è anche utile (indispensabile direi) per mappare la codifica dei pulsanti del vostro telecomando infrarosso. Che andrà sostituita nel codice con quella del vostro telecomando.
– Notate bene, al contrario della precedente versione, la versione di python utilizzata è la 3.2, che come ben sapete introduce rispetto alle 2.7 sostanziali cambiamenti anche nella sintassi del linguaggio e nella gestione della codifica dei dati.
– Tutto è stato provato sotto sistema WINDOWS, ma tranquillamente gira anche su LINUX, l’importante è prestare attenzione quando inserite la porta seriale a cui è connesso il dispositivo, sotto windows è in forma: COMx, sotto linux invece: /dev/ttyUSBx oppure /dev/ttySx dove “x” è un numero.
Lo script che segue implementa solo alcune funzioni base, come play, pausa, tutto schermo, aumenta e diminuisci volume. Connessi in telnet all’interfaccia di VLC e lanciato il comando help potete potenzialmente implementare la qualunque.
Codice Client in Python:
import serial import telnetlib # ATTENZIONE, usare versione python 3.2 # vlc deve aver attiva l'interfaccia telnet, accessibile attraverso: 127.0.0.1:4212 con pass: admin # usando il client di telnet presente di default in windows o PUTTY si entra nel server telnet di vlc e lanciando il comando help si avra tutta la lista dei possibili comandi: play, pause etc. SERIALPORT = input("Inserire la porta seriale a cui e' connesso il dispositivo: ") # Set up serial port try: ser = serial.Serial(SERIALPORT, 9600) except serial.SerialException: print('No device connected - exiting...') time.sleep(4) sys.exit() print("\n### VLC Infrared Remote Controller Module - ver 2.0 ###\n") # Ci connettiamo in telnet al VLC locale o remoto. host = input("Inserisci l'HOST: ") #dando la possibilita di scegliere l'host ci si puo' connettere anche a pc nella stessa LAN password = input("Inserisci la password (default: admin): ") porta = input("Inserisci la porta (4212 per VLC telnet server): ") tn = telnetlib.Telnet(host, porta) #la porta di default per telnet: 23 tn.read_until(b"Password: ") tn.write(password.encode('ascii') + b"\n") print("\nDispositivo ricevitore infrarosso collegato e connessione stabilita!\n") pause_toggle = False def esegui_cmd(comando): global pause_toggle comando = comando[0:-2].decode("utf-8") #ripuliamo il comando eliminando i tag \r\n finali e decodificando. Queste qua sotto sono le codifiche dei tasti del telecomando da me usato. if comando == "20FE4DBB": #play/pausa (la variabile pause_toggle viene introdotta appositamente, per l'effetto di toggle nel caso di un unico pulsante per il play/pausa) if pause_toggle: cmd = "play\n" pause_toggle = not pause_toggle else: cmd = "pause\n" pause_toggle = not pause_toggle tn.write(cmd.encode("utf-8")) elif comando == "A3C8EDDB": #volume + cmd = "volup\n" tn.write(cmd.encode("utf-8")) elif comando == "F076C13B": #volume - cmd = "voldown\n" tn.write(cmd.encode("utf-8")) elif comando == "D7E84B1B": #next cmd = "next\n" tn.write(cmd.encode("utf-8")) elif comando == "52A3D41F": #prev cmd = "prev\n" tn.write(cmd.encode("utf-8")) elif comando == "E5CFBD7F" : #fullscreen (a tutto schermo) cmd = "fullscreen\n" tn.write(cmd.encode("utf-8")) elif comando == "FFFFFFFF": #pressione continua del tasto, viene ignorata pass while True: comando = ser.readline() print(comando) esegui_cmd(comando) comando = "" |
Codice Microcontrollore ATMEGA328p (arduino):
#include <IRremote.h> /* Ricevitore infrarosso. (la parte frontale del ricevitore è quella con la mezza sfera). primo piedino: è il segnale collegato al pin digitale 7. (è il primo piedino partendo da sinistra). secondo piedino: è il GND, collegato ad una resistenza 330ohm e poi al pin GND. (piedino centrale). terzo piedino: collegato a 5V (piedino a destra). Sfrutta la libreria IRremote.h (non presente di default, quindi scaricatela). Sito con esempi di codice per la ricezione e l'invio: http://www.arcfn.com/2009/08/multi-protocol-infrared-remote-library.html */ int RECV_PIN = 7; IRrecv irrecv(RECV_PIN); decode_results results; void setup() { Serial.begin(9600); irrecv.enableIRIn(); // Start the receiver } void loop() { if (irrecv.decode(&results)) { Serial.println(results.value, HEX); //inviamo il segnale letto in seriale irrecv.resume(); // Receive the next value } } |
Vista la parte software, per la parte hardware ciò che ci necessita è davvero alla portata di tutti:
– Una board con input digitali e uscita seriale (con connessione USB al pc), quindi oserei dire Arduino & cloni.
– Un telecomando normalissimo a infrarossi.
– Un ricevitore infrarosso che collegheremo alla board.
Eventualmente, telecomano e ricevitore spesso possono essere acquistati assieme. Segue un’immagine esplicativa:
Per qualsiasi suggerimento o aiuto, vi invitiamo a commentare qui sotto. Grazie!
Rocco
Commenti