×

らずらいと姫の挑戦日記(第21回)~Lazurite Fly~

2016-09-06

「CEATEC用の展示デモ機を製作しろ!!」と命をうけてしまいました.....
周りの人に教えてもらいながら、皆様に触っていただけるデモ機を作りたいと思いますので、その制作過程をまとめていきたいと思います。

まず最初は、Lazurite Flyを使って①「手をあげたらモーターが回る」②「振ったらモータが回る」という2つの小型デバイスを作りたいと思います。Lazurite Flyには加速度センサーが内蔵されていますのでその機能を使っていきます。

22

加速度センサーとは???

衝撃・振動・XYZの3軸の傾きなどの状態を検出することができるセンサーです。

身近なものでは、スマホの画面が縦横変わったり、ゲームのコントローラを傾けたり振ったりして操作することに使われています。

その1:手をあげたらモータが回る

25

Lazurite Flyを手首に固定し手をあげると、物体の傾きを検出する加速度センサーが反応し、モーターが回ります。

傾きをどうやって検出してるの??stamp28

XYZ軸の傾きがよくわかるものをつくってみました。割り箸でXYZの3軸をつくり輪ゴムでとめ、それをLazuriteFlyに内蔵されている加速度センサーの3軸にみたてています。写真や絵だと解りにくいので、皆様も実際に作って試してみて下さい♪

2   23

X軸を中心に、Y軸を①~④の方向へ回していきます。

4

5

6

7

XYZ軸の傾きをLazuriteGraphでみてみよう!姫22

LazuriteIDEからプロジェクトのサンプル→04.ROHM_Sensor→Axis10_serialを開き、以下のプログラムを貼り付けます。

[c]
void setup() {
byte rc;

Serial.begin(115200);

Wire.begin();

rc = kxg03.init(KXG03_DEVICE_ADDRESS_4E);
}

float mag,x,y,z;
void loop() {
byte rc;
int i;

static float val[11];
float x2,y2,z2;

rc = kxg03.get_val(&val[0]);
rc = kxg03.get_val(&val[0]);
x2 = val[3]*val[3];
y2 = val[4]*val[4];
z2 = val[5]*val[5];
mag = sqrt(x2+y2+z2);
x = atan(val[3]/sqrt(y2+z2))*180/PI;
y = atan(val[4]/sqrt(z2+x2))*180/PI;
z = atan(val[5]/sqrt(x2+y2))*180/PI;
Serial.print("STX,"); Serial.print_double((double)mag, 2); // Acc(x) Serial.print(","); Serial.print_double((double)x, 2); // Acc(x) Serial.print(","); Serial.print_double((double)y, 2); // Acc(y) Serial.print(","); Serial.print_double((double)z, 2); // Acc(z) Serial.print(","); Serial.print_double((double)mag_amount, 2); // Acc(z) Serial.print(","); /* Serial.print_double((double)val[0], 2); // Gyro(x) Serial.print(","); Serial.print_double((double)val[1], 2); // Gyro(y) Serial.print(","); Serial.print_double((double)val[2], 2); // Gyro(z) Serial.print(","); Serial.print_double((double)val[3], 2); // Acc(x) Serial.print(","); Serial.print_double((double)val[4], 2); // Acc(y) Serial.print(","); Serial.print_double((double)val[5], 2); // Acc(z) Serial.print(","); Serial.print_double((double)val[6], 2); // Mag(x) Serial.print(","); Serial.print_double((double)val[7], 2); // Mag(y) Serial.print(","); Serial.print_double((double)val[8], 2); // Mag(z) Serial.print(","); Serial.print_double((double)val[10], 4); // Pressure */ Serial.println(",ETX"); delay(100); } [/c]

ツール→マイコンボード→LAZURITE mini

ツール→オプション→LAZURITE mini series

ツール→シリアル通信→通信ポートを選択

マイコンボードへ転送

Lazurite IDEフォルダ内、Lazurite Graph.exeを開きます。
開き方は、https://www.appliot.co.jp/lazurite-jp/contents/LazuriteGraph/RohmSensorShield.htmlをみてください24

Setting Windowで、赤枠のように変更します。

グラフの項目を変更します。

8

結果をみると、X軸を中心に回しているので、X軸の傾きはほぼ検出されていません。

Y軸は②の時に90の値、④の時にー90の値を検出しています。①と③の時の値はほぼ0です。LazuriteFlyを手首につけて手をあげる動作は、X軸を中心にしてY軸を傾けていることになるので、Y軸がどれくらいの値を検出したらモーターが回るというプログラムをつくっていきます。

Z軸も同じく傾きを検出していますが、Y軸のほうがわかりやすいので、Y軸の傾きだけをみていきます。

29

 

その2:振ったら、モーターが回る

26

Lazurite Flyを持って振ってみると、加速度センサーによって振動を検出し、モーターが回るというデモ機です。

振動をグラフでみてみよう姫22

[c]
void setup() {
byte rc;

Serial.begin(115200);

Wire.begin();

rc = kxg03.init(KXG03_DEVICE_ADDRESS_4E);
rc = bm1422.init(0);
rc = bm1383.init(0);
}

float mag,x,y,z;

void loop() {
byte rc;
int i;

static float val[11];
float x2,y2,z2;

rc = kxg03.get_val(&val[0]);
x2 = val[3]*val[3];
y2 = val[4]*val[4];
z2 = val[5]*val[5];

mag = sqrt(x2+y2+z2);
mag = abs(mag-1); // 重力の1Gを引いて動いた力だけを取り出しています。
x = atan(val[3]/sqrt(y2+z2))*180/PI;
y = atan(val[4]/sqrt(z2+x2))*180/PI;
z = atan(val[5]/sqrt(x2+y2))*180/PI;

Serial.print("STX,");
Serial.print_double((double)mag, 2); // Acc(x)
Serial.print(",");
Serial.print_double((double)x, 2); // Acc(x)
Serial.print(",");
Serial.print_double((double)y, 2); // Acc(y)
Serial.print(",");
Serial.print_double((double)z, 2); // Acc(z)

Serial.println(",ETX");

delay(100);
}

[/c]

 

33

グラフをみると、振った時に値が検出され、振っていない時の値は0です。なので、0以外の値を検出したら手を振った事になる事がわかりました。

今回は、手をあげる・振るという動作をLazuriteGraphで確認できました。検出した値を送信して、モーターをまわす工程は、また次回以降にお知らせできたら、と思っています♪