2014年3月31日 星期一

草稿 - GY-521(MPU-6050)三軸陀螺儀/加速度感應器

官方網頁
http://www.invensense.com/mems/gyro/mpu6050.html

product spec
http://www.invensense.com/mems/gyro/documents/PS-MPU-6000A-00v3.4.pdf

register map
http://www.invensense.com/mems/gyro/documents/RM-MPU-6000A-00v4.2.pdf



等待已久的三軸陀螺儀/加速度感應器/磁場感應器終於到貨

等待已久的三軸陀螺儀/加速度感應器/磁場感應器終於到貨

可以開始研究了!

GY-521 (MPU6050)
GY-273 (HMC5883L)

2014年3月20日 星期四

Arduino 小技巧 - 修改servo library, 使其更新動作速度更快


http://www.diy-robots.com/?p=1183

一般servo控制,都是20ms更新一次,每次拉高一段時間,拉高的時間範圍約為1000-2000us, 
1500us為中間點

可以修改Arduino servo library,使更新間隔降到2500us(2.5ms),對於需要快速控制的用途很有幫助

libraries\Servo\Servo.h
//#define REFRESH_INTERVAL    20000     // minumim time to refresh servos in microseconds 
#define REFRESH_INTERVAL 2500

2014年3月19日 星期三

Arduino - LCD控制

參考

  1. http://coopermaa2nd.blogspot.tw/2010/12/arduino-lab9-2x16-lcd-world.html
  2. http://www.spikenzielabs.com/SpikenzieLabs/LCD_How_To.html
  3. http://arduino.cc/en/Tutorial/HomePage#.Uym-zvmSyXo 內的 LiquidCrystal Library

使用內建的library可以很輕易的控制LCD

可以注意到使用pin 8 9 10 11這樣設定可以當作小電流的5V與GND,提供LCD背光與Vee(調整對比)電壓調整使用
關於把GPIO當作5V來源,可以參考這篇文章:
http://ddddiy.blogspot.tw/2014/03/arduino-gpio5v-or-gnd.html


範例:
#include

LiquidCrystal lcd(0, 1, 4, 5, 6, 7);//rs, enable, d4, d5, d6, d7 

void setup(){
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);

  digitalWrite(8, HIGH);
  digitalWrite(9, LOW);
  digitalWrite(10, HIGH);
  digitalWrite(11, LOW);

  lcd.begin(16, 2);

  lcd.print("aaaabbbbccccdddd");
}

void loop(){
  lcd.setCursor(0, 1);

  lcd.print(millis( )/1000);

  delay(100);
}




Arduino 小技巧 - 使用GPIO當作5V or GND的方法

有時候測試時沒有使用麵包版,
版子上又有多餘的GPIO時,若電流很小(例如驅動一般LED),可以使用GPIO當作VCC/GND

以Leonardo為例,GPIO可以輸出40mA
http://arduino.cc/en/Main/ArduinoBoardLeonardo#.Uym72PmSyXo

Summary

MicrocontrollerATmega32u4
Operating Voltage5V
Input Voltage (recommended)7-12V
Input Voltage (limits)6-20V
Digital I/O Pins20
PWM Channels7
Analog Input Channels12
DC Current per I/O Pin40 mA
DC Current for 3.3V Pin50 mA
Flash Memory32 KB (ATmega32u4) of which 4 KB used by bootloader
SRAM2.5 KB (ATmega32u4)
EEPROM1 KB (ATmega32u4)
Clock Speed16 MHz


ex:
  pin8: 5V
  pin9: 0V

code:
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);

  digitalWrite(8, HIGH);
  digitalWrite(9, LOW);


草稿 - DIY 四軸飛行器


  1. sensor: Gyro + G-sensor
  2. 機身目前狀態: 將Gyro + G-sensor的值經過Kalman filter運算後取得
  3. 平衡機身的方法使用PID
  4. 控制機身:
    1. 油門:PID運算過程中加入油門量
    2. YAW: 修改對角線馬達油門量,一組增加,一組減少
    3. ROLL/PITCH: 修改步驟2的機身狀態

2014年3月18日 星期二

PID控制

PID 的概念其實很簡單,裡面三個大部分

  • P: proportional, 比例控制
    • 假設目前四軸姿態是水平於地面,要前傾時,需降低前兩顆馬達轉速並增加後兩顆馬達的轉速,傾斜的速度跟馬達出力差異的對應這邊就是P
    • 假設目標是前傾十度,目前姿態為水平,預計要輸出多少轉速差來達到這10度的變化
  • I: integral, 誤差的積分
    • 誤差:每次預估的結果與實際量測結果的差值,會每個loop一值累加
    • 目標是讓平均誤差接近0
    • 假設前一個loop,使用10%的前後馬達轉速差依照P預計下一個取樣點會從水平變為前傾10 度, 此時真正從sensor量出來的姿態是前傾9 度,那這次誤差就是-1,這部分可以當作這次控制訊號輸出時的參考因素
  • D: derivative, 微分,基本上就是預測之後趨勢
    • 對誤差的部分作微分,基本上就是找出斜率,推故下個時間點的誤差,這部分可以當作這次控制訊號輸出時的參考因素



https://www.google.com.tw/search?q=PID&source=lnms&tbm=isch&sa=X&ved=0ahUKEwjQ3MDb8K_OAhWFjZQKHcEICzkQ_AUICCgB&biw=1280&bih=614#imgrc=IoZD3kF8eZVYsM%3A
隨著時間一次次把實際量測的值算出P/I/D後,依各自的權重加總,算出這次控制真正的輸出,一次次這樣做便能趨近預計目標值且穩定不震盪
這個演算法只需儲存少數的資料,用少數的運算量,即可達到不錯的效果,不過需要人工調出PID 的參數
PID調參數也是一門學問,目前有些四軸飛控板有自動調PID參數功能,這部分也是可以研究的領域





===================================================
很不錯的影片表示PID 間的關係


超淺顯易懂的教學
http://bbs.5imx.com/forum.php?mod=viewthread&tid=891184&fromuid=241202


http://4rdp.blogspot.tw/2008/05/pid-speed-control.html
http://4rdp.blogspot.tw/2008/12/apply-pid-to-control-lego-nxts-speed.html
http://4rdp.blogspot.tw/2013/11/pid-control-1.html
http://4rdp.blogspot.tw/2013/11/pid-control-2.html
http://4rdp.blogspot.tw/2013/12/pid-control-3.html


https://en.wikipedia.org/wiki/PID_controller
http://www.expertune.com/tutor.aspx

草稿 - Android app - Tasker

2014年3月10日 星期一

Arduino藍芽遙控小車

使用Arduino搭配兩個模組

  1. MTADRL293D 馬達控制板
    1. http://ddddiy.blogspot.tw/2014/02/mtadrl293d.html
  2. HC-05 藍芽模組
    1. http://ddddiy.blogspot.tw/2014/02/hc-05-bt-module.html

做法:
  1. 參考這裡將HC-05 藍芽模組設定好,接上VCC/GND,並將HC-05的TX/RX接到Leonardo的RX/TX
  2. 將MTADRL293D插上Leonardo
  3. 將MTADRL293D的M1/M4(在這張版子上這兩顆馬達吃BATT的電,另外兩顆吃5V)接到車子左右兩顆馬達的正負極
  4. MTADRL293D接上電池

車身/履帶/減速機: 田宮 工作樂系列

範例程式碼:

2014年3月3日 星期一

Arduino小技巧 - Library寫法

觀察一下原本內建的library,可以發現Arduino的library寫法非常簡單

以我自己所寫的74HCT595N library為例:

  1. 撰寫 xxx.h
    • class定義, 常數...
  2. 撰寫 xxx.cpp
    • 實做class 
  3. 新增 keywords.txt
    • Datatypes (KEYWORD1)
    • Methods and Functions (KEYWORD2)
    • Constants (LITERAL1)
  4. 將三個檔案放入一個資料夾xxx後,丟到
    • arduino-1.0.5-r2\libraries
  5. 可以順便寫個範例程式,放入examples資料夾,丟到
    • arduino-1.0.5-r2\libraries\xxx


範例:



發現官方說明文件:
http://arduino.cc/en/Guide/Libraries#.Uxxb7vm1bNk

=======================================================

目前發現,無法從一個Library A去使用另一個Library B

  • 編譯時會提示找不到B.h
    • 將#include "B.h" 改成#include "../B/B.h"後,可以找到.h 檔,但仍找不到實作的部分
目前暫時的解決方法是把B.h/B.cpp複製到A的資料夾內