LusoRobótica - Robótica em Português
Software => C/C++ => Tópico iniciado por: Psycop em 28 de Janeiro de 2012, 11:14
-
Olá
Eu gostaria de controlar o Arduino via teclado em tempo real, sem que tivesse que inserir a tecla no SerialMonitor e efectuar o send para cada acção:
Neste momento estou a utilizar esse método, e o seguinte código:
int n;
int motorPin1 = 5;
int motorPin2 = 6;
int motorPin3 = 10;
int motorPin4 = 11;
void setup()
{
Serial.begin(9600);
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
pinMode(motorPin3, OUTPUT);
pinMode(motorPin4, OUTPUT);
}
void loop()
{
if (Serial.available() > 0)
{
n = Serial.read();
Serial.print("Voce Digitou: ");
Serial.println(n, BYTE);
if (n == 119)
{
//Avançar
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);
digitalWrite(motorPin3, HIGH);
digitalWrite(motorPin4, LOW);
}
if ( n == 115)
{
//Recuar
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, HIGH);
}
if ( n == 100)
{
//Direita
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, HIGH);
}
if ( n == 97)
{
//Esquerda
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, HIGH);
digitalWrite(motorPin4, LOW);
}
if (n == 113)
{
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, LOW);
}
}
}
Pesquisei na Internet como controlar o Arduino via Teclado em tempo real, mas não encontrei nenhuma informação esclarecedora. Alguém me poderá dar umas dicas de como fazer e o que utilizar?
Cumps
-
http://www.arduino.cc/playground/Main/PS2Keyboard (http://www.arduino.cc/playground/Main/PS2Keyboard)
-
O mais simples deve ser fazeres uma aplicação em processing ( http://processing.org/ (http://processing.org/)), embora também possas utilizar outras linguagens.
Aqui tens um exemplo:
import processing.serial.*;
Serial myPort;
void setup()
{
size(200,200);
// Change "COM19" by your board's COM port
myPort = new Serial(this, "COM19", 9600);
}
void draw()
{
}
void keyPressed()
{
if (key == CODED)
{
if (keyCode == UP)
myPort.write('w');
else if (keyCode == DOWN)
myPort.write('s');
else if (keyCode == LEFT)
myPort.write('a');
else if (keyCode == RIGHT)
myPort.write('d');
}
else if (key == 's' || key == 'S')
{
myPort.write('g');
}
}
Deve bastar alterar os chars que estão a ser enviados por aqueles que queres receber :)
-
Olá
Estive a tentar fazer algo em processing e para já apenas consegui desenhar uma estrutura que eu queria com o seguinte código:
void setup()
{
size(200, 200);
noStroke();
background(0);
}
void draw()
{
//Seta avançar
triangle(100 , 25, 75, 75, 125, 75);
//Seta Esquerda
triangle(75 , 125, 75, 75, 25, 100);
//Seta Recuar
triangle(75 , 125, 100, 175, 125, 125);
//Seta Direita
triangle(175 , 100, 125, 75, 125, 125);
}
void keyPressed()
{
}
O que acontece é que eu ainda não percebi como poderei agora controlar as teclas juntamente com o que eu desenhei e transferir essa informação para o Arduino!
Alguém me pode dar umas dicas?
Cumps
-
Mas queres controlar com o teclado ou com o rato?
-
Olá
Eu quero controlar com o teclado, mas gostaria de ter uma interface visual também! Experimentar o controlo com o rato também seria um exercício interessante!
Eu agora não sei é como conectar o processing com o Arduino!
Aquele código que me mostraste apresenta alguns erros! Tenho de usar alguma biblioteca específica?
Cumps
-
O código que te mostrei anteriormente faz exactamente isso, cria uma porta série e envia ordens para o arduino quando carregas nas setas do teclado.
Experimenta e vê se funciona sff:
import processing.serial.*;
Serial myPort;
void setup()
{
size(200,200);
noStroke();
background(0);
// Change "COM35" by your board's COM port
myPort = new Serial(this, "COM35", 9600);
}
void draw()
{
//Seta avançar
triangle(100 , 25, 75, 75, 125, 75);
//Seta Esquerda
triangle(75 , 125, 75, 75, 25, 100);
//Seta Recuar
triangle(75 , 125, 100, 175, 125, 125);
//Seta Direita
triangle(175 , 100, 125, 75, 125, 125);
}
void keyPressed()
{
if (key == CODED)
{
if (keyCode == UP)
myPort.write(119);
else if (keyCode == DOWN)
myPort.write(115);
else if (keyCode == LEFT)
myPort.write(100);
else if (keyCode == RIGHT)
myPort.write(97);
}
else if (key == 's' || key == 'S')
{
myPort.write(113);
}}
PS: Desculpa, percebi agora que tinha escrito nums sitios "myPort" e noutros "myport" e "s" :o
Já corrigi tudo, deve estar pronto a funcionar agora :)
-
Se correr o teu código no IDE Arduino1.0 tenho os seguintes erros:
sketch_jan28a:0: error: 'import' does not name a type
sketch_jan28a:3: error: 'Serial' does not name a type
sketch_jan28a.cpp: In function 'void setup()':
sketch_jan28a:8: error: 'size' was not declared in this scope
sketch_jan28a:10: error: 'noStroke' was not declared in this scope
sketch_jan28a:11: error: 'background' was not declared in this scope
sketch_jan28a:14: error: 'myPort' was not declared in this scope
sketch_jan28a:14: error: expected type-specifier before 'Serial'
sketch_jan28a:14: error: expected `;' before 'Serial'
sketch_jan28a.cpp: In function 'void draw()':
sketch_jan28a:21: error: 'triangle' was not declared in this scope
sketch_jan28a.cpp: In function 'void keyPressed()':
sketch_jan28a:33: error: 'key' was not declared in this scope
sketch_jan28a:33: error: 'CODED' was not declared in this scope
sketch_jan28a:35: error: 'keyCode' was not declared in this scope
sketch_jan28a:35: error: 'UP' was not declared in this scope
sketch_jan28a:36: error: 'myPort' was not declared in this scope
sketch_jan28a:37: error: 'DOWN' was not declared in this scope
sketch_jan28a:38: error: 'myPort' was not declared in this scope
sketch_jan28a:39: error: 'LEFT' was not declared in this scope
sketch_jan28a:40: error: 'myPort' was not declared in this scope
sketch_jan28a:41: error: 'RIGHT' was not declared in this scope
sketch_jan28a:42: error: 'myPort' was not declared in this scope
sketch_jan28a:46: error: 'myPort' was not declared in this scope
Se o fizer pelo IDE processing tenho os seguintes:
java.lang.NullPointerException
at processing.serial.Serial.write(Unknown Source)
at sketch_jan28c.keyPressed(sketch_jan28c.java:68)
at processing.core.PApplet.handleKeyEvent(Unknown Source)
at processing.core.PApplet.dequeueKeyEvents(Unknown Source)
at processing.core.PApplet.handleDraw(Unknown Source)
at processing.core.PApplet.run(Unknown Source)
at java.lang.Thread.run(Thread.java:662)
Exception in thread "Animation Thread" java.lang.RuntimeException: Error inside Serial.write()
at processing.serial.Serial.errorMessage(Unknown Source)
at processing.serial.Serial.write(Unknown Source)
at sketch_jan28c.keyPressed(sketch_jan28c.java:68)
at processing.core.PApplet.handleKeyEvent(Unknown Source)
at processing.core.PApplet.dequeueKeyEvents(Unknown Source)
at processing.core.PApplet.handleDraw(Unknown Source)
at processing.core.PApplet.run(Unknown Source)
at java.lang.Thread.run(Thread.java:662)
Eu ainda não entendo muito bem a estrutura deste código!
Cumps
-
Esse código é para o processing, por isso é normal que dê erro no arduino.
Eu costumos ter erros desses no Processing quando a porta série não é a certa. Esqueci-me de te dizer, onde diz "COM35", é para meter o nome da porta do arduino.
O código cria uma porta série no setup() e depois vai desenhando as setas na janela no draw() (que equivale ao loop() do arduino).
Quando carregas numa tecla o keyPressed() é chamado. Caso a tecla for, por exemplo, a UP, é enviado '119' para a porta série, ou seja, o arduino.
-
Olá
Dessa forma já funciona!
Mas a programação das sub-rotinas "frente", "direita" são aquelas que eu ja tinha programado anteriormente e que o código está no arduino certo?
Cumps
-
Como assim?
Não percebi bem a tua pergunta...
Esta aplicação faz o mesmo papel que o Serial Monitor do Arduino IDE, envia dados para a porta série.
O Arduino recebe esses dados e depois interpreta-os como tu o programares.
-
Psycop já funciona...? também estou a necessitado do mesmo.
1º Tenho de sacar o Processing?
2º Compilar o programa do Xico no processing?
3º E depois...?
Sds,
HIT
-
Estou postando esses códigos porque fiquei muito zangando de não ter encontrado nada do tipo. Encontrei só depois de fuçar muitos sites estrangeiros. (LEDs, TECLADO, ARDUINO / PROCESSING) >:( Agora fiquei satisfeito :)
Projeto 1 - Ligue os LEDs na tecla pressionada ( http://esperimenti-arduino.blogspot.com.br/p/project-1-turn-on-leds-on-key-pressed.html (http://esperimenti-arduino.blogspot.com.br/p/project-1-turn-on-leds-on-key-pressed.html) )
ai vai estar o CÓDIGO ARDUINO e do PROCESSING para controlar leds pelas setas do teclado!!!! Flw e bom proveito.
-
Ola a todos,
Ja resolveram o problema?
Se ainda não, digam.
Isso em Vb.net faz-se em 5 minutos
Tenho um robot que funciona dessa forma, e que permite ainda "personalizar" as teclas que queremos, a gosto do utilizador