2016年7月3日日曜日

ATTINY85のi2cスレーブデバイスをOPENWRTにつないでみる



さて、虎の子のGPIOを使ってしまったのでリレーをつなげなくなってしまった。
シリアルポートにarduinoをつなげるという手も考えた・・・っていうか作ったのだけど

i2cのスレーブにarduinoのようなもの をぶら下げるほうがいいと思えた。


tinywireSというライブラリがあるっぽい。
http://qiita.com/mt08/items/46d73c4e1957c1eb55f5


DIGISPARKは持ってないけど、ATTINY85,45なら持っているのでサクッとブートローダーを書いて
適当にサンプルソースを書き換える。


// ATTiny based I2C relay control
// ForkRobotics 2012
//

#include "TinyWireS.h"                  // wrapper class for I2C slave routines

#define I2C_SLAVE_ADDR  0x26            // i2c slave address
#define Relay1_PIN  1
#define Relay2_PIN  4
#define Relay3_PIN  3

void setup() {
  pinMode(Relay1_PIN, OUTPUT);
  pinMode(Relay2_PIN, OUTPUT);
  pinMode(Relay3_PIN, OUTPUT);
  digitalWrite(Relay1_PIN, HIGH); //HIGHでOFFのリレー用
  digitalWrite(Relay2_PIN, HIGH);
  digitalWrite(Relay3_PIN, HIGH);

  TinyWireS.begin(I2C_SLAVE_ADDR);      // init I2C Slave mode
}

void loop() {
  byte byteRcvd = 0;
  if (TinyWireS.available()) {          // got I2C input!
    byteRcvd = TinyWireS.receive();     // get the byte from master
    switch (byteRcvd) {
      case 0x01:
        digitalWrite(Relay1_PIN, LOW);
        break;
      case 0x02:
        digitalWrite(Relay2_PIN, LOW);
        break;

      case 0x03:
        digitalWrite(Relay3_PIN, LOW);
        break;
      case 0x11:
        digitalWrite(Relay1_PIN, HIGH);
        break;

      case 0x12:
        digitalWrite(Relay2_PIN, HIGH);
        break;
      case 0x13:
        digitalWrite(Relay3_PIN, HIGH);
        break;


    }

  }
}

void Switch(int relay) {
  if (digitalRead(relay) == HIGH) {
    digitalWrite(relay, LOW);
  }
  else {
    digitalWrite(relay, HIGH);
  }
}

超絶手抜きだけど気にしない。

#6番ピンON/OFF
#i2cset -y 0 0x26 0x01 0x00 b
#i2cset -y 0 0x26 0x11 0x00 b


ふつうは正論理でいいはずなのだけど、arduino用の5vリレーは大抵負論理なので注意
途中に抵抗を入れてやらなきゃいけなかったりもするしめんどくさい。
ebayに3.3v用のリレーが売ってるのを買ってつなげたほうが手っ取り早い。



0 件のコメント:

コメントを投稿