2022年12月30日金曜日

E220-900T22S(JP)でLoRaを試してみた。

 前にTWELITE REDをテレメトリモジュールに使ったりしてみたけど、やはり2.4Ghz帯だと距離的に200~300mを超えると通信速度が落ちてしまって通信できなくなってしまう。ということでLoRaなら920Mhzでより遠くまで届くんではないかということで試してみることに。

E220-900T22SはAliexpressとかで500円とかで超安く売っていたので前から気になっていたんだけど、技適対応のがCLEALINKから出たっぽいのでE220-900T22S(JP)を試してみた。

CLEALINK E220-900T22S(JP)

さすが920Mhz、アンテナが長い。

まずは設定しないといけないんだけど、M0もM1もどうやら内部プルアップされているようで、TXとRXと電源を繋げば自動的にコンフィグモードに入ってる感じ。

ツールなんだけど、Windowsで設定したかったのでEBYTE純正ツールで設定してみることに。このツール、EBYTEの新しいサイトだと1.1なんだけど、1.0じゃないと設定できなかったので古いサイトから持ってくる必要がある。

E220_V1.0
E220_V1.0を起動するとこんな感じ。とりあえずE220-900T22S(JP)とUSBシリアル変換アダプタを接続すればこのツールで設定できる。ちなみに電源電圧は5V入れてもいいけど、信号は3.3Vまでなので注意かも。今回はESP32用の書き換えアダプタを使ってみた。
EBYTE E220_V1.0
とりあえず2台とも同じ設定にしてSet Paramしてみた。そんでもってM0とM1をGNDに落として電源に接続すればUARTの透過モードとして動くはず。とりあえず上記設定はMAVLink用。ためしにTWELITEが置き換えできるかどうか…

結果的にはArduPilotのMAVLinkでは帯域が足りなそうな感じ…
なんとなく通信できてそうだけど通信エラー出まくってしまうのでやっぱりMAVLinkみたいに結構たくさん通信している場合はTWELITEのほうが良いかも。Air Rateも5倍ぐらいあるし…
もしかしたら外部でマイコンとかでバッファしてフローコントロールしたら行けたりするかな?

もともとLoRaってセンサ類から定期的にデータを取るような通信用だしMAVLinkのようなテレメトリだと連続してデータを送るからあんまり向いてないのかな?
しかしそれにしても見通し良ければ普通に1kmぐらい届くみたいだし、9600bpsぐらいの低速で必要なデータだけ送れるようにすればすごく使えるかも。


2022年12月27日火曜日

ESP32-C3-WROOM-02を使ってみた

 秋月でESP32-C3-WROOM-02モジュールが売っていたので買ってみた。ついでにESP-WROOM-02用のブレーク基板もポチってみた。フットプリント同じだろうし…

ESP32-C3-WROOM-02

ESP32-C3-WROOM-02はESP32からBluetooth ClassicがなくなったかわりにUSBがネイティブ対応している感じで、ESP-WROOM-02と同じサイズ。MPUコアもRISC-Vになったりして色々違うけど。ESP-WROOM-02よりお安い。

AE-ESP-WROOM-02

一緒に購入したESP-WROOM-02用のブレークアウト基板、ピン配置だいたい同じだろうと思ってとりあえず購入しておいた。ESP-WROOM-02のピン配置のままブレッドボードにさせるようになっているので少し改造すれば使えそう。ちなみにESP32-C3-WROOM-02とESP-WROOM-02のGPIOのピン配置がぜんぜん違うので、シルクは電源とTX、RX以外当てにならない。ESP-WROOM-02ではGNDだった部分が、ESP32-C3-WROOM-02ではIO0とIO18になっていたのでGNDのパターンをカットしてジャンパすることにした。

AE-ESP-WROOM-02
ちなみに裏側はこんな感じ。裏側からみて左側の2箇所のGNDのパターンをカットして、表面のESP32-C8-WROOM-02をハンダするところの右上の18番と13番のVIAでGNDに繋がってるところ(IO0とIO18)をパターンカットしてからESP32を実装。
ESP32-C3-WROOM-02
そんでもってESP32-C3-WROOM-02を実装したあとにそれぞれIO0とIO18の場所をジャンパー。このブレークアウト基板は通常のブレッドボードでもじゃまにならないので便利。IOピンのシルクがぜんぜん違うので上からシールを作成して貼ったりすると便利かも。
ESP32-C3

ESP32-C3はUSBにネイティブ対応していてブートローダもUSB対応になってるので今までのようなUART用書込機も不要である。USBのピンはIO18がD-でIO19がD+になっている。しかしUSBは5Vなので3.3Vの電源も作る必要がある。
ESP32-C3を起動するためにはENを3.3Vに接続する必要がある。この状態でUSBにつなぐと何も書かれていないのでリセットを繰り返していた。書き込みモードに変更するためにIO8を3.3Vに、IO9をGNDに接続して起動するとUSBで認識されてUSB JTAG/serial debug unitとUSBシリアルデバイスとして自動的にドライバがインストールされた。

あとはArduinoからESP32C3 Dev Moduleで書き込みができるようになった。
USB接続を使ってシリアルモニタしたい場合はUSB CDC on BootをEnableにするのを忘れずに。
一旦Arduinoから書き込みしたらあとはそのまま書き込めるし、うまく書き込めないときはIO9をGNDに落とすだけで書き込めるようになった。

USB CDCだとリセットするたびにシリアルコンソール開き直すのが少し面倒。そしてWifiが切断されるたびにUSB CDCが切断される気が…
とりあえずTXとRXにUSBシリアル変換アダプタを付けてUSB CDC on BootをDisableにしてデバッグしたほうが楽かも。

2022年11月19日土曜日

SX1308昇圧DC-DCコンバータを試してみた。

 ESP32とDCモータの電源を一つのバッテリから取るときは、電圧が足りたとしてもESP32側に昇圧DC-DCコンバータを挟むと良いことがわかったのでもっと低い電圧から対応している昇圧コンバータも試してみた。

今回購入してみたのはSX1308というICを搭載したモジュール。2V-24V入力対応らしい。出力は28Vまで。この小ささで2Aまで対応しているとか。データシート的にも行けそうな気はするけど効率は下がりそう。今回はそんなに使わないので効率も良さそうでちょうどいいと思った。MT3608とピンコンパチだしスペックもほぼ一緒じゃないか…
入力と出力のシルクは後ろに入っていた。MT3608搭載モジュールよりも結構小さい。
ちなみに半固定抵抗は反時計周りに回すと電圧が上昇する。大抵の場合は時計回りで電圧が増えていく物が多いので、ここでハマる人多そう。レビューで不良品と書いてある事が多くて不安だったけど、実はみんな時計回りに回しても電圧が上がらないから壊れてると思っていたのかも?
3Vぐらい入れた状態だと結構回さないと電圧がでなかったので、初期状態から10回ぐらい反時計回しにまわしてから電源を接続してテスターで確認しながら調整するといいかも。
とりあえず4.5Vぐらい出るように調整してから、半固定抵抗を外して抵抗値を測定した。小型化のために固定抵抗に置き換えて3.3Vレギュレータも実装してみた。3.3Vレギュレータの両端には1uFつけてる。
1Sリポから常に3.3Vをひねり出すモジュール完成。
前回使ったモジュールと比べると少し小さい。というわけでメカナムラジコンに搭載してテストしてみる。
ラジコン受信機をESP32に置き換えたメカナムラジコンに乗せて走らせてみたところ、ガシガシ走らせてもESP32がリセットして止まることはなかった。ESP32が落ちるまで走らせてみるとバッテリが2.98Vぐらいだった。このバッテリの仕様かも。SX1308モジュールのほうが発熱が少なかったのでESP32を1Sリポで使うときはこの仕様でいいかも。
2Vまで行けるはずなのでNi-MH2本でもこの仕様でいいかもしれない。

2022年11月12日土曜日

ESP32搭載ラジコンのDCモータノイズ対策

 前回ようやくメカナムホイールのラジコンが完成したので仲間内で遊んでいたんだけど、どうしてもESP32が途中でリセットして止まってしまう。電源ラインにDCモータのノイズが乗ってるのかな?バッテリの電圧を測定しても3.9Vある。リポなので3.3Vぐらいまでは使えると思うんだけど…

一応モータのパワーを切り替えられるようにしてテストしてみてたんだけどフルパワーで激しい動きをするとリセットされるので電圧降下しているのか、電源ラインに思いっきりノイズがのっているのか?ESP32はシールドついてるからなのか意外と放射ノイズに強いし、初期のテストではDCモータは付属のリポから電源をっていたけど、ESP32はモバイルバッテリから電源を取っていた。

ということでESP32の電源部分に昇圧回路を入れてみた。モータドライバはこれまで通りリポ直結。これで電圧降下したり大きなノイズが入っても昇圧回路で吸収してくれないかな。
もともとLipoの1セルにESP32用の電源として3.3Vのレギュレータを繋いでる時点でバッテリ電圧が3.3Vを下回るパターンがあるはずだと思っていたのでここらへんはどうしようか悩んでいたんだけど…(3Vぐらいまで使いたい気が)

効率が悪いような気がするけど、とりあえず安定させるために5Vを生成できる昇圧DCコンバータを使用してみることに。これに3.3Vのレギュレータをのっけて、リポから一旦5Vに昇圧して3.3Vを生成する。

8年前ぐらいに180円で購入していたやつで、3~5Vの入力で5V 1A出力のモジュール。一応2.6Vぐらいから動いた。昇圧チップはAL491っていう刻印があるが詳細分からず。
まずはUSB端子とかUSBラインの充電認識用の抵抗とかLEDとかいらないものを取り外した。
そんでもってこの前メイン基板にハンダした3.3Vレギュレータ類を移植。これで4.2Vのリポが2.5Vになっても3.3Vを生成できる。
とりあえずこれをメイン基板に合体させてみた。これで問題ないようだったら基板全体を熱収縮チューブで絶縁してやろうかな。
とりあえずテストなので適当なところにおいてるだけ。

ついでにスケッチもアップデートして、ESP32のADCでバッテリ電圧を測定できるので、PS3のコントローラのLEDをバッテリ残量に応じて光らせるようにしてみた。これでやっぱり走行中はバッテリ電圧下がってることがわかった。消費電力増えてしまうけどWiFiで電圧見れるようにしてみようかな。

早速テストしてみると、激しい動きをしても落ちない!20~30分ぐらいは遊べる感じになった。ちゃんとモータの出力が弱くなって来ても動き続けられるような感じ。これだとESP32が落ちる前にパワーが落ちてきたからバッテリ充電ってな具合。
ESP32が落ちるぐらいまで遊んでから蓋を開けたらDCコンバータはESP32より温かいぐらいだった。そんでもってバッテリ電圧を測定すると1.1V。最低電圧下回ってるじゃん!とおもって電源を切って測ってみると3.05V。ちょうどいいぐらい使い切れた。おそらく昇圧回路の負荷でかなり電圧降下していたんだな…。

ちなみにモータのノイズ対策は純正状態から何も改造していないので104がモータと並列に入ってるだけ。ログも見ていないのでわからないけどESP32用の昇圧回路がない状態では、モータを動かして電圧降下したときにBrownout detectorで落ちていたんだろう。効率あんまり良さげじゃないけどとりあえずこれで対策できたのでいいかなぁ。
もうちょっと昇圧電圧下げても良さそうだけど(差が小さいほど効率がいい気がする)

ESP32で1セルリポを使ってモータを動かすときに安定しないときは一旦昇圧してみるといいかもしれない。
別な種類の昇圧DCコンバータモジュールもポチってみたのでどこまで昇圧する電圧を下げても大丈夫か確認してみたい。多分VinとVoutの差が小さい方が効率が良いだろうし、3.3Vに降圧するLDOもそのほうが効率いいと思うし。5Vまで昇圧しなくてもいいような気がしているんだよなぁ


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月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の出力できる電流が制限されそうだけどそういった効果も期待できそう。ちなみに外付け回路を接続しない状態だと触っても全くあったかくないレベルだった。

2022年8月28日日曜日

メカナムホイールのラジコンをRoverC化してみた

 前回ついにアナログスティックで操作が可能になったメカナムホイールラジコン。メカナムで充電式で2000円ぐらいのラジコンに文句は言えないが、最初からアナログスティックのほうが楽しいと思う…
でも改造楽しいしむしろコントローラなしの開発キットより断然安いのでこれもおもちゃのなせる技。

それはさておきMX1616の調査をするのにPWMの周波数変えたりDuty変えたりいろいろ試してみたけど、データシートをよく読んでみるとPWMモードAとPWMモードBの注意書きが。前回のESP32でのサンプルはPWMモードAで動かしていたんだけど、PWM周波数を高くしたいならPWMモードBのほうが良さそうな。結局データシートで言うモードAがFast DecayでモードBがSlow Decayっぽい。MX1508のライブラリを見てもFast DecayとSlow Decayが切り替えられるようになってたし…

テスト用にESP32にシリアル通信で周波数とDecayモードとDutyを変えられるようなプログラムを作ってみた。これで色々テストしてみたけど20kHzぐらいでもSlow Decayだといい感じにDuty10%ぐらいでも動く。PWM周波数も十分高いのでうるさくないし。とりあえずPWM周波数は14kHzぐらいで行こうと思う。

これでモータの回転数のリニアリティーが高まったので、今度はRaspberry Pi Picoを積んで見ることに。というのもせっかくメカナムのいい感じの車体なのでRaspberry Pi 3Bとかを乗っけてもいいかなと思ったので、ただしPWMを8ch分生成するのはマイコンのほうがいいし。
ということでRaspberry Pi Picoを乗っけて、i2c接続のモータドライバとして動かしてみようかなと。これはM5StackのRoverCも同じ様になっていたので、レジスタやアドレスもRoverC互換にしてみた。GroveコネクタにしてしまえばM5も乗るし…

i2cデバイスをArduinoで作るのは以前作ったものをベースにして、Raspberry Pi PicoからPWMを出力するだけ。Arduino公式のArduino Mbed OS RP2040 Boardsだとレジスタへの書き込みは問題ないから普通に動くんだけど、i2cdumpとか読み出しをするとフリーズしてしまうのでサードパティー製のArduino-Picoを使用した。Mbedとはi2cのポート選択方法が違うのと、pwmのヘッダファイルを手動でインクルードしないといけなかったけど、こっちのほうが快適に動く気がする。動作クロックを125Mhz以外で動かしたいときはclkdiv変更しないとPWM周波数も変わってしまうので注意。

//Raspberry Pi Pico
//Arduino-Pico(C++ SDK)
//CPU Speed 125Mhz

#include <Wire.h>
#include "hardware/pwm.h"

#define SLAVE_ADDRESS 0x38
//MbedI2C i2c_slave(p16, p17); // I2C SDA:GP16, SCL:GP17

#define DEBUG

#define M1p 2
#define M1n 3
#define M2p 4
#define M2n 5
#define M3p 6
#define M3n 7
#define M4p 8
#define M4n 9
#define PWMmax 255
uint SLICE[4];

//使用するレジスタ範囲指定
#define I2C_REG_ROW 1
#define I2C_REG_COL 4
uint8_t I2C_REG[I2C_REG_ROW][I2C_REG_COL];


//読み書きするレジスタアドレス
uint8_t REG_SELECTED;

boolean DATA_RECIEVED = false;

//i2c受信イベント
void receiveEvent(int _length) {
  //1byte目を読み込む(レジスタアドレス指定)
  REG_SELECTED = Wire.read();
  uint8_t startRow = REG_SELECTED >> 4;
  uint8_t startCol = (REG_SELECTED & 0x0F);

#ifdef DEBUG
  Serial.print("REG:");
  Serial.println(REG_SELECTED, HEX);
#endif

  while (Wire.available() > 0) {
    if (startRow < I2C_REG_ROW && startCol < I2C_REG_COL) {
      DATA_RECIEVED = true;
      I2C_REG[startRow][startCol] = Wire.read();
#ifdef DEBUG
      Serial.print("Write:");
      Serial.println(I2C_REG[startRow][startCol], HEX);
#endif
    } else {
      Wire.read();
    }
    ++startCol;
  }
}

//i2c読み込みイベント
void requestEvent() {
  uint8_t startRow = REG_SELECTED >> 4;
  uint8_t startCol = (REG_SELECTED & 0x0F);

  if (startRow < I2C_REG_ROW && startCol < I2C_REG_COL) {
    Wire.write(I2C_REG[startRow][startCol]);
  } else {
    Wire.write(0xff);
  }
}

void setup() {
#ifdef DEBUG
  Serial.begin(115200);
#endif
pinMode(LED_BUILTIN,OUTPUT);
toggle_led();

  //SlaveでWireライブラリを初期化
  Wire.setSDA(16);
  Wire.setSCL(17);
  Wire.begin(SLAVE_ADDRESS);
  //イベント設定
  Wire.onReceive(receiveEvent);
  Wire.onRequest(requestEvent);

  gpio_set_function(M1p, GPIO_FUNC_PWM);
  gpio_set_function(M1n, GPIO_FUNC_PWM);
  gpio_set_function(M2p, GPIO_FUNC_PWM);
  gpio_set_function(M2n, GPIO_FUNC_PWM);
  gpio_set_function(M3p, GPIO_FUNC_PWM);
  gpio_set_function(M3n, GPIO_FUNC_PWM);
  gpio_set_function(M4p, GPIO_FUNC_PWM);
  gpio_set_function(M4n, GPIO_FUNC_PWM);

  SLICE[0] = pwm_gpio_to_slice_num(M1p);
  SLICE[1] = pwm_gpio_to_slice_num(M2p);
  SLICE[2] = pwm_gpio_to_slice_num(M3p);
  SLICE[3] = pwm_gpio_to_slice_num(M4p);

  // PWM周期を設定
  for (int i = 0; i <= 3; i++) {
    pwm_set_clkdiv(SLICE[i], 35);  // 125,000Khz/(255*14Khz)
    pwm_set_wrap(SLICE[i], PWMmax);
    pwm_set_chan_level(SLICE[i], PWM_CHAN_A, 0);
    pwm_set_chan_level(SLICE[i], PWM_CHAN_B, 0);
    pwm_set_enabled(SLICE[i], true);
  }
}

void loop() {
  if (DATA_RECIEVED == true) {
    setspeed();
    DATA_RECIEVED = false;
  }

}

void setspeed() {
  int8_t pwm[4];
  for (int i = 0; i <= 3; i++) {
    pwm[i] = (int8_t)I2C_REG[0][i];
#ifdef DEBUG
    Serial.print("PWM:");
    Serial.println(pwm[i]);
#endif
    if (pwm[i] >= 0) {
      pwm_set_chan_level(SLICE[i], PWM_CHAN_A, (PWMmax - (pwm[i] * 2)));
      pwm_set_chan_level(SLICE[i], PWM_CHAN_B, PWMmax);
    } else {
      pwm_set_chan_level(SLICE[i], PWM_CHAN_A, PWMmax);
      pwm_set_chan_level(SLICE[i], PWM_CHAN_B, (PWMmax - abs(pwm[i] * 2)));
    }
  }
  toggle_led();
}

void toggle_led() {
  static boolean led_state = false;
  led_state = !led_state;
  digitalWrite(LED_BUILTIN, led_state);
}

とりあえずこれでi2cからモータ制御できるようになった。watchdogとかつけるべきかも…
1秒通信しなかったらタイムアウト的なやつ。
とりあえずRaspberry Pi 3Bからのコマンドではモータが動いてるけど回転のリニアリティー確認用にRoverC用のソフトをESP32に乗せてテストしてみるか…
i2cでホストが色々すげ替えられる様になったのでESP32乗っけてラジコンとして遊んでもいいしラズパイ乗っけてDonkey Carみたいなのを乗っけても面白そう。

次回は車体の上を平らにして色々乗っけられるようにしたい。

2022年8月27日土曜日

メカナムホイールのラジコンを改造してESP32で動かす

 前回分解してみたメカナムホイールのラジコン、制御基板の様子もわかったことだし改造してみた。

モータドライブICのMX1616Hはそのまま使えそうなので、基板はそのままに改造してみることに。電源スイッチや充電ポートもそのまま使えるし。
その前に改造のときに基板を動かしているとケーブルが切れそうだったのでホットボンドでケーブルを補強。
モーターにつながっているケーブルのところにホットボンドを流し込む。多分これをしておかないと振動でも切れそうなんだけど…
そしたらそしたらレシーバのIC(XC2455B)を剥がす。はんだですべての足をショートさせてはんだごて2本で外した。無理をするとパターンが持っていかれそうな基板。
そんでもってMX1616Hの入力に直接線をハンダ。ICのピンに直結したのはパターンにケーブルハンダしたら剥がれそうだったので。
そして先程と同様にホットボンドでケーブルを固定。あとGNDも引き出した。電源はとりあえず別電源で試してみようと思っているので今回は信号線のみ。
基板をもとに戻したらとりあえず準備は完了。
この上にユニバーサルプレートをマウントしたいなぁ。平面がないのでブレッドボードとか置きにくい。

とりあえず動作確認としてESP32で適当なプログラムを作ってみた。ESP32ならPWMも16ch出せるし、Bluetoothでコントローラ直結できるし。
本当はMX1616Hのロジック電圧を切り離したかったけど、基板改造が面倒だったので直結。ESP32からは出力しかないしMX1616HのHighのしきい値まで出てれば認識できるだろうし。

PWMの周波数は高すぎるとDutyが低いところで全く動かないのでとりあえず2kHzで動かしてみている。コントローラはBLEでXboxのコントローラと接続している。(Nimbleライブラリ使用)ESP32の電源は1300mAの小さなモバイルバッテリを積んでる。

とりあえずアナログのジョイスティックになるだけで断然コントロール性が上がった。オンオフしかない純正のプロポには戻れないぞ。このぐらい改造が簡単ならメカナムロボットのベースとしてもいいかも。ロボットキット買ったり、自作するよりも安いかも…
まずはPWMで動くことがわかったのでもうちょっとソフトを煮詰めよう。

しかしPWMにしてもDutyが40%以上じゃないとモータが回らなかったりしているので、もう少しPWMの設定を煮詰める必要はあるかも。
次回はモータドライバのPWM制御を改善してみる。


2022年8月26日金曜日

メカナムホイールのラジコンを分解してみた

 前回購入したメカナムホイールのラジコンを早速分解してみた。やっぱりオンオフ入力だけじゃ全然うまくコントロールできなくてすぐ飽きた…
改造してアナログ入力対応にしたいのでまずは調査。

裏側(スイッチがある方が裏)のプラスネジを6本取るとカバーが外れる。
作りは悪くない。というか思ったより良い作りをしていると思う。(改造ベースとして)
蓋を開けてもギアボックスが取れてきたりしないのでこの状態でも走れそう。
モーターは130モータが4つ。ギアボックスは前後で同じ設計のデュアルタイプのものが2つついてる。
バッテリは14500タイプのリチウムイオンバッテリだった。容量は500mAh。コネクタはPHコネクタっぽい。
JD-00742BBR-2213RX

制御基板の方は結構簡単な構造。モータドライバはMX1616Hが2つ。XC2455BってなってるICにはアンテナ出力がついていたり、モータドライバに直結されていたりしているので、2.4Ghzの無線内蔵のマイコンかな?SOT-23のICはXC2455B用の3.3Vレギュレータ。
分解する前は改造の際にモータドライバとしてDRV8833あたりを載せてもいいかなと思っていたんだけど、データシート見る限りはもともと乗っているMX1616Hがそのまま使えそうだ。
MX1616HはMX1508とピンコンパチ。スペック的にも電子工作用に出回ってるMX1508やDRV8833に近いし、MX1508の情報がそのまま参考にできそう。MX1616とMX1616Lもあるようだけど何が違うんだろう…

電源スイッチはオフにすると充電端子に切り替わるように接続されていた。オンにすると充電器からは切り離される。充電回路はUSB端子の根本側についていた。

ちなみにモータの接続はM1が右後、M2が左後、M3が右前、M4が左前になってた。

モータドライバそのまま使えそうなので改造としてはXC2455Bを剥がして、各MX1616Hからケーブルを4本ずつ出せばいいのか。8本+GNDでモータ4個制御できそう。
ケーブルたくさん出すのが面倒なのでRoverCみたいにI2C経由でコントロールできるようにしたいなぁ。PWM8ch出せるお手軽なマイコンとかで…
まぁ8本出してきて全部ESP32に突っ込んでも良さそうだけど。

次回はついに基板を改造してみる。