Bear在很久以前就買了一顆慣性感測器
但是因為太忙了一直沒時間拿出來跟大家分享,今天總算有時間給大家個新內容囉!
但是因為太忙了一直沒時間拿出來跟大家分享,今天總算有時間給大家個新內容囉!
話不多說,
先跟大家簡單介紹一下什麼是慣性感測器
慣性感測器
又稱作IMU
是拿來量測物體運動時候的加速度以及角加速度
利用這些資訊我們就可以更瞭解物體的姿態
為了獲得更準確的資料IMU通常會被安裝在物體的重心
在比較早之前IMU通常被安裝在飛機、潛艇、飛彈、衛星等等
現在幾乎所有的智慧型手機裡面都有IMU在裡面
或是有名的Segway, Wii的手把都是利用IMU的資訊來作控制
此外 IMU得到的是加速度的資訊,只要我們對時間做積分,
我們可以得到粗略的速度及角速度的資訊,只是非常不準確XD
這次我們在這邊要用的是InvenSense的MPU6050,
它包含了三軸加速規以及三軸的陀螺儀(有關他的Datasheet請點這裡)
此外MPU6050可以加上三軸的電子羅盤得到九軸的完整資訊
(不在這次的討論範圍之中! 下次我們在討論!)
Arduino官方網站有更多介紹更完整地介紹 (Click Here)
先跟大家簡單介紹一下什麼是慣性感測器
慣性感測器
又稱作IMU
是拿來量測物體運動時候的加速度以及角加速度
利用這些資訊我們就可以更瞭解物體的姿態
為了獲得更準確的資料IMU通常會被安裝在物體的重心
在比較早之前IMU通常被安裝在飛機、潛艇、飛彈、衛星等等
現在幾乎所有的智慧型手機裡面都有IMU在裡面
或是有名的Segway, Wii的手把都是利用IMU的資訊來作控制
此外 IMU得到的是加速度的資訊,只要我們對時間做積分,
我們可以得到粗略的速度及角速度的資訊,只是非常不準確XD
這次我們在這邊要用的是InvenSense的MPU6050,
它包含了三軸加速規以及三軸的陀螺儀(有關他的Datasheet請點這裡)
此外MPU6050可以加上三軸的電子羅盤得到九軸的完整資訊
(不在這次的討論範圍之中! 下次我們在討論!)
Arduino官方網站有更多介紹更完整地介紹 (Click Here)
從Datasheet來看 Arduino與MPU6050主要的溝通方式就是i2c
主要的接線方式
MPU6050 Arduino
VCC -> 3.3V
GND -> GND
SCL -> SCL
SDA -> SDA
因為Bear手邊的MPU6050是有多加一個5V轉3.3V的所以可以直接接5V
大家接線之前要先注意一下
接好線以後 就是軟體的部分了
我們可以直接從github上下載由Jeff Rowberg寫好的library
http://www.i2cdevlib.com/devices/mpu6050
(不會使用github的請點這篇連結)
主要的接線方式
MPU6050 Arduino
VCC -> 3.3V
GND -> GND
SCL -> SCL
SDA -> SDA
因為Bear手邊的MPU6050是有多加一個5V轉3.3V的所以可以直接接5V
大家接線之前要先注意一下
接好線以後 就是軟體的部分了
我們可以直接從github上下載由Jeff Rowberg寫好的library
http://www.i2cdevlib.com/devices/mpu6050
(不會使用github的請點這篇連結)
下載下來以後放到Arduino的library裡面以後
從File -> Examples -> MPU6050 -> Examples 先利用裡面的範例
從File -> Examples -> MPU6050 -> Examples 先利用裡面的範例
打開Serial Monitor確定IMU能夠得到值 上下左右旋轉一下看看值是否有變化
如果在Serial Monitor看到亂碼的話 可能是鮑率設定錯了 要改成38400
在確定MPU6050可以正確的讀到值之後
我們要將Servo也接上 Servo是由PWM訊號來控制旋轉的角度(0-約180)
Servo要接的有三條線 紅色接5V 黑色接GND 白色接PWM 訊號
在這邊我們用Pin7來輸出PWM訊號
同樣的Arduino 也有控制Servo的library了 (下面還會看到 在這邊就不再多做介紹)
(補充:如果Servo的負載比較大的時候 最好不要使用Arduino上面的5V 外接電給Servo然後在共地)
將上面兩個東西整合起來的大概長這樣
如果在Serial Monitor看到亂碼的話 可能是鮑率設定錯了 要改成38400
在確定MPU6050可以正確的讀到值之後
我們要將Servo也接上 Servo是由PWM訊號來控制旋轉的角度(0-約180)
Servo要接的有三條線 紅色接5V 黑色接GND 白色接PWM 訊號
在這邊我們用Pin7來輸出PWM訊號
同樣的Arduino 也有控制Servo的library了 (下面還會看到 在這邊就不再多做介紹)
(補充:如果Servo的負載比較大的時候 最好不要使用Arduino上面的5V 外接電給Servo然後在共地)
將上面兩個東西整合起來的大概長這樣
程式如下
#include "I2Cdev.h"
#include "MPU6050.h"
#include "Wire.h"
#include <Servo.h>
MPU6050 accelgyro;
Servo servo1;
int16_t ax, ay, az;
int16_t gx, gy, gz;
int val;
int prev;
void setup() {
Wire.begin();
Serial.begin(38400);
Serial.println("Initializing I2C devices...");
accelgyro.initialize();
servo1.attach(7);
// verify connection
Serial.println("Testing device connections...");
Serial.println(accelgyro.testConnection() ? "MPU6050 connection successful" : "MPU6050 connection failed");
}
void loop() {
// read raw accel/gyro measurements from device
accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
Serial.print("a/g:\t");
Serial.print(ax); Serial.print("\t");
Serial.print(ay); Serial.print("\t");
Serial.print(az); Serial.print("\t");
Serial.print(gx); Serial.print("\t");
Serial.print(gy); Serial.print("\t");
Serial.println(gz);
val = map(ay,-17000,17000,0,179);
if (val!=prev){
servo1.write(val);
prev=val;
}
delay(50);
}
#include "I2Cdev.h"
#include "MPU6050.h"
#include "Wire.h"
#include <Servo.h>
MPU6050 accelgyro;
Servo servo1;
int16_t ax, ay, az;
int16_t gx, gy, gz;
int val;
int prev;
void setup() {
Wire.begin();
Serial.begin(38400);
Serial.println("Initializing I2C devices...");
accelgyro.initialize();
servo1.attach(7);
// verify connection
Serial.println("Testing device connections...");
Serial.println(accelgyro.testConnection() ? "MPU6050 connection successful" : "MPU6050 connection failed");
}
void loop() {
// read raw accel/gyro measurements from device
accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
Serial.print("a/g:\t");
Serial.print(ax); Serial.print("\t");
Serial.print(ay); Serial.print("\t");
Serial.print(az); Serial.print("\t");
Serial.print(gx); Serial.print("\t");
Serial.print(gy); Serial.print("\t");
Serial.println(gz);
val = map(ay,-17000,17000,0,179);
if (val!=prev){
servo1.write(val);
prev=val;
}
delay(50);
}
利用相同的原理 我們也可以用x z方向的加速度來控制Servo
此外 我們也可以拿來遠端控制遙控車的加速減速等等 (如果有時間的話在Po上來跟大家分享)
也歡迎大家跟我們分享自己的創意!!!
其他不錯的參考資料
http://www.geeetech.com/wiki/index.php/MPU-6050_Triple_Axis_Accelerometer_%26_Gyro_Breakout
http://www.i2cdevlib.com/forums/topic/4-understanding-raw-values-of-accelerometer-and-gyrometer/
更多開發板文章
[1] iPhone 製作Arduino藍芽聊天室
[2] Arduino製作家中遙控器教學
[3] Android 電視盒開發板怎麼選? Takobear簡單告訴你!
[4] 如何第一次用Arduino就上手?
喜歡這篇文章嗎? 趕快加入Takobear粉絲團吧!
此外 我們也可以拿來遠端控制遙控車的加速減速等等 (如果有時間的話在Po上來跟大家分享)
也歡迎大家跟我們分享自己的創意!!!
其他不錯的參考資料
http://www.geeetech.com/wiki/index.php/MPU-6050_Triple_Axis_Accelerometer_%26_Gyro_Breakout
http://www.i2cdevlib.com/forums/topic/4-understanding-raw-values-of-accelerometer-and-gyrometer/
更多開發板文章
[1] iPhone 製作Arduino藍芽聊天室
[2] Arduino製作家中遙控器教學
[3] Android 電視盒開發板怎麼選? Takobear簡單告訴你!
[4] 如何第一次用Arduino就上手?
喜歡這篇文章嗎? 趕快加入Takobear粉絲團吧!