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
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.
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