そこでシリアル通信なる方法を使います。効率よくデータを送受信できます。Arduino 用モジュールとして売られているセンサーなどはそもそもシリアル通信でのみ通信できるようなものも多いです。
先日頼んでおいた加速度センサーでシリアル通信(IIC)を使ってデータを読み込んでみました。Arduino 標準の Wire.h ライブラリを使ってアドレスを指定し、データを読み込みます。配線は Vcc (5V), GND, SDA (Pin 4), SCL (Pin 5), CS (5V)。
アドレス、モード指定、レジスタ番地などはデータシートなどを参照する必要があります。ここで引っかかったのはモード指定で、データシートを見ても指定しなければならないということがなかなか読めない。
書き込みは多いモジュールなので、どうやら動くよう設定することができました。以下コードです。
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
#include <Wire.h> | |
#define addr 0x53 | |
void setup() | |
{ | |
Serial.begin(9600); | |
Wire.begin(); | |
Wire.beginTransmission(addr); | |
Wire.write(0xA7); | |
Wire.endTransmission(); | |
Wire.beginTransmission(addr); | |
Wire.write(0x2D); | |
Wire.write(0x0); | |
Wire.endTransmission(); | |
Wire.beginTransmission(addr); | |
Wire.write(0x2D); | |
Wire.write(0x10); | |
Wire.endTransmission(); | |
Wire.beginTransmission(addr); | |
Wire.write(0x2D); | |
Wire.write(0x8); | |
Wire.endTransmission(); | |
} | |
void loop() | |
{ | |
int x,y,z; | |
Wire.beginTransmission(addr); | |
Wire.write(0x32); | |
Wire.endTransmission(); | |
Wire.requestFrom(addr,6); | |
if(6<=Wire.available()) | |
{ | |
x=Wire.read() << 8; | |
x|=Wire.read(); | |
y=Wire.read() << 8; | |
y|=Wire.read(); | |
z=Wire.read() << 8; | |
z|=Wire.read(); | |
} | |
Serial.print("X ="); | |
Serial.println(x); | |
Serial.print("Y ="); | |
Serial.println(y); | |
Serial.print("Z ="); | |
Serial.println(z); | |
Serial.println(); | |
delay(500); | |
} | |