- 控制訊號使用pwm
- 周期約20ms
- 拉high時間控制伺服機轉動角度
- 1ms: 0度
- 1.5ms: 90度
- 2ms: 180度
2014年4月23日 星期三
將一般伺服機改為連續轉動的伺服機(continuous rotation servo)
一般伺服機的動作角度大約為0-180度
若要改造成可以連續轉動,主要修改的步驟如下
若要改造成可以連續轉動,主要修改的步驟如下
- 不要使用偵測擺臂角度的可變電阻
- 將可變電阻上面的線路切斷,並量測最大電阻(ex. 5K 歐姆)
- 將控制板上偵測可變電阻的線路用最大電阻的一半(ex. 2.5K 歐姆)分別接到Vin與Gnd(使控制板覺得擺臂角度一直維持在中立點)
- 改造機構使其連續旋轉
- 通常殼上或齒輪上會有限制最大轉動角度的機構(例如突出物),將其切除即可
由於將可變電阻改成固定電阻,所以控制板會覺得擺臂位置一直在九十度(中立點),
- 若此時送給伺服機的訊號為
- 90度,馬達不會旋轉
- 小於90度,馬達往某一方向轉
- 大於90度,馬達往另一方向轉
可以注意到,若送給伺服機的訊號角度與90度差越多,控制板會認為目前位置與目標位置差距越大,所以會讓馬達轉越快
伺服機內部構造/控制電路
2014年4月13日 星期日
日本大阪自由行
四天都在大阪的輕鬆行
行程:
- 大阪觀光指南
- http://www.osaka-info.jp/enjoy_osaka/ch_t/
- 大阪周遊卡 (osaka amazing pass 2014)
- 中華電信 日本 3G上網
- 開通三天
- 第一天台灣時間晚上6:00開通到第四天晚上六點(此時應該已經在機場了)
- 最高上限999
行程:
- 第一:天:
- 早上
- (台灣時間)11:00 坐捷運到台北車站
- (台灣時間)11:30台北車站出發到機場
- 下午
- (台灣時間)12:30 到桃園機場(吃午餐,準備起飛)
- (台灣時間)14:30 起飛
- 晚上
- 18:10 到關西國際機場
- 出第一航廈,順著指標走,到二樓通過空橋即可到關西空港站,買車票到市區(南海電鐵 空港急行 到難波)
- 在難波站買大坂周遊卡2day
- 從難波站逛過道頓掘,到飯店 大坂難波華盛頓廣場
- http://blog.xuite.net/stevechukw/family/53826406
- http://blog.2fallingleaves.com/2010/11/blog-post.html
- 在難波/道頓掘附近吃晚餐
- 第二天
- 早上
- 大阪城公園/天守閣
- 造幣局
- 天滿宮
- 下午
- 大阪車站城
- 梅田百貨公司 吃
- 晚上
- 道頓掘夜景/觀光船
- 第三天
- 早上
- 大阪港
- 海遊館
- 天寶山大觀覽車
- 大阪府咲州廳舍
- 下午 - 晚上
- 心齋橋商店街
- 日本橋
- 第四天
- 早上
- 天王寺
- 通天閣
- 吊鐘燒
- 下午:
- 16:00出發到機場
- 17:10到關西國際機場(逛機場免稅商店加吃晚餐)
- 19:10 起飛
- (台灣時間)20:50到桃園
- (台灣時間)22:00到台北車站
- (台灣時間)22:00到家
2014年4月8日 星期二
GY-273 使用HMC5883晶片的三軸電子羅盤 e-compass
data sheet
http://www.seeedstudio.com/wiki/images/4/42/HMC5883.pdf
***注意*** module上面標示的Y軸與Z軸是顛倒的!!
每次讀取間隔約需要6.26ms
所有register列表:
register細節
http://www.seeedstudio.com/wiki/images/4/42/HMC5883.pdf
***注意*** module上面標示的Y軸與Z軸是顛倒的!!
- I2C addr為 7bit 0x1E,最後一個bit為控制i2c read/write
- master read: 0x3D
- master write: 0x3C
- 有兩種控制模式:
- 連續讀取
- 單次讀取
- 參考data sheet內有範例:
每次讀取間隔約需要6.26ms
所有register列表:
- 設定:
- Configuration register A/B
- Mode register
- 讀取資料
- Date output X MSB/LSB register
- Date output Y MSB/LSB register
- Date output Z MSB/LSB register
- CHIP狀態
- Status register
- 辨認chip
- Identification register
register細節
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
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
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控制
參考
可以注意到使用pin 8 9 10 11這樣設定可以當作小電流的5V與GND,提供LCD背光與Vee(調整對比)電壓調整使用
關於把GPIO當作5V來源,可以參考這篇文章:
http://ddddiy.blogspot.tw/2014/03/arduino-gpio5v-or-gnd.html
- http://coopermaa2nd.blogspot.tw/2010/12/arduino-lab9-2x16-lcd-world.html
- http://www.spikenzielabs.com/SpikenzieLabs/LCD_How_To.html
- 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
ex:
pin8: 5V
pin9: 0V
code:
版子上又有多餘的GPIO時,若電流很小(例如驅動一般LED),可以使用GPIO當作VCC/GND
以Leonardo為例,GPIO可以輸出40mA
http://arduino.cc/en/Main/ArduinoBoardLeonardo#.Uym72PmSyXo
Summary
| Microcontroller | ATmega32u4 |
| Operating Voltage | 5V |
| Input Voltage (recommended) | 7-12V |
| Input Voltage (limits) | 6-20V |
| Digital I/O Pins | 20 |
| PWM Channels | 7 |
| Analog Input Channels | 12 |
| DC Current per I/O Pin | 40 mA |
| DC Current for 3.3V Pin | 50 mA |
| Flash Memory | 32 KB (ATmega32u4) of which 4 KB used by bootloader |
| SRAM | 2.5 KB (ATmega32u4) |
| EEPROM | 1 KB (ATmega32u4) |
| Clock Speed | 16 MHz |
ex:
pin8: 5V
pin9: 0V
code:
pinMode(8, OUTPUT); pinMode(9, OUTPUT); digitalWrite(8, HIGH); digitalWrite(9, LOW);
草稿 - DIY 四軸飛行器
- sensor: Gyro + G-sensor
- 機身目前狀態: 將Gyro + G-sensor的值經過Kalman filter運算後取得
- 平衡機身的方法使用PID
- 控制機身:
- 油門:PID運算過程中加入油門量
- YAW: 修改對角線馬達油門量,一組增加,一組減少
- ROLL/PITCH: 修改步驟2的機身狀態
2014年3月18日 星期二
PID控制
PID 的概念其實很簡單,裡面三個大部分
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://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
- 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=241202http://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
2014年3月10日 星期一
Arduino藍芽遙控小車
使用Arduino搭配兩個模組
車身/履帶/減速機: 田宮 工作樂系列
- MTADRL293D 馬達控制板
- HC-05 藍芽模組
做法:
- 參考這裡將HC-05 藍芽模組設定好,接上VCC/GND,並將HC-05的TX/RX接到Leonardo的RX/TX
- 將MTADRL293D插上Leonardo
- 將MTADRL293D的
M1/M4(在這張版子上這兩顆馬達吃BATT的電,另外兩顆吃5V)接到車子左右兩顆馬達的正負極 - MTADRL293D接上電池
車身/履帶/減速機: 田宮 工作樂系列
範例程式碼:
2014年3月3日 星期一
Arduino小技巧 - Library寫法
觀察一下原本內建的library,可以發現Arduino的library寫法非常簡單
以我自己所寫的74HCT595N library為例:
發現官方說明文件:
http://arduino.cc/en/Guide/Libraries#.Uxxb7vm1bNk
=======================================================
目前發現,無法從一個Library A去使用另一個Library B
以我自己所寫的74HCT595N library為例:
- 撰寫 xxx.h
- class定義, 常數...
- 撰寫 xxx.cpp
- 實做class
- 新增 keywords.txt
- Datatypes (KEYWORD1)
- Methods and Functions (KEYWORD2)
- Constants (LITERAL1)
- 將三個檔案放入一個資料夾xxx後,丟到
- arduino-1.0.5-r2\libraries
- 可以順便寫個範例程式,放入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的資料夾內
2014年2月28日 星期五
L293D 工作原理
馬達驅動晶片
L293與L293D基本上一樣,不過L293D只有600mA的輸出,有點小
(The L293D is designed to provide bidirectional drive currents of up to 600-mA at voltages from 4.5 V to 36 V)
每顆chip有四根腳位可以接馬達,所以可以驅動兩顆直流馬達(可正反轉)或一顆步進馬達
腳位:
參考
http://pdf.datasheetcatalog.com/datasheet/texasinstruments/l293d.pdf
http://ddddiy.blogspot.tw/2014/02/mtadrl293d.html
http://www.ogeo.com.tw/root5/arduino-238.php
L293與L293D基本上一樣,不過L293D只有600mA的輸出,有點小
(The L293D is designed to provide bidirectional drive currents of up to 600-mA at voltages from 4.5 V to 36 V)
每顆chip有四根腳位可以接馬達,所以可以驅動兩顆直流馬達(可正反轉)或一顆步進馬達
腳位:
- 1-2 EN
- 控制1-2 A是否啟用
- 3-4 EN
- 控制3-4 A是否啟用
- VCC1
- CHIP電源(4.5-7V)
- VCC2
- 馬達電源 (VCC1-36V)
- GND 1-4
- 接地
- 1-4 Y
- 控制1-4 A接到VCC2 or GND
- 1-4 A
- 接到馬達
參考
http://pdf.datasheetcatalog.com/datasheet/texasinstruments/l293d.pdf
http://ddddiy.blogspot.tw/2014/02/mtadrl293d.html
http://www.ogeo.com.tw/root5/arduino-238.php
2014年2月26日 星期三
卡爾曼濾波
為了將sensor量測的結果計算出真正得四軸的姿態,研究了一陣子,看起來大部分的人卡爾曼綠波來做處理
目前study一下稍微有點概念,但實際要套用到四軸上,三軸資料同時運算,又要考慮效率,看起來要回去把大學的線性代數、矩陣運算重新複習一遍了
系統描述
系统的测量值:
誤差定義
基本公式
基本概念在這個網站上講解的非常清楚
http://www.geek-workshop.com/thread-1487-1-1.html
以溫度為例計算為例
參考
http://www.360doc.com/content/11/0506/14/3810344_114798067.shtml
http://www.geek-workshop.com/thread-15257-1-1.html
http://gcyrobot.blogspot.com/2012/08/simple-kalman-filter_29.html?m=1
http://jpkc.nwpu.edu.cn/jpkc2005/40/ebook/kcsj/chp12/12_7.htm
目前study一下稍微有點概念,但實際要套用到四軸上,三軸資料同時運算,又要考慮效率,看起來要回去把大學的線性代數、矩陣運算重新複習一遍了
系統描述
- X(k)=A X(k-1)+B U(k)+W(k)
- X(k): 這次的狀態
- A X(k-1): 上次的狀態經過A做轉換
- B U(k): 輸入的改變經過B做轉換
- W(k): 實際影響的誤差
系统的测量值:
- Z(k)=H X(k)+V(k)
- Z(k) 測量值
- H X(k): 將X(k)轉換為測量值
- V(k) 為測量誤差
誤差定義
- Q: 量測的誤差(高斯分布,平均為0) <==固定
- 例如每次溫度計量出來跟實際溫度都會有+-0.5度的誤差,但多次平均後仍與實際溫度相同
- R: 隨著時間演變的誤差(高斯分布,平均為0) <==固定
- 假設系統理想上每隔一分鐘上升一度,但實際上可能有+-0.1度的誤差,但長期的趨勢平均還是每隔一分鐘上升一度
基本公式
- X(k|k-1)=A X(k-1|k-1)+B U(k)
- P(k|k-1)=A P(k-1|k-1) A’+Q
- X(k|k)= X(k|k-1)+Kg(k) (Z(k)-H X(k|k-1))
- Kg(k)= P(k|k-1) H’ / (H P(k|k-1) H’ + R)
- P(k|k)=(I-Kg(k) H)P(k|k-1)
基本概念在這個網站上講解的非常清楚
http://www.geek-workshop.com/thread-1487-1-1.html
以溫度為例計算為例
- X(k|k-1)=A X(k-1|k-1)+B U(k)
- 這次推估的溫度X(k|k-1)等於上次預測的溫度X(k-1|k-1) 透過A轉換出來的值加上這次輸入的熱量造成的改變BU(k)做轉換(例如輸入U(k)100卡, 透過B轉換為溫度1度)
- 這個例子來說A 跟B 都是1
- 這次的推估溫度X(k|k-1)單位跟上次計算出的溫度X(k-1|k-1)單位相同,不用做轉換,所以A=1
- 溫度計量到的值就是溫度,所以不用做轉換,B=1
- P(k|k-1)=A P(k-1|k-1) A’+Q
- 這次推估的溫度X(k|k-1)的推估誤差P(k|k-1)為上一段時間的誤差P(k-1|k-1)加上測量誤差Q
- X(k|k)= X(k|k-1)+Kg(k) (Z(k)-H X(k|k-1))
- 這次的計算結果等於推估溫度加上 這次卡爾曼增益Kg(k)* [測量值Z(k)與推估值H X(k|k-1)的誤差]
- 這邊H=1
- Kg(k)= P(k|k-1) H’ / (H P(k|k-1) H’ + R)
- 這次卡爾曼增益Kg(k) 為這次的推估誤差P(k|k-1)/(這次的推估誤差P(k|k-1) + 隨著時間演變的誤差R)
- H'=H=1
- P(k|k)=(I-Kg(k) H)P(k|k-1)
- 這次實際的推估誤差為(1-這次卡爾曼增益Kg(k))*這次推估的誤差P(k|k-1)
參考
http://www.360doc.com/content/11/0506/14/3810344_114798067.shtml
http://www.geek-workshop.com/thread-15257-1-1.html
http://gcyrobot.blogspot.com/2012/08/simple-kalman-filter_29.html?m=1
http://jpkc.nwpu.edu.cn/jpkc2005/40/ebook/kcsj/chp12/12_7.htm
74HCT595N工作原理
這是一顆計數暫存晶片
可以使用序列的方式傳入Q0~Q7的狀態(high or low)到內部register,然後輸出時chip依照register值去拉Q0~Q7的狀態
可以使用少數腳位一次控制Q0~Q7的狀態,此外由於此chip可以串接,所以可以一次控制更多腳位
下列圖來源: http://arduino.cc/en/uploads/Tutorial/595datasheet.pdf
74HCT595N腳位:
從文件可以知道,74HCT595N有兩個register(8bit):
從文件可以知道,SHcp/STcp最高可運作在100Mhz(每個clock 10ns)
實做:
Arduino可使用我寫的library操作74HCT595N:
簡單控制74HCT595N的範例程式碼:
========================================================
相關連結
待續
可以使用序列的方式傳入Q0~Q7的狀態(high or low)到內部register,然後輸出時chip依照register值去拉Q0~Q7的狀態
可以使用少數腳位一次控制Q0~Q7的狀態,此外由於此chip可以串接,所以可以一次控制更多腳位
下列圖來源: http://arduino.cc/en/uploads/Tutorial/595datasheet.pdf
74HCT595N腳位:
- VCC:5V
- GND
- Ds: serial data in
- Q0~Q7: 8根輸出pin
- Q7': storage register對應到Q7的bit,最為多顆chip 串接用
- MR: (active low) 清空shift register
- OE: (active low)
- 若OE拉low,STcp raising時,將storage輸出至Q0~Q7
- 若OE拉high,Q0~Q7輸出為高阻抗(相當於沒接上這顆chip)
- SHcp: raising edge trigger, 觸發shift register shift 1 bit(新的1bit資料由Ds取)
- STcp: raising edge trigger
從文件可以知道,74HCT595N有兩個register(8bit):
- shift register - 序列資料輸入時使用
- storage register - 控制Q0~Q7輸出時為high or low
從文件可以知道,SHcp/STcp最高可運作在100Mhz(每個clock 10ns)
- 由此可得知下面範例SHcp/STcp拉high/low時,每次delay只要5ns,不過由於Arduino delay最小只能用1 micro second,所以設定delayMicroseconds(1)即可
基本原理
- 透過序列的方式將資料傳入shift register
- 將shift register資料傳入storage register
- 每個SHcp raising edge,資料會一直輸入進去chip的shift register
- Q0'~Q7'代表shift register的值
- Serial date寫入方向:
- Ds > Q0' > Q1' > Q2' > Q3' > Q4' > Q5' > Q6' > Q7'
- 輸出到Q0~Q7
範例:
- 連接
- chip 接上VCC/GND
- micro controller gpio 接上Ds/MR/OE/SHcp/STcp
- 初始化:
- Ds/MR/OE/SHcp/STcp全部拉low
- 此時由於MR為low,shift register全部清為0
- STcp LOW->HIGH->LOW,將shift register的值寫入storage register
- 此時由於OE為LOW,storage register的值馬上會輸出至Q0~Q7
- 資料寫至shift register
- 將MR 拉HIGH
- 將Q7的值設到Ds, SHcp LOW->HIGN->LOW將資料移入shift register
- 將Q6的值設到Ds, SHcp LOW->HIGN->LOW將資料移入shift register
- 將Q5的值設到Ds, SHcp LOW->HIGN->LOW將資料移入shift register
- 將Q4的值設到Ds, SHcp LOW->HIGN->LOW將資料移入shift register
- 將Q3的值設到Ds, SHcp LOW->HIGN->LOW將資料移入shift register
- 將Q2的值設到Ds, SHcp LOW->HIGN->LOW將資料移入shift register
- 將Q1的值設到Ds, SHcp LOW->HIGN->LOW將資料移入shift register
- 將Q0的值設到Ds, SHcp LOW->HIGN->LOW將資料移入shift register
- 將資料從shift register移到storage register
- STcp LOW->HIGH->LOW
- 此時由於OE為LOW,storage register的值馬上會輸出至Q0~Q7
- 使用MTADRL293D 電機驅動模組,其中
- Ds: Arduino pin 8
- MR: 固定拉high
- OE: Arduino pin 7
- SHcp: Arduino pin 4
- STcp: Arduino pin 12
Arduino可使用我寫的library操作74HCT595N:
- https://github.com/cy-arduino/arduino_lib_MTADRL293D <== 74HCT595N 控制的library包含在此
簡單控制74HCT595N的範例程式碼:
const int DS = 8;
const int OE = 7;
const int SHCP = 4;
const int STCP = 12;
void setup(){
Serial.begin(115200);
while (!Serial){
;
}
delay(1000);
Serial.println("=== setup() ===");
pinMode(DS, OUTPUT);
pinMode(OE, OUTPUT);
pinMode(SHCP, OUTPUT);
pinMode(STCP, OUTPUT);
digitalWrite(DS, LOW);
digitalWrite(OE, HIGH); //Q0~Q7 維持高阻抗
digitalWrite(SHCP, LOW);
digitalWrite(STCP, LOW);
}
void loop(){
Serial.println("=== loop() ===");
delay(1000);
//serial data input into serial register
//Q0~Q7: 00001111
Serial.println("##serial data input into serial register");
digitalWrite(DS, HIGH);//Q7
digitalWrite(SHCP, HIGH);
delayMicroseconds(1);
digitalWrite(SHCP, LOW);
delayMicroseconds(1);
digitalWrite(DS, HIGH);//Q6
digitalWrite(SHCP, HIGH);
delayMicroseconds(1);
digitalWrite(SHCP, LOW);
delayMicroseconds(1);
digitalWrite(DS, HIGH);//Q5
digitalWrite(SHCP, HIGH);
delayMicroseconds(1);
digitalWrite(SHCP, LOW);
delayMicroseconds(1);
digitalWrite(DS, HIGH);//Q4
digitalWrite(SHCP, HIGH);
delayMicroseconds(1);
digitalWrite(SHCP, LOW);
delayMicroseconds(1);
digitalWrite(DS, LOW);//Q3
digitalWrite(SHCP, HIGH);
delayMicroseconds(1);
digitalWrite(SHCP, LOW);
delayMicroseconds(1);
digitalWrite(DS, LOW);//Q2
digitalWrite(SHCP, HIGH);
delayMicroseconds(1);
digitalWrite(SHCP, LOW);
delayMicroseconds(1);
digitalWrite(DS, LOW);//Q1
digitalWrite(SHCP, HIGH);
delayMicroseconds(1);
digitalWrite(SHCP, LOW);
delayMicroseconds(1);
digitalWrite(DS, LOW);//Q0
digitalWrite(SHCP, HIGH);
delayMicroseconds(1);
digitalWrite(SHCP, LOW);
delayMicroseconds(1);
delay(1000);
//serial register -> storage register
Serial.println("##serial register -> storage register");
digitalWrite(STCP, HIGH);
delay(10);
digitalWrite(STCP, LOW);
delay(10);
delay(1000);
//storage register -> Q0~Q7
Serial.println("##storage register -> Q0~Q7");
digitalWrite(OE, LOW);
delay(1000);
Serial.println("##finish");
while(true){
;
}
}
========================================================
相關連結
- http://ruten-proteus.blogspot.tw/2012/11/io-74hc595-ic.html
- http://arduino.cc/en/tutorial/ShiftOut#.Uw19LvmSyXo
- http://arduino.tw/articlesindex/extend-io/213-74hc595.html
- http://arduino.cc/en/uploads/Tutorial/595datasheet.pdf
待續
2014年2月25日 星期二
MTADRL293D 馬達(電機)驅動模組 - 簡介/控制直流馬達
這個模組買來沒有電路圖,也沒有說明,版子又做成Arduino shield的樣式,完全不知道腳位對應
控制範例:
google只找到一些購物網站,只有普通簡介,完全沒有講細節
上面主要有兩種chip:
- 74HCT595N *1
- 計數器轉換暫存器
- 相關連結
- L293D *2
- 每棵可控制兩顆直流馬達或是一顆四線式步進馬達
- 相關連結
MTADRL293D主要功能:
- RESET
- 與Arduino 的RESET接在一起
- POWER JUMP
- 接上代表MTADRL293D的電池同時供電給arduino
- 電池正極(V+)接到Arduino VIN(Arduino內部可以自己轉成5V VCC)
- 兩路servo控制(只是幫忙轉換腳位,實際上還是使用Arduino 輸出的PWM控制)
- servo 1:直接接到Arduino pin 10
- servo 2:直接接到Arduino pin 9
- servo VCC: Arduino 5V <==不是直接接到MTADRL293D的BATT,或是由他降壓
- 四路馬達控制:
- M1
- EN: (PWM2A) 接到Arduino pin 11
- 電源: V+
- M2
- EN: (PWM2B) 接到Arduino pin 3
- 電源: V+
- M4
- EN: (PWM0B) 接到Arduino pin 5
- 電源: V+
- M3
- EN: (PWM0A) 接到Arduino pin 6
- 電源: V+
- 兩路四線式步進馬達控制
- 待續...
控制範例:
#include "MTADRL293D.h"
MTADRL293D l293d;
void setup(){
Serial.begin(115200);
while (!Serial){
;
}
delay(5000);
Serial.println("=== loop() ===");
l293d.enableDbg(true);
l293d.begin();
l293d.setMotorDir(MTADRL293D_M1, MTADRL293D_DIR_POS);
l293d.setMotorDir(MTADRL293D_M2, MTADRL293D_DIR_POS);
l293d.setMotorDir(MTADRL293D_M3, MTADRL293D_DIR_POS);
l293d.setMotorDir(MTADRL293D_M4, MTADRL293D_DIR_POS);
l293d.setMinMotorSpeed(MTADRL293D_M1, 100);
l293d.setMinMotorSpeed(MTADRL293D_M2, 100);
l293d.setMinMotorSpeed(MTADRL293D_M3, 100);
l293d.setMinMotorSpeed(MTADRL293D_M4, 100);
l293d.setMotorSpeed(MTADRL293D_M1, 0);
l293d.setMotorSpeed(MTADRL293D_M2, 0);
l293d.setMotorSpeed(MTADRL293D_M3, 0);
l293d.setMotorSpeed(MTADRL293D_M4, 0);
}
void loop(){
Serial.println("=== loop() ===");
Serial.println("=== m1 pos 100");
l293d.setMotorDir(MTADRL293D_M1, MTADRL293D_DIR_POS);
l293d.setMotorSpeed(MTADRL293D_M1, 100);
delay(3000);
Serial.println("=== m1 0");
l293d.setMotorSpeed(MTADRL293D_M1, 0);
delay(1000);
Serial.println("=== m1 neg 100");
l293d.setMotorDir(MTADRL293D_M1, MTADRL293D_DIR_NEG);
l293d.setMotorSpeed(MTADRL293D_M1, 100);
delay(3000);
Serial.println("=== m1 0");
l293d.setMotorSpeed(MTADRL293D_M1, 0);
delay(1000);
Serial.println("=== m3 pos 100");
l293d.setMotorDir(MTADRL293D_M3, MTADRL293D_DIR_POS);
l293d.setMotorSpeed(MTADRL293D_M3, 100);
delay(3000);
Serial.println("=== m3 0");
l293d.setMotorSpeed(MTADRL293D_M3, 0);
delay(1000);
Serial.println("=== m3 neg 100");
l293d.setMotorDir(MTADRL293D_M3, MTADRL293D_DIR_NEG);
l293d.setMotorSpeed(MTADRL293D_M3, 100);
delay(3000);
Serial.println("=== m3 0");
l293d.setMotorSpeed(MTADRL293D_M3, 0);
delay(1000);
}
訂閱:
意見 (Atom)























