細胞型ジグソーパズル図案生成プログラム

Processingで作成した細胞型のジグソーパズル図案を自動生成するプログラムを公開します。レーザー加工用の切断パスとして使用できます。

Processing 3で数年前に作成したものですが、最新のProcessing 4.3で動作を確認しました。ボロノイ図形をベースにPDFファイル”my_PzlPiece_.pdf”を自動的に新規、あるいは上書きで作成します。生成結果を見てパズル図案として使いたい出力の時にはファイル名を変更してください。細胞の核をイメージした円の中心をボロノイ点として細胞領域を作成します。円は書かない様に設定することもできます。

 

プログラムの最初の方でパラメータを設定します。

// design constant
final float artboardWidth_mm = 210;     //PDF書類の幅をmmで指定します
final float artboardHeight_mm=148;     //PDF書類の高さをmmで指定します
final float finishWidth_mm=210;     //図案領域の幅をmmで指定します
final float finishHeight_mm=148;     //図案領域の高さをmmで指定します
final float FRAME_X_mm=15;    //図案領域の中で余白をmmで指定します
final float FRAME_Y_mm=15;    //図案領域の中で余白をmmで指定します

final float CellSize_mm=20;   //細胞の概略の大きさをmmで指定します
final float minEdgeLength_mm =7;   //細胞壁の長さの最小値をmmで指定
final boolean draw_nucleous=true;   // true/falseで円を描くかどうか指定
final float NucleusDiam_mm=8;  //円の直径
// end design constant

 

 

 

ESP32のMiroPythonと4×4シリアルLEDで焚き火ランプ(リメイク)

2022年の夏から2023年の春にかけて「ハンドクラフトの素材としての電子工作 “超” 入門」講習会を企画実施していました。木工などのクラフトを簡単にテーブルランプにできる照明ユニットを作る講習会ですが、このブログにはまったく記録に残していませんでした。今回はMicroPythonを使ってリメイクすることにしました。

照明ユニットは下の写真のケースにESP32 MH-ET Live Mini Kitに4×4シリアルフルカラーLEDをつけてユニットを作ります。

ESP32 MH-ET Live Mini Kitと4×4シリアルLED

木工などのクラフトの下に置くと簡単にテーブルランプにできます。Arduino IDEで書いたプログラムで、写真は焚き火をモチーフにしたものですが、WiFiアクセスポイントからカラーセットを変更する機能もついていました。

18面体のランプ

今回はWaveshare RP2040-Zeroと8x8LEDで作ったプログラムをベースにリメイクすることにしました。MicroPythonでESP32を使うときにはThonny IDEを使ってESP32用のMicroPythonをインストールします。特に難しいこともなく終了しますが、ESP32用のneopixelライブラリはMicroPythonファームウェアに含まれているのでそれを使います。PicoやWaveshare RP2040-Zeroで使っているライブラリとは違うので、関数名NeopixelをNeoPixelに変更したり、Brightnessの機能を自分で作らないといけません。

また、4×4マトリクスは0行目は右、1行目は左、2行目は右、3行目は左とジグザグなLED番号なので変更しました。

パーリンノイズはMicroPython用のライブラリ “perlin.py” が公開されています。このライブラリをダウンロードしてマイコンのメモリに保存します。

 

 

 

 

 

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をもっと楽しもう

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という名前で保存します。