• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
nrf24l01 - nadajnik i odbiornik
#1
Witam
Chcialbym zrobic prosty nadajnik i odbiornik na dwoch nrf24l01.
Mam podlaczone dwa Joye oraz dwa buttony, niby wszystko dziala poza malym ale...
Po wybraniu jakiejkowiek opcji, mam diode led na odbiorniku podlaczona na test,
lecz nie swieci sie ciag,ym swiatlem lecz mruga...moze ktos pomoc.

Nadajnik:
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

#define CE_PIN  7
#define CSN_PIN 8
#define Lx_axis A1 
#define Ly_axis A0 
#define Px_axis A3 
#define Py_axis A2 
#define button1 2
#define button2 3

int sensorValueLX = 0;
int sensorValueLY = 0;
int sensorValuePX = 0;
int sensorValuePY = 0;

const uint64_t pipe = 0xE8E8F0F0E1LL;
RF24 radio(CE_PIN, CSN_PIN);
int data[6]; 

void setup()
{
  Serial.begin(115200);
  radio.begin();
  radio.setPALevel(RF24_PA_HIGH);
  radio.openWritingPipe(pipe);
  pinMode(button1, INPUT_PULLUP);
  pinMode(button2, INPUT_PULLUP);
}

void loop() 
{
sensorValueLX = analogRead(Lx_axis); 
sensorValueLY = analogRead(Ly_axis);
sensorValuePX = analogRead(Px_axis); 
sensorValuePY = analogRead(Py_axis);

if (sensorValueLX < 100)
{
sensorValueLX = 1; 
}
if (sensorValueLX > 900)
{
sensorValueLX = 2; 
}

if (sensorValuePX < 100)
{
sensorValuePX = 1; 
}
if (sensorValuePX > 900)
{
sensorValuePX = 2; 
}

if (sensorValueLY < 100)
{
sensorValueLY = 1; 
}
if (sensorValueLY > 900)
{
sensorValueLY = 2; 
}

if (sensorValuePY < 100)
{
sensorValuePY = 1; 
}
if (sensorValuePY > 900)
{
sensorValuePY = 2; 
}
 
  delay(5);
  data[0] = sensorValueLX;
  data[1] = sensorValueLY;
  data[2] = sensorValuePX;
  data[3] = sensorValuePY;
  data[4] = digitalRead(button1);
  data[5] = digitalRead(button2);
  radio.write( data, sizeof(data) );
}



Odbiornik:
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

RF24 radio(7, 8); // CE, CSN
const uint64_t pipe = 0xE8E8F0F0E1LL;
int data[6];

void setup() {
  Serial.begin(115200);
  pinMode(4, OUTPUT);
  digitalWrite(4, LOW);
  radio.begin();
  radio.openReadingPipe(1, pipe);
  radio.setPALevel(RF24_PA_HIGH);
  radio.startListening();
}
void loop()
{
  delay(5);
  radio.read( data, sizeof(data));
  /*
  Serial.print(data[0]);    // Lewy L i P
  Serial.print("  ");
  Serial.print(data[1]);    // Lewy G i D
  Serial.print("  ");
  Serial.print(data[2]);    // Prawy L i P
  Serial.print("  ");
  Serial.print(data[3]);    // Prawy G i D
  Serial.print("  ");
  Serial.print(data[4]);    // Button 2
  Serial.print("  ");
  Serial.println(data[5]);  // Button 3
  */
  if (data[4] == 1) {
      digitalWrite(4, HIGH);
  } else {
      digitalWrite(4, LOW);
  }
  }
 
Odpowiedź
#2
Jak zaglądam do przykładu to jest tam taki początek:
if (radio.available(&pipe), a Ty odczytujesz nieważne czy jest nowa wiadomość czy nie. Delay w demo tej biblioteki jest i to nawet 1000 ale tylko w nadajniku, by nie zasypać danymi odbiornika, no i poza tym nadajnik nic więcej nie robi, a poza tym jest to DEMO.
Robisz zdalne sterowanie, załóż że jest to prawdziwy czołg, kazałeś mu jechać w stronę swojego domu i straciłeś zasięg, padła bateria. Nie byłoby dobrze gdyby się zatrzymał? Naucz się liczyć upływający czas, bez delay, w Arduino jest do tego millis() - najprostsze, wysyłaj cyklicznie wiadomość, cykle można wydłużyć, jeśli nie ma nowych/innych danych do wysłania, z drugiej strony sprawdzaj ile upłynęło od ostatniej wiadomości, jeśli minęło kilka cykli i nie było wiadomości wyląduj bezpiecznie czołgiem na ziemi.
Całą 1s należy podzielić na takie odcinki czasu, by ogarnąć wszystko co jest do zrobienia i nie częściej niż trzeba, bo szybko tej jednej sekundy braknie. Np. drukowanie na serial dla ludzkiego oka co 5ms nie ma żadnego sensu, co 100ms będzie to nie do odczytania, ale przynajmniej do zrobienia i nie obciąży jakoś znacząco modułu, jest większa szansa na nieprzepełnianie buforów na dane do wysłania. Z delay trudno będzie robić różne rzeczy w różnych interwałach, a poza tym on jest tylko do DEMO.
Większość problemów z programowaniem arduino na początku to brak panowania nad upływającym czasem, a delay służy tylko do robienia DEMO bibliotek.
Korzystanie z millis jest proste, wystarczy kilka komend i masz w programie zamiast siłowego zatrzymania w jednym punkcie pomijanie robienia tego, czego jeszcze nie trzeba i rozpoczynanie loop od nowa, jedyne co robisz w każdym loop to sprawdzenie ile ms upłynęło od ostatniego razu danego zdarzenia, jeśli upłynęło >= od założonych robisz to.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości