Outils pour utilisateurs

Outils du site


informatique:projets:rfaudiocoder

Introduction

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 :-D

Matériel

Vous aurez besoin du matériel suivant :

  • Emetteur RF (un modèle bon marché type FS1000A est suffisant)
  • Une prise jack mâle (à connecter à votre sortie son)
  • Une prise USB mâle (pour l'alimentation)
  • Un optocoupleur (type 817C)
  • Une alimentation step-up (optionnel, pour alimenter le circuit en 12V)

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

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 :

Méthodes de la classe RFAudioCoder
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 ;-)

Exemple

Le programme de test 'MessageEncoder.py' s'utilise assez simplement.

MessageEncoder.py --help
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 :

  • 4259861 : Allumage de la prise
  • 4259860 : Arrêt de la prise
Exemple d'allumage de la prise
# 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'
Exemple d'arrêt de la prise
# 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)

Téléchargement

informatique/projets/rfaudiocoder.txt · Dernière modification : 2022/11/27 17:21 de lestat

Outils de la page