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 |