หุ่นยนต์ติดกล้อง Raspberry Pi ควบคุมด้วยเว็บเพจ

  1. บทนำ

โปรเจคหุ่นยนต์ติดกล้อง Raspberry Pi ควบคุมด้วย เว็บเพจ โดยในโปรเจคนี้เราจะสร้างเว็บเซิร์ฟเวอร์ จาก Raspberry Pi  โดยจะติดตั้งกล้อง Camera V2 Module เพื่อถ่ายภาพที่ด้านหน้าของหุ่นยนต์ และ สั่งควบคุมหุ่นยนต์  จาก เว็บบราวเซอร์ ผ่านทาง ระบบอินทราเน็ต ที่ใช้ WiFi  หรือ วง แลน หรือใช้ เร้าเตอร์ เดียวกัน เท่านั้น

หุ่นยนต์ติดกล้อง ควบคุมด้วย เว็บเพจที่เราจัดทำขึ้นมา เพื่อพัฒนาศึกษาการทำงานของบอร์ด Raspberry Pi ว่ามีการทำงานอย่างไร เพื่อนำมาทำเป็นหุ่นยนต์ที่ควบคุมผ่านเว็บเพจได้  เราเขียนโค้ดในการทำงานและการบังคับ เราใช้ ภาษา python 3 (IDLE)  หุ่นยนต์ติดกล้องของเราสามารถใช้ประโยชน์ได้หลากหลาย เพราะเราสามารถบังคับให้เดินไปทางไหนก็ได้ แล้วยังมีกล้องข้างหน้าสามารถมองผ่านทางจอมือถือเราได้เลย เรานำไปใช้วิ่งไปสำรวจในพื้นที่ ที่เข้าไปได้ยาก และในภายหน้าเราจะพัฒนาให้ หุ่นยนต์ของเรา เคลื่อนที่ผ่านสิ่งกีดขว้างได้ ทำให้เข้ากับสภาพแวดล้อมที่จะนำไปใช้ แล้วก็จะทำให้มีความเสถียรมากขึ้น

กลุ่มเราจัดทำหุ่นยน์นี้ขึ้นมาเพื่อใช้งานจับภาพในที่แคบ ที่เราเข้าไปไม่ถึงแล้วบันทึกสิ่งที่อยู่ภายในออกมา จะได้เห็นว่ามีอะไรภายในบ้างให้สะดวกต่อการเข้าไปจริง กลุ่มเราจะพัฒนาให้ดีต่อไปเพราะตอนนี้ยังไม่เสถียรมาก

2.วัตถุประสงค์

1.เพื่อศึกษาบอร์ด raspberry pi 3 model b

2.ฝึกใช้ภาษา python 3

3.ฝึกการใช้โค้ดในการควบคุมหุ่นยนต์

4.เพื่อพัฒนาความหลากหลายของหุ่นยนต์

เป้าหมาย

เพื่อพัฒนาหุ่นยนต์ทำให้ทำอะไรได้หลายอย่างมากขึ้น และเพื่อศึกษาโปรแกรมต่างๆในการเขียนโค้ดคำสั่งหุ่นยนต์ทำงานอย่างมีประสิทธิภาพมากขึ้น สะดวกต่อการใช้งานแก่ผู้ต้องการ

3.1 โปรเจคหุ่นยนต์ติดกล้อง Raspberry Pi ควบคุมด้วย เว็บเพจ โดยในโปรเจคนี้เราจะสร้างเว็บเซิร์ฟเวอร์ จาก Raspberry Pi  โดยจะติดตั้งกล้อง Camera V2 Module เพื่อถ่ายภาพที่ด้านหน้าของหุ่นยนต์ และ สั่งควบคุมหุ่นยนต์  จาก เว็บบราวเซอร์ ผ่านทาง ระบบอินทราเน็ต ที่ใช้ WiFi  หรือ วง แลน หรือใช้ เร้าเตอร์ เดียวกัน

ผลงาน

โปรแกรมที่ใช้

โปรแกรมในการเขียนโค้ด

 

 

 

 

 

3.2 บอร์ด Raspberry Pi Model B+บอร์ดคอมพิวเตอร์ขนาดเล็ก ที่ถูกพัฒนาขึ้นโดย Raspberry Pi Foundation มีคุณสมบัติเด่น คือ ติดต่อ และ ความคุมอุปกรณ์อิเล็กทรอนิกส์ได้

Raspberry Pi ไม่มีหน่วยความจำแบบแฟลชเมมโมรี ดังนั้นจำเป็นที่จะใช้ SD Card ภายนอก ซึ่งหากเปรียบเทียบกับคอมพิวเตอร์ SD Card นี้ก็จะเปรียบเสมือนฮาร์ดดิสก์นั่นเอง การลงระบบปฏิบัติการ OS รวมถึงการโปรแกรมหรือข้อมูลต่างๆ จะถูกจัดเก็บไว้ใน SD Card นี้ทั้งหมด ดังนั้นความเร็วในการสื่อสารรวมถึงคุณภาพของ SD Card ก็เป็นสิ่งที่ต้องคำนึงถึง ซึ่งโปรเจคนี้เลือกการ์ดที่เป็น Class 10 ที่ความจุ 16GB เพื่อให้การใช้งาน Raspberry Pi มีประสิทธิภาพมากที่สุด

โครงสร้างของบอร์ด raspberry pi คือเปรียบเหมือนคอมพิวเตอร์ แต่ต้องมี sd card เพื่อใช้เป็นความจำให้กับบอร์ด และต้องลงระบบปฎิบัติการ OS ใส่ใน SD card เพื่อนรันโปรแกรม

การจะใช้งาน บอร์ด Raspberry Pi นั้น ขั้นแรกจะต้องลงปฏิบัติการ Linux ให้กับบอร์ด Raspberry Pi เสียก่อน ซึ่งในโปรเจคนี้จะใช้ระบบปฏิบัติการ Raspbian (ราสเบียน) น่าจะมาจากคำว่า Raspberry + Debian  เป็นระบบปฏิบัติการที่มีรากฐานมาจากระบบปฏิบัติการ Debian (เดเบียน) ซึ่งแตกตัวออกมาจากระบบปฏิบัติการ Linux โดยได้รับการออกแบบให้รันบนฮาร์ดแวร์ Raspberry PI ดังนั้น คำสั่งต่างๆ ของ Raspbian จึงจะเหมือนกับคำสั่งที่มีใช้งานบนระบบปฏิบัติการ Linux รวมทั้ง Ubuntu เกือบทั้งหมด จะมีแตกต่างกันบ้างเล็กน้อยเท่านั้น

ในใช้งาน บอร์ด Raspberry Pi นั้น Raspbian (ราสเบียน) เป็น OS ที่ได้รับความนิยม เนื่องจากใช้งานง่าย มี x-windows ติดต่อกับผู้ใช้ได้ง่าย, มี Application และ เครื่องมือบางอย่างติดตั้งมาให้แล้ว และยังได้ติดตั้ง Python 3 (IDLE) และ RPi.GPIO (โมดูลสำหรับอินเตอร์เฟสกับพอร์ต GPIO ของ Raspberry Pi) มาไว้เรียบร้อยในตัวแล้ว

3.3 raspberry pi 3 บอร์ดที่ใช้ในการพัฒนาเขียนโค้ดสั่งควบคุมตัวหุ่นยนต์ โดยใช้ภาษา python 3

Motordrive ใช้ในการควบคุมมอเตอร์ทั้ง 4 ล้อ

 

สายไฟที่ใช้เสียบต่อกันระหว่างบอร์ด

สวิตช์

 

4WD Smart Robot Car Chassis Kits

Camera V2 Module 8MP

3.4การต่อวงจร

ใช้ จั้มเปอร์ ผู้-เมีย ความยาว 20 เซ็นติเมตร เชื่อมต่อจาก GND ของ Motor Driver (จะเสียบ 2 สายในช่องเดียวกัน) ในตัวอย่างเป็นสายสีน้ำเงิน ไปยัง GND ของ Raspberry Pi

 

 

 

 

เชื่อมต่อสายควบคุมมอเตอร์ จำนวน 4 เส้น  ระหว่าง Raspberry Pi กับ Motor Driver ในตัวอย่าง เป็นสาย สีน้ำตาล-สีม่วง-สีเขียว-สีเหลือง

 

 

 

 

 

3.5flowchart

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3.5.2 Source Code

โค้ดที่ใช้บังคับล้อทั้ง 4 ขอหุ่นยนต์

import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BOARD)
GPIO.setup(11,GPIO.OUT)
GPIO.setup(13,GPIO.OUT)
GPIO.setup(35,GPIO.OUT)
GPIO.setup(37,GPIO.OUT)
#ForWard
GPIO.output(11,True)
GPIO.output(13,False)
GPIO.output(35,True)
GPIO.output(37,False)
time.sleep(0.4)
#Stop
GPIO.output(11,False)
GPIO.output(13,False)
GPIO.output(35,False)
GPIO.output(37,False)
time.sleep(0.6)
#BackWard
GPIO.output(11,False)
GPIO.output(13,True)
GPIO.output(35,False)
GPIO.output(37,True)
time.sleep(0.4)
#TurnLeft
GPIO.output(11,True)
GPIO.output(13,False)
GPIO.output(35,False)
GPIO.output(37,False)
time.sleep(0.6)
#Stop
GPIO.output(11,False)
GPIO.output(13,False)
GPIO.output(35,False)
GPIO.output(37,False)
time.sleep(0.6)
#TurnRight
GPIO.output(11,False)
GPIO.output(13,False)
GPIO.output(35,True)
GPIO.output(37,False)
time.sleep(0.6)
GPIO.cleanup()

โค้ด app.py
#######
# Author: RobotSiam.com
# Date: 18 August 2018
#
# app.py
#######

from flask import Flask, render_template, request, redirect, url_for, make_response
import motors
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BOARD) #set up GPIO

app = Flask(__name__) #set up flask server

#when the root IP is selected, return index.html page
@app.route(‘/’)
def index():

return render_template(‘index.html’)

#recieve which pin to change from the button press on index.html
#each button returns a number that triggers a command in this function
#
#Uses methods from motors.py to send commands to the GPIO to operate the motors
@app.route(‘/<changepin>’, methods=[‘POST’])
def reroute(changepin):

changePin = int(changepin) #cast changepin to an int

if changePin == 1:
motors.turnLeft()
elif changePin == 2:
motors.forward()
elif changePin == 3:
motors.turnRight()
elif changePin == 4:
motors.backward()
else:
motors.stop()

response = make_response(redirect(url_for(‘index’)))
return(response)

app.run(debug=True, host=’0.0.0.0′, port=8000) #set up the server in debug mode to the port 800

โค้ด motors.py
#######
# Author: RobotSiam.com
# Date: 15 August 2018
#
# motors.py
#######

import RPi.GPIO as GPIO
import time

#set GPIO numbering mode and define output pins
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
GPIO.setup(11,GPIO.OUT)
GPIO.setup(13,GPIO.OUT)
GPIO.setup(35,GPIO.OUT)
GPIO.setup(37,GPIO.OUT)

def forward():
print(“Going Forwards”)
GPIO.output(11,True)
GPIO.output(13,False)
GPIO.output(35,True)
GPIO.output(37,False)
time.sleep(0.3)
GPIO.output(11,False)
GPIO.output(13,False)
GPIO.output(35,False)
GPIO.output(37,False)

def backward():
print(“Going Backwards”)
GPIO.output(11,False)
GPIO.output(13,True)
GPIO.output(35,False)
GPIO.output(37,True)
time.sleep(0.3)
GPIO.output(11,False)
GPIO.output(13,False)
GPIO.output(35,False)
GPIO.output(37,False)

def turnRight():
print(“Going Right”)
GPIO.output(11,False)
GPIO.output(13,False)
GPIO.output(35,True)
GPIO.output(37,False)
time.sleep(0.3)
GPIO.output(11,False)
GPIO.output(13,False)
GPIO.output(35,False)
GPIO.output(37,False)

def turnLeft():
print(“Going Left”)
GPIO.output(11,True)
GPIO.output(13,False)
GPIO.output(35,False)
GPIO.output(37,False)
time.sleep(0.3)
GPIO.output(11,False)
GPIO.output(13,False)
GPIO.output(35,False)
GPIO.output(37,False)

def stop():
print(“Stopping”)
GPIO.output(11,False)
GPIO.output(13,False)
GPIO.output(35,False)
GPIO.output(37,False)

โค้ด index.html

<!DOCTYPE html>

<html>
<head>
<title>Web Robot</title>
<meta name=”viewport” content=”width=device-width, initial-scale=1″>
</head>
<style>
table ,td, tr {
width: 30%;
}
</style>
<body>
<table style=”width:100%; max-width: 500px; height:300px;”>
<tr>
<td>
<form action=”/1″ method=”POST”>
<input type=”image” name=”direction” src=”/static/img/left.svg” value=”left” style=”float:left; width:80% ;”>
</br>
</form>
</td>
<td>
<form action=”/2″ method=”POST”>
<input type=”image” name=”direction” src=”/static/img/forward.svg” value=”forward” style=”float:left; width:80%;”>
</br>
</form>
</td>
<td>
<form action=”/3″ method=”POST”>
<input type=”image” name=”direction” src=”/static/img/right.svg” value=”right” style=”float:left; width:80%;”>
</br>
</form>
</td>
</tr>
<tr>
<td>
<form action=”/4″ method=”POST”>
<input type=”image” name=”direction” src=”/static/img/reverse.svg” value=”reverse” style=” margin-left:80px; width:80%;”>
</br>
</form>
</td>
<td>
<form action=”/5″ method=”POST”>
<input type=”image” name=”direction” src=”/static/img/stop.svg” value=”stop” style=”margin-left:80px; width:80%;”>
</br>
</form>
</td>
</tr>
</table>
</body>
</html>
คำสั่งการทำงาน ป้อนลงโปรแกรม
cd web_robot
sudo python app.py
3.5.3)แหลงที่มาของโค้ด
http://www.robotsiam.com
3.6) ขอบเขตและข้อจำกัดของโปรแกรมที่พัฒนา
โปรแกรมที่ใช้มีขอบเขตค่อนข้างกว้าง เพราะสามารถเขียนโค้ดใส่ลงไปได้หลายแบบ ให้ทำงานตามที่เราต้องการได้หลากหลายมาก ข้อจำกัดอาจมีช้าบ้างในการเขียน เกิดจากความไม่เสถียรของ ตัวโปรแกรมกับบอร์ด raspberry pi
4) กลุ่มผู้ใช้โปรแกรม พร้อมผลการประเมินจากผู้ใช้
จากเว็บของ raspberry pi เองบอกว่า
codec ทำให้ Raspberry Pi to decode MPEG-2/VC-1 video in hardware น่าจะลื่นกว่า software
มี Python script ที่เขียนเอาไว้หลายตัวให้เลือกใช้ได้เลย
run แล้วได้เป็น web server เลย เรียกใช้งานผ่าน browser สำหรับเปิดปิดได้เลย
เพราะการสั่ง GPIO ในโหมด output ให้ทำงานง่ายมาก
เราสั่งผ่าน shell ได้ง่ายๆเลย
ตัวอย่างเรียกใช้ GPIO4
สั่ง logic 1
#echo “1″ > /sys/class/gpio/gpio4/value
และ logic 0 ได้ด้วยคำสั่ง
#echo “0″ > /sys/class/gpio/gpio4/value
ผลประเมินสามารถใช้ได้หลากลายมากครับ
มีทั้งข้อดีและข้อเสีย
5) ผลของการทดสอบโปรแกรม ให้ใส่รูปแสดงการทำงานของชิ้นงาน และใส่ตารางผลการทดลอง
 
 ทดสอบการทำงานของโปรแกรม โดยไปที่ Run -> Run Module (หรือกด F5)
ถ้าการต่อหุ่นยนต์ของเรานั้นถูกต้อง ปกติ หุ่นยนต์ จะ เดินหน้า->ถอยหลัง->เลี้ยวซ้าย->เลี้ยวขวา ตามวีดีโอ ถ้าไม่ปกติ ให้ทำการตรวจสอบการประกอบ และการต่อสายต่างๆ แล้วทำการแก้ไขให้ถูกต้อง
ผลการทดลอง
รถสามารถขยับตามโค้ดที่เขียนไว้ได้ ไม่มีปัญหา
6) ปัญหาและอุปสรรค
1.ระหว่างที่ทดสอบการเชื่อมต่อละหว่างบอร์ดกับเว็บ อาจมีดีเลย์บ้าง
2.กล้องที่ติด อาจจะประมวลผลช้ากว่าปกติ
3.น้ำหนักที่ใส่ในตัวหุ่นยนต์เยอะไปทำให้ขยับได้ไม่เต็มที่
4.ต้องเพิ่มแหล่งให้พลังงานมอเตอร์ทั้ง 4
7) แนวทางในการพัฒนาต่อในอนาคต สามารถประยุกต์ใช้ร่วมกับงานอื่น ๆ ได้อย่างไร
ทางกลุ่มเราจะต้องพัฒนาระบบให้เกิดความเสถียรมากขึ้น เพื่อสะดวกต่อผู้ที่ต้องการใช้งาน ต้องทำให้เห็นว่าสามารถใช้ได้จริง จะได้มีประโยชน์ในการทำงานมากขึ้น
สามารถนำมาประยุกต์ใช้ร่วมกับการสำรวจพื้นที่ ที่เราไม่สามารถเข้าไปได้ และอีกหลายๆอย่างที่เราจะจินตนาการออก
8) ข้อสรุปและข้อเสนอแนะ
จากการที่เราได้ทำหุ่นยนต์ติดกล้อง raspberry pi ควบคุมด้วยเว็บเพจ ทำให้เราศึกษาการใช้โค้ดและโปรแกรมที่เกี่ยวข้องมากขึ้น และผลของการทำก็เป็นไปตามขั้นตอนที่ได้วางแผนไว้
9) แหล่งที่มาอ้างอิง (Reference)
http://www.robotsiam.comในเว็ปนี้มีหลายโปรเจคให้ศึกษาอีกมากมาย
YouTube Preview Image
YouTube Preview Image
  •  
  •  
  •  
  •  
  •  
  •  
MONGKOLCHAI DORNNAM
at GlurGeek.Com

Leave a Reply