Step-Motor in Echtzeit per Funk steuern

Hallo!
Ist es möglich, einen Stepmotor per Funkmodul 433 MHZ mit einem Rotary Encoder zu steuern; so dass es sofort reagiert ohne Latenz, also wie wenn es direkt per Kabel gesteuert würde? Oder wäre da WLAN oder BLUETOOTH besser geeignet? Möchte eine drahtlose manuelle Steuerung für meine selbst gebaute CNC_Fräse entwickeln.

Danke und Grüße

Du wirst immer eine Latenz haben. Auch via BT oder WiFi.
Die Frage ist, was Du tolerieren kannst.

Vorweg: Es ist vollkommen egal welches Verfahren Du anwendest. Wichtig wäre eher mindestens sicher zu stellen, dass die Daten ankommen.
Dafür gibt es Protokolle.

Also für eine CNC-Fräse zum Handsteuern sind ja wohl 0,1 Sekunden Zeitverzögerung völlig in Ordnung.

Dann ist es tatsächlich ziemlich wurscht welche Art Funktechnologie man da verwendet.

Wie muss das Signal "Achse soll fahren" an deiner Steuerung ankommen?
Was für einen Microcontroller hat deine CNC-Steuerung?

vgs

Natürlich nicht!
Jede dazwischen geschobene Schicht kostet Zeit.

Vielleicht, oder auch nein.

Leider sagst du nicht, wie du "Echtzeit" definierst.

Mir würden da als erstes NRF24L01 in den Sinn kommen.

Habe es mit den 433 MHZ Modulen probiert mit Antenne 162 mm (etwa eine Wellenlänge):

Video auf meinem Google Drive:
433_MHZ

Funktioniert zwar zufriedenstellend mit einer Baudrate von 5000. Dann müssen die Antennen sich aber sogar berühren, dass die Module bei der Geschwindigkeit noch kommunizieren können.
Bei Baud=2000 ist die Reichweite zwar größer, aber kein flüssiges Drehen des Schritt-Motors mit dem Drehgeber mehr möglich.

Heißt für mich:
433 MHZ ungeeignet, habe mir die 2,4 GHZ Module mit Antenne bestellt (NRF24L01).
Das sollte dann super klappen, werde berichten ...

LG
Tobias

Ich glaube nicht das das ein Reichweiten Signalstärkeproblem ist.
Es sei denn das sind 39 cent china Popelteile

Der Link fordert eine Zugriffsanforderung. Poste einfach ein Bild und Typenbezeichnung von den 433MHz Modulen

Außerdem wäre interessant wenn du den Sketch posten würdest.
Ich vermute das das ein Problem im code ist

vgs

Hier die beiden Sketche (Transmitter und Receiver):

*** TRANSMITTER **

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

RH_ASK driver(5000, 4, 6, 5);

int counter=0;
int counteralt=1;
int pinA = 2; // Handencoder (Interrupt 0)
int pinB = 3; // Handencoder (Interrupt 1)
int pinAstateCurrent = LOW;
int pinAStateLast = pinAstateCurrent;


void setup()
{
  pinMode (pinA, INPUT);
  pinMode (pinB, INPUT);
  attachInterrupt(digitalPinToInterrupt(pinA), update, CHANGE);  
  attachInterrupt(digitalPinToInterrupt(pinB), update, CHANGE);
}

void loop()
{
  if (digitalRead(12)) { // Entprellen
    delay(15);
    if (digitalRead(12)) { // Entprellen
      const char *msg = "1"; // solange drehen, wie Taster gedrückt
      driver.send((uint8_t *)msg, strlen(msg));
      driver.waitPacketSent(); 
    }
  }
  else if (digitalRead(13)) { // Entprellen
    delay(15);
    if (digitalRead(13)) { // Entprellen
      const char *msg = "2"; // eine bestimmte Strecke drehen (nur einmal möglich, dann erst wieder Taster an Pin 12 betätigen)
      driver.send((uint8_t *)msg, strlen(msg));
      driver.waitPacketSent(); 
    }
  }
  else if (counter!=counteralt) {
    if (counter>counteralt) {
      const char *msg = "3"; // rechts mit Drehgeber
      driver.send((uint8_t *)msg, strlen(msg));
      driver.waitPacketSent(); 
    }
    else {
      const char *msg = "4"; // links mit Drehgeber
      driver.send((uint8_t *)msg, strlen(msg));
      driver.waitPacketSent(); 
    }
    counteralt=counter;
  } 
  else {
      const char *msg = "0";
      driver.send((uint8_t *)msg, strlen(msg));
      driver.waitPacketSent(); 
  }
}

void update() { // Interrupt-Routine für Drehgeber

  pinAstateCurrent = digitalRead(pinA);
  
  if ((pinAStateLast == LOW) && (pinAstateCurrent == HIGH)) {  
    if (digitalRead(pinB) == HIGH) {
      counter--;      
    } else {
      counter++;
    }
  }
  pinAStateLast = pinAstateCurrent;
}

***RECEIVER ***

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

RH_ASK driver(5000, 2, 4, 5);
Stepper myStepper(1600, 8, 9, 10, 11); // DIR+ DIR- PUL+ PUL-

int stepping=0;
int stopflag=0;

void setup()
{
   myStepper.setSpeed(100);
}

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

  if (driver.recv(buf, &buflen))
  {
    if (*buf==49) stepping=1;
    else if (*buf==50 && stopflag==0) {
      myStepper.step(1600);
      stopflag=1;
    }
    else if (*buf==51) {
      myStepper.step(50);
      //stopflag=0;
    }
    else if (*buf==52) {
      myStepper.step(-50);
      //stopflag=0;
    }
    else stepping=0;
    //Serial.print (*buf);
  }
  if (stepping==1) {
    myStepper.step(1600);
    stopflag=0;
  }
}


Die habe ich im Funduino-Shop gekauft:

https://funduinoshop.com/elektronische-module/wireless-iot/funktechnik/433mhz-funksender-und-empfaenger

Haste mal mit einen Testsketch gemessen was die Latenzzeit ist?

Also ein Sketch der folgendes macht.

Am Sender eine Taste einen Ausgang für den 433MHz sender schaltet und einen zweiten Ausgang der direkt per Kabel mit dem Empfänger verbunden ist.

Im Empfänger läuft ein Testprogramm dass auf das Signal am Kabel-Eingang wartet
Sobald Kabelsignal anliegt Zeitstempel micros() speichern
dann auf das Signal des 433MHz Empfängers warten und einen zweiten Zeitstempel
machen
Latenz näherungsweise die Zeitdifferenz der beiden Zeitstempel

Du schreibst das du 5000 Baud bzw. 2000 Baud eingestellt hast
Heißt das das du da serielle Daten überträgst?

Dann wird es wirklich Zeit den Sketch zu posten.
Erste Vermutung du verwendest receive until und das hat einen laaangen Timeout
vgs

ja, seriell!
Würde ich direkt die Signale für den Stepper-Motor übertragen, könnte ich nicht auf die Stepper.h - Library zurückgreifen, müsste alles manuell coden. Will ich aber nicht.
Außerdem bräuchte ich dann 3 von diesen Modulen (DIR+ / PUL+ / GND).

VG
Tobias

Den Sketch habe ich bereits gepostet (siehe oben)

Kein Wunder, dass es nicht richtig funktioniert.
Du verwendest Baugruppen, die nicht mehr Stand der Technik sind.
Weiterhin darf der Empfänger nicht in der Nähe von größeren Metallflächen oder elektronischen Geräten wie Monitor oder PC sein.
Auch deine verwendete Datenrate von 5000 Bd sind sehr schlecht, da nur 2000 Bd für die Library frei gegeben ist.
Auch die Antennenlänge solltest du optimieren. 174 mm sind da richtig und dann nicht eine Wellenlänge, sondern 1/4 Wellenlänge .
Bei einem richtigen Aubau erreichst du auch mit diesen Baugruppen min. 20m Reichweite.

Ja prima. Aha. Ist ja eine library die speziell auf die Sorte Sender/Empfänger geschrieben wurde.

Der function-name

bringt es ja schon auf den Punkt
wait (bis das Paket gesendet wurde)
Da würde ich mal direkt davor und direkt danach
millis() ausgeben lassen.

vgs

Ich habe jetzt mal in die technischen Daten geschaut

Technische Daten Sender / Transmitter XY-FST:
Betriebsspannung: 3,5 - 12V DC
Reichweite: 2m - 200m (Abhängig von der Betriebsspannung und ggf. verwendeter Zusatzantenne)
Übertragungsrate: 4 KB / s
Sendeleistung: 10mW

Es gibt auch welche mit der zehnfachen Sendeleistung 100 mW.
Und Antenne macht natürlich auch etwas aus.

Also mit 5000 baud ist schon mal nicht

Die Module sind wirklich mau.

Die nRF24 funktionieren haben aber auch ein paar Zicken.

  • ausreichend dimensionierte Stromversorgung
  • Konfiguration und Ansteuerung muss genau passen

Ich hatte schon einmal gefragt was du als CNC-Controller verwendest.
Was ist das für Microcontroller?

Hat der mehrere Hardware UARTs ?

Hallo tobias4511

Schau dich hier mal um:

Hallo,

Das HC-12 Funkmodul sieht ja vielversprechend aus! Danke für den Tip!
Das werde ich auch mal testen, gestern habe ich mir erstmal die beiden 2.4 GHZ Module bestellt.
Die sind gleich teuer und es gibt schöne Anleitungen auf Youtube.

Ich werde jetzt keine weitere Zeit mit diesen billigen Funkmodulen vergeuden und breche hier ab.

VG
Tobias

Du kannst einfach den Sketch auch ohne das HC12-Funkmodul programmieren und testen und nach erfolgreichem Test das Funkmodul verwenden.

testen ohne die Hardware? Wie soll das gehen?

Damals, als sogar die Zukunft besser war, da hat man Modulator/Demodulator Strecken durch NullModemkabel ersetzt.

Da könntest du dir die Idee abschauen.

Die HC-12 tranceiver stellen eine wireless serielle Verbindung dar.
Sie machen exakt das gleiche wie zwei Leitungen nur über Funk.

Man nennt das transparent wireless serial

Deswegen ist es speziell bei den HC-12-Funkmodulen möglich die Module durch eine direkte Kabelverbindung zu ersetzen
vgs