マイコンカーラリー DriveBoard TypeJ Ver2.0の動作テスト

YoctoでBeaglebone用システムを構築している間にDriveBoard TypeJ Ver2.0の部品を実装してテストしてみました。
部品点数が少ないので実装はBeaglebone用システム構築にかかる3~4時間の間で終わります。

とりあえずLCDの動作テストをして、表示が出来ることを確認しました。
LCDはI2C接続なので4pinのコネクタでOKで、ボタン操作の邪魔にならないように写真のような角度に配置してみました。

CPUボードの上に載っているのはシリアル接続の高速データロガーでR8C38のプログラムライターとしても使えます。

マイコンカーラリー用アナログセンサーボード LineSensor TypeJ Ver1.0の試作

マイコンカーラリー用アナログセンサーボードTypeJ Ver1.0の基板が出来てきたので部品を実装してみました。

このボードはN先生のリクエストに沿って設計したもので、特徴は基板の下側に部品を取り付けないこととオールアナログセンサにしてセンサー基板の部品を最小限にしていることです。
マイコンカー衝突時に壊れるのは主に下面の部品ということなので下面の部品を無くせば壊れる確率が減り、部品点数を減らすことで壊れた時の出費と重量を減らす効果があります。
センサーボードの取り付け方法は私のアイディアで、取り付けネジを無くすことで重量軽減を図るとともに衝突時にセンサーボードが後方にずれることで衝撃を逃がし破損のリスクを減らすのが狙いです。

オールアナログセンサのためドライブボード側もこのセンサーボードに対応したタイプを使う必要があります。

ドライブボードは生徒が組み立てられるようにドライブIC以外はDIPタイプの部品を使うつもりでしたがこのアナログセンサボードに対応するため止む無く裏面のこの部分にチップ部品を配置しました。
上側の3ピンのICはPchFETです。
センサーボードのLEDをON/OFFしてLED点灯時と消灯時のセンサ出力の差分を取ることでコース周辺の明るさの影響をキャンセルする目的で搭載しています。

基板上面の写真です。

表面実装部品はモータドライブIC5個と5Vのシリーズレギュレータ、マイクロSDコネクタとなっています。

R8C38ボードで秋月のI2C接続LCD AQM1602Aを使う

マイコンカーラリーではパラメータ設定と状態確認のためにキャラクタ表示LCDを使います。

公式キットでサポートされているのが上写真のようなパラレル接続のLCDで、このLCDを駆動するためにはD0~D3、RS,RW,Eの7本の信号線が必要です。
試作したマイコンカーラリー用ドライブボードVer1.0ではこのタイプで廉価版のSD1602HUOB(900円)(上の写真)を使う予定でしたがその後にI2C接続のLCD AE-AQM1602A(KIT)(550円)があることを教えて頂いたのでそちらを使うことにしました。

I2C接続ではSCL,SDAの2本の信号線だけでLCDに文字を表示することが出来るためパラレル接続のLCDではスイッチとLCD駆動信号をマルチプレクスして使うという面倒なことをやっているのが、LCDとスイッチを別々のポートに割り当てることが出来ます。

AE-AQM1602Aを表示するためのソフトはマイコンカーラリー販売のサイトからダウンロードできるi2c_lcd_38a.zipを解凍してlcd_st7032i_lib.cの一部を変更しlcd_lib.cと差し替えるだけで使えます。

変更する場所はlcd_st7032i_lib.cの35~38行目と47行目です。

/* I2C_SFR = 0 のときのポート設定 ※ポート0は設定できません */
/************** 次の4行を使うポートに合わせて変更   *********************/
#define i2c_sda         p5_7  /* p3_7 */  /* 液晶のSDA端子                */
#define i2c_sdaddr      pd5_7 /* pd3_7 */ /* 液晶のSDA端子の入出力設定レジスタ*/
#define i2c_scl         p3_5            /* 液晶のSCL端子                */
#define i2c_sclddr      pd3_5           /* 液晶のSCL端子の入出力設定レジスタ*/

/* I2C_SFR = 0 のときのSDA端子、SCL端子の設定 ※変更しないでください */
#define i2c_SDA_0();    i2c_sda = 0;i2c_sdaddr = 1;     /* SDA = "0"    */
#define i2c_SDA_1();    i2c_sdaddr = 0;                 /* SDA = "1"    */
#define i2c_SCL_0();    i2c_scl = 0;i2c_sclddr = 1;     /* SCL = "0"    */
#define i2c_SCL_1();    i2c_sclddr = 0;                 /* SCL = "1"    */

/* 表示文字数 */
/********* 表示文字数を 8 から 16に変更                       ************/
#define LCD_MAX_X           16          /* 横文字数  8 or 16 or 20      */
#define LCD_MAX_Y           2           /* 縦文字数  1 or  2 or  4      */

下の写真は2本の信号線をジャンパ線でつないで上のプログラムで表示テストしたところです。
このLCDはバックライト無しですが、パラレル接続のバックライト付きLCDより視認性が良いように感じました。

I2C接続は少ない信号線でLCDを駆動できるというメリットの反面、表示処理にかかる時間が長くなるというデメリットがあります。
表示処理にどのくらいの時間がかかるのかを測定した結果は次の通りです。

LcdProcess()          400uS       メイン制御ループから呼び出す。
LcdShowProcess() 50~150uS 1mS毎の割り込みから呼び出す。

制御ループ、割り込み関数内の処理のどちらもそれほど大きな負荷にはならない値ですが走行中はLCD表示を見る必要がないので、スタートしたらLCD表示関数を呼ばないようにするのが望ましいでしょう。