工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

IMU(6 DOF)モーションセンサーの使用を開始する

コンポーネントと消耗品

>
Arduino UNO
× 1
慣性計測ユニット(IMU)(6度の自由度)
× 1

このプロジェクトについて

今日は、利用可能な最高のIMU(Inertia Measurement Unit)センサーについて研究し、Arduinoとのインターフェース方法を確認します。次のチュートリアルの後半で、モーションセンシングを3Dで視覚化してみます。

使用するIMUセンサーモジュールは、MPU-6050センサーを中心にしています。

MPU-6050デバイスは、 3軸ジャイロスコープを組み合わせたものです および 3軸加速度計 オンボードの DigitalMotionProcessor™(DMP™)と一緒に同じシリコンダイ上に 、複雑な6軸MotionFusionアルゴリズムを処理します。

これらのMotionTrackingデバイスは、スマートフォン、タブレット、ウェアラブルセンサーの低電力、低コスト、高性能の要件に対応するように設計されています。

<図>

必要なもの:

ハードウェア:

1) Arduino UNO

2) MPU6050センサー

3)接続ワイヤ

<図>

ソフトウェア: Arduino IDE

通信プロトコル: このIMUセンサーは、I2Cバスプロトコルを使用してArduinoと通信します。

加速度計とジャイロスコープを別々に操作できますが、この組み合わせたモジュールほど正確ではありません。

<図>

それでは、配線図と接続プロファイルに移りましょう。

接続については、以下の2つの図のいずれかを参照してください。

<図> <図>

上記の数値で問題が発生した場合でも、慌てる必要はありません.....

以下の接続ピンプロファイルを確認してください:

5V [IMUMPU-6050]をVCC [ARDUINO]に接続します

SDA [IMU MPU-6050]をアナログIN(A4)[ARDUINO]

に接続します

SCL [IMUMPU-6050]をAnalogIN(A5)[ARDUINO]

に接続します

GND [IMUMPU-6050]をGND [ARDUINO]

に接続します

INTPIN [IMU MPU-6050]をピン2(デジタルPWMピン)[ARDUINO]

に接続します <図> <図>

ここで、MPU 6050モジュールに5Vピンがある場合は、それをarduinoの5Vピンに接続できます。それ以外の場合は、過電圧の問題を回避するために、3.3Vピンに接続する必要があります。

ハードウェアのセットアップが完了したので、Arduinoをプログラムします。

まず、MPU 6050をテストするには、このリンクをクリックして、MPU6050用のarduinoライブラリをダウンロードします。「MPU6050.zip」という名前のzipフォルダーがあります。フォルダをダウンロードして、その内容を抽出します。その後、ライブラリフォルダ「MPU6050」をコピーして、Arduinoのライブラリフォルダ内に貼り付けます。つまり、Arduinoの「libraries」フォルダが存在する場所に移動し、この「MPU6050」フォルダをその中に貼り付けるだけです。

次に、「I2Cdev.zip」という名前の別のライブラリをダウンロードして(以前にインストールされていない場合)、前のライブラリと同じ方法でArduinoのライブラリ内に貼り付ける必要があります。

これで、Arduinoの「libraries」フォルダーに2つの新しいエンティティができました。 (図:8)

<図>

次に、arduino IDEをクリックして、これらの新しいライブラリが表示されるかどうかを確認します(図(9)。

<図>

これらのライブラリをスケッチに含める前に、MPU6050のコードをフェッチする必要があります。図(10)を参照してください

(ファイル>例> MPU6050>例> MPU6050_DMP6)。この「MPU6050_DMP6」ファイルをクリックします。

<図>

次に、ライブラリ「I2Cdev」と「MPU6050」をこのスケッチに含めます[図(11)]。

<図>

すべての手順を実行した後、スケッチをコンパイルします[図(12)]。

<図>

さて、最後のステップは残っています...

このウィンドウの右下にあるメッセージに「Com1のArduino / Genuino Uno」と表示されている場合は、正しいかどうかを確認してください。そうでない場合は[図(14)]を参照してください。今はシリアルモニターをクリックしないでください。 [図(13)のように]スケッチをアップロードした後でのみ、次の手順に進みます。

Arduinoを接続するたびに、正しいポートが割り当てられていることを確認する必要があります。

<図>

この新しいウィンドウと混同しましたか?さて、それはあなたの出力画面です。技術的には、シリアルモニターと呼んでいます。ここで、さまざまなセンサーから値を読み取ります。

ステップ:ツール>シリアルモニターまたは、ショートカットキー(Ctrl + Shift + M)

<図>

正しいポートを選択したにもかかわらず、スケッチのアップロードで問題が発生した場合。このリンクをクリックします(Windowsユーザーの場合)。 Macユーザーの場合は、ガイドを参照してください。 Linuxユーザーは、ガイダンスについてこのWebページを参照してください。

<図>

コードをアップロードした後、シリアルモニターを開き、「ボーレート」を115200に変更します。他のボーレートを選択すると、同期されないため、ガベージコメントが表示されます。 注: Teensy @ 3.3vや3.3vで動作するArdunioPro Miniなどの8MHz以下のホストプロセッサは、ボーのタイミングがプロセッサティックとずれすぎているため、このボーレートを確実に処理できません。このような場合は38400以下を使用するか、UARTタイマーに何らかの外部の個別の水晶ソリューションを使用する必要があります。

画面に「InitializingI2Cdevices…」という文が表示されない場合は、RESETボタンを押してください。これで動作するはずです。 [図(15)]


KNOWLEDGECORNER>> 「DMPプログラミングとデモを開始するには、任意の文字を送信してください」という行が表示されます。DMPとは??

回答: DMPはDigitalMotionProcessingの略です 。 InvenseのMPU6050には、モーションプロセッサが組み込まれています。加速度計とジャイロスコープからの値を処理して、正確な3D値を提供します。つまり、ヨー、ピッチアンドロール。 [図(16)]


<図>

KNOWLEDGECORNER>> センサーとarduino間の通信はI2Cバスプロトコルに基づいていることがわかりました。同様に、このプロジェクトにはI2Cライブラリも含まれています。知っていますか、I2Cは何の略ですか?

回答: I2Cバスは、物理的に2本のアクティブワイヤとアース接続で構成されています。 SDA と呼ばれるアクティブワイヤ および SCL 、は両方とも双方向です。 SDAはシリアルDAtaラインであり、SCLはシリアルCLockラインです。バスに接続されているすべてのデバイスには、MCU、LCDドライバー、メモリ、ASICのいずれであっても、固有のアドレスがあります。これらのチップのそれぞれは、機能に応じて、受信機および/または送信機として機能することができます。明らかに、LCDドライバは受信機にすぎませんが、メモリまたはI / Oチップは送信機と受信機の両方になります。I2Cバスはマルチマスターバスです。これは、データ転送を開始できる複数のICを接続できることを意味します。 I2Cプロトコル仕様では、バス上でデータ転送を開始するICはバスマスターと見なされると規定されています。したがって、その時点では、他のすべてのICはバススレーブと見なされます。バスマスターは一般にマイクロコントローラーであるため、ここでは、たとえば、バスマスターはArduinoUnoです。同様に、MPUセンサーはバススレーブです。


次のチュートリアルでは、モーションを3Dで視覚化します。ここをクリック

<図>




コード

  • MPUセンサーのArduinoコード
MPUセンサーのArduinoコード Arduino
 * /// I2CdevとMPU6050をライブラリとしてインストールするか、両方のクラスの.cpp /.hファイル//をプロジェクトのインクルードパスに含める必要があります#include "I2Cdev.h" #include "MPU6050_6Axis_MotionApps20 .h "//#include" MPU6050.h "// MotionAppsインクルードファイルを使用する場合は不要// I2CdevでI2CDEV_ARDUINO_WIRE実装を使用する場合はArduinoワイヤーライブラリが必要//I2Cdev.h#if I2CDEV_IMPLEMENTATION ==I2CDEV_ARDUINO_WIRE #include" Wire .h "#endif //クラスのデフォルトI2Cアドレスは0x68 //特定のI2Cアドレスをここでパラメーターとして渡すことができます// AD0low =0x68(SparkFunブレークアウトおよびInvenSense評価ボードのデフォルト)// AD0 high =0x69MPU6050 mpu; / / MPU6050 mpu(0x69); // <-AD0highに使用/ * =========================================================================注:接続3.3v、GND、SDA、およびSCLに加えて、このスケッチは、Arduinoの外部割り込み#0ピンに接続されているMPU-6050のINTピンに依存しています。 ArduinoUnoおよびMega2560では、これはデジタルI / Oピン2です。* =========================================================================* // * =========================================================================注:Seonardoボードを搭載したArduino v1.0.1は、Serial.write(buf、len)を使用するとコンパイルエラーを生成します。 Teapot出力はこのメソッドを使用します。このソリューションでは、Arduino USBAPI.hファイルを変更する必要があります。これは幸いなことに単純ですが、煩わしいものです。これは、次のIDEリリースで修正される予定です。詳細については、次のリンクを参照してください。http://arduino.cc/forum/index.php/topic,109987.0.html http://code.google.com/p/arduino/issues/detail?id=958 * =========================================================================* /// [w、x、y、 z]フォーマット(処理などのリモートホストでの解析には最適ではありません)//#defineOUTPUT_READABLE_QUATERNION //来るクォータニオンから計算されたオイラー角//(度単位)を確認する場合は、「OUTPUT_READABLE_EULER」のコメントを解除しますFIFOから。//オイラー角はジンバルロックの影響を受けることに注意してください(詳細については、// http://en.wikipedia.org/wiki/Gimbal_lockを参照してください)//#defineOUTPUT_READABLE_EULER //必要に応じて、「OUTPUT_READABLE_YAWPITCHROLL」のコメントを解除しますFIFOから来るクォータニオンから計算されたヨー///ピッチ/ロール角度(度単位)を確認します。これには重力ベクトルの計算も必要であることに注意してください。//また、ヨー/ピッチ/ロール角度はジンバルロックの影響を受けることに注意してください(詳細については、http://en.wikipedia.org/wiki/Gimbal_lockを参照してください)#define OUTPUT_READABLE_YAWPITCHROLL / /加速度を確認したい場合は、「OUTPUT_READABLE_REALACCEL」のコメントを外します//重力を取り除いたコンポーネント。この加速度基準フレームは//方向が補正されていないため、重力の影響を受けずに、//センサーに従って+ Xは常に+ Xになります。加速度//方向の補正が必要な場合は、代わりにOUTPUT_READABLE_WORLDACCELを使用してください。この場合、磁力計//が存在しないため、初期方向を基準にしています)。 //#define OUTPUT_READABLE_WORLDACCEL // InvenSenseティーポットデモに使用される//形式と一致する出力が必要な場合は、「OUTPUT_TEAPOT」のコメントを解除します//#define OUTPUT_TEAPOT#define LED_PIN 13 //(Arduinoは13です、Teensyは11、Teensy ++は6)bool brightState =false; // MPU制御/ステータスvarsbooldmpReady =false; // DMPの初期化が成功した場合はtrueに設定しますuint8_tmpuIntStatus; // MPUuint8_tからの実際の割り込みステータスバイトを保持しますdevStatus; //各デバイス操作後にステータスを返します(0 =成功、!0 =エラー)uint16_t packetSize; //予想されるDMPパケットサイズ(デフォルトは42バイト)uint16_t fifoCount; //現在FIFOuint8_tにあるすべてのバイトのカウントfifoBuffer [64]; // FIFOストレージバッファ// orientation / motion varsQuaternion q; // [w、x、y、z]クォータニオンcontainerVectorInt16 aa; // [x、y、z]加速度センサーの測定値VectorInt16aaReal; // [x、y、z]重力のない加速度センサーの測定値VectorInt16aaWorld; // [x、y、z]ワールドフレーム加速度センサーの測定値VectorFloat重力; // [x、y、z]重力vectorfloat euler [3]; // [psi、theta、phi]オイラー角containerfloat ypr [3]; // [ヨー、ピッチ、ロール]ヨー/ピッチ/ロールコンテナと重力ベクトル// InvenSenseティーポットのパケット構造demuint8_tteapotPacket [14] ={'$'、0x02、0,0、0,0、0,0、 0,0、0x00、0x00、 '\ r'、 '\ n'}; // ================================================================// ===割り込み検出ルーチン===// ================================================================volatile bool mpuInterrupt =false; // MPU割り込みピンがハイになったのかどうかを示しますvoiddmpDataReady(){mpuInterrupt =true;} // ================================================================// ===初期設定===// ================================================================void setup(){// I2Cバスに参加します(I2Cdevライブラリはこれを自動的に行いません)#if I2CDEV_IMPLEMENTATION ==I2CDEV_ARDUINO_WIRE Wire.begin(); TWBR =24; // 400kHz I2Cクロック(CPUが8MHzの場合は200kHz)#elif I2CDEV_IMPLEMENTATION ==I2CDEV_BUILTIN_FASTWIRE Fastwire ::setup(400、true); #endif //シリアル通信を初期化します//(ティーポットデモ出力に必要なため115200を選択しましたが、プロジェクトによっては//実際にはあなた次第です)Serial.begin(115200); while(!Serial); // Leonardoの列挙を待ち、他のプロセッサはすぐに続行します//注:Teensy @ 3.3vやArdunioのような8MHz以下のホストプロセッサ//3.3vで動作するProMiniは、ボータイミングが原因で//このボーレートを確実に処理できませんプロセッサティックとの位置がずれすぎています。このような場合は// 38400以下を使用するか、UARTタイマーに//何らかの外部の個別の水晶ソリューションを使用する必要があります。 //デバイスを初期化しますSerial.println(F( "I2Cデバイスを初期化しています...")); mpu.initialize(); //接続を確認しますSerial.println(F( "デバイス接続をテストしています...")); Serial.println(mpu.testConnection()?F( "MPU6050接続に成功しました"):F( "MPU6050接続に失敗しました")); //準備が整うまで待ちますSerial.println(F( "\ n任意の文字を送信してDMPプログラミングとデモを開始します:")); while(Serial.available()&&Serial.read()); //バッファを空にしますwhile(!Serial.available()); //データを待つwhile(Serial.available()&&Serial.read()); //バッファを再度空にします// DMPをロードして設定しますSerial.println(F( "Initializing DMP ...")); devStatus =mpu.dmpInitialize(); //ここに独自のジャイロオフセットを指定し、最小感度に合わせてスケーリングしますmpu.setXGyroOffset(220); mpu.setYGyroOffset(76); mpu.setZGyroOffset(-85); mpu.setZAccelOffset(1788); //テストチップの1688工場出荷時のデフォルト//動作することを確認します(動作している場合は0を返します)if(devStatus ==0){// DMPをオンにして、準備ができたSerial.println(F( "EnablingDMP。 .. ")); mpu.setDMPEnabled(true); // Arduino割り込み検出を有効にしますSerial.println(F( "割り込み検出を有効にします(Arduino外部割り込み0)...")); attachInterrupt(0、dmpDataReady、RISING); mpuIntStatus =mpu.getIntStatus(); // DMP Readyフラグを設定して、メインのloop()関数がそれを使用しても問題がないことを認識できるようにしますSerial.println(F( "DMP ready!最初の割り込みを待機しています...")); dmpReady =true; //後で比較するために予想されるDMPパケットサイズを取得しますpacketSize =mpu.dmpGetFIFOPacketSize(); } else {//エラー! // 1 =初期メモリのロードに失敗しました// 2 =DMP構成の更新に失敗しました//(壊れそうな場合、通常、コードは1になります)Serial.print(F( "DMP初期化に失敗しました(コード"));シリアル。 print(devStatus); Serial.println(F( ")")); } //出力用にLEDを構成pinMode(LED_PIN、OUTPUT);} // ================================================================// ===メインプログラムループ===// ================================================================void loop(){//プログラミングが失敗した場合、(!dmpReady)return;の場合は何もしようとしないでください。 // MPU割り込みまたは追加のパケットが利用可能になるのを待ちます(!mpuInterrupt &&fifoCount  

回路図


製造プロセス

  1. RPiを備えたライントラッキングセンサー
  2. RPiを使用した環境センサーAPI
  3. RaspberryPiを使用したモーションセンサー
  4. PIRモーションセンサーを備えたRaspberryPi GPIO:最高のチュートリアル
  5. HC-SR501PIRモーションセンサーとRaspberryPiのインターフェース
  6. TJBot入門
  7. RAK 831 LoraGatewayおよびRPi3の使用を開始する
  8. RAK831LoRaゲートウェイとRPi3の使用を開始する
  9. 保険におけるAI入門:入門ガイド
  10. Arduinoチュートリアル01:はじめに
  11. イーグルグループ入門:知っておくべきこと