加速度センサを用いたプログラムは
Arduinoの動かせ方入門をコピペから改造。
とりあえず基本的なものを貼り付けておく。
---------------------------------------------------------------------
void setup()
{
// シリアルモニターの初期化をする
Serial.begin(9600) ;
}
void loop()
{
int i ;
long x , y , z ;
// 各データを100回読込んで平均化する
x = y = z = 0 ;
for (i=0 ; i < 100 ; i++) { //>←html回避。
x = x + analogRead(3) ; // X軸を読込む
y = y + analogRead(4) ; // Y軸を読込む
z = z + analogRead(5) ; // Z軸を読込む
}
x = x / 100 ;
y = y / 100 ;
z = z / 100 ;
// 読み込んだ各軸をそのまま表示する
Serial.print("X:") ;
Serial.print(x) ; // X軸
Serial.print(" Y:") ;
Serial.print(y) ; // Y軸
Serial.print(" Z:") ;
Serial.println(z) ; // Z軸
delay(500) ;
}
---------------------------------------------------------------------
で、Z軸は必要なかったので無くします。
立ち上がったところがX=0 Y=0になるようので?
現在の角度を合成角度として値を出して使用します。
結果
3.3は電圧がMAX3.3Vなので。
---------------------------------------------------------------------
for (i = 0 ; i < 5 ; i++) { //>
float x = (analogRead(0) / 1024.0) * 3.3 * 1000 ; // X軸を読込む
float y = (analogRead(1) / 1024.0) * 3.3 * 1000 ; // Y軸を読込む
float z = (analogRead(2) / 1024.0) * 3.3 * 1000 ; // Z軸を読込む
// 電源電圧3.3V時のオフセット電圧(0G = 1.65V = 1650mV)←買った取説に書いてある。
float offset_voltage = 1650.0;
// XYZからオフセット電圧を引いた電圧を求める
x = x - offset_voltage;
y = y - offset_voltage;
z = z - offset_voltage;
// XYZから電圧Vを求める
//1gあたりの出力振幅 660mV=0.66Vの数値が1Gとなる。
float xg = x / 1000.0 / 0.66;
float yg = y / 1000.0 / 0.66;
float zg = z / 1000.0 / 0.66;
// 角度を計算して表示を行う
//https://qiita.com/NaotakaSaito/items/a8186ad41d1844408eca
//Θx = atan(x /√(y^2+z^2)) * 180 / 3.14
//二乗の書き方がわからなかったから・・・
x = atan(xg / sqrt ((yg * yg + zg * zg)) ) / 3.14159 * 180.0 ;//X角度
//Serial.print("X角度=") ;
//Serial.print(x) ; // X軸方向角度表示
//Serial.print(" Y角度=") ;
//Θy = atan(y /√(x^2+z^2)) * 180 / 3.14
y = atan(yg / sqrt ((xg * xg + zg * zg))) / 3.14159 * 180.0 ; //Y角度
//a = atan2(yg, zg - 0.66) / 3.14159 * 180.0 ;
//Serial.println(y) ; // Y軸方向角度表示
//出力する
//角度によって速度を変える。計算式は適当
x = abs(x); //絶対値
y = abs(y); //絶対値
z = sqrt((0 - x) * (0 - x) + (0 - y) * (0 - y));//距離を利用
def = z;//基準値とする。
}
---------------------------------------------------------------------
defの値が合成角度となる。これを使って制御を行います。
ついでに、上記の角度の取得は初期値の状態の傾きを
取得するためのプログラムです。
オフセット電圧は、KXR94-2050の取説を参照する。
ずっと動かしてるのもあれだったので
60秒経ったら止まるようにもプログラムしてました。
タイマーはArduinoボードがプログラムの実行を
開始した時から現在までの時間をミリ秒単位で返す
millis()
を利用。
time = millis() / 1000; //タイマー
まずは、起き上がるまでのソレノイドONのタイミングを決めましょうか。
共振よりも連打のほうが、なぜか揺れが大きくなるので
初期値は50ms(ミリ秒)で動かします。
初期角度と実行中の測定角度の差を算出し
マイナスになったらソレノイドを動かさない。
プラスのときのみ連打させます。
しかし、なかなか揺れが大きくならず
指でちょっと押すと大きくなっていく。
うーん。
タイミングを50msからずらしたりしますが改善しない。
やりおるな!
何回も試して、絶望し眺望していると
タイムアップした際に一瞬だけ大きく揺れた・・・
!!
まさかと思って、
傾きが3度より小さいとき、連打を300msとめるプログラムを追加。
ssが傾きの差
skは、どうやら測定値が3度より小さい値が
8回ループしたときの次を実行するカウンターだった。
(書いていたことを忘れてた・・・)
if (ss < 3) {
sk = sk + 1;
if (sk >= 8) {
delay(300);
digitalWrite(6, LOW);//OFF
sk = 0;
}
}
コレにより、揺れを大きくする
キッカケを生み出すことができた!!!
まだつづく。