こんにちは。星野です。

今日は、IMUユニットとカメラマウントのサーボモーターを組み合わせていこうと思います。

前回IMUユニットから取得した姿勢データを元に、カメラマウントを動かします。

用意するもの

・機体

・Atom Motion キット

・IMUユニット

・梱包材

・セロハンテープ

・パソコン

IMUユニットの固定位置の変更

前回の投稿で、カメラマウントの上にIMUユニットを固定しましたが、固定場所を変更をします。

Y軸が機体の正面を向くように、機体の底面に固定します。

固定する位置が変わるだけなので、各軸の向きは変わりません。

カメラマウントとIMUユニットを組み合わせる

①3つのサーボモーターとIMUユニットを接続します。

※接続方法は過去の投稿を参照してください。

②Atom Motionキットを梱包材で包みます。

IMUユニットのケーブルとサーボモータのケーブルを梱包材の隙間から出し、サーボモーターのケーブル側にAtom Motionキットの電源スイッチがくるようにし、梱包材をセロハンテープでとめます。

Atom Motionキットを梱包材で包み終わったら、サーボモーターのケーブルが上向きになるように、機体に入れます。

③プログラムを書き込みます。

#include <M5Atom.h>
#include "AtomMotion.h"

AtomMotion Atom;

//---------IMUユニット-------------------------
float roll, pitch, yaw; //ロール、ピッチ、ヨーの値を格納する変数
int roll_servo, pitch_servo, yaw_servo; //サーボモーターの角度指定用変数


//---------サーボモーター------------------------
const int ch1 = 1;
const int ch2 = 2;
const int ch3 = 3;

void setup(){ 
  M5.begin(true, false, true);
  Serial.begin(115200);
  Atom.Init();
  M5.IMU.Init();
  M5.IMU.SetGyroFsr(M5.IMU.GFS_2000DPS); //ジャイロのレンジを設定    250,500,1000,2000DPSから選択可能
  M5.IMU.SetAccelFsr(M5.IMU.AFS_2G); //加速度のレンジを設定    2,4,8,16Gから選択可能
  
  Atom.SetServoAngle(ch1, 90);
  Atom.SetServoAngle(ch2, 90);
  Atom.SetServoAngle(ch3, 90);

  delay(1000);

}

void loop() {
  M5.IMU.getAhrsData(&pitch,&roll,&yaw);  //ロール、ピッチ、ヨーの値を取得

  //サーボモーターは180度以上動かせないので、角度指定する時に180度以上にならないようにする
  if(roll > 90){roll = 90;} 
  if(roll < -90){roll = -90;}
  if(pitch > 90){pitch = 90;}
  if(pitch < -90){pitch = -90;}
  if(yaw > 90){yaw = 90;}
  if(yaw < -90){yaw = -90;}

  //傾きに応じて、サーボモーターの角度を決める
  roll_servo = 90 - roll; 
  pitch_servo = 90 - pitch;
  yaw_servo = 90 - yaw;
  
  Atom.SetServoAngle(ch1, roll_servo);
  Atom.SetServoAngle(ch2, pitch_servo);
  Atom.SetServoAngle(ch3, yaw_servo);

  delay(25);
}

動作している様子

機体がまっすぐの状態から何度傾いているかを検出し、傾きに対して反対向きにサーボモーターを動かすようにしています。

おわりに

今日はIMUユニットとサーボモーターを組み合わせました。

次回はパラシュート制作をしていこうと思います。

次回の更新予定日10/17です。お楽しみに!