水曜日, 5月 18, 2016

Arduino: シリアル通信(IIS)

Arduino Uno はそこそこピン数があります。7セグでもつなげてしまうほどピン数が多いわけですが、線の多いのは困りものです。場所を取るし配線がやっかいです。配線が多いのはうざいってだけではなく、配線を調べねばならないというだけで作ろうという雰囲気をぶち壊してくれます。

そこでシリアル通信なる方法を使います。効率よくデータを送受信できます。Arduino 用モジュールとして売られているセンサーなどはそもそもシリアル通信でのみ通信できるようなものも多いです。

先日頼んでおいた加速度センサーでシリアル通信(IIC)を使ってデータを読み込んでみました。Arduino 標準の Wire.h ライブラリを使ってアドレスを指定し、データを読み込みます。配線は Vcc (5V), GND, SDA (Pin 4), SCL (Pin 5), CS (5V)。


アドレス、モード指定、レジスタ番地などはデータシートなどを参照する必要があります。ここで引っかかったのはモード指定で、データシートを見ても指定しなければならないということがなかなか読めない。

書き込みは多いモジュールなので、どうやら動くよう設定することができました。以下コードです。

#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);
}

Qt: 外部プログラムを起動する

  Qt/C++ のアプリは、外部へ直接アクセスできます。これはネットアプリでは不可能な Qt のメリットです。 外部プログラムを起動することもできます。QProcess::startDetached() を使うと独立したプロセスを立ち上げることができます。 この QProces...