Dans ma configuration de relais SVXLink, j’utilise un raspberry pi et deux postes Kenwood TM451 (voir descriptif sommaire du relais). Je vais vous expliquer la partie logicielle qui vous permet de faire connaitre à l’utilisateur du relais le niveau de signal auquel il arrive au relais. J’ai écris un article spécifique pour présenter l’endroit où récupérer le signal RSSI sur le Kenwood TM-451.
Le Raspberry Pi n’est pas équipé d’entrée analogique direct. Nous devons faire l’acquisition de la tension RSSI renvoyé par le transceiver, par l’intermédiaire d’un circuit intégré convertisseur et communiquant en SPI (Serial Peripheral Interface). Ce bus fonctionne sur 4 fils. J’ai choisi un MCP3204 de Microship qui dispose de 4 voies d’entrées analogiques (soit 3 réserves disponibles), convertisseur 12 bits (2.77€ chez Reichelt hors port).
Voici le raccordement réalisé sur le port GPIO du Raspberry Pi :
- PIN1 – CH0 = Entrée à mesurée (attention max 3.3V pour le Raspberry – mise à niveau en amont nécessaire, avec un pont diviseur dans mon cas, mais de “haute” impédance – quelques M? pour ne pas dégrader l’affichage du S-metre sur le poste)
- PIN2 à PIN4 – CH1,CH2, CH3 (autres canaux analogiques ) en réserves
- PIN7 – DGND mis à la masse
- PIN 8 – CE\ / SHDN branché sur Raspberry Port P1 – PIN 24 GPIO 8 – CE0
- PIN 9 – DIN branché sur Raspberry Port P1 – PIN 19 GPIO 10 MOSI
- PIN 10 – DOUT branché sur Raspberry Port P1 – PIN 21 GPIO 9 MISO
- PIN 11 – CLK branché sur Raspberry Port P1 – PIN 23 GPIO 11 SCLK
- PIN12 – AGND branché à la masse
- PIN 13 – VREF à +3.3V
- PIN 14 – VDD à +3.3V
Coté logiciel, dans un premier temps, nous allons installer le langage python et le module de gestion du bus SPI.
sudo apt-get install python-dev python-pip sudo pip install spidev
et valider le fonctionnement (Me demande si cela est nécessaire si pas blackliste levé ?),
sudo modprobe spi_bcm2708
Puis, modifier l’interdiction (blacklist) d’exploitation du port SPI (mettre en commentaire la ligne spi-bcm2708 si elle existe dans le fichier de configuration).
sudo nano /etc/modprobe.d/raspi-blacklist.conf # blacklist spi-bcm2708 # blacklist i2c-bcm2708
Enfin, le corps du script python va effectuer la mesure en boucle des quatre voies analogiques. Vous le modifierez pour mettre à l’échelle les mesures (mise en correspondance les tensions au S-mètre. (source https://gist.github.com/yoggy/7096133)
nano /etc/svxlink/smeter/smeter_cycl.py
#!/usr/bin/python # # MCP3204/MCP3208 sample program for Raspberry Pi # # how to setup /dev/spidev?.? # $ suod modprobe spi_bcm2708 # # how to setup spidev # $ sudo apt-get install python-dev python-pip # $ sudo pip install spidev # import spidev import time class MCP3208: def __init__(self, spi_channel=0): self.spi_channel = spi_channel self.conn = spidev.SpiDev(0, spi_channel) self.conn.max_speed_hz = 1000000 # 1MHz def __del__( self ): self.close def close(self): if self.conn != None: self.conn.close self.conn = None def bitstring(self, n): s = bin(n)[2:] return '0'*(8-len(s)) + s def read(self, adc_channel=0): # build command cmd = 128 # start bit cmd += 64 # single end / diff if adc_channel % 2 == 1: cmd += 8 if (adc_channel/2) % 2 == 1: cmd += 16 if (adc_channel/4) % 2 == 1: cmd += 32 # send & receive data reply_bytes = self.conn.xfer2([cmd, 0, 0, 0]) # reply_bitstring = ''.join(self.bitstring(n) for n in reply_bytes) # print reply_bitstring # see also... http://akizukidenshi.com/download/MCP3204.pdf (page.20) reply = reply_bitstring[5:19] return int(reply, 2) if __name__ == '__main__': spi = MCP3208(0) count = 0 a0 = 0 a1 = 0 a2 = 0 a3 = 0 #while count <= 11: while True: count += 1 a0 += spi.read(0) a1 += spi.read(1) a2 += spi.read(2) a3 += spi.read(3) if count == 10: #print "ch0=%04d, ch1=%04d, ch2=%04d, ch3=%04d" % (a0/10, a1/10, a2/10, a3/10) #print a0 if 0 <= a0 < 6500 : sig=-1 elif 6500 <= a0 < 10000 : sig=0 elif 10000 <= a0 < 11000 : sig=1 elif 11000 <= a0 < 11500 : sig=2 elif 11500 <= a0 < 12000 : sig=3 elif 12000 <= a0 < 12500 : sig=4 elif 12500 <= a0 < 13000 : sig=5 elif 13000 <= a0 < 13500 : sig=6 elif 13500 <= a0 < 14000 : sig=7 elif 14000 <= a0 < 14500 : sig=8 elif 14500 <= a0 < 15000 : sig=9 elif 15000 <= a0 < 15500 : sig=10 elif 15500 <= a0 < 16000 : sig=11 elif 16000 <= a0 < 16500 : sig=12 elif 16500 <= a0 < 17000 : sig=13 elif 17000 <= a0 < 17500 : sig=14 elif 17500 <= a0 < 18000 : sig=15 elif 18000 <= a0 < 18500 : sig=16 elif 18500 <= a0 < 19000 : sig=17 elif 19000 <= a0 < 19500 : sig=18 elif 19500 <= a0 < 20000 : sig=19 elif 20000 <= a0 < 20500 : sig=20 elif 20500 <= a0 < 21000 : sig=21 elif 21000 <= a0 < 21500 : sig=22 elif 21500 <= a0 < 22000 : sig=23 else : sig=24 print "set Signal = %d" % sig file = open("/etc/svxlink/smeter/smeter.tcl", "w") file.write( "set signal " + str(sig) + ";") file.close() time.sleep(0.5) count = 0 a0 = 0 a1 = 0 a2 = 0 a3 = 0
Dans le fichier /etc/svxlink/smeter/smeter.tcl, la variable “signal” va ainsi contenir la valeur courante de S-mètre entre -1 à 24 .
Donnez les droits d’exécution sur le fichier
sudo chmod 755 /etc/svxlink/smeter/smeter_cycl.py
Et demander le lancement automatique au démarrage dans /etc/rc.local
Ensuite, vous aurez créer les fichiers audio (.wav) correspondant S1.wav, S2.wav,… S9.wav, S9+.wav).
Le fichier de gestion du roger beep Logics.tcl est à modifier pour qu’au laché de micro, le fichier son correspondant au signal soit joué.
proc smetre{} { source "/etc/svxlink/smeter/smeter.tcl" playMsg "Smeter" $signal; }
Ajouter l’appel à la fonction smetre dans proc send_rgr_sound
.
“Je complète avec quelques éléments plus précis ultérieurement…”
Une réflexion au sujet de « Ajouter un S-mètre vocal à son relais SVXLink »