Forum: Mikrocontroller und Digitale Elektronik über RFM12b Servo ansteuern


von Andreas (Gast)


Lesenswert?

Hallo,

Ich habe mit 2 Rfm12b Modulen zwei Arduino-Nano verbunden,
am Senderboard sind zwei Potentiometer und ein Taster angeschlossen.
Die zwei Analogwerte und der Schaltzustand des Tasters werden
alle 50ms an den Empfänger geschickt. ( ohne Rüchmeldung oder 
Fehlerkorrektur)
Der Arduino des Empängers soll ein Relais für den Taster, einen 
Servomotor und einen externen DAC über PWM ansteuern.
Die Funkstrecke und das Einlesen der Werte
funktioniert bis zu 50 Meter (im Freien)(mehr als genug) Entfernung 
schon sehr gut. (Ausgabe der Werte über Uart am PC).

Wenn ich allerdings den Servo dazuschließe funktioniert es zwar noch
doch die der Servo ruckelt ziemliech und die Servoansteuerung stört 
(verzögert) etwas den Funkempfang.
Wäre es eine Möglichkeit den Nano am Empfänger nur den Funkempfang 
machen zu lassen und die Daten über Uart an einen weiteren Atmega oder 
Arduino zu senden
und diesen die nachfolgenden Geräte ansteuern zu lassen??
Mfg
Andreas

von Tom E. (Gast)


Lesenswert?

Andreas schrieb:
> Wenn ich allerdings den Servo dazuschließe funktioniert es zwar noch
> doch die der Servo ruckelt ziemliech und ...

Das deutet auf ein Problem im Programm, wahrscheinlich sogar im Konzept 
hin.

> ... die Servoansteuerung stört (verzögert) etwas den Funkempfang

Was heißt "stört"?
Erzeugt der Servo elektromagnetische Störungen, die in den Empfänger 
einstreuen oder hakelt das Programm?

Der Funkempfang kann nicht verzögert werden. Die Signale kommen immer 
mit Lichtgeschwindigkeit vom Sender.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Andreas schrieb:
> Wenn ich allerdings den Servo dazuschließe funktioniert es zwar noch
> doch die der Servo ruckelt ziemliech und die Servoansteuerung stört
> (verzögert) etwas den Funkempfang.

Servos haben kleine DC Motore, brauchen im Stellfall recht viel Strom 
und verseuchen die Betriebsspannung dann ganz schön. Du solltest die 
Speisung der Servos von der des MC-Board trennen und filtern. Dazu sind 
Drosseln und Kondensatoren ein guter Anfang. Es schadet auch nicht, in 
die Steuerleitung zu den Servos ein kleine RC Glied (100 Ohm / 100pF) zu 
legen, um Störungen vom Controller fernzuhalten.

von Joe F. (easylife)


Lesenswert?

Andreas schrieb:
> Wenn ich allerdings den Servo dazuschließe funktioniert es zwar noch
> doch die der Servo ruckelt ziemliech und die Servoansteuerung stört
> (verzögert) etwas den Funkempfang.
> Wäre es eine Möglichkeit den Nano am Empfänger nur den Funkempfang
> machen zu lassen und die Daten über Uart an einen weiteren Atmega oder
> Arduino zu senden
> und diesen die nachfolgenden Geräte ansteuern zu lassen??

Du solltest ein Problem immer an der Wurzel anpacken, und nicht durch 
dazubasteln weiterer Komponenten das Ganze verschlimmbessern.

Hast du einen Schaltplan von der Empfänger-Seite incl. Servoansteuerung?
Am besten auch ein Platinenlayout?

Hört sich erstmal sehr nach Funkstörung durch den Servo oder Störungen 
auf der Versorgungsspannung aus.

: Bearbeitet durch User
von Andreas (Gast)


Lesenswert?

Danke für eure Beiträge
Ich habe jetzt probehalber den servo extern mit Strom versorgt und nur 
Gnd
verbunden un schon sind die Probleme weg.


Hier der komplette Sketch
#include <Servo.h>

//Simple RFM12B wireless demo - Receiver - no ack
//Glyn Hudson openenergymonitor.org GNU GPL V3 12/4/12
//Credit to JCW from Jeelabs.org for RFM12
Servo myservo;  // create servo object to control a servo

int val;    // variable to read the value from the analog pin

#define RF69_COMPAT 0  // define this to use the RF69 driver i.s.o. RF12
#include <JeeLib.h>

#define myNodeID 30          //node ID of Rx (range 0-30)
#define network     210      //network group (can be in the range 
1-250).
#define RF_freq RF12_433MHZ     //Freq of RF12B can be RF12_433MHZ, 
RF12_868MHZ or RF12_915MHZ. Match freq to module

typedef struct { int power1, power2, power3, battery; } PayloadTX; 
// create structure - a neat way of packaging data for RF comms
PayloadTX emontx;

const int emonTx_NodeID=10;            //emonTx node ID
int ledpmw;
void setup() {
   myservo.attach(7);  // attaches the servo on pin 9 to the servo 
object
  pinMode(9,OUTPUT);
  pinMode(8,OUTPUT);
  rf12_initialize(myNodeID,RF_freq,network);   //Initialize RFM12 with 
settings defined above
  Serial.begin(9600);
  Serial.println("RF12B demo Receiver - Simple demo");

 Serial.print("Node: ");
 Serial.print(myNodeID);
 Serial.print(" Freq: ");
 if (RF_freq == RF12_433MHZ) Serial.print("433Mhz");
 if (RF_freq == RF12_868MHZ) Serial.print("868Mhz");
 if (RF_freq == RF12_915MHZ) Serial.print("915Mhz");
 Serial.print(" Network: ");
 Serial.println(network);

}

void loop() {
   digitalWrite(8,0);
  if (rf12_recvDone()){
  if (rf12_crc == 0 && (rf12_hdr & RF12_HDR_CTL) == 0) {

  int node_id = (rf12_hdr & 0x1F);      //extract nodeID from payload

  if (node_id == emonTx_NodeID)  {             //check data is coming 
from node with the corrct ID
        emontx=*(PayloadTX*) rf12_data;            // Extract the data 
from the payload
       digitalWrite(8,1);
      // Serial.println(emontx.power1);
      // Serial.println(emontx.power2);
       Serial.println(emontx.power3);
       Serial.println(val);

  analogWrite(9,emontx.power2/4);    // Ausgang für ADC
  val = (emontx.power1);            // reads the value of the 
potentiometer (value between 0 and 1023)
  val = map(val, 0, 1023, 5, 175);     // scale it to use it with the 
servo (value between 0 and 180)
  myservo.write(val);                  // sets the servo position 
according to the scaled value
  delay(5);                           // waits for the servo to get 
there
}
}
}
}

von Joe F. (easylife)


Lesenswert?

Andreas schrieb:
> Ich habe jetzt probehalber den servo extern mit Strom versorgt und nur
> Gnd
> verbunden un schon sind die Probleme weg.

Dann ist doch klar, dass es ein elektrisches Problem ist.

Das wird kaum im Quellcode zu finden sein...
Ein Schaltplan wäre da schon hilfreicher.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.