Arduinoと戯れてみる!

Arduino 入門 Lesson 31 【6軸モーションセンサ編 その1】

arduino-lesson31-00Arduino入門編
スポンサーリンク
子供と一緒に始める マイコンプログラム
Arduino 入門
Lesson 31
【6軸モーションセンサ編 その1】

「Arduino」を使ったマイコンプログラミングを子供と一緒に学習するブログ。

少しずつ、子供と一緒に楽しみながら気長にアップしてく予定です。

 

本記事はLesson 31 【6軸モーションセンサ編 その1】です。

本Lessonで使用する「6軸モーションセンサ」はMPU-6050 使用の3軸ジャイロスコープ・3軸加速度センサ モジュールとなります。

ボード型番は「GY-521」。

移動方向、向き、回転を検出することができるセンサです。

 

6軸とは「3軸加速度+3軸ジャイロ(角速度)」のこと。

前後、左右、上下の3方向を検出できる加速度センサ。

回転の速さを検出できるジャイロセンサ。

上記の2つを組み合わせることで6軸センサを実現しています。

 

モーションセンサは回転していることを検知する、向きの変化を検知する。

といったことが可能なことから、小型ビデオ、カメラの手振れ補正、ゲーム等のモーションセンシングなど色々な用途で使われています。

 

本Lessonでは安価なMPU-6050(GY-521)の6軸モーションセンサを使用します。

 

学習、遊び、試行用途であれば、お手頃な値段。

Amazon購入の場合、複数個購入しても1000円以下で購入可能です。

 

Arduino入門編の解説にて使用しているArduinoは互換品です。

互換品とは言え、Arduinoはオープンソースであり複製して販売するのもライセンス的に問題なし。

そのため互換品の品質も悪くなく、それでいて値段は安いです。

正規品本体の値段程度で豊富な部品が多数ついています。

 

正規品の本体単品がほしい方はこちらとなります。

 

スポンサーリンク

はじめに

まず、加速度、角速度をWikipediaで確認。

Wikipedia 加速度
加速度(かそくど、英: acceleration)は、単位時間当たりの速度の変化率。速度ベクトルの時間的な変化を示すベクトルとして加速度が定義される[1]

Wikipedia 角速度
運動学において、角速度(かくそくど、英: angular velocity)は、ある点をまわる回転運動の速度を、単位時間に進む角度によって表わした物理量である。言い換えれば角速度とは、原点と物体を結ぶ線分、すなわち動径が向く角度の時間変化量である。特に等速円運動する物体の角速度は、物体の速度を円の半径で割ったものとして与えられる[1]。従って角速度の量の次元[注 1]は、通常の並進運動の速度とは異なり[注 2]、時間の逆数 T−1 となる。

これ読んでもよくわかりませんよね・・・。

 

といっても、これを学術的に説明するには難をようするので簡単に一言だけ・・・。

加速度センサ:単位時間当たりにおける速度変化を検知
角速度センサ:基準軸に対して単位時間あたり角度が何度変化しているかを検知

程度の理解で遊ぶことは可能です。

本Lessonは、Arduinoでセンサから検知したデータを取り出すということになります。

 

検出するセンサの原理はネットを検索すると、でてきます。

興味のあるかたは検索してみてください。

 

Lesson 31 目標

本Lessonの目標は以下です。

MPU-6050(GY-521)の3軸ジャイロスコープ・3軸加速度センサ モジュールで遊ぶ。

本Lessonは、まずは遊ぶことを目的とします。

 

内容の理解は後回し、まずはスケッチ描いて、遊んで、こんなデータが出てくるんだというところが目的。

モーションセンサ編に関しては、何回かにLessonを分けて学習していきます。

 

本Lessonのスケッチは下記サイトを参考にしています。

 

準備

ではLessonの準備に取り掛かりましょう。

部品は「MPU-6050(GY-521)の3軸ジャイロスコープ・3軸加速度センサ モジュール」のみ。

接続は簡単です。

 

必要なもの

MPU-6050を使用したモジュールを数個必要な方は複数個品もあります。

 

Jumper wireは今後も頻繁に利用します。

Jumper wireはできれば、「オス-メス オス-オス メス –メス」の3種類を揃えておくことをお勧めします。

 

使用部品説明

MPU-6050 使用 3軸ジャイロスコープ・3軸加速度センサー モジュールについて説明していきます。

MPU-6050のデータシートは以下のサイトで閲覧可能です。

https://www.invensense.com/products/motion-tracking/6-axis/mpu-6050/

 

GY-521基板(モジュール)のデーターシートは見つけることができません。

しょうがありませんので、実装されている部品等々から判断することとします。

 

MPU-6050 GY-521基板 実物写真

下の写真が、GY-521基板の実物写真です。

型名:GY-521

ピンヘッダが2種類付属しています。

半田付けが必要。

arduino-lesson31-01

 

こちらが半田付け後の状態。

ブレッドボードに挿して使いたいため、モジュールの下にピンが出るように半田付けします。

arduino-lesson31-02

 

ちなみに、下記を購入された方は梱包されていますので半田付け不要です。

最終スタータキット、電子部品が多く学習、試行におすすめです

ELEGOO Arduino用UNO R3 最終版スタータキット UNOチュートリアル付 (63 Items)

 

MPU6050 GY-521基板 回路図

下記に基板の回路図がありました。

https://playground.arduino.cc/uploads/Main/MPU6050-V1-SCH/index.jpg

 

基板の回路図と照らし合わせて基板に実装されている部品を吟味します。

arduino-lesson31-03

 

上記の回路図ではSDA,SCLが4.7kΩでプルアップされています。

しかし、GY-521基板に乗っているプルアップ抵抗は222と記載されています。

GY-521基板のプルアップ抵抗は2.2kΩが正しいと考えます。

SCL、SDAにLowレベルを入れると単純計算で以下の電流が流れます。

3.3V ÷ 2.2kΩ = 1.5mA

ちょっとプルアップ抵抗小さくないか?と管理人は感じます。

遊びで使う程度であれば、まあ良いですが。。。

 

また、回路図中で注目して置く箇所が1か所あります。

それはAD0のピンです。

AD0が4.7kΩでプルダウンされていることも覚えておいてください。

AD0端子によって、I2C通信用のアドレスを設定する必要があるためです。

 

また、データシートからMPU-6050の電源は3.3Vであることがわかります。

回路図を見るとGY-521の基板には3.3VのLDO(リニアレギュレータ)が搭載されています。

プルアップ抵抗、MPU-6050の電源ともに、LDOの出力に繋がっています

基板上に実装されているLDOを確認すると4A2Dと記載されています。

調べた限りではGY-521に与えるVCC電圧はArduinoの5V電源に接続しても降圧されるため問題なさそうです。

 

しかし、ここで一点問題が・・・。

MPU-6050の入力ピンにArduinoから信号を与えると5Vを与えることになってしまいます。

入力仕様は3.3Vと考えると5V与えていいのか?となります。

MPU-6050のデータシートを確認すると絶対最大定格がVDD+0.5Vとなっています。

VDDの絶対最大定格が6Vのため、5Vかけても壊れることはなさそうです。

レベル変換回路を間に挟んだ方が良さそうですが、面倒なので壊れないだろうということで挟まずに行きます。

 

GY-521のデーターシートそのものを見つけることが難しいため、基板に実装されている部品の型番などで入力仕様を確認する必要があります・・・。

すでに、この辺の解読で少々疲れ気味の管理人です・・・。

 

MPU6050 GY-521基板 仕様

特徴としては以下が挙げられます。

  • 3軸加速度センサー、3軸ジャイロセンサー、温度計が内蔵
  • 通信方式はI2C
  • XDA/XCLピンを使用して外部のI2Cデバイスを操作可能
  • FIFOバッファを搭載しているためデータを溜めて読み出すことが可能
  • FIFOバッファが満杯になったり、Data Readyの場合にINTピンを使ってマイコンへ割り込みを伝えることが可能
  • Digitalのローパスフィルターを使用可能

などなど、機能が豊富です。

 

温度計が内蔵されているのは、温度によって補正をかけるためと考えます。

I2C通信に関しては、以下で解説していますので合わせてご確認ください。

 

詳細はデータシートをご確認ください。

https://www.invensense.com/products/motion-tracking/6-axis/mpu-6050/

 

データシートと突き合せた、動作説明は次回のLessonで予定しています。

 

実践 回路作成とコード作成

最初に回路図を確認してください。

次に、回路図に合わせて部品を接続します。

最後にコードを書いて、6軸モーションセンサを動かしていきましょう。

 

Arduinoのピン配置を確認したい方は番外編02を参照してください。

 

回路図

GY-521基板に接続していきます。

ArduinoはI2Cピンである、SCL、SDA及び5VとGNDを使用。

SCL(Arduino)   ⇒ SCL(GY-521基板)
SDA(Arduino)   ⇒ SDA(GY-521基板)
5V(Arduino)     ⇒ VCC(GY-521基板)
GND(Arduino)   ⇒ GND(GY-521基板)

 

回路図とブレッドボードで結線が違うように見えますが、どちらに接続してもArduino内で繋がっていますので同じとなります。

回路図がこちら。

arduino-lesson31-04

 

こちらがブレッドボード図。

arduino-lesson31-05

 

回路図は「fritzing」を利用しています。

「fritzing」の使い方は下記を参照してください。

 

接続

下図に示すように、用意した部品を使用して接続しましょう。

部品は「MPU-6050 使用 3軸ジャイロスコープ・3軸加速度センサー モジュール」となります。

部品は1個、接続は簡単です。

 

使用するポートは、SCL、SDA及び5VとGNDを使用。

穴に挿入しづらいときは、ラジオペンチなどを使用してください。

arduino-lesson31-08

 

 

コードの書き込み

接続が終わったら、USBケーブルを使用してUNOにプログラムを書き込んで行きましょう。

コードを書き終えたら、いつでも利用できるように「ファイル」⇒「名前を付けて保存」で保存しておきましょう。

 

本LessonではI2C通信をするため、ライブラリ「Wire.h」を使用します。

このライブラリは標準ライブラリです。

IDEに標準搭載されていますので、そのまま使用できるはずです。

 

使用できない場合は、下記を参照して使えるようにしておきましょう。

 

コマンド説明

本Lessonでは、「Wire.h」のライブラリを使用します。

このライブラリのコマンドについて解説します。

コマンド内容
Wire.begin(address)Wireライブラリの初期化。
addres:7bitスレーブアドレス、省略時はマスタとしてバスに接続
戻り値:なし
Wire.requestForm(address,count)マスターがスレーブデバイスにデータを要求。
Wire.beginTransmission(address)指定したアドレスのI2Cスレーブに対して送信処理開始。
address:送信対象のアドレス(7bit)
戻り値:なし
Wire.endTransmission()スレーブデバイスに対する送信完了。
パラメータ:
true:stopをリクエストのあと送信しI2Cバス開放
false:restartリクエストのあと送信し接続維持
Wire.write(パラメータ)リクエストに応じてデータを送信。
beginTransmission()とendTransmission()の間で実行。
パラメータ:
value:送信する1byteのデータ(byte)
string:文字列(char *)
data:配列(byte *)
length:送信するbyte数(byte)
戻り値:送信したbyte数
Wire.available()read()で読み取ることができるbyte数を返す。
戻り値:なし
Wire.read()データの読み取り。
戻り値:受信データ(byte)

 

サンプルコード

サンプルコードは以下のサイトを参考にしています。

Arduino Playground - MPU-6050

 

本Lessonでは、上記のサンプルコードを参考にわかりやすくするために簡潔にしました。

本来は、「ずれ、ノイズなど対策」のため、オフセット調整、ノイズの除去、フィルターの設定などします。

本Lessonのスケッチはデータ取得のみ目的にしています。

オフセット調整、フィルター設定などは次回以降のLessonで追加していきます。

補足
シリアルプロッタに温度を表示しないようにしたいため、温度はコメントアウトしています。

 

こちらが簡略化したサンプルスケッチ。

データシートとにらめっこしながら格闘しました・・・。

//Lesson 31-1 6軸モーションセンサ
//3軸ジャイロスコープ・3軸加速度センサ モジュール
//ジャイロセンサで検知したデータをシリアルモニタに表示
//https://omoroya.com/

// 電子部品
// MPU-0650使用のGY-521基板

//ライブラリインクルード
#include <Wire.h>

void setup() {
  Serial.begin(115200); //シリアル通信のデータ転送レートを設定しポート開放
  Serial.println("--- Started ---");
  
  Wire.begin();         //I2C通信開始
  // センサ開始動作
  Wire.beginTransmission(0x68); //アドレス0x68指定でMPU-6050を選択、送信処理開始
  Wire.write(0x6B);             //MPU6050_PWR_MGMT_1レジスタのアドレス指定
  Wire.write(0x00);             //0を書き込むことでセンサ動作開始
  Wire.endTransmission();       //スレーブデバイスに対する送信を完了
  
}

void loop() {
  // スタートアドレスの設定とデータの要求処理
  Wire.beginTransmission(0x68);     //アドレス0x68指定でMPU-6050を選択、送信処理開始
  Wire.write(0x3B);                 //ACCEL_XOUT_Hレジスタのアドレス指定
  Wire.endTransmission(false);      //false設定で接続維持
  Wire.requestFrom(0x68, 14, true); //MPU-6050に対して14byte分データを要求、I2Cバス開放
  
  int16_t ax, ay, az, gx, gy, gz, Temp; //符号付き整数を格納する16ビットの変数型の設定

  //シフト演算と論理和で16bitのデータを変数に格納
  //ax~gzまで、16bit(2byte) × 7 = 14byte
  ax = Wire.read() << 8 | Wire.read();    //x軸の加速度の読み取り 16bit
  ay = Wire.read() << 8 | Wire.read();    //y軸の加速度の読み取り 16bit
  az = Wire.read() << 8 | Wire.read();    //z軸の加速度の読み取り 16bit
  Temp  = Wire.read() << 8 | Wire.read(); //温度の読み取り 16bit
  gx = Wire.read() << 8 | Wire.read();    //x軸の角速度の読み取り 16bit
  gy = Wire.read() << 8 | Wire.read();    //y軸の角速度の読み取り 16bit
  gz = Wire.read() << 8 | Wire.read();    //z軸の角速度の読み取り 16bit

  //データの表示 1LSBの値はデータシートに記載
  //AFS_SEL設定 = 0, ±2g, 16384LSB/g
  //FS_SEL設定  = 0, ±250deg/s, 131LSB/deg/s 
  Serial.print(ax/16384.0); Serial.print(" g,  ");     //1LSBを加速度(G)に換算してシリアルモニタに表示
  Serial.print(ay/16384.0); Serial.print(" g,  ");     //1LSBを加速度(G)に換算してシリアルモニタに表示
  Serial.print(az/16384.0); Serial.print(" g,  ");     //1LSBを加速度(G)に換算してシリアルモニタに表示
  Serial.print(gx/131.0); Serial.print(" deg/s,  ");   //1LSBを角速度(deg/s)に換算してシリアルモニタに表示
  Serial.print(gy/131.0); Serial.print(" deg/s,  ");   //1LSBを角速度(deg/s)に換算してシリアルモニタに表示
  Serial.print(gz/131.0); Serial.println(" deg/s,  "); //1LSBを角速度(deg/s)に換算してシリアルモニタに表示
  //Serial.print(Temp/340.00+36.53); Serial.println(" deg.");    //温度換算シリアルモニタに表示

  delay(20);
}

 

動作確認1 シリアルモニタ

では、さっそく動作を確認していきます。

「ツール」⇒「シリアルモニタ」を開いて、「115200bps」に設定してください。

下記の表な表示がでれば、読み取りできていることになります。

arduino-lesson31-06

 

動作確認2 シリアルプロッタ

シリアルプロッタでも確認することができます。

「ツール」⇒「シリアルプロッタ」を開いてセンサを傾けてみてください。

シリアルプロッタでは直感的に傾くのがわかります。

arduino-lesson31-07

 

まとめ

本Lessonは、まず触ってみるということで以下を目標としました。

MPU-6050(GY-521)の3軸ジャイロスコープ・3軸加速度センサ モジュールで遊ぶ。

 

モーションセンサも応用すれば色々なことができそうです。

 

Lesson 31 【6軸モーションセンサ編 その1】 はここまで。

本Lessonはでは、まず動かして検知したデータを読み取ってみました。

疑問点、質問などありましたら気軽にコメントください。

 

次回、Lesson 32は【6軸モーションセンサ編 その2】 です。

次回のLessonは、スケッチとレジスタマップを突き合せた解説です。

Arduino 入門 Lesson 32 【6軸モーションセンサ編 その2】
Lesson 31では、とりあえず動かしデータを取得して遊びました。そのため、スケッチの記述内容がなんでそうなるのか?という説明は省略しています。本Lessonでは、スケッチ内で設定しているMPU-6050のレジスタについてレジスタマップと…

 

より深く、MPU-6050「3軸ジャイロスコープ・3軸加速度センサ」を理解していきましょう!

 

最後に

疑問点、質問などありましたら気軽にコメントください。

この電子部品の解説をしてほしい!などなどなんでもOKです。

リンク切れ、間違いなどあればコメントいただけると助かります。

 

Arduino入門編、番外編、お役立ち情報などなどサイトマップで記事一覧をぜひご確認ください。

 

Arduino入門編で使用しているUNOはAmazonにて購入可能です。

互換品とは言え、Arduinoはオープンソース。

複製して販売するのもライセンス的に問題なし。

 

そのため互換品の品質も悪くなく、それでいて値段は安いです。

正規品本体の値段程度で豊富な部品が多数ついています。

 

学習用、遊び用、お試し用には安価な互換品がおすすめです。

 

 

上記のものでも十分に多数の部品が入っていますが、最初からもっと多数の部品が入っているこちらもお勧めです。

 

Amazonでお得に買う方法

Amazonでお得に購入するなら、Amazonギフト券がおすすめです。

現金でチャージするたびに、チャージ額に応じたポイントが付与されます。

最大2.5%!!!(Amazonプライム会員ならさらにお得)

チャージ額(一回分)一般プライム会員
5,000円~19,999円0.5%1.0%
2,0000円~39,999円1.0%1.5%
40,000円~89,999円1.5%2.0%
90,000円~2.0%2.5%

さらに、初回チャージで1000ポイントもらえるキャンペーンも実施中!

\Amazonギフト券 1000ポイントキャンペーン/
Amazonチャージ 初回購入で1000ポイントキャンペーン

 

補足情報
コンビニ・ATM・ネットバンクが対象
購入は1円単位で可能

コメント

タイトルとURLをコピーしました