アットウィキロゴ
 

かわロボ向け制御回路


かわロボはコントローラがフタバ製プロポに限定されています。
そのため制御回路を自作する場合、
必ず受信機信号を処理して、またモータドライバ向けの信号に変換する必要があります。
今回はモータドライバのページで作成した、
かわロボ向けのモータドライバ向けの制御回路を組んでいきます。

PIC編


回路図


早速回路図です。KiCADで作成しました。
やることは単純で、受信機の信号をマイコンを通してモータドライバの信号に変える。
つまり受信機用のコネクタとモータドライバ用のコネクタを用意して、
それぞれの信号線にマイコンの端子をつなぐという流れです。

ただモータドライバには、イネーブル信号(ショート信号)が必要となっているので、FETを使っておきます。
本来はゲートに抵抗を入れるのですが、まあ1回入れて終わりなのでそのままとします。

必要な信号線は、以下の通りです。
  • 受信機信号からの入力
  • イネーブル出力
  • PWM出力
  • DIR出力

あとはLED出力は必要です。
加えて、フィードバックのためにアナログ信号入力を追加して、合計6本になります。
つまり1CHあたり8pinのマイコンで対応可能ということになります。

ただしモータは4CH分あるので、上記の信号は4倍必要になります。
そこで4つマイコンを載せてしまうと上記の回路図になります。
マイコンには、PIC12F1822を選びました。小さいながら高性能なので気に入っています。

あとは電源です。
モータドライバ側にバッテリ電源を用意したので、レギュレータで5Vを作ります。
この電源はそのまま受信機にも供給できるようにしておきます。
合わせて電源LEDも追加しておきます。

PWM信号は電源を入れたときに不安定だと危ないので、プルダウンをしておきます。
抵抗値はLED用で10k、ブルダウン用で100kで大丈夫でしょう。

マイコンの書き込みには、書き込み用端子をコネクタに出しておく必要があります。
そこで該当の端子の入出力用の端子と共用することで、別のコネクタは不要とします。
PICは3端子+電源が必要になります。
MCLR端子はデジタル出力ピンとして使うと、次の書き込み時にMCRLがリセットできないという問題が起こるので、入力として使います。

これで回路図は完成です。
あとはアートワークを作っていきます。
この辺りはモータドライバの形にもよるので、割合します。
モータドライバの形に合わせると、こんな形になりました。

基板には2CHごとに切りかけを用意し、分割しても使用できるようにしたことと、
固定穴も必要であれば外せるようにしました。

基板作成

アートワークができたら外注します。
今回はfusion PCBを使ってみます。

一番安いコースだと10枚でおおよそ$7です。

依頼から2週間程度で到着しました。

部品実装

PICが外注だと在庫がなかったので、今回は手はんだ実装です。
リフローなんてありませんので、頑張ります。
チップ部品のサイズは、1608ミリ規格にしました。
インチ規格だと0603になるのですが、0603ミリ規格というのも存在するので部品選びが大変です。(1敗)
はんだこての先端形状も気にする必要がありますが、まあ何とかしました。

チップ部品>電源IC>一部コネクタの順で実装して、一度電源動作を確認しておき、
最後にPICと残りのコネクタを実装して完成です。

プログラム作成

この後プログラムを作成していきます。

PICのプログラムはMPLAB X IDEを使います。
MPLAB IDEの時代でプログラムを作っていたので、
かなり便利になっているようです。

PICの開発の流れとしては、
まずコンフィギュレーションビットの設定(ここを誤ると色々動かない)、
次に使う周辺回路の設定、
そしてメインプログラムの順です。

コンフィギュレーションビットでは、オシレータ、主要入力、リセット、プロテクトなどの設定があります。
特に主要入力を誤ると、入力信号が取れなかったりします。

今回のプログラムでは、受信機信号の時間計測とモータドライバへのPWM出力が必要になります。
時間計測には割り込みコントローラとTimerを使用し、
PWM出力にはCCPとTimerを使用することになります。
受信機信号は1520us基準ですので、1usカウントのタイマーを用意し、
入力の変化割り込みでカウントクリアとカウント値取得を行います。
続いてモータドライバへのPWM出力は、デューティ分解能最大10bit、PICの周波数32MHzのため、
そのまま32MHz/10bit=およそ32kHzとして使うと良さそうです。

続いてメインプログラムでは、
起動時にLED点滅で正常表示、
プロポ信号のエラー時の処理、
プロポ信号の処理とモータドライバ出力への反映を行っていきます。

書き込み

Microchipから販売されているPICの書き込みツールは、
簡易開発向けのPICKITと、総合開発向けのICEがあります。
どちらかというとPICKITは安いのですが、それでも純正のPICKIT5は2万ちかくするので、
ここではPICKIT3互換品を使用することにします。amazonでおよそ3000円です。

入出力端子に書き込み用端子をつなげているので、
ジャンパワイヤを用いてPICKIT3と基板をつなぎます。

MPLAB X IDEではプログラムのビルドからそのままプログラムの書き込みができます。

注意点としては、周辺回路の設定を変えたらもう一度Generateをすること、
メインプログラムも一度保存してからビルドを行うかクリーンしてからビルドすること。
間違えるとプログラムが更新されていません。

何回もデバッグしながら書き込んでようやくプログラムが完成。
受信機とモータドライバをつないで動作させることができました。


RP2040編

PICではアンプごとにマイコンが必要となり面倒だったので、
今度はRP2040を使った回路を設計します。
RP2040にはいくつかシリーズがありますが、使用できるピン数が違うので、まずはそれを考えます。

まずはリストアップです。
  • モータ制御用 4CH×2信号 + 許可信号 1CH
  • 受信機信号 3CH(SBUS解析ができれば1CHでもできる)
  • センサ 2CH×2信号
  • その他 あまりピン
最低20信号ということになりました。

XIAO RP2040では13信号しかないので、
RP2040-zeroを使ってみたいと思います。

必要機能を考えると以下となります。
  • アンプから電力をもらう=電池電圧を5Vに変換する必要がある
  • 3.3V系のため5V入出力に変換する必要がある
  • SBUSは反転する必要がある
  • 高さを抑えたい=RP2040-zeroを表面実装する
  • 部品面だけにしてアセンブリを依頼したい

そういうことで回路図をKiCADで書きます。
部品は秋月電子通商で買える+JLCPCBで互換品があるものから選定します。

これからアートワークを行います。
詳細は省略しますが、このような基板になりました。

アンプ用回路は基本的に入出力端子ばかりが多いので、基板上もコネクタばかりで小さくするのが難しいです。
今回はアンプと同じ50x50のサイズになりました。

RP2040-zeroのピンアサインは以下としました。

GP0 I2C0 SDA
GP1 I2C0 SCL
GP2 I2C1 SDA
GP3 I2C1 SCL
GP4 T-CH1/CH1-PWM
GP5 T-CH2/CH2-PWM
GP6 T-CH3/CH3-PWM
GP7 T-CH4/CH4-PWM
GP8 CH1-DIR
GP9 CH2-DIR
GP10 CH3-DIR
GP11 CH4-DIR
GP12 R-CH1
GP13 SBUS/R-CH2
GP14 R-CH3
GP15 ENABLE
GP26 ADC0/AUX0
GP27 ADC1/AUX1
GP28 ADC2/AUX2
GP29 ADC3/AUX3


今回もチップ抵抗などが多いので、JLCPCBにアセンブリごと依頼することにします。
JLCPCBのプラグインをプロジェクト画面からインストール。
製造用ファイルを生成して、サイトで基板の製造条件を入力。
シンボルフィールドでLCSC PNを追加し、JLCPCBのサイトで調べた部品番号を入力。
依頼画面で部品の確認がありますので、実装が不要な部品を外します。
ピンヘッダは自分で実装するので依頼品から外しておきます。(表面実装に比べて費用が高い)
基板5枚(RP2040-zeroを除く)で、約$40になりました。
(途中ディスカウントが無効になったのですが数量を変更して戻したら適用されました)

依頼から3日で発送、約10日で基板が到着しました。
まずはRP2040-zeroを実装します。
RP2040-zeroの使い方はこちら

SBUS解析

受信機の信号をそのまま入力すると、CH数の分入力端子が必要になるので、SBUS解析を行います。
SBUS出力対応の受信機を反転バッファを通して接続することになります。
トランジスタで反転したり、反転バッファICで反転したりしますが、今回の回路では反転バッファICを使用しています。
受信機とRP2040では信号レベルが異なるので、それをトレラント対応ICで吸収します。
さらにSBUS出力をUART0RXの端子に入力するように設計する必要があります。
通信系は信号ピンが決まっているので注意が必要です。

SBUS信号はパケットフレーム25byte、偶数パリティとストップビット2bit、8bitデータのUARTとなっているようです。
https://rikei-tawamure.com/entry/2020/03/17/120606
通信速度100kbpsとのことで、arduinoとしては以下の設定文を書けば、受信はできます。

Serial1.begin(100000,SERIAL_8E2);

まずは先頭バイトを検出するため0x0fを探すようにします。
そこから合計25byteを検出することができれば1パケットを取得することができます。
パケットは14msごとに流れてくるのですが、そのまま出すと早すぎるため、
一定時間ごとにarduinoからPCへのシリアルモニタに出してみます。
受信機と送信機の電源を入れると下記のデータが流れてきました。


パケット数は1秒間に約74個、約14msであっているようです。
UARTは8bitですがSBUSは1CHが11bitらしいので、11bitで区切ります。

送信機の電源を切って受信機の電源を入れたときはパケットは流れてきませんが、
送信機の電源を入れた後に切っても、F/S機能で特定の値でパケットは流れてきます。

PWM出力

RP2040は8系統16端子からPWMを出力できるそうです。
正確には8系統に分けて設定が必要らしいですが、arduino IDEであれば細かい設定は不要です。
以下の4行を入力すれば、PWM_CHのピン番号からPWM信号が出力されます。
pinMode(PWM_CH , OUTPUT);
analogWriteFreq(PWF_FREQ);
analogWriteRange(PWM_RANGE);
analogWrite(PWM_CH , PWM);

安全機能

SBUS信号を解析したので、プロポ側の対応CH数まで操作することができます。
基本は4CHまでしか使用しないので、プロポのトグルスイッチにCH5を当てはめて、
CH5の値が一定以上となった場合に出力を停止するようにプログラムを設定します。
受信機にはフェイルセーフ機能で電波が来ないときにニュートラルのデータを流す機能があります。
これを使ってCH5がニュートラルになったときや受信機がデータを受信しなくなったときに出力を停止させることができるようになります。

角度センサからのデータ取得

アームのフィードバック制御を行うには、角度センサからデータを取得する必要があります。
今回試したのはAS5600、実装済み品がamazonなどで1枚300~500円くらいで販売されています。
角度データはアナログまたはI2Cバスで読み取ることができます。
問題点としては、アドレスが0x36固定となっているため、複数接続することが難しいことです。
だいたいは1アーム1フィードバックかと思いますので影響はないと思います。
またRP2040にはI2Cバスが2系統あるので、それぞれつなげば2つセンサを繋げられます。

やり方はとても簡単で、SWITCH SCIENCEがArduinoのプログラム例を公開しています。
https://www.switch-science.com/products/3493?srsltid=AfmBOoq1LKgUigx5ErvXQkUIW7wZqjhqqWWZlD2KCUTCEh2fXcwbCRHa
I2Cは半二重のため、送信モードと受信モードがあるので、受信モードで特定のレジスタの値を要求するだけで角度を取得することができます。
磁石を近づけていないと値が暴れるので、配線が外れた時と磁石が外れた時の対策をした方がいいです。

システムブロック図

実装中のシステムの電気系ハードウェアブロック図です。まだフィードバック系は手を付けていません。
最終更新:2025年10月18日 17:07