• 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
Problem z NRF24L01
#1
Cześć wszystkim, mam kłopot z projektem i zastanawiam się czy to z kodem jest coś nie tak. To mój pierwszy projekt i jest dość prosty, ale ja nie widzę tu źródła problemu. Program ma za zadanie wysyłać nadajnikiem sygnał do odbiornika aby poruszyć serwem o zadany kąt. Pierwszy przycisk ma po naciśnięciu zmienić pozycję serwa (i utrzymać ją dopóki przycisk jest wciśnięty), a po puszczeniu wrócić serwo na pierwotną pozycję. Drugi ma po naciśnięciu (i puszczeniu w dowolnym momencie) odczekać 5 sekund (z sygnałem dźwiękowym przerywanym) i wysłać sygnał który na 1,5sek zmieni pozycję serwa i po tym czasie wróci do pozycji wyjściowej.
Problem jest w drugim przycisku - czasem nie wyzwala serwa. Nie wiem od czego to zależy. NRFy są okondensatorowane tak jak serwo, wiec wykluczam zakłócenia. 
1. Nadajnik na Arduino Nano z modułem NRF24L01, buzzerem i dwoma przyciskami:
Kod:
/*
Nadajnik radiowy do servo. 2 przyciski i buzzer.
Przycisk1 obraca servo do pewnego momentu kiedy jest wciśnięty. Kiedy puszczony, servo wraca do swojej pozycji.
Przycisk2 - jego naciśnięcie generuje (w nadajniku) sygnał dzwiękowy przez 5 sekund, po czym przesuwa servo na 0,5 sekundy i wraca do swojej pozycji.
*/
#include <SPI.h>
#include <RF24.h>
#include <nRF24L01.h>

int data[2];
RF24 radio(9,10);//piny do podpięcia modułu nRF24L01
const uint64_t pipe = 0xF0F0F0F0D2L;

int buttonPin1 = A1; //pin przycisku 1
int buttonPin2 = A2; //pin przycisku 2
int buttonState1 = 0;
int buttonState2 = 0;

void setup() {
  Serial.begin(9600);
  radio.begin();
  radio.openWritingPipe(pipe);
  pinMode(buttonPin1, INPUT_PULLUP);
  pinMode(buttonPin2, INPUT_PULLUP);
  pinMode(A5, OUTPUT); //Konfiguracja A5 jako wyjście dla buzzera
}

void loop() {
  buttonState1 = digitalRead(buttonPin1); //przycisk trzymany- servo zmieniona pozycja (przycisk1)

if (buttonState1 == HIGH)
  {
    data[1] = 170;
    radio.write(data, sizeof(data));
  }
    if(buttonState1 == LOW)
  {
    data[1] = 70;
    radio.write(data, sizeof(data));
  }

  buttonState2 = digitalRead(buttonPin2); // przycisk z opóźnieniem i buzzerem (przycisk 2)
   if (buttonState2 == HIGH)
  {
    data[0] = 170;
    radio.write(data, sizeof(data));
  }
    if (buttonState2 == LOW)
  {
  tone(A5, 1000); //Wygeneruj sygnał o częstotliwości 1000Hz na pinie A5 
  delay(100); 
  noTone(A5); //Wyłącz generowanie sygnału
  delay(900);
  tone(A5, 1000); //Wygeneruj sygnał o częstotliwości 1000Hz na pinie A5 
  delay(100); 
  noTone(A5); //Wyłącz generowanie sygnału
  delay(900);
  tone(A5, 1000); //Wygeneruj sygnał o częstotliwości 1000Hz na pinie A5 
  delay(100); 
  noTone(A5); //Wyłącz generowanie sygnału
  delay(900);
  tone(A5, 1000); //Wygeneruj sygnał o częstotliwości 1000Hz na pinie A5 
  delay(100); 
  noTone(A5); //Wyłącz generowanie sygnału
  delay(900);
  tone(A5, 1000); //Wygeneruj sygnał o częstotliwości 1000Hz na pinie A5 
  delay(100); 
  noTone(A5); //Wyłącz generowanie sygnału
  delay(900);
  tone(A5, 1000); //Wygeneruj sygnał o częstotliwości 1000Hz na pinie A5 
  delay(1000); 
  noTone(A5); //Wyłącz generowanie sygnału
    data[0] = 70;
    radio.write(data, sizeof(data));
    delay(500);
  }
  Serial.println(data[0]);
  Serial.println(data[1]);  
}
2. Odbiornik: Arduino nano, NRF24L01, serwo MG90:
Kod:
/*
Odbiornik radiowy poruszający servem zgodnie z poleceniami z nadajnika (Basic_Transmitter_Code_copy)
*/
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Servo.h>      // include the Servo library
Servo myServo1;

int data[2];

RF24 radio(9,10);//piny modułu NRF24L01
const uint64_t pipe = 0xF0F0F0F0D2L;

void setup()
{
myServo1.attach(5);
  Serial.begin(9600);
  radio.begin();
  radio.openReadingPipe(1, pipe);
  radio.startListening();
}

void loop(){
  if(radio.available()){
    bool done = false;
    while (!done) {
      done = radio.read(data,sizeof(data));
    
     if (data[1] == 170) {
       myServo1.write(160);
    } else {
        myServo1.write(45);
      }
    }
  }
  if(radio.available()){
    bool done = false;
    while (!done) {
      done = radio.read(data,sizeof(data));
     
     if (data[0] == 70) {
       myServo1.write(45);
       delay(1500);
      }
  }
  Serial.println(data[0]);
  Serial.println(data[1]);
  }
}
Pomóżcie Smile
 
Odpowiedź
#2
Naucz się zastąpić delay przez millis, obsłuż drgania styków. Wystarczy przerobić kurs Arduino do końca.
Nadajnik nie może wysyłać ile Arduino zdoła nadać z loop, powinieneś to ustalić na racjonalnym poziomie, np. co 50ms. Odbiornik powinien być zawsze gotowy do odbioru. Tak samo w odbiorniku bez delay i z obsługą drgań Arduino powinno być zawsze gotowe do zauważenia, że coś wcisnąłeś.
Oba mają liczyć czas, np. odbiornik odczekuje 50ms od ostatniego komunikatu i po kolejnych 50ms uznaje komunikację za zerwaną.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości