という事で、8月度の宇部おもちゃ病院定期開院に来たQステア(Q-STEER)、実機があるのをいい機会に、クローン送信機を作っておこうと思います。
いつも参考にさせて頂き&お世話になっている、つつじヶ丘おもちゃ病院の大泉さんの記事「Q-STEER送信機の修理(マイコン換装)」のプログラムを使わせて頂くことにしますが、デバイス(使用マイコン)をPIC12F509→16F1503に変更する事にしました。
記事の当時(2016年/7月頃)に12F509を採用された理由は、
・当時秋月で最安:50円。16F1503を使うと80円と1.6倍になってしまう。
・DIP-14はスペース的にも厳しい。
といった事で、DIP-8の12F509になったとの事。しかし、SW入力で5PIN、LED出力に1PIN(それとVddとVss)で、これ以上ポートが無く、ポートでチャンネルセレクトができない。
ところが、当時と部品調達事情が変わって、16F1503もAliExpressで50円程度で購入できるようになりました。例えばこのショップ。
![](https://blogimg.goo.ne.jp/user_image/3f/9a/3d000f9e378b1da4194298d58b437fd5.png)
スペースの問題も、SOP-14なら何とか元のケースに入ると思われます。基板作るのはちょっと苦労しますが、基板入れても厚さも空中配線のDIPと同じくらいに収まるかな?
ということで、A~Dのチャンネルセレクトも元と同じ形のクローン送信機を作ることにしました。
元の送信機の基板はこんな感じ。
![](https://blogimg.goo.ne.jp/user_image/17/fe/9dc99c3502809cd7658aab9b2c1ea610.jpg)
左にSOP-14の16F1503を置いてますが、きっと収まると思います。SW面はこんな感じ。
![](https://blogimg.goo.ne.jp/user_image/36/df/7cd0bcc3faf4d944c1d19766187f7b0d.jpg)
チャンネルセレクトは予想通り2ビット。(COBにどう繋がってるかはよく分かりませんでした。)
大泉さんに「こんな物を作ろうと思います」とお伝えすると、「ほい、出来ました」とあっという間に先に作られてしまうので(w)、毎度、なるべく自力で作ろうとするのですが、結局毎度うまく動かず、大泉さんに相談する事になってしまいますww。
今回もちょっとしたミスや元プログラムの理解不足からくる間違いで問い合わせをして、お手数をお掛けしてしまいました。
12F509→16F1503に移植するにあたり、「Cで作ろうかな…(元のプログラムはMPASM)」とも思ったのですが、ASMのままの方が変更が少なそうなのでASMのまま作ることにしました。
移植・変更作業としては、
・POR時のチャンネル設定や、「TURBO単独で2.5秒以上押したら再設定」の部分はカット
・替わりに、sleepから起きるたびにポートを読んでチャンネル設定をする
・12F509版では必要のなかったBANK SELECTに気を付ける
・多機能な分、必要なポートの初期設定が増えて、define文がだいぶ増えた
・リセット/割込みベクタの書き方は?
ぐらいでしょうか。
プロジェクトをストレージに上げておきます。(「ここ」)
(2020/9/19追記)スリープ時の消費電流を測ると12.5μAでした。「ちょっと高いなぁ…」と大泉さんに尋ねると、「通常スリープ時の電流としてはそんなもの。低電力スリープを使えば1μA以下に下がる」と教えて頂きました。設定部分に「bsf VREGCON,VREGPM」を追加して低電力スリープにしたところ、手持ちの安物DMM(最小分解能0.1μA)で、消費電流0.2μAまで下がりました。プログラムをそのまま使う人は居ないかもしれませんが、ストレージも更新しておきます。
簡単な回路なので、プログラムの中身(ポートの定義)を見れば作れると思いますが、一応回路図載せておきます。(回路図見た方がイメージしやすい人も居るかもしれませんのでw。)
![](https://blogimg.goo.ne.jp/user_image/7c/6c/8d5e07e4ece107ea37696c090ca552cb.png)
実機はLEDはNPNトランジスタでドライブしてますが、少なくとも今回はポートで直接駆動にしてます。(12F509はポートの最大絶対定格:25mAですが、16F1503は50mAで、表書きの概要には連続25mAと書いてあります。十分直接駆動できます。)
チャンネルセレクトは、最初コモンをプラスに繋いでプルダウンにしようかと思いましたが、それだとsleep時にも(チャンネルセレクトが1個でもONになってると)常時電流を消費してしまうので、スキャンの時だけポートから電圧を掛ける仕様にしています。(内部プルアップが使えれば、内部プルアップのON-OFFでいけるのですが、16F1503はポートAしかWPUが使えません。IOCもポートAのみなので、ポートAは操作SWに割り振るしかなく、チャンネルセレクトにPICの内部プルアップが使えません。)
製作した基板の写真も載せておきます。まず表:
![](https://blogimg.goo.ne.jp/user_image/74/1e/530481548a7f18019ca967ddc4a76cb1.jpg)
裏:
![](https://blogimg.goo.ne.jp/user_image/3a/27/bc25c505c152906298795e738e2588f5.jpg)
今回は小さく作る必要ないのでDIP-14を使ってますが、基板はケチって、5×7cmの半分を使いました。裸で使うので、ビニール線は表のみにしてます。(回路図には載せてませんが、電源ラインに100uFの電解コンデンサを入れてあります。)
まず、OSCCONの設定の前にBANKの切り替えを入れ忘れてクロックが切り替わらない所でモタついて、大泉さんにヘルプを出してしまいました。
BANK切り替えミスに気付いてビルド・書き込み仕直したつもりだったのですが、HEXファイルが更新されてなかったみたい。(油断すると時々、ビルド成功してるのにHEXやLSTファイルが更新されない事があるような気がする。)
ついでに、「PICはsleepからの復帰はピン変化だけでよく、interruptを使わなくてもいい」の指摘や、フラグクリアに関する指摘を貰いました。
IOC=Interrupt on changeを使うのですが、「Interrupt」って書いてあるじゃん?と思うのですが(w)、データシートをよく読むと、
![](https://blogimg.goo.ne.jp/user_image/04/4e/76e53aeb39e88dc7968e97d577ff6f77.png)
確かにGIEをdisableでinterruptが発生しなくても、sleepからのwake-upができる様に書いてありました。
フラグは、IOCIFが立ったままだとsleepできない図ですが、データシートをよく読むと、IOCIFはread onlyで書き込めず、IOCIFクリアの為にはIOCAFをクリアしておく必要がある。(そんなことがデータシートのなかのあちこちに分散して書いてあるw。)
GIEはセットせずに、IOCIEだけセットする。IOCAFをクリアしてからsleepを実行するように修正。
これで概ね動くようになってそれっぽい信号が出るようになったのですが、まだ受信機が信号を認識してくれない…。オシロとにらめっこしながら各信号の長さを微調整して何とか認識してくれるようになりましたが、12F509→16F1503への移植に際して、元のプログラムよりBANK切り替えが増えた分遅くなってる事に気づいて、38kHz信号を作るところの時間調整のnopを外したりして、再度時間調整して、一応の完成を見ました。
しかし、元のプログラムだと、チャンネルをA→Dへと切り替えると1フレームの長さが長くなるのが気になった。赤外受光モニターで音を聞いてても、チャンネルDまですると、明らかに信号の密度が下がる。これだと最悪、受信機側が「送信が切れた」と判断して、モータ駆動が切れ切れになる可能性がないか…?
第2データ送信後の待ち時間を(定数-data_time)にして、第1データと第2データ間の時間(=data_time)が変わってもフレーム長を一定にしようとしたのだけど思ったようにいかず、またもや大泉さんにヘルプ。メールのやりとりでヒントを貰って、何とか解決しました。
これでようやく完成です。
最後に、受信機側の考察をしておきます。
今回は、とりあえず受信機のクローンは作りませんw。実機のモータの駆動方法に疑問があるためです。
車体側の基板はこんな感じ。
![](https://blogimg.goo.ne.jp/user_image/50/2a/627d4388e68a6c699230d155a99dafe9.jpg)
ステアリング用の電磁石への配線は、Aがコモンで多分常時プラス。B・Cがそれぞれ電磁石のシンクで、基板上のNPNトランジスタでON-OFFしてます。
トランジスタのMarkingは「K1Y」で、Fairchild社のKSC3265-Yグレードと思われます。
この電磁石の駆動に基板のかなりの面積を使ってるのに、メインモータの正逆駆動回路がみあたりません…。これ以上分解はしてませんが、部品は片面にしか配置されてない様に見受けられます(電解コンデンサが1個付いてるかな?)。COBの中にブリッジ回路まで入れてあるのかしら…?
SOP8のマイコンとSOP8のモータドライバを使うと、この大きさで作れそうにありません…。(HブリッジをSMD部品で組むと、SOP8よりもっと面積食う。)
低速とターボの切り替えはPWMと思われます。「ここがモータ行きかな?」のところに電線繋いで、オシロで見てみます。
![](https://blogimg.goo.ne.jp/user_image/42/44/78640a9e537852da7d771b0d06a73f4b.png)
やっぱりPWMです。ターボを押すとDUTY=100%の連続電圧になります。(V=2Vぐらいなので、FETじゃなくてトランジスタによるブリッジかもしれません。)
現在動いてる修理依頼品をこれ以上つついて動かなくなるとマズいので、今回はこれ以上追及しませんが、「フレームが長くなるとモータ駆動が切れ切れにならないか?」の確認だけしておきます。
上と同じ点の電圧を見ながら、フレーム短めの時の状態:
![](https://blogimg.goo.ne.jp/user_image/6f/03/42619b349afa08271d52131b25d65ade.png)
データ間を200msにした時の状態:
![](https://blogimg.goo.ne.jp/user_image/63/c4/119897ee441e685251e36b13e19ec7c4.png)
(記事書きながらDCモードに切り替えてなかったことに気付いて、上の100usの方は撮り直したのですが、下の2つは撮り直してません。DCレベルがズレてますが、ご勘弁をw。)
どうやら、無信号が200ms続いてもPWM信号は切れてない様です。限界は確認していませんが、少なくとも200msまでは大丈夫そうです。
低速とターボの切り替えがPWMなら、ICは前後左右で4PIN(前後はPWM出力)、信号INとVdd・Vssで計7PIN。まだ1PIN余裕があるので、実機と同じくA/BまたはC/Dのチャンネルセレクトも付けて、SOP8のマイコンで換装できるかな?
とりあえず今回の検討はここまでにしておきますw。
いつも参考にさせて頂き&お世話になっている、つつじヶ丘おもちゃ病院の大泉さんの記事「Q-STEER送信機の修理(マイコン換装)」のプログラムを使わせて頂くことにしますが、デバイス(使用マイコン)をPIC12F509→16F1503に変更する事にしました。
記事の当時(2016年/7月頃)に12F509を採用された理由は、
・当時秋月で最安:50円。16F1503を使うと80円と1.6倍になってしまう。
・DIP-14はスペース的にも厳しい。
といった事で、DIP-8の12F509になったとの事。しかし、SW入力で5PIN、LED出力に1PIN(それとVddとVss)で、これ以上ポートが無く、ポートでチャンネルセレクトができない。
ところが、当時と部品調達事情が変わって、16F1503もAliExpressで50円程度で購入できるようになりました。例えばこのショップ。
![](https://blogimg.goo.ne.jp/user_image/3f/9a/3d000f9e378b1da4194298d58b437fd5.png)
スペースの問題も、SOP-14なら何とか元のケースに入ると思われます。基板作るのはちょっと苦労しますが、基板入れても厚さも空中配線のDIPと同じくらいに収まるかな?
ということで、A~Dのチャンネルセレクトも元と同じ形のクローン送信機を作ることにしました。
元の送信機の基板はこんな感じ。
![](https://blogimg.goo.ne.jp/user_image/17/fe/9dc99c3502809cd7658aab9b2c1ea610.jpg)
左にSOP-14の16F1503を置いてますが、きっと収まると思います。SW面はこんな感じ。
![](https://blogimg.goo.ne.jp/user_image/36/df/7cd0bcc3faf4d944c1d19766187f7b0d.jpg)
チャンネルセレクトは予想通り2ビット。(COBにどう繋がってるかはよく分かりませんでした。)
大泉さんに「こんな物を作ろうと思います」とお伝えすると、「ほい、出来ました」とあっという間に先に作られてしまうので(w)、毎度、なるべく自力で作ろうとするのですが、結局毎度うまく動かず、大泉さんに相談する事になってしまいますww。
今回もちょっとしたミスや元プログラムの理解不足からくる間違いで問い合わせをして、お手数をお掛けしてしまいました。
12F509→16F1503に移植するにあたり、「Cで作ろうかな…(元のプログラムはMPASM)」とも思ったのですが、ASMのままの方が変更が少なそうなのでASMのまま作ることにしました。
移植・変更作業としては、
・POR時のチャンネル設定や、「TURBO単独で2.5秒以上押したら再設定」の部分はカット
・替わりに、sleepから起きるたびにポートを読んでチャンネル設定をする
・12F509版では必要のなかったBANK SELECTに気を付ける
・多機能な分、必要なポートの初期設定が増えて、define文がだいぶ増えた
・リセット/割込みベクタの書き方は?
ぐらいでしょうか。
プロジェクトをストレージに上げておきます。(「ここ」)
(2020/9/19追記)スリープ時の消費電流を測ると12.5μAでした。「ちょっと高いなぁ…」と大泉さんに尋ねると、「通常スリープ時の電流としてはそんなもの。低電力スリープを使えば1μA以下に下がる」と教えて頂きました。設定部分に「bsf VREGCON,VREGPM」を追加して低電力スリープにしたところ、手持ちの安物DMM(最小分解能0.1μA)で、消費電流0.2μAまで下がりました。プログラムをそのまま使う人は居ないかもしれませんが、ストレージも更新しておきます。
簡単な回路なので、プログラムの中身(ポートの定義)を見れば作れると思いますが、一応回路図載せておきます。(回路図見た方がイメージしやすい人も居るかもしれませんのでw。)
![](https://blogimg.goo.ne.jp/user_image/7c/6c/8d5e07e4ece107ea37696c090ca552cb.png)
実機はLEDはNPNトランジスタでドライブしてますが、少なくとも今回はポートで直接駆動にしてます。(12F509はポートの最大絶対定格:25mAですが、16F1503は50mAで、表書きの概要には連続25mAと書いてあります。十分直接駆動できます。)
チャンネルセレクトは、最初コモンをプラスに繋いでプルダウンにしようかと思いましたが、それだとsleep時にも(チャンネルセレクトが1個でもONになってると)常時電流を消費してしまうので、スキャンの時だけポートから電圧を掛ける仕様にしています。(内部プルアップが使えれば、内部プルアップのON-OFFでいけるのですが、16F1503はポートAしかWPUが使えません。IOCもポートAのみなので、ポートAは操作SWに割り振るしかなく、チャンネルセレクトにPICの内部プルアップが使えません。)
製作した基板の写真も載せておきます。まず表:
![](https://blogimg.goo.ne.jp/user_image/74/1e/530481548a7f18019ca967ddc4a76cb1.jpg)
裏:
![](https://blogimg.goo.ne.jp/user_image/3a/27/bc25c505c152906298795e738e2588f5.jpg)
今回は小さく作る必要ないのでDIP-14を使ってますが、基板はケチって、5×7cmの半分を使いました。裸で使うので、ビニール線は表のみにしてます。(回路図には載せてませんが、電源ラインに100uFの電解コンデンサを入れてあります。)
まず、OSCCONの設定の前にBANKの切り替えを入れ忘れてクロックが切り替わらない所でモタついて、大泉さんにヘルプを出してしまいました。
BANK切り替えミスに気付いてビルド・書き込み仕直したつもりだったのですが、HEXファイルが更新されてなかったみたい。(油断すると時々、ビルド成功してるのにHEXやLSTファイルが更新されない事があるような気がする。)
ついでに、「PICはsleepからの復帰はピン変化だけでよく、interruptを使わなくてもいい」の指摘や、フラグクリアに関する指摘を貰いました。
IOC=Interrupt on changeを使うのですが、「Interrupt」って書いてあるじゃん?と思うのですが(w)、データシートをよく読むと、
![](https://blogimg.goo.ne.jp/user_image/04/4e/76e53aeb39e88dc7968e97d577ff6f77.png)
確かにGIEをdisableでinterruptが発生しなくても、sleepからのwake-upができる様に書いてありました。
フラグは、IOCIFが立ったままだとsleepできない図ですが、データシートをよく読むと、IOCIFはread onlyで書き込めず、IOCIFクリアの為にはIOCAFをクリアしておく必要がある。(そんなことがデータシートのなかのあちこちに分散して書いてあるw。)
GIEはセットせずに、IOCIEだけセットする。IOCAFをクリアしてからsleepを実行するように修正。
これで概ね動くようになってそれっぽい信号が出るようになったのですが、まだ受信機が信号を認識してくれない…。オシロとにらめっこしながら各信号の長さを微調整して何とか認識してくれるようになりましたが、12F509→16F1503への移植に際して、元のプログラムよりBANK切り替えが増えた分遅くなってる事に気づいて、38kHz信号を作るところの時間調整のnopを外したりして、再度時間調整して、一応の完成を見ました。
しかし、元のプログラムだと、チャンネルをA→Dへと切り替えると1フレームの長さが長くなるのが気になった。赤外受光モニターで音を聞いてても、チャンネルDまですると、明らかに信号の密度が下がる。これだと最悪、受信機側が「送信が切れた」と判断して、モータ駆動が切れ切れになる可能性がないか…?
第2データ送信後の待ち時間を(定数-data_time)にして、第1データと第2データ間の時間(=data_time)が変わってもフレーム長を一定にしようとしたのだけど思ったようにいかず、またもや大泉さんにヘルプ。メールのやりとりでヒントを貰って、何とか解決しました。
これでようやく完成です。
最後に、受信機側の考察をしておきます。
今回は、とりあえず受信機のクローンは作りませんw。実機のモータの駆動方法に疑問があるためです。
車体側の基板はこんな感じ。
![](https://blogimg.goo.ne.jp/user_image/50/2a/627d4388e68a6c699230d155a99dafe9.jpg)
ステアリング用の電磁石への配線は、Aがコモンで多分常時プラス。B・Cがそれぞれ電磁石のシンクで、基板上のNPNトランジスタでON-OFFしてます。
トランジスタのMarkingは「K1Y」で、Fairchild社のKSC3265-Yグレードと思われます。
この電磁石の駆動に基板のかなりの面積を使ってるのに、メインモータの正逆駆動回路がみあたりません…。これ以上分解はしてませんが、部品は片面にしか配置されてない様に見受けられます(電解コンデンサが1個付いてるかな?)。COBの中にブリッジ回路まで入れてあるのかしら…?
SOP8のマイコンとSOP8のモータドライバを使うと、この大きさで作れそうにありません…。(HブリッジをSMD部品で組むと、SOP8よりもっと面積食う。)
低速とターボの切り替えはPWMと思われます。「ここがモータ行きかな?」のところに電線繋いで、オシロで見てみます。
![](https://blogimg.goo.ne.jp/user_image/42/44/78640a9e537852da7d771b0d06a73f4b.png)
やっぱりPWMです。ターボを押すとDUTY=100%の連続電圧になります。(V=2Vぐらいなので、FETじゃなくてトランジスタによるブリッジかもしれません。)
現在動いてる修理依頼品をこれ以上つついて動かなくなるとマズいので、今回はこれ以上追及しませんが、「フレームが長くなるとモータ駆動が切れ切れにならないか?」の確認だけしておきます。
上と同じ点の電圧を見ながら、フレーム短めの時の状態:
![](https://blogimg.goo.ne.jp/user_image/6f/03/42619b349afa08271d52131b25d65ade.png)
データ間を200msにした時の状態:
![](https://blogimg.goo.ne.jp/user_image/63/c4/119897ee441e685251e36b13e19ec7c4.png)
(記事書きながらDCモードに切り替えてなかったことに気付いて、上の100usの方は撮り直したのですが、下の2つは撮り直してません。DCレベルがズレてますが、ご勘弁をw。)
どうやら、無信号が200ms続いてもPWM信号は切れてない様です。限界は確認していませんが、少なくとも200msまでは大丈夫そうです。
低速とターボの切り替えがPWMなら、ICは前後左右で4PIN(前後はPWM出力)、信号INとVdd・Vssで計7PIN。まだ1PIN余裕があるので、実機と同じくA/BまたはC/Dのチャンネルセレクトも付けて、SOP8のマイコンで換装できるかな?
とりあえず今回の検討はここまでにしておきますw。