Components of Robot

In front of the robot
  • Ultrasonic Range Finder
  • Servo
  • Battery 12V 


Side of the robot
  • Wheels
  • Arduino
  • Raspberry Pi
  • Power bank 5V
  • Module motors
  • Mini Wireless USB Adapter
  • USB cable 


We use android to control the robot.
This video is how to control the robot by using android. http://youtu.be/sBGw6SeVnwc

การประยุกต์ใช้งาน TCP/IP server เเละ Serial

จากที่กล่าวไว้คราวที่เเล้ว ว่าเราใช้ Raspberry Pi (จากนี้จะเรียกสั้นๆว่า RPi ) เป็นตัวกลางในการติดต่อระหว่าง Android เเละ Arduino ดังรูป
จากรูปด้านบนเราจึงจำเป็นที่จะต้องประยุกต์ระหว่าง TCP/IP เเละ Serial เข้าด้วยกัน โดยสามารถเขียน Code Python ได้ดังนี้
โดยสังเกตุว่าจะมี 2 ฟังก์ชั่นหลักๆในการทำงานคือ read_arduino เเละ read_android
  • read_arduino() มีหน้าที่ในการรับค่าจาก Arduinoเป็น Serialมาเเล้วส่งผ่านให้ Android  ด้วยTCP/IP 
  • read_android() ทีหน้าที่ในการรับค่าจาก Android TCP/IP มาเเล้วส่งผ่านให้ Arduino ด้วย Serial
ทำไมต้องใช้ Thread ??
  • เนื่องจากการรับเเละส่งข้อมูลทั้ง 2 ฝากเกิดในเวลาพร้อมกันจึงเพิ่มประสิทธิภาพสูงสุดของการรับเเละส่งข้อมูลด้วยการที่ทำให้ 2 Thread ทำงานพร้อมๆ กัน 

การสร้าง Server ด้วย Python

การสร้าง Server ด้วย Python :
ทำไมต้องมี Server ? 
  • เนื่องจากโปรเจคนี้เราต้องการส่งค่าผ่านจาก Android ผ่านไปยัง Arduino จึงจำเป็นต้องมี Server เป็นตัวกลางในการรับเเละส่งข้อมูล
ทำไมต้อง Python ?
  • เนื่องจาก Python เป็นภาษาที่ใช้งานง่ายเเละสามารถรันบน Raspberry Pi ได้เป็นอย่างดี
ดังนั้นเมื่อมีเหตุผลครบเเล้วเรามาเริ่มสร้าง Server ด้วย Python กันเลย !
พอพูดถึง Server ก็จะมี Protocal ที่นิยมใช้อยู่ 2 ประเภท คือ TCP/IP หรือ UDP ในที่นี้จะเลือกการใช้งานเเบบ TCP/IP นะครับ สงสัยเพิ่มเติมหาข้อมูลที่ http://www.avrportal.com/forum/index.php?topic=79.0 ได้เลย เนื่องจาก python ได้มีการเเจก Code Server ไว้อยู่เเล้วที่ลิงค์ https://wiki.python.org/moin/TcpCommunication จึงได้นำมาศึกษาเเละปรับปรุงโดยที่จะใช้ Code ที่เป็น Code Server ดังต่อไปนี้ 

   1 #!/usr/bin/env python
   2 
   3 import socket
   4 
   5
   6 TCP_IP = '127.0.0.1' #Server IP Address
   7 TCP_PORT = 5005 #Server Port
   8 BUFFER_SIZE = 20  # Normally 1024, but we want fast response
   9 
  10 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #Open socket
  11 s.bind((TCP_IP, TCP_PORT))
  12 s.listen(1)
  13 
  14 conn, addr = s.accept()
  15 print 'Connection address:', addr
  16 while 1:
  17     data = conn.recv(BUFFER_SIZE)
  18     if not data: break
  19     print "received data:", data
  20     conn.send(data)  # echo
  21 conn.close()
โดยที่ Code ตัวอย่างนี้จะทำงานคือรับค่าจาก Client เเละส่งค่ากลับไปเเสดงผลที่ Client

การสื่อสารระหว่าง Arduino เเละ Raspberry Pi ด้วย Serial Port

Part : Serial Communication of Arduino & Raspberry Pi
เนื่องจากการเชื่อมต่อของทั้ง 2 อุปกรณ์เป็นเเบบ Serial ดังนั้น จำเป้นต้องมีอุปกรณ์เเละซอร์ฟเเวร์ดังนี้

  • Arduino 
  • Raspberry Pi
  • USB cable
  • Python on RPi OS 
  • Pyserial  
การติดตั้ง Python บน RPi ทำได้โดยการใช้คำสั่ง 

  • sudo apt-get install python-dev
หลังจากนั้นเพื่อการสื่อสารเเบบ Serial ใน Python ต้องมีการติดต่อ Library  ที่ชื่อ Pyserial
โดยใช้คำสั่ง  
  • sudo apt-get install python-serial 
จากนั้นลองเขียนโปรเเกรม Serial อย่างง่ายของ Arduino เช่น
1void setup(){
2  Serial.begin(9600);
3}
4
5void loop(){
6  Serial.println("Hello Pi");
7  delay(2000);
8}
โปรเเกรมด้านบนจะทำหน้าที่ส่ง String "Hello Pi" ผ่าน Serial port ทุก 2 วินาที เพื่อเตรียมการสื่อสารกับ RPi
จากนั้นทำการ Load code ลง Arduino ให้เรียบร้อยเเล้วนำสายเชื่อมต่อระกว่าง Arduino เเละ RPi ดังภาพ

การเชื่อต่อระหว่าง  RPi เเละ Arduino

จากนั้นทำให้การเขียน Code python ใน RPi เพื่อทำการรับค่าจาก Arduino 

import serial
ser = serial.Serial('/dev/ttyACM0', 9600)  
โดยที่ ttyACM'0 คือ port usb ที่เชื่อต่อกับ RPi สามารถเรียกดูได้ตมคำสั่ง
ls /dev/tty*
เเละรับค่า Serial จาก Arduino ได้ด้วยคำสั่งนี้ 
while 1 :
    ser.readline()
เเละโดยที่ ser.write("Hello Arduino") เป็นคำสั่งที่ส่งค่าจาก RPi ไปยัง Arduino