いままでRX631を載せたマウス基板を用いて、デバイスの動作確認をおこなっていましたが、AD変換が上手くいかなかったので、マウス基板をまた作りなおしました。
RX631-48ピンが手に入りづらくなっていたことに加えて、RAMが多い高性能のマイコンを使いたいと思ったので、今回はRX651-64ピン用のマウス基板を設計しました。
RX651用のマウス基板の回路設計
赤外線センサーのAD変換結果がおかしな値となっていたため、RX651のユーザーズマニュアル ハードウェア編 を参考にして回路を再設計をしました。
回路図の変更点
再設計した回路図は図1です。
今回の回路図で前回の回路図から変更した主な箇所は以下の3つです。
- マイコンをRX631からRX651に変更
- 1つのFETで1つの赤外線LEDをスイッチング
- マウス基板とAS5047P基板をつなげるコネクタを4x2から3x2に変更
冒頭で述べたようにRX631からRX651に変更しています。
加えて、いままで1つのFETで2つの赤外線LEDをスイッチングしていましたが、プログラムが書きにくかったので、1つのFETで1つの赤外線LEDをスイッチングするようにしました。
あとは、AS5047PのA端子とB端子はマイコンと接続しなくてもよいことがわかりましたので、コネクタを4x2から3x2に変更しています。
DRV8836やMPU6000も手に入りづらくなっているので、変更しようかなと思いましたが、使い方を再び調査しないといけないので辞めときました。
配線図の変更点
再設計した配線図は以下です。
配線図PDF版(縮尺:2.5倍)
今回の配線図で前回の配線図から変更した主な箇所は以下の3つです。
- マイコンのAVSSや赤外線センサにつながっているGNDはレギュレータ付近のコンデンサのGNDと一点接続する
- 赤外線センサーの出力信号とデジタル信号線を交差させない
- モータドライバーのGNDはレギュレータ付近のコンデンサのGNDと一点接続する
変更点1と2についてはRX651のマニュアルp.2548にある「53.6.12 ボード設計上の注意」に書いてあることを参考にしています。いままでは、プリント基板の2層ともベタGNDにしていましたが、1層だけベタGNDにして、GNDを1点接続できるようにしました。
また、モータドライバーからのノイズで問題が生じるというブログ記事をいくつか拝見しましたので、モータドライバーのGNDについてもレギュレータ付近のコンデンサのGNDと一点接続させました。
届いたマウス基板
Elecrowに発注して届いたマウス基板が図3です。
文字は少し乱れていましたが、フットプリントがとても綺麗にできていて良かったです。
ハンダ付けして組み立てたマウスが図4となります。
前回のマウス基板では、センサーの出力はオシロコープで正常だったにもかかわらず、AD変換の結果がずっと4095になっていたり、電圧が上がると逆にAD変換の結果が下がったりして、謎の動作をしていました。
今回のマウス基板では、AD変換の結果が正常な値でしたので、とても良かったです。
RX651とRX631の違い
RXマイコン(RX631)のソフト開発で記述したプログラムを書き換えました。その過程で気づいたRX631と違った点を述べていきます。
性能
前回購入したRX631と今回購入したRX651の性能の違いは以下の表のようになっています。システムクロック(ICLK)というのはRXマイコンのCPU動作クロックの呼び名です。
RX631 | RX651 | |
---|---|---|
型名 | R5F5631PDDFL | R5F5651EHDFM | ピンの数 | 48 | 64 |
RAM容量 | 64KB | 640KB |
ROM容量 | 512KB | 2MB |
ICLK周波数 | 100MHz | 120MHz |
全体的にメモリの容量が多くなっているので、プログラムや計算結果などを多く保存できます。
また、 ICLK周波数も120MHzに上がっているので、計算速度が速くなってます。
書き込みにメインクロックがいらない
以下の記事で説明しましたが、RX631では書き込みにメインクロックが必要でした。
しかし、RX651ではSCI (UART) で書き込む場合、メインクロックがいらなくなりました。試しにセラロックをつけずに書き込んだところ、無事書き込めました。
また、PLL回路の入力クロックソースに高速オンチップオシレータ(HOCO)を選択できるようになりましたので、メインクロックがなくてもICLKを最大周波数で動作できます。
これでRXマイコンの書き込みのハードルも下がったかなと思います。
プログラム的な変更点
RX631からRX651でプログラムを書き換えたときの主な変更点を説明します。
ROMWTレジスタの設定
RX651からICLKを50MHz以上で動かす場合、ROM ウェイトサイクル設定レジスタ (ROMWT)の設定が必要となりました(マニュアルp.312「9.2.2 ROM ウェイトサイクル設定レジスタ (ROMWT)」を参照)。
そのため、メインクロックの設定とICLKの設定の間にROMWAITレジスタの設定を以下のように加えました。
/*---- MainCLK, SUBCLK and RTC Initialization ----*/ void init_clock(void){ ~略~ // Main CLK setting RTC.RCR4.BIT.RCKSEL = 1; // Select main CLK as count source SYSTEM.MOSCCR.BIT.MOSTP = 0; // Main CLK ON for(i=0;i<1000;i++); // Wait about 50ms // ROMWAIT setting SYSTEM.ROMWT.BIT.ROMWT = 2; while(SYSTEM.ROMWT.BIT.ROMWT!=2); // ROM wait cycle = 2cycle // SYSTEM CLK setting SYSTEM.PLLCR.BIT.PLIDIV = 0x0; // Main CLK divided by 1 SYSTEM.PLLCR.BIT.STC = 0x17; // Main CLK multiplied by 12 ~略~ }
MTU3とRSPIがPCLKAを使用
RX631ではMTU3とRSPIはクロックにPCLKBを使用していましたが、RX651ではPCLKAを使用しています。それなので、MTU3とRSPIがPCLKBで動いていると勘違いしないように注意する必要があります。
スピーカーを鳴らしたときに音が高くなっていたので、気づくことができました。
センサーホルダーでの失敗
図5のセンサーホルダーを3Dプリンタで作成したのですが、失敗したので報告します。
赤外線LEDを光らせて、センサーホルダーを付けたときのAD変換値をみてください。
障害物 | 左前 | 左横 | 右前 | 右横 |
---|---|---|---|---|
無 | 3607 | 3634 | 3587 | 3564 |
有 | 3689 | 3747 | 3661 | 3673 |
障害物がセンサーの前に無いときと有るときでAD変換値の差がほとんどありません。
おそらく、原因としてはセンサーホルダーによる散乱光だと考えられます。それにしても、散乱光が強すぎると思いますが....。
センサーホルダーを使う人で、散乱光の対策はどうしているのかと気になったところ以下の記事が見つかりました。
見つけた記事:うむ夫の歩み Nucleo-32boardを使ったクラシックマウスの開発その8 ~センサーホルダー~
どうやら、熱収縮チューブを付けてホルダーに挿入すれば良いみたいです。ただ、作成したホルダーの穴の大きさが熱収縮チューブの分を考慮していないので、作り直す必要があります。
試しにセンサーホルダーを外して、赤外線LEDに熱収縮チューブを付けた場合のAD変換値は以下です。
障害物 | 左前 | 左横 | 右前 | 右横 |
---|---|---|---|---|
無 | 350 | 343 | 278 | 574 |
有 | 1916 | 2078 | 2316 | 2951 |
AD変換の値に差があっていい感じです。
センサーホルダーを付けなくてもいいかなと少し思いましたが、基板にホルダーを差し込む穴もあるので、もう一度作成しなおそうと思います。
おわりに
今回、RX651用のマウス基板の設計とRX651とRX631の違いについて話しました。これで全てのデバイスの動作確認ができましたので、次回から本格的にマイクロマウスのプログラムを作成していきたいと思います。