MiroPythonと8×8シリアルLEDで焚き火ランプ

焚き火の炎は予測不能な変化があって飽きることなく見ていられますね。予測不能でも完全な乱数とは違って、滑らかな変化の中に期待を裏切る変化が混じる点が飽きさせないのだろうと思います。8×8シリアルLEDが比較的安価に手に入るようになったのでMicroPythonで焚き火風な卓上ランプを作ることにしました。

落ち葉の焚き火

動画

使用するマイコンボードはRaspberry Pi Picoと同じRP2040マイコンを使っているWaveshare RP2040-zeroです。後継のRP2350マイコンが出てきたので探せばさらに安価に入手できるようになりました。

パーリンノイズは、コンピュータグラフィックスで炎や煙や雲を表現するのによく使われていると、wikipediaに書かれていて、MicroPython用のライブラリ “perlin.py” が公開されています。このライブラリをダウンロードしてマイコンのメモリに保存します。

シリアルLED用のライブラリ “neopixel.py”もダウンロードしてマイコンのメモリに保存します。

作成したプログラムではパーリンノイズで8×8のLEDの場所の温度が2次元的に変化するのですが、 (1)温度が上がるにつれて赤→黄→白に変化する256色のカラーパレット(heat_color)と、(2)8×8 LEDの中心ほど熱くなる(led_base)、(3)時間的にも明るさが変化する(intensity)という細工を入れています。

なお、今回使用した8×8 LEDは左上が0番で右上が7番、一行下が8番から15番というようにシンプルに配線されていて、X列Y行のLED番号は(Y x 8) + X で指定できます。LEDの信号ピンは29pinです。

 

 

 

 

 

 

 

 

 

 

 

 

電子工作用ブロック言語 Piper Make について

最近はコンパイル無しで気軽にプログラミングができるMicroPythonを使うことが多いのですが、小中学生に自由に試行錯誤しながらプログラミングの楽しさを体験してもらうには、MicroPythonでもまだもう一段ハードルがあるような気がしています。

先日、二人の中学生にMicroBitを使ったロボットカーのプログラミングを体験してもらいました。Scratchでブロック言語にはなじんでいるようで、特に使い方を説明することなくロボットカーの衝突回避動作を2時間ぐらいで完成させていました。MicroBitも良いのですが、基板が大きいことと、ブレッドボードでは使いにくいこと、さらに値段が安くないことなどがあって講習会用の機材としては使いづらいと感じています。

電子工作向きの、できればMicroPythonへのステップになるようなブロック言語はないものかと検索してみると、Piper Makeを試してみたよ、というようなレポートが何件か見つかりました。

 

Piper Makeのホームページ

ホームページの他に有力な情報は
SunFounder
Amazonでキットも販売しています。

Piper Makeはいわゆるブロック言語です。シンプルなLEDのON-OFFを試してみます。Pico Wの15ピンにLEDを接続して適当な抵抗を介してGNDに戻します。

Pico W Blink ai 15 pin

pin 15を1秒間隔でOn-Offしています。Scratchを使ったことがある人であればほとんど違和感は感じないでしょう。

ウィンドウの下部には四つのタブがあって”DIGITAL VIEW”ではPicoのイラストで15pinが色が赤と黄色に変化します。
“CONSOLE”はPicoからの応答が表示されます。”DATA”は今のところ”?”です。

“PYTHON”はブロックコードをPythonコードに変換したものを見ることができます。3行目に”from piper_blockly import *”と書いてあることを覚えておいてください。

さて、USBメモリのようにCIRCUITPYというドライブが接続されています。boot_out.txtを見るとAdafruitのCircuitPythonのバージョン7.0.0-115がインストールされているようです。CircuitPythonの最新バージョンは9.1.4ですから2年前の古いまま使っていることになります。きっと定期的に更新をするのでしょう。

2024.12.15時点ではCircuitPythonのバージョン9.0.0(2024-10-04)になっていました。新しいPico2(rp2350マイコン)への対応を準備しているようですが、Pico2にはまだPiper MakeからCONNECTして使うことはできないようです。

ここまでで理解できたことは、WebブラウザのブロックコードをCircuitPythonに変換してシリアル通信でPicoのCircuitPythonに1行づつ送っているようです。Piper Make特有のコマンドはライブラリ”piper_blockly”は、CIRCUITPYドライブでは見えないCircuitPythonのファームウェアの近くに置かれているのだろうと思います。

さて、コードを自動実行する方法は、CircuitPythonではcode.pyに書けば良いとのことです。オリジナルのcode.pyはファイル名を”_code.py”と変更しておいて、PYTHONタブのコードを”code.py”として保存すればOKです。

ここまでで”Piper Make”にかなり親しみを感じることができました。

プログラムの保存はかなりクールです。

名前をつけてDOWNLOADボタンを押すとブロックコードのPNG画像ファイルとして保存されます。

PIN形式の仕様で独自のチャンクを書き込むことができるのですが、おそらくPythonコードを埋め込んでいるのでしょう。”import project”でPNGファイルを読み込むと実際にプログラムが動きます。

<<<関数>>>

関数も使うことができます。ラズパイPicoと同じマイコンrp2040を使っているWaveshare RP2040 ZeroというマイコンボードでもPiper Makeを使うことができますので、Waveshare RP2040 ZeroにフルカラーLEDマトリクス(4x4)を接続した例で関数を使った例を示します。

OLYMPUS DIGITAL CAMERA

フルカラーLEDマトリクス(4x4)はシリアル接続なので、下の図のような順番で並んでいます。このままでは思った場所のLEDを点灯することが難しいので、左上を(0,0)とした2次元座標で指定できる関数を作ります。関数にxとyを入力するとLEDの番号(count)を返します。

xが0の時には、count = 4 – y
xが1の時には、count = 5 + y
xが2の時には、count = 12 – y
xが3の時には、count = 13 + y

4×4だけなら四つの場合分けでも、そんなに煩雑ではありませんが、将来8×8のマトリクスを使いたいので、xが偶数と奇数に分けます。

xが偶数の時は、count = x*4 +(4- y)
xが奇数の時は、count = x*4 + (y+1)

一応希望通りの関数を作ることができますが、変数がグローバルで指定されている点に注意です。Piper MakeのシリアルLEDの番号付けは1から始まるのでPythonコードでは1を引いています。

<<マイクで音声認識>>

マイク用のブロックがあるのでPicoにマイクを接続するのかと想像しましたが、PCのマイクにアクセスして音声認識ができます。

きっと、カメラでのジェスチャー認識もPC側のカメラを使うのだろうと思います。

<<Pythonコード>>

ブロックコードが面倒な時にはPythonのコードを直接記述することができます。

4×4 LEDマトリクスに表示するデータをリストで与えます。

code_list_imageという名前でブロックコードになりました。

custum python codeのブロックがあるおかげで柔軟に対応できそうな気がします。

とりあえずこんな感じで理解してみました。(2024.10.1)

さらに気がついたことのメモ

ブロックをコピーして他のプロジェクトにペーストすることができる。

neopixelのセットアップでは255個までしか設定できないけれど、別のピン番号で256個定義するパイソンコードを作れば動く。

メインのプログラムでセットされていない変数は、関数内でローカル変数として使える。

PYTHONタブの右上のアイコンをクリックするとPythonコードがマイコンに保存され、電源投入時およびPimerMake停止時に自動起動する。

 

第1回 LabVIEW Knowledge Exchange(2024年9月20日 )

日本LabVIEWユーザー会とNIが協力してユーザーが参加する新しいかたちのイベントを始めました。

第1回目のイベントの様子は次のリンクにまとめられています。各セッションで使用したスライド / 資料のリンクもありますので、当日の様子をさらに詳しく知ることができます。

2024年9月20日 第1回 LabVIEW Knowledge Exchange開催報告

私が話させていただいた内容は、関連プログラムも含めてダウンロードすることができます。

MicroPythonでLabVIEWをもっと楽しもう

32X32画素のドット絵ディスプレイ完成

「32×8のフルカラーLEDマトリクスを4枚連結して32×32の表示器に(MicroPython)」の続編です。

ディスプレイをIKEAのフレームに納めました。光を和らげるためにダイソーのPPシート(乳白色、両面つや消し、0.75/390×550mm)をLEDパネルの前に置いています。

外部電源から給電しているときにUSBケーブルでPCと接続できるようにマイコンボードをラズパイPicoに変更しました。

外部電源のACアダプターは5V 4AのPSE認証付きのものを使っています。

配線
外部電源  5V — LEDパネル 5V, Pico VSYS
外部電源  GND — LEDパネル GND, Pico GND
Pico GP14(19pin) — LEDパネル DIN

ドット絵のデータを別ファイルで管理できるようにプログラムを変更しました。

メインプログラム
ファイル名でドット絵のデータを指定します。画像によってスクロール方向を変えるためにforループの昇順や降順(reversed())を指定します。

ピクセルの(x,Y)座標とシリアルLEDの番号を変換する関数

ドット絵のファイルを読み込む関数

ドット絵ファイルは表計算ソフトでCSV形式で保存して、拡張子を.pyに変更しました。こうすることでThonnyでファイルを開いてPicoに保存することができます。ドット絵は96×32でパレット番号を記入します。’palette’と書かれた1行後からパレットのデータをパレット番号、R値、G値、B値で指定します。

ラズパイpico内部に保存されたファイル(左下の枠内)

 

 

 

 

 

32×8のフルカラーLEDマトリクスを4枚連結して32×32の表示器に(MicroPython)

32×8のフルカラーLEDマトリクスは文字の大きな時計を作るのによく使っています。LEDマトリクスの値段は2022年5月の時点で2799円でした。

今回はそれを見ていたKさんから4枚連結して32×32でドット絵の表示器を作りたいとのリクエストがありました。それなりの値段になるので、Aliexpressで探すと1150円です。

32×32=1024個のLEDは全てフルに点灯するわけではありませんが、USBからの給電では不安なので5V 4AのAC/DCアダプター電源を使います。コネクタを使って4枚を連結します。

OLYMPUS DIGITAL CAMERA
OLYMPUS DIGITAL CAMERA

4枚を横に並べてコネクタで接続するとLEDは直列に接続されるので楽なのですが、縦に並べると下の絵のようになります。

(x,y)を指定するとLEDの番号がわかる関数serial_pos(x,y)を作って対応します。ドット絵のデータはimage1に書きます。1024個のデータなので大変だろうと思いましたが、エクセルファイルにドット絵を書き出すプログラムが公開されているようなので、カンマ区切りで出力してコピペの後少し修正すればそんなには面倒では無いようです。色はpalette14で指定します。

 

 

 

 

 

 

 

 

 

 

ラズパイPicoとMicroPythonでPWMコントローラー

PWM制御端子のあるクーリングファンで垂直風洞を作りました。JAXAの手作り風洞のパラメータを参考にして、ファンから少し離してハニカムの整流板を取り付けました。
https://www.yac-j.com/wp-content/themes/yac/pdf/labo/list/5.Experiment/5-8.pdf

翼付きの種子が風洞内で回転する様子を観察するための風洞なので、15cmの高さで風速が1/3、45cmの高さで風速が1/6になるように、開口を広げています。透明シートは100円ショップのB4サイズのカードケース(ハードタイプ)を使いました。

ファンは120mm角38mm厚で12V 2.1AのSanyo Denki America Inc.製の「9GV1212P1G01」(7500円程度)です。(1号機ではPC用で大風量のファンと言われている「CFY-12038PF」12V 0.45Aを使ったのですが、もっと風量が欲しかったので変更しました。)PWMは25kHzの0-5V信号が指定されていますが、ラズパイPicoの3.3Vパルスでも動いています。ハウジングとの固定にはM4長さ50mmを使いました。

電源は「VHBW 12V 5A ACアダプター 60W 5.5*2.5(2.1)mm AC100V-240V DC12V 電源アダプター 内極性[+] 0.1A~5A汎用 PSE認証」にしましたが、とりあえず問題なく使えています。

12V電源だけでPicoも動かしたいので、手元にあった3端子レギュレータNJU7223F33で3.3Vを作ります。Picoは互換機のWaveshare RP2040-Zeroよりも外部給電での使い方が便利で、VSYSに1.8Vから5.5Vを接続できます。可変抵抗を回してPWMのDutyを変更します。また、現在のPWM値を視覚的に表現するために4×4マトリクスLEDの状態を変化させます。LEDの制御はneopixelライブラリを使用しました。

OLYMPUS DIGITAL CAMERA

12V電源 —– NJU7223F33
接続なし —– Pin1(Vout 3.3V)
12V —– Pin2(Vin)
GND —– Pin3(GND)

Pico
VSYS —– 3.3V
GP15(pin20) —– Fan PWM
GP16(pin21) —– LED DIN
GP26(pin31) —– 可変抵抗器Pin2

可変抵抗器
Pin1 —– 3.3V
Pin2 —– Pico GP26
Pin3 —–GND

フルカラーLED 4×4マトリクス
VDD —– 3.3V
DIN —– Pico GP16
GND —– GND

Fan
Red —– 12V
Black —– GND
Brown —– Pico GP15

プログラム pico_fanControlMax.py

PicoにはMicroPythonインタープリタをダウンロードし、ライブラリneopixel.pyと上記プログラム(pico_fanControlMax.py)をmain.pyという名前で保存します。

 

 

MicroPythonで大きな数字の時計を作る

2017年に作った時計がブレッドボードの接触不良で時々ハングするようになったので、ラズパイPico Wでリメイクしました。[ハングしていたように見えたのはNeopixelが1個死にかけていたためのようです。リメイクした後でも再発したので故障したLEDを見つけて交換しました。]

製作当時の記事は以下です。
http://keisoku-lab.mond.jp/2017/06/28/手作りの大型7セグメントフルカラー表示器を使っ/
http://keisoku-lab.mond.jp/2017/08/10/手作りの大型7セグメントフルカラー表示器デモ版/

OLYMPUS DIGITAL CAMERA

当時はまだシリアルフルカラーLEDを32×8 で敷き詰めたユニットは高価だったので、テープ状のシリアルフルカラーLEDを7セグメントLEDのように配置して表示板を作りました。1文字14個で4桁なので56個のLEDを使いました。

配線は以下の3本だけです。
Pico W—–シリアルLED
VBUS —–+5V
GND  —–GND
GP16 —–Din

シリアルLEDのライブラリは以下を使いました。
https://github.com/blaz-r/pi_pico_neopixel

NTPサーバーへの接続とPico Wが内蔵しているrtcの更新については以下の記事に書きました。

MicroPythonでラズパイPico Wと1.69インチTFT DisplayモジュールのNTP時計を作成

 

時計の機能
毎時0分にNTPサーバーに接続してrtcを更新します。
6時から21時59分までは明るく、それ以外は暗く表示します。
毎分45秒から次の5秒まで表示色をグラデーションで変化させます。

一応、狙い通り動いていますが、Pythonは使い慣れていませんのでアドバイスがあればohashi(アットマーク)mac.email.ne.jpまでお願いします。

OLYMPUS DIGITAL CAMERA

 

MicroPythonでラズパイPico Wと1.69インチTFT DisplayモジュールのNTP時計を作成

MicroPythonの使い心地を知るためにRaspberry Pi Pico Wに安価な1.69インチのTFTディスプレイを接続してNTPで更新した内蔵RTC(リアルタイムクロック)の時刻を表示するプログラムを作りました。

OLYMPUS DIGITAL CAMERA

Raspberry Pi Pico W (詳細情報はスイッチサイエンスの商品ページから辿ってください)

1.69インチのTFTディスプレイ (詳細情報はAliexpressの商品ページから辿ってください。400円程度で購入できるSPI通信の240×280画素のフルカラーディスプレイでインターフェースコントローラはst7789を使用していてします。)

配線
<TFTディスプレイ> ——– <Pico W>
GND ——– GND (18pin)
VCC ——– 3V3(OUT) (36pin)
SCL(SCLK) ——– SPI1SCK(19pin)
SDA(MOSI,SDI,DIN) ——– SPI1TX(20pin)
RES(Reset) ——– GP11(15pin)
DC(Data/Command) ——– GP12(16pin)
CS ——– SPI1CSn(17pin)
BLK(Backlight) ——– GP10(14pin)

st7789用ライブラリ
ST7789 Driver for MicroPythonとしてgithubに公開されています。Pico W用MicroPython Firmware (https://github.com/russhughes/st7789_mpy/tree/master/firmware/RP2W/firmware.uf2)をダウンロードして、Pico Wのブートボタンを押しながらPCのUSBポートに接続し、現れたUSBドライブにfirmware.uf2ファイルをドラッグ・ドロップします。

NTP時刻を取得するライブラリは時差を補正することができなかったので、ライブラリ内でJAPAN_TIME = 9*60*60を補正してRTCに書き込むことにしました。ntptime_jp.pyという名前でpico Wに保存しました。(オリジナルはmicropython-lib/micropython/net/ntptime/ntptime.py です。)

フォントはst7789_mpy/fonts/vector/romand.pyをPico Wに保存して使いました。