4、Pico Robot 传感器进阶课程

4.1 光敏传感器

一、学习目标

1. 学习树莓派Pico主板和小车扩展板的光敏传感器、OLED结合进行实验。

2. 了解光敏传感器的使用。

二、硬件使用

本次课程使用PICO主板以及小车扩展板的光敏传感器、OLED,运行之前请把跳线帽接到Light排针

image-20220302122626662

image-20220302143513255

光敏电阻是用硫化镉或硒化镉等半导体材料制成的特殊电阻器,其工作原理是基于内光电效应。光照愈强,阻值就愈低,随着光照强度的升高,电阻值迅速降低。光敏电阻器对光的敏感性(即光谱特性)与人眼对可见光(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也会打印光敏传感器数值,用手挡住光敏传感器,数值会发生变化。

image-20220302123024501

 

4.2 声音传感器

注意:为了防止误触发,声音传感器设置的检测基准值较大,识别效果不好的话可以适当修改检测基准值,或者声音传感器吹气来触发。

一、学习目标

1. 学习树莓派Pico主板和小车扩展板的声音传感器、OLED结合进行实验。

2. 了解声音传感器的使用。

二、硬件使用

本次课程使用PICO主板以及小车扩展板的声音传感器、OLED,运行之前请把跳线帽接到Voice排针

image-20220302110753097

image-20220302143605065

传感器内置一个对声音敏感的电容式驻极体话筒,声波使话筒内的驻极体薄膜振动,导致电容的变化,而产生与之对应变化的微小电压,这一电压通过运算放大转化成合适的电压,并传送给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也可以看到数值。

image-20220302140811503

注意,声音传感器检测值会受到电池电量的影响,建议先测试再调整比较值,测试的时候建议关闭电机、RGB灯等功耗较高的负载。

 

4.3 巡线传感器

注意:巡线传感器会受到光线影响,请在室内无太阳光照的环境下运行程序,以减少太阳光对巡线传感器的干扰。并且在巡线时需保持室内光线充足。

一、学习目标

1. 学习树莓派Pico主板和小车扩展板的巡线传感器、OLED结合进行实验。

2. 了解巡线传感器的使用。

二、硬件使用

本次课程使用PICO主板以及小车扩展板的巡线传感器、OLED。

image-20220302151738285

巡线传感器是利用红外线来进行数据处理的一种传感器,有灵敏度高等优点,传感器上有一个红外发射管和一个红外接收管,当地面为黑色,吸收所有光, 接收管电阻增大,当地面为白色,反射所有光,接收管电阻减小,再通过板上的电压比较电路,把检测到的状态变成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也会显示检测结果。

image-20220302151809246

 

4.4 超声波传感器

一、学习目标

1. 学习树莓派Pico主板和小车扩展板的超声波传感器、OLED结合进行实验。

2. 了解超声波传感器的使用。

二、硬件使用

本次课程使用PICO主板以及小车扩展板的超声波传感器、OLED。

image-20220302143646512

人耳能听到的超声波频率范围大概是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也会显示测量的距离。

image-20220302143736660

注意,超声波最短测量距离在2-3cm。

 

4.5 红外遥控显示

一、学习目标

1. 学习树莓派Pico主板和小车扩展板的红外接收、OLED结合进行实验。

2. 了解红外接收的使用。

二、硬件使用

本次课程使用PICO主板以及小车扩展板的红外接收、OLED,在这个例程里我们还需要使用红外遥控器来发射红外数值给红外接收。

image-20220217112649860

image-20220321093338725

红外线的光谱位于红色光之外, 波长是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也会显示对应按键值。

image-20220302143907708

按键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
posted @ 2024-03-30 17:11  soliang  阅读(14)  评论(0编辑  收藏  举报