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
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.
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.
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
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 } } } }
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.