Ajouter un S-mètre vocal à son relais SVXLink

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).
MCP 3204Voici 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 »

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *