推動cdio創新教學 - aero.fcu.edu.t · motor shield v2 使用2個tb6612 mosfet馬達驅動ic...
TRANSCRIPT
推動CDIO創新教學計算機程式語言 / 電子電路學
MATLAB for Arduino
Support Package
1
Motor Shield V2馬達驅動擴展板
Motor Shield V2
使用2個TB6612 MOSFET馬達驅動IC 與1個16頻道PWM
驅動晶片(PCA9685)與I2C介面連接,可有效地驅動步進馬達(Stepper motor)/伺服馬達(Servo motor)/直流馬達(DC
motor)。
2
TB6612
PCA9685
數位接腳
類比接腳外接電源
5~12V
電源
能連接2個伺服馬達
Tower Pro SG90 伺服馬達 : 三條線顏色分別是紅(電源) 、棕(接地)、橘(訊號)
Servo ①橘(訊號) 接腳,使用數位接腳D10
Servo ②橘(訊號) 接腳,使用數位接腳D9
3
①
②
http://yehnan.blogspot.tw/2013/09/arduinotower-pro-sg90.html
能連接4個直流馬達
4
M1
M2
M4
M3
能連接2個步進馬達
28BYJ-48 四相五線(藍粉黃橘紅)步進馬達
藍粉黃橘為4組線圈,紅色為接地
5
https://sites.google.com/site/csjhmaker/d-dong-li-pian/28byj-48-bu-jin-ma-da
一圈 2048步
28BYJ-48 Stepper Motor and ULN2003 Driver Intro
① ②
Motor Shield V2馬達驅動擴展板,採用疊層設計,可將Arduino Uno的全部數位與類比介面擴展出來
6
MATLAB for Arduino 提供Adafruit Motor Shield V2的函式庫(library),馬達驅動的程式語法相當容易
使用以下程式碼建立馬達與驅動擴展板的連結
7
%指派Arduino板代號為a_board,並使用Adafruit/MotorshieldV2 library
a_board = arduino('COM3','Uno','Libraries','Adafruit/MotorshieldV2');
%使用addon指令建立驅動擴展板的連結,指派驅動擴展板代號為motor_shield
motor_shield = addon(a_board,'Adafruit/MotorshieldV2');
MATLAB for Arduino 馬達控制範例影片
8
9
Tower Pro SG90 伺服馬達
Tower Pro SG90 伺服馬達
三條線顏色分別是紅(電源) 、棕(接地)、橘(訊號)
所需PWM脈衝訊號波範圍約為0.5~2.4ms, 也就是0.510-3
~ 2.410-3 s,轉動角度範圍可設定 0o~180o
10
Arduino練習:伺服馬達以Tower Pro SG90為例
伺服馬達簡介
Tower Pro SG90 伺服馬達0o~180o轉動範例
在這個範例中,使用Adafruit/MotorshieldV2函式庫中servo/readPosition/writePosition的指令來調控伺服馬達的輸出
s = servo(argument引數): creates a servo motor connection
with the specified motor number on an Adafruit® Motor
Shield.
s = servo(shield, motornum)
shield :馬達驅動擴展板代號
motornum : 連接至馬達驅動擴展板的伺服馬達位置(1或2)
11
位置 “2”
位置 “1”
建立伺服馬達與驅動板的連結
也可再依據各廠牌伺服馬達規格,設定所需PWM脈衝訊號範圍
s = servo(shield, motornum, Name, Value)
Name :引數名稱
'MinPulseDuration' :最小脈衝時間(對應伺服馬達最小角度)
'MaxPulseDuration' : 最大脈衝時間(對應伺服馬達最大角度)
Value :引數相對應的數值
12
範例:
step_m = servo(MT_shield,1);
表示在名為MT_shield馬達驅動擴展板上的第1個伺服馬達接腳,連接1個伺服馬達,並將此伺服馬達指派名為step_m
範例:
step_m = servo(MT_shield,1,...
'MinPulseDuration', 6.0*10^-4,...
'MaxPulseDuration', 2.1*10^-3);
表示step_m伺服馬達最小脈衝訊號時間0.6ms/最大脈衝訊號時間2.1ms,分別對應其最小與最大角度
position = readPosition(argument引數): reads the position of the motor shaft and returns the value of the position in ratio to the maximum angle of the specified servo motor.position = readPosition(s)
s :馬達驅動擴展板上連接的伺服馬達代號
position讀取值為0~1間的數值,若馬達的轉動範圍為0o~180o,則0代表0o / 1代表180o ,假設s的讀取值為0.5則其對應角度為0.5180o=36o
13
範例:
current_pos = readPosition(step_m);
current_angle = current_pos*180;fprintf('Current motor position is %6.2f degrees\n',current_angle)
讀取step_m伺服馬達介於0~1數值位置後,再轉換為角度
讀取伺服馬達的轉動位置/角度
writePosition(argument引數): sets servo position to the specified value.
writePosition(s, position)
s :馬達驅動擴展板上連接的伺服馬達代號
position :為0~1間的數值,代表伺服馬達轉動軸到達的位置,
14
範例:
writePosition(step_m,0.5);
若馬達的轉動範圍為0o~180o,step_m伺服馬達轉至0.5,相當於0.5180o = 36o
設定伺服馬達轉動的角度
15
將Tower Pro SG90 伺服馬達連接至Motor Shield V2馬達驅動擴展板servo1的腳位
此範例設定伺服馬達:(可依馬達規格進行調整)
最小脈衝訊號時間0.6ms(MinPulseDuration)
最大脈衝訊號時間2.1ms(MaxPulseDuration)
分別對應其最小(0o)與最大角度(180o)
開始來寫個簡單的程式吧!
①
Tower Pro SG90 伺服馬達0o~180o轉動程式範例
16
clear;clc;
%指派Arduino板代號為a_board,並使用Adafruit/MotorshieldV2 library
a_board = arduino('COM3','Uno','Libraries','Adafruit/MotorshieldV2');
%使用addon指令建立驅動擴展板的連結,指派驅動擴展板代號為MT_shield
MT_shield = addon(a_board,'Adafruit/MotorshieldV2');
%表示伺服馬達連接於馬達驅動擴展板上的第1組接腳step_m伺服馬達最小脈衝訊號時間0.6ms/最大脈衝訊號時間2.1ms,%此範例分別對應其最小(0度)與最大角度(180度)
step_m = servo(MT_shield,1,'MinPulseDuration', 0.6*10^-3,...
'MaxPulseDuration', 2.1*10^-3);
no = 10;%取點數目m_position = linspace(0,1,no); %0~1間取no點,第1點0,最後一點10
writePosition(step_m,0);pause(0.5)%伺服馬達轉回至0點位置
%使用for迴圈執行此no點的角度for i = 1:length(m_position)
%使用writePosition執行馬達角度轉動%若馬達的轉動範圍為0~180度,step_m伺服馬達轉至m_position(i)
%相當於 m_position(i)x180度writePosition(step_m,m_position(i));
17
%使用readPosition讀取step_m伺服馬達介於0~1數值位置後,%再轉換為角度current_pos = readPosition(step_m);
current_angle = current_pos*180;
fprintf('Current motor position is %6.2f degrees\n',current_angle)
pause(0.5)
end
clear % 執行完後清除
執行結果
18servo_motor_01.mp4
19
Light Meter Project
Tower Pro SG90 伺服馬達 +
光敏电阻(Photoresistor/
Light-Dependent Resistor, LDR)
Light Meter Project
20
https://www.mathworks.com/videos/arduino-light-meter-project-part-1-
develop-an-algorithm-in-matlab-106499.html
使用 Tower Pro SG90 伺服馬達 + 光敏电阻(Photoresistor/Light-Dependent Resistor, LDR) 組成一個光照強度量測系統
伺服馬達角度變化
0o 光照強度最強 writePosition(s, 0)
180o 光照強度最弱 writePosition(s, 1)
之前範例光敏電阻量測結果
光照強度最強壓降值設定 = 0.01V 對應 0o
光照強度最弱壓降值設定 = 4.99V 對應 180o
21
光照強時 光照不足時 全暗時
壓降 0.02V電阻值 40Ω
壓降 1.5V電阻值 4.3kΩ
壓降 4.8V電阻值 234kΩ
可依據前述資訊設計一個光照強度量測系統,量測光照強度
這個範例使用2個迴路:
光敏電阻迴路: 感測外界環境光照強度,由Motor Shield V2
馬達驅動擴展板的類比接腳輸入,並藉由此訊號決定光照強度量測系統的動作,為光照強度量測系統的 “輸入(input)”
端,馬達轉動角度可由以下關係求得:
伺服馬達迴路: 接受Motor Shield V2馬達驅動擴展板的輸出訊號,執行光照強度量測系統的動作,為光照強度量測系統的 “輸出(output)”端 writePosition(s, position)
22
)01.099.4(
01.01)~(0
光敏電阻量測值
position
光照強度量測系統輸入/輸出
23
10kΩ
輸入 輸出
①
將光敏電阻壓降輸出連接至類比A0腳位,讀取光敏電阻兩端的壓降值,以判定光照強度,計算伺服馬達轉動角度
24
10kΩ
①
光照強度量測系統Arduino接線線路
25
①
光照強度量測系統程式範例
26
clear;clc;
%指派Arduino板代號為a_board,並使用Adafruit/MotorshieldV2 library
a_board = arduino('COM3','Uno','Libraries','Adafruit/MotorshieldV2');
%使用addon指令建立驅動擴展板的連結,指派驅動擴展板代號為MT_shield
MT_shield = addon(a_board,'Adafruit/MotorshieldV2');
%表示step_m伺服馬達最小脈衝訊號時間0.6ms/最大脈衝訊號時間2.1ms,%此範例分別對應其最小(0度)與最大角度(180度)
step_m = servo(MT_shield,1,'MinPulseDuration', 0.6*10^-3,...
'MaxPulseDuration', 2.1*10^-3);
no = 10;%取點數目m_position = linspace(0,1,no); %0~1間取no點,第1點0,最後一點10
writePosition(step_m,0);pause(0.5)%伺服馬達轉回至0點位置
%使用for迴圈執行此no點的角度for i = 1:length(m_position)
%使用writePosition執行馬達角度轉動%若馬達的轉動範圍為0~180度,step_m伺服馬達轉至m_position(i)
%相當於 m_position(i)x180度writePosition(step_m,m_position(i));
27
%使用readPosition讀取step_m伺服馬達介於0~1數值位置後,%再轉換為角度current_pos = readPosition(step_m);
current_angle = current_pos*180;
fprintf('Current motor position is %6.2f degrees\n',current_angle)
pause(0.5)
end
clear % 執行完後清除
執行結果
28servo_photoresistor.mp4
可以試著在這系統再加上一個LED迴路,隨著光照強度改變明暗度,但因伺服馬達連接在馬達驅動擴展板上的第1個servo接腳,數位接腳D10已被使用,所以LED迴路的數位輸出接腳不可使用D10
29
220Ω
10kΩ①
30
DC 直流馬達
DC 直流馬達轉動範例
在這個範例中,使用Adafruit/MotorshieldV2函式庫中dcmotor/start/stop的指令來調控直流馬達的輸出
dcm = dcmotor(argument引數): creates a DC motor
connection with the specified motor number on an Adafruit®
Motor Shield connected to an Arduino® board.
dcm = dcmotor(dev,motornum)
dev :馬達驅動擴展板代號
motornum : 連接至馬達驅動擴展板的直流馬達位置(1/2/3/4)
31
建立直流馬達與驅動板的連結
直流馬達接腳位置(1/2/3/4)
32
位置 “2”
位置 “1”
位置 “3”
位置 “4”
也可設定直流馬達轉動速度dcm = dcmotor(dev,motornum, Name, Value)
Name :引數名稱
'Speed' : 直流馬達速度
Value :引數對應數值,直流馬達速度速度設定值介於-1~1之間
此外,直流馬達速度設定亦可使用以下程式語法:
33
範例:
dc_m = dcmotor(MT_shield,4,'Speed',0.5);
表示dc_m直流馬達速度設定為0.5
範例:
dc_m = dcmotor(MT_shield,4);
dc_m.Speed = 0.5;
範例:
dc_m = dcmotor(MT_shield,4);
表示在名為MT_shield馬達驅動擴展板上的第4個直流馬達接腳,連接1個直流馬達,並將此直流馬達指派名為dc_m
start(argument引數): starts the DC motor. If the motor speed is set 0, the DC motor will not rotate.
start(dcm)
dcm :馬達驅動擴展板上連接的直流馬達代號
34
啟動直流馬達運轉
範例:
dc_m = dcmotor(MT_shield,4);
dc_m.Speed = 0.5;
start(dc_m)
stop(argument引數): stops the DC motor.
stop(dcm)
dcm :馬達驅動擴展板上連接的直流馬達代號
35
停止直流馬達運轉
範例:
dc_m = dcmotor(MT_shield,4);
dc_m.Speed = 0.5;
start(dc_m);
pause(5);
stop(dc_m);
36
將直流馬達連接至Motor Shield V2馬達驅動擴展板M4的腳位
開始來寫個簡單的程式吧!
④
DC 直流馬達轉動程式範例
37
clear;clc;
%指派Arduino板代號為a_board,並使用Adafruit/MotorshieldV2 library
a_board = arduino('COM3','Uno','Libraries','Adafruit/MotorshieldV2');
%使用addon指令建立驅動擴展板的連結,指派驅動擴展板代號為MT_shield
MT_shield = addon(a_board,'Adafruit/MotorshieldV2');
%直流馬達連接於馬達驅動擴展板上的第4個位置,並將此直流馬達指派名為dc_m
dc_m = dcmotor(MT_shield,4);
dc_m.Speed = 0.8; % 設定馬達速度為0.8
start(dc_m); %啟動馬達運轉pause(5);
dc_m.Speed = -0.1; %運轉5秒後馬達反轉速度為0.1
pause(5);
stop(dc_m); %運轉5秒後,停止馬達運轉clear; % 執行完後清除
執行結果
38dc_motor_01.mp4
可以試著在這系統再加上一個之前完成的感光燈系統迴路,隨著光照強度改變明暗度,並調控馬達速度,範例中的光敏電阻亦可由其它元件諸如可變電阻/熱敏電阻取代,不妨嘗試看看
39
40
28BYJ-48 四相五線步進馬達
能連接2個步進馬達
28BYJ-48 四相五線(藍粉黃橘紅)步進馬達
藍粉黃橘為4組線圈,紅色為接地
41
https://sites.google.com/site/csjhmaker/d-dong-li-pian/28byj-48-bu-jin-ma-da
一圈 2048步
28BYJ-48 Stepper Motor and ULN2003 Driver Intro
① ②
28BYJ-48 四相五線步進馬達
藍粉黃橘為4組線圈,紅色為接地
42
https://sites.google.com/site/csjhmaker/d-dong-li-pian/28byj-48-bu-jin-ma-da
28BYJ-48 Stepper Motor and ULN2003 Driver Intro
一圈 2048步
28BYJ-48 四相五線(藍粉黃橘紅)步進馬達轉動範例
在這個範例中,使用Adafruit/MotorshieldV2函式庫中stepper/move/release的指令來調控步進馬達的輸出
sm = stepper(argument引數): creates a stepper motor
connection with the specified motor number and steps per
revolution on an Adafruit® Motor Shield.
sm = stepper(shield,motornum,sprev)
shield :馬達驅動擴展板代號
motornum : 連接至馬達驅動擴展板的步進馬達位置(1/2)
sprev : 連接至馬達驅動擴展板的步進馬達每圈轉動步數
43
建立步進馬達與驅動板的連結
步進馬達接腳位置(1/2)
44
位置 “1” 位置 “2”
也可設定步進馬達每分鐘轉速(RPM)/激磁形式dcm = dcmotor(dev,motornum, Name, Value)
Name :引數名稱
'RPM' : 步進馬達每分鐘轉速
'StepType' : 步進馬達激磁形式
Value :引數對應值
'RPM' 對應數值
'StepType'對應 'Single' , 'Double' , 'Interleave' , 'Microstep'
45
範例:
stepper_m = stepper(MT_shield,2,2048,'RPM',15,
'StepType', 'Single');
表示stepper_m步進馬達轉速為15RPM,激磁形式為Single
範例:
stepper_m = stepper(MT_shield,2,2048);
表示在名為MT_shield馬達驅動擴展板上的第2個步進馬達接腳,連接1個步進馬達,並將此步進馬達指派名為stepper_m
此外,步進馬達轉速(RPM)設定亦可使用以下程式語法:
move(argument引數): rotates the stepper motor for the specified number of steps. The move command blocks MATLAB® while the stepper motor is rotating.
move(sm,steps)
sm :馬達驅動擴展板上連接的步進馬達代號
steps :步進馬達轉動步數
46
範例:
stepper_m = stepper(MT_shield,2,2048,'StepType',
'Single');
stepper_m.RPM = 15;
啟動步進馬達運轉
範例:
move(stepper_m,1024);
表示stepper_m步進馬達轉動1024步
release(argument引數): releases the stepper motor, allowing it to rotate freely.
release(sm)
sm :馬達驅動擴展板上連接的步進馬達代號
47
停止步進馬達運轉
範例:
stepper_m = stepper(MT_shield,2,2048,'StepType',
'Single');
stepper_m.RPM = 15;
move(stepper_m,1024);
release(stepper_m)
48
將步進馬達連接至Motor Shield V2馬達驅動擴展板M3M4的腳位
開始來寫個簡單的程式吧!
②
DC 直流馬達轉動程式範例
49
clear;clc;
%指派Arduino板代號為a_board,並使用Adafruit/MotorshieldV2 library
a_board = arduino('COM3','Uno','Libraries','Adafruit/MotorshieldV2');
%使用addon指令建立驅動擴展板的連結,指派驅動擴展板代號為MT_shield
MT_shield = addon(a_board,'Adafruit/MotorshieldV2');
%步進馬達連接於馬達驅動擴展板上的第2個位置,並將此直流馬達指派名為dc_m
stepper_m = stepper(MT_shield,2,2048,'stepType','single')
stepper_m.RPM = 15; % 設定馬達轉速15RPM
move(stepper_m,1024); % 馬達轉動1024步pause(0.1);
stepper_m.RPM = 2; % 設定馬達轉速2RPM
move(stepper_m,-1024); % 馬達反向 轉動1024步pause(0.1);
clear; % 執行完後清除
執行結果
50stepper_motor_01.mp4
可以試著在這系統再加上一個之前完成的感光燈系統迴路,隨著光照強度改變明暗度,並調控馬達速度,範例中的光敏電阻亦可由其它元件諸如可變電阻/熱敏電阻取代,不妨嘗試看看
51