Analoges Servo fernsteuern

Hallo,
ich beschäftige mich schon länger mit folgendem Problem.
Ich würde gerne ein analoges Servo fernsteuern und eine LED schalten.
Dazu verwende ich
Für den Sender:
-Arduino Nano
-X-Y Joystick Modul mit Taster
-FS1000A Funkmodul

#include <RH_ASK.h>
#include <SPI.h>

RH_ASK driver(2000, 11, 12, 10); // (speed, RX, TX, PTT)
const int joyX = A0;
const int buttonPin = 4;

void setup() {
  Serial.begin(9600);
  driver.init();
  pinMode(buttonPin, INPUT_PULLUP); // Taster aktiv LOW
}

void loop() {
  int xVal = analogRead(joyX); // 0–1023
  uint8_t angle = map(xVal, 0, 1023, 0, 180);

  bool buttonState = digitalRead(buttonPin) == LOW; // gedrückt = true

  // Datenpaket: [Winkel, ButtonStatus]
  uint8_t data[2] = { angle, (uint8_t)buttonState };

  driver.send(data, sizeof(data));
  driver.waitPacketSent();

  Serial.print("Angle: ");
  Serial.print(angle);
  Serial.print(" | Button: ");
  Serial.println(buttonState);

  delay(50);
}

Für den Empfänger:
-Arduino Mega
-Analogservo MG90
-FS1000A Funkmodul

#include <RH_ASK.h>
#include <SPI.h>
#include <PWMServo.h>

RH_ASK driver(2000, 11, 12, 10); // (speed, RX, TX, PTT)
PWMServo myServo;

const int ledPin = 13; // Onboard-LED Mega

void setup() {
  Serial.begin(9600);
  driver.init();
  myServo.attach(7);
  pinMode(ledPin, OUTPUT);
}
void loop() {
  uint8_t buf[2];
  uint8_t buflen = sizeof(buf);

  if (driver.recv(buf, &buflen)) {
    int angle = buf[0];
    bool buttonPressed = buf[1];

    myServo.write(angle);
delay(50);
    // LED steuern
    digitalWrite(ledPin, buttonPressed ? HIGH : LOW);

    Serial.print("Angle: ");
    Serial.print(angle);
    Serial.print(" | Button: ");
    Serial.println(buttonPressed);
  }
  delay(50);
}

Als Bibliotheken nutze ich Radiohead und PWMServo.

Wenn ich das Setup so in Betrieb nehme sehe ich auf dem seriellen Monitor, das die Werte gesendet und auch korrekt empfangen werden. Auch die LED geht an und aus.
Allerdings bewegt sich das Servo nicht!
Vielleicht kann mir da jemand weiterhelfen? Ich bin noch Anfänger und würde das ganze dann auch gerne noch erweitern (ferngesteuertes Auto).
Vielen Dank im Voraus

Vermutlich falscher Pin. Vergleiche Beispiel Knob.ino.

Für Servos empfehle ich alternativ die MobaTools mit nahezu freier Pinwahl.

Vielen Dank für die schnelle Hilfe!
Mit der MobaTools hat es funktioniert!
Allerdings läuft das Servo damit sehr "hakelig"
Gibts da vielleicht noch eine Verbesserung

Sender Sketch:

#include <SPI.h>
#include <RH_ASK.h>

RH_ASK driver(2000, 11, 12, 10); // RX, TX, PTT

const int joyX = A0;
const int joyY = A1;
const int joyBtn = 4;

void setup() {
  Serial.begin(9600);
  pinMode(joyBtn, INPUT_PULLUP); // Taster mit internem Pullup

  if (!driver.init()) {
    Serial.println("Sender init fehlgeschlagen!");
  }
}

void loop() {
  int xVal = analogRead(joyX);
  int yVal = analogRead(joyY);
  int btnPressed = digitalRead(joyBtn) == LOW ? 1 : 0;

  // Sendeformat: "x,y,b" (z. B. "512,600,1")
  char message[25];
  sprintf(message, "%d,%d,%d", xVal, yVal, btnPressed);

  driver.send((uint8_t*)message, strlen(message));
  driver.waitPacketSent();

  Serial.print("Gesendet: ");
  Serial.println(message);

delay(100);
}

Empfänger Sketch

#include <SPI.h>
#include <RH_ASK.h>
#include <MobaTools.h>

RH_ASK driver(2000, 11, 12, 10);
MoToServo myServo;

const int ledPin = 13;

void setup() {
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);

  if (!driver.init()) {
    Serial.println("Empfänger init fehlgeschlagen!");
  }

  myServo.attach(6);         // Servo an D6
}

void loop() {
  uint8_t buf[25];
  uint8_t buflen = sizeof(buf);

  if (driver.recv(buf, &buflen)) {
    buf[buflen] = 0;

    int xVal = 512, yVal = 512, button = 0;
    sscanf((char*)buf, "%d,%d,%d", &xVal, &yVal, &button);

    Serial.print("Empfangen: ");
    Serial.println((char*)buf);

    // Servo steuern
    int pos = map(xVal, 0, 1023, 0, 180);
    pos = constrain(pos, 0, 180);
    myServo.write(pos);

    // Onboard-LED steuern
    digitalWrite(ledPin, button == 1 ? HIGH : LOW);
  }
}

Achte drauf, dass Du die Wertebereiche nicht veränderst.

Ansonsten bin ich auch dabei, dass irgendwo auf der Empfängerseite ein falscher Pin bestückt ist oder die Versorgung... Jedenfalls irgendwas in Richtung Hardware.

Möglicherweise stören sich die Interrupts gegenseitig. Versuche mal:

Timers
The RH_ASK driver uses a timer-driven interrupt to generate 8 interrupts per bit period. RH_ASK takes over a timer on Arduino-like platforms. By default it takes over Timer 1. You can force it to use Timer 2 instead by enabling the define RH_ASK_ARDUINO_USE_TIMER2 near the top of RH_ASK.cpp
(Quelle: RadioHead: RH_ASK Class Reference)

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.