Arduino NRF24l01 Servo steuern

Hallo, ich weiß nicht wie ich einen Servo Motor und 2 Leds über ein NRF24l01 Board steuern kann. Kann mir irgendwer bei dem Code helfen? Hab schon vieles probiert komm aber nicht drauf.

daniel4543:
Hallo, ich weiß nicht wie ich einen Servo Motor und 2 Leds über ein NRF24l01 Board steuern kann. Kann mir irgendwer bei dem Code helfen? Hab schon vieles probiert komm aber nicht drauf.

Und wie sollen wir helfen, wenn wir nicht wissen, welche von den 10.000 Möglichkeiten du probiert hast ?

Du könntest z.B. die Beispiele der zugehörigen Libraries nutzen und die entsprechend umschreiben und zusammenbauen.

Hi

NRF24L01 klingt nach mindestens zwei Arduino - Einer wird wohl was senden, der Andere was empfangen. Du musst Dir nur ein Protokoll ausdenken, was Du für was senden willst - und Das auf der anderen Seite prüfen, ob Das gekommen ist - wenn ja, schaltest Du an LED und Servo rum.

MfG

Ich will was machen und weiß nicht wie es geht ::) Ich auch nicht :sunglasses:

Ich würde ein Paket verschicken, das den gewünschten Zustand enthält, bei zwei LEDs und einem Servo passt das ja leicht in ein Paket.

struct Pack {
  uint8_t sequence;
  bool led1;
  bool led2;
  int position;
};

sequence wird nach dem Senden inkrementiert und ermöglicht dem Empfänger fehlende Pakete wahrzunehmen. Senden würde ich die Paket einmal pro Sekunde, oder wenn sich ein Wert ändert.

AutoAck ermöglicht dem Sender den Empfang zu verifizieren und bietet ein automatisches Autorepeat (max 15x). Das Nutzen von DynamicPayload ermöglicht das Überprüfen der korrekten Paketlänge beim Empfänger und minimiert die Übertragungszeit.

Hallo ich habe im Internet diesen Code gefunden. Kann den Irgendwer der sich auskennt so ändern das die LEDs auch funktionieren?

//SENDER//
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"

struct packet {
 byte posx;
 byte posy;
 byte posz;
 byte posr;
} State;

RF24 radio(9, 10);
const uint64_t pipe = 0xE8E8F0F0E1LL;
unsigned long lastSend;
const unsigned int sendInterval = 200;

void setup(void) {
 Serial.begin(9600);
 radio.begin();
 radio.openWritingPipe(pipe);
}

void loop(void) {
 if (millis() - lastSend >= sendInterval) {
   lastSend = millis();
   State.posx = map(analogRead(A0), 0, 1023, 0, 180);
   State.posy = map(analogRead(A1), 0, 1023, 0, 180);
   State.posz = map(analogRead(A2), 0, 1023, 0, 180);
   State.posr = map(analogRead(A3), 0, 1023, 0, 180);
   radio.write(&State, sizeof(State));
 }
}
//EMPFÄNGER//
#include <Servo.h>
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"

struct packet {
 byte posx;
 byte posy;
 byte posz;
 byte posr;
} State;

RF24 radio(9, 10);
const uint64_t pipe = 0xE8E8F0F0E1LL;
Servo myservo;
Servo myservo2;
Servo myservo3;
Servo myservo4;

void setup(void) {
 myservo.attach(3);
 myservo2.attach(5);
 myservo3.attach(6);
 myservo4.attach(8);
 Serial.begin(9600);
 radio.begin();
 radio.openReadingPipe(1, pipe);
 radio.startListening();

}

void loop(void) {
 if (radio.available()) {
   radio.read(&State, sizeof(State));
   myservo.write(State.posx);
   myservo2.write(State.posy);
   myservo3.write(State.posz);
   myservo4.write(State.posr);
   Serial.print(State.posx);
   Serial.print(F(", "));
   Serial.print(State.posy);
   Serial.print(F(", "));
   Serial.print(State.posz);
   Serial.print(F(", "));
   Serial.println(State.posr);
 }
}

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).
So ist er auch auf portablen Geräten lesbar. Das kannst Du auch noch nachträglich ändern.

Wie soll er denn funktionieren? Das müsstest Du schon beschreiben.

Gruß Tommy

daniel4543: Hallo ich habe im Internet diesen Code gefunden. Kann den Irgendwer der sich auskennt so ändern das die LEDs auch funktionieren? .....

Hallo, du wurdest doch gebeten, den Sketch in Code-Tags zu posten. Warum machst du es nicht ?

Und wenn ich mir den so ansehe, finde ich keine Leds. Wo hast du die versteckt ? Und warum versuchst du es nicht selbst ?

Hi

Das 3-fache Serial.print(F(",_"); in eine Funktion auslagern und an den drei Stellen dann die Funktion aufrufen. F-Makro ab 2 Zeichen (ist hier gegeben), wenn man identische Strings mehrfach ausgeben möchte, Diese in einer Funktion auslagern. Ob Das bei einem 2-Zeichen-Text Einsparungen bringt, bitte selber prüfen. Bei längeren Texten ist Das aber auf jeden Fall sinnvoll, da die Ausgabe nur 1x im Code enthalten ist und 'nur noch' dahin gesprungen wird. Wie gesagt, bei nur zwei Zeichen langem Text könnte Das ein Nullsummen-Spiel (oder schlimmer) werden. Dann die 3 F-Makro-Prints eben so drin lassen. (wenn's ums letzte Byte geht)

MfG

Kann mir jemand helfen den Code für die Leds dazu zu schreiben?

Hi

In welchem Thread möchtest Du jetzt weiter machen? Ich wäre ja für Hier - zumindest hast Du hier große Buchstaben verwendet ...

Leider sehe ich keine Besserung zu Dem, was bereits auch im Zweit-Thread bemängelt wurde. Code-Tags? Also, Deinen Sketch nachträglich in Code-Tags einpacken? ... nö Ansatzweise irgend eine Art Antwort auf nahezu egal, welche Frage? ... nö

Zeige mir, daß Du es wert bist, daß ich meine Zeit mit Deinem Problem verbringe.

MfG

Ich glaube es nicht. Es wird immer witziger hier. Aber egal....

Der Code soll so funktionieren, dass ich an ein Arduino eine Potentiometer, zwei Taster und ein Nrf24l01 Board anschließe. Beim zweiten Arduino sollte ein Servo und 2 Leds angeschlossen sein. Ich will also die Leds und den Servo über Funk steuern nur kenne ich mich zu wenig aus um es selber zu machen

daniel4543: Der Code soll so funktionieren, dass ich an ein Arduino eine Potentiometer, zwei Taster und ein Nrf24l01 Board anschließe. Beim zweiten Arduino sollte ein Servo und 2 Leds angeschlossen sein. Ich will also die Leds und den Servo über Funk steuern nur kenne ich mich zu wenig aus um es selber zu machen

Du willst immer nur was, ohne selbst etwas zu tun.

Findest du das gut ? Zeige doch mal, dass wir dir helfen sollen. Also baue die Leds und Taster da ein wo sie rein sollen. Wie das geht, findest du in den Beispielen der IDE. Wenn das jetzt nichts wird, bin ich endgültig raus hier.

// Sender

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
int pos[1]; 
int led[2]; 
RF24 radio(9,10);
const uint64_t pipe = 0xE8E8F0F0E1LL;
int posx;
void setup(void){
Serial.begin(9600);
radio.begin();
radio.openWritingPipe(pipe);}

void loop(void){
posx = analogRead(A0);
posx = map(posx, 0, 1023, 0, 180);
pos[1]=posx;
radio.write(pos, sizeof(pos));
if (digitalRead(1)==HIGH){
led[0]=1;
radio.write(led, sizeof(led));
}
else{
led[0]=0;
 }
if (digitalRead(2)==HIGH){
led[1]=1;
radio.write(led, sizeof(led));
}
else{
led[1]=0;
 }
}
//Empfänger

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
int pos[2]; // serwa x i y
int led[2]; // led a i b
RF24 radio(9,10);
const uint64_t pipe = 0xE8E8F0F0E1LL;
int posx;
int posy;
void setup(void){
Serial.begin(9600);
radio.begin();
radio.openWritingPipe(pipe);}

void loop(void){
posx = analogRead(A0);
posx = map(posx, 0, 1023, 0, 180);
pos[1]=posx;
 radio.write(pos, sizeof(pos));
  if (digitalRead(1)==HIGH){
  led[0]=1;
  radio.write(led, sizeof(led));
  }
else{
led[0]=0;
  }
 if (digitalRead(2)==HIGH){
 led[1]=1;
  radio.write(led, sizeof(led));
  }
 else{
   led[1]=0;
   }
}

So wie ist das?

Hi

Leider nicht wirklich viele Kommentare drin. Auch sehe ich nicht, wo überhaupt auch nur irgend etwas EMPFANGEN wird. Beide Sketche senden lustig Daten - fein.

Was macht posy?

Erweitere Deine Sketche bitte mit Kommentaren. Wenn Du damit fertig bist, drücke STRG+T in der IDE - Das rückt den Sketch auf Klammer-Ebene ein. Damit wird der Kram lesbarer. (Ja, könnte ich selber in meiner IDE auch machen - Da fehlen mir aber dann schon wieder die Kommentare, was Was wohl machen soll oder wofür Das im Sketch auftaucht - so z.B. die posx/posy, die auch lokal dicke ausreichend wären, wenn man nicht eh direkt die pos[]-Version benutzt - Da landet der Wert ja eh ...)

MfG

Sorry ich weiß wirklich nicht mehr weiter aber danke für die nette Hilfe. Ich kenne mich einfach zu wenig aus. :(

Ich habe mir deine Sketche angesehen und muss postmaster-ino Recht geben. Ich sehe nur Fragmente von Senderteilen, keine Empfänger.

Ich weiß also nicht, was du da geschrieben (oder Copy&Paste) hast. So wird das nicht funktionieren.

Da ich selber keine NRF24l01 habe, kann ich auch nichts testen.

Vorschlag: Versuche mit einfachen Sketchen aus den Beispielen der IDE das Programmieren zu lernen und fange mit einfachen Funkmodulen an zu üben. Du wirst es so nicht schaffen.

Oder du wartest bis ein "barmherziger" dir den Sketch schreibt, so wie du ihn brauchst.

@daniel4543

Das ist mein Copy&Paste, es funktioniert.
Leider sind die wenige Kommentare auf Russisch, ich dachte mir wenn die schon ins All fliegen nimmst das. :slight_smile:

min. Hardware z.B.: 2x Nano + 2x nRF24L01 + 1x Servo + 1x Potentiometer

!!! nRF24L01 richtig anschließen (siehe Anhang), Achtung 3V nicht an Arduino sondern von extern.

TIPP:fange erst mal mit dem Encoder an, und siehe was in der Console ankommt, erst dann wird “gefunkt”!

Sender:

/*   Данный скетч делает следующее: передатчик (TX) отправляет массив
 *   данных, который генерируется согласно показаниям с кнопки и с 
 *   двух потенциомтеров. Приёмник (RX) получает массив, и записывает
 *   данные на реле, сервомашинку и генерирует ШИМ сигнал на транзистор.
  
  Ruder Steuerung mit Encoder
  
  Ground zu Ground, + zu +
  Servo       zu Nano Pin 5
  Encode SW   zu Nano Pin4
  Encode DT   zu Nano Pin3
  Encode CLK  zu Nano Pin2    

*/
#include <SPI.h>          // библиотека для работы с шино50K SPI
#include "nRF24L01.h"     // библиотека радиомодуля
#include "RF24.h"         // ещё библиотека радиомодуля

 // Rotary Encoder Inputs
 #define inputCLK 2    //DigitalPin
 #define inputDT 3     //DigitalPin
 #define inputSW 4     //DigitalPin

RF24 radio(8, 9); // "создать" модуль на пинах 9 и 10 Для Уно
//RF24 radio(9,53); // для Меги

byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб

byte Ruder_Position;

 // Create a Servo object
 int counter = 0; 
 int currentStateCLK;
 int previousStateCLK; 
 int PushSW;

void setup() {
//Poti
   // Set encoder pins as inputs  
   pinMode (inputCLK,INPUT);
   pinMode (inputDT,INPUT);
   pinMode (inputSW,INPUT);

   // Read the initial state of inputCLK
   // Assign to previousStateCLK variable
   previousStateCLK = digitalRead(inputCLK);
   PushSW = digitalRead(inputSW);

//Funk
  Serial.begin(9600); //открываем порт для связи с ПК
  radio.begin(); //активировать модуль
  radio.setAutoAck(1);         //режим подтверждения приёма, 1 вкл 0 выкл
  radio.setRetries(5, 3);    //(время между попыткой достучаться, число попыток)
  radio.enableAckPayload();    //разрешить отсылку данных в ответ на входящий сигнал
  radio.setPayloadSize(32);     //размер пакета, в байтах
  radio.openWritingPipe(address[0]);   //мы - труба 0, открываем канал для передачи данных
  radio.setChannel(0x60);  //выбираем канал (в котором нет шумов!)
  radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
  radio.setDataRate (RF24_2MBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
  //должна быть одинакова на приёмнике и передатчике!
  //при самой низкой скорости имеем самую высокую чувствительность и дальность!!
  radio.powerUp(); //начать работу
  radio.stopListening();  //не слушаем радиоэфир, мы передатчик
}

void loop() {

      // Encoder Taste stellt Ruder auf 90 Grad!          
    if (PushSW != digitalRead(inputSW)){
        counter = 90;
        int Ruder_Position = counter; 
        Serial.print("Sende Ruder Mitte: "); Serial.println(Ruder_Position);
        radio.write(&Ruder_Position, sizeof(Ruder_Position));
        // Update previousStateCLK with the current state
        previousStateCLK = currentStateCLK;                 
   }

// Read the current state of inputCLK
   currentStateCLK = digitalRead(inputCLK);
   
    
   // If the previous and the current state of the inputCLK are different then a pulse has occured
   if (currentStateCLK != previousStateCLK){ 
       
     // If the inputDT state is different than the inputCLK state then 
     // the encoder is rotating counterclockwise
     if (digitalRead(inputDT) != currentStateCLK) { 
       counter --;
       counter --;           // Tempo x5
       counter --;
       counter --;           
       counter --;
       if (counter<0){
        counter=0;
       }

     } else {
       // Encoder is rotating clockwise
       counter ++;
       counter ++;
       counter ++;
       counter ++;
       counter ++;
       if (counter>180){
        counter=180;
       }

     }

  int Ruder_Position = counter; 
  Serial.print("Sende Ruder Position: "); Serial.println(Ruder_Position);
  radio.write(&Ruder_Position, sizeof(Ruder_Position));
   // Update previousStateCLK with the current state
   previousStateCLK = currentStateCLK; 
  //delay(500);

}
}

Empfänger:

/*
  Ruder Steuerung mit Encoder
  
  Ground zu Ground, + zu +
  Servo       zu Nano Pin 5
  */
 
 // Include the Servo Library
 #include <Servo.h>
 #include <SPI.h>
 #include <nRF24L01.h>
 #include <RF24.h> 
 

 RF24 radio(8,9); // "создать" модуль на пинах 8 и 9 Для Уно
 //RF24 radio(9,53); // для Меги

 byte address[][6] = {"1Node","2Node","3Node","4Node","5Node","6Node"};  //возможные номера труб
 
 // Create a Servo object
 Servo Ruder;
 
 void setup() { 
   
   // Setup Serial Monitor
   Serial.begin (9600);
   // Attach servo on pin 5 to the servo object
   Ruder.attach(5);
  
  //Radio
  Serial.begin(9600); //открываем порт для связи с ПК
  radio.begin(); //активировать модуль
  radio.setAutoAck(1);         //режим подтверждения приёма, 1 вкл 0 выкл
  radio.setRetries(5,3);     //(время между попыткой достучаться, число попыток)
  radio.enableAckPayload();    //разрешить отсылку данных в ответ на входящий сигнал
  radio.setPayloadSize(32);     //размер пакета, в байтах
  radio.openReadingPipe(1,address[0]);      //хотим слушать трубу 0
  radio.setChannel(0x60);  //выбираем канал (в котором нет шумов!)
  radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
  radio.setDataRate (RF24_2MBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
  //должна быть одинакова на приёмнике и передатчике!
  //при самой низкой скорости имеем самую высокую чувствительность и дальность!!
  radio.powerUp(); //начать работу
  radio.startListening();  //начинаем слушать эфир, мы приёмный модуль
 } 
 
 
 void loop() {

      //Empfange Ruder Position
      byte pipeNo, gotByte;                          
      while( radio.available(&pipeNo)){    // слушаем эфир со всех труб
      radio.read( &gotByte, sizeof(gotByte) );         // чиатем входящий сигнал
      int Ruder_Pisition = gotByte;
      Serial.print("Empfange Ruder Position: "); Serial.println(gotByte);
      
      Ruder.write(gotByte);


   }
 }

Danke