- Informatique
- Arduino
- Projets
- Mécanique
RFAudioCoder est une classe écrite en Python capable de générer des sons reproduisant la modulation d'un signal haute fréquence type 433Mhz utilisés dans les télécommandes.
Le but de ce projet est de pouvoir utiliser une carte son pour émettre des signaux plutôt que d'utiliser un port GPIO ou autre. En effet pour pouvoir utiliser de petits émetteurs sur un Raspberry Pi ou autre petite machine de ce type, on est obligé d'utiliser du C/C++ ou des librairies pré-compilés telles que rc-switch ou pi-switch-python pour la version Python) en raison de l'utilisation des interruptions.
L'idée de base est que la plupart des machines qui possèdent une carte son (même les moins puissantes), sont capable de jouer des sons à 8000Hz, 22050Hz, 44100Hz, etc… ce qui est largement suffisant pour émettre un signal RF. Par ailleurs, si l'on génère des fichiers son par avance, il devient même envisageable de contrôler certains récepteurs RF via une playlist depuis un simple lecteur MP3 sans passer par un PC… Ca ouvre le champs des possibles
Vous aurez besoin du matériel suivant :
Réalisation :
L'idée est d'utiliser un optocoupleur pour isoler le circuit de votre carte son. On connectera la diode de l'optocoupleur sur la sortie son via la prise jack, et la partie commutée de l'optocoupleur servira à relier la patte “data” à la patte “vcc” pour valider les état hauts.
L'alimentation du circuit se fera elle via le 5V fourni par un port USB de votre machine. Le schéma de câble ressemblera à peu pret à cela :
Les modules émetteurs FS1000A peuvent être alimentés par une tension comprise entre 3 et 12V.
Sachant que plus la tension est élevée, plus la portée du signal sera importante, il peut être intéressant d'utiliser un petit module convertisseur step-up afin d'avoir une tension de 12V à partir du 5V fourni par votre port USB.
Dans ce cas, il suffira d'intercaler ce module entre l'alimentation de l'émetteur et votre prise USB. L'utilisation de l'optocoupleur vous garantissant une isolation entre ce montage et votre sortie son, il n'y a pas de risques à procéder ainsi.
Le programme se compose d'une part d'une classe 'RFAudioCoder' et d'un programme de test permettant d'utiliser la classe rapidement.
La classe permet de générer des fichiers WAV contenant le codage ainsi que d'envoyer directement le son sur une carte son en passant par ALSA. Vous devez dans ce cas avoir le module python-alsaaudio d'installé.
La classe à été écrite de sorte que vous puissiez l'utiliser pour générer des fichiers WAV même si vous n'avez pas ALSA. Ce module n'est importé que lorsque vous utilisez l'export vers la carte son.
Voici la liste des méthodes publiques de la classe :
class RFAudioCoder : def ExportAudio( self, protocol=None, message=0 ) : """Export a message code to default audio device. Args: protocol: Protocol used to encode message message: Message to encode (numeric format) """ def ExportWAV( self, protocol=None, message=0, dest="" ) : """Export a message code to a WAV file. Args: protocol: Protocol used to encode message message: Message to encode (numeric format) dest: Destination WAV file to be written """ def SetAudioFrequency( self, audio_freq=8000 ) : """Set the audio frequency used to encode the messages (default: 8000Hz)""" def SetMessageRepeat( self, msg_repeat=8 ) : """Set the repeat times of the encoded message (default: 8)""" def SetMessageBitLength( self, msg_bits=24 ) : """Set the message data bit length (default: 24)"""
Le programme de test permet de générer des fichiers WAV ressemblants à peu près à cela :
En version zommée, on voit le signal généré :
Si vous jouez le son à partir de ce logiciel (Audacity) et que vous avez connecté le montage sur votre prise casque, vous transmettrez le signal via l'émetteur
Le programme de test 'MessageEncoder.py' s'utilise assez simplement.
usage: MessageEncoder.py [-h] [--debug] --protocol {1,2} --message MESSAGE [--encode-dest {audio,wav}] [--wav-file WAV] [--override-freq FREQ] [--override-bits BITS] [--override-repeat REPEAT] optional arguments: -h, --help show this help message and exit --debug Print debug messages --protocol {1,2} Protocol used for encoding --message MESSAGE Message to be encoded (numeric) --encode-dest {audio,wav} Encode message to audio or to a wav (default: audio) --wav-file WAV Path for the generated wav file --override-freq FREQ Override audio frequency (default: 8000Hz) --override-bits BITS Override protocol bits (default: 24) --override-repeat REPEAT Override message repeat (default: 8)
Dans mon cas, je dispose d'une prise commandée qui fonctionne avec les codes suivants :
# Allumage de la prise en passant par la carte son ./MessageEncoder.py --debug --protocol 1 --message 4259861 [DEBUG] Initializing RFAudioCoder class [DEBUG] Encoding message '4259861' using 'Protocol 1' [DEBUG] -> Repeating message 8 times [DEBUG] -> Using 24 data bits [DEBUG] -> Protocol pulse length = 350µs (converted to 3 samples @ 8000Hz) [DEBUG] -> Encoded message size = 3073 bytes [DEBUG] Sending message to audio device 'default' (padded to 3073 bytes) # Génération d'un WAV correspondant au code d'allumage de la prise ./MessageEncoder.py --debug --protocol 1 --message 4259861 --encode-dest wav --wav-file /tmp/allumage.wav [DEBUG] Initializing RFAudioCoder class [DEBUG] Encoding message '4259861' using 'Protocol 1' [DEBUG] -> Repeating message 8 times [DEBUG] -> Using 24 data bits [DEBUG] -> Protocol pulse length = 350µs (converted to 3 samples @ 8000Hz) [DEBUG] -> Encoded message size = 3073 bytes [DEBUG] Exporting message to wav file '/tmp/allumage.wav'
# Ici on répète le message 20 fois et on encode le message à 44100Hz sur le port audio ./MessageEncoder.py --debug --protocol 1 --message 4259861 --override-repeat 20 --override-freq 44100 [DEBUG] Initializing RFAudioCoder class [DEBUG] Encoding message '4259861' using 'Protocol 1' [DEBUG] -> Repeating message 20 times [DEBUG] -> Using 24 data bits [DEBUG] -> Protocol pulse length = 350µs (converted to 16 samples @ 44100Hz) [DEBUG] -> Encoded message size = 40961 bytes [DEBUG] Sending message to audio device 'default' (padded to 40961 bytes)