Last active
August 29, 2015 14:05
-
-
Save kb10uy/cb23dffd644d794599f5 to your computer and use it in GitHub Desktop.
ArduinoのI/OをI2C経由で操作できるスケッチ
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* 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