3、Pico Robot 基础开发课程
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度的位置。