Slide 1

Slide 1 text

智慧插座 : 從 GPIO 到繼電器 台灣樹莓派 2019/05/01@TKU

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

4 ● COSCUP,MakerConf,PyCon,HKOSCon 講者 ● 投影片 ● https://speakerdeck.com/piepie_tw ● 程式碼 ● https://github.com/piepie-tw 分享 x 教學

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

6 ● Raspberry Pi GPIO 介紹 ● 使用繼電器控制 110V 電器 本次主題

Slide 7

Slide 7 text

7 ● 硬體:Raspberry Pi 3B/3B+ ● 作業系統:2018-11-13-raspbian-stretch.img ● 為了可以使用USB 轉TTL 傳輸線 ● 修改/boot/config.txt, 新增三行 – dtoverlay=pi3-miniuart-bt – core_freq=250 – enable_uart=1 ● 修改/boot/cmdline.txt, 將quiet splash 的quiet 移除 今日環境 刪除 quiet 新增三行

Slide 8

Slide 8 text

● $ sudo apt-get update ● $ sudo apt-get -y install python- pip python-dev x11vnc python3-dev python3-venv 安裝今日所需軟體 ( 已安裝 )

Slide 9

Slide 9 text

9 Raspberry Pi GPIO 介紹

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

12 GPIO 腳位在哪裡? http://www.raspberrypi-spy.co.uk/ Pin1 Pin2 Pin25 Pin26 Pin3 Pin4 Z Z 字型的腳位編號

Slide 13

Slide 13 text

13 ● GPIO 高電位輸出為 3.3V ● GPIO 容忍輸入電位為 3.3V ● 單一 Pin 輸出電流為 3mA-16mA ● 全部 Pin 輸出總和小於 50mA ● GPIO 輸入低電位為小於 0.8V, 高電位為大於 1.3V 幾個 GPIO 的數字 https://www.scribd.com/doc/101830961/GPIO-Pads-Control2

Slide 14

Slide 14 text

14 ● C ● C + wiringPi ● C# ● Ruby ● Perl ● Python ● Scratch ● Java Pi4J Library ● Shell script 如何控制 Raspberry Pi 的 GPIO ?

Slide 15

Slide 15 text

15 Python + GPIO

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

18 # import MODULE import RPi.GPIO # import MODULE as ALIAS import RPi.GPIO as GPIO 模組

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

23 ● 1. 存成檔案以後 , 用 python 執行 ● $ nano test.py ● $ python test.py ● 2. 進到互動模式 , 可直接看輸出結果 ● $ python Python 2.7.9 (default, Sep 17 2016, 20:26:04) [GCC 4.9.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> 兩種執行 Python 的方法

Slide 24

Slide 24 text

24 數位輸出

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

28 線路圖 LED RPi 長腳 (RED) Pin12 (GPIO18) 短腳 (BLACK) Pin6 (Ground) 1k 電阻 : 棕黑黑棕 ( 棕 )

Slide 29

Slide 29 text

29 線路圖 LED RPi 長腳 (RED) Pin12 (GPIO18) 短腳 (BLACK) Pin6 (Ground) 1k 電阻 : 棕黑黑棕 ( 棕 )

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

31 使用麵包板方便多了 1k 電阻

Slide 32

Slide 32 text

32 各腳位的意義 https://goo.gl/f2rPpN

Slide 33

Slide 33 text

33 開始用 Python 控制 GPIO 吧

Slide 34

Slide 34 text

34 ● 載入模組 (Import module) ● 選擇編號系統 (Define pin numbering) ● 定義腳位 (Setup up a channel) ● 讀取輸入 / 寫入輸出 (Input/Output) ● 清理 (Cleanup) Python Code 基本流程 http://code.google.com/p/raspberry-gpio-python/wiki/BasicUsage

Slide 35

Slide 35 text

35 #!/usr/bin/python ● import RPi.GPIO as GPIO # Import module import time GPIO.setmode(GPIO.BOARD) # Define pin numbering LED_PIN = 12 GPIO.setup(LED_PIN, GPIO.OUT) # Setup up a channel print("LED is on") GPIO.output(LED_PIN, GPIO.HIGH) # Input/Output status time.sleep(3) GPIO.cleanup() # Cleanup 一個實際的範例 以下都是使用別名 (alias)

Slide 36

Slide 36 text

36 使用 :nano < 檔名 , 例如 led_on.py> 離開 :Ctrl + x > 令存新檔 :y > 不存離開 :n > 離開 :Ctrl + c nano 編輯器使用

Slide 37

Slide 37 text

37 DEMO led_on.py $ cd ~ $ nano led_on.py $ python led_on.py

Slide 38

Slide 38 text

38 ● Wiki ● http://sourceforge.net/p/raspberry-gpio- python/wiki/Home/ ● Code ● http://sourceforge.net/p/raspberry-gpio- python/code/ci/default/tree/ ● Reference detail ● http://elinux.org/RPi_Low-level_peripherals ● http://elinux.org/RPi_BCM2835_GPIOs ● http://www.raspberrypi.org/wp- content/uploads/2012/02/BCM2835-ARM-Peripherals.pdf 更多 RPi.GPIO 的使用方法

Slide 39

Slide 39 text

39 實驗 2: 控制 LED 閃爍 目的 : 熟悉 Python 語法

Slide 40

Slide 40 text

40 一樣的線路圖 LED RPi 長腳 (RED) Pin12 (GPIO18) 短腳 (BLACK) Pin6 (Ground) 1k 電阻

Slide 41

Slide 41 text

41 try: while True: print("LED is on") GPIO.output(LED_PIN, GPIO.HIGH) time.sleep(1) print("LED is off") GPIO.output(LED_PIN, GPIO.LOW) time.sleep(1) except KeyboardInterrupt: print("Exception: KeyboardInterrupt") finally: GPIO.cleanup() 永不停止的 while 迴圈 - 按 Ctrl+c 跳出迴圈

Slide 42

Slide 42 text

42 $ cd ~ $ git clone https://github.com/piepie-tw/smart-relay $ cd ~/smart-relay $ python led_blink.py 讀寫 GPIO 會存取 /dev/mem, 需 root 權限 (2015-09-24 以後的 image 可以用一般使用者身份執行 ) 執行方式

Slide 43

Slide 43 text

43 實驗 3: 繼電器 目的 : 從 5V 到 110V

Slide 44

Slide 44 text

● 繼電器是自動控制電路中的一種常用元器件 , 能 夠控制一組開關的通與斷 , 通常是通過電訊號進 行控制 , 或是通過磁 / 聲 / 光 / 熱形式來控制 繼電器 (Relay) http://www.51hei.com/dianzi/3479.html

Slide 45

Slide 45 text

● 用小電流去控制大電流的一種「自動開關」 功能 繼電器 https://zh.wikipedia.org/wiki/%E7%BB%A7%E7%94%B5%E5%99%A8 大電流 小電流

Slide 46

Slide 46 text

● COM(Common) 表示共接點 ● NO(Normally Open) 為常開接點 , 平常處於開路 ( 斷 ) 路 ● NC(Normally Close) 為常閉接點 , 平常處於閉路 內部構造和名詞縮寫 https://zh.wikipedia.org/wiki/%E7%BB%A7%E7%94%B5%E5%99%A8

Slide 47

Slide 47 text

● 額定工作電壓 ● 直流電阻 ● 吸合電流 ● 釋放電流 ● 觸點切換電壓和電流 技術參數

Slide 48

Slide 48 text

● 電磁式繼電器 ● 熱敏乾簧繼電器 ● 固態繼電器 (SSR) ● 光繼電器 繼電器種類 http://goo.gl/821qH6 光電耦合 電磁式

Slide 49

Slide 49 text

光 ( 耦合 ) 兩路繼電器 https://www.sainsmart.com/products/2-channel-5v-relay-module

Slide 50

Slide 50 text

● 額定工作電壓 :5V ● 吸合電流 : 直流 30V/10A, 交流 250V/10A ● 釋放電流 :15-20mA ● 觸點切換電壓和電流 : 低電位觸發 技術參數

Slide 51

Slide 51 text

用繼電器控制 USB LED 燈

Slide 52

Slide 52 text

全部設備 繼電器 插座頭 電源線 三用電錶 快速接頭 杜邦母線 USB LED 燈 5V 轉接器 一字螺絲起子 銅導線

Slide 53

Slide 53 text

先連接繼電器和樹莓派測試 4 6 12

Slide 54

Slide 54 text

先連接繼電器和樹莓派測試 NO 接點 COM 接點 VCC IN1 GND

Slide 55

Slide 55 text

先連接繼電器和樹莓派測試

Slide 56

Slide 56 text

56 線路圖 Rpi Relay Pin4 (5V) VCC (Red) Pin6 (Ground) IN1 (Orange) Pin12(GPIO18) GND (Black)

Slide 57

Slide 57 text

57 ● RELAY_PIN = 12 GPIO.setup(RELAY_PIN, GPIO.OUT, initial=GPIO.HIGH) ● try: while True: print("Relay is on") GPIO.output(RELAY_PIN, GPIO.LOW) time.sleep(2) print("Relay is off") GPIO.output(RELAY_PIN, GPIO.HIGH) time.sleep(2) except KeyboardInterrupt: print("Exception: KeyboardInterrupt") finally: GPIO.cleanup() 低電位觸發

Slide 58

Slide 58 text

58 DEMO relay_switch.py $ cd ~/smart-relay $ python relay_switch.py

Slide 59

Slide 59 text

接上電錶

Slide 60

Slide 60 text

執行測試程式

Slide 61

Slide 61 text

電源線和快速接頭

Slide 62

Slide 62 text

將銅導線插到快速接頭

Slide 63

Slide 63 text

將電源線和快速接頭接在一起

Slide 64

Slide 64 text

開關和銅導線

Slide 65

Slide 65 text

將銅導線 [ 直接 ] 插到開關裡

Slide 66

Slide 66 text

將開關和電源線接在一起

Slide 67

Slide 67 text

再接到繼電器上 ( 先不插到插頭 )

Slide 68

Slide 68 text

將插座兩端接起來 ( 先不插到插頭 ) 兩端接起來

Slide 69

Slide 69 text

用電錶測試 ( 先不插到插頭 ) 量測插頭兩腳

Slide 70

Slide 70 text

執行測試程式 ( 先不插到插頭 ) 繼電器打開時導通了

Slide 71

Slide 71 text

確認沒問題了嗎?

Slide 72

Slide 72 text

將插頭插上 ( 注意安全 !) 再插上插頭 先把 5V 轉接器和 USB LED 燈插上

Slide 73

Slide 73 text

執行測試程式

Slide 74

Slide 74 text

USB LED 燈亮了 !

Slide 75

Slide 75 text

75 DEMO relay_switch.py $ cd ~/smart-relay $ python relay_switch.py

Slide 76

Slide 76 text

76 Raspberry Pi Rocks the World Thanks