Download - Raspberry Pi Wi-Fi robot
Raspberry Pi Wi-Fi robot
Liger Games郭羿呈
2013/11/7
國立臺灣大學電機工程學研究所Embedded System Programming and Lab
1
【大綱】• 摘要• 實作方法
– 使用SSH– 設定Static IP位址– 控制Servo Motor– 控制DC Motor– 使用Raspberry Pi Camera– 安裝LAMP到Raspberry Pi– 穩壓電路– ATX式電源供應– 使用PHP執行外部程式
• 硬體整合• 軟體整合• 成品展示• 參考資料
2
【摘要】
• 動機– Kickstarter上有好多有趣的機器人,乾脆自己也來做一隻
• 目的–跑Linux的Raspberry Pi機器人–有簡單的機械手臂可以搬運小物品–有Camera可發展Computer Vision–使用電池或行動電源供電–可用電腦和手機的瀏覽器無線控制
3
功能 硬體 實作方法
無線控制 • USB Wi-Fi Dongle • 使用SSH• 設定Static IP位址
機械手臂 • Robotic Claw –MKII• Servo - Generic Metal Gear• Robotic Claw Pan/Tilt Bracket
• 控制Servo Motor
車輪 • RaspiRobot或MotorPiTX• Magician Chassis(含DCMotor與
車輪)
• 控制DC Motor
視覺 • Raspberry Pi Camera • 使用Raspberry Pi Camera
Web控制介面 • 安裝LAMP到Raspberry Pi• 使用PHP執行外部程式
電池供電 • RaspiRobot或MotorPiTX• 6xAA電池盒或行動電源
• 穩壓電路
使用按鈕開關機 • MotorPiTX • ATX式電源供應
Motion JPEG串流 • Raspberry Pi Camera • 安裝LAMP到Raspberry Pi• How to build and run MJPG-
Streamer on the Raspberry Pi(參考資料)
【實作方法】
【使用SSH】
• Secure Shell (SSH)為一項建立在應用層和傳輸層基礎上的安全協定,為電腦上的Shell提供安全的傳輸和使用環境
• 它允許你使用本地電腦的Command Line有效地開啟Raspberry Pi的Terminal session
• 為什麼要用SSH?–想要無縫使用Pi與PC–你的專題可能不需要鍵盤、滑鼠和顯示器–使用一組鍵盤和滑鼠,可以保持桌面整潔
5
開啟Raspberry Pi SofewareConfiguration Tool
$ sudo raspi-config
6
啟用SSH
7
查詢IP位址
$ ipconfig
8
在Windows使用SSH• 從http://www.putty.org下載、安裝並開啟Putty,填入IP位置與Port後,按Open。
9
在Mac或Linux使用SSH
$ ssh 192.168.1.13 -l pi
Image source: http://learn.adafruit.com10
【設定Static IP位址】$nano /etc/network/interfaces
auto loiface lo inet loopbackiface eth0 inet dhcp
allow-hotplug wlan0iface wlan0 inet staticaddress 192.168.0.200netmask 255.255.255.0gateway 192.168.0.1wpa-ssid "YOUR-SSID-HERE"wpa-psk "YOUR-PASSWORD-HERE"
$ sudo reboot
新增與修改
11
【控制Servo Motor】
• 須由不同長度的Pulse控制,這需要相當精確的計時
• Servo約每20毫秒收到一個Pulse• 每個Servo可旋轉角度不同,ContinuousServo可旋轉360度
• Raspberry Pi的GPIO18可以產生精確的硬體Pulse,其他GPIO可以產生軟體Pulse
12
由不同長度的Pulse控制Servo角度
0度 90度 180度
Image source: http://learn.adafruit.com13
Servo Motor電路
Image source: http://learn.adafruit.com14
ServoBlaster軟體
• 提供一個軟體介面透過GPIO去驅動多個Servo
• 透過/dev/servoblaster,讓你發送Pulse寬度的Command去控制個別的Servo
• 會維持Pulse寬度直到你傳送新的Pulse寬度Command
15
ServoBlaster Command Line格式
• <servo-number>=<servo-position>• P<header>-<pin>=<servo-postion>• <servo-position>是你想要的Pulse寬度(單位是10us)
• 舉個例子– echo 3=120 > /dev/servoblaster– echo P1-12=120 > /dev/servoblaster
16
ServoBlaster的Servo Mapping
Servo number GPIO number Pin in P1 header0 4 P1-71 17 P1-112 18 P1-123 21/17(依Pi的版本而定) P1-134 22 P1-155 23 P1-166 24 P1-187 25 P1-22
17
【控制DC Motor】
• 使用Pulse Width Modulation(PWM)來控制轉速
• 使用L293D馬達控制晶片去倒轉
18
Pulse Width Modulation(PWM)
• 是利用數位輸出來對類比電路進行控制的技術
• 我們使用它來調節電量,以控制Motor的轉速
19
PWM訊號與馬達電量
Image source: http://learn.adafruit.com20
L293D接法
Image source: http://learn.adafruit.com
接5V(供電給Chip)
接6-12V(供電給Motor)
接Motor
接Motor
接GPIO4
接GPIO17
接GPIO18(輸入PWM訊號)
接地
21
DC Motor電路
Image source: http://learn.adafruit.com22
程式碼-設置腳位import RPi.GPIO as GPIOGPIO.setmode(GPIO.BOARD)MOT1 = 4MOT2 = 17MOTE = 18GPIO.setup(MOTA1, GPIO.OUT)GPIO.setup(MOTA2, GPIO.OUT)GPIO.setup(MOTAE, GPIO.OUT)
MOTPWM = GPIO.PWM(MOTE,100)MOTPWM.start(0)
23
程式碼-控制Motor
def motor(value):if value > 0:
GPIO.output(MOT1, GPIO.HIGH)GPIO.output(MOT2, GPIO.LOW)MOTPWM.ChangeDutyCycle(value)
elif value < 0:GPIO.output(MOT1, GPIO.LOW)GPIO.output(MOT2, GPIO.HIGH)MOTPWM.ChangeDutyCycle(abs(value))
else:GPIO.output(MOT1, GPIO.LOW)GPIO.output(MOT2, GPIO.LOW)MOTPWM.ChangeDutyCycle(0)
24
【使用Raspberry Pi Camera】
• 影像感測器: Omnivision 5647 sensor in a fixed-focus module
• 感測器像素: 5M Pixel sensor• 止圖片解析度: 2592 x 1944• 最大影片解析度: 1080p• 最大攝影速度: 30fps• 尺寸: 20 x 25 x10 mm• 排線長: 150 mm
25
從Raspbian啟用Camera$ sudo apt-get update$ sudo apt-get upgrade$ sudo raspi-config
26
Raspberry Pi Camera軟體
• 基於Command Line執行,通過OpenMAX的mmal API進行編寫,可分為三個Componet:– Camera– Preview– Encoder
• 拍照軟體– Raspistill (使用Encoder)– Raspistillyuv (直接輸出YUV或RGB檔案)
• 錄影軟體– Raspivid (使用Encoder)
27
Command範例• Capture an image in jpeg format:
$ raspistill -o image.jpg• Capture a 5s video in h264 format:
$ raspivid -o video.h264• Capture a 10s video:
$ raspivid -o video.h264 -t 10000• Capture a 10s video in demo mode:
$ raspivid -o video.h264 -t 10000 -d• To see a list of possible options for running raspivid or raspistill, you can run:$ raspivid | less$ raspistill | less
28
【安裝LAMP到Raspberry Pi】
• LAMP是指一使用來建立動態網站的一組開源軟體名稱首字母縮寫:– Linux(作業系統)– Apache(網頁伺服器)–MySQL(資料庫)– PHP(腳本語言)
29
LAMP安裝
$ sudo apt-get update$ sudo apt-get upgrade$ sudo apt-get install apache2$ sudo apt-get install mysql-server$ sudo apt-get install php5$ sudo apt-get install php5-mysql$ sudo reboot
30
第一個PHP網頁程式
$ cd /var/www$ sudo nano test.php
<?phpecho "Hello world";?>
31
【穩壓電路】
• 用電池供電給Raspberry Pi(將6-12V調節至5V )
Image source: http://openmicros.org/index.php/articles/94-ciseco-product-documentation/raspberry-pi32
【ATX式電源供應】
• ATX(Advanced Technology Extended)是Intel在1995年制定的主機板規格
• 過往的AT電腦機箱,具有一個直接連到電源供應器的電源開關
• ATX的電源供應器,並不直接連到電腦的電源開關,因此電腦可以通過軟體關機
• Raspberry Pi為了降低成本,必須透過直接拔電纜的方式移除電源,但某些專題可能希望擁有ATX式電源開關
33
ATX式電源供應電路
Image source: http://www.boeeerb.co.uk/pitx-an-atx-style-solution-for-the-pi34
ATX式電源供應程式碼import RPi.GPIO as GPIOimport osimport time
GPIO.setmode(GPIO.BCM)GPIO.setup(8, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)GPIO.setup(7, GPIO.OUT)GPIO.output(7, GPIO.HIGH) # Turn ready light on
while True:print GPIO.input(8)if(GPIO.input(8) == 1):print("Request from button to shutdown")os.system("sudo shutdown -h now")GPIO.cleanup()break
time.sleep(1)
35
【使用PHP執行外部程式】
• 為了使用Web介面控制Raspberry Pi外部電路,我們需要透過PHP執行Command Line
• 相關指令– exec() 執行外部程式– passthru() 執行外部程式並顯示原始輸出結果– system() 執行外部程式並顯示輸出結果
36
修改Apache執行權限
• 為了讓Apache以sudo執行程式,我們需要修改www-data使用權限,使其不須輸入密碼
$sudo nano /etc/
⋯#includedir /etc/sudoers.dpi ALL=(ALL) NOPASSWD: ALLwww-data ALL=(ALL) NOPASSWD: ALL
加入這行37
PHP執行外部程式範例
<?phpexec("sudo python robot.py right 1");exec("sudo python robot.py forward 5");exec("sudo python robot.py claw 180");exec("sudo python robot.py arm 90");exec("sudo python robot.py claw 1");>
38
【硬體整合】• 控制板
– Raspberry Pi Model B $40• 攝影機
– Raspberry Pi Camera $30• Motor Shield
– RaspiRobot(壞了,改用MotorPiTX) $30– MotorPiTX(含ATX式電源供應電路) $40
• 車盤與馬達– Magician Chassis $15
• 機械手臂– Robotic Claw –MKII $12– Servo - Generic Metal Gear (Micro Size) $30– Robotic Claw Pan/Tilt Bracket $11
• 其他– SD卡、USBWi-Fi Dongle、杜邦線、螺絲、電池盒、行動電源等 $35
– 總共 US$21339
RaspiRobot特點
• Dual Bi-directional Motor Control• Voltage Regulator powers Raspberry Pi from Batteries (7-12V)
• 2 x Open collector outputs (25mA)• 2 x LEDs• 2 x Switch inputs• 5V Serial connector• 3.3V I2C connector
40
RaspiRobot電路圖
41
MotorPiTX特點• Control 2 DC brushed motors bi-directionally (forwards and backwards)
• Control 2 Hobby servos (standard 3 wire digital connector)
• Takes 6-9v input via 2.1mm barrel connector (12v capable with additional heatsink)
• ATX style power control via micro USB• 2x 5v outputs• 2x 3v3 inputs• i2c breakout pins• Header breakout for external power button and LED
42
組裝Robotic Claw - MKII
43
組裝Robotic Claw Pan/Tilt Bracket - MKII
44
組裝Magician Chassis
45
【軟體整合】• home/pi/robot/
– robot.py 提供Command Line介面控制機器人• var/www/
– robot.php提供基於AJAX的Web介面控制機器人,並播放MJPEG串流
• etc/– shutdown.py提供ATX式關機– servod是ServoBlaster Daemon,提供一個軟體介面透過GPIO去
驅動多個Servo– mjpg-streamer/⋯ 輸出Motion JPEG串流,並提供IP位址讓瀏覽
器讀取(mjpg-streamer設定較繁瑣,請看參考資料)• etc/init.d/
– shutdown.sh執行shutdown.py和servod– mjpgstreamer.sh讓raspistill定時拍照,並執行mjpg-streamer
46
【成品展示】
• https://www.youtube.com/watch?v=Fg8fYZM52FM
47
參考資料• ServoBlaster
– https://github.com/richardghirst/PiBits/tree/master/ServoBlaster• Raspberry Pi Camera
– http://www.raspberrypi.org/camera• MotorPiTX
– http://www.boeeerb.co.uk/motorpitx/• Raspirobot
– https://github.com/simonmonk/raspirobotboard/wiki• Learn Raspberry Pi
– http://learn.adafruit.com/category/learn-raspberry-pi• Sparkfun Tutorials
– https://learn.sparkfun.com/tutorials• Stream Video from the Raspberry Pi Camera to Web Browsers
– http://blog.miguelgrinberg.com/post/stream-video-from-the-raspberry-pi-camera-to-web-browsers-even-on-ios-and-android
• How to build and run MJPG-Streamer on the Raspberry Pi– http://blog.miguelgrinberg.com/post/how-to-build-and-run-mjpg-streamer-on-the-
raspberry-pi
48