2022年11月6日日曜日

メカナムホイールのラジコンをPS3コンで動かす

 もう3ヶ月ぐらい立ってしまったけど改造を勧めていたメカナムホイールのラジコンは結局ESP32-WROOM-32Eを載せることに。RoverCみたいにRaspberry Pi Picoとかを使ってI2CスレーブデバイスにすべくテストもしてみたけどESP32をそのまま乗せるのが手っ取り早そうだったので。ポート数も多いし。

というわけで早速基板の改造。もうアナログスティックの操作感を知ってしまったらもとに戻すワケがないので残っていたレシーバーの部品もろとも全て外してしまった。
テスト用に出していたケーブルも一旦撤去。

SOT-23の3.3Vレギュレータとか3.3Vラインのコンデンサとかも全て取り外してMX1616だけにした。LEDの抵抗とコネクタも取り外し。LEDは電源入れたときにずっと光ってるだけだし、後でESP32から制御できるように変更してステータス表示に使おうかな。
ESP32用にSOT-89サイズの3.3Vレギュレータを搭載。LEDの抵抗があったところがちょうどいい感じだった。今回はAP7215なのでESP32でも行けそう。
最初からついていた3.3Vじゃ全然足りないだろうしな…
ESP32-WROOM-32Eは基板に垂直に置くと入りそうだったので使わないところはショートしないようにカプトンテープで保護。

ESP32とモータードライバはポリウレタン銅線を使用して接続。ESP32はGPIO マトリックスがついているので便利だなぁ。
モータドライブICのMX1616が2つ乗ってるのでモータ駆動用に8本(今回は12,13,14,27,16,17,18,19を使用)、あとはバッテリ残量を見るために10kΩ2つでバッテリ電圧を分圧してADCに(33を使用)。ボタンとLEDもつけたいな。
一応書込み端子もつけておいた。(IO0とENも出してある)
隙間にESP32がピッタリ入る感じ。
前に作ったESP-WROOM-02用の自動書込みアダプタをとりあえず装着してスケッチを書き込んで見る。とりあえずは前にESP32をのっけてみたときに作ったXboxコントローラ用のスケッチをPS3用に直して、モータドライバもSlow Decayのほうがコントロール性が良かったのでそちらに変更。あとはPWMの周波数を14kHzぐらいにして低速時でも静かになった。

とりあえずPS3コントローラで動くようになったけどたまにESP32がリセットして接続が切れたりするのでノイズ対策しないとだめかな…
あとはESP32の電源かリセット周りをちょっと見直してみるか…
Xboxコントローラで遊んでいたときはESP32の開発ボードをモバイルバッテリで動かしていたし、ESP32がここまでモータの近くになかったためか、特に問題なく遊べていた。
あとスケッチもまだバグってて、ある特定の動作をすると突然モータの回転が反転して変な動きをする。どっか値がオーバーフローしてそうなのでそこも直さないと。

しかしこのメカナムホイールなラジコン、メカナムロボットキットより安いのにモータドライバとバッテリまでついてコスパ高いなぁ

2022年10月30日日曜日

ESP32でDUALSHOCK3を使ってみた

 というわけで前回修理したPS3コントローラをESP32で使ってみた。

PS3コントローラはBluetoothなんだけど、PS3本体とペアリングするときはUSBで本体に接続してペアリングされる。どうやらコントローラ内部にホストのMACアドレスを記録させてるみたい。

ESP32とペアリングするときも同様でESP32のBluetoothのMACアドレスとPS3コントローラ内部に登録されているMACアドレスが同じにならないといけない。というわけでPS3コントローラをUSBでPCに繋いでMACアドレスを登録、もしくは確認する必要があるっぽい。

そこで必要なツールがSixaxisPairTool 0.3.1
PS3コントローラ自体結構古いのでリンクが切れていることが多かったのでこちらからダウンロードさせてもらった。

インストールしてSixaxisPairToolを起動してPS3コントローラを差し込むと自動でドライバがインストールされてMACアドレスの表示、書き換えが可能になる。

Current Masterが現在コントローラに登録されているマスターのMACアドレス。ESP32のMACアドレスをこれに変更してもいいし、Change MasterにESP32のMACアドレスを入れてUpdateしても良い。どっちもやってみたんだけど、ESP32を変えるたびにこのツールで書き換えるのも面倒なので適当なMACアドレスを書き込んでおいてESP32側のMACアドレスを変更したほうが便利かも。unicast MACじゃないとESP32側で怒られるので適当なMACアドレスを作りたい場合はRandom MAC Address Generatorとかを使うといいかも。

とりあえず上記の様な適当なMACアドレスを書き込んだらArduino IDE側の設定。今回はESP32 Arduino Core 2.0.5を使用した。(Arduino IDEはWindows Store 1.8.57)
スケッチ→ライブラリをインクルード→ライブラリマネージャーを開いて
PS3 Controller Hostを検索してインストールする。
これでArduino IDE側の準備は完了。とりあえずサンプルスケッチのPS3Demoを動かしてみる。
Ps3.begin("01:02:03:04:05:06");
のところをさっきコントローラーに書き込んだMACアドレスに変更する。(大文字小文字は関係ない)
ちなみにこの01:02:03:04:05:06はunicast MACじゃないのでSixaxis Pair ToolでこのMACアドレスを書き込んでもペアリング出来ないとおもう。

今回は1a:3c:13:00:21:c2をコントローラに記録したので
Ps3.begin("01:02:03:04:05:06");
を
Ps3.begin("1a:3c:13:00:21:c2");
に変更した。

Sixaxis Pair ToolでESP32のBluetoothのMACアドレスを書き込む場合はサンプルスケッチの中にPs3Address.inoがあるのでそれをESP32に書き込んでシリアルコンソールからESP32のBluetooth MACアドレスが確認できる。そのMACを先程のSixaxis Pair Toolでコントローラに登録すればオッケー。
その場合はESP32のMACアドレスを書き換えなくて良いので
Ps3.begin("01:02:03:04:05:06");
のところを
Ps3.begin();
のように変更する。

変更したサンプルスケッチをESP32に書き込んで、PSボタンを押すと接続されてコントローラのLEDが変化するはず。
もしLED4個が同時に点滅してなかなかつながらない場合はツールのボード設定のところの"Erase All Flash Before Sketch Upload"をEnableにすると良い。自分はここでハマった。ESP32 Arduino Coreのバージョンを1.0.4とかに下げるとうまくつながるんだけど2.0.4とか2.0.5で接続できなくて、いろいろ試していた結果一旦すべてのFlashをクリアすると治るっぽい。2.0.5の状態でいろいろ試してみたが、一回接続されるとFlashをクリアしない設定でもちゃんと繋がるようになった。
それでもつながらない場合は多分MACアドレスの設定をミスっている。(unicast MACじゃないとか)

とりあえず今回はPS3コントローラがESP32で使えるようになった。BLEファームにアップデートしたXbox OneコントローラをBLEで接続するよりも断然ペアリングが早い。コントローラの4つのLEDもESP32側から設定できるっぽい。

Wiiのヌンチャクもi2c接続なので便利なんだけど、550円でBluetoothとバッテリ搭載されててESP32とそのまま通信できるならPS3コントローラのほうがコスパいいかもしれない。

メカナムラジコンの改造さっさと完成させてこのコントローラで遊んでみたいな。

2022年10月29日土曜日

ジャンクなDUALSHOCK3を修理してみた

 ESP32でXbox OneコントローラをBLEでつなぐとやっぱり接続までの時間がかかるのでPS3とかPS4のコントローラを試したくて探していたんだけど、550円でジャンク品のPS3コントローラを見つけたので買ってみた。

数件回ってみたけど、PS3コンが1000円ぐらい、PS4コンが2200円ぐらいが最安な感じだった。(スティックが中心に戻らないやつとかボタンの感触が悪いやつでも)
そんな中で見つけた550円のジャンク品。○と✕ボタンが多少削れているし、ハウジングに隙間が開いている。
R側にかなり隙間が開いている。ケースが噛み合ってないみたいで押しても閉まらない。ボタンやスティックの感触は悪くなかったので買ってきてみた。

早速分解。すげー汚いので動作確認よりも前に分解してしまった。
中身も結構汚いけど分解した形跡はなさそう。ゴムはボロボロになっていなかったけどだいぶ力強く押されていたのか、ボタンとかスティックのヘリ具合がやばい。白く粉が出ているぐらいだし。ケースが噛み合っていないのもぶん投げたんじゃないのかな…?
とくに左スティックの摩耗が激しかった。スティックの摺動部分はすげーことになってるのにトップのゴムはヘタっていなかったり、使い方が荒いだけで結構新しい感じ。
スティックの摺動部分には溝ができるぐらい削れていた。

一通り洗浄して仮組みの状態でUSBに繋いでみた。まさかのうんともすんとも言わないパターン…
もちろんバッテリは完全放電してそうだったがまさかの充電すらされないとは。バッテリはPHコネクタで、ピン配置もSkyfight Xのバッテリと同じだったのでSkyfightの充電器で充電してみた。(容量が540mAhだったので1C充電未満なので行けるでしょうということで)
バッテリのコネクタめっちゃ硬いのでコネクタの根本をラジペンでこじるようにして外さないとケーブル壊れそう。

バッテリをある程度充電して3.6Vぐらいになって繋いでみるとPSボタンを押すと全部のLEDが点滅するようになった。(10回ぐらいで消える。)基板は生きてそう。
ちなみに基板は小さいタイプだった。スティック部分がフレキになっているタイプ。
VX7なのでだいぶ新しい方かな。
そんでもって基板を外してみると実はMini USBが剥がれかかっていた…
この基板が小さいタイプ、Mini USBが面実装タイプなんだよなぁ…
MSU_VX7_0.04
基板を外して、USB端子の剥がれていた部分(左側のシールド部2箇所)をハンダしてみたけど改善されず。どうやら信号線まで剥がれていそう…
しかし信号線のところはジャイロセンサが垂直に付いてるので一旦外さないとはんだ付けできない。
このそびえ立つジャイロセンサを斜めカットはんだごてで慎重に取り外してみた。
意外と簡単に外れたけどこれ取り付けるの大変そう。
そんでもってMini USB端子の根本のハンダを付け直してまたジャイロセンサをハンダする。
取り付けのほうが難易度たけぇ。ジャイロセンサなのでちゃんと直角を出してハンダしないといけないし。浮いてると曲がってしまうのでちゃんと吸い取り線で平面を出してからハンダしてみた。

組み立ててUSBに繋いでみるとPCでもデバイスとして認識されるし、全部のLEDがゆっくり点滅するようになった。PCにドライバを入れてみるとLEDが消灯して一応ボタンもちゃんと動いていそうだったので無事修理完了。
ケースが浮いていた部分も分解した状態でマイナスドライバーで押したりして修正してはめ直したらある程度ちゃんと戻った。

とりあえず動く様になったので次回は本題のESP32で使用できるか試してみよう。


2022年9月23日金曜日

Sky Fight X用に260mAhのバッテリを試してみた。

 1000円で買ったSky Fight X、やっぱりバッテリが1個だと5分ぐらいしか遊べないので追加のバッテリを買ってみた。公式だと880円ぐらいするし、HS210用のやつも結構高いのでPHコネクタで入りそうなサイズのものをAliexpressでポチった。

もともと付属していたのが702025の220mAだったんだけど、今回は751732の260mAにしてみた。純正の交換用は852025の300mAっぽいけど。
純正のCレートがわからないけどとりあえず25Cのものを選択。どうやらCレートが低いと容量があっても1分ぐらいしか飛ばないらしい。容量詐欺の疑いもあるけど…

JJRCの260mAh 25Cが10個入で2550円だった。コネクタはPHコネクタで極性も純正と同じ。e010用らしいのでサイズも良さそうな感じがしたので。
搭載してみたところ、厚みはもともとついてた220mAのやつより薄いのでバッテリホルダに入れやすい。むしろこっちのほうが純正じゃないかっていうぐらいの収まり具合だった。

とりあえず落ちるぐらいまで飛ばして4~5分ぐらいは飛ぶ感じ。本体付属の充電器にUSBチェッカーを繋いで充電してみたら充電開始時で420mAぐらいで充電している。43分で満充電で220mAhっぽいのでいい感じのバッテリかも。

そんでもって充電器も一個だと大変だし、仲間内で山分けする予定だったので充電器も10個ポチってみた。これはTP4056のTypeCタイプの充電基板。Aliexpressで10枚セット390円だった。
PHコネクタは足を広げればギリギリハンダできた。
デフォルトだと充電電流設定用の抵抗(R3)に1.2kΩがついていて1A設定になっていたので、R3を2.2kΩに変更してみた。TypeC版の基板だと抵抗は1005サイズだった。
これでUSBチェッカーで見てみると520mAぐらいだったので大丈夫だろう。本来はバッテリの方の電流を測定するべきだけど…
特に発熱とかもなく充電できた。
こんな感じで容量が小さいバッテリに使う場合はR3を変更しないと危険なので注意。

あとこの基板、TypeCなのにCC1とCC2に何もつながっていないのでTypeAのケーブルしか使えない。

これでバッテリ3個ぐらい運用ならちょうどよい感。HS210用の250mAに比べて1/3のお値段で手に入ったし。
飛び方は純正バッテリと変わらない感。


2022年9月11日日曜日

aitendoの7セグ液晶をArduinoで使ってみた。

 先日解析した、aitendoのSVM343-1っていう7セグ液晶なんだけど、Arduinoで扱いやすい様にスケッチを作ってみた。ライブラリ化するともっと使いやすいかもしれないけどあんまり大きくないのでそのままスケッチに取り込んで使ってもいいかなとか思ったり。

ベースはこの前の解析用スケッチで、HT1621にソフトウェアSPIでデータを送るんだけど、各桁に表示しやすいようにした感じ。桁をまたぐようにレジスタが設定されているのでちょっと面倒だったけど、バッファに一旦orで書き込んで一気に転送する形にしてみた。LCD側から読み出すこともできそうだけど面倒だったので…

#define CLOCK 12
#define DATA 13
#define CS 11

#define COMMAND_MODE 0b10000000
#define WRITE_MODE 0b10100000

#define SYS_EN 0b00000010   //LCDバイアス発生機と発振器有効化
#define LCD_OFF 0b00000100  //LCDバイアス発生機無効化
#define LCD_ON 0b00000110   //LCDバイアス発生機有効化
#define RC256K 0b00110000   //内蔵RC発振器使用 (256kHz)

//7セグ表示用リスト
const uint8_t numArray[11] = {
  0b00111111,  //0
  0b00000110,  //1
  0b01011011,  //2
  0b01001111,  //3
  0b01100110,  //4
  0b01101101,  //5
  0b01111101,  //6
  0b00000111,  //7
  0b01111111,  //8
  0b01101111,  //9
  0b01000000   //マイナス
};

void writeBits(uint8_t data, uint8_t cnt) {
  for (uint8_t i = 0; i < cnt; i++, data <<= 1) {
    digitalWrite(CLOCK, LOW);
    digitalWrite(DATA, data & 0x80 ? HIGH : LOW);
    digitalWrite(CLOCK, HIGH);
  }
}

void write(uint8_t address, uint8_t data) {
  digitalWrite(CS, LOW);
  writeBits(WRITE_MODE, 3);
  writeBits(address << 3, 6);
  writeBits(data, 8);
  digitalWrite(CS, HIGH);
}

void cmd(uint8_t data) {
  digitalWrite(CS, LOW);
  writeBits(COMMAND_MODE, 4);
  writeBits(data, 8);
  digitalWrite(CS, HIGH);
}

void setSegments(uint8_t segData[4], uint8_t dotData) {
  uint8_t lcdBuffer[16] = {};
  for (uint8_t i = 0; i < 4; i++) {
    if (i <= 1) {
      lcdBuffer[14 - 2 * i] |= (segData[i] & 0b00000001) << 3;  //a
      lcdBuffer[14 - 2 * i] |= (segData[i] & 0b00000010) << 6;  //b
      lcdBuffer[15 - 2 * i] |= (segData[i] & 0b00100000) << 2;  //f
      lcdBuffer[15 - 2 * i] |= (segData[i] & 0b01000000) >> 3;  //g
    } else {
      lcdBuffer[14 - 2 * i] |= (segData[i] & 0b00000001) << 7;  //a
      lcdBuffer[13 - 2 * i] |= (segData[i] & 0b00000010) << 2;  //b
      lcdBuffer[14 - 2 * i] |= (segData[i] & 0b00100000) >> 2;  //f
      lcdBuffer[15 - 2 * i] |= (segData[i] & 0b01000000) << 1;  //g
    }
    lcdBuffer[1 + 2 * i] |= (segData[i] & 0b00000100) << 5;  //c
    lcdBuffer[2 * i] |= (segData[i] & 0b00001000);           //d
    lcdBuffer[2 * i] |= (segData[i] & 0b00010000) << 3;      //e
  }
  lcdBuffer[5] |= (dotData & 0b00000001) << 3;  //2桁目のドット
  lcdBuffer[3] |= (dotData & 0b00000010) << 2;  //3桁目のドット
  lcdBuffer[1] |= (dotData & 0b00000100) << 1;  //4桁目のドット
  lcdBuffer[11] |= (dotData & 0b00001000);      //コロン
  for (uint8_t i = 0; i < 16; i++) {
    write(i, lcdBuffer[i]);
  }
}

void displayInt(int intData, uint8_t dotPos) {
  uint8_t data[4] = {};
  uint8_t digit = 1;
  data[3] = numArray[abs(intData) % 10];
  if (abs(intData) > 9) {
    data[2] = numArray[abs(intData) / 10 % 10];
    ++digit;
  }
  if (abs(intData) > 99) {
    data[1] = numArray[abs(intData) / 100 % 10];
    ++digit;
  }
  if (abs(intData) > 999) {
    data[0] = numArray[abs(intData) / 1000 % 10];
    ++digit;
  }
  if (intData < 0) {
    data[3 - digit] = numArray[10];
  }
  setSegments(data, dotPos);
}

void setup() {
  pinMode(CLOCK, OUTPUT);
  pinMode(DATA, OUTPUT);
  pinMode(CS, OUTPUT);
  digitalWrite(CS, HIGH);

  cmd(RC256K);
  cmd(0b01010010);  // 1/3バイアス 1/4デューティー
  cmd(SYS_EN);
  cmd(LCD_ON);

  for (uint8_t i = 0; i < 16; i++) {
    write(i, 0);
  }
}

void loop() {
  static int i = 0;
  displayInt(i, 0b00000000);
  i--;
  delay(100);
}

こんな感じでとりあえずはintに対応で小数点の位置は手動で入力するタイプにしてみた。液晶の仕様上-999から9999までしか正常に表示できない。範囲外はテキトーに表示されるので注意かも。

センサのデータとかを表示したい場合はfloatのほうが使いそうなのでfloatにも対応してみたい。

2022年9月10日土曜日

7セグメント液晶を使ってみた。

 aitendoでSVM343-1っていう7セグメント液晶が安く売っていたので試しに使ってみた。SPIで制御できるようなコントローラチップが乗っているっぽい。液晶部分は秋月で売ってるSP-521に似ているんだけど、SVM343-1に搭載されている液晶は全部の桁が7セグらしい。

コントローラチップはHT1621やHT1632ではないだろうかと製品ページには書いてあったのでとりあえずArduinoで動かしてみることに。

ピンアサインは基板に直接書いてあるんだけど、ケーブルの色が全然あっていないので注意かも。
VDD(5V):黒
CLOCK:赤
DATA IN:白
バックライト:青
CS:黄色
VSS(GND):緑

とりあえずArduinoのHT1632ライブラリで動かしてみた。これは6桁の7セグ用のライブラリっぽくて一部のセグがとりあえず表示されるぐらいだった。

やっぱりこのモジュールに合わせてどのセグがどのアドレスに割り振られているのかを解析する必要がありそう…。

ということでシリアルコンソールからアドレスとデータを送ってどこのセグメントがどのアドレスなのかを調べるためのスケッチを作ってみた。

#define CLOCK 12
#define DATA 13
#define CS 11

#define COMMAND_MODE 0b10000000
#define WRITE_MODE 0b10100000

#define SYS_EN 0b00000010  //LCDバイアス発生機と発振器有効化
#define LCD_OFF 0b00000100 //LCDバイアス発生機無効化
#define LCD_ON 0b00000110  //LCDバイアス発生機有効化
#define RC256K 0b00110000  //内蔵RC発振器使用 (256kHz)

void writeBits(uint8_t data, uint8_t cnt) {
  for (uint8_t i = 0; i < cnt; i++, data <<= 1) {
    digitalWrite(CLOCK, LOW);
    digitalWrite(DATA, data & 0x80 ? HIGH : LOW);
    digitalWrite(CLOCK, HIGH);
  }
}

void write(uint8_t address, uint8_t data) {
  digitalWrite(CS, LOW);
  writeBits(WRITE_MODE, 3);
  writeBits(address << 3, 6);
  writeBits(data, 8);
  digitalWrite(CS, HIGH);
}

void cmd(uint8_t data) {
  digitalWrite(CS, LOW);
  writeBits(COMMAND_MODE, 4);
  writeBits(data, 8);
  digitalWrite(CS, HIGH);
}

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

  pinMode(CLOCK, OUTPUT);
  pinMode(DATA, OUTPUT);
  pinMode(CS, OUTPUT);
  digitalWrite(CS, HIGH);

  cmd(RC256K);
  cmd(0b01010010);// 1/3バイアス 1/4デューティー
  cmd(SYS_EN);
  cmd(LCD_ON);

  for (uint8_t i = 0; i < 16; i++) {
    write(i, 0);
  }
}

void loop() {
  static int i = 0;
  if (Serial.available() > 0) {
    char in = Serial.read();
    if (in == 'c') {
      Serial.println("Clear LCD");
      for (uint8_t i = 0; i < 16; i++) {
        write(i, 0);
      }
    } else if (in == 'a') {
      unsigned int input = Serial.parseInt();
      i = input;
      Serial.print("address=");
      Serial.println(input);
    } else if (in == 'd') {
      unsigned int input = Serial.parseInt();
      Serial.print("data=");
      Serial.println(input);
      write(i, input);
    }
  }
}

これでシリアルコンソールからa0と送ったあとにd255みたいにデータを送って行くとどこかが点灯するはず…
地道に試していくとデータ4と8ビット目しか使ってなかった(d8とd128にしか反応しない)

アドレスを変えながらデータを送ってみるとこんな感じになっていた。左側がアドレス、右側がデータで、結構セグメントによってバラバラ…
なので通常のHT1621ライブラリではうまく表示できないわけ。
規則性もあまりないような気がするのでちょっと使いにくいかも…

SVM343-1

同じアドレスを隣の桁でも使ってたりするので少し面倒だけど、時計用の「:」も付いてるし、小数点も付いてるのでベースのスケッチさえ作ってしまえば使えるかも。

追記:
Arduinoで扱いやすいようにライブラリまではいかないけどスケッチを作ってみた。

2022年9月3日土曜日

Raspberry Pi Picoを修理してみた。

 ラズパイPicoで遊んでいたら電源を入れた瞬間は起動するのに、ちょっとすると電源が落ちてしまう用になってしまった。
なんかショートしてしまったかな?とか思って外部の回路を外して単体にしても少しすると止まってしまう。そしてmicroUSBを抜くときにボードを触ったら熱くなっている…
どこが一番熱いのかとおもって触ってみるとDCコンバータ付近が超熱くなっていたのでDCコンバータが壊れたのかなと思って修理してみた。

ラズパイPicoは3.3V駆動なのでUSBから電源を取る際に逆接防止のショットキーダイオード(MBR120VLSFT1G)を介して、DC-DCコンバータ(RT6150B-33GQW)でUSBの5Vから3.3Vを生成している。スイッチングDCコンバータなので小型でも800mAまで出力できる。

このDCコンバータ周辺がめっちゃ熱くなっているようだったのでDCコンバータが壊れたかな?と思ってRT6150B-33GQWと2.2uHのコイルを取り外してみた。そんでもって3.3VとGND間に3.3Vの電源を供給してみると普通に動いている。

Raspberry Pi Pico LDOレギュレータ仕様

ということでDCコンバータ部分をLDOに交換してみた。3.3VのLDOは手持ちでAP7333-33SAGがあったのでこれにしてみた。SOT-23パッケージで300mAまで出力できるっぽいけど、RP2040は消費電力が20mAぐらいっぽいので行けるだろうということで。DCコンバータICは結構剥がすのが大変だった。ミニホットプレートがほしいところ。斜めカットの小手先でハンダを盛って剥がした。

とりあえずこの状態で電源を入れてみると治った感じ。USBチェッカーで測定すると0.04Aってなっていた。ちなみに修理前は1.02AぐらいだったのでやっぱりRT6150B-33GQWが壊れていたんじゃないかな。RP2040が壊れてなくてよかったー。

壊れた原因はよくわからないけど、電源ラインはセラコンなので電源投入時の突入電流で発生する過電圧破壊とかかなぁ?外付け回路側の電源回路も12V入力なんだけど全部セラコンにしていたので電源スイッチの突入電流が怪しいかも。高ESRな電解コンデンサとかを入れておくべきだったか…

Raspberry Pi PicoのADCがノイズの影響を受けるのでDCコンバータをLDOに交換している人も居るらしい。LDOに交換すると3.3Vの出力できる電流が制限されそうだけどそういった効果も期待できそう。ちなみに外付け回路を接続しない状態だと触っても全くあったかくないレベルだった。