Raspberry Pi 工作坊 - 自己做遙控小車 台灣樹莓派 <sosorry@raspberrypi.com.tw> Aug 15, 2015@COSCUP
投影片下載 http://goo.gl/vlthax 範例下載 https://goo.gl/9elo5a Hackpad 小抄 https://goo.gl/yglima 2
CC (Creative Commons) 姓名標示 非商業性 相同方式分享 姓名標示 你必須給予 適當表彰 提供指向本授權 條款的連結 以及 指出 本作品的原始版本 是否已 被變更 你可以任何合理方式為前述表彰 但不得以 任何方式暗示授權人為你或你的使用方式背書 非商業性 你不得將本素材進行商業目的之使 用 相同方式分享 若你重混 轉換本素材 或依本 素材建立新素材 你必須依本素材的授權條款來 散布你的貢獻物
about 台灣樹莓派 element14 指定台灣地區 Raspberry Pi 個人用戶經銷商 4 http://farnell.com/raspberrypi-consumer/approved-retailers.php?region=apac&mer=mer-lm-ob-rpicc-76315
about 台灣樹莓派 專注於 Raspberry Pi 應用與推廣 舉辦社群聚會 / 工作坊 / 讀書會 / 黑客松 Website : https://www.raspberrypi.com.tw/ Facebook : 搜尋 RaspberryPi.Taiwan https://www.facebook.com/raspberrypi.taiwan
分享 x 社群 COSCUP, MakerConf, PyCon 講者 投影片 http://www.slideshare.net/raspberrypi-tw/presentations 程式碼 https://github.com/raspberrypi-tw 6
今日時程 發放材料 + 介紹 /15mins 連線測試 /15mins 小車組裝 + LAB1 /40mins 馬達解釋 + LAB2 /30mins GPIO 控制 + LAB3 /30mins 轉向 /L298N 解釋 + LAB4 /30mins Web+UI+ 控制 + LAB5 /40mims 小車拆解 /15mins 7
連線測試 根據底下的編號 % 連線到 RPi-AP% wpa-psk : 1234567890 筆電連線成功後, 用 ssh 連線到 Pi ip : 192.168.%.1 帳號 / 密碼 pi/raspberry 8
如何讓 Pi 和 PC 互傳檔案 使用 scp 一個實做 SCP(Secure Copy Protocol) 的應用程式 透過 SSH(Secure Shell) 傳輸資料 Windows 請安裝 WinSCP http://winscp.net/eng/download.php 從 Pi 複製檔案到 PC 上 scp pi@x.x.x.x:/home/pi/file.txt. scp file.txt pi@x.x.x.x:/home/pi http://winscp.net/ 9
遙控小車 = 遙控 + 小車 10
遙控車的組成 車體 ( 機構 ) 馬達 / 車輪 ( 動力 ) 控制板 / 微處理器 ( 邏輯 ) 無線網路 / 紅外線 / 藍牙 ( 控制 ) 11
實驗 1 小車組裝 目的 瞭解小車的各項機構 12
所有零件 13
安裝銅柱 14
測速盤 15
馬達電源線 16
固定馬達 17
跑車輪 & 萬向輪底座 18
萬向輪 19
L298N 馬達控制板 20
小車組裝完成 21
實驗 2 馬達驅動 目的 比較各種驅動馬達的方式 22
馬達種類 直流馬達 (DC motors) 伺服馬達 (Servo motors) 步進馬達 (Stepper motors) 23 https://learn.adafruit.com/adafruit-motor-selection-guide
24 https://learn.adafruit.com/adafruit-motor-selection-guide
直流 ( 碳刷 ) 馬達 永久磁鐵定子 轉子和線圈 整流子 電源 Fleming's Left Hand Rule https://learn.adafruit.com/adafruit-motor-selection-guide 25
FA-130RA 直流馬達規格 工作電壓 空載 負載 堵轉 速度和負重的需求 ( 負載 ) 轉速 扭力 ( 轉矩 ) 電源和控制器的配置 工作電壓 消耗電流 堵轉電流 26
1. 馬達和直流電源直接相接 順時鐘旋轉 逆時鐘旋轉 27 http://www.simplecircuitsandprojects.com/circuits/dc-motor.html
2. 透過 GPIO 控制馬達 GPIO = General Purpose Input Output GPIO is a flexible software-controlled digital signal A generic pin on an IC 28 http://raspberrypihobbyist.blogspot.tw/2012/09/so-many-inputs-so-few-gpio-pins.html
Raspberry Pi Model B 的 GPIO (P1) Z 字型的腳位編號 Pin1 Pin3 Z Pin25 Pin2 Pin4 Pin26 SPI / I2C / UART / PWM http://elinux.org/rpi_low-level_peripherals 29
一分鐘學會用 Python 控制 GPIO #!/usr/bin/python import RPi.GPIO as GPIO import time # 載入模組 GPIO.setmode(GPIO.BOARD) # 選擇系統 ( 以實體腳位系統為例 ) LED_PIN = 12 GPIO.setup(LED_PIN, GPIO.OUT) # 定義腳位 print("led is on") GPIO.output(LED_PIN, GPIO.HIGH) time.sleep(3) # 設定腳位狀態 GPIO.cleanup() # 清理 30
控制電路 Motor 馬達 A(Green) 馬達 A(Yellow) RPi Pin16(GPIO4) Pin20(Ground) 馬達 A 31
轉-停-轉-停MOTOR_PIN = 16 GPIO.setmode(GPIO.BOARD) GPIO.setup(MOTOR_PIN, GPIO.OUT) try: while True: print("motor start...") GPIO.output(MOTOR_PIN, GPIO.HIGH) time.sleep(2) print("motor stop!!!") GPIO.output(MOTOR_PIN, GPIO.LOW) time.sleep(2) finally: GPIO.cleanup() 32
為什麼不會動? 33
重新檢視直流馬達規格 工作電壓 空載 負載 堵轉 電源和控制器的配置 工作電壓 消耗電流 堵轉電流 Raspberry Pi GPIO 的電流輸出為 2 ma 到 16 ma 34
3. 透過電晶體驅動馬達 一種可放大 開關 穩壓 信號調節的元件 由於微處理器的輸出微弱 無法驅動大型負載 但可透過電晶體放大訊號 控制外部裝置 常用符號 https://learn.adafruit.com/adafruit-motor-selection-guide http://de.wikipedia.org/wiki/transistor 35
水管閥門功能 腳位意義 ( 依功能分 ) B( 基極 ) 控制閥門 C( 集極 ) 收集電流 實際運作情形 允許大電流通過 微小電流就可控制 E( 射極 ) 射出電流 推動大型負載 http://commons.wikimedia.org/wiki/file:transistor_animation.gif https://learn.adafruit.com/adafruit-motor-selection-guide 36
控制電路 37 https://learn.adafruit.com/adafruit-motor-selection-guide https://ctheds.wordpress.com/2007/10/30/tip-120/
轉-停-轉-停MOTOR_PIN = 16 GPIO.setmode(GPIO.BOARD) GPIO.setup(MOTOR_PIN, GPIO.OUT) try: while True: print("motor start...") GPIO.output(MOTOR_PIN, GPIO.HIGH) time.sleep(2) print("motor stop!!!") GPIO.output(MOTOR_PIN, GPIO.LOW) time.sleep(2) finally: GPIO.cleanup() 38
DEMO $ sudo python dc_motor.py 39
實驗 2 控制馬達轉向 目的 瞭解車子移動的原理 40
回顧剛剛的電路圖 C 極外部電源提供馬達轉動 B 極發送控制訊號讓電晶體導通 一個電晶體電路可控制馬達轉動 C( 集極 ) 收集電流 B( 基極 ) 控制閥門 E( 射極 ) 射出電流 http://www.robotoid.com/my-first-robot/rbb-bot-phase2-part1.html https://learn.adafruit.com/adafruit-motor-selection-guide 41
控制馬達轉向 - H 橋式電路 每一個節點都是電晶體控制電路 42 http://www.robotoid.com/my-first-robot/rbb-bot-phase2-part1.html https://learn.adafruit.com/adafruit-motor-selection-guide
如何用程式控制 連接 Q1 和 Q4 Q3 和 Q2 Q1 和 Q3 無 Q1 和 Q2 Q3 和 Q4 作用 順時鐘轉動 逆時鐘轉動 煞車 慣性自由轉動 短路! 短路! 43 http://www.robotoid.com/my-first-robot/rbb-bot-phase2-part1.html https://learn.adafruit.com/adafruit-motor-selection-guide
如何用程式控制 連接 Q1 和 Q4 Q3 和 Q2 Q1 和 Q3 無 Q1 和 Q2 Q3 和 Q4 作用 順時鐘轉動 逆時鐘轉動 煞車 慣性自由轉動 短路! 短路! 可是... 1. 不小心給錯電就會把電晶體燒掉 2. 一個馬達要搭配四個電晶體電路 3. 我想要一次控制兩個馬達的轉動 http://www.robotoid.com/my-first-robot/rbb-bot-phase2-part1.html https://learn.adafruit.com/adafruit-motor-selection-guide 44
L298N 馬達控制板 電源開關 馬達電源輸入 OUT3 OUT4 OUT1 OUT2 ENA : OUT1, OUT2 生效 IN1 IN2 IN3 IN4 馬達控制接腳 PWM 輸入輸出 5V 電源輸出 IN1-2 : OUT1-2 IN3-4 : OUT3-4 45 ENB : OUT3, OUT4 生效
單輪電路圖 (L298N 要和 Pi 共接地 ) L298N RPi IN1(Green) Pin16(GPIO4) IN2(Yellow) Pin18(GPIO5) 馬達 A L298N OUT1(Yellow) OUT2(Green) Motor 馬達 A(Yellow) 馬達 A(Green) 46
控制單輪正反轉 Motor_R1_Pin = 16 Motor_R2_Pin = 18 GPIO.setmode(GPIO.BOARD) GPIO.setup(Motor_R1_Pin, GPIO.OUT) GPIO.setup(Motor_R2_Pin, GPIO.OUT) try: GPIO.output(Motor_R1_Pin, True) # clockwise time.sleep(3) GPIO.output(Motor_R1_Pin, False) time.sleep(1) # protect motor GPIO.output(Motor_R2_Pin, True) # counterclockwise time.sleep(3) GPIO.output(Motor_R2_Pin, False) finally: GPIO.cleanup() 47
DEMO $ sudo python l298n.py 48
實驗 3 控制小車移動 目的 機構 + 程式 49
車子如何移動 向前走 ( 雙輪逆時鐘旋轉 ) 向後走 ( 雙輪順時鐘旋轉 ) 向右轉 ( 左輪逆時鐘轉, 右輪靜止 ) 向左轉 ( 右輪逆時鐘轉, 左輪靜止 ) 前 左 50
雙輪電路圖 L298N IN1(Green) IN2(Yellow) IN3(Purple) IN4(Orange) RPi Pin16(GPIO4) Pin18(GPIO5) Pin11(GPIO0) Pin13(GPIO1) 馬達 B 馬達 A L298N OUT1(Yellow) OUT2(Green) OUT3(Purple) OUT4(Orange) Motor 馬達 A(Yellow) 馬達 A(Green) 馬達 B(Green) 馬達 B(Yellow) 51
控制小車移動 def stop(): # stop all wheels def forward(): GPIO.output(16, True) GPIO.output(18, False) GPIO.output(11, True) GPIO.output(13, False) time.sleep(1) stop() try: ch = sys.argv[1] if ch == 'w': forward() finally: GPIO.cleanup() 52
DEMO $ sudo python move_car.py [f/b/r/l] 53
實驗 4 無線 (WiFi) 遙控 目的 學習如何從網頁控制硬體 54
網頁伺服器 (Web Server) 一個軟體 回應從 80/8080 port 進來的 HTTP 要求 可透過 CGI 或 module 方式擴充 如 Apache, Nginx, Boa http://www.resultantsys.com/index.php/general/what-is-a-web-application-server/
- A fast, simple and lightweight WSGI micro web-framework $ sudo pip install bottle 56
Hello Bottle $ nano bottle_hello.py from bottle import * @route('/') def index(): return "Hello Bottle" if name == " main ": run(host='0.0.0.0', port=8080)
執行 $ sudo python app-hello.py Bottle v0.12.8 server starting up (using WSGIRefServer())... Listening on http://0.0.0.0:8080/ Hit Ctrl-C to quit. 192.168.1.101 - - [13/Aug/2015 20:08:32] "GET / HTTP/1.1" 200 12 192.168.1.101 - - [13/Aug/2015 20:08:32] "GET /favicon.ico HTTP/1.1" 404 746
用 AJAX 送指令 非同步 JavaScript & XML XMLHttpRequest 物件 無須更新整個頁面
DEMO $ sudo python bottle_control.py ` 60
Raspberry Pi Rocks the World Thanks