今まで手を出さなかったボードマイコンですが、PICでディスプレイを制御する場合アッセンブラではトウシロのジサマでは無理があることを悟り、ボードマイコンに手を出すことにしました。
ボードマイコンと新たな言語_MicroPyton(MicroPico)を Thonny で
新たな言語を使用するのはボケ防止にも若干でも効果があるでしょうし、さすがにボードマイコンでアッセンブラは無理でしょうから、何か新しい言語を使うことにします。順当にいけばCかC++なのでしょうが、もうちょっと解りやすいものはないかと探してみると、結構な種類があることが解りました。
これから使っていくボードマイコンを決めて、それからプログラム言語を決めることにします。
最終的に候補に挙がったのは“RaspBerry Pi Pico”と“EPS32”ですが、性能的にはEPS32が上だと思われますが、EPS32には標準でWiFiとBlueThoothが搭載されていて、安く上がる大陸からの個人輸入では“技適”の問題が出てくるので、“RaspBerry Pi Pico”をターゲットにすることにしました。これならクローンであれば$3前後で入手できます。
使うボードマイコンが決まれば使う言語は一番使われているであろう(一番情報が多い)言語にするのが良いので、MicroPythonに決めました。
が、 最初エディターを汎用性が高く評判が良さそうな“VS Code”でいろいろやってみましたが、Picoに書き込まれているファイルを見る方法が解らず、あーだこーだとやってみましたが素人ジサマでは解決できず、最終的に統合環境の“Thonny”を使用することになりました。
PCへのインストールも多くのサイトで紹介されていて、これから始めようとされている方にはお勧めです。おまけに候補から外れた“EPS32”にも対応していますので、もし無線が必要になっても対応可能です。(よくわかりませんが、言語が同じインタプリンタを使えば、大きな変更をしなくても動くのではないかなと思います。)
さてこれから70の手習い_互換器 YD-RP2040で
機材の用意 互換器 YD-RP2040
実使用機は互換機(クローンというらしい)“YD-RP2040”(クローンのパッチモン)を2枚個人輸入しました。本家の物に比較して半値以下でBOOT SW以外にUser SW・ReSet SW・WS2812( RGB LED)が搭載され、RAMも16MB搭載されています。ただし 電源の整流ダイオードが壊れやすいとの情報もありますが、見たところ電流容量が200mAですので、あまり電流(100mA程度か?)を流さないようにすればよいでしょうし、もしダメになっても安いものですので、整流ダイオードを付け替えればよいでしょう。安価・多機能が魅力ですし、大陸からの発送でも近頃は10日早いと1週間以内で届くこともあり、若干手数料はかかりますが“PayPal”を利用することでリスクは下げられます。
今回購入したYD-RP2040は◯ゾンでは\1,000強していましたが、大陸からでは送料込みで$2.26 、昨今の円安でさえ手数料を入れても一枚当たり\350程度で、今回は5日間で届きました。
ついでに今後を考えてWS2812B アレイ(8×8) $1.21 + $1.39(送料) も同時に発注しています。
百均で入手できるUSBケーブルはほとんどType-Cになっていますので、本家のRaspBerry Pi PicoはMicro USBであまり汎用性が高くありませんが、互換機YD-RP204のUSB部はTYPE-Cになっていて使い勝手も良いと思います。要求される電流も低く(200mA程度か)百均で取り扱っているケーブルで問題なく使用できそうです。(セリアでType-CをMicroUSBに変換するコネクターを入手すれば使い勝手も上がります。)
準備
これから使ってゆくボードマイコンYD-RP2040にインタプリンタMicroPythonのRaspBerry Pi Pico用MicroPicoを組み込みます。
組込み方は二通りあり、Thonnyと接続して書き込む方法とボードをUSBメモリーとして動作させコピペで書き込む方法になります。最初は簡単なコピペで書き込みました。詳しい方法はいろいろな方が紹介されていますので、割愛させてもらいます。
ここでボードのBOOT SWを押しながらPCに接続し、メモリーとしてWindowsのエクスプローラで見てみますが、書き込んだはずのファイルが見つかりません。エクスプローラの表示設定を“隠しファイルを表示する”にしてあってもダメです。
いつもの“安物買いの銭失い”で“互換機”はまがい物をつかまされたかと思い、純正品のRaspBerry Pi PicoとRaspBerry Pi Pico2を急遽購入したのですが、同様にコピペしたファイルが表示されません。あーだこーだと数日やった結果、.uf2ファイルは見えないものらしいことが解り、一件落着しました。
これで無事に先に進むことが出来ます。
動作確認
まずThonnyを立ち上げ、次にファームウェアーの書き込まれたYD-RP2040をBOOT SWを押さずにPCに接続して準備完了です。VS Codeではボードが接続されたCOMポートの確認等結構いろいろと必要でしたが、Thonnyの場合は自動認識するようで、いたって簡単です。
Thonnyの使い方は多くのサイトで紹介されてますので、解りやすいと思うサイトを参考にしてください。ただし 初心者用と書かれていてもわかっている方が書かれているところが多く、専門用語が多く業界では“当たり前の操作”が割愛されていることが多く、優しく説明されているサイトが少なく思います。
70まじかのトウシロ ジサマが、何とか理解できるサイトを見つけるのに結構苦労しました。
入門書を読んでから始めた方が良いのでしょうが、老い先短いので使いながら覚えていくことにします。
まずはボードのLEDを使用して
ボードマイコンに搭載されているLEDを使って、いわゆる「Lチカ」をやってみることにします。RaspBerry Pi PicoとYD-RP2040には、共通して搭載されているLEDとYD-RP2040固有のRGB LEDとスイッチがあります。これらを使っていろいろな光り方をさせてみます。
私が購入したYD-RP2040にはプログラムが入っていて、最初にUSBにつなぐとオンボードのWS2812が色を変えながら点灯しました。訳も分からず書き込みをしてしまいプログラムを消してしまったようで、残念なことをしてしまいました。
共通のLEDを使って
RaspBerry Pi PicoとYD-RP2040に共通して搭載されているLED(RaspBerry Pi Picoは緑,YD-RP2040は青)を点滅させてみます。試したプログラム(スケッチ,コードと呼ぶらしい)は下記の物です。最初はコピペでやりましたが、こんな短いものでもうまく動かず結局最初から打ち込むことになりました。多分コピペの際に余計なコードが入ったか全角スペースが入ったかしたようです。
プログラムになれるため、最初はできるだけ自分で打ち込んでいった方が良いかと思います。特にPyThon系列ではスペース(空白)・インデント(字下げ)・大文字小文字等の約束事が多くあるようです。
また プログラムの説明の中で“Pin番号”と出てきますが、実際のボードマイコンのPin番号ではなくGP番号ですので、気を付けてください。最初は解らず悩みました。(RaspBerry Pi Pico・YD-RP2040共通のLEDがGP25ですが、Pin25はGP19になっているため、当たり前ですがまったくLEDが点きませんでした。)
ボード上のLEDに関して輝度は最大255まで設定できますが、255では明るすぎるため10から30ぐらいが目に良さそうです。
最終的に参考にさせてもらったのはマルツさんの「開発環境のセットアップから点灯/消灯制御プログラミングまで」
URL;https://www.marutsu.co.jp/pc/static/large_order/zep/m-z-picoled-da1?srsltid=AfmBOoqAIr84LAfrTFxPGZFhwA9COO2hjoPF9iIWUwU_wg67t9W-aHUi です。
- Lチカ その1 : 単純な点滅
- Lチカ その2 : PWMで輝度を周期的に変化させる
- Lチカ その3 : PWMで輝度を不規則に変化させる
※ onBoard_LED.zipに上記のプログラムソースが入っています。
ファイルに健忘録代わりに、私なりにコメントを多く書き込んであります。実際のプログラムとしては無駄が多いでしょうが、最初は理解を深めるため、このようにしてもいいのではないかと思います(RAM容量も多いことですし・・・・・)。ダウンロード後解凍してから使ってください。
なお このプログラムは慌てて購入した純正のRaspBerry Pi PicoとRaspBerry Pi Pico 2でも動作を確認できました。ただしRaspBerry Pi Pico 2のファームウェアーは他の2機と違うので注意してください。
ここまでで分かったこと
- コメント以外で「全角文字(スペースを含む)」はぜってい使用しない。 ← コピペしたもプログラムが動かなく結構悩みました。PICのアッセンブラと同じようです。
- モジュールのインポート(呼び込み)が必要。モジュールの種類によりインポートの書式が違うようだ。
- BASICとは違い、文法に厳格な意味があるようだ。
- 代入は a␣=␣bと表記するが、これはaにbを代入するという意味で、算術の=(等しい)とは全く別物で、算術の=(等しい)は=を2つが相当する。
- プログラムでインデントが重要な意味を持っている。
- コメントは基本的に#で始まり、#の後には半角スペース1個以上入れる。
- 行中にコメントを入れる場合、#の前は半角スペース2個以上入れる。
- 行をまたいでコメントを入れる場合、’ または “ を3個つなげたもので囲むことでもできる。
- 時間指定関数はPythonではtimeだが、MicroPythonでは正式にはutime
ボード上のRGB LED(WS2812)を使用して
YD-RP2040に搭載されているRGB LED(WS2812)を使ってみます。この場合WS2812のライブラリーを使うことで、プログラムをすっきりできます。
WS2812はPWM駆動で、輝度は255まで設定できますが爆光となるので、30までぐらいにしておいた方が安全に思えます。
「RaspberryPi Pico2で「シリアルLED」を使う方法 ~ MicroPython編~」
URL;https://tech-and-investment.com/raspberrypi-pico2-02-serial_led/#%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%a0%e6%a6%82%e8%a6%81
に書かれてありますが、現時点でPicoシリーズのMicroPythonのファームウェアにもデフォルトで入っているらしいので使用しない手はありません。
参考にさせてもらったのは「フルート吹きのMIDI工房」さんの“実験テーマ148”
URL;https://www7b.biglobe.ne.jp/~nobosan_flute/lab_theme148.htmと
「ロジカルブログ」さんの“ラズパイPicoでNeoPixel、まずはシンプルに1個から後は応用でいろいろ試そう♪”
URL;https://logikara.blog/raspi-pico-neopixel/#mokuji_4-1です。
- WS2812 その1 : NeoPixlを点灯させる。WS2812用ライブラリー不使用 ← 1-1で点滅に
- WS2812 その2 : NeoPixlを点滅させる。NeoPixelライブラリー使用
- WS2812 その3 : 色を順番に変えてゆきます。NeoPixelライブラリー使用
- WS2812 その4 : ゆっくり輝度を変えてゆきます。NeoPixelライブラリー使用
- WS2812 その5 : 徐々に色を変えてゆきます。NeoPixelライブラリー使用
※ onBoard_WS2812.zipに上記のプログラムソースが入っています。
ここまでで分かったこと
WS2812用の制御ライブラリーが2種類?ある。「NeoPixel(MicroPythonに標準搭載のライブラリー)」と「WS2812」。ただし 微妙に設定方法が違っているが、MicroPythonに標準搭載されている「NeoPixel」を使用するのが無難な気がします。プログラム「onBoard_WS2812-2」の17行目 “ np[1] = (0, 0, 10) ”を変えてみて発光色を確認してみるとR・G・Bの設定部がわかると思います。このことについてはサイトによって説明が違っています。情報を発信するのであれば自身の目で確認してから情報を発信してほしいものです。特に私のようなド素人な初心者には混乱の元です。間違った情報を出しているサイトは、他のサイトの盗稿ではないのかと疑われても仕方がないと思います。
WS2812 その4で小数点の四捨五入をするときに分かったのですが、MicroPyThonとPyThonでは微妙にモジュールが違っていることがあるようです。四捨五入でPyThonで使われている“Decimal”を使ってみたのですがMicroPyThonでは使われていないようです。仕方がないので昔を思い出しだしBasicで使った手法で四捨五入しています。
WS2812 8×8 アレイを使用して
- WS2812Array 8x8_分離
- WS2812 Array 8x8_加工
RGB LED(WS2812)が8×8 = 64個接続されているアレイを使ってみます。ただし Raspberry Pi PicoのGPIOの電流は、デフォルトで最大4mAです。また、3.3Vの出力に設定されたGPIOピンは、すべてのピンを合わせて約50mAの電流しか取り出せません。
8x8LEDアレイはすべてを点灯させた場合電流が4A程度必要になるので、USB-Aでは最大で2Aですし、PCのUSBからは400mA程度しか流せませんので、USBからの電流だけでは足りなくなってしまいますので注意が必要です。多分WS28121個で最大60mA程度必要になるはずですので、8個以上同時点灯するときには必要に応じて別電源を確保してください。
私が購入した8×8アレイの点灯順は、左から右に点灯し1列段が下がり左から右に点灯しました。他の方が購入されたものの中には、左から右に点灯し1列段が下がり今度は右から左に点灯するものもあるようです。WS2812_Array-2で点灯させて、点灯順(LED番号)を確認しておく必要がありそうです。
せっかくのws2812アレイですので、樹脂スタッド(M3)でシュートを防ぐようにして使用しています。
テープLEDやアレイLEDを使用する場合、LEDMATRIXをインポートするとNeoPxelのインポートは必要ないようです。
「RaspberryPi Pico2で「シリアルLED」を使う方法 ~ MicroPython編~」
URL;https://tech-and-investment.com/raspberrypi-pico2-02-serial_led/#%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%a0%e6%a6%82%e8%a6%81
には詳しい説明が載っていて、とても参考になりました。
ボードマイコンとの接続は
- Pin1(GPIO0)にWS2812 Arrayの信号入力(IN)
- Pin40(VBUS)にWS2812 Arrayの電源入力(V+)
- Pin38(GND)にWS2812 ArrayのGED(V-)
に接続します。RaspBerry Pi PicoとYD-RP2040のピン番号は同じです。
- アレイ その1 : 指定した1個のLEDを指定した色で点灯します。
- アレイ その2 : 指定した色で点灯した1個のLEDを順番に流れるように点灯させます。
- (これはリボン型のLEDでも順次流れて点灯できます。)
- アレイ その3 : その2と違った流れ方で点灯させます。
(偶数列は左から右へ、奇数列は右から左へ点灯していく) - アレイ その4 : アレイ その3の点灯順で色を変えながら点灯させます。
- アレイ その4.1 : アレイ その4の色指定方法を一括代入で行ってみる
※ WS2812_Array.zipに上記のプログラムソースが入っています。
ここまでで分かったこと
- LEDの使用個数を宣言しない場合1個のLEDと認識するようだ。
- LED番号を指定しなかった場合、1番目のLED(0番)と認識されるようだ。
- WS2812のモジュールには「NeoPixel」を使用。
- 複数の代入を一括で行える。
結構遊べますので、点灯方法・色の変化等変更してみてください。ただしArrayを使う場合電流だけは気を付けてください。輝度を下げると電流値が下がるというような説明をされている方がいますが、WS2812はPWM駆動ですので、見かけは電流が少なく思えますがピーク電流は下がりません。複数個同時点灯した場合電流源に負荷が掛かることになります。(電流源のピーク電流に相当することになります。)
今後
さて やっとここまで来ました。やりたいことは山ほどありますが、あとは“ディスプレイへの表示”・“データ保存”・“AD変換”です。順を追って挑戦してゆくことにします。
目的は「データーロガー」「リフロー制御」「動植物用飼育コントローラー」の制作ですが、ジジイのためその進捗は遅々としたものになると思われます。
Lチカ_単純なようで奥が深いことに気が付いた_2025.04.07追記
プログラムで最初に紹介される“Lチカ”ですが、いろいろなサイトを見てみると今更ですが様々な方法があることに気が付きました。これから先の基礎になると思ったので、わかる範囲でプログラムしてみました。
使用するのはボード上にあるGPIO(25)に接続されているLEDと、同じくGPIO(24)に接続されているUserSW(PullUp接続)です。
Internal_LED-0.0 :
オンボードSWのUSRを使って、USRが押下されている間、オンボードLED(青)が点灯します。USRの押下時にチャタリングが問題になることがありますが、ここでは無視します。
Internal_LED-1.0 : timer使用
オンボードLED(青)をタイマーを使って点滅させます。timerの時間を短くする(0.01秒以下)と点灯して見えます。ON/OFFの時間を変更する事で見た目LEDの明るさ(輝度)が変わります。これがPWMで云うDuty(デューティー)に相当します。
Internal_LED-2.0 : timerとtoggle使用
オンボードLED(青)をタイマーとトグルを使って点滅させます。Internal_LED-1.0のLEDのON/OFFをトグルで行ってみたものです。
Internal_LED-3.0 : PWM使用
オンボードLED(青)をPWMで点滅させます。PWMの周波数を高くする(100Hz以上)と点灯に見えます。またDuty(デューティー)を変化させると見た目の輝度が変化します。(Internal_LED-1.0と同じ現象)
Blink_onBoard_LEDにまとめていますので、解凍して使用してください。ほかにも割り込み処理を使ったりする方法もあると思いますので、PC・接続ケーブル・YD-RP2040またはRaspberry pi picoの3点があれば試せますので、腕試しで挑戦するのもいいかもしれません。
次はGPIOの確認を兼ねて、使用可能なすべてのGPIOでLEDを点灯させてみることにします。
GPIO確認_すべてのGPIOでLEDを点灯させてみる_2025.04.14追記
まず最初に
今更ですがYD-RP2040の場合(リセットSWを追加してある本家RaspBerry Pi Picoも?)、PCと接続したままリセットスイッチを押下するとPCとの接続が切れますが、プログラムのスタート・ストップのストップをクリックすることで再接続されます。
このことを知りませんでしたので、今まではThonnyの再接続(右下のインタプリンタ設定)を行っていました。初心者は結構無限ループに入ってしまうことが多く(私の場合だけか?)、知らない間はUSBの抜き差しやインタプリンタの設定で対応していましたが、リセットスイッチとこの方法で対応できるようになり、これを知ってから便利になりました。
28本のGPIOを使ってLEDを点灯させる
ウエーブですべてのGPIOでLEDを点灯されている方を見つけられなかったので、すべてのGPIOでLEDを点灯させてみます。ただしGPIO1本が出力できるのは3.3V/4mA(デフォルト設定時)、 同時に流せる電流は最大50mAとのことですので、注意が必要です。理論上ではLED1個に2mA流すとすると最大で25個、1mA流すとすると50個まで点灯できることになります。
しかしYD-RP2040は電源が弱いとの報告がありますので、最大でも全電流で40mA以内に抑えた方が無難だと思います。(とりあえず私は壊れやすいといわれている、整流素子BAT54 KL3を購入しておきました。)
LEDは標準で20mA程度になっていますが、高輝度LEDの場合1mAも流すと、特に赤・黄は結構明るく光ります。
実際に手元にあるφ3高輝度(と謳っている)各色LEDのVfをLCR-T7で12個測定し、上限・下限値を除き平均すると、赤色LEDの場合最大1.96V,最小1.89Vで、平均値は1.93Vでした。
他の色についても同様に検査した結果
赤色 ; 平均値1.93V
黄色 ; 平均値1.94V
緑色 ; 平均値2.66V
青色 ; 平均値2.73V
白色 ; 平均値2.80V
でした。
電流を1mA内外にするには、使用するLEDの順方向降下電圧( Vf )を知る必要があり、LEDに流れる電流は I = ( 3.3 -Vf ) / R なので R = ( 3.3 – Vf ) / 0.001 となり、黄色LEDのVf = 1.94Vですので使用する抵抗値は約1.4kΩになります。一般的に入手性の良いe24系列の抵抗に1.5kがありますのでOKです。ただし 実際にやってみると2kΩでも十分点灯を確認できましたが、たくさんある1.5kΩを電流制限抵抗に使用しました。LEDの特性上低電流でVfは低くなり、また発熱でもVfは低くなりますので、電流制限抵抗は高めに設定した方が無難です。
ここで本家のRaspberry pi picoの使えるGPIOは26本ですが、互換機のYD-RP2040の使えるGPIOは28本あります。WS2812+USR(SW)+LED(青)も載っていてメモリーも16Mあるので、だいぶコスパが良さそうです。
また今回はボード上のUserSW(USR)を使いましたが、最初動作をわかりやすくするため(押すとHi,離すとLo)PullDownで設定しましたが動作がおかしく、ネットで回路図を探して確認してみるとこのスイッチの接続はPullUpで使用するようになっていました。
実際にプログラムしてみるとExternal_LED-2関連で“割り込み”処理が必要になる場面があり、勉強になりました。
割込み処理は複雑(トウシロにとってはですが)な動作を行うためには必要になる機能なはずですので、何とか理解しておきたいものです。
外付けのLEDはGPIOからの吐き出しで点灯させています。すべて点灯すると28mA弱電流を消費することになります。
試してみたプログラムは以下の通りです。
External_LED-1.0:
YD-RP2040のUserSW(USR)のON/OFFで外部接続のLEDをON/OFFさせる。USRのチャタリング防止策は取ってありません。
External_LED -1.1:
timerを使って外部接続のLEDを点滅させる。
External_LED -1.2:
timerとToggleを使って外部接続のLEDを点滅させる。
External_LED -1.3:
PWMを使って外部接続のLEDを点滅させる。
External_LEDxX-0.0:
28本の黄色LEDが、USRを押すごとに順番にLEDを点灯させて行きます。USRはチャタリング防止策をとっていません。USRの押し方によっては一度に数個LEDが点灯したり、長押しすると複数個点灯していったりします。
External_LED xX-0.1:
External_LEDxX-0.0に加えてUSRの押下検出にUSRの立下りを使い、簡易チャタリング防止策を加えてあります。
External_LED xX-0.2:
External_LED xX-0.1にUSRの効果数と、その時に点灯したGPIO番号を表示させます。
External_LED xX-1.0:
28本の黄色LEDが、タイマーで順次点灯して行き、全灯後逆方向に消灯して行くことを繰り返します。
External_LED xX-1.1:
28本の黄色LEDが、タイマーで順番に点灯して行き、端まで点灯したのち後逆方向に順番に点灯して行くことを繰り返します。
※ External_LED.zipに上記のプログラムソースが入っています。
※ YD-RP2040で動作確認しています。
※ RaspBerry Pi Picoの場合はGPIOの数が違いますので、試す場合にGPIOに考慮して書き換えて試してください。
次はボード上のWS2812Bで遊んでみる予定です。