jojorge01:
Fala cara.... quanto ao código tô pondo os dois no final..... ok... acredito que dá pra customizar para uma melhor performace e aparência (no do N95), mas agora tô fazendo tudo funcionar e depois vou voltar olhando o que pode ser melhorado... sugestões e críticas sào MUITO BEM VINDAS.
Quanto ao controle.... minha idéia é ligar ele o controle de PS2 no arduino... ler os comandos e enviar via bluethoot tb.... preciso pesquisar direitinho como isso funciona.... tb já achei pra compar um shield que é o direcional pronto para ser usado.... tb é uma opção.... ainda voi amadurecer a idéia e continuar postanto aqui.... faça o mesmo vc tb... o nosso tópico já tem bastante coisa legal!!!!!
segue o código:
int ENA=5;//connected to Arduino's port 5(output pwm)
int IN1=2;//connected to Arduino's port 2
int IN2=3;//connected to Arduino's port 3
int ENB=6;//connected to Arduino's port 6(output pwm)
int IN3=4;//connected to Arduino's port 4
int IN4=7;//connected to Arduino's port 7
byte VelocidadeAtual = 255;
void setup()
{
pinMode(ENA,OUTPUT);//output
pinMode(ENB,OUTPUT);
pinMode(IN1,OUTPUT);
pinMode(IN2,OUTPUT);
pinMode(IN3,OUTPUT);
pinMode(IN4,OUTPUT);
Serial.begin(9600);
}
void loop()
{
// ena = velocidade
// in = direção
char c = Serial.read();
// aqui precisa melhorar, tirar os ifs e colocar algo mais eficiente
if (c == '1')
{
// para frente
AndaParaFrente();
FuncionaMotor(VelocidadeAtual);
}
if (c == '2')
{
// para trás
AndaParaTraz();
FuncionaMotor(VelocidadeAtual);
}
if (c == '3')
{
// direita
// começa a funcionar com 90
ViraDireita();
FuncionaMotorA(VelocidadeAtual * .4);
FuncionaMotorB(VelocidadeAtual);
}
if (c == '4')
{
// direita
// começa a funcionar com 90
ViraEsquerda();
FuncionaMotorA(VelocidadeAtual);
FuncionaMotorB(VelocidadeAtual * .4 );
}
if (c == '5')
{
// para
ParaMotores();
}
}
//------------------------------------------------------------------------------------------
// Liga os motores e determina a velocidade
//------------------------------------------------------------------------------------------
void FuncionaMotor(byte Velocidade)
{
FuncionaMotorA(Velocidade);
FuncionaMotorB(Velocidade);
}
void FuncionaMotorA(byte Velocidade)
{
analogWrite(ENA, Velocidade);//start driving motorA
}
void FuncionaMotorB(byte Velocidade)
{
analogWrite(ENB, Velocidade);//start driving motorA
}
void ParaMotores()
{
digitalWrite(ENA,LOW);
digitalWrite(ENB,LOW);//stop driving
}
//------------------------------------------------------------------------------------------
// FIM - Liga os motores e determina a velocidade
//------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------
// Direcoes
//------------------------------------------------------------------------------------------
void AndaParaFrente()
{
// MOTOR 1
digitalWrite(IN1,LOW);
digitalWrite(IN2,HIGH);//setting motorA's directon
// MOTOR 2
digitalWrite(IN3,LOW);
digitalWrite(IN4,HIGH);//setting motorB's directon
}
void AndaParaTraz()
{
// MOTOR 1
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);//setting motorA's directon
// MOTOR 2
digitalWrite(IN3,HIGH);
digitalWrite(IN4,LOW);//setting motorB's directon
}
void ViraEsquerda()
{
// MOTOR 1
digitalWrite(IN1,LOW);
digitalWrite(IN2,HIGH);//setting motorA's directon
// MOTOR 2
digitalWrite(IN3,HIGH);
digitalWrite(IN4,LOW);//setting motorB's directon
}
void ViraDireita()
{
// MOTOR 1
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);//setting motorA's directon
// MOTOR 2
digitalWrite(IN3,LOW);
digitalWrite(IN4,HIGH);//setting motorB's directon
}
Para o N95, isto que estou postando é um script que roda em Python... então precisa ter ele instalado na máquina... vc acha ele aqui: http://sourceforge.net/projects/pys60 o livro que use como base foi este: "Wiley Mobile Python-Rapid prototyping of applications on the mobile platform"... dá pra achar tranquilo, é só procurar.
A idéia é, primeiro se conectar ao bluethoot do carrinho, depois, quando o cara apertar o direcional para cima vai aparecer uma bolinha vermelha no topo da tela para indicar no celular a direção e enquanto vc mantém a tecla pressionada o script fica enviando o caractere "1" que no arduino tá programado para ele andar pra frente.... quando vc solta o direcional ele para de mandar o 1 e desliga os motores!!!! Funciona assim para as quatro direções.
Segue o código:
import appuifw, e32, key_codes, graphics, socket
def choose_service(services):
names = []
channels = []
for name, channel in services.items():
names.append(name)
channels.append(channel)
index = appuifw.popup_menu(names, u"Choose service")
return channels[index]
def connect():
global sock
address, services = socket.bt_discover()
channel = choose_service(services)
sock = socket.socket(socket.AF_BT, socket.SOCK_STREAM)
print "address:", address
print "channel:", channel
sock.connect((address, channel))
def frente():
global sock
sock.send("1")
def tras():
global sock
sock.send("2")
def esquerda():
global sock
sock.send("3")
def direita():
global sock
sock.send("4")
def desliga():
global sock
sock.send("5")
WHITE = (255,255,255)
RED = (255,0,0)
BLUE = (0,0,255)
YELLOW = (255,255,0)
def handle_redraw(rect):
if img: canvas.blit(img)
def draw_point(pos):
if pos == 1:
img.point((125,30), outline = RED, width = 50)
elif pos == 2:
img.point((125,285), outline = RED, width = 50)
elif pos == 3:
img.point((200,170), outline = RED, width = 50)
elif pos == 4:
img.point((35,170), outline = RED, width = 50)
key_down = None
clicked = None
def handle_event(event):
global clicked, key_down
if event['type'] == appuifw.EEventKey:
if key_down:
key_down = (event['keycode'], "down")
else:
key_down = (event['keycode'], "pressed")
elif event['type'] == appuifw.EEventKeyUp and key_down:
code, mode = key_down
if mode == "pressed":
clicked = code
key_down = None
desliga()
img.clear(BLUE)
handle_redraw(None)
def key_clicked(code):
global clicked
if code == clicked:
clicked = None
return True
return False
def key_is_down(code):
if key_down and key_down == (code, "down"):
return True
return False
def quit():
global running
running = False
img = None
canvas = appuifw.Canvas(redraw_callback = handle_redraw, event_callback=handle_event)
appuifw.app.body = canvas
appuifw.app.screen = 'full'
appuifw.app.exit_key_handler = quit
appuifw.app.menu = [(u"Connect", connect)]
w, h = canvas.size
img = graphics.Image.new((w, h))
img.clear(BLUE)
running = True
while running:
e32.ao_sleep(0.05)
if key_is_down(key_codes.EKeyUpArrow):
draw_point(1)
frente()
elif key_is_down(key_codes.EKeyDownArrow):
draw_point(2)
tras()
elif key_is_down(key_codes.EKeyRightArrow):
draw_point(3)
direita()
elif key_is_down(key_codes.EKeyLeftArrow):
draw_point(4)
esquerda()
else:
img.clear(BLUE)
Mais uma vez, [u]**dúvidas, discussões, sugestões e críticas são bem vindas**[/u]....
Abraço!
Jo,
Não entendi muito bem esta segunda parte. Devo instalar o Python no meu Android e adicionar esse Script? É isso?
OBS: Instalei o Python e os comando dele são: "=, (, ), " e TAB. Tem que alterar algo?