Servo über Bluetooth steuern, Joystickweg über Servoweg

Hi,
irgendwie stehe ich auf dem Schlauch.
Versuche den Servo über den Joystick anzusteuern. Über die Tasten diesen anzusteuern klappt es.
Hardware: HC-05 in Verbindung mit der Bluetooth App Dabbel.
Unten stehend der Code.
Würde mich über ein paar Tipps freuen.
Gruß
#include <Servo.h>
#define CUSTOM_SETTINGS
#define INCLUDE_GAMEPAD_MODULE
#include <Dabble.h>
Servo servo1;
Servo servo2;
int val;
void setup() {
// put your setup code here, to run once:
Serial.begin(250000); // make sure your Serial Monitor is also set at this baud rate.
Dabble.begin(9600); //Enter baudrate of your bluetooth.Connect bluetooth on Bluetooth port present on evive.
servo1.attach(6); //PIn 6
servo2.attach(5); //Pin5

}

void loop()
{ Dabble.processInput(); //this function is used to refresh data obtained from smartphone.Hence calling this function is mandatory in order to get data properly from your mobile.
Serial.print("KeyPressed: ");
if (GamePad.isUpPressed())
{
Serial.print("UP");
}

if (GamePad.isDownPressed())
{
Serial.print("DOWN");
}

if (GamePad.isLeftPressed())
{
Serial.print("Left");
}

if (GamePad.isRightPressed())
{
Serial.print("Right");
}

if (GamePad.isSquarePressed())
{
Serial.print("Square");
//servo1.write(100);
}

if (GamePad.isCirclePressed())
{
Serial.print("Circle");
// servo1.write(0);

}

if (GamePad.isCrossPressed())
{
Serial.print("Cross");
}

if (GamePad.isTrianglePressed())
{
Serial.print("Triangle");
}

if (GamePad.isStartPressed())
{
Serial.print("Start");
}

if (GamePad.isSelectPressed())
{
Serial.print("Select");
}

Serial.print('\t');

int a = GamePad.getAngle();
Serial.print("Angle: ");
Serial.print(a);
Serial.print('\t');
{
val = GamePad.getAngle();
val = map(val, 0, 360, 0, 179);
servo1.write(val);
delay(100);

}

}

Ok....Und was genau ist dein Problem ?

Geht....geht nicht ?
Was genau funktioniert ?
Was funktioniert nicht ?
Deinen Sketch sehe ich mir nicht an, da er keinerlei Dokumentation enthält.
Setze erst mal ein paar Kommentare rein, formatiere ihn vernünftig und packe ihn in Code-Tags. Dann ist der evtl. auch lesbar.

Das sich überhaupt nichts tut am servo ist schonmal Geschichte .... Signal ist aus Board gefallen....
Nun soll die Position nach Ansteuerung erhalten halten bleiben, sprich speichern

Hallo,
spendiere mal ein paar Serial.println() um zu sehen was Dabbel an Daten zur Verfügung stellt.

Das habe ich gemacht klappt auch jetzt, wie speichert der Servo die letzte position ? Und geht nicht wieder in die Ausgangstellung zurück ?

  1. int a = GamePad.getAngle();
  2. Serial.print("Angle: "); //Winkel Joystick 0-360° (links-180, rechts-0)
  3. Serial.print(a);
  4. Serial.print('\t');
  5. {
  6. val = GamePad.getAngle();
    
  7. // val = map(val, 330, 30, 91, 180); // Skalierung links
  8. val = map(val, 360-210, 360-150, 0, 90);    // Skalierung rechts
    
  9. servo1.write(val);
    
  10. Serial.print(val);
    
  11. delay(100);
    
  12. }`

Wie kann ich hier den einlese Wert für das val begrenzen damit nicht die ganzen 360° der Servo sich bewegt

Mit ein paar if schauen ob man in dem Bereich für den Servo ist.

Grüße Uwe

Das sagt alles aus, auch über dein Verhalten, da du ja alle Fragen und Vorschläge ignorierst.

Hättest du ein paar Anregungen für mich ?

Dann sag mir mal welche Werte denn umgemappt werden sollen. Laut obigen Code
330 bis 30 soll 90 bis 180 werden
150 bis 210 soll 0 bis 90 werden.
Da stimmt was nicht weil sich die Bereiche überschneiden.

oder soll
330 bis 360 und 0 bis 30 dann 90 bis 180 werden
und
150 bis 210 soll 0 bis 90 werden.

Grüße Uwe

Erstmal erleichterst du dir das Leben immens (und anderen das Verständnis), wenn du für das Ergebnis der map - Funktion eine neue Variable spendierst.

Dann musst du wissen, dass map die Ausgabe nicht begrenzt.
Dafür gäbe es die constrain Funktion oder eine if - Konstruktion.

ich habe nochmal was an dem Code geäändert und mehre Bedienungen gesetzt. Nun komm es beim übersetzen zu fehlern und ich finde den fehler nicht ... :frowning:
Vllt. hat von euch jemand noch eine idee....

#include <Servo.h>
#define CUSTOM_SETTINGS
#define INCLUDE_GAMEPAD_MODULE
#include <Dabble.h>
#define INCLUDE_MOTORCONTROL_MODULE
Servo servo1;
Servo servo2;
int val; //Fahren
int val1;//lenken
int pwm1 = 9;
int pwm2 = 10;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(250000);      // make sure your Serial Monitor is also set at this baud rate.
  Dabble.begin(9600);      //Enter baudrate of your bluetooth.Connect bluetooth on Bluetooth port present on evive.

  GamePad.getAngle();

  pinMode(pwm1,   OUTPUT);
  pinMode(pwm2,   OUTPUT);
  servo1.attach(6);     //PIn 6


}

void loop()
{ Dabble.processInput();             //this function is used to refresh data obtained from smartphone.Hence calling this function is mandatory in order to get data properly from your mobile.

  Serial.print("KeyPressed: ");
  if (GamePad.isUpPressed())          //Taste oben
  {
    Serial.print("UP");
  }

  if (GamePad.isDownPressed())        //Taste unten
  {
    Serial.print("DOWN");
  }

  if (GamePad.isLeftPressed())        //Taste links
  {
    Serial.print("Left");
  }

  if (GamePad.isRightPressed())       // //Taste rechts
  {
    Serial.print("Right");
  }

  if (GamePad.isSquarePressed())       //Taste viereck
  {
    Serial.print("Square");

  }

  if (GamePad.isCirclePressed())         //Taste kreis
  {
    Serial.print("Circle");
  }

  if (GamePad.isCrossPressed())        //Taste Kreuz
  {
    Serial.print("Cross");
  }

  if (GamePad.isTrianglePressed())     //Taste dreieck
  {
    Serial.print("Triangle");
  }

  if (GamePad.isStartPressed())        //Taste start
  {
    Serial.print("Start");
  }

  if (GamePad.isSelectPressed())       //Taste select
  {
    Serial.print("Select");
  }

  Serial.print('\t');

  // int a = GamePad.getAngle();
  // Serial.print("Angle: ");
  // Serial.print(a);
  // Serial.print('\t');
  //int b = GamePad.getRadius();
  // Serial.print("Radius: ");
  // Serial.print(b);
  //  Serial.print('\t');
  float c = GamePad.getXaxisData();
  Serial.print("x_axis: ");
  Serial.print(c);
  Serial.print('\t');
  float d = GamePad.getYaxisData();
  Serial.print("y_axis: ");
  Serial.println(d);
  Serial.println();
  // Freigabe vorwärts fahren
  if
  (GamePad.getYaxisData() > 1) {
    fahrevor(1);
    delay(50);
    Serial.print("fahrevor(1)");
  }
  else if (
    GamePad.getYaxisData() < 1) {
    fahrevor(0);
    Serial.print("fahrevor(0)");
  }

  // Freigabe rückwärts fahre///////////////////////////////////////
  if
  (GamePad.getYaxisData() < -1) {
    fahrezurueck(1);
    delay(50);
    Serial.print("fahrezurueck(1)");
  }
  else if
  (GamePad.getYaxisData() > -1) {
    fahrezurueck(0);
    Serial.print("fahrezurueck(0)");
  }
  //freigabe lenken rechts ///////////////////////////////////////

  if
  (GamePad.getXaxisData() > 1) {
    lenkenrechts(1);
    delay(50);
    Serial.print("lenkenrechts(1)");
  }
  else if
  (GamePad.getXaxisData() < 1) {
    lenkenrechts(0);
    Serial.print("lenkenrechts(0)");
  }


  //freigabe lenken links///////////////////////////////////////

  if
  (GamePad.getXaxisData() < -1) {
    lenkenlinks(1);
    delay(50);
    Serial.print("lenkenlinks(1)");
  }
  else if
  (GamePad.getXaxisData() > -1) {
    lenkenlinks(0);
    Serial.print("lenkenlinks(0)");
  }

  //freigabe vorwärts rechts ///////////////////////////////////////

  if
  (GamePad.getXaxisData() > 1) && (GamePad.getYaxisData() > 1) {
    vorwaertsrechts(1);
    Serial.print("vorwaertsrechts(1)");
  }
  else if
  (GamePad.getXaxisData() < 1) && (GamePad.getYaxisData() < 1) {
    vorwaertsrechts(0);
    Serial.print("vorwaertsrechts(0)")
  }

  // freigabe vorwärts links///////////////////////////////////////
  if
  (GamePad.getXaxisData() < -1) && (GamePad.getYaxisData() > 1) {
    vorwaertslinks(1);
    Serial.print("vorwaertslinks(1)");
  }
  else if
  (GamePad.getXaxisData() > -1)) && (GamePad.getYaxisData() < 1) {
    vorwaertslinks(0);
    Serial.print("vorwaertslinks(0)")
  }
  //freigabe rückwärts rechts ///////////////////////////////////////
  if
  (GamePad.getXaxisData() > 1) && (GamePad.getYaxisData() < -1)) {
    rückwaertsrechts(1);
    Serial.print("rückwaertsrechts(1)");
  }
  else if
  (GamePad.getXaxisData() < 1) && (GamePad.getYaxisData() > -1) {
  rückwaertsrechts(0);
    Serial.print("rückwaertsrechts(0)")
  }

  //freigabe rückwärts links///////////////////////////////////////
  if
  (GamePad.getXaxisData() > 1) && (GamePad.getYaxisData() > 1)) {
  rückwärtslinks(1);
    Serial.print("rückwärtslinks(1)");
  }
  else if
  (GamePad.getXaxisData() < 1) && (GamePad.getYaxisData() < 1) {
  rückwaertslinks(0);
    Serial.print("rückwaertslinks(0)")
  }
}

//  Vorwärts fahren
void fahrevor(int x) {
  if (x == 1) {
    val = GamePad.getYaxisData();
    val = map(val, 1, 7, 0, 255);
    digitalWrite(pwm1, 0);
    analogWrite(pwm2, val);
    Serial.print("pwm2, val()");
    Serial.print("pwm1()");
    delay(50);
  }
  else {
    analogWrite(pwm2, 0);
  }

}

// Rückwärts fahren
void fahrezurueck(int x) {
  if (x == 1) {
    val = GamePad.getYaxisData();
    val = map(val, -1, -6, 0, 255);
    analogWrite(pwm1, val);
    analogWrite(pwm2, val);
    Serial.print("pwm2, val()");
    Serial.print("pwm1()");
    delay(50);
  }
  else {
    analogWrite(pwm2, 0);
    digitalWrite(pwm1, 0);

  }

}

//Lenken rechts ////////////////////////////////////////////
void  lenkenrechts(int x) {
  if (x == 1) {

    val1 = GamePad.getXaxisData();
    val1 = map(val1, 1, 6, 0, 255);
    servo1.write(val1);
    Serial.print("val1");
    delay(50);
  }
  else {
    servo1.write(0);

  }

}
//Lenken links////////////////////////////////////////////
void  lenkenrechts(int x) {
  if (x == 1) {

    val1 = GamePad.getXaxisData();
    val1 = map(val1, -1, -6, 0, 255);
    servo1.write(val1);
    Serial.print("val");
    delay(50);
  }
  else {
    servo1.write(0);

  }

}
//vorwärts rechts ///////////////////////////////////////
void  vorwaertsrechts(int x) {
  if (x == 1) {
    val = GamePad.getYaxisData();
    val = map(val, 1, 7, 0, 255);
    digitalWrite(pwm1, 0);
    analogWrite(pwm2, val);
    Serial.print("pwm2, val()");
    Serial.print("pwm1()");
    val1 = GamePad.getXaxisData();
    val1 = map(val1, 1, 6, 0, 255);
    servo1.write(val1);
    Serial.print("val1");
    delay(50);

  }
  else {
    analogWrite(pwm2, 0);
    digitalWrite(pwm1, 0);
    servo1.write(0);
  }

}

//vorwärts links ///////////////////////////////////////
void  vorwaertslinks(int x) {
  if (x == 1) {
    val = GamePad.getYaxisData();
    val = map(val, 1, 7, 0, 255);
    digitalWrite(pwm1, 0);
    analogWrite(pwm2, val);
    Serial.print("pwm2, val()");
    Serial.print("pwm1()");
    val1 = GamePad.getXaxisData();
    val1 = map(val1, -1, -6, 0, 255);
    servo1.write(val1);
    Serial.print("val1");
    delay(50);

  }
  else {
    analogWrite(pwm2, 0);
    digitalWrite(pwm1, 0);
    servo1.write(0);
  }

}

//rückwärts rechts ///////////////////////////////////////
void  rueckwaertsrechts(int x) {
  if (x == 1) {

    val = GamePad.getYaxisData();
    val = map(val, -1, -7, 0, 255);
    digitalWrite(pwm1, 0);
    analogWrite(pwm2, val);
    Serial.print("pwm2, val()");
    Serial.print("pwm1()");
    val1 = GamePad.getXaxisData();
    val1 = map(val1, 1, 6, 0, 255);
    servo1.write(val1);
    Serial.print("val1");
    delay(50);

  }
  else {
    analogWrite(pwm2, 0);
    digitalWrite(pwm1, 0);
    servo1.write(0);
  }

}

//rückwärts links ///////////////////////////////////////
void  rueckwaertslinks(int x) {
  if (x == 1) {

    val = GamePad.getYaxisData();
    val = map(val, -1, -7, 0, 255);
    digitalWrite(pwm1, 0);
    analogWrite(pwm2, val);
    Serial.print("pwm2, val()");
    Serial.print("pwm1()");
    val1 = GamePad.getXaxisData();
    val1 = map(val1, -1, -6, 0, 255);
    servo1.write(val1);
    Serial.print("val1");
    delay(50);
  }
  else {
    analogWrite(pwm2, 0);
    digitalWrite(pwm1, 0);
    servo1.write(0);
  }

}`Vorformatierter Text`

Du würdest es uns und dir leichter machen, wenn du auch die Fehlermeldung postest.

Kacke..... vergessen
Einzelne_schritte:181:6: error: stray '\303' in program
rückwaertsrechts(1);
^
Einzelne_schritte:181:7: error: stray '\274' in program
rückwaertsrechts(1);
^
Einzelne_schritte:186:4: error: stray '\303' in program
rückwaertsrechts(0);
^
Einzelne_schritte:186:5: error: stray '\274' in program
rückwaertsrechts(0);
^
Einzelne_schritte:193:4: error: stray '\303' in program
rückwärtslinks(1);
^
Einzelne_schritte:193:5: error: stray '\274' in program
rückwärtslinks(1);
^
Einzelne_schritte:193:9: error: stray '\303' in program
rückwärtslinks(1);
^
Einzelne_schritte:193:10: error: stray '\244' in program
rückwärtslinks(1);
^
Einzelne_schritte:198:4: error: stray '\303' in program
rückwaertslinks(0);
^
Einzelne_schritte:198:5: error: stray '\274' in program
rückwaertslinks(0);
^
C:\Users\Raab\Documents\Arduino\hauptprogram\Einzelne_schritte\Einzelne_schritte.ino: In function 'void loop()':
Einzelne_schritte:144:5: error: 'lenkenlinks' was not declared in this scope
lenkenlinks(1);
^~~~~~~~~~~
C:\Users\Raab\Documents\Arduino\hauptprogram\Einzelne_schritte\Einzelne_schritte.ino:144:5: note: suggested alternative: 'lenkenrechts'
lenkenlinks(1);
^~~~~~~~~~~
lenkenrechts
Einzelne_schritte:150:5: error: 'lenkenlinks' was not declared in this scope
lenkenlinks(0);
^~~~~~~~~~~
C:\Users\Raab\Documents\Arduino\hauptprogram\Einzelne_schritte\Einzelne_schritte.ino:150:5: note: suggested alternative: 'lenkenrechts'
lenkenlinks(0);
^~~~~~~~~~~
lenkenrechts
Einzelne_schritte:157:35: error: expected identifier before '(' token
(GamePad.getXaxisData() > 1) && (GamePad.getYaxisData() > 1) {
^
Einzelne_schritte:162:35: error: expected identifier before '(' token
(GamePad.getXaxisData() < 1) && (GamePad.getYaxisData() < 1) {
^
Einzelne_schritte:169:36: error: expected identifier before '(' token
(GamePad.getXaxisData() < -1) && (GamePad.getYaxisData() > 1) {
^
Einzelne_schritte:174:32: error: expected primary-expression before ')' token
(GamePad.getXaxisData() > -1)) && (GamePad.getYaxisData() < 1) {
^
Einzelne_schritte:180:35: error: expected identifier before '(' token
(GamePad.getXaxisData() > 1) && (GamePad.getYaxisData() < -1)) {
^
Einzelne_schritte:185:35: error: expected identifier before '(' token
(GamePad.getXaxisData() < 1) && (GamePad.getYaxisData() > -1) {
^
Einzelne_schritte:192:35: error: expected identifier before '(' token
(GamePad.getXaxisData() > 1) && (GamePad.getYaxisData() > 1)) {
^
Einzelne_schritte:197:35: error: expected identifier before '(' token
(GamePad.getXaxisData() < 1) && (GamePad.getYaxisData() < 1) {
^
C:\Users\Raab\Documents\Arduino\hauptprogram\Einzelne_schritte\Einzelne_schritte.ino: In function 'void lenkenrechts(int)':
Einzelne_schritte:256:7: error: redefinition of 'void lenkenrechts(int)'
void lenkenrechts(int x) {
^~~~~~~~~~~~
C:\Users\Raab\Documents\Arduino\hauptprogram\Einzelne_schritte\Einzelne_schritte.ino:240:7: note: 'void lenkenrechts(int)' previously defined here
void lenkenrechts(int x) {
^~~~~~~~~~~~
exit status 1
stray '\303' in program

Schreibt er doch gut.

Die Funktion lenkenlinks() gibt es nicht aber 2 mal lenkenrechts()

Zähl mal die Klammern Hier fehlt eine linke Klammer
if (GamePad.getXaxisData() > 1) && (GamePad.getYaxisData() < -1))

Grüße Uwe

Vielen Dank schonmal für die Hilfe.
Aber wenn ich so schreibe wie du es oben korriert hast kommt der fehler.
Einzelne_schritte:194:35: error: expected identifier before '(' token
(GamePad.getXaxisData() < 1) && (GamePad.getYaxisData() < 1)) {

Es hat geklappt :slight_smile:
Würde gerne noch etwas gegeneinander verriegeln in der If Bedienung.
Dabei tritt dieser fehler auf
if
(GamePad.getYaxisData() > 1) && not ((GamePad.getXaxisData() > 1)||(GamePad.getXaxisData() < -1)) {
fahrevor(1);
delay(50);
Serial.print("fahrevor(1)");
}
else if (
GamePad.getYaxisData() < 1) {
fahrevor(0);
Serial.print("fahrevor(0)");

Fehlermeldung C:\Users\Raab\Documents\Arduino\hauptprogram\Einzelne_schritte\Einzelne_schritte.ino: In function 'void loop()':
Einzelne_schritte:102:35: error: expected identifier before 'not' token
(GamePad.getYaxisData() > 1) && not ((GamePad.getXaxisData() > 1)||(GamePad.getXaxisData() < -1)) {
^~~
exit status 1
expected identifier before 'not' token

Da fehlt am Anfang eine öffnende ( . dann Klammern prüfen.

Gruß Tommy

Danke für den hinweis

Habe nochmal eine Frage was ich nicht so ganz verstehe.
Aktuelle versuche ich einen Motor zum fahren und einen Servo vom lenken anzusteuern.
Leider klapp dies gleichzeitig nicht, wenn ich den Servo mit deklariere kann ich den Motor nicht mehr feinfühlig steuern und dieser fährt nur noch 1 oder null.
Habe denn teil markiert bzw. in Zeile 19.
Denn Pin für den Servo habe ich auch schonmal gewechselt.

1. #include <Servo.h>
2. #define CUSTOM_SETTINGS
3. #define INCLUDE_GAMEPAD_MODULE
4. #include <Dabble.h>
5. #define INCLUDE_MOTORCONTROL_MODULE
6. Servo servo1;
7. Servo servo2;
8. int val; //Fahren
9. int val3;  //lenken
10. int pwm1 = 9;
11. int pwm2 = 10;

12. void setup() {
13.   // put your setup code here, to run once:
14.   Serial.begin(250000);      // make sure your Serial Monitor is also set at this baud rate.
15.   Dabble.begin(9600);      //Enter baudrate of your bluetooth.Connect bluetooth on Bluetooth port present on evive.

16.   GamePad.getAngle();

17.   pinMode(pwm1,   OUTPUT);
18.   pinMode(pwm2,   OUTPUT);
19.   //servo1.attach(5);     //PIn 5


20. }

21. void loop()
22. { Dabble.processInput();             //this function is used to refresh data obtained from smartphone.Hence calling this function is mandatory in order to get data properly from your mobile.

23.   Serial.print("KeyPressed: ");

24.   if (GamePad.isSquarePressed())       //Taste viereck
25.   {
26.     Serial.print("Square");
27.   }

28.   if (GamePad.isCirclePressed())         //Taste kreis
29.   {
30.     Serial.print("Circle");
31.   }

32.   if (GamePad.isCrossPressed())        //Taste Kreuz
33.   {
34.     Serial.print("Cross");
35.   }

36.   if (GamePad.isTrianglePressed())     //Taste dreieck
37.   {
38.     Serial.print("Triangle");
39.   }


40.   Serial.print('\t');

41.   // int a = GamePad.getAngle();
42.   // Serial.print("Angle: ");
43.   // Serial.print(a);
44.   // Serial.print('\t');
45.   //int b = GamePad.getRadius();
46.   // Serial.print("Radius: ");
47.   // Serial.print(b);
48.   //  Serial.print('\t');
49.   float c = GamePad.getXaxisData();
50.   Serial.print("x_axis: ");
51.   Serial.print(c);
52.   Serial.print('\t');
53.   float d = GamePad.getYaxisData();
54.   Serial.print("y_axis: ");
55.   Serial.println(d);
56.   Serial.println();

57.   // Freigabe vorwärts fahren

58.   if
59.   (GamePad.getYaxisData() > 1) {
60.     val = GamePad.getYaxisData();
61.     val = map(val, 1, 7, 100, 255);
62.     digitalWrite(pwm1, 0);
63.     analogWrite(pwm2, val);
64.     Serial.print("pwm2, val()");
65.     Serial.print("pwm1()");
66.   }
67.   // Freigabe rückwärts fahre////////////////////////////////
68.   else {
69.     if (GamePad.getYaxisData() < -1) {
70.       val = GamePad.getYaxisData();
71.       val = map(val, -1, -6, 0, 255);
72.       analogWrite(pwm1, val);
73.       analogWrite(pwm2, val);
74.       Serial.print("pwm2, val");
75.       Serial.print("pwm1");

76.     }
77.   }
78. }