MOSの覚書

趣味人の公開メモ帳

UIAPduino について思うことと私のスタンス

はじめに

UIAPduino が FabScene で取り上げられ、一定の認知を得るようになる前から存在は知っていて、サンプルを頂いていくつか作例を作っていました。しかし、様々な変遷を経て当初の印象と現時点での印象がかなり変わってきました。また、今後の私の姿勢もある程度定まってきたので、明文化し、まとめておこうと思います。

初期の印象

UIAPduino の開発・販売・サポートは、そのほとんどを埋田祐希氏一人の手によって担われています。体制として非常に良くないとは思うんですがこの点に関する是非はさておくとしましょう。

当初、UIAP の Discord コミュニティに参加した頃は、「一人でロット 1 万個生産する」という気合いの入りようと、低価格を実現するために徹底的にコストカットしつつ、必要な安全装備は盛り込むという設計の合理性に純粋に関心したので、「おもしろそうなことやってるな。何か作れるやろか」という気持ちを持っていました。
実際、安く買えるというのは大きなメリットですし、安いマイコンボードの選択肢が増えるのは良いことです。こと国内に限って言うならば、サポートが母国語で得られるというのも人によっては重要でしょう。

実際、「UIAPduino のメリットを挙げよ」と言われた際に真っ先に挙げるべきは価格でしょう。バラ売りで 290 円、教育用途なら 200 円というのは破格です。むしろ、メリットの 8 割以上は専ら価格面にあると言って差し支えないと思います。

当初聞いてた話だと、単価を抑えて購入の敷居を下げ、Arduino IDE 対応で開発の敷居を下げ、保護回路を備えることで実験中にホスト PC を破損させるリスクを下げるなど、設計をする上で考慮されている点がかなり合理的で、雑な感想ですが「よく出来てるな」と思いました。特に、教育現場での活用に視線が向いていそうな設計思想に思えました。

例えば、電子工学系の講座や授業で、実技演習としてマイコンを使った実践を組み込むことを考えてみましょう。この場合、キャパが 50 人だとしたら材料費だけでも数万じゃ効きません。十数万することもあるでしょう。
秋月電子通商で調べてみると、現時点での値段ではありますが、XIAO ESP32C3 が 1,080 円、Raspberry Pi Pico が 800 円、XIAO BLE nRF52840 が 1,780 円と、単価 1,000 円越えるのがデフォみたいな感じのラインナップになっています。しかし、そんな性能が必要になることはそうそうありません。
マイコンチップ単体で使うにしても、AVR は扱いやすいが単価数百円、PIC はもう少し安いけど少々扱いづらい。講座の構成のことを考えるとこれもこれで別の種類の厳しさがある。

その視点で UIAPduino を見てみると、単価 200 円ですぐに使えるボードとして仕上がっているものが調達できるというのは非常に魅力的な選択肢になります。50 個買っても 1 万円で済みます。実際には予備などにもう少し欲しいので +20 個くらい買うことになりますが、にしてもです。
そのうえで、USB コネクタに繋がる配線にはヒューズが入っており、万が一の機器破損を未然に防ぐ施策が盛り込まれています。これにより、PC 自体の故障リスクの低減を見込めます。学生にやらせると何しでかすか分かったものではないので、安心材料としてもいい点です。

以上の通り、特に教育現場で、「マイコンを使ってできること」の実例を体験してもらうなどの用途にすごく向いていると感じたので、私も何か作例や教材、工作キットのようなものを作ってみようかと思い至りました。

当初見かけた批判と、その批評

2 月 26 日、FabScene にて、以下の記事が公開されました。おそらく、UIAPduino の認知が広がった一つのきっかけと言えるものです。

fabscene.com

Twitter を見ていても、様々な反応が観察されました。
その中でいくつか見られたのが、「不当廉売だ」「ダンピングだ」というものです。あらかじめ言っておきますがこれらの主張は間違っています(仔細は後述)。

特に目についたのがこの返信。

記事では美談のように書いているけど、実は全く逆で、業界を滅ぼす愚行である。安いのが当たり前だと思われてしまうと、マイコン業界に新規参入するメーカーもいなくなるし、ユーザーが製品や作品を作っても価値を認められにくくなる。
オープンや利益を取らないことが良かれ思って記事を書いているのかもしれないが、適正な利益を取らずに安売りすることは業界全体を衰退させることにつながる。
早く気付いてくれ。

はっきり言ってダブルスタンダードです。

UIAPduino(細かいこと言うと UIAPduino Pro Micro CH32V003)があの価格を実現しているのは、名前にある通り CH32V003 を採用しているからです。8 ピンパッケージの IC が秋月でも 40 円で買えるということで話題になりましたが、それの QFN 版の CH32V003F4U6 が載っています。これが 5,000 個で 724.5 USD で、ドル円相場 160 円とすると単価 23 円。基板本体といい勝負じゃないでしょうか。あとは量産効果ですね。
で、肝心の CH32V003 についてですが、これが結構新しいマイコンチップで、シンプルな RISC-V アーキテクチャ(RV32EC)を積んだものが格安で出てきたということで結構話題になりました。果たして、CH32V003 が出てきた時に同じような主張をした人が何人いたでしょうか? 私は一つとして見た記憶がありません。
CH32V003 に対しても同じような主張をしていたのなら一貫性がありますが、CH32V003あいつ が良くて UIAPduinoこいつ はダメというのは些か公平性に欠けるのではないでしょうか。Raspberry Pi Pico も同様に、ARM Cortex-M0+ の 133MHz が 2 コア入ったチップが 100 円ちょっとで出てきて、公式ボードも 1,000 円しない値段というコスパぶっ壊れ仕様でしたが、不当廉売だのなんだの言ってる人は一人も見ませんでした。なのに 290 円の UIAPduino はダメなんですか。一体何故なんでしょうね。

・・・というのを当時呟いたのがこのツリー

引用元のツイートはこれ。

私は電気電子分野の技術士として「技術に適正な価格を設定する」という技術経営コンサルティングを今後の人生のやりたいことにしています。若い起業家が価格設定をする際に適正な利益が出るように「価格設定のノウハウ」を教えます。
電気電子業界が儲かる業界と認識されれば新規参入も増えて、組み込みやマイコンが再び盛り上がるという考えです。 過去20年くらい、世間では買い手の価格を下げて趣味の人を増やそうという試みが行われてきましたが、その結果が現在の凋落です。電子立国日本はどこへ行った。
安くしてピンク色にしたって女子大生がマイコン触るようにはならないんですよ。
そんなことじゃ業界は盛り上がんないです。電気が面白いと思う人はいつの時代も一定の割合でいるし、そういう人にとっては値段は決め手じゃない。
逆に、売り手の価格を上げて業者の新規参入を促していくことに、私は全生涯をかけて全力で支援します。
私の思想に賛同してくれる人は「いいね」してちょ

これはイチ個人の雑多な意見ですが、あなた本当に「技術士」なんですか?

独り言はさておき、私はこの考えには賛同できません。というのも、何をいくつ作っていくらで売るかは作る側売る側の自由というのがこの自由市場経済の根幹であり、様々な選択肢があってそこから自由に選べるのがこの社会だからです。適正価格は売る側が決めるものではありません。買う側の購買行動により結果的に決まるだけです。「売り手の価格を上げて業者の新規参入を促していく」のは結構ですが、それで買い手が付くかは知りませんよ。
そんなことよりも、その製品ならではの「面白さ」「便利さ」「楽しさ」「使いやすさ」といった方面を広げていった方が、いいものが得られると思います。この点において ESP32 はよく出来たプロダクトの一例と言えます。

あえて強い言葉を使うなら、「たかだか個人開発の安価なボードが出ただけで危うくなる業界なんてさっさと滅んでしまえ」という感想も湧きました。

この意見は本当に真っ当。正直、自分もマイコンボードを売っている側なので、「業界を壊している」と言われる感覚は分かるし、他人事ではない。

でも、かつて Arduino や Raspberry Pi が出てきたときも似たような話はあった。その結果、売れなくなった製品や、撤退した会社も実際にあったと思う。

ホビー用マイコンボードはもうかなりコモディティ化している。これは良い悪いというより、どんな工業製品にもある時代の流れなんだろうなと。「非営利団体が安く売りすぎる」「中国製の超低価格品が市場を壊す」と言いたくなる気持ちも分かるけれど、その流れ自体は止まらない。

もしマイコンが個人や趣味の世界まで降りてこなかったら、今のIoTの広がりもなかったかもしれないし、ここまで裾野が広がることもなかったと思う。市場の重心が変わっただけという話。

私もただの互換機を作って売れる時代はもうとっくに過ぎ、全く他の付加価値を考えないと売れないなーと切実に感じる。

「業界を滅ぼす愚行」はその通りで、滅びたあとに何が生まれているかまで含めて考えないと滅ぶ側にいる事になる。

「この意見は本当に真っ当」といいつつ、その "真っ当" さを説明する文章が見当たりません。
そして、UIAPduino がただの CH32V003 搭載マイコンボードではなく、専用のブートローダを用意し、チップ単体での USB 通信と Arduino IDE での開発に対応させたものであるという点に注目すると、「ただの互換機を作って売れる時代はもうとっくに過ぎ、全く他の付加価値を考えないと売れない」という言及はむしろ UIAPduino を良く評価する材料です。

そして、価格設定について。

自分の人件費をゼロにしてダンピングしているだけ

そう言いたくなるのも分かるレベルの価格設定ですが、内実を知らずに言っているだけです。
私は何度か埋田氏本人とお会いしており、直接話も聞いています。何なら、NT 加賀の時に福井駅から会場まで私の車に乗せてったりもしました。その間にも色々話しましたし聞きました。
その中で聞いた内容も含みますが、結論を言うと検品・出荷などに掛かる工数についても原価に含んだ上で価格設定をしているそうです。本人曰く「ロジスティクス(物流)も私の人件費(2,000 円 / 時間)も原価の計算に入れています」とのこと。

そもそもの話をすると、彼らの主張の根底にある思想は OSS という文化の否定になりかねない、ある種の危険さを持つもののように思えます。
世の多くのソフトウェアやシステムは大なり小なり OSS の恩恵を受けています。そして、それらの OSS は無数のコントリビュータによって維持・発展されているもので、その多くは対価を伴いません。この点はどうお考えなのでしょうか。

UIAPduino についての評価

話は変わって UIAPduino を使ってみて思ったことについて書きます。
良い点と悪い点を 3 つづつ挙げてみました。

  • 良い点
    • 安い
    • 比較的十分な処理性能がある
    • Arduino IDE に対応している
  • 悪い点
    • USB CDC が使えない
    • Arduino 環境だと Arduino Core のオーバヘッドがデカい
    • 供給能力に乏しい

安い

言うまでもないですね。

比較的十分な処理性能がある

ここは採用されている CH32V003 によるものですが、まぁ近代的な設計ですし、動作周波数も 40MHz あるので、そりゃそうという感じでしょう。AVR や PIC とは比較になりません。
ちょっとした工作に使うには十分な性能があります。とりあえず使ってみるにもいいでしょう。こらそこ、そんなん AVR でも十分だったんだから当たり前じゃんとかつまんないこと言わないの。

Arduino IDE に対応している

これまた言うまでもないことではありますが、Arduino IDE 一つでも開発ができます。まぁやってることは内部で minichlink を呼び出してるだけではありますが・・・


続いて悪い点について。

USB CDC が使えない

これは要するに Serial.print() が使えないという意味です。じゃあ UIAPduino で Serial.print() を実行するとどうなるのかというと、外部 IO に UART 信号として出てきます。これ自体はその他の Arduino ボードと同じですが、USB のインターフェースから CDC で送り返すことができません。別途 USB-UART 変換のモジュールなどを使えば解決できるので些末な問題とも言えますが、その変換モジュールが本体以上の値段なので、コストメリットを完全につぶしてしまいます。シリアルデバッグが気楽にできないのは開発する上でちょっと不便ですね。

Arduino 環境だと Arduino Core のオーバヘッドがデカい

これはそもそも Arduino 自体の問題でもありますが、Arduino Core の実装の最適化が進んでおらず、何も書いてないようなプログラムでも結構なメモリ量を消費してしまいます。(これを「メモリフットプリントが大きい」などといいます。)
Arduino Core for CH32V の最適化に期待・・・と言いたいところですが個人的には期待してません。WCH が割と名の知れたベンダとは言えマイナーなチップですし。

供給能力に乏しい

これが一番大きな懸念点だと思っているところなんですが、やはり個人主体なこともあって供給能力があまりにも弱いです。ロット 1 万個とはいえ割とすぐに売れてしまうような量です。その上、検品梱包を一人でやっているようではスケールが効きません。遊びで使うのに 5 個買ってみるとかならこれでもいいですが、ちょっと大規模な採用はどうしても躊躇われます。


その他、良い点とも悪い点ともつかない、雑多な感想もあるのでそれについて。

まず、CH32V003 というマイコンチップがあまりにも普通すぎます。何か便利なペリフェラルを持っているかと言われたらそんなことはなく、ただの安い RISC-V マイコンでしかないです。それ故に、UIAPduino もマイコンとしてあまりにも凡庸で、「これだからできる工作」というのが何一つとしてありません。だからこそ安価と言われたらそれまでですが、まるで味のしないガムみたいで面白みがありません。

そして、UIAPduino に使われている CH32V003 は USB ペリフェラルを持っていません。そのため、ソフトウェアエミュレーションによって USB 通信を実現しています。AVR でちょっと流行った V-USB みたいな感じです。
そのせいか、通信が不安定になることがしばしばあります。こればっかりはどうしようもないですね。CH32V203 とかは USB PHY 持ってるので、そっちを積んだやつが出てくれないことには解決しないでしょう。

現時点での私の姿勢・スタンス

みなさまここまでご苦労様でした。現時点で既に 7 千文字です。。。
して、ここからが本題です。結論を一言でまとめると、今後一切扱いません。

結局、安いだけ

元も子もないことを言ってしまうと、値段以外のメリットがありません。それだけならまだしも、別に使いやすいものとも言えないのが現状です。

ある程度の技術力があるユーザなら、多少のハマり事があっても自力で解決できるでしょう。そういうユーザが腕試しがてら使ってみるのは良いと思います。しかし、UIAPduino が教育用途(例えば大学の講義の中での実技演習など)で使えるかと問われたら、私は同意できません。もっといい選択肢があるので、そちらを提案するでしょう。
やはり問題の根本は CH32V003 にあって、これが新しいマイコンチップなせいで開発環境が成熟していません。まだ発展途上にあります。そのせいもあって最適化が十分に進んでおらず、ただでさえ少ないメモリをすぐに溢れさせてしまいます。まして、Arduino IDE を使う場合は Arduino Core のオーバヘッドも乗ってきます。L チカして遊ぶくらいならどうということはないですが、便利なライブラリを使って色々組み合わせて使うような、Arduino らしい使い方はほとんどの場合で難しいです。そのため、「Arduino IDE で開発できる」とはいっても、「開発 "は" できる」程度です。
かつ、ちょっと発展的な工作をしようとした際に UIAPduino であるが故に生じる障害が起きるようでは、そもそも教育に向きません。Arduino UNO / Nano や Raspberry Pi Pico、ESP32 など、供給もユーザ数も作例も充実しているボードを使う方が圧倒的に変な障害を除けます。その方が教育にも良いです。

さらに、開発・製造が個人の手に委ねられているのもやはり懸念材料です。ホビーユース程度の需要を満たすには問題ないでしょうが、規模が大きくなってくると採用の判断はできません。

個人的な問題

一言で言うと、UIAP のプロジェクトを担う埋田氏を、開発者として、そして人として信用できなくなったからです。
と言われてもなんでやとなるでしょう。なので、決定打となったやり取りを抜粋します。

UIAPduino って、教育向けでの利用に力を入れてたはずですよね。コストメリットも安全性も重要視してますよね。
なのに、この発言。

金持ちの日本の教育機関がたかだか安いデバイスの選択肢を提示されて何を困ることがあるの?大爆笑以外のナニものでもないじゃんw

これを見て、「あ、あなたが作っていたのはその程度のモノだったんですね。あなたの考えもその程度だったんですね。」となりました。要するに冷めました。強い言葉を使うなら失望です。
三枚目の文章にも書きましたが、あの UIAPduino の設計思想を裏打ちする考えがあるとはとても思えません。現状を正しく理解しているとは到底考えられず、また、言葉遣いの部分から「そもそも人としてどうなんだそれは」と思わざるを得ません。

大元の投稿は秋田先生のものですが、秋田先生は大学で教員をされていらっしゃる方で、まぁ日々お忙しいであろうことは容易に想像出来ます。そんな中、NT 金沢を始めとして積極的に「ものづくり」に取り組まれていらっしゃいます。恐らく授業などでも UIAPduino を活用できないかと模索されているでしょう。
理工学教授として活躍されている方がコミュニティに参加してくれているというのは、UIAP にとっては非常に心強いはずです。であるにも関わらず、このような発言が出来てしまうのが理解できません。

他にも細かいことがいくつかありつつも上記のやり取りが決め手となり、私は、今後一切 UIAP および UIAPduino には関与しないことにしました。手元にあるボードはぼちぼち処分しようと思います。

ブレイクアウトボードはどうすんの?

以前、こんなものを作りました。

mos-elecs.booth.pm github.com

ブレッドボード向けの UIAPduino 用ブレイクアウトボードです。試作段階のものを UIAP のコミュニティメンバに提供するなどして開発を進めていました。いました(過去形)。

過去形にしている通り、これの開発もストップしました。GitHub の方を見れば分かりますがリポジトリは既に Public Archive になっています。
今後作ることも売ることもないので、欲しい方は GitHub で fork するなりしてください。

どう使うのがいいの?

これについて触れて終わることにしましょう。今後 UIAPduino を使いたい方向けの話です。

エンドユーザにプログラム部分を触らせない使い方であれば、その辺のボードと大差ない使い方ができるでしょう。
例えば、回路図と部品のリストと一緒にコンパイル済みのバイナリを公開し、「回路作って書き込むだけで使えます」という状態にしておけば、大方考えられるトラブルは防げると思います。書き込むだけなら Arduino IDE も不要です。

あとは、使う人次第です。

楽に QR コードをゲトれるシングルバイナリ作りました

作ったと言っても数分で出来たレベルだしソースも 20 行しかない簡単なものですが,欲しかったので作りました.

どういうやつ?

curlQR コード画像.png を取得できるヤツ,無理やり造語にして qurl です.
読み? しらん()

どう使う?

コマンドプロンプトを立ち上げて,qurl を実行.あとは QR コードにしたい URL とファイル名を順に入力するだけです.
ダウンロードフォルダに落とすようにしてあります.気に食わんかったら勝手に書き換えていただいて.

実行した様子

インスコは?

GitHub からどうぞ.

github.com

コードは main.c だけです.シンプルぅ...
一応ビルド済みの実行ファイルを Releases に置いてあるので,そこから qurl.exe をダウンロードして PATH が通ってるディレクトリに置けばインスコ完了です.(もはやインストールと言って良いか怪しい)

何やってる?

API を叩くリンクを curl するコマンドを作って実行しているだけです.そんな難しいことはしてません.まぁソース見れば分かると思います.

注意点

Windows 以外で動かすことを考えてません.その気になれば対応させるかもしれませんがあまり期待しないでくだしあ.

Arduino 用のオリジナルライブラリの作成と登録方法メモ

個人的によく使っているコードをライブラリ化し,Arduino Library Registry に登録してみました.なので,そのやり方について書き残しておこうと思います.

必要なもの

以下の要素が必要になります.

  • ./src/library.h
  • ./src/library.cpp
  • ./library.properties // 名前の通りプロパティ情報
  • ./keywords.txt // シンタックスハイライトに使われる情報

ライブラリのファイルの名前は適切なのをつけてあげましょう.
追加で以下のものがあるといいと思います.

  • ./example/samplecode.ino // 必要に応じて複数個
  • ./README.md // 日英両方で使い方などを書いてあげると親切

手順

まずは GitHubリポジトリを作成します.
今回は以下のリポジトリを作成しました.

github.com

ライブラリの本体を作成する

ここは C 言語の仕様通りに作れば問題ありません.よってここでは省略します.

library.properties を書く

今回は以下の通りにしました.

name=Sound Library for Arduino
version=0.1.0
author=MOS@53175DDD
maintainer=https://github.com/53175ddd
sentence=Sound Library for Arduino
paragraph=It can generate the frequency of each note, and length of it.
category=Other
url=https://github.com/53175ddd/sound

name にはそのライブラリの名前を書きます.
version にはバージョン番号を.更新時に書き換えるのを忘れないようにしましょう.
author には自分の名前を書いておけばいいと思います.
maintainer には自分の GitHub のアカウントのリンクを書いておくと良いでしょう. sentence は良くわかりませんでしたが,name と同じことを書いておけば良い気がします.
paragraph にはより詳しい説明を書いておきましょう.
category は既存のカテゴリの中から適切なものを選びます.カテゴリの一覧は本項下部に乗せておきます.
url にはライブラリのソースを管理している GitHub リポジトリのリンクを書きましょう.

今回は省きましたが,対象となるコントローラが限定される場合は architectures を追記し,そこに書きます.以下の選択肢があるようです.

  • avr
  • esp32
  • esp8266
  • mbed
  • mbed_giga
  • mbed_nano
  • mbed_nicla
  • mbed_opta
  • mbed_portenta
  • mbed_rp2040
  • megaavr
  • nrf52
  • Others
  • renesas_portenta
  • renesas_uno
  • rp2040
  • sam
  • samd
  • stm32
  • STM32F1
  • teensy

category の欄に書くカテゴリは以下の中から選ぶことになります.

  • Communication
  • Data Processing
  • Data Storage
  • Device Control
  • Display
  • Other
  • Sensors
  • Signal Input/Output
  • Timing
  • Uncategorized

keywords.txt を書く

作成した関数や定数などにキーワードの設定をします.
データ型(オリジナルの構造体など)には KEYWORD1 を,関数名には KEYWORD2 を,定数には LITERAL1 を指定するそうです.
この際,タブ区切りで記述する必要があります.

README を書く

これは任意ではありますが,書いておくと使う人に親切です.
日本語と英語両方で書いておくのが良いでしょう.

サンプルコードを書く

使い方がわかるサンプルコードがあると良いでしょう.こまめにコメントを書いておくといいかな.
これは必要に応じて複数用意してください.

Release を発行する

library.propertiesversion と同じ数字を使うなどして,Release を発行します.
Assets に Zip 圧縮したライブラリを放り込みましょう.

PR を書いて発行する

ここまで来ればあとは申請を出すだけです.以下のリポジトリを開き,repositories.txt に作成したリポジトリのリンクを追記して,PR します.

github.com

私はこんな感じに申請しました.PR を発行すると,自動的に GitHub Actions で設定されたプロセスが走り,問題なければ追加されます.
私は Release を発行するのを忘れてたので一度止められましたが,Release して再開したところ無事追加されました.

あとは待つだけ

どうやら数時間に一回くらいの頻度で Arduino のバックエンドサーバが更新処理をしているそうです.なので,翌日くらいに確認してみましょう.

ESP-NOW で遊んでみるメモ

ESP-NOW とは

Espressif 独自の通信プロトコルです.ルータを介することなく,P2P で ユニキャスト / マルチキャスト / ブロードキャスト ができます.
通信には MAC アドレスを使用しているようです.ブロードキャストは FF:FF:FF:FF:FF:FF ですかね.

低遅延で低消費電力だそうですが如何程かは未検証(別に検証する気もないけど

用途としては,IoT でのデバイス間通信やセンサネットワーク,リモートコントロールなどでしょうか.
ただ,制限事項として,通信距離が短く(~ 200m が限度っぽい),パケットサイズが最大 250 Byte と小さいことが挙げられます.

ちょっと調べてみたんですが,どうも ESP-NOW は Wi-Fi の vendor-specific element field という,Wi-Fi の規格に元からある仕様を使ってデータのやり取りをしているそうです.
で,この field でのデータ長の最大が 255 Byte で,宛先などの情報を付与して残った分が 250 Byte になるみたいです.へぇ.

LPWA とはまた違った性質を持つ通信方式ですが,使いようによっては便利そうなので,お勉強がてら遊んでみようと思います.

開発環境の準備

今回は Arduino IDE を使いますが,PlatformIO や UIFlow でもできると思います.それらでのやり方は各々ご検索を.

Arduino IDE をインストール

これは多分ほとんどの人がしていると思うので手順は省略.まだしてない人は以下よりインストーラをダウンロードしてインストールしてください.

https://www.arduino.cc/en/software

ボードマネージャを追加

ファイル > 環境設定 または 基本設定 を開き,「追加のボードマネージャの URL」に下記リンクを追記する.

https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json

ツール > ボード > ボードマネージャ で「ESP32」と検索し,公式のボードマネージャをインストールする.

今回は esp32:3.1.1 を使用します.

ライブラリについて

大抵こういうのはライブラリを使いますが,ESP-NOW は ESP32 や ESP8266 のデフォルトライブラリでサポートされているので追加インストールは不要です.
ただ,基本的には最新版を使うほうが良いと思うので,アップデートがあればしておきましょう.

使用するボード

使うのはこちらのボード 2 つです.

あまり見ない見た目をしていると思いますが,これは以前,入院していた時に暇つぶしに設計したものです.入院中ってマジで暇なんですよね.することないので.
搭載モジュールは ESP32-WROOM-32E で,なんということはない開発ボードです.

一方は試作バージョンで,オンボード LED がないもの(光ってるのは電源インジケータ).他方は製品版で GPIO 4 番に LED を繋いでいる以外に変更はありません.
これ以降,便宜上「ボード 1」と「ボード 2」と呼び分けます.前者が LED を積んでいない試作版です.

本編

それでは ESP-NOW で遊んでみましょう.まずは下準備から.
ここからは環境差異が生じる部分が含まれます.必要に応じて読み替えていってください.

MAC アドレスを調べる

MAC アドレスを使って送信相手を判別するので,MAC アドレスを調べておく必要があります.
以下のコードを実行して MAC アドレスを見てみましょう.

#include <WiFi.h>

void setup() {
  Serial.begin(115200);

  WiFi.mode(WIFI_STA);  // Wi-Fi モードをステーションモードにしておく

  delay(100);  // これ無しで実行したら 00:00:00:00:00:00 と表示されたので一応入れてある

  Serial.print("MAC Address: ");
  Serial.println(WiFi.macAddress());
}

void loop() {
}

上記プログラムを用いて今回使うボードの MAC アドレスを見てみたところ,以下の通りでした.

ボード 1 :08:B6:1F:FD:D2:CC
ボード 2 :34:98:7A:8F:24:A8

MAC アドレスは分かったので,実際に通信をするためのコードを書いてみます.

初期化ルーチン

ここは送受信ともに共通みたいです.

#include <esp_now.h>
#include <WiFi.h>

#define LED_BUILTIN 4  // 回路に合わせて変更してください


void setup() {
  Seria.begin(115200);  // シリアルデバッグ用

  WiFi.mode(WIFI_STA);  // Wi-Fi モードをステーションモードに設定

  delay(100);  // 一応待ってみる

  Serial.print("MAC Address: ");  // MAC アドレスを表示させる
  Serial.println(WiFi.macAddress());  // いらないなら消してね

  pinMode(LED_BUILTIN, OUTPUT);

  if(esp_now_init() == ESP_OK){  // 初期化が正しく通ったかの判別
    Serial.println("Success to initialize ESP-NOW");
  }else {  // 初期化に失敗した時の処理
    Serial.println("Error initializing ESP-NOW");

    while(true) {  // 初期化失敗したときに入る無限ループ
      digitalWrite(LED_BUILTIN, HIGH);
      delay(50);
      digitalWrite(LED_BUILTIN,  LOW);
      delay(50);
    }
  }
}

この時点で一旦動かしてみます.ボード 1 / 2 両方に書き込んでみました.

結果:

Success to initialize ESP-NOW

表示されました.問題なさそうですね.
この時点で何かしら問題が発生するようであれば何かがおかしいので見直したり調べたりしてみましょう.

送信側コード

とりあえず最低限動くであろうコードを書いてみました.

#include <esp_now.h>
#include <WiFi.h>

#define LED_BUILTIN 4  // 回路に合わせて変更

uint8_t target_address[] = {0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX};  // 相手の MAC アドレス

esp_now_peer_info_t peer_info;  // 接続先(ピア)の情報を保持するための構造体

char send_data_buffer[] = "This is sample text data for the ESP32 ESP-NOW test.\n";  // 送信する文字列

void esp_now_callback(const uint8_t *mac_addr, esp_now_send_status_t status) {
  Serial.println(status == ESP_NOW_SEND_SUCCESS ? "ESP-NOW data send success" : "ESP-NOW data send failed");
}

void send_data() {
  esp_now_send(target_address, (uint8_t*)&send_data_buffer, sizeof(send_data_buffer));
}

void setup() {
  Serial.begin(115200);  // シリアルデバッグ用

  WiFi.mode(WIFI_STA);  // Wi-Fi モードをステーションモードに設定

  delay(100);  // 一応待ってみる

  Serial.print("MAC Address: ");
  Serial.println(WiFi.macAddress());

  pinMode(LED_BUILTIN, OUTPUT);

  if(esp_now_init() == ESP_OK){  // 初期化が正しく通ったかの判別
    Serial.println("Success to initialize ESP-NOW");
  }else {  // 初期化に失敗した時の処理
    Serial.println("Error initializing ESP-NOW");

    while(true) {  // 初期化失敗したときに入る無限ループ
      digitalWrite(LED_BUILTIN, HIGH);
      delay(50);
      digitalWrite(LED_BUILTIN,  LOW);
      delay(50);
    }
  }

  memcpy(peer_info.peer_addr, target_address, 6);
  peer_info.channel = 0;      // Wi-Fi のチャンネル選択  
  peer_info.encrypt = false;  // 暗号化の有無

  if(esp_now_add_peer(&peer_info) == ESP_OK) {
    Serial.println("Successed to add peer");
  }else {
    Serial.println("Faild to add peer");
  }

  esp_now_register_send_cb(esp_now_callback);  // こうすることで送信結果を得ることができる
}

void loop() {
  send_data();

  delay(1000);
}

受信側コード

同様に最低限のコードです.

#include <esp_now.h>
#include <WiFi.h>

#define LED_BUILTIN 4  // 回路に合わせて変更

void esp_now_callback(const esp_now_recv_info *esp_now_recieve_info, const unsigned char *recieve_data, int length) {
  char recieve_data_buffer[length];  // 受信データ格納用

  sprintf(recieve_data_buffer, "%s", recieve_data);

  Serial.print(recieve_data_buffer);
}

void setup() {
  Serial.begin(115200);  // シリアルデバッグ用

  WiFi.mode(WIFI_STA);  // Wi-Fi モードをステーションモードに設定

  delay(100);  // 一応待ってみる

  Serial.print("MAC Address: ");
  Serial.println(WiFi.macAddress());

  pinMode(LED_BUILTIN, OUTPUT);

  if(esp_now_init() == ESP_OK){  // 初期化が正しく通ったかの判別
    Serial.println("Success to initialize ESP-NOW");
  }else {  // 初期化に失敗した時の処理
    Serial.println("Error initializing ESP-NOW");

    while(true) {  // 初期化失敗したときに入る無限ループ
      digitalWrite(LED_BUILTIN, HIGH);
      delay(50);
      digitalWrite(LED_BUILTIN,  LOW);
      delay(50);
    }
  }

  esp_now_register_recv_cb(esp_now_callback);  // データ受信時に呼び出される関数を登録
}

void loop() {
}

動かしてみる

ほとんど上記コードそのままで動くはずです.やってみましょう.
受信側から先に書き込んでみます.送信側を先にやってしまうと,受信側にプログラムを転送して動き始めるまで送信エラーが出続けることになってしまいそうなので.

転送しました.実行結果がこちら.

左側が送信側 ESP32(ボード 1),右側が受信側 ESP32(ボード 2)です.

送信側で ESP-NOW data send failed と出ているのは受信側の EN スイッチを押下して起動を止めていた間です.離したらすぐに ESP-NOW data send success に戻っていますね.

peer_info.encrypt = false;

とありますが,ここを true にするとうまいこと通信ができませんでした.なのでひとまず false にしておくことをオススメします.

LED を遠隔操作

上記コードを元に,遠隔操作をするプログラムを書いてみましょう.

送信側コード

#include <esp_now.h>
#include <WiFi.h>

#define LED_BUILTIN 4  // 回路に合わせて変更

uint8_t target_address[] = {0x34, 0x98, 0x7A, 0x8F, 0x24, 0xA8};  // 相手の MAC アドレス

esp_now_peer_info_t peer_info;  // 接続先(ピア)の情報を保持するための構造体

void esp_now_callback(const uint8_t *mac_addr, esp_now_send_status_t status) {
  Serial.println(status == ESP_NOW_SEND_SUCCESS ? "ESP-NOW data send success" : "ESP-NOW data send failed");
}

void send_data(const bool status) {
  uint8_t data = status ? 1 : 0;
  esp_now_send(target_address, &data, sizeof(status));
}

void setup() {
  Serial.begin(115200);  // シリアルデバッグ用

  WiFi.mode(WIFI_STA);  // Wi-Fi モードをステーションモードに設定

  delay(100);  // 一応待ってみる

  Serial.print("MAC Address: ");
  Serial.println(WiFi.macAddress());

  pinMode(LED_BUILTIN, OUTPUT);

  if(esp_now_init() == ESP_OK){  // 初期化が正しく通ったかの判別
    Serial.println("Success to initialize ESP-NOW");
  }else {  // 初期化に失敗した時の処理
    Serial.println("Error initializing ESP-NOW");

    while(true) {  // 初期化失敗したときに入る無限ループ
      digitalWrite(LED_BUILTIN, HIGH);
      delay(50);
      digitalWrite(LED_BUILTIN,  LOW);
      delay(50);
    }
  }

  memcpy(peer_info.peer_addr, target_address, 6);
  peer_info.channel = 0;      // Wi-Fi のチャンネル選択  
  peer_info.encrypt = false;  // 暗号化の有無

  if(esp_now_add_peer(&peer_info) == ESP_OK) {
    Serial.println("Successed to add peer");
  }else {
    Serial.println("Faild to add peer");
  }

  esp_now_register_send_cb(esp_now_callback);  // こうすることで送信結果を得ることができる
}

void loop() {
  send_data(true);

  delay(1000);

  send_data(false);

  delay(1000);
}

受信側コード

#include <esp_now.h>
#include <WiFi.h>

#define LED_BUILTIN 4  // 回路に合わせて変更

void esp_now_callback(const esp_now_recv_info *esp_now_recieve_info, const uint8_t *recieve_data, int length) {
  uint8_t data;
  memcpy(&data, recieve_data, length);

  Serial.print("data recieved!!\n");
  Serial.println(data);

  digitalWrite(LED_BUILTIN, (data == 1) ? HIGH : LOW);
}

void setup() {
  Serial.begin(115200);  // シリアルデバッグ用

  WiFi.mode(WIFI_STA);  // Wi-Fi モードをステーションモードに設定

  delay(100);  // 一応待ってみる

  Serial.print("MAC Address: ");
  Serial.println(WiFi.macAddress());

  pinMode(LED_BUILTIN, OUTPUT);

  if(esp_now_init() == ESP_OK){  // 初期化が正しく通ったかの判別
    Serial.println("Success to initialize ESP-NOW");
  }else {  // 初期化に失敗した時の処理
    Serial.println("Error initializing ESP-NOW");

    while(true) {  // 初期化失敗したときに入る無限ループ
      digitalWrite(LED_BUILTIN, HIGH);
      delay(50);
      digitalWrite(LED_BUILTIN,  LOW);
      delay(50);
    }
  }

  esp_now_register_recv_cb(esp_now_callback);  // データ受信時に呼び出される関数を登録
}

void loop() {
}

これは実際に動かしてみて欲しいですが,LED が点滅するはずです.
試しに送信側を止めてみると点滅が止まると思います.

あとがき

多少の試行錯誤は必要でしたが,比較的すんなり動かすことができました.
250 Byte までなら送れるので,例えばラジコンに使ってみるとか,IoT ネットワークを組んでみるとか,色々使いではあると思います.

ところで Arduino IDE での ESP32 のビルドめっちゃ時間かかるのなんとかならんのですかね.

2024 年の振り返りと 2025 年の抱負

あけましておめでとうございます(遅い)(もう 1 週間経ってるってマジ?)

まず初めに去年のやつをぺちっとな.

2024 年の目標をつらつらと - MOSの覚書

ここで,去年の目標として「誰かに興味を持ってもらえるようなものを作りたい」を設定しました.これについて簡単に振り返ろうと思います.
結論から言うと,多少はできたかなという感じです.制作物を振り返りつつそう思った理由を以下に.

2024 年の制作物振り返り

まず,去年何作ったっけ・・・という思い出しから始まるわけですが,大抵のものは Twitter に残しているので掘り返しました.
結果 Twitter の検索が使い物にならんかったので,思い出せる範囲で書いていきます.

Audio Visualizer

良さげな画像がなかった・・・

これは音声信号を可視化することができるもので,横方向に周波数別のレベルメータを並べたものです.
構造は単純で,LPF / BPF / HPF を 8 つ並べ,12 階調のレベルメータ回路に入力しているだけです.

レベルメータ回路部分に関しては専用の IC を使っても良かったんですが,入手性が悪いのと,そもそも 12 階調に対応できるものがないので,コンパレータと抵抗を使って気合で作りました.はんだ付けめっちゃ大変だった.
フィルタ回路部分に関してもオペアンプを使って作っていて,確か多重帰還型とかいう回路だったと思います.そのせいで部品点数がえらいことに.

まぁこれの結果は YouTube を見れば一目瞭然で,結構いい反応を頂けたかなと思います.

youtu.be

ちなみにこれは少数ながらキットとして頒布したので後述の「リリースした製品」のカウントに入れることとします.

両電源基板

DC の 9 ~ 12V を入力すると ±12V とかにしてくれる電源を作ってみました.
以下は CAD イメージ.

これも後述の「リリースした製品」にカウントです.

温度計(気温計)

そういや手持ちに室温見れるやつないなと思って作ったやつです.(プログラムはまだ未完成だけど形は仕上がったので 2024 年の制作物判定で)

これについては語ることはないです.マイコンも手持ちの ATmega4809 を使っただけですが正直贅沢すぎたかな.

オーディオスペクトラムアナライザ

これは先にあげたやつのデジタル版です.GitHub 見てたら見つけたものをそのまま作りました.
私は何もしていないので作ったと言って良いのか分からないですが一応挙げておきます.

参考にした(というかパクった)やつはこれ↓

github.com

自作ギターエフェクタ

Modulo-Effect って名前つけたやつです.CG 画像しか手元になかったので CG 画像載せときます.(写真を撮れ)

コンセプトは,ファミコンみたいにカセット式のエフェクタで,カセットの方にエフェクタとしての機能を実装しています.
なので,歪み系の基板を挿せばディストーション / オーバードライブとして,アンプ基板を挿せばプリアンプとして機能します.

これは年内に発売したかったんですが無理でした.なので今年こそはって思ってます.

デバッグ中の様子載せときますかね.

PSG 音源で遊ぶ基板

これは特に名前をつけてないので,こう書きました.
オークションで入手した音源 IC で遊んだだけですが,一応基板も作ったので挙げておきます.

Trainer

これはサークルでの教育用に作ったやつです.サンプルコードの作成にちょっと苦労しました.
特に言うことはないです.一応オープンソースにしてるのでお好きにどうぞ.

https://github.com/I-Sys-UF/Trainer/

目標は達成できたか?

最初の方に書いた通り,多少はできたかなという感じです.多少というのは,ものづくりと平行してやっていた動画制作の方が比較的好調だったからです.旅動画を除いて ← まぁみんな興味ないからね
アナリティクスたまに見るんですが,思ってたより再生してくれてて嬉しい限りです.

まぁそれはさておき,NT 金沢の話をしましょう.

NT 金沢で Audio Visualizer と PSG 音源の展示をしました.結果,特に昔電子工作をされていたり,PC で遊んだりされていた方から「懐かしい」という感想を頂きました.
モノ自体が結構昔のもので,大先輩方が現役の頃に出回っていたものっぽいです.

NT 系のイベントは今後も出していこうと思っています.直近だと京都かな?

ただ,完全に達成できたとは言えないので,今年こそはって思っています.今年こそは.

「やりたいこと」ができたか

目標と同時に,「やりたいこと」も挙げていました.以下の 4 つです.

  • 工具をもっと充実させる
  • NT {任意} に出展する
  • 製品を 3 つリリースする
  • YouTube に何本か動画を投稿する

一つ一つ見ていきましょう.

工具をもっと充実させる

これに関しては道半ばながらまぁできたかなという感じです.
当時欲しかった Hakko FX-600 は買えましたし.

あとは電動のハンダ吸い取り器とかですかねぇ.

NT {任意} に出展する

これは明確にできたと言っていいでしょう.だって NT 金沢に出したのだから.

これは継続していきたいですね.制作物の大きなアウトプット先になります.

製品を 3 つリリースする

これは多分できたと思います.Booth に出品したものベースでいけば.

YouTube に何本か動画を投稿する

これも明確にできました.何本かどころか何本も投稿できたと思います.

2025 年の抱負・目標

去年できなかった,あるいは中途半端に終わった以下のことを引き続き目指したいと思います.

  • 誰かに興味を持ってもらえるようなものを作る
  • 工具をもっと充実させる

そして,以下のものを目標にしていきたいと思っています.

  • 作品のアウトプットを積極的にやる
  • 製品を 3 つリリースする
  • YouTube に動画を 18 本投稿する

作品のアウトプットを積極的にやる

Twitter に書くだけじゃ流れていってしまうので,ブログなり YouTube なりにも残していきたいと思っています.
ハッシュタグ,作ろうかな.#MOS旅 みたいに.

製品を 3 つリリースする

これは今後も継続していきたいやつです.どこかの年で限界が来そうですけど.

YouTube に動画を 18 本投稿する

これは月あたり 1.5 本を目安としての値です.現実的であろうラインを考えてこうしました.無理な目標立ててもしょうがないからね.

YouTube 関連のサブの目標として,登録者 1,000 人,そして収益化を目指そうと思います.

おわりに

今年の目標は現実的なものを設定してみました.頑張らないと達成はできないけど,ちょっと頑張れば行けるラインです.
どうせなら現実的な目標にして,それを目指していければいいんじゃないかなというわけです.

てなわけで,2024 の振り返りと 2025 の目標の話でした.思い返してみると去年あんまりものづくりできてないような気がするので今年は無理のない範囲で頑張ろうと思います.制作もアウトプットもね.

では以上.またお会いしましょう.

個人サークルの名称変更についてお知らせ

これまで Nch-Lab としてやってきた個人サークル(所属 3 名)を改称します

新しい名前は「MOS Electronics」で,省略名称「MOS Elecs」です

この変更に伴い,運用しているドメイン名や YouTube チャンネルの名前も変更となります
これらは随時変更していきますのでよろしくお願いします

今後とも Nch-Lab 改め MOS Electronics を,どうぞよろしくお願い申し上げます

MOS

2024 年の目標をつらつらと

あけましておめでとうございます(遅い).MOS でございます

2024 年になったということで,今年の目標ややりたいことなどをまとめておこうと思います

目標

今年の目標.一言でいうと「誰かに興味を持ってもらえるようなものを作りたい」です.そう思った理由について簡単に

2023 年までは,自分が欲しいと思ったもの,作りたいと思ったものばかりを作っていました.まあそれはそれで楽しいんですが,将来性があまりないなと思いました.せっかくなら自分が作ったやつで誰かに楽しんで欲しいものです.そういうわけで,とりあえず誰かに興味を持ってもらえるようなものを作るということを目標にしてみました.ただ他人の興味というものを知るのはなかなか難しいと思うので,可能な限り,という感じになるかとは思っています

やりたいこと

まず現時点でやりたいと思っていることを箇条書きし,それぞれについて二言三言書き残す感じでいきますかね

  • 工具をもっと充実させる
  • NT {任意} に出展する
  • 製品を 3 つリリースする
  • YouTube に何本か動画を投稿する

工具をもっと充実させる

現時点で使ってる道具でもそれなりにできてはいるんですが,ハンダゴテはコテ先が固着してしまっていたり,ニッパは錆びてきていたり(使えないわけではないので手入れするだけ)と,不満がないわけでもないので,そこを改善したいと思っています
例えばコテは白光の FX-600 にしたいし,ペンチ,ニッパ,ピンセットの種類を充実させたい.電動ハンダ吸い取り器も欲しい.等.お金がかかりそうな予感がしますがこれは追い追い...

本当は作業専用の場所も欲しいんですが,エレクトーンをどかさないことには場所は作れないし,かといってエレクトーンをどかすわけにも行かないので引っ越すまでは諦めですかねぇ

NT {任意} に出展する

例年各地で開催される NT,それに出展したいと思っています
場所と次期的に金沢くらいしか出せないかなぁ

製品を 3 つリリースする

趣味で作っている基板を使った製品というか,いうなればキットみたいなものをいくつか出したいと思っています
今のところ考えているのは両電源出力の定電圧回路キット,Audio Visualizer,ポータブルゲームハードです.最後のに関しては実現可能性はだいぶ低いと思っていてください.自分もそう思っているので

YouTube に何本か動画を投稿する

YouTube チャンネル自体は持っていますが,ほぼライブ配信用にしか使っていないので,キットの組み立て動画とか,簡単な電子工作の動画とか,そういうのを出したいなと思っています
カメラ買ったら本格的に始めようかなぁ(やらんやつ)

締め

本年も私 MOS 及び Nch-Lab をよろしくお願い申し上げます mm