













注意:电机速度受到电池电量影响,例程是在电池电量较高(电量数值在26000以上)的情况下,如果电池电量较低需要及时充电或者修改电机速度。
一、学习目标
1. 学习树莓派Pico主板和小车扩展板的电机结合进行实验。
2. 了解电机的使用。
二、硬件使用
本次课程使用PICO主板以及小车扩展板的电机,注意,运行例程会让小车向前跑1s,请避免前方有台阶,或者拿起小车以免损坏。

在小车的扩展板上我们集成了电机驱动电路,只需要使用PWM即可控制电机方向和转速,通过调整PWM的占空比,高电平时间越长电机速度越快。在电机内部,通过线圈将电流变成磁场,在磁铁的作用下实现电机的转动。
三、程序分析
完整程序位置:Pico Robot配套资料 -> 附件 -> 课程程序源码 -> 3.机器人课程 -> 1.小车前进.py
from pico_car import pico_car
使用pico_car 的pico_car,这是我们封装好的电机驱动库。
import time
“time”库。 这个库处理所有与时间有关的事情,从测量它到将延迟插入到程序中。单位为秒。
Motor = pico_car()
初始化电机驱动。
Motor.Car_Run(255,255)
控制小车前进,速度设置为255,参数分别为(左电机速度,右电机速度),速度范围0-255。
Motor.Car_Stop()
控制小车停止。
四、实验现象
程序下载完成之后,小车会以最大速度向前前进1s,然后停止。
在上一节,我们实现了小车的前进,在这一节我们会让小车前后左右运行。
注意:电机速度受到电池电量影响,例程是在电池电量较高(电量数值在26000以上)的情况下,如果电池电量较低需要及时充电或者修改电机速度。
一、学习目标
1. 学习树莓派Pico主板和小车扩展板的电机结合进行实验。
2. 了解电机的使用。
二、硬件使用
本次课程使用PICO主板以及小车扩展板的电机,注意,运行例程会让小车前后左右运动,请在空旷的地方,或者拿起小车运行程序,以免损坏。

在小车的扩展板上我们集成了电机驱动电路,只需要使用PWM即可控制电机方向和转速,通过调整PWM的占空比,高电平时间越长电机速度越快。在电机内部,通过线圈将电流变成磁场,在磁铁的作用下实现电机的转动。
三、程序分析
完整程序位置:Pico Robot配套资料 -> 附件 -> 课程程序源码 -> 3.机器人课程 -> 2.小车花式动作.py
from pico_car import pico_car
使用pico_car 的pico_car,这是我们封装好的电机驱动库。
import time
“time”库。 这个库处理所有与时间有关的事情,从测量它到将延迟插入到程序中。单位为秒。
Motor = pico_car()
初始化电机驱动。
Motor.Car_Run(255,255)
控制小车前进,速度设置为255,参数分别为(左电机速度,右电机速度),速度范围0-255。
Motor.Car_Stop()
控制小车停止。
Motor.Car_Back(255,255)
控制小车后退。
Motor.Car_Run(0,255)
控制小车左转。
Motor.Car_Run(255,0)
控制小车右转。
Motor.Car_Left(255,255)
控制小车左旋。
Motor.Car_Right(255,255)
控制小车右旋。
四、实验现象
程序下载完成之后,小车会以最大速度向前前进1s,然后向后1s,左转1s,右转1s,左旋1s,右旋1s,最后停止。
在上一节,我们实现了小车前后左右运行,在这一节我们把运动和3.3节的蜂鸣器音乐播放结合起来。
注意:电机速度受到电池电量影响,例程是在电池电量较高(电量数值在26000以上)的情况下,如果电池电量较低需要及时充电或者修改电机速度。
一、学习目标
1. 学习树莓派Pico主板和小车扩展板的电机、蜂鸣器、可编程RGB灯结合进行实验,在这一节我们会让小车一边运行一边播放音乐。
2. 了解电机和蜂鸣器的使用。
二、硬件使用
本次课程使用PICO主板以及小车扩展板的电机、可编程RGB灯和蜂鸣器,注意,运行例程会让小车前后左右运动,请在空旷的地方,或者拿起小车运行程序,以免损坏。
三、程序分析
完整程序位置:Pico Robot配套资料 -> 附件 -> 课程程序源码 -> 3.机器人课程 -> 3.小车唱歌跳舞.py
from pico_car import pico_car, ws2812b
使用pico_car 的pico_car和 ws2812b,封装了电机驱动和RGB灯库。
import time
“time”库。 这个库处理所有与时间有关的事情,从测量它到将延迟插入到程序中。单位为秒。
from machine import Pin, PWM
机器库包含MicroPython需要与Pico和其他MicroPython兼容的设备通信的所有指令,扩展了物理计算的语言,这里用了Pin和PWM的库。
Motor = pico_car()
初始化电机驱动。
Motor.Car_Run(255,255)
控制小车前进,速度设置为255,参数分别为(左电机速度,右电机速度),速度范围0-255。
Motor.Car_Stop()
控制小车停止。
Motor.Car_Back(255,255)
控制小车后退。
Motor.Car_Run(0,255)
控制小车左转。
Motor.Car_Run(255,0)
控制小车右转。
Motor.Car_Left(255,255)
控制小车左旋。
Motor.Car_Right(255,255)
控制小车右旋。
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,255,255,0)
使用for循环把所有车灯设置为黄色。
music_Run()
在这个函数中我们把之前蜂鸣器的播放音乐切成6个部分,每一部分分别运行小车不同的动作。
四、实验现象
程序下载完成之后,小车会踩点音乐,先前进并且RGB灯亮黄色,然后后退RGB灯亮青色,左转RGB灯亮紫色,右转RGB灯亮红色,左旋RGB灯亮绿色,右旋RGB灯亮蓝色,最后停止并关闭RGB灯。

在4.3节,我们把巡线传感器的检测结果显示在OLED上,这一节我们将利用巡线传感器来实现控制小车巡线。
注意:巡线传感器会受到光线影响,请在室内无太阳光照的环境下运行程序,以减少太阳光对巡线传感器的干扰。并且在巡线时需保持室内光线充足。
电机速度受到电池电量影响,例程是在电池电量较高(电量数值在26000以上)的情况下,如果电池电量较低需要及时充电或者修改电机速度。
一、学习目标
1. 学习树莓派Pico主板和小车扩展板的电机、OLED、巡线传感器、可编程RGB灯结合实现巡线。
2. 了解如何通过巡线传感器控制小车巡线。
二、硬件使用
本次课程使用PICO主板以及小车扩展板的电机、OLED、巡线传感器、可编程RGB灯,并且需要巡线地图

在程序中我们通过判断每个巡线传感器接收到的数据值,将结果分成七种不同的情况,确定小车的运行状态,从而实现小车巡线。
三、程序分析
完整程序位置:Pico Robot配套资料 -> 附件 -> 课程程序源码 -> 3.机器人课程 -> 4.巡线小车.py
from pico_car import pico_car, ws2812b, SSD1306_I2C
使用pico_car 的pico_car、ws2812b、SSD1306_I2C,封装了电机驱动和RGB灯、OLED库。
import time
“time”库。 这个库处理所有与时间有关的事情,从测量它到将延迟插入到程序中。单位为秒。
from machine import Pin, I2C
机器库包含MicroPython需要与Pico和其他MicroPython兼容的设备通信的所有指令,扩展了物理计算的语言,这里用了Pin和I2C的库。
Motor = pico_car()
初始化电机驱动。
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,255,0)
使用for循环把所有车灯设置为绿色。
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('Turn Right', 0, 0)
设置OLED在0,0的位置显示'Turn Right'。
oled.show()
把设置的OLED内容显示出来。
oled.fill(0)
清除设置的内容,准备下一次显示。
Motor.Car_Run(200,200)
控制小车前进,速度设置为200,参数分别为(左电机速度,右电机速度),速度范围0-255。
Motor.Car_Run(0,100)
控制小车左转。
Motor.Car_Run(100,0)
控制小车右转。
Motor.Car_Left(100,100)
控制小车左旋。
Motor.Car_Right(100,100)
控制小车右旋。
Tracing_1 = machine.Pin(2, machine.Pin.IN)
初始化引脚2作为巡线传感器1的脚,设置为输入。
Tracing_1.value()
Tracing_1.value()函数用来检测对应端口的电平高低。
四、实验现象
程序下载完成之后,小车会巡黑线移动,并且右转时亮绿灯OLED显示'Turn Right',左转时亮蓝灯OLED显示'Turn Left',右旋时亮绿灯OLED显示'Turn Right',左旋时亮蓝灯OLED显示'Turn Left',前进的时候亮白色灯OLED显示'Run'。

注意:巡线传感器会受到光线影响,请在室内无太阳光照的环境下运行程序,以减少太阳光对巡线传感器的干扰。并且在巡线时需保持室内光线充足,如果运行的时候出现偏离黑线,可以通过调节小车的速度、拐弯延时来提高小车的巡线稳定性。
另外配两个传感器版本的程序:Pico Robot配套资料 -> 附件 -> 课程程序源码 -> 3.机器人课程 -> 4.巡线小车-两个传感器版本.py
在上一节,我们使用巡线传感器完成了小车巡黑线,其实位于小车前方的巡线传感器还有更多的功能,这一节我们就用这些巡线传感器来实现悬崖检测。
注意:巡线传感器会受到光线影响,请在室内无太阳光照的环境下运行程序,以减少太阳光对巡线传感器的干扰。并且在巡线时需保持室内光线充足。
电机速度受到电池电量影响,例程是在电池电量较高(电量数值在26000以上)的情况下,如果电池电量较低需要及时充电或者修改电机速度。
一、学习目标
1. 学习树莓派Pico主板和小车扩展板的电机、OLED、巡线传感器、可编程RGB灯结合实现悬崖检测。
2. 了解如何通过巡线传感器控制小车悬崖检测。
二、硬件使用
本次课程使用PICO主板以及小车扩展板的电机、OLED、巡线传感器、可编程RGB灯,可以将小车放在没有障碍物的桌子上运行程序,检测到桌子边缘的时候,小车会自动后退。

在程序中我们通过判断每个巡线传感器接收到的数据值,在底下是悬崖时,因为巡线传感器接收管无法收到发射管返回的光,所以和识别到黑色一样数值为0,将结果分成三种不同的情况,确定小车的运行状态,从而实现小车悬崖检测。
三、程序分析
完整程序位置:Pico Robot配套资料 -> 附件 -> 课程程序源码 -> 3.机器人课程 -> 5.悬崖检测.py
from pico_car import pico_car, ws2812b, SSD1306_I2C
使用pico_car 的pico_car、ws2812b、SSD1306_I2C,封装了电机驱动和RGB灯、OLED库。
import time
“time”库。 这个库处理所有与时间有关的事情,从测量它到将延迟插入到程序中。单位为秒。
from machine import Pin, I2C
机器库包含MicroPython需要与Pico和其他MicroPython兼容的设备通信的所有指令,扩展了物理计算的语言,这里用了Pin和I2C的库。
Motor = pico_car()
初始化电机驱动。
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,255,0,0)
使用for循环把所有车灯设置为红色。
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('Cliff', 0, 0)
设置OLED在0,0的位置显示'Cliff'。
oled.show()
把设置的OLED内容显示出来。
oled.fill(0)
清除设置的内容,准备下一次显示。
Motor.Car_Run(100,100)
控制小车前进,速度设置为100,参数分别为(左电机速度,右电机速度),速度范围0-255。
Motor.Car_Back(255,255)
控制小车后退。
Motor.Car_Left(255,255)
控制小车左旋。
Motor.Car_Right(255,255)
控制小车右旋。
Tracing_1 = machine.Pin(2, machine.Pin.IN)
初始化引脚2作为巡线传感器1的脚,设置为输入。
Tracing_1.value()
Tracing_1.value()函数用来检测对应端口的电平高低。
四、实验现象
程序下载完成之后,小车遇到悬崖时,当传感器1和2检测到悬崖时,小车亮红色灯后退然后右旋,OLED显示'Cliff',当传感器3和4检测到悬崖时,小车亮红色灯后退然后左旋,OLED显示'Cliff',其他情况小车亮白色灯前进。

注意:巡线传感器会受到光线影响,请在室内无太阳光照的环境下运行程序,以减少太阳光对巡线传感器的干扰。并且在巡线时需保持室内光线充足,如果运行的时候出现无法及时停住的情况,可以通过调节小车的速度来提高稳定性。
在4.4节,我们使用超声波传感器进行测距,并把结果显示在OLED上,在这一节,我们利用这个测距结果来实现超声波避障。
注意:电机速度受到电池电量影响,例程是在电池电量较高(电量数值在26000以上)的情况下,如果电池电量较低需要及时充电或者修改电机速度。
一、学习目标
1. 学习树莓派Pico主板和小车扩展板的电机、OLED、超声波传感器、可编程RGB灯、蜂鸣器结合实现超声波避障。
2. 了解如何通过超声波传感器实现避障。
二、硬件使用
本次课程使用PICO主板以及小车扩展板的电机、OLED、超声波传感器、可编程RGB灯、蜂鸣器,可以将小车放在地上,地面障碍物不要太密集,小车遇到障碍物会自动后退。

在程序中我们通过读取超声波传感器数值,对不同的距离数值做出不同的动作。
三、程序分析
完整程序位置:Pico Robot配套资料 -> 附件 -> 课程程序源码 -> 3.机器人课程 -> 6.超声波避障.py
from pico_car import SSD1306_I2C, ultrasonic, pico_car, ws2812b
使用pico_car 的SSD1306_I2C、ultrasonic、pico_car、ws2812b,封装了电机驱动和RGB灯、OLED、超声波库。
import time
“time”库。 这个库处理所有与时间有关的事情,从测量它到将延迟插入到程序中。单位为秒。
from machine import Pin, I2C, PWM
机器库包含MicroPython需要与Pico和其他MicroPython兼容的设备通信的所有指令,扩展了物理计算的语言,这里用了Pin、PWM和I2C的库。
Motor = pico_car()
初始化电机驱动。
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,255,0,0)
使用for循环把所有车灯设置为红色。
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.show()
把设置的OLED内容显示出来。
oled.fill(0)
清除设置的内容,准备下一次显示。
Motor.Car_Run(100,100)
控制小车前进,速度设置为150,参数分别为(左电机速度,右电机速度),速度范围0-255。
Motor.Car_Back(150,150)
控制小车后退。
Motor.Car_Right(150,150)
控制小车右旋。
Motor.Car_Stop()
控制小车停止。
BZ = PWM(Pin(22))
将IO22设置为PWM输出引脚,用于控制蜂鸣器。
BZ.freq(1000)
将PWM频率设置为1000。
BZ.duty_u16(0)
数值为0的时候关闭声音,为500的时候开启声音。
ultrasonic = ultrasonic()
初始化超声波测距。
distance = ultrasonic.Distance_accurate()
将超声波测距返回的数值,赋值给变量distance 。
oled.text(str(distance), 75, 0)
将距离转换为字符串,显示在OLED的75,0位置上。
四、实验现象
程序下载完成之后,我们可以看到OLED显示 'distance: ' 和测量出来的距离,数值会根据测量结果改变,同时Shell也会显示测量的距离,当距离小于10(遇到障碍物),RGB灯亮红色,小车后退右旋,同时蜂鸣器发出“滴滴”声;当距离在10-30之间,RGB灯亮黄色,小车前进;当距离超过30,RGB灯亮绿色,小车前进。

注意,超声波最短测量距离在2-3cm,程序中使用10cm的距离进行避障,如果障碍物过密集,可以修改这个数值。
在上一节,我们使用超声波传感器进行测距,实现了超声波避障,在这一节我们换一种用法,使用超声波来实现跟随。
注意:电机速度受到电池电量影响,例程是在电池电量较高(电量数值在26000以上)的情况下,如果电池电量较低需要及时充电或者修改电机速度。
一、学习目标
1. 学习树莓派Pico主板和小车扩展板的电机、OLED、超声波传感器、可编程RGB灯、蜂鸣器结合实现超声波跟随。
2. 了解如何通过超声波传感器实现跟随。
二、硬件使用
本次课程使用PICO主板以及小车扩展板的电机、OLED、超声波传感器、可编程RGB灯、蜂鸣器,可以将小车放在空旷的地面上,如果有障碍物可能会影响跟随效果。

在程序中我们通过读取超声波传感器数值,对不同的距离数值做出不同的动作。
三、程序分析
完整程序位置:Pico Robot配套资料 -> 附件 -> 课程程序源码 -> 3.机器人课程 -> 7.超声波跟随.py
在这个程序里做了RGB灯效,前进的时候会一边播放音乐一边流水灯,旋转寻找跟随目标的时候也有流水灯效果,在单线程只能顺序执行的程序里要实现同时运行多种效果,就需要把音乐、流水灯、小车运行切成一小块一小块,每一小块中都包含音乐、流水灯、小车运行的片段,所以我们在程序里做了多个变量来实现这种效果。
from pico_car import SSD1306_I2C, ultrasonic, pico_car, ws2812b
使用pico_car 的SSD1306_I2C、ultrasonic、pico_car、ws2812b,封装了电机驱动和RGB灯、OLED、超声波库。
import time
“time”库。 这个库处理所有与时间有关的事情,从测量它到将延迟插入到程序中。单位为秒。
from machine import Pin, I2C, PWM
机器库包含MicroPython需要与Pico和其他MicroPython兼容的设备通信的所有指令,扩展了物理计算的语言,这里用了Pin、PWM和I2C的库。
Motor = pico_car()
初始化电机驱动。
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,255,0,0)
使用for循环把所有车灯设置为红色。
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.show()
把设置的OLED内容显示出来。
oled.fill(0)
清除设置的内容,准备下一次显示。
Motor.Car_Run(100,100)
控制小车前进,速度设置为100,参数分别为(左电机速度,右电机速度),速度范围0-255。
Motor.Car_Back(100,100)
控制小车后退。
Motor.Car_Left(120,120)
控制小车左旋。
Motor.Car_Right(120,120)
控制小车右旋。
Motor.Car_Stop()
控制小车停止。
BZ = PWM(Pin(22))
将IO22设置为PWM输出引脚,用于控制蜂鸣器。
BZ.freq(1000)
将PWM频率设置为1000。
BZ.duty_u16(0)
数值为0的时候关闭声音,为500的时候开启声音。
ultrasonic = ultrasonic()
初始化超声波测距。
distance = ultrasonic.Distance_accurate()
将超声波测距返回的数值,赋值给变量distance 。
oled.text(str(distance), 75, 0)
将距离转换为字符串,显示在OLED的75,0位置上。
四、实验现象
程序下载完成之后,我们可以看到OLED显示 'distance: ' 和测量出来的距离,数值会根据测量结果改变,同时Shell也会显示测量的距离,当距离小于9(距离跟随物体过近),RGB灯亮红色,小车后退,同时蜂鸣器发出“滴滴”声;当距离在9-20之间,RGB灯以两个为一组,亮紫色流水灯,小车前进,并且同时播放音乐;当距离超过20,RGB灯亮青色流水灯,小车右旋左旋寻找跟随物体。

注意,超声波最短测量距离在2-3cm,如果跟随效果不好,可以适当修改距离,或者修改小车运行速度。
在4.1节,我们使用光敏传感器检测光线强度,并把结果显示在OLED上,在这一节,我们利用这个光线强度结果来实现寻光跟随。
注意,寻光受到环境光线影响,请在室内光线变化不大或者较暗的地方使用。
电机速度受到电池电量影响,例程是在电池电量较高(电量数值在26000以上)的情况下,如果电池电量较低需要及时充电或者修改电机速度。
一、学习目标
1. 学习树莓派Pico主板和小车扩展板的电机、OLED、光敏传感器、可编程RGB灯结合实现小车寻光。
2. 了解小车寻光的实现。
二、硬件使用
本次课程使用PICO主板以及小车扩展板的电机、OLED、光敏传感器、可编程RGB灯,小车放在前方没有障碍物的空旷位置,运行之前请把跳线帽接到Light排针,准备好光源(手电筒或手机的相机灯)。


在程序中我们通过读取两个光敏传感器的数值,比较两个数值大小,判断光源位置,从而控制小车寻光。
三、程序分析
完整程序位置:Pico Robot配套资料 -> 附件 -> 课程程序源码 -> 3.机器人课程 -> 8.寻光跟随.py
from pico_car import SSD1306_I2C, pico_car, ws2812b
使用pico_car 的SSD1306_I2C、pico_car、ws2812b,封装了电机驱动和RGB灯、OLED库。
import time
“time”库。 这个库处理所有与时间有关的事情,从测量它到将延迟插入到程序中。单位为秒。
from machine import Pin, I2C, ADC, PWM
机器库包含MicroPython需要与Pico和其他MicroPython兼容的设备通信的所有指令,扩展了物理计算的语言,这里用了Pin、PWM、ADC和I2C的库。
Motor = pico_car()
初始化电机驱动。
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(0,150,0,150)
设置第一个车灯为紫色。
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参数传进去。
Motor.Car_Run(120,120)
控制小车前进,速度设置为120,参数分别为(左电机速度,右电机速度),速度范围0-255。
Motor.Car_Stop()
控制小车停止。
light1 = machine.ADC(27)
初始化ADC端口27,光敏传感器一共两个,分别设置了27和26脚。
oled.text(str(LightS1), 60, 0)
将光敏的值转换成字符串显示在OLED的60,0位置。
oled.show()
把设置的OLED内容显示出来。
oled.fill(0)
清除设置的内容,准备下一次显示。
LightS1 = light1.read_u16()
light1.read_u16()函数用来检测声音传感器的值,赋值给变量LightS1。
四、实验现象
程序下载完成之后,我们可以看到OLED第一行显示光敏传感器1的值 ,第二行显示光敏传感器2的值,同时Shell也会打印光敏传感器数值,使用手电筒对着小车前方左右移动,可以控制小车左右运动。

因为光敏传感器容易受到环境光线影响,请在室内光线变化不大或者较暗的地方使用,若寻光效果不好,可以适当调整检测范围,即变量light_down和light_up。
在4.2节,我们使用声音传感器进行声音检测,在这一节我们将用检测的声音控制小车。
注意:为了防止误触发,声音传感器设置的检测基准值较大,识别效果不好的话可以适当修改检测基准值,或者对声音传感器吹气来触发。
电机速度受到电池电量影响,例程是在电池电量较高(电量数值在26000以上)的情况下,如果电池电量较低需要及时充电或者修改电机速度。
一、学习目标
1. 学习树莓派Pico主板和小车扩展板的电机、OLED、声音传感器、可编程RGB灯、蜂鸣器结合实现声控小车。
2. 了解声控小车的实现。
二、硬件使用
本次课程使用PICO主板以及小车扩展板的电机、OLED、声音传感器、可编程RGB灯、蜂鸣器,小车放在前方没有障碍物的空旷位置,运行之前请把跳线帽接到Voice排针。


在程序中我们通过读取声音的数值,当数值超过基准时,控制小车运行一段时间。
三、程序分析
完整程序位置:Pico Robot配套资料 -> 附件 -> 课程程序源码 -> 3.机器人课程 -> 9.声控小车.py
声音传感器检测值会受到电池电量的影响,建议先测试再调整比较值,测试的时候建议关闭电机、RGB灯等功耗较高的负载,在程序中检测基准值(30000)之后,防止小车前进时间过长,使用一个while过滤掉多余的数值保证一次检测只执行一次前进。
from pico_car import SSD1306_I2C, pico_car, ws2812b
使用pico_car 的SSD1306_I2C、pico_car、ws2812b,封装了电机驱动和RGB灯、OLED库。
import time
“time”库。 这个库处理所有与时间有关的事情,从测量它到将延迟插入到程序中。单位为秒。
from machine import Pin, I2C, ADC, PWM
机器库包含MicroPython需要与Pico和其他MicroPython兼容的设备通信的所有指令,扩展了物理计算的语言,这里用了Pin、PWM、ADC和I2C的库。
Motor = pico_car()
初始化电机驱动。
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,255,0,0)
使用for循环把所有车灯设置为红色。
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.show()
把设置的OLED内容显示出来。
oled.fill(0)
清除设置的内容,准备下一次显示。
Motor.Car_Run(150,150)
控制小车前进,速度设置为150,参数分别为(左电机速度,右电机速度),速度范围0-255。
Motor.Car_Stop()
控制小车停止。
BZ = PWM(Pin(22))
将IO22设置为PWM输出引脚,用于控制蜂鸣器。
BZ.freq(1000)
将PWM频率设置为1000。
BZ.duty_u16(0)
数值为0的时候关闭声音,为500的时候开启声音。
oled.text(str(sounds), 50, 0)
将距离转换为字符串,显示在OLED的50,0位置上。
Sound = machine.ADC(27)
初始化ADC端口27。
sounds = Sound.read_u16()
Sound.read_u16()函数用来检测声音传感器的值,赋值给变量sounds。
四、实验现象
程序下载完成之后,我们可以看到OLED第一行显示 Sound的值 ,对着声音传感器吹气小车会一边鸣笛一边前进一段距离,同时底下有流水灯效果,同时Shell也会打印声音传感器数值。

在4.5节,我们学习了如何接收红外遥控器的值并显示在OLED上,在这一节我们使用红外遥控来实现小车的多种控制。
注意:电机速度受到电池电量影响,例程是在电池电量较高(电量数值在26000以上)的情况下,如果电池电量较低需要及时充电或者修改电机速度。
一、学习目标
1. 学习树莓派Pico主板和小车扩展板的电机、OLED、红外接收、可编程RGB灯、蜂鸣器结合实现红外遥控。
2. 了解如何通过红外遥控控制小车。
二、硬件使用
本次课程使用PICO主板以及小车扩展板的电机、OLED、红外接收、可编程RGB灯、蜂鸣器,可以将小车放在空旷的地面上,在这个例程里我们还需要使用红外遥控器来发射红外数值给红外接收。


在程序中我们通过遥控按键远程控制小车运动、亮灯、鸣笛等。
三、程序分析
完整程序位置:Pico Robot配套资料 -> 附件 -> 课程程序源码 -> 3.机器人课程 -> 10.红外控制.py
在5.7超声波跟随的程序里,我们介绍了如何实现蜂鸣器、RGB灯、小车运动同时控制,在这个程序里我们也做了相似的处理,同时还加了定时器中断Timer来实现RGB灯切换速度控制。
我们使用 while value == 按键值:来实现遥控器按一下松开再执行的效果。
from pico_car import SSD1306_I2C, ir, pico_car, ws2812b
使用pico_car 的SSD1306_I2C、ir、pico_car、ws2812b,封装了电机驱动和RGB灯、OLED、红外遥控库。
import time
“time”库。 这个库处理所有与时间有关的事情,从测量它到将延迟插入到程序中。单位为秒。
from machine import Pin, I2C, PWM, Timer
机器库包含MicroPython需要与Pico和其他MicroPython兼容的设备通信的所有指令,扩展了物理计算的语言,这里用了Pin、PWM、Timer和I2C的库。
Motor = pico_car()
初始化电机驱动。
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(2,150,0,150)
把第三个灯设置为紫色。
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.show()
把设置的OLED内容显示出来。
oled.fill(0)
清除设置的内容,准备下一次显示。
oled.text('Green', 0, 0)
在OLED的0,0位置显示'Green'。
Motor.Car_Run(255,255)
控制小车前进,速度设置为150,参数分别为(左电机速度,右电机速度),速度范围0-255。
Motor.Car_Back(255,255)
控制小车后退。
Motor.Car_Left(130,130)
控制小车左旋。
Motor.Car_Right(130,130)
控制小车右旋。
Motor.Car_Stop()
控制小车停止。
BZ = PWM(Pin(22))
将IO22设置为PWM输出引脚,用于控制蜂鸣器。
BZ.freq(1000)
将PWM频率设置为1000。
BZ.duty_u16(0)
数值为0的时候关闭声音,为500的时候开启声音。
tim = Timer()
初始化定时中断。
tick(timer)
定时中断函数,在函数中使用变量times_做时间控制,从而控制RGB等切换速度。
tim.init(freq = 1000,mode = Timer.PERIODIC,callback = tick)
设置定时中断函数和频率。
Ir = ir()
初始化红外遥控。
value = Ir.Getir()
读取红外遥控数值,赋值给变量value。
四、实验现象

程序下载完成之后,按照以下协议运行小车。
| 按键 | Shell打印键值 | OLED显示 | 效果 |
|---|---|---|---|
| 向上 | 1 | Run | 小车前进,底部向前流水灯效果 |
| 向左 | 4 | Left | 小车左旋,底部逆时针流水灯效果 |
| 向右 | 6 | Right | 小车右旋,底部顺时针流水灯效果 |
| 向下 | 9 | Back | 小车后退,底部向后流水灯效果 |
| 声音 | 5 | Buzzer | 小车蜂鸣器响 |
| 1 | 16 | Red | RGB灯亮红色 |
| 2 | 17 | Green | RGB灯亮绿色 |
| 3 | 18 | Blue | RGB灯亮蓝色 |
| 4 | 20 | Yellow | RGB灯亮黄色 |
| 5 | 21 | Cyan | RGB灯亮青色 |
| 6 | 22 | Purple | RGB灯亮紫色 |
| 7 | 24 | White | RGB灯亮白色 |
| 8 | 25 | White | RGB灯亮低亮度白色 |
| 9 | 26 | Black | RGB灯关灯 |
在这一节,我们将学习如何通过蓝牙控制小车,我们将会把前面学习到的巡线、超声波避障、声控、OLED控制、蜂鸣器控制、可编程RGB灯等都集成到一起,全都可以通过蓝牙控制。
注意:电机速度受到电池电量影响,例程是在电池电量较高(电量数值在26000以上)的情况下,如果电池电量较低需要及时充电或者修改电机速度。
一、学习目标
1. 学习树莓派Pico主板和小车扩展板的电机、OLED、蓝牙、可编程RGB灯、蜂鸣器、超声波、声音传感器结合实现蓝牙控制。
2. 了解如何通过蓝牙控制小车。
二、硬件使用
本次课程使用PICO主板以及小车扩展板的电机、OLED、蓝牙、可编程RGB灯、蜂鸣器、超声波、声音传感器。
注意:请将小车放在地面上。运行电机、可编程RGB灯时,声音传感器和电池电量数值波动是正常的。运行巡线模式的时候,必须在室内无太阳光照的环境下进行,以减少太阳光对巡线传感器的干扰,并且在巡线时需保持室内光线充足,否则需要根据5.4节的方法修改程序。运行超声波避障模式的时候,需要确保障碍物不会过于密集,如果障碍物过于密集可以按5.6节的方法修改程序。运行声控模式的时候,需要在较安静的环境下运行。OLED一行最多显示16个字符,只支持数字和英文显示。使用之前请确保电池电量(电量数值在26000以上),否则可能运行异常。
三、下载程序和蓝牙连接
1. 按照1.3节组装步骤把小车组装完成,注意要接上蓝牙模块和OLED模块,把跳线帽插到Voice排针上。

2. 按照2.4节将库文件导入到PICO开发板中。
3. 打开程序:Pico Robot配套资料 -> 附件 -> 课程程序源码 -> 3.机器人课程 -> 11.蓝牙控制.py 按照2.3开机自启动部分,把程序设置成开机自启动(调试的时候可以不用开机自启动),注意文件名要设置成main.py。

4. 拔掉和电脑连接的USB线,重启一下小车,此时蓝牙模块的红灯闪烁,准备连接手机。

5. Android/IOS手机用户扫描下方二维码下载软件。IOS用户也可以在苹果应用商城搜索并下载【YahboomRobot】

6. 下载完成蓝牙遥控APP之后, 我们要进行安装。安装期间如果手机提示需要获取位置权限,需要点击同意获取位置权限。
7. 打开手机蓝牙,打开已经安装好的YahboomRobot,选择 智能小车 -> PICO ROBOT,进入蓝牙连接界面,当手机靠近小车时蓝牙会自动连接上,如果没有自动连接的话,我们需要点击【搜索蓝牙】,成功连接之后,APP将会跳转到控制界面。


8. 连接成功后,蓝牙模块的红灯变成长亮,提示bluetooth connect successful!,我们就可以通过手机控制小车了,如果蓝牙断了红灯会重新变成闪烁。


四、蓝牙遥控界面介绍
1. 基础功能

2. 音乐选项

3. 车灯选项

4. 车灯灯效

5. 模式选择

五、程序分析
完整程序位置:Pico Robot配套资料 -> 附件 -> 课程程序源码 -> 3.机器人课程 -> 11.蓝牙控制.py
在这个程序中,整合了之前的课程的程序,例如呼吸灯部分是3.4节的程序,超声波避障部分是5.6节的程序。在这个程序也同样用到了定时中断Timer来做定时上报超声波、声音、电池数据给APP显示。
from pico_car import SSD1306_I2C, pico_car, ws2812b, ultrasonic
使用pico_car 的SSD1306_I2C、ultrasonic、pico_car、ws2812b,封装了电机驱动和RGB灯、OLED、超声波库。
import time
“time”库。 这个库处理所有与时间有关的事情,从测量它到将延迟插入到程序中。单位为秒。
from machine import Pin, I2C, PWM, Timer, UART, ADC
机器库包含MicroPython需要与Pico和其他MicroPython兼容的设备通信的所有指令,扩展了物理计算的语言,这里用了Pin、PWM、Timer、UART、ADC和I2C的库。
Motor = pico_car()
初始化电机驱动。
Motor.Car_Run(255,255)
控制小车前进,速度设置为255,参数分别为(左电机速度,右电机速度),速度范围0-255。
Motor.Car_Stop()
控制小车停止。
Motor.Car_Back(255,255)
控制小车后退。
Motor.Car_Run(0,255)
控制小车左转。
Motor.Car_Run(255,0)
控制小车右转。
Motor.Car_Left(255,255)
控制小车左旋。
Motor.Car_Right(255,255)
控制小车右旋。
pixels = ws2812b(num_leds, 0)
初始化RGB灯,我们有8个RGB灯,这里num_leds设置为8。
pixels.fill(0,0,0)
把所有的灯设置为0,0,0,也就是关闭所有灯,参数分别是(红色,绿色,蓝色),颜色亮度是0-255。
pixels.set_pixel(1,150,0,150)
把第一个灯设置为紫色。
pixels.show()
把设置的灯显示出来。
BZ = PWM(Pin(22))
将IO22设置为PWM输出引脚,用于控制蜂鸣器。
BZ.freq(1000)
将PWM频率设置为1000。
BZ.duty_u16(0)
数值为0的时候关闭声音,为500的时候开启声音。
ultrasonic = ultrasonic()
初始化超声波测距。
distance = ultrasonic.Distance_accurate()
将超声波测距返回的数值,赋值给变量distance 。
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.show()
把设置的OLED内容显示出来。
oled.fill(0)
清除设置的内容,准备下一次显示。
oled.text('Run', 0, 0)
在OLED的0,0位置显示'Run'。
tim = Timer()
初始化定时中断。
tick(timer)
定时中断函数,在函数中使用变量times_做时间控制,从而控制RGB等切换速度。
tim.init(freq = 0.5,mode = Timer.PERIODIC,callback = tick)
设置定时中断函数和频率。
machine.ADC(28)
初始化ADC端口28。
Sound.read_u16()/65535*200
读取声音传感器数值,转换成0-100的范围。
Quantity_of_electricity.read_u16()/65535*240
读取电量数值,转换成0-100的范围。
uart = UART(0, 9600, bits=8, parity=None, stop=1, tx=Pin(16), rx=Pin(17))
初始化蓝牙串口UART 0 ,引脚TX 16, RX 17,波特率9600,数据位8位,停止位1,没有奇偶校验位。
uart.write('$DAT')
通过蓝牙发送$DAT给APP。
uart.any()
读取串口数据,当接到任意数据时会返回数据。
dat = uart.read(2)
读取两个数据,并赋值给变量dat,通过判断这个变量的值来做出不同的动作。
Tracing_1 = machine.Pin(2, machine.Pin.IN)
初始化引脚2作为巡线传感器1的脚,设置为输入。
Tracing_1.value()
Tracing_1.value()函数用来检测对应端口的电平高低。
stroled_1 = stroled_1.replace("b'", "")
把变量stroled_1中的 b' 字符串替换为空,即去掉 b' 字符串。
六、通讯协议
程序下载完成之后,按照以下协议运行小车。
| 小车运动 | 协议内容 |
|---|---|
| 前进 | A# |
| 后退 | B# |
| 左转 | C# |
| 右转 | D# |
| 左旋 | E# |
| 右旋 | F# |
| 停止 | 0# |
| 音乐播放 | 协议内容 |
| do | 1# |
| ri | 2# |
| mi | 3# |
| fa | 4# |
| su | 5# |
| la | 6# |
| xi | 7# |
| 无 | O# |
| 高Do | 8# |
| do# | W#1 |
| ri# | W#2 |
| fa# | W#3 |
| su# | W#4 |
| la# | W#5 |
| 七彩车灯 | 协议内容 |
| 红 | G# |
| 绿 | H# |
| 蓝 | I# |
| 黄 | J# |
| 青 | K# |
| 品红 | L# |
| 关闭 | M# |
| 七彩灯效 | 协议内容 |
| 流水灯 | N# |
| 跑马灯 | P# |
| 呼吸灯 | Q# |
| 关闭 | M# |
| 模式选择 | 协议内容 |
| 巡线模式 | S# |
| 超声波避障 | T# |
| 声控小车 | U# |
| 退出模式 | V# |
| OLED显示(每行data不超过16个字符) | 协议内容 |
| 第一行 | X#data |
| 第二行 | Y#data |
| 第三行 | Z#data |
| 主动上报数据 | 协议内容 |
| $DAT120,99,98# | 超声波距离:120 |
| 声音值:99 | |
| 电量:98 |
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。