|
一、實(shí)驗(yàn)?zāi)康模?br />
?學(xué)習(xí)在PC機(jī)系統(tǒng)中擴(kuò)展簡(jiǎn)單I/O 接口的方法
?學(xué)習(xí)TurnipBit拼插編程
?了解舵機(jī)工作原理
?學(xué)習(xí)TurnipBit擴(kuò)展板舵機(jī)和旋轉(zhuǎn)按鈕接線方式
二、所需原器件:
?TurnipBit一塊
?TurnioBit擴(kuò)展板一塊
?杜邦線若干
?usb數(shù)據(jù)線一條
?舵機(jī)一個(gè)
?旋轉(zhuǎn)按鈕一個(gè)
三、實(shí)驗(yàn)原理:
1. 舵機(jī)的組成與參數(shù)
舵機(jī),又稱伺服馬達(dá),是一種具有閉環(huán)控制系統(tǒng)的機(jī)電結(jié)構(gòu)。舵機(jī)主要是由外殼、電路板、無核心馬達(dá)、齒輪與位置檢測(cè)器所構(gòu)成。 其工作原理是由控制器發(fā)出PWM(脈沖寬度調(diào)制)信號(hào)給舵機(jī),經(jīng)電路板上的IC處理后計(jì)算出轉(zhuǎn)動(dòng)方向,再驅(qū)動(dòng)無核心馬達(dá)轉(zhuǎn)動(dòng), 透過減速齒輪將動(dòng)力傳至擺臂,同時(shí)由位置檢測(cè)器(電位器)返回位置信號(hào),判斷是否已經(jīng)到達(dá)設(shè)定位置,一般舵機(jī)只能旋轉(zhuǎn)180度。
1.png (242.34 KB, 下載次數(shù): 43)
下載附件
2018-6-29 15:27 上傳
舵機(jī)的接線
舵機(jī)有3根線,棕色為地,紅色為電源正,橙色為信號(hào)線,但不同牌子的舵機(jī),線的顏色可能不同。
舵機(jī)的控制原理
舵機(jī)的轉(zhuǎn)動(dòng)的角度是通過調(diào)節(jié)PWM(脈沖寬度調(diào)制)信號(hào)的占空比來實(shí)現(xiàn)的。
占空比:
1.指高電平在一個(gè)周期之內(nèi)所占的時(shí)間比率。
2.正脈沖的持續(xù)時(shí)間與脈沖總周期的比值。例如:正脈沖寬度1μs,信號(hào)周期10μs的脈沖序列占空比為0.1。即:脈沖的寬度除以脈沖的周期稱為占空比。標(biāo)準(zhǔn)PWM(脈沖寬度調(diào)制)信號(hào)的周期固定為20ms(50Hz),理論上脈寬分布應(yīng)在1ms到2ms之間,但是,事實(shí)上脈寬可由0.5ms到2.5ms之間,脈寬和舵機(jī)的轉(zhuǎn)角0°~180°相對(duì)應(yīng)。
四、接線方法:
TurnipBit擴(kuò)展板與發(fā)光二極管接口對(duì)應(yīng)如下表:
2.png (13.43 KB, 下載次數(shù): 51)
下載附件
2018-6-29 15:27 上傳
五、源代碼:
- from microbit import *
-
- #-----------
- #github:https://github.com/microbit-playground/microbit-servo-class
- #------------
- class Servo:
- def __init__(self, pin, freq=50, min_us=600, max_us=2400, angle=180):
- self.min_us = min_us
- self.max_us = max_us
- self.us = 0
- self.freq = freq
- self.angle = angle
- self.analog_period = 0
- self.pin = pin
- analog_period = round((1/self.freq) * 1000) # hertz to miliseconds
- self.pin.set_analog_period(analog_period)
- def write_us(self, us):
- us = min(self.max_us, max(self.min_us, us))
- duty = round(us * 1024 * self.freq // 1000000)
- self.pin.write_analog(duty)
- self.pin.write_digital(0) # turn the pin off
- def write_angle(self, degrees=None):
- degrees = degrees % 360
- total_range = self.max_us - self.min_us
- us = self.min_us + total_range * degrees // self.angle
- self.write_us(us)
-
- sv1 = Servo(pin1)
- temp=0
- while True:
- #讀取旋轉(zhuǎn)按鈕傳入的值,范圍2~1023
- read_val=pin0.read_analog()
- #舵機(jī)旋轉(zhuǎn)180度,將1023分割成180份,約等于5.67
- angle=round(read_val/5.67)
- if (temp!=angle):
- temp=angle
- sv1.write_angle(angle)
- sleep(60)
復(fù)制代碼
|
|