Arduinoでもっと電子工作を10
Lesson9
C-SizeDCC基板本体のIIC(I2C)ポートを使った通信を行います。当初はミント缶IVを2台接続した2列車同時運転が目的でしたが、その後自動運転基板やRailComアドレスリーダなど、用途が増えました。今回は7セグLEDテンキー基板をミント缶用のテンキースロットルにするためのコードを考えます。
(※RailComアドレスリーダは、これからマルチ接続を実現するための改造を行う予定です)
スロットルがIICマスター、トラックに繋がる方がスレーブです。マスターの固定アドレスとスロットルのアドレス選択で2列車同時運転が可能です。
IICライブラリ
IIC通信をミント缶で使うためのライブラリを作りました。内容の詳細までは触れませんが、概略、初期化・IIC送信・IIC受信の構成です。スロットルで使うのは初期化と送信です。
CSIICtrans.h
//二重インクルード防止のおまじない?
#ifndef CSIICTRANS_H
#define CSIICTRANS_H
#include <Wire.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でもっと電子工作を11(2021.08.24)
- Arduinoでもっと電子工作を10(2021.06.22)
- Arduinoでもっと電子工作を9(2021.06.06)
- Arduinoでもっと電子工作を8(2021.05.18)
- Arduinoでもっと電子工作を7(2021.05.15)
コメント