martes, 21 de agosto de 2012

Controlling Robot with Cell Phone



Currently in progress the mobile telephony grows exponentially to the point that we can have Mhz to Ghz processors in our cellphones, this begs the question, if I have this in my hands can I do more with my phone and not just to call, be on the Internet or play?
But how we can attach high tech or middle tech phone to a robot? well to do this you need to use a device that for me revolutionized the world of electronics or microcontrollers programmed and that is Arduino.
Arduino is an open development platform more versatile of the world there is nothing else to compare with it, because it opened the doors of electronics programmed everyone, so today we see a lot of people without to do with the electronics that make interesting applications, that’s not my case, I do go through stages of electronics and programming with PIC, Freescale and finally Arduino and stayed with Arduino.

What is about the Project?


1 4WD platform

1 lipo battery

2 buck converter (* not strictly necessary)

1 Arduino ( I use Mega)

1 Bluetooth Module

1 GPS (not used in part one)

1 Compass (not used in part one)

1 Mobile Nokia Symbian S60

We now turn to the programming of the phone, I have obtained information on this page:
This is the code for using blutooth communication between Nokia and the robot:
Thanks

Material

2 H Bridge (in my case using two H bridge Pololu)

The first thing we must do is make the reception of data by the Arduino. we have to connect our computer to Arduino and program the serial communication. we must bear in mind that we are going to send several data through the serial port so it is important that at the time of making the communication we have to have a start and an end character.

Keep in mind that in my case when using an arduino mega, I have several serial communication ports so you can use the library "NewSoftSerial" but the baud can not be very high as you run the risk of information loss. This project works at a speed of 9600 baud

Arduino code:

void ReadData(){
  if (Serial2.available()){
    digitalWrite(13,LOW);
    Dato = Serial2.read();

    if(Dato==’$’){
      while(1){
        if(Serial2.available()){
          Dato = Serial2.read();

          Data_Array[conta] = Dato;
          if(Dato==’&’){
            int A = Data_Array[0]-48;
            int B = Data_Array[1]-48;
            int C = Data_Array[2]-48;
            int D = Data_Array[3]-48;

            if(C == -10){
              Action = A*10 + B*1;
            }
            else if(D == -100){
              Action = A*100 + B*10 + C*1;
            }
            else{
              Action = 0;
            }
            Serial.print(A);
            Serial.print(B);
            Serial.print©;
            Serial.print(D);
Serial.print(“Action: 
            “);
            Serial.println(Action);

            Data_Array[0] = 0;
            Data_Array[1] = 0;
            Data_Array[2] = 0;
            Data_Array[3] = 0;
            Data_Array[4] = 0;
            Data_Array[5] = 0;
            Data_Array[6] = 0;
            conta=0;
            break;
          }
          conta++;
        }
      }
    }
  }
}

The array size depends on the amount of data you are sending, in my case the start character is "$" and the end character is"&". With the stored data in the array we only need to subtract 48, this is done becouse the mobile or the serial port of your computer sends data in ASCII, and mobile sends one character at a time. For example if we have the number "17", the mobile phone or the computer sends "49 = 1 and 55 = 7" and now if we subtract "48" have to "49-48 = 1 and 55-48 = 7" but these are two separate issues but we sent the seventeen for this reason we have to multiply units by 1 and tens by 10. If we have hundreds as one number it has to be multiplied by 100 and so on.
Right now we do this "(1 * 10) + (7 * 1) = 17. This is shown below:

if(Dato==’&’){
int A = Data_Array[0]-48;
int B = Data_Array[1]-48;
int C = Data_Array[2]-48;
int D = Data_Array[3]-48;

if(C == -10){
Action = A*10 + B*1;
}
else if(D == -10){
Action = A*100 + B*10 + C*1;
}
else{
Action = 0;
}

Why I ask ift "C == -10", this is because inside I'm sending data in the time that I want my robot to stop, I send a 3-digit number is the number 167. As the size of the array varies if I send two-digit number or three by the time it reaches the end of data character "&", this value is stored in the 4-position of the array and subtract "48" the result is -10 and this is because the "& = 38" with this result if the value sent is two or three digit numbers.

Once the data is stored in a array related to variable called "Acction" we can start the motor control, in this part I'll explain just how it has to be because the reader may have another H bridge

if(Acction==16){
Adelante
}
else if(Acction==17){
Atras
}
else if(Acction==14){
Izquierda
}
else if(Acction==15){
Derecha
}
else if(Acciton == 167 | Acction == 0){
Stop
}

and tha´s it!!!we have motor control.

http://www.developer.nokia.com/Community/Wiki/Python_on_Symbian here you will find all the information needed to program a Nokia with python.


Código Python para Nokia 5230 y Nokia C5


import os
import e32
import sys
import time
import math
import audio
import string
import camera
import thread
import appuifw
import key_codes 
from sensor import *
from graphics import *
from array import array
from graphics import Image


pys60_version_number = e32.pys60_version_info[0] * 10 + e32.pys60_version_info[1]
if pys60_version_number <= 14:
    import socket as btsocket
elif pys60_version_number >= 19:
    import btsocket

appuifw.app.orientation = "landscape"

# ---------------------------------------------------------------------------
# Constantes
BACKGROUND = (255, 255, 255)
# ---------------------------------------------------------------------------
# Variables
keyboard_state={}
last_keycode=0
Dat = [0,0]

app_lock = e32.Ao_lock()
# ---------------------------------------------------------------------------
#prepare canvas for drawing
canvas = appuifw.Canvas()    
appuifw.app.body = canvas
appuifw.app.screen = "full"
w, h = canvas.size
img = Image.new((w, h))
img.clear(BACKGROUND)

# ---------------------------------------------------------------------------
# Activar el Boton de salida
appuifw.app.exit_key_handler = quit

# ---------------------------------------------------------------------------
# Clase Bluetooth 
class BlueArduino:
   
def ConectarArduino(self):
print "Conectando..."
self.sock = btsocket.socket(btsocket.AF_BT,btsocket.SOCK_STREAM)
print "Buscando"
#only serial services are found. 
addr,services = btsocket.bt_discover()
print str(addr) + "Tiene " + str(len(services)) +" Servicios" 
print str(services)
if len(services):
   #create a choiselist and let the user choose which service to use.
   choiseList = services.keys()
   choiseList.sort()
   selected=appuifw.popup_menu([unicode(services[x])+": "+x for x in choiseList],u'select service:')
   self.host = (addr,services[choiseList[selected]])
else:
   raise(IOError)

print "connecting to " + str(self.host)
#bug? extended access software crashes on accept request from this device
self.sock.connect(self.host)

def EnviarArduino(self, data):
if(data=='$'):
self.sock.send(chr(36))
elif(data==','):
self.sock.send(chr(44))
elif(data=='&'):
self.sock.send(chr(38))
else:
self.sock.send(str(data))

    def flush(self):
        self.EnviarArduino(''.join([]))
           

def quit():
    global LOOP
    print "Quit!"
accelerometer.stop_listening()
    app_lock.signal()
    datafile.close()
# ---------------------------------------------------------------------------
# Inicializacion de Graficas 
def draw_text():
canvas.text(TEXT_LOC, u"" + TEXT, fill = TEXT_COLOR)
pass

def draw_background():
    canvas.clear(COLOR)
    handle_redraw(None)
pass

def handle_redraw(rect):
    if img:
        canvas.blit(img)
pass

def handle_event(event):
    handle_redraw(None)

# ---------------------------------------------------------------------------
# Inicializacion de las Teclas 
def draw_state():
    canvas.clear()
canvas.text((w-100,50),u' '.join([unicode(k) for k in keyboard_state if keyboard_state[k]]))
#app.EnviarArduino(u' '.join([unicode(k) for k in keyboard_state if keyboard_state[k]]))

def callback(event):
    global last_keycode
    if event['type'] == appuifw.EEventKeyDown:
        keyboard_state[event['scancode']]=1
    elif event['type'] == appuifw.EEventKeyUp:
        keyboard_state[event['scancode']]=0
    elif event['type'] == appuifw.EEventKey:
        last_keycode=event['keycode']
    #draw_state()

# ---------------------------------------------------------------------------
def Flechas():
    Dato = []
    canvas.clear()
    canvas.text((0,50),u' '.join([unicode(k) for k in keyboard_state if keyboard_state[k]]))
    Dato = u' '.join([unicode(k) for k in keyboard_state if keyboard_state[k]])     
    return Dato

# ---------------------------------------------------------------------------
# Interfaz Grafica
canvas=appuifw.Canvas(event_callback=callback,redraw_callback=lambda rect:draw_state())
appuifw.app.body=canvas

# ---------------------------------------------------------------------------
# Programa Principal

app = BlueArduino() # Invocamos la clase para la comunicacion Bluetooth
app.ConectarArduino() # Realizamos la Coneccion con el dispositivo Bluetooth

while 1:
e32.ao_yield()
canvas.text((w/2-20,20),u"Teclado")
Dat = Flechas()  # envia los codigos, correspondiente a la flecha
app.EnviarArduino('$')
app.EnviarArduino(Dat)
app.EnviarArduino('&')


In part two, I will explain how to make our mobile robot control and evade the obstacles with sharp distance sensors.













Thanks






No hay comentarios:

Publicar un comentario