無料ブログはココログ

« Arduinoでもっと電子工作を9 | トップページ | リバース運転 »

2021年6月22日 (火)

Arduinoでもっと電子工作を10

Lesson9

C-SizeDCC基板本体のIIC(I2C)ポートを使った通信を行います。当初はミント缶IVを2台接続した2列車同時運転が目的でしたが、その後自動運転基板やRailComアドレスリーダなど、用途が増えました。今回は7セグLEDテンキー基板をミント缶用のテンキースロットルにするためのコードを考えます。
(※RailComアドレスリーダは、これからマルチ接続を実現するための改造を行う予定です)

Csizedcc_masterCsizedcc_slave

スロットルがIICマスター、トラックに繋がる方がスレーブです。マスターの固定アドレスとスロットルのアドレス選択で2列車同時運転が可能です。

IICライブラリ

IIC通信をミント缶で使うためのライブラリを作りました。内容の詳細までは触れませんが、概略、初期化・IIC送信・IIC受信の構成です。スロットルで使うのは初期化と送信です。

CSIICtrans.h
//二重インクルード防止のおまじない?
#ifndef CSIICTRANS_H
#define CSIICTRANS_H

#include &ltWire.h> //Arduino I2Cライブラリをインクルード
//ミント缶専用IICコマンド
#define CMD_DIR 1 //進行方向
#define CMD_SPD 2 //スピード設定
#define CMD_FN 3 //ファンクション
#define CMD_ACC 4 //ターンアウト

class CSIICTRANS {
private: //CSIICtrans.cppのみ使用可能
 byte Booster;
public: //CSIICtrans.cpp以外からもアクセス可能
 //変数定義
 int TargetID; //スレーブID
 //ファンクション定義
 void IICstart(byte inBooster, int inAdr); //初期化
 void IICsend(word inAddr, byte inCmd, byte inDat, byte inStat=0); //送信
 void IICwrite(byte len, word inAddr, byte inCmd, byte inDat, byte inStat=0); //Wireを実行
};
#endif //おまじない終わり

CSIICtrans.cpp
#include "CSIICtrans.h"

void CSIICTRANS::IICstart(byte inBooster, int inAdr) {
 if(inBooster == 0) { // スロットルモード
  Wire.begin(); // マスターに設定
 }
}

void CSIICTRANS::IICsend(word inAddr, byte inCmd, byte inDat, byte inStat=0) {
 byte dat = (byte)inDat;
 switch(inCmd) {
  case CMD_FN:
   IICwrite(len, inAddr, 0b01100000 | (dat & 0x0f), (dat & 0x10) | inStat);
       //(サイズ、アドレス、コマンド + Fn No、Fn Dir)
   break;
 }
}
//Wireライブラリを実行する
void CSIICTRANS::IICwrite(byte len, word inAddr, byte inCmd, byte inDat, byte inStat=0) {
 byte aData[4] = {0,0,0,0};
 byte pt = 0;

 aData[pt++] = inAddr;
 aData[pt++] = inCmd;
 aData[pt++] = inDat;
 Wire.beginTransmission(TargetID);
 Wire.write(aData, len);
 Wire.endTransmission();
}

« Arduinoでもっと電子工作を9 | トップページ | リバース運転 »

電子工作」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

« Arduinoでもっと電子工作を9 | トップページ | リバース運転 »