前の記事の続きです。
KEYをGP14に接続します。(GP14はソフトでプルアップします。)
SIDE TONEを聞くためのスピーカをGP13に接続します。(700HzのPWMを出力します。)
この回路のVFO OUTにバッファとファイナルをつなげば、りっぱなCW送信機になります。
スクリプトです。
------------------------------------------------------------------
"""
Raspberry Pi Pico CircuitPython Si5351A 7MHz VFO
2022.05.25
JH7UBC Keiji Hata
"""
from board import *
import rotaryio
import busio
import time
import digitalio
import adafruit_si5351
import adafruit_ssd1306
import pwmio
# 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
#Pull up for KEY
KEY = digitalio.DigitalInOut(GP14)
KEY.direction = digitalio.Direction.INPUT
KEY.pull = digitalio.Pull.UP
#LED port
LED = digitalio.DigitalInOut(GP16)
LED.direction = digitalio.Direction.OUTPUT
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 = False
si5351._write_u8(3,0x0F)#output disable
#SIDE TONE関係設定
SIDE_TONE = pwmio.PWMOut(GP13,frequency = 700)
SIDE_TONE.duty_cycle = 0 # SIDE TONE off
#タイトル等表示
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)
TX_flag = False
TX_bef_flag = False
#main loop
while True:
position = encoder.position
if position != last_position:
Freq_change()
last_position = position
if STEP_button.value == False:
Step_change()
if KEY.value == False:
TX_flag = True
if TX_flag != TX_bef_flag:
si5351._write_u8(3,0x0C) #CLOCK0 output
LED.value = True
SIDE_TONE.duty_cycle = 32768
else:
TX_flag = False
if TX_flag != TX_bef_flag:
si5351._write_u8(3,0x0F) # output disable
LED.value = False
SIDE_TONE.duty_cycle = 0
TX_bef_flag = TX_flag
time.sleep(0.01)
------------------------------------------------------------------
SI5351Aの出力をコントロールするのは、Si5351Aのレジスタ3のbit2,bit1,bit0の値です。
bit0=0でCLK0がon
bit1=0でCLK1がon
bit2=0でCLK2がonです。
今回は、CLK0使いませんので、0x0Fで全ての出力off、0x0CでCLK0 onになります。
ブレッドボードです。KEYの代わりにタクトスイッチ(右側の黄色いスイッチ)をつけてテストしています。KEYが押された時にLEDが点灯し、SIDE TONEをスピーカに出力し、CLK0に周波数が出力されます。
スピーカをつけてテストしています。出力は、CLK0につけたリード線から漏れてくる微弱電波をハンディ機で受信してモニタしました。
※コメント投稿者のブログIDはブログ作成者のみに通知されます