2026年3月14日土曜日

USBシリアルアダプタでのESP32-C3へのプログラム書き込み

前回書いたESP32-C3-ROOMSにプログラムが書き込めなかった件 に対応するためbootモードを切り替えるピンをGPIO0からGPIO9に変更しました。しかし書き込めない。

ESP32-C3 Technical Reference Manual を参照したらJoint Download Boot mode(USB-Serial-JTAG)のときは、GPIO9をLowにして、かつGPIO8をHighにする必要があった。最初から確認しておけよ>自分


という訳で、GPIO8を10Kの抵抗でプルアップして書き込んだら無事にプログラムを書き込めました。

ESP32-DevKitなどは自動でプログラム書き込みモードを切り替えてくれますが、生のESP32は以下のシーケンスでモードを切り替える必要があります。
  • BOOTボタン押す(ESP32-WROOMはGPIO0;ESP32-C3はGPIO9だった)
  • RESET(EN)押す
  • RESET離す
  • BOOT離す
  • 書き込み
そこで書き込みモードを自動切換えできるアダプタをUSBシリアルアダプタに繋いで使っています。その昔、トランジスタ技術SPECIAL No.144 ペタッと貼れるWi-FiマイコンESP入門の記事にあった回路を流用して作りました。

FT232を使った市販のUSBシリアルアダプタに、書き込みモード切替アダプタを追加しています。



回路図(クリックで拡大できます)。BOOTとENはターゲット基板のほうでプルアップした方がよいかと思いアダプタ内ではプルアップしていません。でも、今回は見守りセンサ内でもプルアップしていませんが、一応動いています。


以下のようにターゲット基板に挿して書き込みます。一応、LINEに通知が届くまで動作確認できました。


少し見守りプログラムを見直そうと考えています。
  • 何事もなくても「見守り動作中」であることを月に1回程度はLINEに通知する。
    電源が抜けるなど何らかのトラブルで見守りできていないことを防止するため。
  • 留守モード(旅行など)にした場合でも1週間で帰宅反応がない場合は通知
  • 他にも何か思いついたら追加

2026年3月8日日曜日

LINEに通知する見守りセンサを仕上げる(まだ未完)

日に日に暖かくなってきてそろそろ梅の花が終わり、まもなく桜の季節です。出かけたりするにはよい気候になりました。しかし、花粉症が酷くてこのところの週末は家に引き籠っています。

昨日まで作っていた LED照明の非接触スイッチ は、電源モジュールが届くまで保留です。今日は昨年作った LINEに通知する見守りセンサのプロトタイプ をユニバーサル基板に載せて、ケース加工まで行いました。

ESP32はプロトタイプから変更して、ピン数の少ない小型のESP32-C3-WROOM-02です。初めて使います。


裏側はこんな感じ。3.3Vの3端子レギュレータと、タクトスイッチを基板の裏側に実装しています。


ケースに収める前にプログラムの書き込みをしたら、エラーで書き込めません。配線を確認しましたが問題なし。エラーメッセージをChatGPTに聞いたら、色々考えられる原因のひとつとして、書き込むときにBOOTボタンを押して(IO9=LOW)ない可能性を指摘されました。

確かにIO9はオープンのままです。今まで使ってたESP32-WROOM-32Eは、BOOTボタンがIO0だったので、今回もIO0のままにしていたのが間違い。ChatGPT凄いな。

書き込みは市販のUSBシリアル変換アダプタ自作アダプタを追加して以下の処理を自動的に行うようにしてしますが、この接続先がGPIO0のままだったのが原因の模様。
  • BOOTボタン押す(GPIO9=LOW)
  • RESET(EN)押す
  • RESET離す
  • BOOT離す
  • 書き込み
今日は花粉症もあって目が疲れてきたので、IO0 から IO9への変更は後日にします。解決するとよいのですが。

2026年3月7日土曜日

TOFセンサを使った非接触スイッチ、電源トラブル

TOFセンサを使ったスイッチは最後になって少し手直しが必要でしたが、一応AC100Vをコントロールできるようになりました。センサの前面を手の平で遮ることで白熱電球をオンオフできています。

トラブルの発見は、SSRのコントロール用LEDと逆向きにパイロット用白色LEDを繋いでいたのですが、この白色LEDがチラチラ点滅していたことで気付いた。実際には消えてないのですが、電位がパルス状に0.1V位上下しているので点滅のように見えます。

オシロで電源電位を見てみると、TOFセンサがアクティブになると電位が下がって、かつ波打っていました。原因はトランスレス電源の電源容量が足りないとだと推測。TOFセンサはセンス時にレーザ光を発するために断続的に比較的大きな電流が流れます。このため電源電圧が不安定だったようです。

白色LEDの光度だけの問題で、SSRの動作には影響ないようでしたが、念のため電源部の電解コンデンサを200μFから470μF×3個の1,410μFに増量しました。場所がなくてダイオードブリッジとPICの上に寝かせています。それでも白色LEDのチラチラは治まらない。3.1V~3.2V位で波打っていたので白色LEDの順方向電圧に近くて目立ったのだと思う。

最終的に白色LEDは別系統で100Vに繋ぐことにしました。100KΩ抵抗を直列に入れて、LEDとは逆向きのダイオードも入れてます。常時点灯してしまうのと50Hzでチラチラしますが妥協です。

今回、LED照明の端っこのカバーに内蔵するのでスペース的に余裕がなくてトランスレス電源にしましたが、ちゃんとAC100VからDC 3Vを出力する電源モジュールを使ったほうがよいです。

と、ここまで書いてアリエク薄型の小型電源モジュールを見つけました。ギリギリ収まりそうなので注文。送料が安くて国際郵便だと思うので到着までしばらくかかりそう。また、これを使うとヒューズが収まりそうにないので、ヒューズは外付けします。

2026年3月4日水曜日

TOFセンサによる近接スイッチ WDT実装他

例年になく花粉症が酷くなって、目がしょぼしょぼしています。鼻も詰まって十分な睡眠が取れてない。今日は会議で眠気を抑えるのが大変でした。以前も書いたけど、日本中で生産性が落ちて経済損失になっているのではないかと思う。

夕食後しょぼしょぼ目の状態でパソコンを睨んで、TOFセンサを使った近接スイッチ(非接触スイッチ)のプログラムを見直しました。

ひとつはWDT(ワッチドッグタイマ)による無限ループ監視です。I2Cをソフトで実現しているのと、TOFセンサからの応答が想定外だったりして無限ループする可能性があるので、その対策です。WDTはタイマのカウント溢れにより約18ms毎にリセットがかかるものです。無限ループしていてもリセットで初期状態(プログラムの先頭に飛ぶ)になります。プログラムが正常に動いているときは、カウンタが溢れる前にWDTをクリアするCLRWDT命令を発行することでリセットがかからないようにします。

18msは短いのでプリスケーラを使ってもう少し時間を空けても大丈夫なように調整します。今回、1:32のプリスケーラ設定で18ms x 32 = 576ms以内にWDTをクリアするようにしました。18msの精度はあまり高くないようなので余裕を見て早めにクリアするようにしています。

先週末にPICやTOFセンサはユニバーサル基板に実装しましたが、もう1セットあるのでそちらを使いブレッドボード上でデバッグ中。某ジャンカー界隈では「ジャンクは2個買え」という教えがあるようですが、「部品も2個買え」です。万が一壊れていたときなど、自分が悪いのか部品が悪いのかの切り分けにも必要です。こうして部品が溜まっていく。

プログラムの二つ目の見直しは、小型液晶画面への表示機能の削除です。TOFセンサのデバッグ時に距離を表示していたI2Cで繋ぐ小型液晶は不要なので回路からも外し、プログラムからも削除します。液晶に数字を表示するために組み込んでいたBCD変換(バイナリから2進化10進数変換)のコードを削除したり、表示するコードを削除。これにより変数レジスタもかなり削減されたので整理しました。また、無駄なコードも見直して少しすっきり。

これで週末にはLED照明に組み込める目途は付きました。まだ修正するかも知れないので、ソースの公開はもう少ししてから。

2026年3月1日日曜日

TOFセンサによる近接スイッチのユニバーサル基板実装

花粉症が酷いので外出もせず、昨日のToFセンサによる近接スイッチのLED照明への組み込みの続きです。と言っても昨日は何もしなかったのですが。LED照明のカバー内へ組み込むためにユニバーサル基板に載せてみました。

写真はトランスレス電源が正しく動いているかの確認をしているところです。左の白い2本のコードからAC100Vを供給しています。ツェナーダイオードが手元に3.3Vのものしかなかったので、出力先にシリコンダイオードを直列に入れて少し電圧をドロップさせています。それでもLED程度の負荷で3.2V弱でていました。ToFセンサの定格3Vを若干オーバしていますが、PICやToFセンサを繋げば若干下がることを期待。


トランスレス電源が上手く動いていることが確認できたので、他の部品も載せて基板内の配線まで完了です。基板の中央が空いているのは、ここにLED照明の電源コネクタがくるためです。黄色いコードが出力で、LED照明の電源部に接続します。


全景はこんな感じ。カバーにToFセンサの長円穴、その隣にΦ3mmのLED用の穴を開けました。LEDはパイロットランプとして、LED照明が点灯していないときに点灯させます。夜、真っ暗な中でスイッチの場所が分かるように。


昨日の写真の再掲ですが、上記の基板を収める場所がここのカバーです。


今日の作業はここまで。今週どこかでプログラムの改変を行うつもりです。昨日書いたWDTによる無限ループ監視と、プロトタイプで距離を表示していたLCD表示の削除です。

今週末には完成させて、キッチンに取り付けたい、と思っています。そのためにも花粉症が酷くならないことを願っています。