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に保存して使いました。

 

 

春の花の光るメッセージボード(古民家ギャラリー ツキザワの家 2023 4/29〜5/5)

古民家ギャラリー ツキザワの家は、西和賀町にある藁葺き屋根の旧家の古民家を改修した展示施設です。奥羽自然観察会を主宰しているカタクリの会の瀬川 強さんが運営していて、瀬川強さんの写真作品と、水彩画家 川崎茂花さんの西和賀の山野草を描いた襖絵が常設展示されています。今回は「春の花」の企画展(2023 4/29〜5/5)に参加させていただくことになりました。

「光るメッセージボード」はガラス用マーカーペンで透明なアクリル板にメッセージを書くと下から照らしているLED光源でメッセージが浮き出て見えるものです。光がアクリルの内部から外(空気)に出ようとするとき、臨界角42.2°以下では100%反射(全反射)して外に出られなくなります。マーカーのインクが表面にあると、全反射せずに光が外に出てくることができます。これがメッセージが光る理由です。

マーカーのインク以外でも、アクリルの表面に傷などがあると凹凸で散乱して光が外に出てきます。凹凸の密度が高いほど光が出てきて、凹凸のないところからは光は出てきません。レーザー加工機でアクリルの表面を加工すると、写真の濃淡に対応するように光らせることができます。

原理は単純ですが、写真の濃淡に応じて凹凸をつけるのは少し工夫が必要です。
(1)  [写真素材は白黒] カラー写真で素敵に見えても白黒にすると何が写っているかわからなくなることがあります。白と黒のメリハリのある写真が良いでしょう。
(2)  [網点] 印刷物の写真のように200線ぐらいの網点を使います。無料で使える画像処理ソフトGIMPでは、フィルターメニュー > 変形 > Newsprint… で網点にすることができます。
(3)  [トーン] レーザー加工機で網点加工すると、飛びやすく潰れやすい性質があります。飛びやすいというのは、小さな点はアクリルが溶けないのである程度大きな点になるまで加工が始まりません。潰れやすいというのは、逆に周りが加工されている中に加工しなくても良い点があっても一緒に解けてしまいまって、余分に加工されてしまいます。
(4)  [網点の凹凸] 網点は白から徐々に点が大きくなって、50%を超えると黒の中の白点が小さくなっていきます。単純に言えば0%から50%までは凹凸が増えていきますが、50%を超えると凹凸は減っていきます。
(5)  [白黒反転] レーザー加工では黒い部分が加工されて凹凸になり、凹凸が光を散乱させて白く光ります。つまり、黒と白が反転するので、あらかじめ白黒写真の白黒を反転させます。
(6)  [左右反転] アクリルの裏面にレーザー加工をした方が反射光量が得られるので、画像は左右反転して正面から見たときに正しい像になるようにします。

この中で(3)と(4)はトーンカーブで調整します。

原画の0(黒)-255(白)を143(黒)-230(白)に変換しています。黒付近と白付近で傾きを変えているのは”飛びやすくて潰れやすい”性質を補正するためです。(実際の作業では白黒反転した後で、トーンカーブを適用しています。)このトーンカーブを調整すればもっときれいになるのではないかと思います。

 

LEDユニットは3Dプリンターで作りました。

 

Fusion360のスクリーンショットはユニット下面を見た図になります。LED基板とUSBコネクタ(USB Type-Cコネクタ 電源供給用)と配線が収まります。

照明用LEDは秋月電子通商の太陽光LEDモジュール(白色LED)5Vを使っています。目に優しい自然光に近い光というのが特徴です。75mm角用はLEDモジュールを1個、150mm角用は2個連結して使います。

https://akizukidenshi.com/catalog/g/gM-15933/

2023.04.02

色相環で表示するテーブルランプ時計(ESP32+NeoPixelRing)

木工品の中に入れて光らせるテーブルランプを作ります。

OLYMPUS DIGITAL CAMERA
OLYMPUS DIGITAL CAMERA

Wi-Fi経由でNTPサーバーから時刻を取得して、24時間でランプの色を色相環を一周させます。
8時:赤(あか)
10時:橙(だいだい)
12時:黄橙(きだいだい)
14時:黄(き)
16時:黄緑(きみどり)
18時:緑(みどり)
20時:青緑(あおみどり)
22時:緑青(みどりあお)
0時:青(あお)
2時:青紫(あおむらさき)
4時:紫(むらさき)
6時:赤紫(あかむらさき)
毎時3分間と1分ごとの10秒間は少し光り方を変化させることにしました。また、日中は明るく、夜間は暗く光るようにしています。

ESP32(MH-ET LIVE  ESP32 MiniKit)でシリアルフルカラーLEDを制御するのですが、暑い夏にハンダ付けをするのが面倒になったので、NeoPixelRing(12個)を使いました。VCC、GND、IO16だけ使います。コンパクトにするためにヘッダーピンは使わずに直接ハンダ付けをします。ケースは適当に3Dプリンターで出力しました。

OLYMPUS DIGITAL CAMERA
OLYMPUS DIGITAL CAMERA
OLYMPUS DIGITAL CAMERA
OLYMPUS DIGITAL CAMERA
OLYMPUS DIGITAL CAMERA
OLYMPUS DIGITAL CAMERA
OLYMPUS DIGITAL CAMERA

Arduinoプログラムは以下のものを使いました。WiFiのSSIDとパスワードが必要です。

 

 

 

ESP32と8x32LEDモジュールでNTP時計を作る(その2)

2019年8月に「ESP32と32×8フルカラーLEDでデジタル壁時計をつくる」という記事を書きましたが、そのデジタル壁時計は壊れずにいまも使い続けています。この時に使ったLEDモジュールは「Quimat Arduino用RGB LED パネル 5050 SMD WS2812B」というものでしたが、同じものは入手できなくなったようです。このパネルのLEDの配線は左右方向にジグザグでした。

新たに購入したパネルは「BTF-LIGHTING WS2812B ECO RGB合金ワイヤー 8X32cm 265ピクセル LEDマトリックスパネル 5050SMD」で価格は2799円と安くなっています。問題はLEDの配線が上下方向にジグザグなことです。これはプログラムを少し変更するだけで対応できます。前回の数字フォントは輝度を0から100の間で変化させて斜体を表現しましたが、今回はシンプルに0か100のON-OFFで作りました。

配線は前回と同様にVDD(5V)、GND、IO16を使いました。

筐体はLEDマトリクスを購入したときに付いてきた白い発泡ウレタンを使いました。ESP32用のケースは即席で3Dプリンターで作成しました。

 

変更したのはsetPosArray()とColonFont[FontHeight][ColWidth]とNumFont[10][FontHeight][FontWidth]、および、NTPへのアクセス間隔を1200秒ごとにしました。

 

 

 

 

パズルソルバーBurrToolsで正四面体パズルを解く

テトラへクス形状に球体を連結した7種類のピースを各2個使って、一辺が球体6個の正四面体を組み上げるのが”正四面体パズル”です。

BurrToolsは球も扱えるので正四面体パズルも解くことができます。ファイルメニューからNewをクリックしてSphereを選択します。
BurrToolsでは基本が面心立方格子なので素直に形状を選んでいくと月見団子的な4角錐になります。
「正四面体パズルは三角形の底面に球を敷き詰めて、2段目は3個の球のくぼみに乗せていきます。3段目も同様にくぼみに乗せていきます。最終的に頂上に1個乗せて正四面体になります。ここで上の図を見ると四角錐の斜面が正三角形であることに気がつくと思います。この正三角形を正四面体パズルの底面とみなせばOKです。(文末参照/訂正箇所)」

正四面体になった形状の”S8-Goal”とS型ピース”S4-S”の例です。
傾けて配置する点にだけ注意すればスクエアキューブパズルで紹介したように問題を解くことができます。
スクエアキューブパズルと同じように正四面体パズルも組み方が多様で、数分で1万通りを越えましたが、全ての組み合わせを探し終わるまで500年ぐらいかかると書かれています。

「内接球を持つ切稜立方体」や「菱形12面体」で作った正四面体パズルの場合はP型、J型、Y型が表裏を持ちますので、球では成り立っていた解では組み立たない可能性があります。BurrToolsでは色を指定することでピースに表裏の区別を与えることができるようですが、正四面体パズルで表裏をつける方法があるかどうか不明です。球で得られた解答の1/8ぐらいは「内接球を持つ切稜立方体」や「菱形12面体」でも成り立つはずなので、かなり役に立つはずです。P型の上にY型2種が乗っている問題は数日かけても完成しなかったのですが、BurToolsを使って答えが見つかりました。球の場合で1906通りの答えがあり、3個目の解答が「内接球を持つ切稜立方体」で作った正四面体パズルでも成り立ちました。

正四面体パズルは面に平行にピースを置いていきますので、直角な世界から一捻りした面白さがあるのではないかと思います。
あそびをせんとやさんから「正四面体パズルは「六方最密充填構造」なので、面心立方格子の中では底面が傾いた状態にあることに注意しないといけません。」との記述は誤りですとの指摘があり、2023/5/31変更しました。

 

 

パズルソルバーBurrToolsでスクエアキューブパズルを解く

スクエアキューブパズルは手と頭を使って試行錯誤している間に組み立てることができる手軽なパズルです。数個のピースを気に入った配置に置いて問題が出来上がりです。ここから立方体をめざして組み立てます。

スクエアキューブパズルの説明

たまにはどうしても完成できないと思ってしまうような難問ができてしまいますが、本当に完成できないのか気になってしまいますね。そんな時にはコンピュータを使って調べてみましょう。パズルの解答を調べるプログラム「BurrTools」が無料で公開されています。「みたにっき@はてな」にはダウンロード先と使い方が簡潔に紹介されています。2021年にもりおか啄木賢治青春館で「幾何学が拓く新しい折り紙の世界展」を開催していた立体折り紙アートの先生ですね。

BurrToolsの使い方が紹介されているブログ記事

スクエアキューブパズルの解答を探す方法を紹介します。中心にO型を4個重ねた状態から立方体を目指す問題です。外周を残りの12個のピースで組み立てます。問題としてはシンプルですが、少し手強い問題です。解答は何通りあると思いますか?

BurrToolsによれば917通りもあります。

それではBurrToolsを使ったスクエアキューブパズルの解答の調べ方を説明します。BurrToolsを起動してファイルメニューからNewを選択すると基本形状を選択するウィンドウが開きます。デフォルトのままBrickを選択します。スクエアキューブのように小さな立方体を単位にしたピースを扱う時に使用します。

初期画面はほとんど空白の状態で無愛想な感じがしますが、「Entities」「Puzzle」「Solver」の三つのタブがあります。
「Entities」はパズルピースと組み立て後の状態を形状(Shapes)として登録するタブです。Z方向にスライスされたX-Y平面上に3次元で形状を指定します。「Puzzle」は登録した形状(Shapes)から完成形状(Result)とピースとして使う形状と個数を問題(Problem)として登録します。問題(Problem)は複数登録することができます。「Solver」は問題(Problem)を選んで解を探索させるタブです。解を記録してピースの配置を見ることができます。基本形状がBrickの場合は解を分解しながら組み立て手順を確認することができます。

「Entities」での形状(Shapes)の登録

Newボタンを押すとS1から連番でShapeを登録できます。Labelボタンを押せば、例えば、”S3″にTというラベルを追加して”S3-T”という名前にすることができます。”S3-T”の場合Shapeの範囲をX=4、Y=4、Z=1として、左端のボタン”Add normal voxels to the shape”が押されている状態でグリッドをクリックしていきます。間違えてクリックした時には左から2番目のボタン”Remove voxels from the shape”を押した状態でクリックすると削除できます。全てのピース形状を”S1-I”、”S2-O”、”S3-T”、”S4-L”、”S5-Z”として登録します。
“S6-Goal”は全てのピースを使った立方体を組み立て後の状態として登録したものです。X=4、Y=4、Z=4としました。左のスライダーでZを1から4まで切り替えながらグリッドを選択します。

“S7-Outer”は全てのZで中央の2×2を空白にして登録しました。”S1-I”、”S3-T”、”S4-L”、”S5-Z”の4種類、計12個で”S7-Outer”を組み立てるという問題にするのです。

「Puzzle」での問題(Problem)の登録

PuzzleタブでNewボタンを押すと連番でP1が作成されます。”S7-Outer”を選択して”Set Result”ボタンを押すと”Result”として登録されます。Problem”P1″で使うピース形状を選択して”+1″ボタンを押すとピースが1個追加されます。”S1-I”を3個、”S3-T”を2個、”S4-L”を4個、”S5-Z”を3個使用します。

「Solver」で問題(PROBLEM)の解を探索

解を探索する問題(Problem)を指定して、prepareボタンを押して、Startボタンを押せば解の探索が始まります。
Disassembleにチェックを入れれば分解しながら組み立て方を見ることができます。Limitで記録される解のカウント数を指定します。下のスクリーンショットは812番目の解を分解しながらチェックしている様子です。
スクエアキューブパズルはこんなにたくさんの組み合わせがあるので、難しいパズルが好きな人には向きませんが、気分転換にちょっと遊んでみたり、お互いに問題を出し合ったりして無限に楽しめるのですね。

8×8の正方形の形状を登録すれば、正方形に並べるパズルの解を探すこともできます。