virt_flyのブログ -31ページ目

virt_flyのブログ

フライトシミュレーターソフトのFlightGearで仮想飛行を楽しむブログです。


CircuitPythonをためす

 
 

 

 

Raspberry Pi Picoでは、プログラミングの際してMicroPython以外にもCorcuitPythonが使われるということで、こちらも試してみることにしました。

 

 

 

1)Raspberry Pi Pico本体の初期化

 

Raspberry Pi Picoを使いまわしすることにしたため、ファームウェアがMicroPythonのままではだめなので、初期化をおこないました。

 

①raspberrypi.comのサイトを開き、[Documentation]、次いで[Microcontrollers]をクリック、今回は[Raspberry Pi Pico and Pico W]を選択。

 

 

開いた「Raspberry Pi Pico and Pico W」の画面をスクロールアップして、「Software Utilities」の項を探し、その中の「Resetting Flash memory」にある「・Download the UF2 file」の[UF2 file]をクリックして、「flash_nuke.uf2」ファイルをダウンロードします。

 

 

②Raspberry Pi Pico本体の「BOOSEL」ボタンを押しながら、PCとUSBケーブルで接続。表示された「RPI-RP2」ディレクトリのウインドウに、ダウンロードした「flash_nuke.uf2」ファイルをドラッグ&ドロップしたら、初期化は完了です。

 

 

2)CircuitPython

 

①circuitpython.orgのサイトを開き、[Downloads]をクリック、使うボードの入力が必要なので、ここではPicoの画像をクリック。「Pico by Raspberry Pi」の画面が開いたら、languageはJAPANESEを選択し、[DOWNLOAD.UF2 NOW]を実行して、CircuitPythonのuf2ファイル(ここの例では「adafruit-circuitpython-raspberry_pi_pico-ja-8.0.5.uf2」)をダウンロードします。

 

 

②開けた「RPI-RP2」ディレクトリのウインドウに、ダウンロードしたCircuitPythonのuf2ファイル をドラッグ&ドロップします。「CIRCUITPY」名の画面が開き、ディレクトリが見れるようになっています(以後ファイルマネージャーからいつでも開け、ファイルをドラッグ&ドロウで操作できるように)。

 

 

③Thonnyを起動し、右下のインタプリタの表示部分をクリックし、[CircuitPython]を選択します。

なお、ここではThonnyをエディタにしていますが、一般的には「Muエディタ」がよく使われているようです。

 

Thonnyのウインドウの右上にある[表示]をクリックし、開いたプルダウンメニューから[ファイル]を選ぶと、ウインドウの左側にファイルの枠が現れます。すでにcode.pyなどのファイル、空のlibディレクトリができています。

 

 

Code.pyは、MicroPythonでのmain.pyにあたりますま。ここでは、たった1行「print("Hello,World!")」と書かれていました(実行すると、Thonnyのウインドウ下部のShellの枠内にHello,World!と表示されます)。

 

CircuitPythonであろうとMicroPythonであろうと、Thonnyを使う限り、保存などの操作は同じですが、CircuitPythonの場合は、ファイルマネージャーで「CIRCUITPY」が開け、ファイルのをドラッグ&ドロップができて便利です。

 

Thonnyだと、pyファイルなら読み込み、書き出しが可能なものの、画像ファイルなど他のファイルは扱えず、Raspberry Pi Picoに転送ができません。転送には「Ampy」などのツールが必要になるらしいので、その必要がないCircuitPythonは大いに助かります。

 

もとより、Raspberry Pi Picoはメモリ容量が乏しく、重い画像ファイルを扱うことはあまり想定されなかったのかも。メモリが4〜16MBもある安価な互換機が販売されていたのでAliexpressを通じて注文したのですが、画像処理を行うPillowのライブラリがCircuitPythonにも見当たらない…。

 

 

3)ライブラリのダウンロード・追加

 

さて、ライブラリはどうすればよいか、おなじみの0.9インチSSD1306のOLEDを使用する例を記します。

 

①OLEDを使うcode.pyは次の通り
 

import board
import busio
import digitalio
import adafruit_ssd1306
WIDTH = 128
HEIGHT = 32
i2c = busio.I2C(board.GP17, board.GP16)
oled = adafruit_ssd1306.SSD1306_I2C(WIDTH, HEIGHT, i2c, addr=0x3C)
oled .fill(0)
oled .text("RPI Pico test", 25, 7, True, font_name="font5x8.bin", size=1)
oled .text("VIRT_FLY", 41, 25, True, font_name="font5x8.bin", size=1)
oled .line(0, 21, 128, 21, True)
oled .rect(0, 0, 128, 20, True)
oled .show()       

 

至極簡単そうに言ってますが、CircuitPythonでプログラムを書くなんてはじめてものにできるわけがなく、MicroPythonで書いたプログラムをChatGPTにCircuitPythonのプログラムに書き直させ、一部手直ししたものです。MicroPythonで使っていたmachineがCircuitPythonでは使えず、かわりにboardやbusioなんて文字が出てくるのですから。

 

②Adafruit社のライブラリのダウンロードページを開きます。

 

 

circuitpython.orgサイトを開き、[libraries]をクリック。開いたライブラリのページを下へスクロールして、紫のダウンロードボタンを見つけ、ダウンロードすべきバージョンのボタンを探します。ダウンロードすべきバージョンが何なのかは、立ち上げたThonnyのウインドウ下部のShellの枠内に表示されたCircuitPythonの文字につづく数字で確認できます。今回は「CircuitPython 8.0.5」だったので、バージョン8のボタンをクリックします。「adafruit-circuitpython-bundle-8.x-mpy-20230425.zip」と書かれたボタンがそれ。同名のzipファイルがダウンロードされます。

 

③ダウンロードした圧縮ファイルを解凍。解凍してできたフォルダの中のlibフォルダ内から追加すべきライブラリ、ここでは「adafruit_ssd1306.pympy」ファイルを探し、別途開いたRaspberry Pi Pico中の「CIRCUITPY」ディレクトリ下「lib」ディレクトリ内にドラッグ&ドロップします。

 

ライブラリの追加完了のはずなので、code.pyを実行してみます。「adafruit_framebuf.mpy」がないというエラーが生じたので、先のライブラリ同様にlibから「adafruit_framebuf.mpy」を探し出してlibへドラッグ&ドロップしてコピーします。

 

再度code.pyを実行。今度は「font5x8.bin」がないというエラー。今度は「examples」から「font5x8.bin」を探し出して、code.pyのあるディレクトリへコピー。

 

これで、前回の冒頭に掲げた写真と同様なOLEDの画面が表示されます。

 

 

 

↑Raspberry Pi Picoに0.96インチSSD1306 OLEDを接続しテキストを表示

 

Raspberry Pi Picoにパッケージ(ライブラリ)をインストールするには

 

Raspberry Pi Picoをさわってみてまず頭に浮かぶのは、少し複雑なプログラムだとライブラリが必要になるはずだけど、Picoではどうすれば使えるようになるのだろうということでした。

 

あいにく手元に使えるRaspberry Pi Picoがなかったので(光るアクリル板の発光色のグラデーションのために専用としてしまったため)、とりあえずはネット検索。が、Thonnyを使うのだとか、libディレクトリにコピペするのだとか、いろいろ出てきてわからなくなるばかり。

 

注文していたでRaspberry Pi Picoが届いたので、とりあえず、まだ理解しやすかったThonnyを使う方法から試すことにしました。

 
 

●Thonnyで「PyPlを検索」を使う方法

 

その方法は以下の通り。ここでは、Raspberry Pi Picoで有機ELディスプレイ(OLED)の使用を例にしています。OLEDには定番であるSSD1306 搭載の0.96インチ解像度128x64ドット のOLED モジュールを使用します。

 

①開いたThonnyの左上にある[ツール]をクリック、ドロップダウンメニューから[パッケージを管理...]を選択

 

 

②次いで開いたウインドウで、インストールしたいパッケージ(ライブラリ)名を一部でも良いので入力して、[PyPlを検索]を実行

 

 

③検索結果が表示されるので、ここではMicroPython環境で使用する「SSD1306」用ライブラリをインストールしたいので、「micropython-ssd1306」をクリック

 

 

④インストール実行画面に替わるので、[インストール]をクリック

 

 

⑤インストールが無事完了すると、ウインドウ左の「<インストール>」の枠内に、パッケージ(ライブラリ)がリストで表示されます。これをクリックすると詳細情報が確認できます

 

 

⑥これでパッケージ(ライブラリ)の追加は完了なので、[閉じる]を押して終了します

 

パッケージ(ライブラリ)がインストールできたら、次はThonnyでmicropythonプログラムの作成です(次のスクリーンショット)。冒頭の画像は実行結果です。

 

 

●インストールしたパッケージ(ライブラリ)はどこにある

 

インストールされたパッケージ(ライブラリ)どこにあるのでしょう。

 

Thonnyをあちこちいじっていてわかったのですが、Raspberry Pi Picoの中を覗く方法がありました。

 

①Thonnyの左上にある[ファイル]をクリックし、ドロップダウンメニューから[開く]を選択すると

 

 

②パソコンかRaspberry Pi Picoかのどちらを開くかを尋ねるダイアログボックスが現れます。

 

 

③[Raspberry Pi Pico]をクリックすると、Raspberry Pi Picoのディレクトリが表示され、中を覗くことができます。

 

 

○今回の例ではlibディレクトリ下に当該パッケージ(ライブラリ)のssd1307.pyというOLEDのドライバが確認できます。

 

 

 

●その他の方法

 

ネット検索した際に、libディレクトリにインストールしろとしていたのは、こういうことだったのでしょう。Thonnyで「PyPlを検索」を使わなくても、ダウンロードしてきたパッケージ(ライブラリ)をlibディレクトリに置くことができればよいわけです。また、一般的にはlibディレクトリでしょうが、かならずしもそうである必要はなく、そうした例も見受けられました。

 

なお、Thonnyの「PyPlを検索」を使わないでパッケージ(ライブラリ)をインストールするには、Thonnyでは少なくともmain.py同様に入力し書き込む方法がとれます。それ以外では、ChatGPTに教えてもらったのですが、「MicroPythonのREPL」を選択し、開いたREPLコンソールからコマンド入力でインストールする方法があるようです。まだよくわかってないので、行けるところまではわかる方法で行くことにします。

 

 

※もう一つのパーミッションエラー

 

前回ブログでRaspberry Pi Picoを取り上げたときに、UbuntuでThonnyを実行しようとして遭遇したパーミッションエラーとそれへの対処法を記しましたが、今回は同じ Permission denied: '/dev/ttyACM0'というエラーでも、なにやらdialoutグループに名前を追加せよ、みたいなことが表示されています。

 

言われるまま、下記を実行(○○○○にはThonnyを動かしているPCのログイン時のusernameを入力)することで、問題は解消しました。

 

 $ sudo usermod -a -G dialout ○○○○

 

 

今回の記事の主たる参照先は次の通り

ラズパイPicoの使い方 MicroPython&開発環境Thonny、SSLエラーの対処方法も紹介

↑本物のニキシー管単管時計 午後7時5分を1桁づつ表示している

 

ニキシー管はウクライナから輸入

 

■高いニキシー管時計を安く手に入れる

 

欲しくなると我慢できなくなる性分。ならばさっさと手に入れればいいのに、優柔不断なのが情けない。

 

かつて盛んに製造されていたニキシー管も今ではデッドストックとなっていたものしかない有様。サイバーパンクな雰囲気を醸し出すニキシー管に人気が出て、新たにニキシー管をつくるところも出てきてはいるもののまれな例であり、いずれにしても随分高価なものとなってしまいました。

 

サイバーパンクといえば、近未来都市のモデルであった80年代の日本を思い出し、個人的には結構郷愁を抱いたりしているので、ニキシー管時計にはかなり魅力を感じます。が、いくつものニキシー管を使うものはあまりに高価(安くても2万円近くするようになってきた)で購入には躊躇します。

 

ニキシー管もどきをつくってみたり回り道のあげく、単管のニキシー管時計なら許されるのではとの勝手な理屈でとうとう買うに至りました。
 
しみったれた話です。それでも今どき時計にそれほどの支出をするかという金額になります。
 
単管のニキシー管時計は、中国製のものが比較的安いのですが、ニキシー管自体は手に入る多くがIN-14でたいがい旧ソ連製。今のご時勢からして、ロシアのものを買うのは気が引けるし、Aliexpressでは安くない。そこで、時計の台となるDCブーストモジュールは中国製を購入、別売のニキシー管はIN-14よりは少し高いがIN-8-2をウクライナから直接取り寄せることにしました。
 
これだとDCブーストモジュールが2,300円前後、IN-8-2が約3,200円+送料と、支出も少しは抑えることができます。
 
 
↑ウクライナからニキシー管が無事届いた
 
ウクライナからの輸入は戦争中のため、いつ届くかわからないようですが、25日程度で無事届きました。

 

さっそく組み立て、と言っても、ニキシー管とUSB電源ケーブルを時計の台となるDCブーストモジュールに差し込むだけ。

 

台となるDCブーストモジュールは、USBコネクタが真後ろとなる位置にした向きが正面で、ニキシー管の正面を合わせて装着します。
 
↑ニキシー管IN-8-2
 
ただし、ニキシー管についている足(ピン)はヒゲのように針金が管球から細長く伸びていて、これを5〜10mmの長さに切らないとなりません。
 
しかも針金はグニャグニャで絡み合い真っ直ぐに伸ばすのが困難であり、一度にすべてのピンをソケットに挿すのは無理。
 
ピンの長さを少しづつ変えてカットし、長いピンから一本一本順番に挿入するしかなさそうですが、これが結構難しいです。ピンの長さの差が大きすぎると短いピンが届かなくて電気が流れず光らない数字がでてきて閉口します。

 

 

■時刻合わせ―説明書が付いていない

 

通電したら、時刻合わせの必要がありますが、説明書など一切添付されておらず困りました。
 
Aliexpressで似たような製品を販売しているサイトから説明書きを探してきて、それを参考に時刻合わせをすることができたので、メモを残します。
 
↑ニキシー管単管時計を真上から見た画像
 
①このニキシー管時計には2つのボタンがあり、奥側の「SEL」というボタンは選択キーと電源ボタンを兼ねたキー、手前側のボタンが「+」キーとなっています。
 
②SELキーを押して電源を入れます
 
③まづ最初に「+」キーを押し続け、2つの数字が繰り返し表示されるまで待ってから離すと、設定状態に入ります。このとき表示された数字は、西暦の下2桁(00~99)に相当するものです。
 
④次に、「+」を短く1回押すと2桁の数字が1増えますので、現在の西暦の下2桁になるまで、何回か押して合わせます。2099年までは使えそうですね。
 
⑤西暦が設定できたら、今度は「SEL」キーを短く1回押して月(01~12)の設定を行います。
 
⑥同様にして、「SEL」キーを短く1回押すごとに日(01~31)、曜日(?)(注1)、時(00~23)、分(00~59)、秒(00~59)が順番に設定できます。
続けてさらに、ニキシー管の下で点灯するRGB LEDの色を調節することもできます。
 
⑦最後の項目まできたら、「SEL」キーを押すことで設定状態は終わります。また、「SEL」キーを押し続ければ、いつでもシャットダウンして設定状態を終わらせることができます。
 
 
■表示の切り替え
 

↑秒の表示モード 斜めから見ると数字の表示に奥行きがあるのがよくわかります

ニキシー管の表示は、時刻、年月日、秒の3モードがあり、通常(非設定状態の時)は、「SEL」キーを押すことで順番に切り替わります。
 

単管時計の時刻や年月日の表示は、無点灯を挟むことで区切りをはっきりさせていて、表示の始まりがわかりやすくなっていることを今回知ることができました。

 

↑時、分を1桁づつ表示したら無点灯をはさみ、また時、分の表示がはじまり時刻がわかりやすい

 

本物はやはり本物。明るいし、表示される数字には奥行きがあって、LCDを使ったニキシー管もどきとは違います。高さ6.4cm、直径5cm、ニキシー管自体の直径は1.7cmで、思ったより小さく可愛いこともあって、ニキシー管1個では少々寂しい気はします。

 

 

注1)曜日の設定時に、01から06までは表示できるが、7を選択しても07が表示できず曜日の表示には不足するのは、不具合がおきていると考えるべきなのかもしれません。

(以下追記)

最初に見つけた説明書では、本来01~07と書かれてしかるべきところここだけ空欄なのがそもそもあやしい。別種の商品の説明書にはしっかりと書かれています。

それでも、7を選択すれば07が表示されずとも、通常状態(非設定状態)では07が連続して表示されますから、実用上は問題ありません。