4、Pico Robot 传感器进阶课程
4.1 光敏传感器
一、学习目标
1. 学习树莓派Pico主板和小车扩展板的光敏传感器、OLED结合进行实验。
2. 了解光敏传感器的使用。
二、硬件使用
本次课程使用PICO主板以及小车扩展板的光敏传感器、OLED,运行之前请把跳线帽接到Light排针。
光敏电阻是用硫化镉或硒化镉等半导体材料制成的特殊电阻器,其工作原理是基于内光电效应。光照愈强,阻值就愈低,随着光照强度的升高,电阻值迅速降低。光敏电阻器对光的敏感性(即光谱特性)与人眼对可见光(0.4~0.76)μm的响应很接近,只要人眼可感受的光,都会引起它的阻值变化。
三、程序分析
完整程序位置:Pico Robot配套资料 -> 附件 -> 课程程序源码 -> 2.传感器进阶课程 -> 1.光敏传感器.py
1 from pico_car import ds, SSD1306_I2C 2 from machine import Pin, I2C, ADC 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 #Light1 -> GP27 9 #Light2 -> GP26 10 light1 = machine.ADC(27) 11 light2 = machine.ADC(26) 12 13 while True: 14 #get value 15 LightS1 = light1.read_u16() 16 LightS2 = light2.read_u16() 17 print("light1 is %d"%(LightS1) ) 18 print("light2 is %d"%(LightS2) ) 19 #Display sound on OLED 20 oled.text('Light1:', 0, 0) 21 oled.text(str(LightS1), 60, 0) 22 oled.text('Light2:', 0, 10) 23 oled.text(str(LightS2), 60, 10) 24 oled.show() 25 oled.fill(0) 26 time.sleep(0.5)
from pico_car import SSD1306_I2C
使用pico_car 的SSD1306_I2C。
import time
“time”库。 这个库处理所有与时间有关的事情,从测量它到将延迟插入到程序中。单位为秒。
from machine import Pin, I2C, ADC
机器库包含MicroPython需要与Pico和其他MicroPython兼容的设备通信的所有指令,扩展了物理计算的语言,这里用了Pin、ADC和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参数传进去。
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也会打印光敏传感器数值,用手挡住光敏传感器,数值会发生变化。
4.2 声音传感器
注意:为了防止误触发,声音传感器设置的检测基准值较大,识别效果不好的话可以适当修改检测基准值,或者声音传感器吹气来触发。
一、学习目标
1. 学习树莓派Pico主板和小车扩展板的声音传感器、OLED结合进行实验。
2. 了解声音传感器的使用。
二、硬件使用
本次课程使用PICO主板以及小车扩展板的声音传感器、OLED,运行之前请把跳线帽接到Voice排针。
传感器内置一个对声音敏感的电容式驻极体话筒,声波使话筒内的驻极体薄膜振动,导致电容的变化,而产生与之对应变化的微小电压,这一电压通过运算放大转化成合适的电压,并传送给PICO开发板,因为没有检测噪音的能力,使用时尽量在较安静的环境中。
三、程序分析
完整程序位置:Pico Robot配套资料 -> 附件 -> 课程程序源码 -> 2.传感器进阶课程 -> 2.声音传感器.py
1 from pico_car import SSD1306_I2C 2 from machine import Pin, I2C, ADC 3 import time 4 #initialization oled 5 i2c=I2C(1, scl=Pin(15),sda=Pin(14), freq=100000) 6 oled = SSD1306_I2C(128, 32, i2c) 7 #initialization ADC 8 Sound = machine.ADC(27) 9 10 while True: 11 #get value 12 sounds = Sound.read_u16() 13 print(sounds) 14 oled.text('Sound:', 0, 0) 15 oled.text(str(sounds), 50, 0) 16 #Display sound on OLED 17 for i in range(10): 18 oled.pixel(i, 30, 1) 19 oled.pixel(i, 29, 1) 20 if sounds > 5000: 21 for i in range(10): 22 for j in range(4): 23 oled.pixel(i+10, 27+j, 1) 24 if sounds > 10000: 25 for i in range(10): 26 for j in range(10): 27 oled.pixel(i+20, 21+j, 1) 28 if sounds > 20000: 29 for i in range(10): 30 for j in range(20): 31 oled.pixel(i+30, 11+j, 1) 32 oled.show() 33 oled.fill(0) 34 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、ADC和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参数传进去。
Sound = machine.ADC(27)
初始化ADC端口27。
oled.text(str(sounds), 50, 0)
将声音的值转换成字符串显示在OLED的50,0位置。
oled.pixel(i, 30, 1)
在i,30的位置显示一个点,通过for循环绘图显示在OLED上。
oled.show()
把设置的OLED内容显示出来。
oled.fill(0)
清除设置的内容,准备下一次显示。
sounds = Sound.read_u16()
Sound.read_u16()函数用来检测声音传感器的值,赋值给变量sounds。
四、实验现象
程序下载完成之后,我们可以看到OLED第一行显示 Sound的值 ,第二行显示声音的音量大小,对着声音传感器吹气,数值会变化而且音量会波动,同时在Shell也可以看到数值。
注意,声音传感器检测值会受到电池电量的影响,建议先测试再调整比较值,测试的时候建议关闭电机、RGB灯等功耗较高的负载。
4.3 巡线传感器
注意:巡线传感器会受到光线影响,请在室内无太阳光照的环境下运行程序,以减少太阳光对巡线传感器的干扰。并且在巡线时需保持室内光线充足。
一、学习目标
1. 学习树莓派Pico主板和小车扩展板的巡线传感器、OLED结合进行实验。
2. 了解巡线传感器的使用。
二、硬件使用
本次课程使用PICO主板以及小车扩展板的巡线传感器、OLED。
巡线传感器是利用红外线来进行数据处理的一种传感器,有灵敏度高等优点,传感器上有一个红外发射管和一个红外接收管,当地面为黑色,吸收所有光, 接收管电阻增大,当地面为白色,反射所有光,接收管电阻减小,再通过板上的电压比较电路,把检测到的状态变成0/1的数值。
三、程序分析
完整程序位置:Pico Robot配套资料 -> 附件 -> 课程程序源码 -> 2.传感器进阶课程 -> 3.巡线传感器.py
1 from machine import Pin, I2C 2 from pico_car import SSD1306_I2C 3 import time 4 #initialization oled 5 i2c=I2C(1, scl=Pin(15),sda=Pin(14), freq=100000) 6 oled = SSD1306_I2C(128, 32, i2c) 7 #Define the tracking sensor, 1-4 from left to right 8 #recognize that black is 0 and white is 1 9 #Tracing_1 Tracing_2 Tracing_3 Tracing_4 10 # 2 3 4 5 11 Tracing_1 = machine.Pin(2, machine.Pin.IN) 12 Tracing_2 = machine.Pin(3, machine.Pin.IN) 13 Tracing_3 = machine.Pin(4, machine.Pin.IN) 14 Tracing_4 = machine.Pin(5, machine.Pin.IN) 15 16 while True: 17 oled.text('T1', 5, 0) 18 oled.text('T2', 35, 0) 19 oled.text('T3', 65, 0) 20 oled.text('T4', 95, 0) 21 print("T1: %d T2: %d T3: %d T4: %d "%(Tracing_1.value(),Tracing_2.value(),Tracing_3.value(),Tracing_4.value())) 22 # Tracing1 display 23 if Tracing_1.value() == 1: 24 oled.text('1', 9, 10) 25 for i in range(10): 26 for j in range(10): 27 oled.pixel(i+8, 20+j, 1) 28 elif Tracing_1.value() == 0: 29 oled.text('0', 9, 10) 30 for i in range(10): 31 oled.pixel(i+8, 20, 1) 32 oled.pixel(i+8, 29, 1) 33 for j in range(8): 34 oled.pixel(8, 21+j, 1) 35 for j in range(8): 36 oled.pixel(17, 21+j, 1) 37 # Tracing2 display 38 if Tracing_2.value() == 1: 39 oled.text('1', 39, 10) 40 for i in range(10): 41 for j in range(10): 42 oled.pixel(i+38, 20+j, 1) 43 elif Tracing_2.value() == 0: 44 oled.text('0', 39, 10) 45 for i in range(10): 46 oled.pixel(i+38, 20, 1) 47 oled.pixel(i+38, 29, 1) 48 for j in range(8): 49 oled.pixel(38, 21+j, 1) 50 for j in range(8): 51 oled.pixel(47, 21+j, 1) 52 # Tracing3 display 53 if Tracing_3.value() == 1: 54 oled.text('1', 69, 10) 55 for i in range(10): 56 for j in range(10): 57 oled.pixel(i+68, 20+j, 1) 58 elif Tracing_3.value() == 0: 59 oled.text('0', 69, 10) 60 for i in range(10): 61 oled.pixel(i+68, 20, 1) 62 oled.pixel(i+68, 29, 1) 63 for j in range(8): 64 oled.pixel(68, 21+j, 1) 65 for j in range(8): 66 oled.pixel(77, 21+j, 1) 67 # Tracing4 display 68 if Tracing_4.value() == 1: 69 oled.text('1', 99, 10) 70 for i in range(10): 71 for j in range(10): 72 oled.pixel(i+98, 20+j, 1) 73 elif Tracing_4.value() == 0: 74 oled.text('0', 99, 10) 75 for i in range(10): 76 oled.pixel(i+98, 20, 1) 77 oled.pixel(i+98, 29, 1) 78 for j in range(8): 79 oled.pixel(98, 21+j, 1) 80 for j in range(8): 81 oled.pixel(107, 21+j, 1) 82 oled.show() 83 oled.fill(0) 84 time.sleep(0.1)
from pico_car import SSD1306_I2C
使用pico_car 的SSD1306_I2C。
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参数传进去。
Tracing_1 = machine.Pin(2, machine.Pin.IN)
初始化引脚2作为巡线传感器1的脚,设置为输入。
oled.text('T1', 5, 0)
设置OLED在5,0的位置显示字符 'T1'。
oled.show()
把设置的OLED内容显示出来。
oled.fill(0)
清除设置的内容,准备下一次显示。
Tracing_1.value()
Tracing_1.value()函数用来检测对应端口的电平高低,在上面的程序中,识别到0和1之后,通过oled.pixel在OLED上绘图。
四、实验现象
程序下载完成之后,我们可以看到OLED第一行显示 'T1 T2 T3 T4' ,第二行显示各个传感器的值,第三行通过绘图显示检测到黑色或是白色,同时Shell也会显示检测结果。
4.4 超声波传感器
一、学习目标
1. 学习树莓派Pico主板和小车扩展板的超声波传感器、OLED结合进行实验。
2. 了解超声波传感器的使用。
二、硬件使用
本次课程使用PICO主板以及小车扩展板的超声波传感器、OLED。
人耳能听到的超声波频率范围大概是20Hz-20KHz,我们把频率高于20KHz的声波称为超声波,超声波具有良好的方向性,超声波与普通声波一样,也具有反射、折射、衍射、散射等特点,但是超声波的波长较短,有的是几厘米,最低可至千分之几毫米。波长越短,声波的衍射特性就越差,可以在介质中稳定地进行直线传播,因此波长较短的超声波具有很强的直线传播能力。
超声波传感器是根据超声波的一些特性制造出来的,用于完成对超声波的发射和接收,内部的换能晶片受到电压的激励而发生振动产生超声波,超声波的频率高、波长短、方向性好、可以线性传播,而且它在遇到杂质等物体时会发生反射现象,从而产生回波,通过计算发射和接收到回波的事件,我们就可以计算出到物体的距离,从而实现测距。
三、程序分析
完整程序位置:Pico Robot配套资料 -> 附件 -> 课程程序源码 -> 2.传感器进阶课程 -> 4.超声波传感器.py
1 import time 2 from machine import Pin, I2C 3 from pico_car import SSD1306_I2C, ultrasonic 4 #initialization ultrasonic 5 ultrasonic = ultrasonic() 6 #initialization oled 7 i2c=I2C(1, scl=Pin(15),sda=Pin(14), freq=100000) 8 oled = SSD1306_I2C(128, 32, i2c) 9 10 while True: 11 #get distance 12 distance = ultrasonic.Distance_accurate() 13 print("distance is %d cm"%(distance) ) 14 #display distance 15 oled.text('distance:', 0, 0) 16 oled.text(str(distance), 75, 0) 17 oled.show() 18 oled.fill(0) 19 time.sleep(1)
from pico_car import SSD1306_I2C, ultrasonic
使用pico_car 的SSD1306_I2C和ultrasonic,这是我们封装好的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参数传进去。
ultrasonic = ultrasonic()
初始化超声波测距。
distance = ultrasonic.Distance_accurate()
将超声波测距返回的数值,赋值给变量distance 。
oled.show()
把设置的OLED内容显示出来。
oled.fill(0)
清除设置的内容,准备下一次显示。
oled.text(str(distance), 75, 0)
将距离转换为字符串,显示在OLED的75,0位置上。
四、实验现象
程序下载完成之后,我们可以看到OLED显示 'distance: ' 和测量出来的距离,数值会根据测量结果改变,同时Shell也会显示测量的距离。
注意,超声波最短测量距离在2-3cm。
4.5 红外遥控显示
一、学习目标
1. 学习树莓派Pico主板和小车扩展板的红外接收、OLED结合进行实验。
2. 了解红外接收的使用。
二、硬件使用
本次课程使用PICO主板以及小车扩展板的红外接收、OLED,在这个例程里我们还需要使用红外遥控器来发射红外数值给红外接收。
红外线的光谱位于红色光之外, 波长是0.76~1.5μm,比红光的波长还长。红外遥控是利用红外线进行传递信息的一种控制方式,红外遥控具有抗干扰,电路简单,容易编码和解码,功耗小,成本低的优点。红外遥控几乎适用所有家电的控制。红外接收头中内置了光电元件,可以接收到对应波长的红外光,转换成数字信号,通过读取信号数值,判断不同的遥控按键。
三、程序分析
完整程序位置:Pico Robot配套资料 -> 附件 -> 课程程序源码 -> 2.传感器进阶课程 -> 5.红外遥控显示.py
1 import time 2 from machine import Pin, I2C 3 from pico_car import SSD1306_I2C, ir 4 #initialization ir 5 Ir = ir() 6 #initialization oled 7 i2c=I2C(1, scl=Pin(15),sda=Pin(14), freq=100000) 8 oled = SSD1306_I2C(128, 32, i2c) 9 10 while True: 11 #get value 12 value = Ir.Getir() 13 time.sleep(0.01) 14 if value != None: 15 print(value) 16 #display press 17 if value == 0: 18 while value == 0: 19 value = Ir.Getir() 20 oled.text('Press:Power', 0, 0) 21 oled.show() 22 oled.fill(0) 23 elif value == 1: 24 while value == 1: 25 value = Ir.Getir() 26 oled.text('Press:Up', 0, 0) 27 oled.show() 28 oled.fill(0) 29 elif value == 2: 30 while value == 2: 31 value = Ir.Getir() 32 oled.text('Press:Light', 0, 0) 33 oled.show() 34 oled.fill(0) 35 elif value == 4: 36 while value == 4: 37 value = Ir.Getir() 38 oled.text('Press:Left', 0, 0) 39 oled.show() 40 oled.fill(0) 41 elif value == 5: 42 while value == 5: 43 value = Ir.Getir() 44 oled.text('Press:Sound', 0, 0) 45 oled.show() 46 oled.fill(0) 47 elif value == 6: 48 while value == 6: 49 value = Ir.Getir() 50 oled.text('Press:Right', 0, 0) 51 oled.show() 52 oled.fill(0) 53 elif value == 8: 54 while value == 8: 55 value = Ir.Getir() 56 oled.text('Press:Turn Left', 0, 0) 57 oled.show() 58 oled.fill(0) 59 elif value == 9: 60 while value == 9: 61 value = Ir.Getir() 62 oled.text('Press:Down', 0, 0) 63 oled.show() 64 oled.fill(0) 65 elif value == 10: 66 while value == 10: 67 value = Ir.Getir() 68 oled.text('Press:Turn Right', 0, 0) 69 oled.show() 70 oled.fill(0) 71 elif value == 12: 72 while value == 12: 73 value = Ir.Getir() 74 oled.text('Press:+', 0, 0) 75 oled.show() 76 oled.fill(0) 77 elif value == 13: 78 while value == 13: 79 value = Ir.Getir() 80 oled.text('Press:0', 0, 0) 81 oled.show() 82 oled.fill(0) 83 elif value == 14: 84 while value == 14: 85 value = Ir.Getir() 86 oled.text('Press:-', 0, 0) 87 oled.show() 88 oled.fill(0) 89 elif value == 16: 90 while value == 16: 91 value = Ir.Getir() 92 oled.text('Press:1', 0, 0) 93 oled.show() 94 oled.fill(0) 95 elif value == 17: 96 while value == 17: 97 value = Ir.Getir() 98 oled.text('Press:2', 0, 0) 99 oled.show() 100 oled.fill(0) 101 elif value == 18: 102 while value == 18: 103 value = Ir.Getir() 104 oled.text('Press:3', 0, 0) 105 oled.show() 106 oled.fill(0) 107 elif value == 20: 108 while value == 20: 109 value = Ir.Getir() 110 oled.text('Press:4', 0, 0) 111 oled.show() 112 oled.fill(0) 113 elif value == 21: 114 while value == 21: 115 value = Ir.Getir() 116 oled.text('Press:5', 0, 0) 117 oled.show() 118 oled.fill(0) 119 elif value == 22: 120 while value == 22: 121 value = Ir.Getir() 122 oled.text('Press:6', 0, 0) 123 oled.show() 124 oled.fill(0) 125 elif value == 24: 126 while value == 24: 127 value = Ir.Getir() 128 oled.text('Press:7', 0, 0) 129 oled.show() 130 oled.fill(0) 131 elif value == 25: 132 while value == 25: 133 value = Ir.Getir() 134 oled.text('Press:8', 0, 0) 135 oled.show() 136 oled.fill(0) 137 elif value == 26: 138 while value == 26: 139 value = Ir.Getir() 140 oled.text('Press:9', 0, 0) 141 oled.show() 142 oled.fill(0) 143 value = None
我们使用 while value == 按键值:
来实现遥控器按一下松开再执行的效果。
from pico_car import SSD1306_I2C, ir
使用pico_car 的SSD1306_I2C和ir,这是我们封装好的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参数传进去。
Ir = ir()
初始化红外遥控。
value = Ir.Getir()
读取红外遥控数值,赋值给变量value。
oled.show()
把设置的OLED内容显示出来。
oled.fill(0)
清除设置的内容,准备下一次显示。
oled.text('Press:Power', 0, 0)
将对应的按键,显示在OLED上,例如按下电源键显示 'Press:Power'。
四、实验现象
程序下载完成之后,按下遥控器按键,OLED上会显示对应的按键名,同时Shell也会显示对应按键值。
按键 | Shell打印键值 | OLED显示 |
---|---|---|
电源 | 0 | Press:Power |
向上 | 1 | Press:Up |
灯 | 2 | Press:Light |
向左 | 4 | Press:Left |
声音 | 5 | Press:Sound |
向右 | 6 | Press:Right |
左旋 | 8 | Press:Turn Left |
向下 | 9 | Press:Down |
右旋 | 10 | Press:Turn Right |
+ | 12 | Press:+ |
0 | 13 | Press:0 |
- | 14 | Press:- |
1 | 16 | Press:1 |
2 | 17 | Press:2 |
3 | 18 | Press:3 |
4 | 20 | Press:4 |
5 | 21 | Press:5 |
6 | 22 | Press:6 |
7 | 24 | Press:7 |
8 | 25 | Press:8 |
9 | 26 | Press:9 |