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はオープンソースであり複製して販売するのもライセンス的に問題なし。
そのため互換品の品質も悪くなく、それでいて値段は安いです。
正規品本体の値段程度で豊富な部品が多数ついています。
正規品(Arduino UNO R3)の本体単品がほしい方はこちらとなります。
Arduino入門編2では「Arduino UNO R4 Minima」「Arduino UNO R4 WIFI」にて遊ぶため今のところは正規品を使用。(まだ互換品が・・・ほぼない)
はじめに
まず、加速度、角速度をWikipediaで確認。
Wikipedia 加速度
加速度(かそくど、英: acceleration)は、単位時間当たりの速度の変化率。速度ベクトルの時間的な変化を示すベクトルとして加速度が定義される[1]。Wikipedia 角速度
運動学において、角速度(かくそくど、英: angular velocity)は、ある点をまわる回転運動の速度を、単位時間に進む角度によって表わした物理量である。言い換えれば角速度とは、原点と物体を結ぶ線分、すなわち動径が向く角度の時間変化量である。特に等速円運動する物体の角速度は、物体の速度を円の半径で割ったものとして与えられる[1]。従って角速度の量の次元[注 1]は、通常の並進運動の速度とは異なり[注 2]、時間の逆数 T−1 となる。
これ読んでもよくわかりませんよね・・・。
といっても、これを学術的に説明するには難をようするので簡単に一言だけ・・・。
程度の理解で遊ぶことは可能です。
本Lessonは、Arduinoでセンサから検知したデータを取り出すということになります。
検出するセンサの原理はネットを検索すると、でてきます。
興味のあるかたは検索してみてください。
Lesson 31 目標
本Lessonの目標は以下です。
本Lessonは、まずは遊ぶことを目的とします。
内容の理解は後回し、まずはスケッチ描いて、遊んで、こんなデータが出てくるんだというところが目的。
モーションセンサ編に関しては、何回かにLessonを分けて学習していきます。
本Lessonのスケッチは下記サイトを参考にしています。
準備
ではLessonの準備に取り掛かりましょう。
部品は「MPU-6050(GY-521)の3軸ジャイロスコープ・3軸加速度センサ モジュール」のみ。
接続は簡単です。
必要なもの
- USB接続用のPC(IDE統合環境がインストールされたPC)
→管理人が勝手に比較したBTOメーカーを紹介しています。 - UNO R3(以下UNO)、おすすめUNO互換品(ELEGOO)
- PCとUNOを接続するUSBケーブル
- ブレッドボード安価(大)、ブレッドボード安価(中)
※おすすめブレッドボード(大)、おすすめブレッドボード(中) - MPU-6050 使用 3軸ジャイロスコープ・3軸加速度センサー モジュール
MPU-6050を使用したモジュールを数個必要な方は複数個品もあります。
Jumper wire、抵抗は今後も頻繁に利用します。
Jumper wireはできれば、「オス-メス オス-オス メス –メス」の3種類を揃えておくことをお勧めします。
短めが使いやすい場合も。
抵抗も単品で揃えるよりはセットをおすすめします。
抵抗、LEDなどを個別でセット品を購入しても、そんなに使わない!
という方は、「電子工作基本部品セット」が使い勝手が良い。
使用部品説明
MPU-6050 使用 3軸ジャイロスコープ・3軸加速度センサー モジュールについて説明していきます。
MPU-6050のデータシートは以下のサイトで閲覧可能です。
GY-521基板(モジュール)のデーターシートは見つけることができません。
しょうがありませんので、実装されている部品等々から判断することとします。
MPU-6050 GY-521基板 実物写真
下の写真が、GY-521基板の実物写真です。
型名:GY-521
ピンヘッダが2種類付属しています。
半田付けが必要。
こちらが半田付け後の状態。
ブレッドボードに挿して使いたいため、モジュールの下にピンが出るように半田付けします。
ちなみに、下記を購入された方は梱包されていますので半田付け不要です。
最終スタータキット、電子部品が多く学習、試行におすすめです。
ELEGOO Arduino用UNO R3 最終版スタータキット UNOチュートリアル付 (63 Items)
MPU6050 GY-521基板 回路図
下記に基板の回路図がありました。
https://playground.arduino.cc/uploads/Main/MPU6050-V1-SCH/index.jpg
基板の回路図と照らし合わせて基板に実装されている部品を吟味します。
上記の回路図ではSDA,SCLが4.7kΩでプルアップされています。
しかし、GY-521基板に乗っているプルアップ抵抗は222と記載されています。
GY-521基板のプルアップ抵抗は2.2kΩが正しいと考えます。
SCL、SDAにLowレベルを入れると単純計算で以下の電流が流れます。
ちょっとプルアップ抵抗小さくないか?と管理人は感じます。
遊びで使う程度であれば、まあ良いですが。。。
また、回路図中で注目して置く箇所が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かけても壊れることはなさそうです。
レベル変換回路を間に挟んだ方が良さそうですが、面倒なので壊れないだろうということで挟まずに行きます。
すでに、この辺の解読で少々疲れ気味の管理人です・・・。
MPU6050 GY-521基板 仕様
特徴としては以下が挙げられます。
- 3軸加速度センサー、3軸ジャイロセンサー、温度計が内蔵
- 通信方式はI2C
- XDA/XCLピンを使用して外部のI2Cデバイスを操作可能
- FIFOバッファを搭載しているためデータを溜めて読み出すことが可能
- FIFOバッファが満杯になったり、Data Readyの場合にINTピンを使ってマイコンへ割り込みを伝えることが可能
- Digitalのローパスフィルターを使用可能
などなど、機能が豊富です。
温度計が内蔵されているのは、温度によって補正をかけるためと考えます。
I2C通信に関しては、以下で解説していますので合わせてご確認ください。
詳細はデータシートをご確認ください。
データシートと突き合せた、動作説明は次回の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基板)
回路図がこちら。
こちらがブレッドボード図。
回路図は「fritzing」を利用しています。
「fritzing」の使い方は下記を参照してください。
接続
下図に示すように、用意した部品を使用して接続しましょう。
部品は「MPU-6050 使用 3軸ジャイロスコープ・3軸加速度センサー モジュール」となります。
部品は1個、接続は簡単です。
使用するポートは、SCL、SDA及び5VとGNDを使用。
穴に挿入しづらいときは、ラジオペンチなどを使用してください。
コードの書き込み
接続が終わったら、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) |
サンプルコード
サンプルコードは以下のサイトを参考にしています。
本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」に設定してください。
下記の表な表示がでれば、読み取りできていることになります。
動作確認2 シリアルプロッタ
シリアルプロッタでも確認することができます。
「ツール」⇒「シリアルプロッタ」を開いてセンサを傾けてみてください。
シリアルプロッタでは直感的に傾くのがわかります。
まとめ
本Lessonは、まず触ってみるということで以下を目標としました。
モーションセンサも応用すれば色々なことができそうです。
Lesson 31 【6軸モーションセンサ編 その1】 はここまで。
本Lessonはでは、まず動かして検知したデータを読み取ってみました。
疑問点、質問などありましたら気軽にコメントください。
次回、Lesson 32は【6軸モーションセンサ編 その2】 です。
次回のLessonは、スケッチとレジスタマップを突き合せた解説です。
より深く、MPU-6050「3軸ジャイロスコープ・3軸加速度センサ」を理解していきましょう!
最後に
疑問点、質問などありましたら気軽にコメントください。
この電子部品の解説をしてほしい!などなどなんでもOKです。
リンク切れ、間違いなどあればコメントいただけると助かります。
Arduino入門編、番外編、お役立ち情報などなどサイトマップで記事一覧をぜひご確認ください。
Arduino入門編、Arduino入門編2で使用しているUNOはAmazonにて購入可能です。
Arduino入門編では互換品を使用。
Arduinoはオープンソース。
複製して販売するのもライセンス的に問題なし。
そのため互換品の品質も悪くなく、それでいて値段は安いです。
正規品本体の値段程度で豊富な部品が多数ついています。
学習用、遊び用、お試し用には安価な互換品がおすすめです。
ELEGOO UNO キット レベルアップ チュートリアル付 uno mega2560 r3 nanoと互換 Arduino用
上記のものでも十分に多数の部品が入っていますが、最初からもっと多数の部品が入っているこちらもお勧めです。
Arduino入門編2では「Arduino UNO R4 Minima」「Arduino UNO R4 WIFI」にて遊ぶため今のところは正規品を使用。(まだ互換品が・・・ほぼない)
Amazonでお得に買う方法
Amazonでお得に購入するならAmazon Mastercard、Amazonギフト券がおすすめです。
時期により異なりますが、様々なキャンペーンを実施しています。
\Amazonギフト券/
Amazonギフトカード キャンペーン
\Amazon Mastercard お申込み/
Amazon Mastercard 申し込み
いずれの場合もプライム会員である方がお得!!
\Amazon Prime 30日間の無料会員を試す/
無料会員登録
コメント
いつも参考にさせて頂いております。
加速度の取得範囲を±2gから、±16gにする方法を教えて頂きたいです。
コメントありがとうございます。
コメント遅くなりすみません。
Lesson 32、【6軸モーションセンサ編 その2】を一読いただければわかるかと思います。
ACCEL_CONFIGのBIT4とBIT3をそれぞれ、1、1に設定してください。
計算は2048LSB/gとなります。
ありがとうございます!