家庭菜園等に費やす時間が増えた一方、マイコン遊びの時間が少なくなってきました。
先日の「Rasoberry Pi Pico CircuitPython Si5351A テストその2」の記事に書いたRaspberry Pi Pico CircuitPython Si5351A 7MHz VFOを作って、テストそてみました。
回路図です。GP0,GP1にロータリーエンコーダを接続します。
Si5351AとOLEDは、I2C接続です。DCL=GP21,SDA=GP20としました。
周波数STEPの変更SWは、GP15に接続します。
SI5351AのCLK0をVFO出力とします。
I2C用のプルアップ抵抗は、OLEDに内蔵されているので、外付けしていません。
準備として、各デバイスを使うためのライブラリーをPico(CIRCUITPY )のlibフォルダ内にコピーします。具体的には、これまでの記事を参照してください。
スクリプトです。
STEP SWを接続するGP15はPULLUPしておきます。
-------------------------------------------------------------------------------------
"""
Raspberry Pi Pico CircuitPython Si5351A 7MHz VFO
2022.05.21
JH7UBC Keiji Hata
"""
from board import *
import rotaryio
import busio
import time
import digitalio
import adafruit_si5351
import adafruit_ssd1306
# Create the I2C interface.
i2c = busio.I2C(GP21, GP20)
# Initialize SI5351.
si5351 = adafruit_si5351.SI5351(i2c)
#Pull up for STEP SW
STEP_button = digitalio.DigitalInOut(GP15)
STEP_button.direction = digitalio.Direction.INPUT
STEP_button.pull = digitalio.Pull.UP
oled = adafruit_ssd1306.SSD1306_I2C(128, 64, i2c)
#OLED clear
oled.fill(0)
#VFO 初期値設定
frequency = 7000000
old_frequency = 9999999
step = 10000
f_Max = 7200000 #周波数最大値
f_Min = 7000000 #周波数最小値
df = -60 #周波数補正値
#Si5351A関係設定
XtalFreq = 25000000
denom = 1048575
#Si5351 Xtal Load Capacitance=6pF
si5351._write_u8(183,0x40)
si5351.outputs_enabled = True
#タイトル等表示
oled.text("RP2 Si5351A 7MHz VFO",5,0,1)
oled.rect(15,15,100,18,1)
oled.text(".",38,20,1)
oled.text(".",70,20,1)
oled.text("STEP",30,40,1)
oled.show()
#Rotary Encoder setup
encoder = rotaryio.IncrementalEncoder(GP0,GP1)
last_position = 0
#周波数表示
def Freq_display():
global frequency,old_frequency
fre_text = str(frequency)
oldfre_text = str(old_frequency)
x = 30
y = 20
for i in range(7):
if fre_text[i] != oldfre_text[i]:
oled.fill_rect(x,y,7,8,0)
oled.text(fre_text[i],x,y,1)
oled.show()
if i == 0 or i == 3:
x = x + 16
else:
x = x + 8
old_frequency = frequency
#STEP表示
def Step_display(s):
if s == 10000:
step_text = "10K"
elif s == 1000:
step_text = " 1K"
elif s == 100:
step_text = "100"
elif s == 10:
step_text = " 10"
oled.fill_rect(70,40,20,12,0)
oled.show()
oled.text(step_text,70,40,1)
oled.show()
#周波数出力
def Freq_out(f):
divider =900000000 // f
if divider % 2:
divider = divider - 1
#PLLA周波数設定
PllFreq = divider * f
mult = PllFreq // XtalFreq
L = PllFreq % XtalFreq
num = (L * denom) // XtalFreq
#PLL セット
si5351.pll_a.configure_fractional(mult,num,denom)
#CLOCK0出力周波数
si5351.clock_0.configure_integer(si5351.pll_a, divider)
#周波数変更
def Freq_change():
global frequency,step,df
if position - last_position > 0:
frequency = frequency + step
if frequency >= f_Max:
frequency = f_Max
else:
frequency = frequency - step
if frequency <= f_Min:
frequency = f_Min
Freq_display()
Freq_out(frequency+df)
#STEP変更
def Step_change():
global step
time.sleep(0.01)
if step == 10:
step = 10000
else:
step //= 10
Step_display(step)
while STEP_button.value == False:
time.sleep(0.01)
#初期値表示及び出力
Freq_display()
Freq_out(frequency+df)
Step_display(step)
#main loop
while True:
position = encoder.position
if position != last_position:
Freq_change()
last_position = position
if STEP_button.value == False:
Step_change()
time.sleep(0.01)
-------------------------------------------------------------------------------------
今回は、Xtal Load Capacitanceは、6pFとしています。
dfは、周波数補正値です。
STEP SWを押すたびに、10K→1K→100→10→10Kと循環します。
ブレッドボードです。
出力周波数を測定しています。7060000Hzに設定した時の周波数です。
周波数の細かい調整は、dfの値で行います。
このVFOにキーイングやサイドトーン発生のスクリプトを加えると、送信機として使用できるスクリプトになります。
これも近日中にテストしてみたいと思います。
※コメント投稿者のブログIDはブログ作成者のみに通知されます