4、Pico Robot 感測器進階課程

soliang發表於2024-03-30

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

相關文章