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

Using Raspberry pi as Server for Android and Arduino

การเชื่อมต่อ RPi เบื้องต้น 

  • ทำการ Remote RPi ด้วย Terminal ใน Linux หรือ Putty ใน Window ในที่นี้จะใช้ Putty ในการ Remote  โดยเริ่มจากการติดตั้ง SD การ์ดที่มี OS ของ RPi ก่อน หากใครยังไม่มีสามารถศึกษาได้ที่  http://downloads.raspberrypi.org/images/raspbian/2012-12-16-wheezy-raspbian/2012-12-16-wheezy-raspbian.zip หลังจาก Boot RPi ขึ้นมาให้ติดตั้งสายแลนเข้ากับบอร์ด RPi เเละเปิดโปรเเกรม putty เพื่อเตรียมทำการ log in
รูปการต่อ RPi เข้ากับ Ethernet module เพื่อการ Remote RPi


  • หลังจากต่อเชื่อมเสร็จให้ทำการเปิด โปรเเกรม putty เพื่อ remote RPi โดยใช้ mode  SSH เเละป้อน IP ของ RPi ให้ถูกต้องโดยที่การ log in ครั้งเเรก User จะเป็น Pi เเล้ว password จะเป็น raspberry
การ ใช้ Putty ในการ Remote RPi

หลังจาก log in สำเร็จจะเข้ามาที่หน้านี้


  • หลังจาก log in เข้ามาได้ สามารถใช้คำสั่ง $sudo raspi-config เพื่อตั้งค่าต่างๆให้กับ RPi ได้ 

Using Arduino with Ultrasonic Range Finder

Progress of mini-project

Part: Arduino

  • ทำการทดลองส่งข้อมูลจาก putty ผ่านสาย Serial port ไปยัง Arduino เพื่อจำลองการควบคุมการทำงานของ motor โดยใช้ LED แสดงทิศทางการหมุนของล้อทั้งสองข้างได้แก่ เดินหน้า ถอยหลัง เลี้ยวซ้าย และ เลี้ยวขวา
ผลการทดลอง: ถ้า LED สว่าง แสดงว่าล้อข้างนั้นหมุนทวนเข็มนาฬิกา ถ้า LED ดับ แสดงว่าล้อข้างนั้นหมุนตามเข็มนาฬิกา
     เมื่อกดปุ่ม w หมายถึงเดินหน้า ล้อด้านซ้ายหมุนทวนเข็มนาฬิกา ล้อด้านขวาหมุนตามเข็มนาฬิกา
     ทำให้ LED ด้านซ้ายติด ด้านขวาดับ

     เมื่อกดปุ่ม s หมายถึงถอยหลัง ล้อด้านซ้ายหมุนตามเข็มนาฬิกา ล้อด้านขวาหมุนทวนเข็มนาฬิกา
     ทำให้ LED ด้านซ้ายดับ ด้านขวาติด


     เมื่อกดปุ่ม a หมายถึงเลี้ยวซ้าย ล้อด้านซ้ายหมุนตามเข็มนาฬิกา ล้อด้านขวาหมุนตามเข็มนาฬิกา
     ทำให้ LED ด้านซ้ายดับ ด้านขวาดับ


     เมื่อกดปุ่ม d หมายถึงเลี้ยวขวา ล้อด้านซ้ายหมุนทวนเข็มนาฬิกา ล้อด้านขวาหมุนทวนเข็มนาฬิกา
     ทำให้ LED ด้านซ้ายติด ด้านขวาติด

  • ทำการทดลองใช้ Arduino รับข้อมูลจาก Ultrasonic Range Finder เพื่อหาระยะทางของสิ่งกีดขวางแล้วส่งข้อมูลระยะทางผ่านสาย Serial port ไปยัง putty โดยจะส่งข้อมูลระยะทางครั้งละ 6 บิตที่อยู่ตรงกลางของ package โดยบิตที่เหลืออีก 2 บิตจะเป็น 0 ที่บิตแรกและบิดสุดท้ายจะเป็น 0 เมื่อได้ส่งข้อมูลครบทุก package แต่ถ้าบิตสุดท้ายเป็น 1 แสดงว่ายังส่งข้อมูลระยะทางไม่ครบทุก package
ผลการทดลอง :

Proposal

Objective
  • To study the function of the devices such as Raspberry Pi (RPi), Arduino, Motor Driver Module, Android, Ultrasonic range finder or Infrared distance sensor
  • To study the transmission through the Android WiFi by sending commands from a TCP / IP or UDP to RPi.  
Block Diagram
 Devices


Work Breakdown Structure (WBS)