ラズパイLinuxからCircuitPythonプログラムを動かす方法を少し前に記事にしたが、PCを直接CircuitPython互換にしてハード制御出来ないものかと探したところ、USBシリアル変換チップのFT232Hを使えば出来ると知り試してみた。
PCをCircuitPython化する仕組み
基本的な仕組みはラズパイLinuxの時と同じで、BlinkaをCPython(PCで動くPython)上で動作させることでCircuitPython化が可能となる。Blinkaは、I2CやSPIなどのインタフェースやGPIOの機能が付いた高機能USBシリアル変換チップのFT232Hを介してハードウエアを制御する。
各社からFT232Hを搭載したモジュールが販売されており、CircuitPythonの開発元であるAdafruit社からも出ているが、秋月電子の物が比較的リーズナブルだと思う。
PCにBlinkaをインストールする
Blinkaのインストール方法はAdafruit社の解説記事に詳しく書かれている。
かなり丁寧に書かれており、環境によっては冗長な部分もあるようだ。手元のLinux環境(Ubuntu20.04)ではudevの設定をしなくても普通に動いたし、Windows10ではpyusbバグフィックスも不要だった。
- Windows:
https://learn.adafruit.com/circuitpython-on-any-computer-with-ft232h/windows - Linux:
https://learn.adafruit.com/circuitpython-on-any-computer-with-ft232h/linux
以下、手元で実際に行ったことを簡単にまとめておく。
USBドライバの変更(Windowsの場合)
Windowsの場合はZadigによるUSBドライバの変更が必要。以下の手順を実行する。
- Zadigをここからダウンロードする
- FT232HをUSBに接続する
- ダウンロードしたEXE(zadig-xx.exe)を実行
- ZadigのメニューでOptions->List All Devicesをチェックする
- ドロップダウンでFT232Hのデバイスを選び、DriverはlibusbKを選択する
- Replace Driverボタンを押す
pipでBlinkaをインストール
自分の環境ではWindows10、Ubuntu20.04の両方共pip一発でインストール自体は完了した。
pip3 install adafruit-blinka
必要なPythonモジュールpyftdiやpyusbpyftdiは依存関係を辿ってpipが自動でインストールくれた。(Adafruit社の解説では個別にインストールするよう指示されているが)
環境変数の設定
Blinkaは自動でFT232Hを検出することはしてくれないので、環境変数の設定が必要。
Windowsコマンドプロンプトの場合
set BLINKA_FT232H=1
Windows Power Shellの場合
$env:BLINKA_FT232H=1
Linux(bash)の場合
export BLINKA_FT232H=1
Blinkaの動作チェック
Blinkaをインストールし、環境変数を設定したら準備完了。Pythonの対話モードから以下を実行する。
import board
board.board_id
board.board_idの値として’FTDI_FT232H’が返ってきたらBlinkaは正常動作している。
$ python3
Python 3.8.10 (default, Mar 15 2022, 12:22:08)
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import board
>>> board.board_id
'FTDI_FT232H'
>>>
FT232Hのピンアサイン
FT232Hのピンアサインは下の表の通り。
I2C | SPI | GPIO | 備考 |
---|---|---|---|
SCL | SCLK | GPIOとしては利用不可(D0) | |
SDA※ | MOSI | GPIOとしては利用不可(D1) | |
SDA※ | MISO | GPIOとしては利用不可(D2) | |
Blinkaでは無効化されている(D3) | |||
D4〜D7 | GPIO入出力として利用可 | ||
C0〜C7 | GPIO入出力として利用可 |
※SDAはD1とD2をショートさせる必要あり
I2CとSPIのピンは予め決め打ちされ排他でしか使えないのと、GPIOとしての利用も出来ないので注意。GPIOはD4〜D7・C0〜C7の合計12本使え、全て入力と出力のどちらとしても使用可能。
ピン名はboardモジュールに定義されており、dir関数で確認出来る。
import board
dir(board)
LEDを点灯させる
さて、お約束のLチカをやってみよう。以下のようなプログラムで、まず変数gpioをD7ピンで使えるように初期化する。
import board
import digitalio
gpio = digitalio.DigitalInOut(board.D7)
gpio.direction = digitalio.Direction.OUTPUT
あとは変数gpioを介してD7ピンの制御が可能。D7ピンに抵抗を介してLEDを接続していれば、LED点灯は、
gpio.value = True
消灯は、
gpio.value = False
で可能。
I2C接続のSSD1306ディスプレイを動かす
ラズパイPicoやラズパイLinuxでも試したSSD1306ディスプレイを動かしてみよう。
FT232HでI2Cを使う時はSDA端子としてD1とD2をショートさせる必要があるため注意。
ドライバはpipで一発インストールOK。(必要な物が芋づる式にインストールされる)
pip3 install adafruit-circuitpython-ssd1306
プログラムはラズパイで試した時と全く同じ物で動いてくれた。
import board
import busio
import adafruit_ssd1306
i2c = busio.I2C(board.SCL, board.SDA)
display = adafruit_ssd1306.SSD1306_I2C(128, 64, i2c)
display.fill(0)
display.show()
display.text("Hello world!", 0, 0, 1)
display.show()
Jupyterからも使える
CPythonからCircuitPythonが使えるという事は…Jupyterからも使えるということ!電子工作のプログラミングではコードの断片をちょこまか実行する事が多く、個人的にはJupyterと電子工作の相性はバッチリだと思う。
まとめ
最近のマイコンのプログラミング環境はだいぶ充実してきたとはいえ、やはりPCから直接ハードをコントロール出来た方がデバッグには便利。今回試したCircuitPythonの仕組みを使えば、PCでデバッグしてからマイコンに作り込む、という流れで作業出来るため非常に効率的だ。Jupyterから使えるのも嬉しい。
少し前の記事で試したラズパイを使った方法よりも更に便利そうなので、再びラズパイはホコリをかぶることになりそうな予感がする(笑)
コメント