Skip to content

Instantly share code, notes, and snippets.

@kb10uy
Last active August 29, 2015 14:05
Show Gist options
  • Save kb10uy/cb23dffd644d794599f5 to your computer and use it in GitHub Desktop.
Save kb10uy/cb23dffd644d794599f5 to your computer and use it in GitHub Desktop.
ArduinoのI/OをI2C経由で操作できるスケッチ
/* I2C I/O Control Sketch
* (C) 2014 kb10uy
* Released under the MIT License.
*
* 各命令には1バイト命令と2バイト命令があり、
* 送られてきたバイト列について、
* 0x7f以下ならそのバイトを命令に、次のバイトを命令のデータに取り2バイト命令として、
* 0x80以上ならそのバイトだけを命令にとり1バイト命令となります。
*
* +2バイト命令--------------------------------------------------------------------------+
* |0x01 データの番号のデジタルピンを出力に設定する |
* |0x02 データの番号のデジタルピンを入力に設定する |
* |0x03 データの番号のデジタルピンをプルアップ付き入力に設定する |
* |0x10 データの番号のデジタル出力ピンをHIGHにする |
* |0x11 データの番号のデジタル出力ピンをLOWにする |
* |0x18 データの番号のデジタル入力ピンを読み取り、マスタにデータを送信する |
* | (HIGH:1,LOW:0) |
* |0x20 データの番号をアナログPWM出力の操作対象にする |
* |0x21 データのレベルで操作対象のアナログPWM出力をする |
* |0x28 アナログ入力ピンを読み取り、2byte(リトルエンディアン)でマスタにデータを送信する|
* | |
* |0x30 tone関数のdurationの下位バイトをデータバイトの値にする |
* |0x31 tone関数のdurationの上位バイトをデータバイトの値にする |
* | (両方-1(0xFF)を設定するとdurationなしの出力になります) |
* |0x32 tone関数の出力ピンをデータの番号にする |
* |0x33 tone関数のfrequencyの下位バイトをデータバイトの値にする |
* |0x34 tone関数のfrequencyの上位バイトをデータバイトの値にする |
* | |
* | |
* |0x7f Arduino上のLEDをデータの回数点滅させる |
* +-------------------------------------------------------------------------------------+
*
* +1バイト命令--------------------------------------------------------------------------+
* |0x80 アナログ入力基準電圧源をDEFAULTにする |
* |0x81 アナログ入力基準電圧源をINTERNALにする |
* |0x82 アナログ入力基準電圧源をEXTERNALにする |
* |0x90 その時点での設定情報でtone関数を実行する |
* |0x91 その時点での設定情報のピン番号でnoTone関数を実行する |
* | |
* | |
* |0xfe Arduino上のLEDを点ける |
* |0xff Arduino上のLEDを消す |
* +-------------------------------------------------------------------------------------+
*/
// 変更可能
const byte I2C_SLAVE_ADDRESS=0x24;
const int ARDUINO_LED_PIN=13;
#include <Wire.h>
void setup();
void receiveEvent(int howMany);
void requestEvent();
void processCommand(byte command,byte data);
int retlen=0;
byte retval[1024];
int awpin=0;
int tpin=0;
byte tdurh=-1,tdurl=-1;
byte tfreqh=0,tfreql=0;
void setup() {
pinMode(ARDUINO_LED_PIN,OUTPUT);
Wire.begin(I2C_SLAVE_ADDRESS);
Wire.onReceive(receiveEvent);
Wire.onRequest(requestEvent);
}
void loop() {
}
void receiveEvent(int howMany) {
while(Wire.available()) {
byte cmd=Wire.read();
byte data=0;
if (cmd<=0x7f && Wire.available()) {
data=Wire.read();
}
processCommand(cmd,data);
}
}
void requestEvent() {
for(int i=0;i<retlen;i++) {
Wire.write(retval[i]);
}
}
void processCommand(byte command,byte data) {
int arv=0;
switch(command) {
case 0x01:
pinMode(data,OUTPUT);
break;
case 0x02:
pinMode(data,INPUT);
break;
case 0x03:
pinMode(data,INPUT_PULLUP);
break;
case 0x10:
digitalWrite(data,HIGH);
break;
case 0x11:
digitalWrite(data,LOW);
break;
case 0x18:
retlen=1;
retval[0]=digitalRead(data)==HIGH?1:0;
break;
case 0x20:
awpin=data;
break;
case 0x21:
analogWrite(awpin,data);
break;
case 0x28:
arv=analogRead(data);
retval[0]=arv&&0xff;
retval[1]=arv>>8;
retlen=2;
break;
case 0x30:
tdurl=data;
break;
case 0x31:
tdurh=data;
break;
case 0x32:
tpin=data;
break;
case 0x33:
tfreql=data;
break;
case 0x34:
tfreqh=data;
break;
case 0x7f:
interrupts();
for(int i=0;i<data;i++) {
digitalWrite(ARDUINO_LED_PIN,HIGH);
delay(125);
digitalWrite(ARDUINO_LED_PIN,LOW);
delay(125);
}
noInterrupts();
break;
case 0x80:
analogReference(DEFAULT);
break;
case 0x81:
analogReference(INTERNAL);
break;
case 0x82:
analogReference(EXTERNAL);
break;
/*
case 0x83:
analogReference(INTERNAL1V1);
break;
case 0x84:
analogReference(INTERNAL2V56);
break;
*/
case 0x90:
if ((tdurl|(tdurh<<8))==-1) {
tone(tpin,(tfreql|(tfreqh<<8)));
} else {
tone(tpin,(tfreql|(tfreqh<<8)),(tdurl|(tdurh<<8)));
}
break;
case 0x91:
noTone(tpin);
break;
case 0xfe:
digitalWrite(ARDUINO_LED_PIN,HIGH);
break;
case 0xff:
digitalWrite(ARDUINO_LED_PIN,LOW);
break;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment