リグ制御プログラムをpySerialで(Sメーターの読みはdBリニアか?)

私のSGは、PCからUSBインターフェースを介して制御することができます。

このグラフは、IC-7410のSメーターの読みを、SGの出力を0.2 Vppから20 Vppまで、20 mVppステップで変化させて示したものです。

注意: SGの出力は直接接続されているのではなくて、軽く結合されているだけです。

リグのマニュアルによれば、Sメーターの読みは、S0で000、 S9で120、そしてS9+60dBで240のはずです。

import sys
import math
from time import sleep
import numpy as numpy
import matplotlib.pyplot as plt
import serial

ser_sg = serial.Serial('/dev/ttyUSB0', 57600, timeout=1) # signal generator
ser_rx = serial.Serial('/dev/ttyUSB1', 19200, timeout=1) # receiver

ser_sg.write(b':\n')
s = ser_sg.read(99)
print('[:]              ', s)

ser_sg.write(b':r0c\n')
s = ser_sg.read(99)
print('[:r0c]           ', s)

ser_sg.write(b':r1c\n')
s = ser_sg.read(99)
print('[:r1c]           ', s)

ser_sg.write(b':r2c\n')
s = ser_sg.read(99)
print('[:r2c]           ', s)

ser_sg.write(b':s1f0701500000\n')
s = ser_sg.read(99)
print('[:s1f0701500000] ', s)

ser_sg.write(b':r1f\n')
s = ser_sg.read(99)
print('[r1f]            ', s)

ser_sg.write(b':s1a020\n')
s = ser_sg.read(99)
print('[s1a0123]        ', s)

ser_sg.write(b':r1a\n')
s = ser_sg.read(99)
print('[r1a]            ', s)

freq_10hz = 701500
hz10   = freq_10hz           % 10
hz100  = freq_10hz //     10 % 10
khz    = freq_10hz //    100 % 10
khz10  = freq_10hz //   1000 % 10
khz100 = freq_10hz //  10000 % 10
mhz    = freq_10hz // 100000 % 10

set_freq = b'\xfe\xfe\x80\xe0\x05'     \
		+bytes([16*hz10        ])      \
		+bytes([16*khz   +hz100])      \
		+bytes([16*khz100+khz10])      \
		+bytes([          mhz  ])      \
		+b'\x00\xfd'
ser_rx.write(set_freq)
data1 = ser_rx.read(18) # not 17 to raise timeout

xvalue = []
yvalue = []

for amp_10mv in range(20, 2002, 2):
	stramp = str(amp_10mv)
	set_amp = b':s1a'+bytes(stramp.encode())+b'\n'
	print(amp_10mv, stramp, bytes(stramp.encode()), set_amp)
	ser_sg.write(set_amp)
	sleep(0.5)
	
	get_Smeter = b'\xfe\xfe\x80\xe0\x15\x02\xfd'
	ser_rx.write(get_Smeter)
	data2 = ser_rx.read(16)
	signal = int( data2.hex()[26:30] )
	amp = amp_10mv/100.0
	ampdB = 20.0 * math.log10(amp)
	xvalue.append(ampdB)
	yvalue.append(signal)
	print(amp, ampdB, signal)

ser_sg.close()
ser_rx.close()

plt.figure(1, figsize=(8,8))
plt.subplot(111)
plt.grid(True)
plt.plot(xvalue, yvalue, color='red', linewidth=3)
plt.title('IC-7410')
plt.xlabel('SG Output [dB]')
plt.ylabel('S_meter Readout')
plt.show()