PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : W-A-S-D Steuerung



KoQ
02.11.2013, 18:03
Hey,

ich würde gerne meinen Roboter per Bluetooth mit 'W' 'A' 'S' 'D' steuern können.
Das funktioniert auch bereits allerdings nicht so ganz wie ich mir das vorstelle.

Ich drücke 'W' und der Robo rattert los, allerdings sollte er nur so lange fahren, wie auch die Taste 'W' gedrückt ist.

if 'W' - go forward - else stop : funktioniert nicht so ganz weil 'kein Tasten druck' nicht unter else fällt.

if else

#include <AFMotor.h>

char value;

AF_DCMotor motorL(1);
AF_DCMotor motorR(2);


void setup(){
Serial1.begin(19200);
motorR.setSpeed(255);
motorL.setSpeed(245);
motorR.run(RELEASE);
motorL.run(RELEASE);
}


void loop(){

if (Serial1.available() >0){
value = Serial1.read();
}
if (value == 'w'){
motorR.run(FORWARD);
motorL.run(FORWARD);
}

else if (value == 'a'){
motorR.run(FORWARD);
motorL.run(BACKWARD);
}

else if (value == 's'){
motorR.run(BACKWARD);
motorL.run(BACKWARD);
}

else if (value == 'd'){
motorR.run(BACKWARD);
motorL.run(FORWARD);
}

else{
motorR.run(RELEASE);
motorL.run(RELEASE);
}

}Switch Case

#include <AFMotor.h>

char value;

AF_DCMotor motorL(1);
AF_DCMotor motorR(2);


void setup(){
Serial1.begin(19200);
motorR.setSpeed(255);
motorL.setSpeed(245);
motorR.run(RELEASE);
motorL.run(RELEASE);
}


void loop(){

if (Serial1.available()){
value = Serial1.read();
}

switch(value){
case 'w':
motorR.run(FORWARD);
motorL.run(FORWARD);
break;

case 'a':
motorR.run(FORWARD);
motorL.run(BACKWARD);
break;

case 's':
motorR.run(BACKWARD);
motorL.run(BACKWARD);
break;

case 'd':
motorR.run(BACKWARD);
motorL.run(FORWARD);
break;

default:
motorR.run(RELEASE);
motorL.run(RELEASE);
}
}

Wenn keine Eingabe erfolgt dürfte doch diese if Bedingung false sein oder?
Allerdings kommt er hier nur ins stockern.

if (Serial1.available() >0){
value = Serial1.read();
}
else{
motorR.run(RELEASE);
motorL.run(RELEASE);
}



Bitte um Rat

shedepe
02.11.2013, 22:08
Ich würde vorschlagen du passt dein Computer programm (auf der PC seite) so an, dass wenn z.B. die W Taste losgelassen wurde, der Stopbefehl gesendet wird.

Ansonsten könnte man sich so ne Art Timeout einbauen, dass nicht jedes Mal wenn keine Daten vorhanden sind (Was ziemlich oft vorkommen kann) sofort angehalten wird, wodurch das ruckeln entsteht.

KoQ
04.11.2013, 18:26
Hey shedepe,
vielen Dank für die beiden Tipps, werde das mal probieren.
Zuerst die Timeout Funktion, da mein Computer Programm auf der Pc-Seite aktuell nur ein Terminal Programm ist.

Das mit dem Timeout verstehe ich so:
Er überprüft in bestimmten Abständen, ob noch Daten vorhanden sind, wenn nicht dann bricht er nach der bestimmten Zeit ab.

DEAF BOY
02.01.2014, 18:59
Ich verwende die Arduino Motor Shield R3
(http://arduino.cc/en/Main/ArduinoMotorShieldR3)

#define PWM_RECHTS 3
#define BREMSE_LINKS 8
#define BREMSE_RECHTS 9
#define PWM_LINKS 11
#define MOTOR_RECHTS 12
#define MOTOR_LINKS 13

void setup() {
Serial.begin(9600);
pinMode(PWM_RECHTS, OUTPUT);
pinMode(BREMSE_LINKS, OUTPUT);
pinMode(BREMSE_RECHTS, OUTPUT);
pinMode(PWM_LINKS, OUTPUT);
pinMode(MOTOR_RECHTS, OUTPUT);
pinMode(MOTOR_LINKS, OUTPUT);
}

void loop() {
while(Serial.available()){
char getData = Serial.read();
{
if (getData == 'w') {
Vorwaerts();
}
else {
Bremsen();
}
}
}
}


void Vorwaerts() {
digitalWrite(MOTOR_RECHTS, HIGH);
digitalWrite(BREMSE_RECHTS, LOW);
analogWrite(PWM_RECHTS, 255);

digitalWrite(MOTOR_LINKS, HIGH);
digitalWrite(BREMSE_LINKS, LOW);
analogWrite(PWM_LINKS, 255);
}

void Bremsen() {
digitalWrite(BREMSE_RECHTS, HIGH);
analogWrite(PWM_RECHTS, 0);

digitalWrite(BREMSE_LINKS, HIGH);
analogWrite(PWM_LINKS, 0);
}