Slide 1

Slide 1 text

1 Raspberry Pi Pico 好好玩 - 從 IoT 到 AIoT 台灣樹莓派 2022/11/18 @NUK

Slide 2

Slide 2 text

姓名標示 — 非商業性 — 相同方式分享 CC (Creative Commons) 姓名標示 — 你必須給予 適當表彰、提供指向本授權 條款的連結,以及 指出(本作品的原始版本)是否已 被變更。你可以任何合理方式為前述表彰,但不得以 任何方式暗示授權人為你或你的使用方式背書。 非商業性 — 你不得將本素材進行商業目的之使 用。 相同方式分享 — 若你重混、轉換本素材,或依本 素材建立新素材,你必須依本素材的授權條款來 散布你的貢獻物。

Slide 3

Slide 3 text

3 ● Raspberry Pi 官方經銷商 ● 專注 Raspberry Pi 應用與推廣 , 舉辦社群活動 關於我們

Slide 4

Slide 4 text

● COSCUP, MakerConf, PyCon, HKOSCon 講者 ● 投影片 ● https://speakerdeck.com/piepie_tw ● 程式碼 ● https://github.com/piepie-tw ● 台灣樹莓派網站 : ● https://piepie.com.tw/ ● Facebook: ● https://www.facebook.com/RaspberryPi.Taiwan 分享 x 教學

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

6 ● Raspberry Pi Pico 介紹 ● 環境設定 ● 輸入 / 輸出 ● 數位 / 類比 ● I2C 協定 本次主題

Slide 7

Slide 7 text

7 微控制器介紹

Slide 8

Slide 8 text

8 ● 烤箱也靠 MCU 做各種控制 日常生活中充滿著 MCU 計時器 加熱器 溫度感測 顯示器 按鍵 微電腦控制面板 烤箱結構簡圖

Slide 9

Slide 9 text

9 ● MCU 從 2015-2021 的出貨數量 ( 單位 : 十億 ) MCU 的出貨數量 https://www.statista.com/statistics/935382/worldwide-microcontroller-unit-shipments/

Slide 10

Slide 10 text

10 ● MPU 是 Micro Processing Unit( 微處理單元 ) ● MCU 是 MicroController Unit( 微控制單元 ) MPU vs. MCU https://www.microcontrollertips.com/microcontrollers-vs-microprocessors-whats-difference/

Slide 11

Slide 11 text

11 ● SoC 是 System on Chip( 系統單晶片 ) ● SoC 適複雜的應用 , 常整合更多硬體例如 DSP 或 是 Audio 等 , 通常可安裝作業系統 SoC vs. MCU https://www.microcontrollertips.com/what-is-an-soc-faq/

Slide 12

Slide 12 text

12 常見的 MCU 和 SoC 開發板

Slide 13

Slide 13 text

13 ● 第一顆 Raspberry Pi 自行研發的 MCU Raspberry Pi RP2040 MCU 特色 https://www.cytron.io/p-raspberry-pi-rp2040-dual-core-microcontroller

Slide 14

Slide 14 text

14 Raspberry Pi RP2040 MCU 規格

Slide 15

Slide 15 text

15 RP2040 代號意義 https://www.spieleblog.at/raspberry-pi-pico-microcontroller-specifications-features-and-rp2040/

Slide 16

Slide 16 text

16 處理器類別 https://sirinsoftware.com/blog/the-arm-processor-a-r-and-m-categories-and-their-specifics/

Slide 17

Slide 17 text

17 Raspberry Pi Pico 外觀 https://www.raspberrypi.com/products/raspberry-pi-pico/ Debug Pins Boot Select

Slide 18

Slide 18 text

18 Raspberry Pi Pico 特色 https://www.cytron.io/p-raspberry-pi-pico-board

Slide 19

Slide 19 text

19 為什麼使用 Raspberry Pi Pico ?

Slide 20

Slide 20 text

20 ● 高性能 , 靈活的 I/O, 低成本 (RP2040 僅 USD$1) ● RP2040 是英國製晶片 (vs. 中國製的 ESP32) ● 支援多種 IDE 開發環境 , 例如 Thonny, Visual Studio Code, Arduino IDE 開發等。可一鍵 上傳 ● 可使用 MicroPython/CircuitPython,C/C++ ● 完整的硬體設計文件 , 軟體開發文件 ● RP2040 生態系 , 未來可輕鬆移植 / 量產 使用 RP2040/Pico 的好處

Slide 21

Slide 21 text

21 ● 傳統單晶片需透過專用工具連接電腦 USB 或是 RS232 才能寫入進行開發 傳統單晶片燒錄過程 https://lee52311.pixnet.net/blog/post/239464625-8051 燒錄器製作

Slide 22

Slide 22 text

22 支援 Thonny/Visual Studio/Arduino IDE

Slide 23

Slide 23 text

23 ● 可用 MicroPython/CircuitPython 開發 ● 可用 C/C++ 開發 , 但每次需編譯成 uf2 格式燒錄 可使用 MicroPython/C/C++ 開發

Slide 24

Slide 24 text

24 完整的硬體設計文件 , 軟體開發文件

Slide 25

Slide 25 text

25 Raspberry Pi Pico Faimly https://www.raspberrypi.com/documentation/microcontrollers/raspberry-pi-pico.html Pico Pico H Pico W Pico H Pico WH

Slide 26

Slide 26 text

26 使用 RP2040 的開發板超過 100+ https://makezine.com/article/technology/raspberry-pi/a-chip-is-born-rp2040-based-boards/

Slide 27

Slide 27 text

Pico H vs. Arduino UNO http://functy.sourceforge.net/?p=328 Pico H Arduino UNO Processor ARM Cortex-M0+ dual-core ATmega328P Clock Speed 48MHz/133MHz 16MHz RAM 264KB 2KB Flash 2MB 32KB Wi-Fi No No Bluetooth No No Ethernet No No I/Os 2 × UART, 2 × I2C, 2 × SPI, 16 × PWM channels 1 × UART, 2 × I2C, 2 × SPI, 6 × PWM channels GPIO 26, plus 3 analogue pins 14, plus 6 analogue pins PIO 8 No Native USB Support USB 1.1 (Device or Host) USB 1.1 Device Language MicroPython, C/C++ Wiring-based(~C++) Price $4 $26 https://history-computer.com/raspberry-pi-pico-vs-arduino/

Slide 28

Slide 28 text

Pico W vs. ESP32 http://functy.sourceforge.net/?p=328 Pico W ESP32 Processor ARM Cortex-M0+ dual-core Xtensa 32-bit dual-core Clock Speed 48MHz/133MHz 80/160/240MHz RAM 264KB 520KB Flash 2MB 4MB Wi-Fi 802.11n 802.11b/g/n Bluetooth N/A Bluetooth 4.2, BLE Other Interfaces 2 × UART, 2 × I2C, 2 × SPI, 16 × PWM channels 2 × I2S, 2 × I2C, 3 × UART, 4 × SPI, 16 × PWM channels Sensors Temperature Touch, Temperature, Hall Effect GPIO 26, plus 3 analogue pins 34 programmable pins PIO 8 No Native USB Support USB 1.1 (Device or Host) No https://www.makeuseof.com/raspberry-pi-pico-vs-esp32-microcontroller/

Slide 29

Slide 29 text

29 開始使用 Raspberry Pi Pico

Slide 30

Slide 30 text

30 ● 下載 MicroPython 的韌體 ● 更新 Pico 的韌體 ● 下載安裝 Thonny ● 在 Thonny 撰寫 MicroPython 程式 , 一鍵上傳 將 Pico 換成 MicroPython 的韌體

Slide 31

Slide 31 text

31 下載 MicroPython 韌體

Slide 32

Slide 32 text

32 ● MicroPython 是在微控制器上運作的 Python3 直譯器 ● 最初用在 ARM Cortex-M, 由劍橋大學 Damien George 開發 ● 2013 年 Prof. Damien 設計 pyboard 上架到 Kickstarter ● 2016 年移植 MicroPython 到 ESP8266 模組 MicroPython 歷史 https://www.kickstarter.com/projects/214379695/micro-python-python-for-microcontrollers https://www.kickstarter.com/projects/214379695/micropython-on-the-esp8266-beautifully-easy-iot pyboard ESP8266

Slide 33

Slide 33 text

33 ● MicroPython ≠ Python, 只是長的像而已 ● 但 MicroPython 支援多數的 Python3 語法 ● MicroPython 在不同的硬體支援的語法略有不同 ● MicroPython 不適合有嚴格時序或性能要求的程式 ● MicroPython 可以視為一個迷你的 Python OS MicroPython: Python for Microcontrollers https://techexplorations.com/guides/esp32/micropython-with-the-esp32/1-what-is-micropython/

Slide 34

Slide 34 text

34 https://micropython.org/download/rp2-pico/ https://micropython.org/download/rp2-pico/

Slide 35

Slide 35 text

35 按著 BOOTSEL 按鍵並將 Pico 接上電腦 https://core-electronics.com.au/guides/getting-started-with-raspberry-pi-pico/

Slide 36

Slide 36 text

36 將下載的 uf2 拖曳到 RPI-RP2 磁碟 https://core-electronics.com.au/guides/getting-started-with-raspberry-pi-pico/

Slide 37

Slide 37 text

37 更新 MicroPython 韌體後測試

Slide 38

Slide 38 text

從裝置管理員找到 COM 的埠號 ( 本例為 COM5)

Slide 39

Slide 39 text

putty 下載 http://bit.ly/3USVjb1

Slide 40

Slide 40 text

● 執行 putty 1. 選擇 Session 2. 選擇 Serial 3.Serial line 填 COM5 4.Speed 填入 115200 5.Open! ● 沒畫面 , 先按 ENTER ● 再不行 , 重插拔電源 使用 putty 連線到 Pico

Slide 41

Slide 41 text

41 連線成功 , 出現 >>> 提示符號

Slide 42

Slide 42 text

42 第一個 MicroPython 控制 GPIO 程式

Slide 43

Slide 43 text

43 執行結果 https://core-electronics.com.au/guides/getting-started-with-raspberry-pi-pico/

Slide 44

Slide 44 text

44 使用 Thonny

Slide 45

Slide 45 text

● 專為初學者設計的 Python 整合式開發環境 (IDE) ● 由愛沙尼亞程式設計師 Aivar Annamaa 開發 ● Raspberry Pi OS 內建的 Python 程式開發工具 ● 特色 : ● 由 Python 所開發出的編輯器 ● 支援 Windows, Linux 和 macOS ● 支援 Python 直譯器的 REPL 介面 ● 可安裝多版本直譯器環境 ● 可單步執行 , 可在除錯階段即時變數賦值 ● 支援 MicroPython 與多種硬體 , 例如 Pico 和 ESP32 等 Thonny

Slide 46

Slide 46 text

下載 Thonny

Slide 47

Slide 47 text

下載 Thonny

Slide 48

Slide 48 text

執行 Thonny

Slide 49

Slide 49 text

Thonny IDE 環境 A. Toolbar B. Script Area C. Python Shell D. Interpreter

Slide 50

Slide 50 text

讓 on board 的 LED 亮五秒

Slide 51

Slide 51 text

選擇 MicroPython(Raspberry Pi Pico) . COM5

Slide 52

Slide 52 text

執行結果 執行

Slide 53

Slide 53 text

存檔

Slide 54

Slide 54 text

01-led_on.py

Slide 55

Slide 55 text

55 Pico GPIO 介紹

Slide 56

Slide 56 text

56 ● General Purpose Input Output ● GPIO 是一種可用軟體控制的數位訊號 什麼是 GPIO ? http://www.tek.com/datasheet/tps2000b-series-digital-storage-oscilloscopes-datasheet

Slide 57

Slide 57 text

57 ● 決定是輸入還是輸出 ● 輸出:寫值到某根腳位 ● 輸入:從某根腳位讀值 ● 等待中斷 (interrupt) 的發生 ● 決定是正緣觸發還是負緣觸發 用軟體控制什麼 ?

Slide 58

Slide 58 text

58 GPIO 腳位在哪裡? https://microdigisoft.com/led-blinking-with-raspberry-pi-pico-gpio-using-micropython/

Slide 59

Slide 59 text

59 ● GPIO 高電位輸出為 3.3V ● GPIO 容忍輸入電位為 3.3V ● 單一 Pin 輸出電流為 2mA-12mA ● 全部 Pin 輸出總和小於 50mA ● GPIO 輸入低電位為小於 0.8V, 高電位為大於 2V 幾個 GPIO 的數字 https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf

Slide 60

Slide 60 text

60 ● C ● C++ ● MicroPython ● CircuitPython 如何控制 Pico 的 GPIO ?

Slide 61

Slide 61 text

61 MicroPython + GPIO

Slide 62

Slide 62 text

62 ● 變數 , 物件 , 型別 , 註解 ● 模組 ● 縮排 ● 迴圈 ● 條件判斷 ● 函式 MicroPython 五分鐘速成

Slide 63

Slide 63 text

63 ● 動態型別 (dynamic typing) # 這是註解 i = 3 # 變數 i 指到數字物件 3 i = [1, 2, 3, 4, 5] # 變數 i 指到串列物件 print(i[2]) # 印出串列中第三個元素 i = "abcde" # 變數 i 指到字串物件 print(i[2]) # 印出字串中第三個元素 變數 , 物件 , 型別 , 註解

Slide 64

Slide 64 text

64 # 匯入 Module 內所有 Function ● # import MODULE import machine ● # 只匯入 Module 內指定 Function ● # from MODULE import FUNCTION from machine import Pin 模組

Slide 65

Slide 65 text

65 ● 用縮排取代大括號 ● 程式碼的區塊是用縮排分隔 ● 不使用 tab, 使用空白鍵 ● 常見縮排為 4 個空白鍵 縮排

Slide 66

Slide 66 text

66 ● 自動迭代 (iterator) for i in range(start, stop[, step]): process for i in range(0, 11, 5): print(i) 迴圈

Slide 67

Slide 67 text

67 if condition_1: process_1 elif condition_2: process_2 else: process_3 process_4 條件判斷

Slide 68

Slide 68 text

68 def function_name(): process def function_name(param_name): process def function_name(param_name=3): process 函式

Slide 69

Slide 69 text

69 在 Thonny 兩種執行 Python 的方法 https://www.linuxlinks.com/thonny-python-integrated-development-environment-for-beginners/ 透過 run 執行該程式 透過 Python 直譯器的 REPL 介面互動執行

Slide 70

Slide 70 text

70 數位輸出

Slide 71

Slide 71 text

71 實驗 1: 硬體的 Hello World 目的 : 從硬體到軟體的思維

Slide 72

Slide 72 text

72 ● 發光二極體 ● 單向導通 ● 省電 LED http://upload.wikimedia.org/wikipedia/commons/c/c8/5mm_Red_LED.jpg 長腳接正極 Vcc 短腳接負極 GND

Slide 73

Slide 73 text

73 ● 電路組成元件 : 電源、導線、負載 ● 閉路 : 當三者形成一完整路徑 , 有電流經過電路 ● 歐姆定律 : 導體兩端的電壓與通過的電流成正比 ● V = I x R 電路一分鐘速成 I I V R V R I https://zh.wikipedia.org/wiki/ 电路

Slide 74

Slide 74 text

74 Pico + LED 直接插入嗎 ? 先看看規格吧

Slide 75

Slide 75 text

75 ● V F : 順向電壓 ● I F : 在順向電壓下的安全電流 LED 的特性 https://learn.adafruit.com/all-about-leds/forward-voltage-and-kvl

Slide 76

Slide 76 text

76 ● 在順向電壓下一般的 LED 能承受的安全電流是 20mA ● 由於順向電壓 (Typical) 為 1.85V ● Pico 的 GPIO 腳位能提供 3.3V ● 計算公式:電阻 = 電壓 / 電流 R =V/I R =(3.3-1.85)/0.02=72.5 歐姆 ● 表示最小要接 72.5 歐姆的電阻 , 才能避免 LED 燒毀 如何解讀?

Slide 77

Slide 77 text

77 電阻阻值計算 www.digikey.tw/tw/zht/mkt/5-band-resistors.html 四環:右側為金或銀 五環:前四環很靠近 330Ω= 橙橙黑黑 ( 棕 )

Slide 78

Slide 78 text

78 要接哪一個腳位?

Slide 79

Slide 79 text

79 要接哪一個腳位? 目標 : 一隻腳接地 , 一隻腳給電

Slide 80

Slide 80 text

80 Pico 腳位定義 https://microdigisoft.com/led-blinking-with-raspberry-pi-pico-gpio-using-micropython/

Slide 81

Slide 81 text

81 接線圖 LED Pico 長腳 (RED) Pin12 (GPIO18) 短腳 (BLACK) Pin6 (Ground) 330Ω 電阻 : 橙橙黑黑 ( 棕 )

Slide 82

Slide 82 text

82 麵包板的種類 https://goo.gl/JipVgH

Slide 83

Slide 83 text

麵包板的使用 https://www.slideshare.net/eoinbrazil/imediaarduino08

Slide 84

Slide 84 text

84 使用麵包板方便多了 330Ω 電阻 LED Pico 長腳 (RED) Pin20 (GPIO15) 短腳 (BLACK) Pin38 (Ground)

Slide 85

Slide 85 text

85 ● 試試看這樣接 不會亮嗎? 因為你沒寫程式阿

Slide 86

Slide 86 text

86 Pico 腳位定義 https://microdigisoft.com/led-blinking-with-raspberry-pi-pico-gpio-using-micropython/

Slide 87

Slide 87 text

87 ● VBUS:microUSB 輸入電壓 ● VSYS: 外部電源 / 電池輸入 (1.8V~5.5V) ● 3V3_EN: 重啟電源 (hardware power off/on) ● 3V3(OUT): 輸出 3.3V ● ADC_VREF:ADC 參考電壓 ● RUN/RESET: 重啟 RP2040(software reset) 特殊腳位意義 https://peppe8o.com/raspberry-pi-pico-pinout/ https://raspberrypi.stackexchange.com/questions/139210/

Slide 88

Slide 88 text

88 開始用 MicroPython 控制 GPIO 吧

Slide 89

Slide 89 text

89 ● 載入模組 (Import module) ● 定義腳位 (Setup up a channel) ● 讀取輸入 / 寫入輸出 (Input/Output) MicroPython Code 基本流程

Slide 90

Slide 90 text

90 ● from machine import Pin # Import module import utime ● led = Pin(15, Pin.OUT) # Setup up a channel print("LED is on") ● led.value(1) # Input/Output status utime.sleep(5) print("LED is off") ● led.value(0) # Input/Output status 一個實際的範例

Slide 91

Slide 91 text

91 DEMO 02_1-led_on.py

Slide 92

Slide 92 text

執行方式 使用 GP15 腳位

Slide 93

Slide 93 text

93 ● https://docs.micropython.org/en/latest/rp2/quickref.html 更多 Pico 的 MicroPython 使用方法

Slide 94

Slide 94 text

94 ● 在 Python 中的 utime 模組是設計給微控制器 , 例如 Pico 這類型的硬體使用 ● 在 MicroPython 中 , 使用 utime 模組等於 time (time is an alias to utime and uses the same code) UTIME vs. TIME https://forum.micropython.org/viewtopic.php?t=8222

Slide 95

Slide 95 text

95 實驗 2: 控制 LED 閃爍 目的 : 熟悉 MicroPython 語法

Slide 96

Slide 96 text

96 一樣的接線圖 330Ω 電阻 LED Pico 長腳 (RED) Pin20 (GPIO15) 短腳 (BLACK) Pin38 (Ground)

Slide 97

Slide 97 text

97 from machine import Pin led = Pin(15, Pin.OUT) while True: print("LED is on") led.value(1) utime.sleep(1) ● print("LED is off") led.value(0) utime.sleep(1) 永不停止的 while 迴圈

Slide 98

Slide 98 text

98 DEMO 02_2-led_blink.py

Slide 99

Slide 99 text

99 程式何時會結束 ? 按下 stop 按鍵

Slide 100

Slide 100 text

100 實驗 3: 用 LED 做交通號誌 目的 : 結構化程式設計

Slide 101

Slide 101 text

101 ● 紅 , 黃 , 綠燈依序亮燈 ● 紅燈亮 4 秒 , 黃燈亮 2 秒 , 綠燈亮 4 秒 設計一個紅綠燈 http://www.clipartbest.com/traffic-light-photo

Slide 102

Slide 102 text

102 接線圖 紅 LED Pico 長腳 (RED) Pin20 (GPIO15) 短腳 (BLACK) Pin38 (Ground) 綠 LED Pico 長腳 (GREEN) Pin17 (GPIO13) 短腳 (BLACK) Pin38 (Ground) 黃 LED Pico 長腳 (YELLOW) Pin19 (GPIO14) 短腳 (BLACK) Pin38 (Ground)

Slide 103

Slide 103 text

103 Pico 腳位定義 https://microdigisoft.com/led-blinking-with-raspberry-pi-pico-gpio-using-micropython/

Slide 104

Slide 104 text

104 def RLED_OnOff(duration): red_led.value(1) utime.sleep(duration) ● red_led.value(0) def YLED_OnOff(duration): ● .... def GLED_OnOff(duration): ● ... while True: ● RLED_OnOff(4); ● YLED_OnOff(2); ● GLED_OnOff(4); 把亮燈拿到外面寫成 Function

Slide 105

Slide 105 text

105 DEMO 02_3-traffic_light.py

Slide 106

Slide 106 text

106 數位輸入

Slide 107

Slide 107 text

107 實驗 4: 讀取按鍵輸入 目的 : 了解硬體和軟體的差異

Slide 108

Slide 108 text

108 ● 開關:按鍵式 , 滑動式 , 傾斜式 ... 按鍵 Button / 開關 Switch http://nicegear.co.nz/

Slide 109

Slide 109 text

109 ● 常開 (normally open, N.O.) ● 常閉 (normally close, N.C.) 按鍵 Button / 開關 Switch http://www.engineersgarage.com/sites/default/files/imagecache/Original/wysiwyg_imageupload/4214/Switch-2_0.jpg

Slide 110

Slide 110 text

110 按鍵的內部結構 http://www.ladyada.net/learn/arduino/lesson5.html ● 按下前 ● 長邊相連 (1&2,3&4) ● 短邊不相連 ● 按下後 ● 四點都通 1 2 3 4

Slide 111

Slide 111 text

111 簡單的按鍵接法 BUTTON Pico 腳 4 Pin38 (Ground) 腳 1 Pin19 (GPIO14) 1 2 3 4

Slide 112

Slide 112 text

112 Pico 腳位定義 https://microdigisoft.com/led-blinking-with-raspberry-pi-pico-gpio-using-micropython/

Slide 113

Slide 113 text

113 ● Input 空接會讀到雜訊 問題在哪裡? 按鍵按下前未導通 , 讀到?? 按鍵按下後 , 讀到低電位

Slide 114

Slide 114 text

114 更好的按鍵接法 ( 上拉電阻 ) http://geekgurldiaries.blogspot.tw/2012/12/part-2.html

Slide 115

Slide 115 text

115 使用外接式的上拉電阻接線圖 BUTTON Pico 腳 4 Pin38 (Ground) 腳 1 Pin36 (3.3V) Pin19 (GPIO14) 330Ω 電阻

Slide 116

Slide 116 text

116 Pico 腳位定義 https://microdigisoft.com/led-blinking-with-raspberry-pi-pico-gpio-using-micropython/

Slide 117

Slide 117 text

117 button = Pin(14, Pin.IN) previousStatus = None while True: input = button.value() if input == 0 and previousStatus == 1: print("Button pressed") previousStatus = input 判斷條件 : 這次低 && 上次高

Slide 118

Slide 118 text

118 DEMO 04_1-push_button_poll.py

Slide 119

Slide 119 text

按一次出現兩次?這樣子對不對啊?

Slide 120

Slide 120 text

120 ● 機械式開關在切換過程中會有訊號彈跳現象 ( 雜訊 ) 開關訊號的彈跳問題 (bounce) http://120.101.72.1/Onechip/PPT/ 實習單元三 .ppt 理想訊號輸出 實際輸出訊號

Slide 121

Slide 121 text

121 ● 硬體方法 : 以 RC 電路或正回授的比較器電路解決 ● 軟體方法 : 調整觸發的延遲時間 ● 不同的按鍵會有不同的延遲時間 解決彈跳問題 (de-bounce) 10ms - 20ms

Slide 122

Slide 122 text

122 previousStatus = None currentTime = None previousTime = utime.mktime(utime.localtime()) while True: input = button.value() currentTime = utime.mktime(utime.localtime()) if input == 1 and \ previousStatus == 0 and \ (currentTime - previousTime) > 0.2: previousTime = currentTime print("Button pressed”) previousStatus = input 不反應在延遲時間內的觸發 現在的 timestamp

Slide 123

Slide 123 text

123 DEMO 04_2-push_button_debounce.py

Slide 124

Slide 124 text

124 簡單的按鍵接法沒有錯 , 但是 ... BUTTON Pico 腳 4 Pin38 (Ground) 腳 1 Pin19 (GPIO14)

Slide 125

Slide 125 text

125 button = Pin(14, Pin.IN, Pin.PULL_UP) previousStatus = None currentTime = None previousTime = utime.mktime(utime.localtime()) while True: input = button.value() currentTime = utime.mktime(utime.localtime()) if input == 1 and \ previousStatus == 0 and \ (currentTime - previousTime) > 0.2: previousTime = currentTime print("Button pressed”) previousStatus = input 要搭配內建的上拉電阻 (50k)

Slide 126

Slide 126 text

126 DEMO 04_3-push_button_internal_pull_up.py

Slide 127

Slide 127 text

127 ● 輪詢 (polling) ● MCU 每隔一段時間檢查週邊硬體的資料 ● 中斷 (interrupt) ● 當週邊硬體的狀態改變時 , 對 MCU 發出 IRQ 輪詢與中斷

Slide 128

Slide 128 text

128 ● 定義腳位 ● button = Pin() ● 建立回呼函數 ● def button_handler() ● 綁定事件和回呼函數 ● button.irq(trigger # 觸發條件 handler # 回呼函數 ) 中斷的程式寫法

Slide 129

Slide 129 text

129 From machine import Pin button = Pin(14, Pin.IN, Pin.PULL_UP) def button_handler(pin): print("Button pressed") button.irq(trigger=Pin.IRQ_FALLING, \ handler=button_handler) while True: utime.sleep(10) 即使在 sleep 狀態下也可立即回應

Slide 130

Slide 130 text

130 DEMO 04_4-push_button_interrupt.py

Slide 131

Slide 131 text

131 實驗 6: 蜂鳴器樂器 目的 : 聲音輸出

Slide 132

Slide 132 text

132 ● 發聲原理 : 聲音是由振動產生 , 其頻率稱為音頻 ● 蜂鳴器發聲原理 : 電流 (6) 通過電磁線圈 (3) 產生 磁場來驅動振動膜 (11) ● 人耳可聽到 20Hz - 20KHz 原理 http://www.itianer.com/diancishifengmingqigouzaoyuyuanlijieshao.html

Slide 133

Slide 133 text

133 ● 自激 ( 有源 ): 只能發出同頻率的聲音 ● 黑膠封裝 , 高低腳 ● 他激 ( 無源 ): 需從外部輸入震盪方波發聲 ● 綠色電路板 , 兩腳同長 ● 腳位有正負之分 ( 看底板 ) 蜂鳴器 Buzzer http://www.buzzer-speaker.com/manufacturer/piezo%20buzzer.htm 自激式 他激式 自激式

Slide 134

Slide 134 text

134 接線圖 BUZZER Pico +(RED) Pin20 (GPIO15) - (BLACK) Pin38 (Ground)

Slide 135

Slide 135 text

135 from machine import Pin buzzer = Pin(15, Pin.OUT) while True: print("Buzzer is on") ● buzzer.value(1) utime.sleep(1) ● print("Buzzer is off") ● buzzer.value(0) utime.sleep(1) 一秒發聲一秒安靜

Slide 136

Slide 136 text

136 DEMO 06_1-buzzer.py

Slide 137

Slide 137 text

137 實驗 7: 人體紅外線感測器 目的 : 常見感測器使用

Slide 138

Slide 138 text

138 Pyroelectric ("Passive") InfraRed Sensor PIR 人體紅外線感測器 http://www.raspberrypi-spy.co.uk/2013/01/cheap-pir-sensors-and-the-raspberry-pi-part-1/

Slide 139

Slide 139 text

139 使用示意圖 http://www.ladyada.net/learn/sensors/pir.html

Slide 140

Slide 140 text

140 應用範例 http://www.ladyada.net/learn/sensors/pir.html http://totherails.blogspot.tw/2011/09/halloween-preparations.html

Slide 141

Slide 141 text

141 元件說明 http://www.ladyada.net/learn/sensors/pir.html

Slide 142

Slide 142 text

142 ● 輸入電壓 :DC 3.3V - 24V ● 輸出電壓 :3.3V( 可直接接上 Raspberry Pi) ● 延遲時間 (Tx):2.45 秒 – 248 秒 ● 感應之後輸出維持的時間 ● 封鎖時間 (Ti):2.4 秒 ● 感應輸出結束之後 , 再次觸發必須等待的時間 ● 感應角度 :110 度 x 70 度 ● 感應距離 :3 米 - 7 米 瞭解規格

Slide 143

Slide 143 text

143 ● 感測距離設定 ● 順時針 : 最高為 7 米 ● 逆時針 : 最小為 3 米 ● 延遲時間設定 (Tx) ● 順時針 : 最長為 248 秒 ● 逆時針 : 最短為 2.45 秒 ● 實際可調整時間要看 R10,C6,R9,C7 而定 感測距離 / 延遲時間設定 感測距離設定 延遲時間設定

Slide 144

Slide 144 text

144 ● 可重複觸發模式 (H) ● 不可重複觸發模式 (L) 觸發模式 H: 可重複觸發 L: 不可重複觸發 ( 預設 ) 感應 & 輸出 感應 & 等待 & 輸出

Slide 145

Slide 145 text

145 接線圖 Pin26 BUZZER Pico - (BLACK) Pin38 (Ground) O(Orange) Pin34 (GPIO28) +(RED) Pin40 (5V)

Slide 146

Slide 146 text

146 sensor_pir = Pin(28, Pin.IN, Pin.PULL_DOWN) def pir_handler(pin): if pin.value(): print("ALARM! Motion detected") sensor_pir.irq(trigger=Pin.IRQ_RISING, handler=pir_handler) while True: utime.sleep(10) 再一次使用 interrupt 模式

Slide 147

Slide 147 text

147 DEMO 07_1-hc_sr501_pir.py 觸發才拉高電位 , 因此用內建的下拉電阻

Slide 148

Slide 148 text

148 加上警示的 LED 燈吧

Slide 149

Slide 149 text

149 接線圖 Pin26 BUZZER Pico - (BLACK) Pin38 (Ground) O(Orange) Pin34 (GPIO28) +(RED) Pin40 (5V)

Slide 150

Slide 150 text

150 DEMO 07_2-people_alarm_system.py

Slide 151

Slide 151 text

151 sensor_pir = Pin(28, Pin.IN, Pin.PULL_DOWN) led = Pin(15, Pin.OUT) def pir_handler(pin): if pin.value(): print("ALARM! Motion detected") for i in range(10): led.toggle() utime.sleep_ms(200) sensor_pir.irq(trigger=Pin.IRQ_RISING, handler=pir_handler) while True: utime.sleep(10) 偵測到人 , 燈閃 5 次 燈閃 5 次