Roboterbau - Problem

Hallo zusammen :slight_smile:

bin ein recht blutiger anfänger was den arduino angeht und hab direkt mal ein Problem.

Und zwar bin ich gerade dabei einen kleinen “roboter” zu basteln, angetrieben wird das gute stück über einen ehemaligen R/C Panzer der in seine Bestandteile zerlegt wurde. Die Original Platine aus dem Spielzeug wollte ich auch mitsamt der zugehörigen Motoren für meinen roboter nutzen, um auch dessen Fernbedienung übernehmen zu können. Da ich aber außer der Fahrfunktion nichts von der Original Elektronik verwenden werde (Turmdrehfunktion, Geschützfunktion) hatte ich nun vor, das Signal einer dieser Funktionen zu nutzen um dem Arduino zu sagen was er tun soll.

Am Arduino selber werden später insgesamt 3 Servos angeschlossen (alle mit eigener Stromversorgung), die dann auf das Signal der Fernbedienung reagieren sollen. Ich dachte mir das halt so:

Ich drücke auf der Fernbedienung den Knopf um den Turm nach rechts zu schwenken, der arduino erkennt auf einem digital Pin das Strom anliegt, zählt wie oft gedrückt wurde und reagiert dann darauf mit vorbestimmten bewegungen der servos…
(ich hoffe mal man versteht was ich meine und vorhabe)

Soweit die theorie…

nun hab ich mir folgenden Code zurechtkopiert/gebastelt:

#include <Servo.h> 
const int buttonPin = 2;  

Servo myservo;	  // create servo object to control a servo
Servo arml;
Servo armr;

int buttonPushCounter = 0;   // counter for the number of button presses
int buttonState     = 0;  // current state of the button
int lastButtonState = 0;  // previous state of the button
int pos     = 0;  // variable to store the servo positions

void setup() {     // initialize serial communication:
  Serial.begin(9600);
  myservo.attach(9);	// attaches the servo on pin 8 to the servo object
  myservo.write(0);  // set servo to zero
 arml.attach(10);
 armr.attach(11);
 arml.write(0);
 armr.write(0); 
  pinMode(buttonPin, INPUT);  // initialize the button pin as a input
}

void loop() {
  buttonState = digitalRead(buttonPin); // read the pushbutton input pin
  if (buttonState != lastButtonState) { // compare buttonState to previous state
lastButtonState = buttonState;
  if (buttonState == 1) {     // if the current state is 1 then the button
                              // went from off to on:
    buttonPushCounter++;
    Serial.println("on");
    Serial.print("number of button pushes:  ");
    Serial.println(buttonPushCounter, DEC);


                              // do something different depending on the
                              // range value:
    switch (buttonPushCounter) {



	case 1:		              // If the button count is at 1
	Serial.println("1");	    // print 1
	myservo.write(180);	  // tell servo to go to position 'pos'
	delay(500);		  // waits 0.5s for the servo to reach the position
	arml.write(35);
        delay(500);
        armr.write(35);
        delay(500);
        break;


	case 2:		    // If the button count is at 2
	Serial.println("2");	    // print 2
	  myservo.write(90);	  // tell servo to go to position 'pos'
	delay(500);		  // waits 0.5s for the servo to reach the position
	arml.write(60);
        delay(500);
        armr.write(60);
        delay(500);
	break;



	case 3:		 //if the button count is at 3
	Serial.println("3");
	myservo.write(0);	// tell servo to go to position 'pos'
	delay(500);	     // waits 0.5s for the servo to reach the position
	arml.write(45);
        delay(500);
        armr.write(45);
        delay(500);
	break;



	case 4:  // if the button count is 4
	Serial.println("4");
	myservo.write(144);	// tell servo to go to position 'pos'
	delay(500);    // waits 0.5s for the servo to reach the position
	arml.write(75);
        delay(500);
        armr.write(75);
        delay(500);
	break;



	case 5:  //if the button count is 5
	Serial.println("5");
	myservo.write(180);	// tell servo to go to position 'pos'
	delay(500);	     // waits 0.5s for the servo to reach the position
	arml.write(90);
        delay(500);
        armr.write(90);
        delay(500);
	break;



	case 6:  //if the button count is 6
	Serial.println("6");
	                          // reset everything.
                        	// set servo to zero
	myservo.write(0);	// tell servo to go to position '0'
	delay(1000);	     // waits 1 second for the servo to reach the position
	arml.write(0);
        delay(500);
        armr.write(0);
        delay(500);

	                          // reset the push button count to 0
	buttonPushCounter = 0 ;// Now everything is set back to the way we started.
	  break;


  }
   }
    }
     }

der funktioniert an sich auch soweit ganz gut…allerdings nur wenn ich anstatt des motorsignals einen taster anschliesse. Schließe ich dann die Panzerelektronik an, reicht ein Druck auf die entsprechende Taste und das Programm wird wieder und wieder abgespult…ohne das nochmal ein 2. tastendruck notwendig wird. Er läßt sich dann auch nicht mehr unterbrechen, ein reset reicht auch nicht aus, er reagiert erst wieder normal wenn ich ihn komplett vom strom getrennt habe…

Nu bin ich natürlich etwas ratlos und frag mich woran es liegen kann ???

Das liegt wohl daran das ein Servosignal(genau: PWM Signal) (welches vom Empfänger im RC Tank kommt) nicht einfach so an einem Daten-Input angeschlossen werden kann und es dann sofort sinnvolle Werte hergibt.
Ein solches Signal welches vom Empfänger kommt ist folgendermaßen aufgebaut:

Also 1ms HIGH, dann 0-1ms je nach gewollter Stellung weiter HIGH, dann 18ms LOW, und das ständig hintereinander wiederholt.

Inkludiert in der Arduino Software gibt es eine Funktion “pulseIn” (misst eine Pulslänge, wär bei dir HIGH) mit dieser könntest du ein bisschen rumspielen und versuchen rauszufinden wie es genau läuft und wie du daraus nutzen ziehen kannst.
Die Lib Servo nutzt auch dieses Prinzip von PWM um Servos direkt mit dem Arduino anzusteuern.
Hoffe das war deine Fehlerquelle und es hat dir ein wenig geholfen.

Edit: Sollte aus deiner Panzerelektronik schon ein dauer HIGH Signal kommen wenn du den Taster bei deiner Fernsteuerung bedienst da das PWM Signal schon dort ausgewertet wird kann ich dir leider nicht helfen :drooling_face:
lg DrSeus

Erstmal vielen Dank für deine Hilfe!!!

Das liegt wohl daran das ein Servosignal(genau: PWM Signal) (welches vom Empfänger im RC Tank kommt) nicht einfach so an einem Daten-Input angeschlossen werden kann und es dann sofort sinnvolle Werte hergibt.

Ok, soweit verstanden :) aber denke nicht das es auf meinen Fall zutrifft, da der RC Tank nicht mit Servos sondern mit normalen Motoren gearbeitet hat, wie sie auch bei RC Autos usw. zum einsatz kommen. (2 Pole) Die Platine auf der die komplette Steuerung von dem RC Tank aufgebaut ist verfügt auch über eine entsprechende Anzahl von Relais an denen die Motoren verkabelt sind und die das Umpolen der Kontakte übernommen haben (zumindest soweit ich das ganze bislang begreifen konnte)

Hab daher auch einfach vorab mit ner LED herumprobiert und diese anstelle eines Motors eingesetzt (mit passendem Vorwiderstand) und dabei herausfinden können das die LED wirklich nur dann leuchtet wenn ich den entsprechenden knopf drücke, lasse ich den knopf wieder los, geht auch die led direkt wieder aus, daher dachte ich auch das es relativ einfach über das auslesen von high/low gehen würde...

Wobei ich bei dem Code anfangs einen Fehler drin hatte der bewirkte das die Funktionen nonstop abgespult wurden (in Schleife) sobald ich den knopf einmal gedrückt habe. Inzwischen konnte ich das dank der Hilfe eines weiteren Forenteilnehmers schon korrigieren (der code ist auch schon ergänzt im eingangspost) so das ich aktuell mit einem etwas anderen problem kämpfe....

Zur Erläuterung: Im moment drücke ich den knopf auf der fernbedienung einmal und der servo fährt auf position 1.....drücke ich den knopf nochmal passiert nichts mehr weiter.....normalerweise sollte er aber auf position 2 gehen...beim 3. mal drücken auf position 3 usw....

Über den Serial Monitor kann ich auch diesen einen Tasterdruck nachvollziehen, allerdings ist danach dann schweigen im walde und nix kommt mehr durch....

DrSeus: Das liegt wohl daran das ein Servosignal(genau: PWM Signal) (welches vom Empfänger im RC Tank kommt) nicht einfach so an einem Daten-Input angeschlossen werden kann und es dann sofort sinnvolle Werte hergibt.

Das Steuersignal für Servos ist kein PWM-Signal (Puls Weiten Modulation) sondern ein PPM-Signal (Puls Pausen Modulation). Gut erklährt! Grüße Uwe