macsbug

Just another WordPress.com site

Try IMU with MPU6500 and ESP8266

leave a comment »

MPU6500 と ESP8266 で IMU を試してみました。                2016.12.08
IMU : inertial measurement unit :慣性計測装置。

画面で グリグリ回してみたい という発想です。
ワイヤレス方式 の費用は 1306円。USB 有線方式は 848円 です。


.
準備:費用=1306円   : 円レートで価格が変動します。

No.  Nomen  Link  Price(円)  Memo
01  MPU6500  MPU6500  172  2個344円
02  WeMos D1 mini  D1 Mini  382  1個
03  ESP-WROOM-02 TELEC  ESP8266 TELEC  458  1個
04  BATTERY NP-70  秋葉ガレージ中古品     250  4個1000円
05  スイッチ  Latch 7x7mm Push sw           8  20個152円
05  ショットキーダイオード  RSX101VA-30:秋月           9  20個180円
06  0.3mm厚基板Dタイプ  0.3mm厚基板:秋月        10  1個60円
07  ピンソケット8P  8pin Female socket        15  10個150円
08  低メスシングルピンソケット  ソケット:秋月           1  1個50円
09  L型ピンヘッダ  Single Right Angle Pin           1  3個110円
10  ケース( 3D Printer 自作)  –  –
 ———- スケッチ———-  ————————-  –
11  FreeIMU Processing sketch  FreeIMU_cube.zip  –
12  FreeIMU Arduino sketch  MPU6050_test.zip  –
13  processng Language  processng Language  –

.
ハードの選択:
_ センサーについては「Investigate Degrees Of Freedom」を参照してください。
_ 多くの種類と価格があり 低価格を優先し コストパフォーマンスの高い MPU6500
_ を選択しました。業者によっては MPU6500 を注文すると MPU9250, MPU9255
_ 同等品が来る場合もあります。この場合 Magnetic も使用できる事になります。

.
ソフトの選択:
_ ライブラリーやスケッチは センサーデータの処理がされた FreeIMU   を選択。
_ このスケッチの完成度は高く Mike S の mjs523氏 に感謝致します。
.


.
工作:
1. スイッチとバッテリーコネクタの製作。 部品は6つ。

_ 配線は コネクターピンやピンの余りを使用してハンダ付けします。
_ +BATTERY -> ダイオード -> スイッチ -> +BATT出力(WeMos +5V)
_ バッテリー出力から ショットキーダイオード を経由しスイッチへ配線する。
_ ショットキーダイオードは USB接続の電源からの逆流防止の為です。
_ 重要:ピンソケットの2つは バッテリ接点用ですので バネで接触する様に
_ 上手に折り曲げます。

2. ESP8266 と センサー 組み立て。スルーホール同士を直付けします。
_  ワイヤレス用:WeMos D1 mini with TELEC
_  ( D1 mini ) 3V3 = VCC (MPU6500)
_  ( D1 mini ) D8 = GND(Wire で GND へ配線) = GND (MPU6500)
_  ( D1 mini ) D7 = SCL (MPU6500)
_  ( D1 mini ) D6 = SDA (MPU6500)

_ USBシリアル接続用: WeMos D1 mini Pro と D1 mini ( without TELEC)
_ without TELEC の基板使用時は スケッチで WiFi.mode(WIFI_OFF); にします。
_ この命令で送信電波を停止し TELEC Not Applicable にします。

3. 組み立て。
_  ケース、スイッチ、ESP8266 + MPU6500、バッテリー の用意ができました。
_  ショートが予想される場所は カプトンテープ等で絶縁します。

_  ケースに組み上げます。
_  D1 mini の +5V をスイッチコネクター の +BATTERY出力 に接続します。

.


.
FreeIMU を動かす方法:ESP8266 と Processing のスケッチを記述します。
_ FreeIMU Arduino sketch の MPU6050_test.zip と
_ FreeIMU Processing sketch の FreeIMU_cube.zip  を 追加変更します。

_ USB シリアルについて:(前置き)
_  スケッチの接続は USB シリアルです。例:ESP8266 USB  — Mac(PC)。
_  ESP8266 の USBの名前 を設定すると繋がります。
_  例:myPort = new Serial(this, “/dev/cu.wchusbserialfd1420”, 115200);
_  Processing と ESP8266 のスケッチは 上記の設定をすると動作します。
_  ESP8266 は WiFi.mode(WIFI_OFF); にします。

UDP通信でワイヤレス化する:
_ USBシリアル の部分を WiFi (UDP通信)に 置き換え ワイヤレス にします。
_ これが出来ますと 多種多様なものを 簡単にワイヤレス化 できます。
_ 電波を使用する為 ESP8266 は with TELEC を使用します。

ESP8266 のスケッチの変更と追加MPU6050_test.zip を UDP通信対応にします。
UDP通信は「Communicate ESP8266 and iPad directly with UDP」を参照ください。
仕組みは「UDPの設定」と 「udp.print(data); 」でデーターを送信します。

1. スケッチの先頭に以下を追加します。

#include <ESP8266WiFi.h>              // WiFi
#include <WiFiUDP.h>                  // UDP
static WiFiUDP udp;                   // UDP Object
#define ESP_RX_PORT 7000              // ESP Receiver port
#define ESP_TX_PORT 9000              // ESP Transmit Port
IPAddress ESP_IP;                     // ESP IP 192.168.4.1
IPAddress EXT_IP;                     // ext IP 192.168.4.2
bool sw = LOW;                        // LED switch
String data = "";                     // OUTPUT DATA

2. void setup() の先頭に以下を追加します。

  Serial.begin(115200);                 //
  Wire.begin(D6,D5);                    // SDA, SCL. D6,D7:D1 mini
  pinMode(D4, OUTPUT);                  // BUILTIN_LED monitor
  WiFi.mode(WIFI_AP);                   // AP Mode:direct connection
  WiFi.softAP("MPU6500", "");           // ESP8266:SSID, password
  ESP_IP = WiFi.softAPIP();             // 192.168.4.1 localIP
  udp.begin(ESP_RX_PORT);               // ESP:UDP Rx port=7000

3. その下の while(!Serial.available() は コメントアウトします。
これは USB ケーブルで接続の場合に使用します。

/*
  while(!Serial.available()){
    if(Serial.available()){
      byte hereWeGo = Serial.read();
      if( hereWeGo == 't'){
        break;
      }
    }
  }
  */

4. void sendQuat() の Serial.print(“\n”); の下に以下を追加します。

data = data + "\n";
udp.beginPacket(EXT_IP, ESP_TX_PORT); // Packet transmit
udp.print(data);                      // data   transmit
udp.endPacket();                      // end of transmit
Serial.println(data);                 //
sw = !sw; digitalWrite(D4,sw);        // LED indication
data = "";

5. void serialPrintFloatArr(float * arr, int length) の Serial.print(“,”); の下に追加。

data = data + ",";

6. void serialFloatPrint(float f) の Serial.print(c2);  の下に以下を追加します。

data = data + String(c1) + String(c2);

動作確認:Arduino IDE のシリアルコンソールを開き シリアル出力を見ます。
_ 例:0058723F,000012BC,000004BD,0018A4BE, が出力していれば動作
_ しています。センサーを動かすと このデーターが変化します。

以上で ESP8266 のスケッチは終了です。



Processing スケッチの変更と追加FreeIMU_cube.zip を UDP通信対応にします。
3つ ( UDPライブラリー、UDPポート設定、受信ルーチン) を追加し動作します。
細かな所では エラーがでるか シリアル通信の記述はコメントアウトします。
processing Language は事前に多少 理解しておく必要があります。
記述は Arduino や ESP8266 と似て 解り易く グラフィックが強力です。
使い方では プルダウンメニューの ライブラリーの追加 と フォントの作成は
少し知る必要があります。私のレベルでも出来ましたので大丈夫です。
Processsing からライブラリーやフォントの追加指示があれば 従ってください。
余談ですが Processing は アプリケーションのエクスポート機能があり 単独の
アプリが作れます。

1. スケッチの先頭にライブラリーを追加します。

import hypermedia.net.*;
UDP udp;

2. void setup() の先頭に UDPポートの設定を追加します。

  udp = new UDP( this, 9000 );
  udp.listen( true );

3. 受信の void readQ() ルーチン全体を以下に変更します。

void receive( byte[] data, String ip, int port ) {
  data = subset(data, 0, data.length-2);
  String inputString = new String( data );
  String [] inputStringArr = split(inputString, ",");
  q[0] = decodeFloat(inputStringArr[0]);
  q[1] = decodeFloat(inputStringArr[1]);
  q[2] = decodeFloat(inputStringArr[2]);
  q[3] = decodeFloat(inputStringArr[3]);
}

以上で Processing のスケッチは終了です。


.
他の試して動作したスケッチです:それぞれグリグリ回転します。
シリアル通信の所を削除しUDP通信を追加し直ぐ動きました。
スケッチの出来具合にもよりますが 水平の回転ができないものが多いです。
かなり検討されたものや 3D画像を直ぐ使用できる優れものもあります。

.


.
データーの処理方法:加速度センサーの例
x,y,z 軸の値:をそのまま(ローデーター) 使用し 3D で動かしている物があります。
_ このままでは 量と現実との差が生じる為 受け側での処理が必要です。
.
pitch,roll,yawの値:x,y,z 軸から pitch,roll,yaw を算出し 3D で動かしている物が
_ あります。このままでは 量と現実との差が生じる為に 受け側デの処理が必要
_ です。さらにこれだけでは水平軸の回転は表示できません。
.
FreeIMU:水平軸の回転も可能になっています。動かした大きさも ほぼ同じ量で
_ 表示しています。縦方向は動きませんので Atitudeセンサーが必要になります。
_ これには 10DOF が必要で 気圧センサーの BME180, BMP085(25cm) か
_ MS5611(10cm) を使用する事になります。
_ 値の取得は 16bit hexで 私にはレベルが高く理解できません。
.


.
感想:
画面で グリグリ回してみたい という発想から始め モーションを体験できました。
知識も無く 加速度センサー や 磁気センサーを購入し作られたスケッチをいろいろ
試してみました。表示をどうするでは 素人でも扱い易いグラフィックは Processing
が最適です。その点でも先人が Processing を使用していましたので 助かりました。
殆どが USB 接続によるものですが 事前に ESP8266 による UDP 直接通信の方法を
解説しておきましたので 容易に表示する事が出来ました。
.
加速度センサー:奥が深く感じました。データーを取得して表示するだけでは使用
_ できないと言う事です。KalmanFilter 等のフィルターが必要です。GPSの精度
_ は 50cmですが加速度やジャイロを使用する事により 8cm まで可能と聞いてい
_ ます。
.
スイッチ:小さなケースに入れる場合、スライドスイッチ や トグルスイッチは
_ 押しづらい事やケースに固定が難しい。押しボタンスイッチが最適と判断し
_ ましたが 秋葉原ではこの手のスイッチは入手できず ebay から購入しました。
.
バッテリー:デジカメ用のバッテリーは 平たく四角の為に工作しやすくケースを
_ 薄く作る事が出来ます。ただし 高価で費用に大きく影響します。中古ですが
_ 秋葉原のガレージショップで安く入手しました。充電回路は場所を取る事と
_ 面倒です。古いデジカメの様にバッテリ交換方式にしました。バッテリーは
_ 充電後に 4.2V になり ESP8266 の 3.3V 電源には 直接接続できません。
_ よって D1 mini の場合は 5V 端子へ接続し 基板のLDOで 3.3V に変換されます。
.
消費電流:USB 5V 測定に於いて 約110mA、消費電力は 約5.9AHです。
.
価格:ESP8266 ボードとセンサーの国内の価格は非常に高いです。今回の分野で
_  は 7000円台になるでしょう。これに対し低価格を追求した中では 1306円
_  で出来る事が判明しましたが TELEC代が35%にもなります。
.
混信:モーションセンサーを 多数使用すると これまでに無い事ができます。ただし
_  WiFi を多数動作させると混信の問題が起きてきます。この件は検討課題です。
.


広告

Written by macsbug

12月 8, 2016 @ 7:24 am

カテゴリー: ESP8266

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。