===== Programme de lecture du signal S-mètre ===== Sur la voie A1 du convertisseur arrive la tension du S-mètre (après adaptation de niveau par pont diviseur). Le script python suivant doit être lancé en continu et renseigne, sur changement de niveau de signal, le fichier de mesure. Ce dernier est un fichier TCL qui sera exploité par la logique du relais. #!/usr/bin/python # # MCP3204/MCP3208 sample program for Raspberry Pi # # how to setup /dev/spidev?.? # $ sudo modprobe spi_bcm2708 # # how to setup spidev # $ sudo apt-get install python-dev python-pip # $ sudo pip install spidev # import spidev import time from collections import deque 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 nb=4 #number of aquiring signal t = 0.5 #time between two acquiring in seconds. Can be a float value. If nb=3 and t= 2, the qualified value will be given after 6 seconds of continuous signal over 'level' level=1730 #under this value, signal is not considered stack = deque([],maxlen=nb) sig=-1 sig_old= -1 #while count <= 11: while True: val = spi.read(0) time.sleep(t) #print "val brute = " #print val #print " stack = " #print stack if val> level : # software Squelch stack.append(val) else : # Reset counting stack = deque([],maxlen=nb) sig = -1 if len(stack)==nb : v=0 for i in range(0,nb) : v+= stack [i] i = i+1 meanv= (v/nb) #print len(stack) #print stack #print "meanv = " #print meanv if ((meanv <= stack[0]*1.05) and (meanv >= stack[0]*0.95)) : #prend en compte uniquement si signal stable pour les n echantillons meanv = stack[0] else :meanv= 0 if 0 <= meanv < 800 : sig=-1 #elif 650 <= meanv < 1950 : sig=0 elif 800 <= meanv < 920 : sig=1 elif 920 <= meanv < 1117 : sig=2 elif 1117 <= meanv < 1336 : sig=3 elif 1336 <= meanv < 1616 : sig=4 elif 1616 <= meanv < 1987 : sig=5 elif 1987 <= meanv < 2365 : sig=6 elif 2365 <= meanv < 2702 : sig=7 elif 2702 <= meanv < 3035 : sig=8 elif 3035 <= meanv < 3370 : sig=9 elif meanv>=3370 : sig=24 else : sig=-1 #print "Signal = %d" % sig if sig != sig_old : print "Changement de niveau de signal = %d" % sig file = open("/tmp/smeter.tcl", "w") file.write( "set signal " + str(sig) + ";") file.close() sig_old=sig ===== Code de lecture du signal ===== Modifions à présent dans le fichier ''/usr/share/svxlink/events.d/local/Logic.tcl'' le son appelé dans la fonction ''send_rgr_sound''. Nous avons crée 10 fichiers sonores différents (S1 à S9, et S9+). proc send_rgr_sound {} { variable sql_rx_id; variable signal; #variable filename; #lecture du signal # set output [exec python /etc/svxlink/smeter/smeter_1mes.py] if { [file exists /tmp/smeter.tcl] } { source "/tmp/smeter.tcl" set son "" if {$signal >=0} { if {$signal>=10} { set son "S9+" ; } else { append son "S" $signal ; } playMsg "SVXCard/SMeter" $son; } puts "Signal level on RX ID $sql_rx_id : $son"; } playTone 440 200 100; #CW::setPitch 600; # Sets the CW Tone to ~750 Hz #CW::setAmplitude 100; #CW::setCpm 125 #CW::play "k"; playSilence 200; for {set i 0} {$i < $sql_rx_id} {incr i 1} { playTone 880 500 50; playSilence 50; } playSilence 100; }