61
Raspberry Pi 工作坊 - 自己做遙控小車 台灣樹莓派 <[email protected]> Aug 15, 2015@COSCUP

Raspberry Pi - Amazon Web Servicessosorry.s3.amazonaws.com/raspberrypi/doc/slide/(coscup2015)pi-remote... · Raspberry Pi工作坊 - 自己做遙控小車 台灣樹莓派

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Raspberry Pi 工作坊- 自己做遙控小車

台灣樹莓派 <[email protected]>Aug 15, 2015@COSCUP

2

●投影片下載●http://goo.gl/VlthAx

●範例下載●https://goo.gl/9Elo5A

●Hackpad 小抄●https://goo.gl/YGLIMA

姓名標示 — 非商業性 — 相同方式分享

CC (Creative Commons)

姓名標示 — 你必須給予 適當表彰、提供指向本授權條款的連結,以及 指出(本作品的原始版本)是否已被變更。你可以任何合理方式為前述表彰,但不得以任何方式暗示授權人為你或你的使用方式背書。

非商業性 — 你不得將本素材進行商業目的之使用。

相同方式分享 — 若你重混、轉換本素材,或依本素材建立新素材,你必須依本素材的授權條款來散布你的貢獻物。

4

● element14 指定台灣地區 Raspberry Pi 個人用戶經銷商

about 台灣樹莓派

http://farnell.com/raspberrypi-consumer/approved-retailers.php?region=apac&MER=MER-LM-OB-RPICC-76315

● 專注於 Raspberry Pi 應用與推廣

● 舉辦社群聚會 / 工作坊 / 讀書會 / 黑客松

● Website :● https://www.raspberrypi.com.tw/

● Facebook : ● 搜尋 RaspberryPi.Taiwan● https://www.facebook.com/RaspberryPi.Taiwan

about 台灣樹莓派

6

● COSCUP, MakerConf, PyCon 講者

● 投影片

● http://www.slideshare.net/raspberrypi-tw/presentations● 程式碼

● https://github.com/raspberrypi-tw

分享 x 社群

7

● 發放材料 + 介紹 /15mins● 連線測試 /15mins● 小車組裝 + LAB1 /40mins● 馬達解釋 + LAB2 /30mins ● GPIO 控制 + LAB3 /30mins ● 轉向 /L298N 解釋 + LAB4 /30mins● Web+UI+ 控制 + LAB5 /40mims● 小車拆解 /15mins

今日時程

8

● 根據底下的編號 % 連線到 RPi-AP%● wpa-psk : 1234567890

● 筆電連線成功後 , 用 ssh 連線到 Pi● ip : 192.168.%.1

● 帳號 / 密碼: pi/raspberry

連線測試

9

● 使用 scp● 一個實做 SCP(Secure Copy Protocol) 的應用程式

● 透過 SSH(Secure Shell) 傳輸資料

● Windows 請安裝 WinSCP

● http://winscp.net/eng/download.php

● 從 Pi 複製檔案到 PC 上

● scp [email protected]:/home/pi/file.txt .● scp file.txt [email protected]:/home/pi

如何讓 Pi 和 PC 互傳檔案?

http://winscp.net/

10

遙控小車 = 遙控 + 小車

11

● 車體 ( 機構 )● 馬達 / 車輪 ( 動力 )● 控制板 / 微處理器 ( 邏輯 )● 無線網路 / 紅外線 / 藍牙 ( 控制 )

遙控車的組成

12

實驗 1 :小車組裝

目的:瞭解小車的各項機構

13

所有零件

14

安裝銅柱

15

測速盤

16

馬達電源線

17

固定馬達

18

跑車輪 & 萬向輪底座

19

萬向輪

20

L298N 馬達控制板

21

小車組裝完成

22

實驗 2 :馬達驅動

目的:比較各種驅動馬達的方式

23

● 直流馬達 (DC motors)● 伺服馬達 (Servo motors)● 步進馬達 (Stepper motors)

馬達種類

https://learn.adafruit.com/adafruit-motor-selection-guide

24

https://learn.adafruit.com/adafruit-motor-selection-guide

25

直流 ( 碳刷 ) 馬達

https://learn.adafruit.com/adafruit-motor-selection-guide

永久磁鐵定子

轉子和線圈

整流子

電源

Fleming's Left Hand Rule

26

● 速度和負重的需求 (負載 )● 轉速● 扭力 ( 轉矩 )

● 電源和控制器的配置● 工作電壓● 消耗電流● 堵轉電流

FA-130RA 直流馬達規格工作電壓 空載 堵轉負載

27

1. 馬達和直流電源直接相接

http://www.simplecircuitsandprojects.com/circuits/dc-motor.html

順時鐘旋轉

逆時鐘旋轉

28

● GPIO = General Purpose Input Output● GPIO is a flexible software-controlled digital signal● A generic pin on an IC

2. 透過 GPIO 控制馬達

http://raspberrypihobbyist.blogspot.tw/2012/09/so-many-inputs-so-few-gpio-pins.html

29

Raspberry Pi Model B 的 GPIO (P1)

http://elinux.org/RPi_Low-level_peripherals

SPI / I2C / UART / PWM

Pin1 Pin2

Pin25 Pin26

Pin3 Pin4ZZ字型的腳位編號

30

#!/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() # 清理

一分鐘學會用 Python 控制 GPIO

31

控制電路Motor RPi馬達 A(Green) Pin16(GPIO4)馬達A(Yellow) Pin20(Ground)

馬達A

32

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()

轉 -停 - 轉 -停 -

33

為什麼不會動 ?

34

● 電源和控制器的配置● 工作電壓● 消耗電流● 堵轉電流

● Raspberry Pi GPIO 的電流輸出為 2 mA 到 16 mA

重新檢視直流馬達規格工作電壓 空載 堵轉負載

35

● 一種可放大、開關、穩壓、信號調節的元件● 由於微處理器的輸出微弱,無法驅動大型負載● 但可透過電晶體放大訊號,控制外部裝置

3. 透過電晶體驅動馬達

https://learn.adafruit.com/adafruit-motor-selection-guidehttp://de.wikipedia.org/wiki/Transistor

常用符號

36

水管閥門功能

https://learn.adafruit.com/adafruit-motor-selection-guidehttp://commons.wikimedia.org/wiki/File:Transistor_animation.gif

E(射極 )射出電流

C(集極 )收集電流B(基極 ) 控制閥門

微小電流就可控制

允許大電流通過

推動大型負載

腳位意義 (依功能分 )

實際運作情形

37

控制電路

https://learn.adafruit.com/adafruit-motor-selection-guidehttps://ctheds.wordpress.com/2007/10/30/tip-120/

38

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()

轉 -停 - 轉 -停 -

39

DEMO$ sudo python dc_motor.py

40

實驗 2 :控制馬達轉向

目的:瞭解車子移動的原理

41

● C極外部電源提供馬達轉動

● B極發送控制訊號讓電晶體導通

● 一個電晶體電路可控制馬達轉動

回顧剛剛的電路圖

https://learn.adafruit.com/adafruit-motor-selection-guidehttp://www.robotoid.com/my-first-robot/rbb-bot-phase2-part1.htmlE(射極 )射出電流

C(集極 )收集電流

B(基極 ) 控制閥門

42

● 每一個節點都是電晶體控制電路

控制馬達轉向 - H橋式電路

https://learn.adafruit.com/adafruit-motor-selection-guidehttp://www.robotoid.com/my-first-robot/rbb-bot-phase2-part1.html

43

如何用程式控制?

https://learn.adafruit.com/adafruit-motor-selection-guide

連接 作用

Q1 和Q4 順時鐘轉動

Q3和Q2 逆時鐘轉動

Q1 和Q3 煞車

無 慣性自由轉動

Q1 和Q2 短路 !

Q3和Q4 短路 !

http://www.robotoid.com/my-first-robot/rbb-bot-phase2-part1.html

44

如何用程式控制?

https://learn.adafruit.com/adafruit-motor-selection-guide

連接 作用

Q1 和Q4 順時鐘轉動

Q3和Q2 逆時鐘轉動

Q1 和Q3 煞車

無 慣性自由轉動

Q1 和Q2 短路 !

Q3和Q4 短路 !

http://www.robotoid.com/my-first-robot/rbb-bot-phase2-part1.html

可是 ...

1.不小心給錯電就會把電晶體燒掉

2.一個馬達要搭配四個電晶體電路

3.我想要一次控制兩個馬達的轉動

45

L298N 馬達控制板

OUT1OUT2

OUT3OUT4

電源開關 馬達電源輸入

ENA : OUT1, OUT2生效 IN1 IN2 IN3 IN4

馬達控制接腳:

IN1-2 : OUT1-2IN3-4 : OUT3-4

ENB : OUT3, OUT4生效

5V電源輸出

PWM輸入輸出

46

單輪電路圖 (L298N要和 Pi共接地 )L298N RPiIN1(Green) Pin16(GPIO4)IN2(Yellow) Pin18(GPIO5)

馬達A

L298N MotorOUT1(Yellow) 馬達 A(Yellow)OUT2(Green) 馬達 A(Green)

47

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()

控制單輪正反轉

48

DEMO$ sudo python l298n.py

49

實驗 3:控制小車移動

目的:機構 + 程式

50

● 向前走 (雙輪逆時鐘旋轉 )● 向後走 (雙輪順時鐘旋轉 )● 向右轉 (左輪逆時鐘轉 , 右輪靜止 )● 向左轉 (右輪逆時鐘轉 , 左輪靜止 )

車子如何移動?

51

雙輪電路圖L298N RPiIN1(Green) Pin16(GPIO4)IN2(Yellow) Pin18(GPIO5)IN3(Purple) Pin11(GPIO0)IN4(Orange) Pin13(GPIO1)

馬達A馬達B

L298N MotorOUT1(Yellow) 馬達 A(Yellow)OUT2(Green) 馬達 A(Green)OUT3(Purple) 馬達 B(Green)OUT4(Orange) 馬達 B(Yellow)

52

● 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()

控制小車移動

53

DEMO$ sudo python move_car.py [f/b/r/l]

54

實驗 4:無線 (WiFi) 遙控

目的:學習如何從網頁控制硬體

● 一個軟體● 回應從 80/8080 port 進來的 HTTP要求● 可透過 CGI 或 module 方式擴充

● 如 Apache, Nginx, Boa

網頁伺服器 (Web Server)

http://www.resultantsys.com/index.php/general/what-is-a-web-application-server/

56

- A fast, simple and lightweight WSGI micro web-framework

$ sudo pip install 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)

Hello Bottle

$ 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 物件

● 無須更新整個頁面

60

DEMO$ sudo python bottle_control.py

`

Raspberry Pi Rocks the World

Thanks