競速自走車

Download Report

Transcript 競速自走車

競速自走車
主講者
張 育 誠
競速自走車影片
循跡自走車
Line Tracer
Singapore Robo Grand Prix 2009
2009年第五屆人工智慧單晶片競速自走車決賽
2009 日本RoboTracer
2009 日本自走車比賽
競速場地說明
自走車設計
認識InnoRacer
InnoRacer 簡介:
1.BC2 核心
2.USB程式下載
3.BASIC 語言及函數指令控制
4.提供數位及類比PID控制
5.具馬達轉速回饋及過載保護功能
6.跑道記憶功能
7.內建G-Sensor, 提供彎道曲率計算
8.額外cmdbus模組擴充功能
9.適合教育學習及比賽用車
BC2核心
反射式紅外
線感測器
萬向滾珠輪
感測器校正
按鈕
系統重置按
鈕
Buzzer發聲元
件
Cmdbus模組
外接接頭
按鈕及燈號
操作
馬達速度控
制晶片M1
跑道記憶控
制晶片P1
馬達驅動晶
片
遙控模型競
技用海綿胎
加速度感測器
16000rpm 附
編碼器驅動
馬達
6V 2200mah
NiMh電池
IR紅外線感測器
CH
數位
ST
數位
數位
數位
類比
BC2
USB
CMDBUS
按鈕及
LED燈號
操作
馬達速度控制晶
片M1
跑道記憶控
制晶片P1
EEPROM
記憶體
加速度感
測器
馬達驅動
晶片
馬達(左)
Motor
馬達驅動
晶片
編碼器
(左)
Encoder
編碼器
(右)
Encoder
馬達(右)
Motor
Buzzer發聲
元件
按鈕及LED燈號操作
IR紅外線感測器
CH
數位
ST
數位
數位
數位
類比
BC2
USB
CMDBUS
按鈕及
LED燈號
操作
馬達速度控制晶
片M1
跑道記憶控
制晶片P1
EEPROM
記憶體
加速度感
測器
馬達驅動
晶片
馬達(左)
Motor
馬達驅動
晶片
編碼器
(左)
Encoder
編碼器
(右)
Encoder
馬達(右)
Motor
Buzzer發聲
元件
USB
Btn1
Led2
Btn2
Led3
Btn3
Led4
Btn4
P23
P22
P21
P20
P19
P18
P17
P16
…..
Led1
BC2
…..
實驗一: LED控制
‘===========說明: 依序點亮與熄滅四個LED=========================
SUB Main()
Dim bLED As Byte ' 儲存要設定的LED腳位
'-----------------------------------------------------------------------'
無窮迴圈,反覆亮滅LED
'-----------------------------------------------------------------------DO
'-----------------------------------------------------------------------'
FOR迴圈,依序設定控制腳位20~23的LED,讓各LED點亮0.5秒
'-----------------------------------------------------------------------For bLED=20 To 23
HIGH bLED
' 點亮bLED腳位設定的LED
PAUSE 500
' 暫停0.5秒
LOW bLED
' 熄滅bLED腳位設定的LED
PAUSE 500
' 暫停0.5秒
Next
LOOP
End SUB
實驗二: 按鈕與LED
‘==說明: 依序偵測四個按鈕,執行點亮LED的動作=====
#DEFINE BUTTON_1 16
#DEFINE BUTTON_2 17
#DEFINE BUTTON_3 18
#DEFINE BUTTON_4 19
Sub Main()
Dim bCnt1 As Byte = 0
Dim bCnt2 As Byte = 0
Dim bCnt3 As Byte = 0
Dim bCnt4 As Byte = 0
BEGIN:
Pause 10 ' 等待 10 ms
‘依序偵測四個按鈕是否有被按下
‘並在偵測到按下後跳到對應的標籤位置
Button BUTTON_1, 0, 255, 20, bCnt1, 1, TURN_ON_LED1
Button BUTTON_2, 0, 255, 20, bCnt2, 1, TURN_ON_LED2
Button BUTTON_3, 0, 255, 20, bCnt3, 1, TURN_ON_LED3
Button BUTTON_4, 0, 255, 20, bCnt4, 1, TURN_ON_LED4
Goto BEGIN ' 回到開始位置
‘執行點亮LED的副程序
TURN_ON_LED1:
TurnOnLED(20)
Goto BEGIN ' 回到開始位置
TURN_ON_LED2:
TurnOnLED(21)
Goto BEGIN ' 回到開始位置
TURN_ON_LED3:
TurnOnLED(22)
Goto BEGIN ' 回到開始位置
TURN_ON_LED4:
TurnOnLED(23)
Goto BEGIN ' 回到開始位置
End Sub
Sub TurnOnLED(bLED As Byte)
High bLED
Pause 500
Low bLED
Pause 500
End Sub
' 點亮bLED腳位設定的LED
‘ 暫停0.5秒
' 熄滅bLED腳位設定的LED
' 暫停0.5秒
如何控制馬達
IR紅外線感測器
CH
數位
ST
數位
數位
數位
類比
BC2
USB
CMDBUS
按鈕及
LED燈號
操作
馬達速度控制晶
片M1
跑道記憶控
制晶片P1
EEPROM
記憶體
加速度感
測器
馬達驅動
晶片
馬達(左)
Motor
馬達驅動
晶片
編碼器
(左)
Encoder
編碼器
(右)
Encoder
馬達(右)
Motor
Buzzer發聲
元件
BC2核心
馬達速度控
制晶片M1
馬達驅動晶
片
16000rpm 附
編碼器驅動
馬達
實驗三: 馬達控制
‘說明: 根據輸入值操作馬達動作,並設定停止方式
‘注意: 馬達轉動會讓自走車移動,請先墊高自走車讓輪胎離地,再開始測試
Peripheral myM As RacerM1 @ 3
' 設定馬達控制模組參數名稱
Sub Main()
Dim bKey As Byte
‘ 儲存輸入值
Dim iVelL, iVelR As Integer
' 左右輪控制參數
‘無窮迴圈,可以反覆輸入馬達控制參數
Do
Debug CLS
‘清除終端視窗顯示文字
Debugin "請輸入左輪參數(-1024~1024): ", iVelL
Debug iVelL, CR
Debugin "請輸入右輪參數(-1024~1024): ", iVelR
Debug iVelR, CR
myM.SetVelAB(iVelL, iVelR)
' 設定左右輪轉速與方向
Debugin "請決定停止方式(0: Stop, 1: Brake): ", bKey
Debug bKey, CR
If bKey=0 Then
myM.StopDual()
‘ 以Stop方式停止兩輪轉動
Else
myM.BrakeDual()
‘ 以Brake方式停止兩輪轉動
End If
Keyin "按下任意鍵繼續", %CHR bKey
LOOP
End Sub
IR紅外線感測器
IR紅外線感測器
CH
數位
ST
數位
數位
數位
類比
BC2
USB
CMDBUS
按鈕及
LED燈號
操作
馬達速度控制晶
片M1
跑道記憶控
制晶片P1
EEPROM
記憶體
加速度感
測器
馬達驅動
晶片
馬達(左)
Motor
馬達驅動
晶片
編碼器
(左)
Encoder
編碼器
(右)
Encoder
馬達(右)
Motor
Buzzer發聲
元件
調整感度
逆時針旋轉感度增加
順時針旋轉感度減少
IR感測器背面位置
有反射訊號時會亮紅
燈無反射則不亮
IR感測電壓感度調整晶片
萬向滾珠輪
IR感測器正面
IR感測器接收訊號端
IR感測器發射訊號端
最近辨識距離為d=2mm
d
最大辨識距離約為d=20mm (需調整可變電阻)
離地距離越近則辨識解析度越高
離地距離越遠則辨識解析度越低
特性曲線及電路
CH
IR0
IR1
IR2
IR3
IR4
…..
P11
P7
P6
P5
P4
P3
P2
P1
P0
USB
IR5
IR6
ST
…..
BC2
實驗前需利用可變電阻將所有感測器感度都調整成相同比例
實驗四: 紅外線感測
‘=========說明: 反覆偵測紅外線感測值,並顯示在終端視窗=======
Sub Main()
Dim bIR,ST,CH As Byte
' 儲存紅外線感測值
Debug CLS
' 清除終端視窗文字
Debug "紅外線感測值: “,CR ' 輸出文字訊息到終端視窗
Debug “
ST感測值: “,CR ' 輸出文字訊息到終端視窗
Debug “
CH感測值: " ' 輸出文字訊息到終端視窗
‘無窮迴圈,反覆偵測紅外線感測值
Do
bIR = Readport(0) ' 讀取紅外線感測器回傳值
ST=in(11)
CH=in(7)
Debug CSRXY(15, 1), %BIN bIR
Debug CSRXY(15, 2), %BIN ST
Debug CSRXY(15, 3), %BIN CH
' 以二進制顯示感測值於終端視窗
Loop
End Sub
紅外線尋跡控制
IR紅外線感測器
CH
數位
ST
數位
數位
數位
類比
BC2
USB
CMDBUS
按鈕及
LED燈號
操作
馬達速度控制晶
片M1
跑道記憶控
制晶片P1
EEPROM
記憶體
加速度感
測器
馬達驅動
晶片
馬達(左)
Motor
馬達驅動
晶片
編碼器
(左)
Encoder
編碼器
(右)
Encoder
馬達(右)
Motor
Buzzer發聲
元件
實驗五: 紅外線尋跡前進(3個感測器)
6
5
4
3
2
1
0
實驗五: 紅外線尋跡前進(3個感測器)
‘說明: 利用三組紅外線感測值,沿軌道行走。
Peripheral myM As RacerM1 @ 3 ' 設定馬達控制模組參數名稱
#DEFINE NORMAL_SPEED_R 170 ' 設定右輪直線速度值
#DEFINE NORMAL_SPEED_L 170 ' 設定左輪直線速度值
' 依序設定不同感測值的修改速度值
#DEFINE ERROR_1 80
#DEFINE ERROR_2 50
#DEFINE ERROR_3 30
#DEFINE ERROR_4
0
#DEFINE ERROR_5 -30
#DEFINE ERROR_6 -50
#DEFINE ERROR_7 -80
Sub Main()
Dim IR2, IR3, IR4, Sensor As Byte
‘存感測值
Dim R, L, Err As Integer
‘ 儲存左右輪轉速與誤差值
Pause 2000 ‘等待兩秒
‘無窮迴圈,反覆偵測軌道感測值,修正馬達轉向與速度
Do
IR2 = In(2) ‘ 取得第2腳位的感測值
IR3 = In(3) ‘ 取得第3腳位的感測值
IR4 = In(4) ‘ 取得第4腳位的感測值
Sensor = (100 * IR4) + (10 * IR3) + IR2
‘ 將偵測到的值拼為一個判斷值
‘根據感測器回傳值,判斷軌道位置並設定修改速度值
Select Sensor
Case 011
Err = ERROR_2
Case 001
Err = ERROR_3
Case 101
Err = ERROR_4
Case 100
Err = ERROR_5
Case 110
Err = ERROR_6
Case 111
If Err<0 Then
Err = ERROR_7
Elseif Err>0 Then
Err = ERROR_1
End If
Case 000
Err = ERROR_4
End Select
‘根據修改速度值,計算左右輪的轉速值
R = NORMAL_SPEED_R + Err
L = NORMAL_SPEED_L - Err
‘判斷是否超過模組極限值, 如果超過則設定為極限值
If R>1024 Then
R = 1024
Elseif R<-1024 Then
R = -1024
End If
If L>1024 Then
L = 1024
Elseif L<-1024 Then
L = -1024
End If
myM.SetVelAB(L, R) ‘根據計算結果設定模組速度值
Loop
End Sub
實驗五: 紅外線尋跡前進(7個感測器)
6
5
4
3
2
1
0
實驗六: 紅外線尋跡前進(7個感測器)
'說明: 利用七組紅外線感測值,沿軌道行走。
Peripheral myM As RacerM1 @ 3 '設定馬達控制模組參數名稱
#DEFINE NORMAL_SPEED_R 210 '設定右輪直線速度值
#DEFINE NORMAL_SPEED_L 210 '設定左輪直線速度值
'依序設定不同感測值的修改速度值
#DEFINE ERROR_1
230
#DEFINE ERROR_2
200
#DEFINE ERROR_3
120
#DEFINE ERROR_4
90
#DEFINE ERROR_5
60
#DEFINE ERROR_6
30
#DEFINE ERROR_7
0
#DEFINE ERROR_8
-30
#DEFINE ERROR_9
-60
#DEFINE ERROR_10
-90
#DEFINE ERROR_11
-120
#DEFINE ERROR_12
-200
#DEFINE ERROR_13
-230
Sub Stop() ‘停止副程式
myM.BrakeDual()
End Sub
Sub Main()
Dim Sensor As Byte
'儲存感測值
Dim R, L, Err As Integer '儲存左右輪轉速與修改速度值
Pause 1000
Do '無窮迴圈,反覆偵測軌道感測值,修正馬達轉向與速度
Sensor = Readport(0)
‘取得埠0的感測值
Sensor = Sensor And &H7F
‘根據感測器回傳值,判斷軌道位置並設定修改速度值
Select Case Sensor
Case &B0111111
Err = ERROR_1
Case &B0011111
Err = ERROR_2
Case &B1011111
Err = ERROR_3
Case &B1001111
Err = ERROR_4
Case &B1101111
Err = ERROR_5
Case &B1100111
Err = ERROR_6
Case &B1110111
Err = ERROR_7
Case &B1110011
Err = ERROR_8
Case &B1111011
Err = ERROR_9
Case &B1111001
Err = ERROR_10
Case &B1111101
Err = ERROR_11
Case &B1111100
Err = ERROR_12
Case &B1111110
Err = ERROR_13
Case &B1111111
Stop()
Goto FINISH '跳到結束標籤的位置
End Select
R = NORMAL_SPEED_R + Err ‘計算左右輪的轉速值
L = NORMAL_SPEED_L - Err
If R>1024 Then '判斷設定值是否超過模組極限值, 則設定為極限值
R = 1024
Elseif R<-1024 Then
R = -1024
End If
If L>1024 Then
L = 1024
Elseif L<-1024 Then
L = -1024
End If
myM.SetVelAB(L, R) ‘根據計算結果設定模組速度
Loop
FINISH:
End Sub
自走車控制理論介紹(PD控制)
IR紅外線感測器
CH
數位
ST
數位
數位
數位
類比
BC2
USB
CMDBUS
按鈕及
LED燈號
操作
馬達速度控制晶
片M1
跑道記憶控
制晶片P1
EEPROM
記憶體
加速度感
測器
馬達驅動
晶片
馬達(左)
Motor
馬達驅動
晶片
編碼器
(左)
Encoder
編碼器
(右)
Encoder
馬達(右)
Motor
Buzzer發聲
元件
軌跡預測1
Error=0
6
5
4
3
2
1
0
Error=100
軌跡預測2
6
5
4
3
2
1
0
Error=50
軌跡預測3
6
5
4
3
2
1
0
軌跡預測4
Error=50
軌跡預測5
Error=50
數位回授控制
比例微分控制法則(PD):
根據誤差值(Error)來調整左右輪的速度差
若是軌跡在中心軸左邊,誤差為負值,比例
控制根據誤差量調整右輪速度大於左輪速度;
反之亦然
若誤差持續擴大,微分控制可以加大速差
數位回授控制
Sd(n) = Kp*e(n) + Kd[e(n)-e(n-1)]
S(n)=S_normal-Sd(n)
Kp
速度控制
指令
+
+
Motor
-
+
微分
自走車在
軌跡上的
位置
Kd
IR sensor
回授
計算Error值
數位回授控制
誤差值(Error)與左右輪速度變化值
Speed
右輪速度命令
左輪速度命令
由回授控制決定變化曲線
馬達反轉點
0
Error
實驗七: PD控制
‘說明: 使用PID控制自走車沿軌道行走。
Peripheral myM As RacerM1 @ 3 ' 設定馬達控制模組參數名稱
#DEFINE KP
1 ' 設定PID的參數值
#DEFINE KI
0
#DEFINE KD
10
#DEFINE SCALE
0
#DEFINE NORMAL_SPEED_R
250 ' 設定右輪直線速度值
#DEFINE NORMAL_SPEED_L
250 ' 設定左輪直線速度值
#DEFINE ERROR_1
360 ' 設定不同感測結果的誤差設訂值
#DEFINE ERROR_2
280
#DEFINE ERROR_3
180
#DEFINE ERROR_4
130
#DEFINE ERROR_5
80
#DEFINE ERROR_6
40
#DEFINE ERROR_7
0
#DEFINE ERROR_8
-40
#DEFINE ERROR_9
-80
#DEFINE ERROR_10
-130
#DEFINE ERROR_11
-180
#DEFINE ERROR_12
-280
#DEFINE ERROR_13
-360
Sub Stop() ‘停止副程式
myM.BrakeDual()
End Sub
Sub Main()
Dim Sensor As Byte
‘ 儲存感測值
Dim R, L As Integer
‘ 儲存左右輪轉速與誤差值
Dim Integral As Integer
‘ 儲存誤差積分值
Dim Derivative As Integer
‘ 儲存誤差微分值
Dim Err, PreErr As Integer
‘ 儲存前一次的誤差值
Dim Out As Integer
‘ 儲存PID計算結果
Dim Control As Integer
‘ 儲存PID控制值
Out
=0
Integral
=0
PreErr
=0
Pause 1000
DO ‘無窮迴圈,反覆偵測黑線感測值,修正馬達轉向與速度
Sensor = Readport(0) And &B01111111
' 取得埠0的感測值
Select Case Sensor ‘根據感測器回傳來判斷軌道位置並設定誤差
Case &B0111111
Err = ERROR_1
Case &B0011111
Err = ERROR_2
Case &B1011111
Err = ERROR_3
Case &B1001111
Err = ERROR_4
Case &B1101111
Err = ERROR_5
Case &B1100111
Err = ERROR_6
Case &B1110111
Err = ERROR_7
Case &B1110011
Err = ERROR_8
Case &B1111011
Err = ERROR_9
Case &B1111001
Err = ERROR_10
Case &B1111101
Err = ERROR_11
Case &B1111100
Err = ERROR_12
Case &B1111110
Err = ERROR_13
Case &B1111111
Stop()
Goto FINISH
End Select
Integral
= Integral + Err ‘PID計算公式
Derivative = Err - PreErr
Out
= (KP * Err) + (KI * Integral) + (KD * Derivative)
PreErr
= Err
Control
= Out >> SCALE
R = NORMAL_SPEED_R + Control ‘根據誤差值計算左右輪的轉速值
L = NORMAL_SPEED_L - Control
If R>1024 Then
‘判斷設定值是否超過模組極限值, 則設定為極限值
R = 1024
Elseif R<-1024 Then
R = -1024
End If
If L>1024 Then
L = 1024
Elseif L<-1024 Then
L = -1024
End If
myM.SetVelAB(L, R) ‘根據計算結果設定模組速度值
Loop
FINISH:
End Sub
M1內建PD控制
IR紅外線感測器
CH
數位
ST
數位
數位
數位
類比
BC2
USB
CMDBUS
按鈕及
LED燈號
操作
馬達速度控制晶
片M1
跑道記憶控
制晶片P1
EEPROM
記憶體
加速度感
測器
馬達驅動
晶片
馬達(左)
Motor
馬達驅動
晶片
編碼器
(左)
Encoder
編碼器
(右)
Encoder
馬達(右)
Motor
Buzzer發聲
元件
M1內建感測器校正功能
利用M1內建PD控制時
需要先完成M1內建之IR紅外線感測器感度校正
校正程序方法為:
1.按下CAL_BTN按鈕一直到紅色CAL_LED亮起 (約按住5秒)
2.此時將InnoRacer平放在競速場地中 並對齊跑道白線
3.並以馬達軸線與白線的交插點為圓心將車子旋轉
4.以一定速度緩慢的將所有IR紅外線感測器來回劃過白線部份
5.完成以上動作之後再按下CAL_BTN按鈕以結束校正
實驗八: M1內建PD控制
'說明: 使用RacerM1模組,使用內建PID控制,偵測跑道行駛。
Sub Main()
Peripheral myM1 As RacerM1 @ 3 ' 設定馬達控制模組參數名稱
Dim bIr AS BYTE
#DEFINE PID_P
4 'M1模組內部PID參數值 (0 ~ 255)
Debug CLS ‘ 清除終端視窗文字
#DEFINE PID_I
0
InitM1()
‘ 執行設定模組副程序
#DEFINE PID_D
40
Do '反覆偵測紅外線感測值,值到判斷軌道在中間位置
#DEFINE PID_SCALE
0
myM1.GetIR(bIr)
'取得紅外線感測值
#DEFINE IR_POWER 70
’設定紅外線感測強度
Loop Until (bIr And &B1000) '判斷軌道是否在中間
‘模組內部最高最低速限,以及直線速度 (-1024 ~ 1024)
Pause 3000
#DEFINE
MAX_SPEED_L
1024
myM1.SpdCtrlOn(0)
‘ 啟動PID速度控制
#DEFINE
MAX_SPEED_R
1024
Do '無窮迴圈
#DEFINE
CENTER_SPEED_L
220
Loop
#DEFINE
CENTER_SPEED_R
220
End
Sub
#DEFINE
MIN_SPEED_L
-1024
#DEFINE
MIN_SPEED_R
-1024
'模組各別感測階段的誤差值 (0 ~ 127)
#DEFINE ERROR_1
10
#DEFINE ERROR_2
20
#DEFINE ERROR_3
32
#DEFINE ERROR_4
45
#DEFINE ERROR_5
70
#DEFINE ERROR_6
90
Sub InitM1() '設定M1模組各項預設值
‘設定M1模組內部PID參數值
myM1.SetP(PID_P)
myM1.SetI(PID_I)
myM1.SetD(PID_D)
myM1.SetScalar(PID_SCALE)
myM1.SetIRThreshold(IR_POWER)
‘設定M1模組內部最高最低速限,以及直線速度
myM1.SetSpdCtrlA(MIN_SPEED_L, MAX_SPEED_L)
myM1.SetSpdCtrlB(MIN_SPEED_R, MAX_SPEED_R)
myM1.SetStraight(CENTER_SPEED_L, CENTER_SPEED_R)
‘設定M1模組各別感測階段的誤差值
myM1.SetErrScale(ERROR_1, ERROR_2, ERROR_3, ERROR_4, ERROR_5, ERROR_6)
End Sub
進階IR紅外線感測器類比控制
IR紅外線感測器
CH
數位
ST
數位
數位
數位
類比
BC2
USB
CMDBUS
按鈕及
LED燈號
操作
馬達速度控制晶
片M1
跑道記憶控
制晶片P1
EEPROM
記憶體
加速度感
測器
馬達驅動
晶片
馬達(左)
Motor
馬達驅動
晶片
編碼器
(左)
Encoder
編碼器
(右)
Encoder
馬達(右)
Motor
Buzzer發聲
元件
類比感測器數值正規化
調整前值域
調整後值域
IR0
=0~350
IR0
=0~400
IR1
=20~480
IR1
=0~400
IR2
=50~330
IR2
=0~400
IR3
=7~457
IR3
=0~400
IR4
=0~545
IR4
=0~400
IR5
=100~350
IR5
=0~400
IR6
=14~407
IR6
=0~400
類比感測器數值正規化
Y輸出值  Y最小值
Y最大值  Y最小值

X輸入值  X最小值 X最大值  X最小值
 Y最大值  Y最小值 
Y輸出值  Y最小值  
 *  X輸入值  X最小值 
 X最大值  X最小值 
每顆感測器的類比輸出特性會因實際狀況而有所差異
因此需透過演算法將感測器輸出調整至相同的值域範圍
二次曲線預測
跑道中心
跑道線
數位
類比
y  ax2  bx  c
回饋訊號
大小(V)
感測器與跑道線相對位置(V)
1. 透過IR感測器類比式回授可更精準得知感測器相對於跑道現的偏移量
2. 類比回授訊號曲線可近似於一二次曲線 y  ax  bx  c
2
二次曲線預測
y  ax2  bx  c
跑道中心
1. 取最大三個感測器回授值
代入聯立合併計算,可求
出a,b,c之數值
2. 透過微分則可得知二次曲
線頂點位置 x   b 2a
3. 如此可得知跑道中心位置
跑道線
回饋訊號
大小(V)
e  3 x
4. 相較於數位預測更為精準
感測器與跑道線相對位置(V)
0
1
2
3
4
5
6
實驗九: M1內建PD控制(類比)
'說明: 使用RacerM1模組,使用內建PID控制,偵測跑道行駛。
Sub Main()
Peripheral myM1 As RacerM1 @ 3 ' 設定馬達控制模組參數名稱
Dim bIr AS BYTE
#DEFINE PID_P 4 'M1模組內部PID參數值 (0 ~ 255)
Debug CLS ‘ 清除終端視窗文字
#DEFINE PID_I 0
InitM1()
‘ 執行設定模組副程序
#DEFINE PID_D 40
Do
'反覆偵測紅外線感測值,值到判斷軌道在中間位置
#DEFINE PID_SCALE 0
myM1.GetIR(bIr)
'取得紅外線感測值
#DEFINE IR_MODE 1
‘設定紅外線感測模式
Loop Until (bIR And &B1000) '判斷軌道是否在中間
#DEFINE IR_POWER 70
’設定紅外線感測強度
Pause 3000
‘模組內部最高最低速限,以及直線速度 (-1024 ~ 1024)
myM1.SpdCtrlOn(0)
‘ 啟動PID速度控制
#DEFINE
MAX_SPEED_L
1024
Do '無窮迴圈
#DEFINE
MAX_SPEED_R
1024
Loop
#DEFINE
CENTER_SPEED_L
220
End
Sub
#DEFINE
CENTER_SPEED_R
220
#DEFINE
MIN_SPEED_L
-1024
#DEFINE
MIN_SPEED_R
-1024
#DEFINE ERROR_1 10 ‘模組各別感測階段的誤差值 (0 ~ 127)
#DEFINE ERROR_2 20
#DEFINE ERROR_3 32
#DEFINE ERROR_4 45
#DEFINE ERROR_5 70
#DEFINE ERROR_6 90
Sub InitM1() '設定M1模組各項預設值
myM1.SetP(PID_P) ‘設定M1模組內部PID參數值
myM1.SetI(PID_I)
myM1.SetD(PID_D)
myM1.SetScalar(PID_SCALE)
myM1.SetIRMode(IR_MODE) ‘類比數位選擇
myM1.SetIRThreshold(IR_POWER)
‘設定M1模組內部最高最低速限,以及直線速度
myM1.SetSpdCtrlA(MIN_SPEED_L, MAX_SPEED_L)
myM1.SetSpdCtrlB(MIN_SPEED_R, MAX_SPEED_R)
myM1.SetStraight(CENTER_SPEED_L, CENTER_SPEED_R)
‘設定M1模組各別感測階段的誤差值
myM1.SetErrScale(ERROR_1, ERROR_2, ERROR_3, ERROR_4, ERROR_5, ERROR_6)
End Sub
加速度感測器
IR紅外線感測器
CH
數位
ST
數位
數位
數位
類比
BC2
USB
CMDBUS
按鈕及
LED燈號
操作
馬達速度控制晶
片M1
跑道記憶控
制晶片P1
EEPROM
記憶體
加速度感
測器
馬達驅動
晶片
馬達(左)
Motor
馬達驅動
晶片
編碼器
(左)
Encoder
編碼器
(右)
Encoder
馬達(右)
Motor
Buzzer發聲
元件
BC2核心
加速度感測
器
跑道記憶控
制晶片P1
1. 輪胎抓地力決定過彎向心加速度極限值
2. 每台自走車都會有在過彎時的向心加速度極限值
3. 利用過彎時產生的向心加速度值來決定要用多少速度過彎
實驗十: 加速度感測器
‘說明: 使用RacerP1模組,反覆偵測加速度感測值,並顯示在終端視窗。
Peripheral myP1 As RacerP1 @ 4 ' 設定多功能感測模組參數名稱
Sub Main()
Dim iX, iY As Integer
Debug CLS
Debug CSRXY(1,1), "加速度感測值"
‘無窮迴圈,反覆偵測紅外線感測值
Do
myP1.GetG(iX, iY)
‘ 取得加速度感測值
Debug CSRXY(1,2), “X: ”, CSRXY(4, 2), %DEC5R iX
Debug CSRXY(1,3), “Y: ”, CSRXY(4, 3), %DEC5R iY
Loop
End Sub
‘ 顯示X軸向加速度
‘ 顯示Y軸向加速度
跑道資料紀錄控制
IR紅外線感測器
CH
數位
ST
數位
數位
數位
類比
BC2
USB
CMDBUS
按鈕及
LED燈號
操作
馬達速度控制晶
片M1
跑道記憶控
制晶片P1
EEPROM
記憶體
加速度感
測器
馬達驅動
晶片
馬達(左)
Motor
馬達驅動
晶片
編碼器
(左)
Encoder
編碼器
(右)
Encoder
馬達(右)
Motor
Buzzer發聲
元件
實驗十一: 繞圈紀錄資料
‘說明: 使用RacerM1與RacerP1模組,使用內建PID控制,
SUB InitP1()
'設定P1模組各項預設值
‘偵測跑道行駛,並在行駛中紀錄跑道資訊
myP1.SetCrossTime(CROSS_TIME)
Peripheral myM1 As RacerM1 @ 3 '設定馬達控制模組參數名稱
'設定經過交叉軌道判斷時間
Peripheral myP1 As RacerP1 @ 4 '設定多功能感測模組參數名稱
myP1.AutoBeep(1)
'設定經過曲率變化點發出提醒
#DEFINE BRAKE_TIME
300 '設定停止時間
END SUB
#DEFINE CROSS_TIME
20
'設定交叉軌道判斷時間
Sub Main() '主程式
#DEFINE PID_P
17 'M1模組內部PID參數值 (0 ~ 255)
Dim Status As Byte
#DEFINE PID_I
0
Dim bIR As Byte
Debug CLS
'清除終端視窗文字
#DEFINE PID_D
115
InitM1()
'執行設定模組副程序
#DEFINE PID_SCALE
0
'模組內部最高最低速限,以及直線速度 (-1024 ~ 1024)
InitP1()
Do '反覆偵測紅外線感測值,值到判斷軌道在中間位置
#DEFINE
MAX_SPEED_L
1024
myM1.GetIR(bIr)
'取得紅外線感測值
#DEFINE
MAX_SPEED_R
1024
Loop Until (bIR And &B1000) '判斷軌道是否在中間
#DEFINE
CENTER_SPEED_L
220
myP1.StartRec(1)
'啟動紀錄
#DEFINE
CENTER_SPEED_R
220
Do 'Do迴圈,判斷是否進入紀錄狀態
#DEFINE
MIN_SPEED_L
-1024
#DEFINE
MIN_SPEED_R
-1024
myP1.GetRecStatus(Status)
'模組各別感測階段的誤差值 (0 ~ 127)
Loop Until Status=1
myM1.SpdCtrlOn(0)
'啟動PID速度控制
#DEFINE ERROR_1
1
Do 'Do迴圈,判斷是否偵測到開始點
#DEFINE ERROR_2
3
#DEFINE ERROR_3
7
myP1.GetRecStatus(Status)
#DEFINE ERROR_4
15
Loop Until Status=2
Do 'Do迴圈,判斷是否偵測到結束點
#DEFINE ERROR_5
25
#DEFINE ERROR_6
37
myP1.GetRecStatus(Status)
Sub InitM1() '設定M1模組各項預設值
Loop Until Status=0
myM1.SetP(PID_P) ‘設定M1模組內部PID參數值
myP1.StopRec()
‘結束紀錄
Pause BRAKE_TIME
‘等待停止時間
myM1.SetI(PID_I)
myM1.BrakeDual()
'停止左右輪
myM1.SetD(PID_D)
myM1.SetScalar(PID_SCALE)
End Sub
‘設定M1模組內部最高最低速限,以及直線速度
myM1.SetSpdCtrlA(MIN_SPEED_L, MAX_SPEED_L)
myM1.SetSpdCtrlB(MIN_SPEED_R, MAX_SPEED_R)
myM1.SetStraight(CENTER_SPEED_L, CENTER_SPEED_R)
'設定M1模組各別感測階段的誤差值
myM1.SetErrScale(ERROR_1, ERROR_2, ERROR_3, ERROR_4, ERROR_5, ERROR_6)
End Sub
實驗十二: 讀取紀錄值
'說明: 使用RacerP1模組,讀取儲存的紀錄資料。
Peripheral myP1 As RacerP1 @ 4 ' 設定多功能感測模組參數名稱
Sub Main() ‘主程式
Dim i As Byte
'路段讀取累加值
Dim bDir As Byte
'儲存曲率半徑方向值
Dim bSecCnt As Byte
'儲存路段數
Dim iGx, iGy As Integer
'儲存加速度感測值
Dim dwLenR, dwLenL As Dword ‘儲存路段距離值
Dim dwRad As Dword
'儲存曲率半徑
myP1.GetSecCnt(bSecCnt) '取得上次紀錄的總路段數
For i=0 To bSecCnt 'For迴圈依序取得各路段的資料
Debug "路段: ", %DEC3R i, CR
myP1.GetSecLen(i, dwLenR, dwLenL)
Debug "右輪距離: ", %DEC9R dwLenR, CR
Debug "左輪距離: ", %DEC9R dwLenL, CR
myP1.GetSecAvgG(i, iGx, iGy)
Debug "X軸向平均值: ", %DEC5R iGx, CR
Debug "Y軸向平均值: ", %DEC5R iGy, CR
myP1.GetSecMaxG(i, iGx, iGy)
Debug "X軸向最大值: ", %DEC5R iGx, CR
Debug "Y軸向最大值: ", %DEC5R iGy, CR
myP1.GetSecRadius(i, bDir, dwRad)
Debug "曲率半徑方向: ", bDir
Debug "曲率半徑: ", %DEC9R dwRad,CR,CR
Next
End Sub
直線加減速測試
實驗十三: 繞圈加減速控制
'說明: 使用RacerM1與RacerP1模組,在通過起始點後讀取總距離
‘並進行加速,超過設定距離再執行停止動作
SUB InitP1()
'設定P1模組各項預設值
myP1.SetCrossTime(CROSS_TIME) '設定經過交叉軌道判斷時間
END SUB
Sub Main()
DIM Status As Byte
DIM IR As Byte
DIM bCnt1 As Word
DIM LenR, LenL As Word
Debug CLS
'清除終端視窗文字
bCnt1 =0
InitM1()
'執行設定模組副程序
InitP1()
WAIT_BUTTON:
Do '判斷是否按下開始按鈕
Button(16, 0, 255, 255, bCnt1, 1, RACE_ROUND)
Loop
RACE_ROUND:
Do '反覆偵測紅外線感測值,值到判斷軌道在中間位置
myM1.GetIR(IR)
Loop Until (IR And &B1000)
Pause 2000
myP1.StartRec(0)
'開始紀錄資訊
Do 'Do迴圈,判斷是否進入紀錄狀態
myP1.GetRecStatus(Status)
Loop Until Status=1
myM1.SpdCtrlOn(0)
'啟動PID速度控制
Do 'Do迴圈,判斷是否偵測到開始點
myP1.GetRecStatus(Status)
Loop Until Status=2
myM1.SetStraight(CRAZY_SPEED_L, CRAZY_SPEED_R)
'設定高速
Do
myP1.GetTotalLen(LenR, LenL)
Loop Until LenL>STOP_TACH
myM1.BrakeDual()
'停止左右輪
myP1.StopRec()
'結束紀錄
Goto WAIT_BUTTON
END SUB
Peripheral myM1 As RacerM1 @ 3 '設定馬達控制模組參數名稱
Peripheral myP1 As RacerP1 @ 4 '設定多功能感測模組參數名稱
#DEFINE BRAKE_TIME
300 '設定停止時間
#DEFINE CROSS_TIME
20
'設定交叉軌道判斷時間
#DEFINE PID_P 17 'M1模組內部PID參數值 (0 ~ 255)
#DEFINE PID_I 0
#DEFINE PID_D 115
#DEFINE PID_SCALE 0
'模組內部最高最低速限,以及直線速度 (-1024 ~ 1024)
#DEFINE MAX_SPEED_L
1024
#DEFINE MAX_SPEED_R
1024
#DEFINE CENTER_SPEED_L 220
#DEFINE CENTER_SPEED_R 220
#DEFINE MIN_SPEED_L
-1024
#DEFINE MIN_SPEED_R
-1024
#DEFINE CRAZY_SPEED_L 450 '設定高速與開始剎車距離
#DEFINE CRAZY_SPEED_R 450
#DEFINE STOP_TACH
100
#DEFINE ERROR_1 1 '模組各別感測階段的誤差值 (0 ~ 127)
#DEFINE ERROR_2 3
#DEFINE ERROR_3 7
#DEFINE ERROR_4 15
#DEFINE ERROR_5 25
#DEFINE ERROR_6 37
SUB InitM1() '設定M1模組各項預設值
myM1.SetOutsideMode(2)
'設定離開軌道的動作
myM1.SetP(PID_P) '設定M1模組內部PID參數值
myM1.SetI(PID_I)
myM1.SetD(PID_D)
myM1.SetScalar(PID_SCALE)
'設定M1模組內部最高最低速限,以及直線速度
myM1.SetSpdCtrlA(MIN_SPEED_L, MAX_SPEED_L)
myM1.SetSpdCtrlB(MIN_SPEED_R, MAX_SPEED_R)
myM1.SetStraight(CENTER_SPEED_L, CENTER_SPEED_R)
'設定M1模組各別感測階段的誤差值
myM1.SetErrScale(ERROR_1, ERROR_2, ERROR_3, ERROR_4, ERROR_5, ERROR_6)
End Sub
InnoRacer整合控制
IR紅外線感測器
CH
數位
ST
數位
數位
數位
類比
BC2
USB
CMDBUS
按鈕及
LED燈號
操作
馬達速度控制晶
片M1
跑道記憶控
制晶片P1
EEPROM
記憶體
加速度感
測器
馬達驅動
晶片
馬達(左)
Motor
馬達驅動
晶片
編碼器
(左)
Encoder
編碼器
(右)
Encoder
馬達(右)
Motor
Buzzer發聲
元件
實驗十四: 繞圈加速整合控制
1.
2.
3.
4.
請直接參考inb 檔
試著調整各項參數
Button 2 跑道紀錄
Button 1 開始競速
如何才能讓車子跑的快?
如何才能讓車子跑的快?
1. 足夠的速度
2. 適當的PD設定
3. 適當的Error比例
4. 將跑道資訊充份利用
5. 更多段的變速
6. 足夠的磨擦力
7. 跑道與輪子的清潔
8. 適當的輪距與軸距
9. 更輕的電池
10. 適當的配重
革命尚未成功 同志仍需努力
The
END