3.1 控制板載LED燈閃爍
在上一節中,我們學習瞭如何搭建開發環境,並實現了執行程式控制板載LED閃爍,在這一節中我們將學習這部分程式是如何實現LED控制的。
一、學習目標
1. 學習樹莓派Pico主機板的引腳基本使用。
2. 瞭解如何控制板載的LED燈。
二、硬體使用
本次課程無需額外的硬體,直接利用樹莓派Pico主機板上的板載LED燈即可。
三、程式分析
完整程式位置:Pico Robot配套資料 -> 附件 -> 課程程式原始碼 -> 1.基礎課程 -> 1.板載LED燈.py
關於ThonnyIDE的使用,請檢視第二章課程。
1 import machine 2 import time 3 led_onboard = machine.Pin(25, machine.Pin.OUT) 4 5 while True: 6 led_onboard.value(1) 7 time.sleep(1) 8 led_onboard.value(0) 9 time.sleep(1)
import machine
機器庫包含MicroPython需要與Pico和其他MicroPython相容的裝置通訊的所有指令,擴充套件了物理計算的語言。
import time
“time”庫。 這個庫處理所有與時間有關的事情,從測量它到將延遲插入到程式中。單位為秒。
led_onboard = machine.Pin(25, machine.Pin.OUT)
第一個引數,25,是您正在設定的引腳的數量;第二個引數,machine.Pin.OUT告訴Pico,引腳應該用作輸出而不是輸入。
time.sleep(1)
這會從time庫呼叫sleep函式,這會使程式暫停您鍵入的任何秒數——在本例中為1秒。
四、實驗現象
程式下載完成之後,我們可以看到樹莓派Pico開發板上的LED燈每隔1秒閃爍。
3.2 板載溫度感測器
一、學習目標
1. 學習樹莓派Pico主機板的引腳ADC引腳基本使用。
2. 瞭解如何透過讀取板載溫度感測器的溫度。
二、硬體使用
本次課程無需額外的硬體,直接利用樹莓派Pico主機板上的溫度感測器。
Raspberry Pi Pico的RP2040微控制器是一種數字裝置,就像所有主流微控制器一樣:它由數千個電晶體組成,這些微小的開關式裝置要麼開啟,要麼關閉。 因此,你的PICO無法真正理解一個模擬訊號-它可以是完全關閉和完全開啟之間的頻譜上的任何東西-而不依賴額外的硬體:模擬數字轉換器(ADC)。
一個ADC有兩個關鍵的特點:它的解析度,以數字位測量,它的通道,或它可以接受和轉換多少模擬訊號一次。 您的PICO中的ADC的解析度為12位,這意味著它可以將模擬訊號轉換為數字訊號,其數字從0到4095不等-儘管這是在MicroPython中處理的,轉換為從0到65,535的16位數字,因此它的行為與其他MicroPython微控制器上的ADC相同。 它有三個通道被帶到GPIO引腳:GP26、GP27和GP28,它們也被稱為模擬通道0、1和2的GP26_ADC0、GP27_ADC1和GP28_ADC2。 還有第四個ADC通道,它連線到一個內建在RP2040中的溫度感測器。
三、程式分析
完整程式位置:Pico Robot配套資料 -> 附件 -> 課程程式原始碼 -> 1.基礎課程 -> 2.板載溫度感測器.py
1 import machine 2 import time 3 sensor_temp = machine.ADC(4) 4 conversion_factor = 3.3 / (65535) 5 while True: 6 reading = sensor_temp.read_u16() * conversion_factor 7 temperature = 27 - (reading - 0.706)/0.001721 8 print(temperature) 9 time.sleep(2)
import machine
機器庫包含MicroPython需要與Pico和其他MicroPython相容的裝置通訊的所有指令,擴充套件了物理計算的語言。
import time
“time”庫。 這個庫處理所有與時間有關的事情,從測量它到將延遲插入到程式中。單位為秒。
sensor_temp = machine.ADC(4)
使用ADC通道4,它連線到一個內建在RP2040中的溫度感測器。
conversion_factor = 3.3 / (65535)
這引腳電平為3.3V,轉換值上限為65535,所以根據此公式計算得電壓和數字的比。
reading = sensor_temp.read_u16() * conversion_factor
計算ADC讀取到的電壓值。
temperature = 27 - (reading - 0.706)/0.001721
根據電壓值計算出內建溫度感測器的溫度值。
time.sleep(2)
這會從utime庫呼叫sleep函式,這會使程式暫停您鍵入的任何秒數——在本例中為2秒。
四、實驗現象
程式下載完成之後,透過Thony的Shell視窗觀察到溫度值。
3.3 無源蜂鳴器
一、學習目標
1. 學習樹莓派Pico主機板和小車擴充套件板無源蜂鳴器結合進行實驗。
2. 瞭解有源蜂鳴器的使用。
二、硬體使用
本次課程使用PICO主機板以及小車板載無源蜂鳴器
無源蜂鳴器利用電磁感應現象,為音圈接入交變電流後形成的電磁鐵與永磁鐵相吸或相斥而推動振膜發聲,接入直流電只能持續推動振膜而無法產生聲音,在控制中我們一般使用PWM來控制無源蜂鳴器發出聲音。
三、程式分析
完整程式位置:Pico Robot配套資料 -> 附件 -> 課程程式原始碼 -> 1.基礎課程 -> 3.無源蜂鳴器.py
1 from machine import Pin, PWM 2 import time 3 # set buzzer pin 4 BZ = PWM(Pin(22)) 5 BZ.freq(1000) 6 # Initialize music 7 CM = [0, 330, 350, 393, 441, 495, 556, 624] 8 song = [CM[1],CM[1],CM[5],CM[5],CM[6],CM[6],CM[5],CM[4],CM[4],CM[3],CM[3],CM[2],CM[2],CM[1],] 9 beat = [ 0.5,0.5,0.5,0.5,0.5,0.5,1,0.5,0.5,0.5,0.5,0.5,0.5,1,] 10 # music 11 def music(): 12 print('Playing song ...') 13 for i in range(len(song)): 14 BZ.duty_u16(500) 15 BZ.freq(song[i]) 16 time.sleep(beat[i]) 17 BZ.duty_u16(0) 18 time.sleep(0.01) 19 # play music 20 music() 21 print("Ending")
from machine import Pin, PWM
機器庫包含MicroPython需要與Pico和其他MicroPython相容的裝置通訊的所有指令,擴充套件了物理計算的語言,這裡只用了Pin和PWM的庫。
import time
“time”庫。 這個庫處理所有與時間有關的事情,從測量它到將延遲插入到程式中。單位為秒。
BZ = PWM(Pin(22))
將IO22設定為PWM輸出引腳,用於控制蜂鳴器。
BZ.freq(1000)
將PWM頻率設定為1000。
BZ.duty_u16(0)
數值為0的時候關閉聲音,為500的時候開啟聲音。
music()
透過呼叫music()函式,函式內使用一個for迴圈,把事先寫好的不同頻率的聲音,一個一個播放出來,從而實現音樂的播放。
四、實驗現象
程式下載完成之後,我們就可以聽到蜂鳴器播放音樂 小星星,播放結束後Shell顯示 Ending。
3.4 呼吸燈
一、學習目標
1. 學習樹莓派Pico主機板和小車擴充套件板的可程式設計RGB燈結合進行實驗。
2. 瞭解可程式設計RGB燈的使用,實現呼吸燈效果。
二、硬體使用
本次課程使用PICO主機板以及小車板載可程式設計RGB燈
小車板載8顆可程式設計RGB燈,可以實現炫彩燈效,8顆可程式設計燈內建ws2812晶片,只需要一個埠透過時序控制即可同時控制8個燈,時序控制函式封裝在庫中,我們只需要呼叫設定燈的顏色即可。
三、程式分析
完整程式位置:Pico Robot配套資料 -> 附件 -> 課程程式原始碼 -> 1.基礎課程 -> 4.呼吸燈.py
1 import time 2 from pico_car import ws2812b 3 4 num_leds = 8 # Number of NeoPixels 5 # Pin where NeoPixels are connected 6 pixels = ws2812b(num_leds, 0) 7 # Set all led off 8 pixels.fill(0,0,0) 9 pixels.show() 10 # Define variables 11 i = 0 12 brightness = 0 13 fadeAmount = 1 14 # Breathing 15 while True: 16 for i in range(num_leds): 17 pixels.set_pixel(i,0,brightness,brightness) 18 pixels.show() 19 brightness = brightness + fadeAmount 20 if brightness <= 0 or brightness >= 200: 21 fadeAmount = -fadeAmount 22 time.sleep(0.005)
from pico_car import ws2812b
因為只亮燈,這裡只使用pico_car的ws2812b。
import time
“time”庫。 這個庫處理所有與時間有關的事情,從測量它到將延遲插入到程式中。單位為秒。
pixels = ws2812b(num_leds, 0)
初始化RGB燈,我們有8個RGB燈,這裡num_leds設定為8。
pixels.fill(0,0,0)
把所有的燈設定為0,0,0,也就是關閉所有燈,引數分別是(紅色,綠色,藍色),顏色亮度是0-255。
pixels.show()
把設定的燈顯示出來。
pixels.set_pixel(i,0,brightness,brightness)
透過這個函式設定每個燈的顏色,引數分別是(燈的編號,紅色,綠色,藍色),燈的編號從0開始,顏色亮度是0-255,例如說第一個亮紅色pixels.set_pixel(0,255,0,0)。
brightness = 0 fadeAmount = 1
透過控制這兩個值的加減來實現呼吸燈效果。
四、實驗現象
程式下載完成之後,我們可以看到車底下的燈以青色迴圈亮滅呼吸效果。
3.5 跑馬燈
一、學習目標
1. 學習樹莓派Pico主機板和小車擴充套件板的可程式設計RGB燈結合進行實驗。
2. 瞭解可程式設計RGB燈的使用,實現跑馬燈效果。
二、硬體使用
本次課程使用PICO主機板以及小車板載可程式設計RGB燈
小車板載8顆可程式設計RGB燈,可以實現炫彩燈效,8顆可程式設計燈內建ws2812晶片,只需要一個埠透過時序控制即可同時控制8個燈,時序控制函式封裝在庫中,我們只需要呼叫設定燈的顏色即可。
三、程式分析
完整程式位置:Pico Robot配套資料 -> 附件 -> 課程程式原始碼 -> 1.基礎課程 -> 5.跑馬燈.py
1 import time 2 from pico_car import ws2812b 3 4 num_leds = 8 # Number of NeoPixels 5 # Pin where NeoPixels are connected 6 pixels = ws2812b(num_leds, 0) 7 # Set all led 8 pixels.fill(10,10,10) 9 pixels.show() 10 # horse race lamp 11 while True: 12 for i in range(num_leds): 13 for j in range(num_leds): 14 #pixel_num, red, green, blue 15 pixels.set_pixel(j,abs(i+j)%10,abs(i-(j+3))%10,abs(i-(j+6))%10) 16 pixels.show() 17 time.sleep(0.05)
from pico_car import ws2812b
因為只亮燈,這裡只使用pico_car的ws2812b。
import time
“time”庫。 這個庫處理所有與時間有關的事情,從測量它到將延遲插入到程式中。單位為秒。
pixels = ws2812b(num_leds, 0)
初始化RGB燈,我們有8個RGB燈,這裡num_leds設定為8。
pixels.fill(10,10,10)
把所有的燈設定為10,10,10,引數分別是(紅色,綠色,藍色),顏色亮度是0-255。
pixels.show()
把設定的燈顯示出來。
pixels.set_pixel(j,abs(i+j)%10,abs(i-(j+3))%10,abs(i-(j+6))%10)
透過這個函式設定每個燈的顏色,引數分別是(燈的編號,紅色,綠色,藍色),燈的編號從0開始,顏色亮度是0-255,這裡透過兩個for迴圈設定變數值,實現跑馬燈效果。
四、實驗現象
程式下載完成之後,我們可以看到車底下的跑馬燈效果。
3.6 OLED顯示
一、學習目標
1. 學習樹莓派Pico主機板和小車擴充套件板的OLED螢幕結合進行實驗。
2. 瞭解OLED螢幕的使用。
二、硬體使用
本次課程使用PICO主機板以及小車擴充套件板的OLED螢幕,注意,執行本節例程之前,必須插上OLED螢幕,否則程式會報錯。
OLED螢幕是利用有機電自發光二極體製成的螢幕。由於同時具備自發光有機電激發光二極體,不需背光源、對比度高、厚度薄、視角廣、反應速度快、使用溫度範圍廣、構造及製程較簡單等優異之特性。我們使用的0.91寸OLED屏使用IIC通訊,節約了IO引腳,簡化了控制方式。
三、程式分析
完整程式位置:Pico Robot配套資料 -> 附件 -> 課程程式原始碼 -> 1.基礎課程 -> 6.OLED顯示.py
1 from machine import Pin, I2C 2 from pico_car import SSD1306_I2C 3 import time 4 # set IIC pin 5 i2c=I2C(1, scl=Pin(15),sda=Pin(14), freq=100000) 6 # initialization oled 7 oled = SSD1306_I2C(128, 32, i2c) 8 # oled show hello at 0,0 9 oled.text('Hello', 0, 0) 10 oled.show() 11 oled.fill(0) 12 time.sleep(1) 13 # oled show World at 0,10 14 oled.text('World', 0, 10) 15 oled.show() 16 oled.fill(0) 17 time.sleep(1) 18 # oled show spot at 100,30 19 oled.pixel(100, 30, 1) 20 oled.show() 21 oled.fill(0) 22 time.sleep(1)
from pico_car import SSD1306_I2C
使用pico_car 的SSD1306_I2C,這是我們封裝好的OLED庫。
import time
“time”庫。 這個庫處理所有與時間有關的事情,從測量它到將延遲插入到程式中。單位為秒。
from machine import Pin, I2C
機器庫包含MicroPython需要與Pico和其他MicroPython相容的裝置通訊的所有指令,擴充套件了物理計算的語言,這裡只用了Pin和I2C的庫。
i2c=I2C(1, scl=Pin(15),sda=Pin(14), freq=100000)
設定IIC 1引腳為SCL 15,SDA 14,頻率為100000。
oled = SSD1306_I2C(128, 32, i2c)
初始化OLED的大小為128*32,並把前面設定的IIC引數傳進去。
oled.text('Hello', 0, 0)
設定OLED在0,0的位置顯示'Hello'。
oled.show()
把設定的OLED內容顯示出來。
oled.fill(0)
清除設定的內容,準備下一次顯示。
oled.pixel(100, 30, 1)
設定OLED在座標100,30位置的畫素點點亮,如果oled.pixel(100, 30, 0)則是關閉座標100,30位置的畫素點。
四、實驗現象
程式下載完成之後,我們可以看到OLED先顯示 'Hello' ,然後在下面一行顯示 'World' ,然後在座標100,30的位置顯示一個點。
3.7 電池電量顯示
一、學習目標
1. 學習樹莓派Pico主機板和小車擴充套件板的電量檢測、OLED螢幕結合進行實驗。
2. 瞭解電量檢測的使用。
二、硬體使用
本次課程使用PICO主機板以及小車擴充套件板的電量檢測、OLED螢幕,注意,執行本節例程之前,必須插上OLED螢幕,否則程式會報錯。
電量檢測的硬體基本原理是透過電阻把電池電壓調整到合適的數值,輸入給主控,主控透過ADC去檢測電壓從而判斷電量。
三、程式分析
完整程式位置:Pico Robot配套資料 -> 附件 -> 課程程式原始碼 -> 1.基礎課程 -> 7.電池電量顯示.py
1 from machine import Pin, I2C, ADC 2 from pico_car import SSD1306_I2C 3 import time 4 5 #initialization oled 6 i2c=I2C(1, scl=Pin(15),sda=Pin(14), freq=100000) 7 oled = SSD1306_I2C(128, 32, i2c) 8 #initialization ADC 9 Quantity_of_electricity = machine.ADC(28) 10 11 while True: 12 #Display power on OLED 13 #Under 20000, there is no power at all 14 oled.text('Battery:', 0, 0) 15 oled.text(str(Quantity_of_electricity.read_u16()), 65, 0) 16 oled.show() 17 oled.fill(0) 18 time.sleep(0.1)
from pico_car import SSD1306_I2C
使用pico_car 的SSD1306_I2C。
import time
“time”庫。 這個庫處理所有與時間有關的事情,從測量它到將延遲插入到程式中。單位為秒。
from machine import Pin, I2C, ADC
機器庫包含MicroPython需要與Pico和其他MicroPython相容的裝置通訊的所有指令,擴充套件了物理計算的語言,這裡用了Pin、I2C和ADC的庫。
i2c=I2C(1, scl=Pin(15),sda=Pin(14), freq=100000)
設定IIC 1引腳為SCL 15,SDA 14,頻率為100000。
oled = SSD1306_I2C(128, 32, i2c)
初始化OLED的大小為128*32,並把前面設定的IIC引數傳進去。
Quantity_of_electricity = machine.ADC(28)
初始化ADC埠28。
oled.text(str(Quantity_of_electricity.read_u16()), 65, 0)
設定OLED在65,0的位置顯示電池電量的數值,我們透過Quantity_of_electricity.read_u16()來讀取ADC的值,透過str()函式把數值轉成字串,再由OLED顯示出來。
oled.show()
把設定的OLED內容顯示出來。
oled.fill(0)
清除設定的內容,準備下一次顯示。
四、實驗現象
程式下載完成之後,我們可以看到OLED顯示 'Battery:電池電量' ,這個電量會隨電壓變化而變化,經測試,當數值低於20000時電池處於低電量的狀態,小於25000處於中電量狀態。
3.8 舵機控制
一、學習目標
1. 學習樹莓派Pico主機板和小車擴充套件板的舵機介面、PWM舵機結合進行實驗。
2. 瞭解PWM舵機的使用。
二、硬體使用
本次課程使用PICO主機板以及小車擴充套件板的舵機介面、PWM舵機,PWM舵機連線時注意連線線的顏色和排針顏色應對應。
PWM舵機基本控制原理是,用PWM訊號產生週期為20ms,佔空比為0.5~2.5ms的訊號,從而控制舵機角度。
三、程式分析
完整程式位置:Pico Robot配套資料 -> 附件 -> 課程程式原始碼 -> 1.基礎課程 -> 8.舵機控制.py
1 from pico_car import pico_car 2 Servo = pico_car() 3 4 #180 servo S1 angle 0 5 #the parameters are (steering gear number, steering gear angle) 6 Servo.servo180(1,0) 7 #270 servo 8 Servo.servo270(2,90) 9 #360 servo 10 Servo.servo360(3,360)
from pico_car import pico_car
使用pico_car 的pico_car,裡面封裝好了舵機驅動庫。
Servo = pico_car()
初始化舵機。
Servo.servo180(1,0)
把180度PWM舵機S1角度設定為0度。
Servo.servo270(2,90)
把270度PWM舵機S2角度設定為90度。
Servo.servo360(3,360)
把360度PWM舵機S3角度設定為360度。
四、實驗現象
程式下載完成之後,我們可以看到S1-S3插的180度舵機、270度舵機、360度舵機分別到0度、90度、360度的位置。