PI Pico的一些有趣的基本實(shí)驗(yàn)
▲ 實(shí)驗(yàn)電路板
Raspberry PI Pico小型MCU模塊,以其價(jià)格低廉,功能豐富,開發(fā)方便為很多非電子類專業(yè)的同學(xué)進(jìn)行創(chuàng)意項(xiàng)目原型設(shè)計(jì)提供了方便的平臺(tái)。下面的一些實(shí)驗(yàn)給CDIE課程設(shè)計(jì)同學(xué)們制作的一些基本演示實(shí)驗(yàn)。
▌01 PI Pico實(shí)驗(yàn)板
在 RASPBERRY PI PICO 開發(fā)板 基礎(chǔ)測試[1] 給出了對(duì)PI Pico開發(fā)板的基本設(shè)置,通過 安裝Thonny開發(fā)環(huán)境[2] 可以方便對(duì)Pi Pico進(jìn)行初步的開發(fā)。
▲ Pi Pico電路板的正反面
本文下面根據(jù) Raspberry Pi Pico Python SDK[3] 中給的示例,對(duì)PI Pico的一些基本模塊進(jìn)行測試。
關(guān)于Pi Pico的管腳配置,可以參見 Pi Pico數(shù)據(jù)手冊(cè)[4] 中給出的Pi Pico管腳圖定義:
▲ Pi Pico管腳功能定義圖
更多PiPico的資料可以從:Pi Pico官方網(wǎng)站[5] 獲得。
▌02 基本測試
1.Flash LED on board
from machine import Pin,Timer from time import sleep_us led = Pin(25, Pin.OUT) tim = Timer() print("Flash LED.") def tick(timer): global led led.toggle() tim.init(freq=2, mode=Timer.PERIODIC, callback=tick)
▲ 實(shí)驗(yàn)電路板
2.UART
(1)測試程序
from machine import UART,Pin,Timer from time import sleep_us uart = UART(0, baudrate=115200, tx=Pin(0), rx=Pin(1), bits=8, parity=None, stop=1) led = Pin(25, Pin.OUT) tim = Timer() print("Send UART.") def tick(timer): global uart, led led.toggle() uart.write(b'\x55') tim.init(freq=10, mode=Timer.PERIODIC, callback=tick)
▲ 測試Pin(0)
▲ 測量Pin(0)的波形
3.ADC
通過ADC通道4,讀取芯片內(nèi)部溫度。在此過程中,使用手觸摸Pi Pico表面加熱,或者使用酒精噴灑芯片表面進(jìn)行降溫。
▲ 讀取芯片內(nèi)部的溫度
import machine import utime sensor_temp = machine.ADC(4) conversion_factor = 3.3/(65535) while True: read = sensor_temp.read_u16() * conversion_factor temperature = 27 - (read - 0.706) / 0.001721 print(temperature) utime.sleep(2)
▲ 顯示讀取的溫度值
▲ 讀取的溫度數(shù)值變化
4.PWM
(1)PWM驅(qū)動(dòng)LED
控制板載LED的波形是PWM運(yùn)行。
from machine import Pin,PWM import time pwm = PWM(Pin(25)) pwm.freq(1000) duty = 0 direction = 1 for _ in range(16*255): duty += direction if duty > 255: duty = 255 direction = -1 elif duty < 0: duty = 0 direction = 1 pwm.duty_u16(duty*duty) time.sleep(0.001)
PWM是軟件PWM,它可以設(shè)置在任意管腳上。初步測試過Pin0, 15, 16等等。都具有相類似波形。
▲ Pin25(驅(qū)動(dòng)LED)的波形變化
▲ LED亮度變化
(2)PWM驅(qū)動(dòng)舵機(jī)
舵機(jī)使用頻率為50Hz,脈沖寬度cs 1.0 ~ 2.0ms的脈沖作為控制信號(hào)。下面是產(chǎn)生基本舵機(jī)位置中間時(shí)的輸出控制脈沖。
from machine import Pin,PWM import time pwm = PWM(Pin(15)) pwm.freq(50) pwm.duty_u16(4915)
舵機(jī)具有三個(gè)接線:
- 棕色:GND
- 紅色:+4.5 ~ +6V
- 黃色:指令脈沖信號(hào)
▲ 舵機(jī)及其接口
計(jì)算Duty_16公式為:
對(duì)應(yīng)脈沖寬度與duty_u16之間的關(guān)系:
脈沖寬度(ms) | duty u16 |
---|---|
1 | 3277 |
1.5 | 4915 |
2 | 6554 |
▲ 輸出50Hz,1.5ms脈沖寬度
▲ 變化的PWM波形驅(qū)動(dòng)舵機(jī)旋轉(zhuǎn)
from machine import Pin,PWM import time pwm = PWM(Pin(16)) pwm.freq(50) for _ in range(100): pwm.duty_u16(3276) print("Out pulse width : 1ms") time.sleep(1) print("Out pulse with : 2ms.") pwm.duty_u16(6553) time.sleep(1)
(3)PWM+ADC實(shí)驗(yàn)
使用電位器將改變的電壓引入ADC(0),由單片機(jī)獲得對(duì)應(yīng)的ADC數(shù)值,改變PWM輸出,使其輸出的時(shí)間寬度從1ms等比例變化到2ms。
▲ 將電位器輸入ADC(0)
可以看到舵機(jī)的輸出角度隨著電位器的改變而發(fā)生變化。
▲ 旋轉(zhuǎn)電位器改變舵機(jī)的角度
from machine import Pin,PWM import time pwm = PWM(Pin(16)) pwm.freq(50) control = machine.ADC(0) for _ in range(1000): adc = control.read_u16() duty = int(adc * (6553-3276)/0xffff) + 3276 pwm.duty_u16(duty) time.sleep(0.1)
5.中斷IRQ
使用管腳PIN2的下降沿產(chǎn)生中斷。示例程序如下:
from machine import Pin p2 = Pin(2, Pin.IN, Pin.PULL_UP) p2.irq(lambda pin:print("IRQ with flag:", pin.irq().flags()), Pin.IRQ_FALLING)
使用跳線將PIN2接地。每一次等會(huì)觸發(fā)中斷發(fā)生一次。
▲ 將PIN2接地可以看到觸發(fā)了中斷
▌結(jié)論
通過幾個(gè)基礎(chǔ)的Pi Pico實(shí)驗(yàn),初步給出了該模塊的應(yīng)用實(shí)例。
參考資料
[1] RASPBERRY PI PICO 開發(fā)板 基礎(chǔ)測試: https://zhuoqing.blog.csdn.net/article/details/114037888
[2] 安裝Thonny開發(fā)環(huán)境: https://zhuoqing.blog.csdn.net/article/details/114064833
[3]Raspberry Pi Pico Python SDK: https://datasheets.raspberrypi.org/pico/raspberry-pi-pico-python-sdk.pdf
[4]Pi Pico數(shù)據(jù)手冊(cè): https://datasheets.raspberrypi.org/pico/pico-datasheet.pdf
[5]Pi Pico官方網(wǎng)站: https://www.raspberrypi.org/documentation/rp2040/getting-started/
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場,如有問題,請(qǐng)聯(lián)系我們,謝謝!