Skocz do zawartości

nRF24L01 - nadajnik - odbiornik- brak komunikacji


szamansins123

Pomocna odpowiedź

Cześć,
Staram się skomunikować dwie sztuki arduino UNO za pomocą modułów nRF24L01. Jedno Arduino ma podpięty przycisk (nadajnik), drugie moduł z przekaźnikiem (odbiornik).
Połączenie wg rysunku (odbiornik rózni się tylko płytką z dwoma przekaźnikami, aktywacja też przez pin2)
1.thumb.png.49e56d6eb00ca037ab2d029f33378c19.png

 

Kody programów wyglądają następująco:

NADAJNIK
 

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

// NADAJNIK

int DataMsg[1];

// piny radio
RF24 radio(9,10);

const uint64_t pipe = 0xE14BC8F482LL;

//przycisk
int SK1 = 2;

void setup()
{
  //pin wejsciowy
  pinMode(2, INPUT_PULLUP);
  
   Serial.begin(57600);
  Serial.println("NRF24L01 Transmitter");

  radio.begin();
  radio.openWritingPipe( pipe);
}

void loop()
{
  if (digitalRead(SK1) == LOW)
  {
    Serial.println("Przyciks 1 aktywny");
    DataMsg[1] = 1;
    radio.write(DataMsg, 1);
  }
}

 ODBIORNIK

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

// ODBIORNIK

int DataMgs[1];

//piny rdio
RF24 radio(9,10);

const uint64_t pipe = 0xE14BC8F482LL;

//wyjścia 
int K1=2; 
  
  void setup()
{
  
  
  pinMode(K1, OUTPUT);
  
            digitalWrite(K1, HIGH);
         
  //start transmisji, start przesyłu radia
  Serial.begin(57600);
  radio.begin();
  radio.openReadingPipe(1,pipe);
  radio.startListening();
}

void loop()
{
  if (radio.available())
  {
    bool done = false;    
    while (!done)
    {
      done = radio.read(DataMgs, 1);
      Serial.print("odbiornik: ");    
      Serial.println(DataMgs[1]);
      
      if (DataMgs[1] == 1)
      {
        delay(10);
        digitalWrite(K1, LOW);
      }
    else
  {
  Serial.println("czekam na sygnal");
  }
}}}

 

 

Po wlaczeniu monitora szeregowego jest wykrycie wcisniecia przycisku. Odbiornik nie reaguje na nic. 
Czy ma może ktoś jakiś pomysł? Dodam że po wgraniu losowego progamu z internetu odpowiadajacego za podobne załączanie LEDów przyciskiem, miałem na odbiorniku w monitorze szeregowym info że czeka na sygnał, lecz nadal nie było komunikacji. 
Wyczytałem też że ludzie wstawiają kondensator między liniami zasilania, bo układ nie wyrabia - czy to może być przyczyną?

  • Pomogłeś! 1
Link do komentarza
Share on other sites

23 minuty temu, szamansins123 napisał:

Wyczytałem też że ludzie wstawiają kondensator między liniami zasilania

Niedawno miałem okazję testować te moduły. Też miałem ten sam problem pomimo, że tego samego tygodnia oglądałem materiał o tych modułach. Na pewno kondensatory są potrzebne, a w szczególności przy odbiorniku, który potrzebuje lepsze zasilanie (najlepiej osobne, dedykowane). Nadajnik można zasilać z Arduino.

W załączniku kod ze zmodyfikowanego przykładu z biblioteki, który wtedy u mnie działał. Wgrywasz ten sam na obie płytki. Moduły są domyślnie odbiornikami, zaś wysyłając w terminalu znaki T oraz R zmieniasz ich role na nadajnik lub odbiornik. Urządzenia powinny wysyłać między sobą "counter" inkrementowany po każdym udanym przesłaniu.

Zwróć też uwagę jak są ułożone anteny. Ustawienie mocy tylko lekko zwiększyło zasięg, dla testów gdzie moduły leżą obok siebie nie ma to znaczenia, ale na wszelki wypadek za funkcją begin() można dopisać:

radio.setChannel(108);
radio.setPALevel(RF24_PA_MAX);

 

custom_nrf24_przyklad.zip

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Co do modułów to nie używałem, więc nie pomogę ze sprzętem. Ale w programie można poprawić chociaż podstawowe błędy, np. indeksowanie tablic. W języku C indeksowanie jest od zera, więc tablica:

int DataMgs[1];

Ma tylko jeden element o indeksie zero, jak odwołujesz się do indeksu 1 to piszesz lub czytasz poza tablicą:

DataMsg[1] = 1;

Kolejna sprawa to rozmiar zmiennej int. Zajmuje ona chyba dwa bajty na Arduino, w każdym razie:

radio.read(DataMgs, 1);

Takie coś odbiera jeden bajt, czyli połowę zmiennej... Co ciekawe to nawet mogłoby działać, ale to przypadek.

Wydaje mi się, że jakiś kurs podstaw języka C mógłby pomóc znacznie więcej niż porywanie się na komunikację radiową.

 

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

@Elvis co do kursu programowania w C, wiem ze tablice indeksuje się od zera. Korzystałem z różnych przykładów, nie chciały działać, w jednym opisie tych modułów na angielskim forum wyczytałem żeby indeksować od liczby innej niż 0, to jest kod po kilkunastu modyfikacjach. Do do tego z intem - tak tez podali w przykładzie od twórcy bibliotek, tego się trzymam. 

@Mechano @Gieneq sprawdzę na dniach to zasilanie, dzięki jeżeli pomoże czy nie to dam znać 🙂 

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.