FT232HでCircuitPythonのプログラムをPCから直接動かす

ラズパイLinuxからCircuitPythonプログラムを動かす方法を少し前に記事にしたが、PCを直接CircuitPython互換にしてハード制御出来ないものかと探したところ、USBシリアル変換チップのFT232Hを使えば出来ると知り試してみた。

スポンサーリンク

PCをCircuitPython化する仕組み

基本的な仕組みはラズパイLinuxの時と同じで、BlinkaをCPython(PCで動くPython)上で動作させることでCircuitPython化が可能となる。Blinkaは、I2CやSPIなどのインタフェースやGPIOの機能が付いた高機能USBシリアル変換チップのFT232Hを介してハードウエアを制御する。

FT232HからCircuitPythonを使う

各社からFT232Hを搭載したモジュールが販売されており、CircuitPythonの開発元であるAdafruit社からも出ているが、秋月電子の物が比較的リーズナブルだと思う。

403- 現在メンテナンス中です。

PCにBlinkaをインストールする

Blinkaのインストール方法はAdafruit社の解説記事に詳しく書かれている。

かなり丁寧に書かれており、環境によっては冗長な部分もあるようだ。手元のLinux環境(Ubuntu20.04)ではudevの設定をしなくても普通に動いたし、Windows10ではpyusbバグフィックスも不要だった。

以下、手元で実際に行ったことを簡単にまとめておく。

USBドライバの変更(Windowsの場合)

Windowsの場合はZadigによるUSBドライバの変更が必要。以下の手順を実行する。

  1. Zadigをここからダウンロードする
  2. FT232HをUSBに接続する
  3. ダウンロードしたEXE(zadig-xx.exe)を実行
  4. ZadigのメニューでOptions->List All Devicesをチェックする
  5. ドロップダウンでFT232Hのデバイスを選び、DriverはlibusbKを選択する
    Zadigダイアログ
  6. 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のピンアサインは下の表の通り。

I2CSPIGPIO備考
SCLSCLKGPIOとしては利用不可(D0)
SDA※MOSIGPIOとしては利用不可(D1)
SDA※MISOGPIOとしては利用不可(D2)
Blinkaでは無効化されている(D3)
D4〜D7GPIO入出力として利用可
C0〜C7GPIO入出力として利用可

※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

で可能。

FT232HでCircuitPython_Lチカ

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()
FT232HでCircuitPython_SSD1306表示

Jupyterからも使える

CPythonからCircuitPythonが使えるという事は…Jupyterからも使えるということ!電子工作のプログラミングではコードの断片をちょこまか実行する事が多く、個人的にはJupyterと電子工作の相性はバッチリだと思う。

CircuitPythonOnJupyter

まとめ

最近のマイコンのプログラミング環境はだいぶ充実してきたとはいえ、やはりPCから直接ハードをコントロール出来た方がデバッグには便利。今回試したCircuitPythonの仕組みを使えば、PCでデバッグしてからマイコンに作り込む、という流れで作業出来るため非常に効率的だ。Jupyterから使えるのも嬉しい。

少し前の記事で試したラズパイを使った方法よりも更に便利そうなので、再びラズパイはホコリをかぶることになりそうな予感がする(笑)

コメント