JH7UBCブログ

アマチュア無線 電子工作 家庭菜園など趣味のブログです

Raspberry Pi Pico CircuitPython Si5351A テストその1

2022-05-10 20:23:46 | Raspberry Pi Pico
 Raspberry Pi Pico + CircuitPython + MuIDE環境で、3チャンネル・クロックジェネレーターSi5351Aのテストをします。

 CircuitPythonには、Si5351用のライブラリがありますので、CircuitPythonのLibrariesダウンロードページからmpyライブラリをダウンロードします。

  ダウンロードし、解凍したファイルのlibフォルダ内のadafrit_si5351.mpyをPicoのlibフォルダ内のコピーします。
 今回テストするのは、examplesフォルダ内のsi5351_simpletest.pyです。

 Raspberry Pi PicoとSi5351Aモジュール(秋月電子で販売しているもの)の接続回路図です。 I2C接続で、Pico側は、SCL=GP17,SDA=GP16とします。
このモジュールにはプルアップ抵抗がついていませんので、外付けで10KΩの抵抗でプルアップしました。

 スクリプトです。
 ファイル名は、code.pyとして、Picoのルートの保存し、実行します。
 実際のsi5351_simpletest.pyには、英文の説明が長々としてありますが、割愛して、簡単な説明を加えました。また、そのままでは動きませんでしたので、最初の部分を若干書き換えてあります。
--------------------------------------------------------------------------------
"""
si5351_simpletest.py
"""

from board import *
import busio

import adafruit_si5351

SCL = GP17
SDA = GP16

# Initialize I2C bus.
i2c = busio.I2C(SCL, SDA)

# Initialize SI5351.
si5351 = adafruit_si5351.SI5351(i2c)

#PLLA周波数設定 25MHz×36=900MHz
si5351.pll_a.configure_integer(36)  # Multiply 25mhz by 36
print("PLL A frequency: {0}mhz".format(si5351.pll_a.frequency / 1000000))

#PLLB周波数設定 25MHz×24 2/3=616.66667MHz
si5351.pll_b.configure_fractional(24, 2, 3)  # Multiply 25mhz by 24.667 (24 2/3)
print("PLL B frequency: {0}mhz".format(si5351.pll_b.frequency / 1000000))

#CLOCK0出力周波数 900MHz/8=112.5MHz
si5351.clock_0.configure_integer(si5351.pll_a, 8)
print("Clock 0: {0}mhz".format(si5351.clock_0.frequency / 1000000))

#CLOCK1出力周波数 616.66667MHz/(45 1/2)=13.55311MHz
si5351.clock_1.configure_fractional(si5351.pll_b, 45, 1, 2)  # Divide by 45.5 (45 1/2)
print("Clock 1: {0}mhz".format(si5351.clock_1.frequency / 1000000))

#CLOCK2出力周波数 616.66667MHz/900=0.68518519MHz
si5351.clock_2.configure_integer(si5351.pll_b, 900)

#CLOCK2ポストデバイダ設定 1/64  CLOCK2出力=685.18519KHz/64=10.706KHz
si5351.clock_2.r_divider = adafruit_si5351.R_DIV_64
print("Clock 2: {0}khz".format(si5351.clock_2.frequency / 1000))

# After configuring PLLs and clocks, enable the outputs.
si5351.outputs_enabled = True
# You can disable them by setting false.
--------------------------------------------------------------------------------
 SI5351Aのブロック図です。

 このスクリプトでは、CLOCK0は、PLLA(900MHz)をMS0で1/8して、112.5MHzにしています。
 CLOCK1は、PLLB(616.66667MHz)をMS1で45 1/2分周して、13.553115MHzにしています。
 CLOCK2は、PLLBをMS2で1/900して、685.18519KHzにして、更にポスト分周期R2で1/64にして、10.706KHzにしています。

 ブレッドボードです。

 Si5351Aの出力周波数を測定してみました。
 CLOCK0の出力です。理論値は112.5MHzです。


 CLOCK1の出力です。理論値は、13.553115MHzです。

 CLOCK2の出力です。理論値は、10.706KHzです。

 ほぼ、理論値通りの出力が得られました。
 
 今後、もう少し勉強して、OLED表示とロータリーエンコーダと組み合わせて、VFOを作ってみようと思っています。


Raspberry Pi Pico CircuitPython 2.2インチTFT表示テスト

2022-05-07 11:03:46 | Raspberry Pi Pico
 Raspberry Pi Pico L CircuitPython + MuIDE環境で、2.2インチTFTの表示テストをします。

 接続回路図です。2.2インチTFTディスプレイは、SPI接続で、コントローラは、ILI9341です。
 TFTとPicoの接続は次のようにしました。
 TFT                  Pico
1 Vcc                  3V3OUT(Pin36)
2 GND                Any Pin
3 CS                   GP13(Pin17)
4 RESET             GP14(Pin19)
5 DC                   GP15(Pin20)
6 SDI(MOSI)        GP7(Pin10)
7 SCK                 GP6(Pin9)
8 LED                 3V3OUT
9 SDO(MISO)     接続しない


 ネット上を探すとPicoでのILI9341 TFT表示例が見つかりました。
 「Hello Raspberry Pi」というサイトの記事とスクリプトを参考にして、表示テストをしました。

 まず、CircuitPythonのLibrariesダウンロードページからライブラリをダウンロードします。赤丸で囲んだmpyライブラリをダウンロードします。

 解凍したファイルのlibフォルダ内のadafruit_ili9341.mpyというファイルをPicoのlibフォルダ内にコピーします。更にadafruit_display_textというフォルダをフォルダごとPicoのlibフォルダ内にコピーします。これで準備は完了です。

 先述の「Hello Raspberry Pi」というサイトの記事の中のExample Codeをコピペして、Picoのルート(CIRCUIPY)にcode.pyとして保存して、実行しました。

 ところが、「TypeError: 余分なキーワード引数があります」というエラーメッセージが出て動きませんでした。あれこれ試して、どうやら「max_size= 」を入れると上記のエラーメッセージがでるようなので、Group指定の中から全てmax_sizeを削除したらエラーメッセージがでず、スクリプトが実行されました。

 ブレッドボードとTFTの画面です。

 文字表示され、5秒ごとに画面が90°ずつ回転します。

 一応文字が表示されたのは、確認したのですが、MicroPythonに比べるとスクリプトがちょっと複雑だなと感じました。また、フラフィックスをどのように表示するか、まだよく分かりません。もう少し勉強してみようと思います。

Raspberry Pi Pico CircuitPython I2C LCD1602表示テスト

2022-04-28 07:32:41 | Raspberry Pi Pico
 Raspberry Pi Pico + CircuitPython + MuIDE環境で、I2Cインターフェース付きLCD1602の表示テストをします。

 電子工作において、LCD1602表示器は、まだまだ重要な表示パーツです。最近は、I2Cインターフェース付きのものが多く使われています。

 Raspberry Pi Pico + MicroPythonでの表示テストは既にこのブログに記事を書きました。記事はこちら

 今回は、CIrcuitPythonでの表示テストです。スクリプトはMicroPythonのものをCircuitPython用に書き換えて利用します。

 回路図です。
 I2Cは、SCL=GP15,SDA=GP14とし、I2Cの電圧レベル変換用にPCA9306モジュールを使っています。(このモジュールを使わず、直接LCD1602をPicoに接続しても使えますが、安全のため電圧変換モジュールを使用しています。)

 スクリプトです。
 1行目に「Hello World!」を表示し、2行目に数字を0からカウントアップして表示します。
-------------------------------------------------------------------------
"""
Raspberry Pi Pico CircuitPython I2C LCD1602 test
2022.4.28
JH7UBC Keiji Hata
"""

from board import *
import busio
from time import sleep

i2c=busio.I2C(GP15,GP14)

LCD_addr=0x27
LCD_EN=0x04 #LCD Enable
LCD_BL=0x08 #Back Light
CMD=0x00 #command mode
CHR=0x01 #character mode
LINE1=0x80 #Line1 top address
LINE2=0xC0 #Line2 top address

buf=bytearray(2)

while not i2c.try_lock():
         pass

def LCD_write(bits,mode):
     #High 4bits
     data=(bits & 0xF0)|mode
     buf[0]=data|LCD_EN|LCD_BL
     buf[1]=data|LCD_BL
     i2c.writeto(LCD_addr,buf)
     sleep(0.0001)#wait 100us
     #Low 4bits
     data=((bits<<4)&0xF0)|mode
     buf[0]=data|LCD_EN|LCD_BL
     buf[1]=data|LCD_BL
     i2c.writeto(LCD_addr,buf)
     sleep(0.0001)#wait 100us

def LCD_init():
     LCD_write(0x33,CMD)#8bit mode 0x03を2回送る
     LCD_write(0x32,CMD)#8bit mode,4bit mode 0x02を送る
     LCD_write(0x06,CMD)#Entry modeセット
     LCD_write(0x0C,CMD)#表示ON,カーソルOFF,カーソル点滅OFF
     LCD_write(0x28,CMD)#2桁表示,7ドットモード
     LCD_write(0x01,CMD)#Display clear
     sleep(0.002)#waite 2ms

def LCD_clear():
     LCD_write(0x01,CMD)
     sleep(0.002)#waite 2ms

def LCD_home():
     LCD_write(0x02,CMD)
     sleep(0.002)#waite 2ms

def LCD_cursor(x,y):
     if y==0:
         LCD_write(LINE1+x,CMD)
     if y==1:
        LCD_write(LINE2+x,CMD)

def LCD_print(str):
     for c in str:
        LCD_write(ord(c),CHR)

LCD_init()

LCD_clear()
LCD_home()
LCD_cursor(1,0)
LCD_print("Hello World!")
count=0

while True:
     LCD_cursor(1,1)
     LCD_print(str(count))
     count=count+1
     sleep(1)

-------------------------------------------------------------------------
 基本的にMicroPythonのスクリプトと同じなのですが、importの部分をCircuitPythonに合わせて実行すると
「RuntimeError: Function requires lock」というエラーが出てしまいました。
 どうやらCircuitPythonでは、
while not i2c.try_lock():
         pass
という文を入れて、I2C回路接続をロックすることが必要なようです。
これを入れて無事スクリプトが動き、文字がLCD1602に表示されました。
 
ブレッドボードです。


Raspberry Pi Pico CircuitPython OLED表示テスト

2022-04-25 17:37:35 | Raspberry Pi Pico
 Raspberry Pi Pico + CircuitPython + MuIDE環境でOLEDの表示テストをします。
 接続回路図です。
 OLEDは、I2C接続で,SCL=GP21,SDA=20としました。


 まず、OLED表示用のライブラリをCircuitPythonのLibrariesダウンロードページからダウンロードします。赤丸で囲んだmpyファイルをダウンロードします。


 zipファイルを解凍し、解凍したフォルダ内のlibフォルダから、
 adafruit_ssd1306.mpy
 adafruit_framebuf.mpy
をPico(CIRCUITPY)のlibフォルダにコピーします。
 次に、解凍したフォルダ内のexamplesフォルダの中から
 font5x8.binをPico(CIRCUITPY)のルートにコピーします。
 これで、準備完了です。

 スクリプトです。(code.py)
 このライブラリ(ssd1306)は、文字と簡単なグラフィックスを描くことができます。
「Hello World!」と簡単なグラフィックスを表示し、左下に数字をカウントアップして表示します。
----------------------------------------------------------------
"""
Raspberry Pi Pico OLED test
2022.4.25
JH7UBC Keiji Hata
"""
import board
import busio
import time

# Import the SSD1306 module.
import adafruit_ssd1306

# Create the I2C interface.
i2c = busio.I2C(board.GP21, board.GP20)

oled = adafruit_ssd1306.SSD1306_I2C(128, 64, i2c)
#OLED clear
oled.fill(0)

#display rectangle and "Hello World!"
oled.rect(10,0,100,18,1)
oled.show()
oled.text("Hello World!",20,5,1)
oled.show()

oled.pixel(10,25,1)
oled.show()

oled.hline(30,30,20,1)
oled.show()

oled.vline(50,35,20,1)
oled.show()

oled.line(55,30,75,50,1)
oled.show()

oled.fill_rect(80,30,20,20,1)
oled.show()

n=0

while True:
     oled.fill_rect(20,40,30,10,0)
     oled.show()
     oled.text(str(n),20,40,1)
     oled.show()
    n = n + 1
     time.sleep(1)
----------------------------------------------------------------
 文字表示とグラフィックスの説明です。
 c=1で表示、c=0で消去です。
 oled.text(" ",x,y,c) x,yを始点として文字を表示します。
 oled.pixel(x,y,c)    x,yにdotを表示します。
 oled.hline(x,y,w,c)  x,yを始点として長さwの水平な線を引きます。
 oled.vline(x,y,h,c)  x,yを始点として長さwの垂直な線を引きます。
 oled.line(x1,y1,x2,y2,c) x1,y1からx2,y2まで線を引きます。
 oled.rect(x,y,w,h,c)  x,yを始点(左上)として、幅w、高さhの四角形を描きます。
 oled.fill_rect (x,y,w,h,c)  x,yを始点(左上)として、幅w、高さhの四角形を描き、中を塗りつぶします。
 oled.fill(c) 画面全体をc色で塗りつぶします。つまり、c=0で全画面クリア、c=1で全画面白になります。

 ブレッドボードです。


Raspberry Pi Pico CircuitPython I2C scaner とI2C LCD AQM0802A表示テスト

2022-04-24 18:55:15 | Raspberry Pi Pico
 Raspberry Pi Pico + CircuitPython + Mu IDE環境で、I2C LCD AQM0802Aの表示テストをします。

 Raspberry Pi Pico は、2つのI2C モジュールを内蔵しています。
 ピンの組み合わせ[SCL,SDA]は、
 [GP1,GP0], [GP3,GP2], [GP5,GP4], [GP7,GP6], [GP9,GP8], [GP11,GP10], [GP13,GP12],[GP15,GP14], [GP17,GP16], [GP19,GP18], [GP21,GP20], [GP27,GP26]  です。
 今回は、SCL=GP21,SDA=GP20とします。
 回路図です。
 

 まず、AQM0802AのI2Cアドレスを調べます。「電子工作を始めよう」などいくつかのサイトで紹介されている下のスクリプトを実行してみました。
 0x3eが表示されました。


 AQM0802Aは、コントローラにST7032が使われています。ST7032用のライブラリを探してみましたが、Adafuitのライブラリには見当たりませんでした。そこで検索してみると「xshige's beta notes」というサイトにAQM0802A用スクリプトとST7032ライブラリを見つけ、それを試しました。

 上記サイトから、ライブラリをMuエディタにコピーして、ST7032i.pyとしてPicoに保存します。保存先は、ルートでもlibフォルダでも、どちらでもOKのようです。
 Demo ScriptもMuエディタにコピーして、code.pyとしてPicoのルートに保存します。
 実行してみると、無事文字が表示されました。
 コピペしたときにスクリプトのインデントがずれたりして、エラーがでることがあります。その場合は、スクリプトを良く見て修正してください。