virt_flyのブログ -34ページ目

virt_flyのブログ

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

 

 

CO2濃度をグラフ表示 電池駆動に問題

 

CO2センサーでこしらえたとした二酸化炭素濃度測定器のことなんですが、濃度の表示だけで済ますなら無線まで積んだRaspberry Pi Zero WHを使うのはもったいない。Picoに置き換えれば、電池駆動、軽量化も図れるのではないかと考えました。

 

新型コロナの扱いがいよいよ5類に引き下げかという時に、まだ感染対策なんて言ってるのと言われそうですが、医療現場では結構厳しい状況があって、職員の感染、濃厚接触が同時多発、勤務者が少なくなり夜間の急患受付をやむなく中止したなどの例も出ています。注意はまだまだ必要です。

 

さておき、先立ってPicoで作る二酸化炭素濃度測定器の例をネットで調べることにしました。ユニークな例があるものです。なんと、グラフで濃度の変化を表示してくれるというのです。cyn1953さんのラズベリーパイpicoでCO2測定④フリスクサイズのCO2モニターです。

 

Zeroで作った際は、MH-Z19Bのライブラリを使わせてもらったのですが、このケースではもちろんOLEDのライブラリは使うもののセンサーのライブラリは使わず、main.pyの記述で済まされています。CO2センサーの部分は、SamAkadaさんのRaspberry Pi PicoでCO2濃度を測定するからコードが利用されています。

 

簡潔なプログラムながら、グラフは可愛らしく、電池駆動ができたらこれでいいかも。

 

Picoへの給電はVSYSピンで
 
Raspberry PI Picoへの電源供給は、USB給電以外にもPicoのVSYSピンに電池の+、GNDピンにーををつなぐことで可能と言われています。乾電池を2本直列につなぎ試してみたところ、問題発生です。

 

異常に高い数値が示されるのです。ケースにもより数値が乱高下したり、よく見ると34304という数値が固定的に表示されるケースでは、起動時に一瞬表示される数値に似ており、センサーを外してみたときの数値と同じようです。乾電池1個ではOLEDは点灯しないし、3個にしてみても解消しません。

 

モバイルバッテリーをつなぐしかないのかと思えば、消費電力が少ないと、バッテリーのeco機能が働くらしく給電がストップしてしまいます。

 

これは想定外のことでした。LEDを点灯させることくらいはよしとしても、センサーの値に信頼がおけないとなると、はたと困ることになったものです。


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エラーの対処方法も紹介