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

大型NTP時計の初代がまた不調になったので、あきらめて新しく作ることにしました。

OLYMPUS DIGITAL CAMERA
OLYMPUS DIGITAL CAMERA

ESP32用のMicroPythonを使ったのが新しい点で、ntpの時刻でrtcをセットするのがとても簡単で感心しました。プログラムが書きやすいので、フォントデータの作り方をシンプルにできました。Apple2のフォントデータを使いました。

7時から21時までは明るく表示します。0-45秒は時間ごとに変わるグラデーション表示で、45-0秒はドット毎にランダムな色で表示します。夜中はオレンジ色で暗く表示します。

今回購入したLEDマトリックスは1100円ぐらいでしたが、電源投入直後に全点灯する不具合がありました。しばらく様子見です。

Google Apps Scriptで「検索して地図を表示」してみました

Googleアカウントは多くの人が持っていると思いますが、Googleスプレッドシート(これ以降スプレッドシートと書きます)やGメール、グーグルドライブなどのGoogleアプリをJava Scriptで操作できるGoogle Apps Scriptを使っている人はそれほど多くはないと思います。

最近「Googleスプレッドシートに測定データをアップロード」という記事を書いたついでにGoogle Apps Scriptで面白い使い方ができないか調べていました。Googleといえば「ググる」という言葉が辞書に採用されるほど検索に強い、Googleマップもストリートビューでプライバシー問題を起こしながらも便利に使われています。そこで、この二つを結びつけるアプリをGoogle Apps Scriptを使って作ることにしました。DOKORAという名前にしましたが、適当なキーワードで検索した施設、お店などの緯度・経度、住所と周辺の地図を数種類の拡大率でGoogleスプレッドシートに作成するスクリプトです。

「手がかり」セルの隣に検索キーワードを入力して「どこら?」と書かれたボタンを押します。手がかりが十分であれば緯度・経度、郵便番号と住所が表示され、倍率の異なる4枚のGoogleマップで作られた画像が表示されます。

 

DOKORAを使ってみる方法を説明します。 ”検索して地図表示240610”というスプレッドシートファイルですが、スプレッドシートはオンラインのWebアプリケーションなので、共有してからご自分のGoogleドライブにコピーして使うことになります。

①  ご自分のGoogleアカウントでGoogleドライブを開きます。

② 以下の共有ファイルへのリンクをクリックして”検索して地図表示240610”を開きます。
共有ファイルへのリンク

③ ファイルメニューから”コピーを作成”を選択すると、Googleドライブに”検索して地図表示240610のコピー”ができます。普通のファイルならダウンロードして開けば良いところですがとても面倒です。

Google Apps Scriptで作成されたプログラム(Script)はファイルの参照、編集、作成、削除ができるため、Googleアカウントを持っている人の許可を確認してから実行されます。何気なく許可がされないように若干くどくて分かりにくい確認手順になっています。一度確認すればその後は確認を求められなくなります。面倒ですが、自分でGoogle Apps Scriptを作成したときにも同様の確認が行われますので直に慣れると思います。

最初のウィンドウですが、自分のアカウントを選択します。

以下のウィンドウが分かりにくいのですが、左下の”詳細”をクリックします。秘密の通路のようなものです。

左下の”DokaraScript(安全ではないページ)に移動”をクリックします。//Scriptの名前をDokoraScriptにするつもりでしたが、間違えてDokaraScriptになってしまいました。

許可をクリックします。

使えるようになるまでの道のりが長い。

DokaraScriptでは次のような処理を行なっています。
① 前回の検索結果をクリア・削除します。
② スプレッドシートから”施設名”を読み取り、緯度・経度を求めて、スプレッドシートに記入する。[ジオコーディング]
③ スプレッドシートから緯度・経度を読み取り、郵便番号と住所を求めて、スプレッドシートに記入する。[逆ジオコーディング]
④ 緯度・経度を中心にした4種類の地図を作成して、スプレッドシートに貼り付ける。[roadmap :道路地図ビュー、satellite :Google Earth の衛星画像、hybrid :通常ビューと衛星画像ビューの複合ビュー、terrain :地形情報に基づいた物理地図]

 

参考にさせていただいたサイトは多々ありますが、記録に残さなかったので誠に申し訳ない。

 

 

 

 

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秒ごとにしました。