Skocz do zawartości

Arduino - problem z nrf24l01 - powielanie polecenia


dzemdobrek

Pomocna odpowiedź

 

Cześć ponownie,
Mam problem z którym nie umiem sobie poradzić. Gdy cały program był na jednym arduino i polecenie wydawane na wciśnięcie guzika wszystko było okej. Teraz gdy użyłem modułu nrf po wciśnięciu guzika program jest zapętlany trzy bądź cztery razy. Nie wiem w jaki sposób rozwiązać ten problem by wózek przejechał tylko i wyłącznie raz od lewa do prawa.

Jako pomocy korzystałem z tego poradnika:
"https://howtomechatronics.com/tutorials/arduino/arduino-wireless-communication-nrf24l01-tutorial/"
Po podłączeniu i przetestowaniu dwóch programów ze strony wszystko grało ze sobą elegancko.

drugi problem (nie główny):
Wcześniej chciałem, żeby jeździł od krańcówki do krańcówki po wciśnięciu przycisku ale wózek albo reagował na krańcówki albo nie i dochodziło do zderzenia, więc zrezygnowałem z tego pomysłu, może już ktoś coś takiego robił i podzieli się doświadczeniem?
 

// TRANSMITER ARDUINO 

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

RF24 radio(7, 8); // CE, CSN
const byte addresses[][6] = {"00001"}; //INICJALIZACJA NADAJNIKA

#define x_pin A0      // Pin A0 connected to joystick x axis pin

#define prawo 5
#define lewo 3

#define button 2

boolean buttonState = 0;
 
void setup() {
  
  pinMode(prawo, INPUT_PULLUP); //Przycisk prawo
  pinMode(lewo, INPUT_PULLUP); //Przycisk lewo
    pinMode(button, INPUT);


  pinMode(x_pin, INPUT); //joystick


  radio.begin();
  radio.openWritingPipe(addresses[0]);
  radio.setPALevel(RF24_PA_MIN);
  radio.stopListening();            //INICJALIZACJA NADAJNIKA

  delay(5);  // Wait 
  
}

void loop() {

    buttonState = digitalRead(button);
    radio.write(&buttonState, sizeof(buttonState));
    
}
int Distance = 3670;  
int amax = 3670;  

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(7, 8); // CE, CSN
const byte address[6] = "00001";    //INICJALIZACJA ODBIORNIKA

#define steppin 2    
#define dirpin 3     
#define MS1 4         
#define MS2 5        

#define home_switch 6 

boolean buttonState = 0;

int direction;    
int steps;        
 
void setup() {

  pinMode(MS1, OUTPUT);
  pinMode(MS2, OUTPUT);
  pinMode(steppin,OUTPUT); 
  pinMode(dirpin,OUTPUT);  // silnik

  pinMode(home_switch, INPUT_PULLUP); //krancowka

  radio.begin();
  radio.openReadingPipe(0, address);
  radio.setPALevel(RF24_PA_MIN);
  radio.startListening();             //INICJALIZACJA ODBIORNIKA

  delay(5);  

   digitalWrite(MS1, LOW);      
   digitalWrite(MS2, LOW);   



  while (digitalRead(home_switch)) {  
    digitalWrite(dirpin, LOW);      
    digitalWrite(steppin, HIGH);
    delay(5);                       
    digitalWrite(steppin, LOW);
    delay(5);   
}

  while (!digitalRead(home_switch)) { 
    digitalWrite(dirpin, HIGH); 
    digitalWrite(steppin, HIGH);
    delay(10);                       
    digitalWrite(steppin, LOW);
    delay(10);
  }

  steps=0;  
   
}

void loop() {

  if (!radio.available());
  radio.read(&buttonState, sizeof(buttonState));           //reakcja ba guzik - operacja jednorazowa
  if (buttonState == HIGH) {
     digitalWrite(dirpin,HIGH); 
    for(int x = 0; x < Distance; x++) {
    digitalWrite(steppin,HIGH); 
    delayMicroseconds(500); 
    digitalWrite(steppin,LOW); 
    delayMicroseconds(500); 
    }
  
   delay(100);
  
    digitalWrite(dirpin,LOW); 
    for(int x = 0; x < Distance; x++) {
    digitalWrite(steppin,HIGH);
    delayMicroseconds(500);
    digitalWrite(steppin,LOW);
    delayMicroseconds(500);
    }
       delay(100);
    }
  }
int Distance = 3670;  // Record the number of steps we've taken
int amax = 3670;  // Record the number of steps we've taken


#define steppin 2    // Pin 5 connected to Steps pin on EasyDriver
#define dirpin 3     
#define MS1 4         
#define MS2 5         
  
#define x_pin A0     

#define home_switch 7 

#define prawo 8
#define lewo 9

#define automat 11

int direction;   
int steps;       
 
void setup() {

  pinMode(MS1, OUTPUT);
  pinMode(MS2, OUTPUT);
  pinMode(steppin,OUTPUT); 
  pinMode(dirpin,OUTPUT);
  
  pinMode(prawo, INPUT_PULLUP); //Przycisk prawo
  pinMode(lewo, INPUT_PULLUP); //Przycisk lewo
  pinMode(automat, INPUT_PULLUP); //przycisk do automatycznego przejazdu

  pinMode(x_pin, INPUT); //joystick

  pinMode(home_switch, INPUT_PULLUP); //krancowka

  delay(5); 

   digitalWrite(MS1, LOW);      
   digitalWrite(MS2, LOW);    


  while (digitalRead(home_switch)) {  
    digitalWrite(dirpin, LOW);      
    digitalWrite(steppin, HIGH);
    delay(5);                       
    digitalWrite(steppin, LOW);
    delay(5);   
}

  while (!digitalRead(home_switch)) { 
    digitalWrite(dirpin, HIGH); 
    digitalWrite(steppin, HIGH);
    delay(10);                       
    digitalWrite(steppin, LOW);
    delay(10);
  }
  steps=0;  
}

void loop() {

    //reakcja ba guzik - operacja jednorazowa
    if (digitalRead(automat) == LOW)
    {
       
          digitalWrite(dirpin,HIGH);
    for(int x = 0; x < Distance; x++) {
    digitalWrite(steppin,HIGH); 
    delayMicroseconds(500); 
    digitalWrite(steppin,LOW); 
    delayMicroseconds(500); 
    }
  
    delay(1000); 
  
    digitalWrite(dirpin,LOW); 
    for(int x = 0; x < Distance; x++) {
    digitalWrite(steppin,HIGH);
    delayMicroseconds(500);
    digitalWrite(steppin,LOW);
    delayMicroseconds(500);
    }
    
    delay(1000);

    }
    

    //przejazd na rzadanie w prawo badz lewo
    
     while (digitalRead(prawo) == LOW) { 
  digitalWrite(dirpin,HIGH);
  for(int x = 0; x < 1; x++) {
    digitalWrite(steppin,HIGH); 
    delayMicroseconds(500);  
    digitalWrite(steppin,LOW); 
    delayMicroseconds(500); 
}
}

   while (digitalRead(lewo) == LOW) { 
  digitalWrite(dirpin,LOW); 
  for(int x = 0; x < 1; x++) {
    digitalWrite(steppin,HIGH); 
    delayMicroseconds(500); 
    digitalWrite(steppin,LOW); 
    delayMicroseconds(500); 
}
}

  while (analogRead(x_pin) >= 0 && analogRead(x_pin) <= 100) {
    if (steps > 0) {  
      digitalWrite(dirpin, LOW);  
      digitalWrite(steppin, HIGH);
    delayMicroseconds(500); 
      digitalWrite(steppin, LOW);
    delayMicroseconds(500); 
      steps--;   
    }      
  }
   
    while (analogRead(x_pin) > 900 && analogRead(x_pin) <= 1024) {
      if (steps < amax) {      
        digitalWrite(dirpin, HIGH);
        digitalWrite(steppin, HIGH);
    delayMicroseconds(500); 
         digitalWrite(steppin, LOW);
    delayMicroseconds(500); 
        steps++;  
      }
    }
}

 

Link do komentarza
Share on other sites

3 godziny temu, PiotrekEl napisał:

A czy nie jest to wina drgań styków przycisku? Jedno naciśnięcie jest widziane jako 3 lub 4 i odbiornik wykonuje z bufora wszystkie "zaległe transmisje"?

Dokladnie o tym samym pomyslalem...nawet jesli to nie to, to i tak warto dodac jakis "opuzniacz". Wtedy wiadomo ze guzik zostal wykryty tylko raz...zwykly delay() wystarczy..poza tym mozna dodac jakiegos if'a tak zeby wysylac tylko raz komende wtedy jak przycisk wykryty...teraz to wysyla non stop co jest nie potrzebne..

Edytowano przez farmaceuta
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

7 minut temu, ethanak napisał:

Ogólnie poczytajcie sobie o debouncingu... choćby wpisując to tajemnicze słowo w forumową wyszukiwarkę 😉

Heh...Ty to Jestes madry czlowiek ethanak...😅 nawet nie wiedzialem ze na to jest jakies profesjonalne okreslenie...juz na yt widzialem jak to fajnie na oscyloskopie widac...😉

Link do komentarza
Share on other sites

12 minut temu, ethanak napisał:

To koło nazywa się Bounce2 i nie ma potrzeby aby wynajdywać kolejne 🙂

Zdarzało mi się korzystać z tego wynalazku, sam nie wiem czemu nie wspomniałem o tym w swoim poście🤔 

Nieczęsto używam Arduino stąd nie pamiętam w sumie jak wygląda instrukcja do tego.

Link do komentarza
Share on other sites

Dzięki bardzo za pomoc 🙂

    delay (5);
    buttonState = digitalRead(button);
    radio.write(&buttonState, sizeof(buttonState));
    delay(200);

Tym sposobem oraz dodaniem kondensatora udało mi się uzyskać porządany przeze mnie efekt czyli przejazd jednorazowy.

 


  while (analogRead(x_pin) >= 0 && analogRead(x_pin) <= 100) {
    if (steps > 0) {  
      digitalWrite(dirpin, LOW);  
      digitalWrite(steppin, HIGH);
    delayMicroseconds(500); 
      digitalWrite(steppin, LOW);
    delayMicroseconds(500); 
      steps--;   
    }      
  }
   
    while (analogRead(x_pin) > 900 && analogRead(x_pin) <= 1024) {
      if (steps < amax) {      
        digitalWrite(dirpin, HIGH);
        digitalWrite(steppin, HIGH);
    delayMicroseconds(500); 
         digitalWrite(steppin, LOW);
    delayMicroseconds(500); 
        steps++;  


Pytanie odnośnie powyższego kodu i transmijsji "analogRead(x_pin)". W jaki sposób przekazać z jednego na drugi bo trochę się zamotałem przy joysticku.

Link do komentarza
Share on other sites

if (digitalRead(button) == LOW)  
  {
    buttonState = digitalRead(button);
    radio.write(&buttonState, sizeof(buttonState));
    delay(500);
  }

Mozesz tez dopisac if'a jak wyzej i wtedy wysylasz tylko wtedy jak wciskasz..

21 minut temu, dzemdobrek napisał:

Pytanie odnośnie powyższego kodu i transmijsji "analogRead(x_pin)". W jaki sposób przekazać z jednego na drugi bo trochę się zamotałem przy joysticku.

A tu tak dokladniej to o co Ci chodzi? bo nie lapie..😉

Link do komentarza
Share on other sites

1 godzinę temu, farmaceuta napisał:

Mozesz tez dopisac if'a jak wyzej i wtedy wysylasz tylko wtedy jak wciskasz..

A tu tak dokladniej to o co Ci chodzi? bo nie lapie..😉

Po dodaniu if'a nic się nie dzieje, zero reakcji. Nie wiem czemu.
Chodzi mi o to, że po przekręceniu gałki joysticka przesuwał się i oczywiście też nie działa 😕  Bez modułu radiowego tak jak pisałem wszystko chula tak jak chcę. Gdzieś popełniam błąd przy zmiennych.
 

//RECIVER ARDUINO

int Distance = 3670;  
int amax = 3670;  
int joys;

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(7, 8); // CE, CSN
const byte address[6] = "00001";    //INICJALIZACJA ODBIORNIKA

#define steppin 2    
#define dirpin 3     
#define MS1 4         
#define MS2 5        

#define home_switch 6 

boolean buttonState = 0;

int direction;    
int steps;        
 
void setup() {

  pinMode(MS1, OUTPUT);
  pinMode(MS2, OUTPUT);
  pinMode(steppin,OUTPUT); 
  pinMode(dirpin,OUTPUT);  // silnik

  pinMode(home_switch, INPUT_PULLUP); //krancowka

  radio.begin();
  radio.openReadingPipe(0, address);
  radio.setPALevel(RF24_PA_MIN);
  radio.startListening();             //INICJALIZACJA ODBIORNIKA

  delay(5);  

   digitalWrite(MS1, LOW);      
   digitalWrite(MS2, LOW);   



  while (digitalRead(home_switch)) {  
    digitalWrite(dirpin, LOW);      
    digitalWrite(steppin, HIGH);
    delay(5);                       
    digitalWrite(steppin, LOW);
    delay(5);   
}

  while (!digitalRead(home_switch)) { 
    digitalWrite(dirpin, HIGH); 
    digitalWrite(steppin, HIGH);
    delay(10);                       
    digitalWrite(steppin, LOW);
    delay(10);
  }

  steps=0;  
   
}

void loop() {

  if (!radio.available());
  
radio.read(&joys, sizeof(joys));
  while (joys >= 0 && joys <= 100) {
    if (steps > 0) {  
      digitalWrite(dirpin, LOW);  
      digitalWrite(steppin, HIGH);
    delayMicroseconds(500); 
      digitalWrite(steppin, LOW);
    delayMicroseconds(500); 
      steps--;   
    }      
  }
   
    while (joys > 900 && joys <= 1024) {
      if (steps < amax) {      
        digitalWrite(dirpin, HIGH);
        digitalWrite(steppin, HIGH);
    delayMicroseconds(500); 
         digitalWrite(steppin, LOW);
    delayMicroseconds(500); 
        steps++;  
      }
    }

  }
// TRANSMITER ARDUINO 

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

RF24 radio(7, 8); // CE, CSN
const byte addresses[][6] = {"00001"}; //INICJALIZACJA NADAJNIKA

#define x_pin A0      // Pin A0 connected to joystick x axis pin

//#define prawo 5
//#define lewo 3

#define button 2

boolean buttonState = 0;

int joysState;
int joys;

 
void setup() {
  
 // pinMode(prawo, INPUT_PULLUP); //Przycisk prawo
 // pinMode(lewo, INPUT_PULLUP); //Przycisk lewo
    pinMode(button, INPUT);


 pinMode(x_pin, INPUT); //joystick


  radio.begin();
  radio.openWritingPipe(addresses[0]);
  radio.setPALevel(RF24_PA_MIN);
  radio.stopListening();            //INICJALIZACJA NADAJNIKA

  delay(5);  // Wait 
  
}

void loop() {
delay (5);
    joysState = digitalRead(x_pin);
    joysState = joys;
    radio.write(&joys, sizeof(joys));
}

 

Link do komentarza
Share on other sites

Masz w programie:
 

joysState = digitalRead(x_pin); // dobrze
joysState = joys; // a tu zamazujesz wczytaną wartość i wstawiasz zero (początkową wartość joys)
radio.write(&joys, sizeof(joys)); // no i wysyłasz zero

A nie powinno być przypadkiem:

joys = joysState; // wstawiamy odczytaną wartość do zmiennej którą będziemy wysyłać

Tak przy okazji - ja zawsze daję więcej parametrów do radia). Taki przykładowy kod z mojego nadajnika:   

    radio.begin();
    radio.setPayloadSize(sizeof(RadioData));
    radio.setAutoAck(1);
    radio.setRetries(15,15);
    radio.setDataRate(RF24_250KBPS);
    radio.setPALevel(RF24_PA_MAX);
    radio.openWritingPipe(PIPEADR);

 

Edytowano przez ethanak
  • Lubię! 1
Link do komentarza
Share on other sites

Mógłbyś między osobnymi wstawkami kodu programu dawać linijkę odstępu albo najlepiej pisać który to nadajnik a który odbiornik? Znacznie ułatwi to przeglądanie kodu bo zlewają się w jedno 😉

Chyba problem jest tu:

joysState = digitalRead(x_pin);
joysState = joys;
radio.write(&joys, sizeof(joys));

 

Edit:

Nie zdążyłem 😉

Edytowano przez PiotrekEl
Link do komentarza
Share on other sites

Zlym nawykiem jest tworzenie czegos takiego, bo stan nie jest ustalony 

pinMode(button, INPUT);

no chyba ze masz zewnetrzny rezystor ktorym podciagasz ten pin..

Z regoly uzywa sie INPUT_PULLUP..i wcisniety guzik oznacza stan LOW...(jedna strona guzika do gnd) i wtedy zacznie dzialac..😉

Link do komentarza
Share on other sites

(edytowany)

 

 

 

51 minut temu, ethanak napisał:

Masz w programie:
 



joysState = digitalRead(x_pin); // dobrze
joysState = joys; // a tu zamazujesz wczytaną wartość i wstawiasz zero (początkową wartość joys)
radio.write(&joys, sizeof(joys)); // no i wysyłasz zero

A nie powinno być przypadkiem:



joys = joysState; // wstawiamy odczytaną wartość do zmiennej którą będziemy wysyłać

Tak przy okazji - ja zawsze daję więcej parametrów do radia). Taki przykładowy kod z mojego nadajnika:   



    radio.begin();
    radio.setPayloadSize(sizeof(RadioData));
    radio.setAutoAck(1);
    radio.setRetries(15,15);
    radio.setDataRate(RF24_250KBPS);
    radio.openWritingPipe(PIPEADR);

 

Niestety pomimo drobnej poprawki dalej nie działa, 😞 mam prośbę @ethanak. Mógł byś wysłać jakiś przykładowe kody bym mógł na nie zerknąć. Straszny problem sprawia mi ten potencjometr (joystick) by wysłać wartość do drugiego arduino a następnie zmusić do ruchu silnik krokowy. Przydało by się zrobić następny kurs o arduino o modułach radiowych hehehe. 😉
@farmaceuta było zastosowane INPUT_PULLUP, lecz nie dawało to żadnego efektu. Po zmianie na INPUT oraz dodaniu rezystora od razu zagadało ze sobą 😉

 

Połączenie analogowo na jednym arduino

while (analogRead(x_pin) >= 0 && analogRead(x_pin) <= 100) {
    if (steps > 0) {  
      digitalWrite(dirpin, LOW);  
      digitalWrite(steppin, HIGH);
    delayMicroseconds(500); 
      digitalWrite(steppin, LOW);
    delayMicroseconds(500); 
      steps--;   
    }      
  }
   
    while (analogRead(x_pin) > 900 && analogRead(x_pin) <= 1024) {
      if (steps < amax) {      
        digitalWrite(dirpin, HIGH);
        digitalWrite(steppin, HIGH);
    delayMicroseconds(500); 
         digitalWrite(steppin, LOW);
    delayMicroseconds(500); 
        steps++;  

ODBIORNIK

void loop() {

  if (!radio.available()){

radio.read(&joys, sizeof(joys));
  while (joys >= 0 && joys <= 100) {
    if (steps > 0) {  
      digitalWrite(dirpin, LOW);  
      digitalWrite(steppin, HIGH);
    delayMicroseconds(500); 
      digitalWrite(steppin, LOW);
    delayMicroseconds(500); 
      steps--;   
    }      
  }
   
    while (joys > 900 && joys <= 1024) {
      if (steps < amax) {      
        digitalWrite(dirpin, HIGH);
        digitalWrite(steppin, HIGH);
    delayMicroseconds(500); 
         digitalWrite(steppin, LOW);
    delayMicroseconds(500); 
        steps++;  
      }
    }
  }
}

 

NADAJNIK

void loop() {
delay (5);
    joysState = digitalRead(x_pin);
    joys = joysState;
    radio.write(&joys, sizeof(joys));
}

 

Edytowano przez dzemdobrek
Link do komentarza
Share on other sites

6 minut temu, dzemdobrek napisał:

Mógł byś wysłać jakiś przykładowe kody bym mógł na nie zerknąć

https://forbot.pl/forum/topic/18932-jawajka-na-cztery-rece/

Masz tam kody nadajnika i odbiornika, co prawda bez silników krokowych ale z serwami. Trochę skomplikowane, ale wydłubiesz sobie z nich co trzeba.

  • Lubię! 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.