小容量リポの充電回路

ハーフマウスで50mAh程度のリポを使いたい場合に、それを1Cで充電できる充電回路がなかなか見つからない
市販のラジコン用充電器は最低でも100mAの充電電流になっている。

というわけで50mAで充電できるICを調査してみる
Microchip系のICはバッテリを4.2Vまで充電するためには、バッテリ電圧+1Vの電源電圧が必要そうな記載だし、実際に図表にもVDDが5.2Vと書かれている。
LiPoバッテリー充電コントローラ(MCP73831T) – 電子工作専科でも4.2Vまで充電できなかったことが示されている
USB等の5Vの電源動作時に4.2Vまで充電できるかどうかがあやしいので使うのは見送る

LTC4054L-4.2は5Vの電源でも4.2Vの充電ができそうだし、充電電流も10mA~150mAとハーフマウスのバッテリーにはちょうど良い範囲にあるが、割高感がある。
最近流行のTop Power ASIC社のICならTP4056XTP4057もデーターシートに充電電流50mAの設定が記載されている

Amazonとかで格安で販売されているTP4056搭載の充電モジュールはどのメーカのセカンドソース品が乗っているかは分からないが、もしかしたら回路定数を変えると50mAにできるかもしれないし、ピンコンパチであるなら上記のTop Power ASIC社製のTP4056Xに置き換えて使えるかもしれない

壁センサの線形化

この記事はマイクロマウス Advent Calendar 2025の2日目の記事です。1日目の記事は社畜博士によるロボトレース競技に使えるギヤ付きホイールの作り方の紹介でした。

マイクロマウス大会のスポンサーであるMathWorks社からMATLABのライセンスを提供してもらえているので、せっかくなのでMATLABを使って壁センサの線形化をやってみた。
ちなみに去年までは壁センサからの値の常用対数そのまま利用していて制御的には困っていなかったけれど、物理量(距離)への変換をしていないため、壁との距離を直観的に把握することができなかったことが少し不便だった。

ということでmatlabを使ってセンサの線形化をした手順の紹介
①治具を使って壁とロボットの距離を可変できるようにする

②壁との距離を変えながらセンサの値を取得する。今回はロボットの前後方向の中心が柱の位置にある場所を45mmとして、ロボットが区間の中心にある場所を90mmとした。L列に左前センサの値、R列に右前センサの値を記録する

③測定結果をテキストファイルに保存する

④matlabを立ち上げてデータのインポートボタンを押して、③で作ったテキストファイルを選択する

⑤インポートツールが立ち上がるので選択のインポートを押したのち、画面を閉じる

これで変数maekabeがmatlabにインポートされる

⑥matlabメイン画面のアプリのタブに移動して、アプリの一覧から曲線フィッターを選択して、曲線フィッターを立ち上げる
⑦データの選択を押して、X軸に変数maekabeのセンサの値の列を、Y軸に変数maekabeの壁との距離の列を選択する

⑧近似曲線から対数を選ぶとフィッティングされるので、右下の近似パラメーターの値a,bをメモする。

⑨マウスのソフトに組み込む
今回の実装では、自然対数の計算は遅いのでテーブルln_table[]を作成してそれを参照するようにし、
また、距離分解能が1mm刻みだと少し荒く感じたので、45mm=450になるように近似パラメーターa,bをそれぞれ10倍して反映させている

以上の手順によって、matlabを使うことで手早くセンサの線形化ができた

明日のAdvent Calendarはあこちゃんによる誰でも作れる、シリコンタイヤ !です

こつこつ



RX671にASM330LHHを接続して
SPIの設定をRX スマート・コンフィグレータで自動生成して使いこなす。
SPIの設定は上の画像の通りで、関数の使い方は、
データの準備、送信用の配列と受信用のuint8_t 型の配列を準備します
送信用の配列:
配列の1番目には、アクセスするアドレスを格納します。
配列の2番目には、データ書き込みの場合に送信するデータを格納します。3番目以降の要素は空で構いません。
受信用の配列: 受信データは、配列の2番目以降に格納されます。
1バイト受信する場合、データは配列の2番目に格納されます。
2バイト受信する場合、データは配列の2番目と3番目に格納されます。
配列の1番目の要素には何も格納されません。

データの転送
1バイト送信/1バイト受信: アドレスを含めて合計2バイトを転送します。
送信: アドレス+1バイト
受信: 1バイト

1バイト送信/2バイト受信: アドレスを含めて合計3バイトを転送します。
送信: アドレス+2バイト
受信: 2バイト
自分用に1から書くほうが関数の使い勝手は良いけれど、自動生成によって簡単に設定を変えれることや他のマイコンへの移植を考えると積極的に使っていきたい。

uint8_t command_request[3];
uint8_t response_reply[3];

R_Config_RSPI0_Start();//RSPI0モジュールの開始

//1バイト書き込み
command_request[0]=0x12; //12h CTRL3_C
command_request[1]=0x01; //01 ソフトウェアリセット
R_Config_RSPI0_Send_Receive(command_request,2,response_reply);
wait_ms(1);//通信完了までややまつ

//1バイト読み込み
command_request[0]=(0x0F|0x80);//0Fh :who am I Reg(Hex) *読み取り時は最上位bitに1がつく
command_request[1]=0x00;//2バイト目は空データ
R_Config_RSPI0_Send_Receive(command_request,2,response_reply);//1バイト読み込む場合には2バイト送信する
wait_ms(1);//通信完了までややまつ
if(response_reply[1]==0x6B){SCI_printf("OK");}else{SCI_printf("NG");}
SCI_printf("\r\n");

command_request[0]=0x10;//加速度センサと温度計ON 10h
command_request[1]=0xA8;//2バイト目は書き込むデータ
R_Config_RSPI0_Send_Receive(command_request,2,response_reply);
wait_ms(1);

//2バイト読み込み
command_request[0]=(0x20|0x80);//読み取り:温度 //Reg(Hex) 20h *読み取り時は最上位bitに1がつく
command_request[1]=0x00;//2バイト目は空データ
command_request[2]=0x00;//3バイト目は空データ
R_Config_RSPI0_Send_Receive(command_request,3,response_reply);
wait_ms(1);
tmp_short=(response_reply[2]<<8|response_reply[1])/256+25;//2バイト目と3バイト目を使用する SCI_printf("tmp=%d\n\r",tmp_short);

参考
RX651 RSPI1での受信不具合について

ライントレーサーロボットキットTypeRをMATLABにつなぐ


ライントレーサーロボットキットTypeRをMATLABに繋いだ備忘録
このキットにはArduino Nanoの互換品が搭載されているが、MATLABのハードウェアセットアップから自動で認識されない。ボードとポート番号を手動でセットアップすると接続確認とテストファームの書き込みはできるが、その後の目的のファームをSimulinkから書きこむところでエラーになる。
互換品でも例えばArduino Megaの互換品では書き込みもできるため、何かしらオリジナルのArduinoとの差が原因かもしれない。問題の互換品とオリジナルのArduino NanoではUSBシリアルICがFDTIとCH340とで異なる点が問題なのかもしれない
そうはいってもArduino NANOは古い設計であるしMCUのパワーも低いため改めてオリジナルを購入するのは気が引ける。そこで最新のR4世代のボードに乗せ換えた。最新のArduino NANO R4はまだMATLABが対応していないためR4 minimaに入れ替えるとハードウェアセットアップから自動で認識して問題なく書き込むことができた。

次にぶつかった課題は今度はI2C接続のジャイロセンサが反応しないこと、調べるとこちらArduino UNO R4でI2Cモジュールが使えない!?原因と解決事例紹介の症状のようで、ジャイロをレベルシフタ付きのBNO055使用 9軸センサーフュージョンモジュールキットに交換することで対処した

2025年度マイクロマウス関西地区大会


 大阪電気通信大学で開催された2025年度マイクロマウス関西地区大会は、出走台数が100台を超える大盛況で、非常に規模の大きな大会となりました。スタッフ、来賓、そして参加者の皆様、本当にお疲れ様でした。

 前日の試走では、直線距離や最終速度が合わず、まともに走行できない状態に。原因を調査し、タイヤの滑りや電気的な不具合を疑いましたが、特に問題は見つからず。最終的には、走行モジュールとはまったく関係のない、迷路解法のダイクストラ法の処理内で一時的に使用していた変数をintで複数回宣言していたものを、初回のみshortで宣言するよう修正したところ、なぜか解決するという不思議な結果に…。

 個人成績は優勝でした。16×16区画の課題の過去最大難易度と言われる今回のレイアウトは、4輪マシンが有利だったように思います。
 
 

続きを読む

こつこつ

RX671マイコンの準備を始める。今回はスマート・コンフィグレータの勉強もかねて、ハードウェアマニュアルを余り読み込まずに評価用の基板をつくった。そして見事にはまっている。

〇RX671の48ピンで位相計算モードで外部からのA/B相のエンコーダー信号を読み取れるのはTCLKCとTCLKDのペアと、MTU1に繋がるMTCLKAとMTCLKBのペア、MTCLKCとMTCLKDのペアの3組。
ここでMTCLKBをPC7ポートに割り付けてしまうとSCIインタフェース経由でファーム書き込む使い方をする場合には起動時にL電位にする回路が必要になりそう。

〇駆動用のモータドライバに供給するPWMのポートについて、モータドライバにMP6551CQBを使用する場合には回転方向毎にPWMを出すポートを変えれると都合がいい。そのためマイコンの機能としては1つのタイマーから2本のPWMを出したい。MTU3を同期モードで動かせばMTIOC3A,B,C,Dの4本のPWM出力が使えそうだけど、スマート・コンフィグレータからはMTIOC3AとCのみの設定しか見つけられない。

〇P35は入力専用ポート

5月の活動


M5stack Japan Tour 2025 Spring Osaka
クラシック機体とハーフ機体の展示。表彰状を置くと見栄えがすることを学んだので今年は配置してみた
M5Stack社jimmyさんたちにマイクロマウスタックチャンを見てもらった。そして参考にしてくださっているようだ。

〇5月度練習会
既知区間直線の先に未知区間の直線があると座標がズレる不具合を直すつもりが、再現せず。
今回はだいぶ前のコードから復元したため、その後の更新でバグを作りこんでいたのか?それとも他の要因があるのか?
ロボトレーコースの表面の凹凸を#2000の紙やすりで削っている写真。

〇ベゼルが紫の直径8mm長さ20mmのモータ
端子間抵抗0.5Ω、インダクタンス2.2uH
参考LCRメータを買ってみた