■MSP430G2■
超低消費電力をArduinoと同じコードでさくっと動かすにはMSP430G2553 + Energiaに限ります。クロックを1Mhzに落とせば消費電流220μA、単3エネループ2本で1年近くもってしまう計算になります。■接続■
GND同士、SDA同士、SCL同士…をつなぎます。3.3vは接続してはいけません。ラズパイのHDMI端子を手前におき、GPIO端子の手前側の列、左から2番目がSDA、3番目がSCL、SCLの奥がGNDです。
![]() |
例によって白がSCLです。でも黄色SDA/茶GNDなのは在庫切れorz |
MSP430G2553側は、P1.6がSCL、P1.7がSDA、20ピンがGNDです。
Energiaは、I2Cが自動的にプルアップされるので抵抗を外付する必要はありません。海外ブログで ラズパイとArduino Unoをつないでいる記事を見かけて、それによれば「ラズパイがマスターでArduinoがスレーブなら問題ない。ラズパイは3.3vでプルアップされるがArduino側はされてないからだ」とのことなんですが…今手元にArduino unoがないので、確認できません。Nanoパチ(5v)で試したところ、4.5v程度の中途半端な電圧が出ていました。なので、5vロジックのArduinoを使うことはお勧めしません。接続前に電圧を測定してからにした方が無難です。
■Energiaの準備■
TI MSP430 LauchPadにMSP430G2553をセットします。同じMSP430G2でもチップによってジャンパの設定が違いますので、チップを取り替えたらこのページで確認してください。ソースはこれです。Energiaは単に信号を受けて、1バイト目 x 2バイト目の回数、LEDを点滅させています。2バイト以外の場合はバイト数を高速で点滅します。ただし10以上はカットします。動作確認用なので特に意味はありません。
今回Arduinoではじめてi2cスレーブを書いたんですが、受信も送信もハンドラを書く方式でわかりやすくて良いですね。今後活用したいと思います。
This file contains 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
#include <Wire.h> | |
#include <Time.h> | |
volatile byte b = 0; | |
const int kPower = P2_5; // mosfet switch | |
const int kModeWaiting = 1; | |
const int kModeShouldOff = 2; | |
const int kModeShouldOn = 3; | |
int mode = kModeWaiting; | |
time_t eventArrivalTime = 0; | |
int nextTurnOnMinutes = 59; | |
int nextTurnOffSeconds = 30; | |
void setup() | |
{ | |
pinMode(P1_0, OUTPUT); | |
digitalWrite(P1_0, LOW); | |
pinMode(kPower, OUTPUT); | |
digitalWrite(kPower, HIGH); | |
setTime(0, 0, 0, 2016, 7, 16); | |
Wire.begin(0x40); | |
Wire.onReceive(i2cReader); | |
Wire.onRequest(i2cWriter); | |
// | |
// BCSCTL1 = CALBC1_8MHZ; | |
// DCOCTL = CALDCO_8MHZ; | |
} | |
time_t prev; | |
void loop() | |
{ | |
time_t t = now(); | |
if (prev != t) { | |
if ((t % 5) == 0) { | |
blink(1); | |
} | |
prev = t; | |
} | |
switch(mode) { | |
case kModeWaiting: | |
break; | |
case kModeShouldOff: | |
if (t >= eventArrivalTime) { | |
mode = kModeShouldOn; | |
eventArrivalTime = t + nextTurnOnMinutes*60; | |
digitalWrite(kPower, LOW); | |
} | |
break; | |
case kModeShouldOn: | |
if (t >= eventArrivalTime) { | |
mode = kModeWaiting; | |
eventArrivalTime = 0; | |
digitalWrite(kPower, HIGH);e | |
} | |
break; | |
} | |
delay(100); | |
} | |
void i2cReader(int len) { | |
if (len == 2) { | |
nextTurnOffSeconds = byte(Wire.read()); | |
nextTurnOnMinutes = byte(Wire.read()); | |
time_t t = now(); | |
eventArrivalTime = t + nextTurnOffSeconds; | |
mode = kModeShouldOff; | |
} | |
} | |
void i2cWriter() { | |
Wire.write(b); | |
} | |
void blink(int inDuration) { | |
digitalWrite(P1_0, HIGH); | |
delay(inDuration); | |
digitalWrite(P1_0, LOW); | |
delay(200); | |
} | |
■ラズパイの準備■
ここを参考にして一発でした。ありがとうございます。あとは、i2cdetectで0x40が現れれば接続はOKです。
pi@raspberrypi:~ $ sudo i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
pi@raspberrypi:~ $
あとは、以下のように4バイト書き込めば4回チカチカし、
sudo /usr/sbin/i2cset -y 1 0x40 3 2 2 7 i
こちらで6回ゆっくり点滅すればOKです。
sudo /usr/sbin/i2cset -y 1 0x40 3 2 2 7 i
私は貧乏性なので数千円のラズパイを壊すのがとても恐ろしい。ですが、この構成ならば、例えばリレーやモーターなどの危ないことはマイコンにやらせておいて、ラズパイ様は安全なところで命令だけ下していればいい…という運用も可能になります。
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。