Skocz do zawartości

Sterowanie bezprzewodowe serwomechanizmem za pomocą tact switchy i nrf24l01.


Lolheadshootpl

Pomocna odpowiedź

Ok ogarnąłem te przyciski i wszystko jest git. Naciskając jeden przycisk na monitorze pokazuje "down" a naciskając drugi "up". Teraz pytanie bo wgrałem ten program ale nie działa. Ktoś powie co jest w nim nie tak?

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


void setup() {
  radio.begin();
  radio.openWritingPipe(address);
  radio.setPALevel(RF24_PA_MIN);
  radio.stopListening();


}
 void loop(){
  char text1[] = "up";
  char text2[] = "down";
  int button_1 = digitalRead(2);
  int button_2 = digitalRead(3);
  if (button_1 == 0){
    radio.write(&text1, sizeof(text1));
    
  }
  if (button_2 == 0){
    radio.write(&text2, sizeof(text2));
   
  }
  }
//Reciver
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Servo.h> 
int pos = 90;
int delayPeriod = 50;

Servo myservo;

RF24 radio(7, 8); // CE, CSN
const byte address[6] = "00001";
void setup() {
  Serial.begin(9600);
  radio.begin();
  radio.openReadingPipe(0, address);
  radio.setPALevel(RF24_PA_MIN);
  radio.startListening();
 myservo.attach(9);  // attaches the servo on pin 9 to the servo object 
 myservo.write(pos); // center the servo
}

void loop()
{  
  if (radio.available())
  {
    char text[32] = {0};
    radio.read(&text, sizeof(text));
    
   if (text=="up"){
     if( pos > 0)
     --pos;
   myservo.write(pos);              // tell servo to go to position in variable 'pos' 
   delay(delayPeriod);     
   }
   if (text=="down"){
     if( pos < 180)
      ++pos;
   myservo.write(pos);              // tell servo to go to position in variable 'pos' 
   delay(delayPeriod); 
   }
 }
}

 

Link do komentarza
Share on other sites

25 minut temu, Lolheadshootpl napisał:

Ktoś powie co jest w nim nie tak?

Ja już wcześniej powiedziałem że ktoś Ci sprzedał bzdurny kod.

Pomyśl sobie:

Masz tablicę typu char[32]. Ta tablica ma jakiś adres w pamięci (gdzieś tam zajmuje 32 bajty)

Masz literał "up". Jest to stała napisowa, również ma swój adres w pamięci (gdzieś tam zajmuje trzy bajty)

A teraz w programie porównujesz te adresy, czyli masz linijkę:

if (text=="up"){

No i żebyś nie wiem jak chciał i do jakiego Wielkiego Mzimu się modlił, te adresy przecież nie będą takie same, prawda?

Tak na chłopski rozum: jeśli w domu numer 13 w Pieprzdowicach Większych mieszka panna Rozalia (domek to stała napisowa), a do domku numer 7 w Chrzymponi Kościelnej wprowadziła się również niejaka panna Rozalia (a ten domek to Twoja tablica) to w żaden sposób owe domki nie staną się tym samym domkiem. Co więcej - porównując ich adresy dostaniesz informację (zupełnie prawdziwą zresztą), że są różne.

A Ty przecież chcesz wiedzieć, czy w obu domkach mieszka osoba o tym samym imieniu, prawda?

Więc albo trzeba porównać sobie zawartość tablicy z tym napisem, albo użyć klasy String. Zawartość można porównać w prosty sposób, do tego służy funkcja strcmp zwracająca zero jeśli porównywane napisy są takie same:

if (!strcmp(text,"up")) {

Konstruowanie Stringa z tablicy char tylko po to, aby go porównać z literałem to raczej ciężka przypadłość przerostu ceplusplusizmu nad zdrowym rozsądkiem 🙂

A kolegom którzy przez dwie strony komentarzy nie zauważyli tak oczywistego babola gratuluję spostrzegawczości 😛

Tak przy okazji: po kiego grzyba przesyłasz 32-bajtowy string i potem go w porównujesz z jakimiś innymi, zamiast jak człowiek przesłać jeden bajt i wtedy porównanie będzie w stylu:

if (text[0] == 1) { // 

 

?

 

Edytowano przez ethanak
  • Lubię! 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

38 minut temu, Lolheadshootpl napisał:

bo paru sekundach się wyłącza i trzeba zresetować arduino (odbiornik).

Może jednak pokażesz kompletny poprawiony kod?

 

 

Link do komentarza
Share on other sites

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Servo.h> 
int pos = 90;
int delayPeriod = 50;

Servo myservo;

RF24 radio(7, 8); // CE, CSN
const byte address[6] = "00001";
void setup() {
  Serial.begin(9600);
  radio.begin();
  radio.openReadingPipe(0, address);
  radio.setPALevel(RF24_PA_MIN);
  radio.startListening();
 myservo.attach(9);  // attaches the servo on pin 9 to the servo object 
 myservo.write(pos); // center the servo
}

void loop()
{  
  if (radio.available())
  {
    char text[32] = {0};
    radio.read(&text, sizeof(text));
    
   if (!strcmp(text,"up")) {
     if( pos > 0)
     --pos;
   myservo.write(pos);              // tell servo to go to position in variable 'pos' 
   delay(delayPeriod);     
   }
   if (!strcmp(text,"down")) {
     if( pos < 180)
      ++pos;
   myservo.write(pos);              // tell servo to go to position in variable 'pos' 
   delay(delayPeriod); 
   }
 }
}

Zmieniłem jedynie tego "if'a" i zaczęło działać.

Link do komentarza
Share on other sites

Ja tylko chciałbym zauważyć, że to radyjko czasami wariuje jeśli przesyłasz komunikaty różnej długości. Bo w kodzie nic podejrzanego nie widzę.

Jeśli już koniecznie musisz przesyłać napisy (tego nie rozumiem, to przecież nie do tego służy) to przynajmniej zrób stałą długość komunikatu (patrz setPayloadSize), ustaw explicite autoAck (setAutoAck), dataRate (setDataRate) i dopiero potem kombinuj.

 

 

Link do komentarza
Share on other sites

3 godziny temu, Lolheadshootpl napisał:

(text=="up")

Tak się nie porównuje stringów w C. To tylko porówna adresy wskaźników, które oczywiście są różne, bo te stringi są w różnych miejscach pamięci. Do porównywania stringów masz funkcje biblioteczne takie jak strncmp itd.

Link do komentarza
Share on other sites

5 minut temu, Lolheadshootpl napisał:

Myślisz że dodanie kondensatora na linie zasilania nrf'a pomoże?

Na pewno nie zaszkodzi - najlepiej przylutuj kondensator bezpośrednio do płytki nrf-a.

Przy ustawionym autoAck możesz sprawdzić czy odbiornik dostał dane (sprawdzaj co zwróci write) - to może pomóc w ustaleniu po czyjej stronie leży wina (nadajnik czy odbiornik).

 

Link do komentarza
Share on other sites

Dodałem serial monitor do odbiornika i coś tu ewidentnie nie gra. Pokazuje coś takiego:

19:48:51.078 -> upupdownupupdowndowndowndownupupdownupupdowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndownupupdownupupupupupupupupupupdownupupdowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndowndown

Oczywiście nie naciskam żadnego przycisku lecz kiedy nacisne to serwo się obróci w tą strone co trzeba. Po tej sekwencji co jest u góry wszystko się zatrzymuje.

Link do komentarza
Share on other sites

32 minuty temu, Lolheadshootpl napisał:

coś tu ewidentnie nie gra

Wszystko gra - program robi dokładnie to co mu kazałeś, a że chciałeś co innego to inna sprawa.

Masz przyciski zwierające do Vcc i podciągnięte do GND, prawda? Czyli na pinie wejściowym masz normalnie zero (przez podciągnięcie), a po naciśnięciu jeden. Popatrz sobie teraz na swój kod okiem mikrokontrolera...
 

jeśli przycisk 1 nie jest naciśnięty, wyślij "up"

jeśli przycisk 2 nie jest naciśnięty, wyślij "down"

Dwie porady:

Jeśli robisz coś w stylu nadajnik/odbiornik, przetestuj najpierw nadajnik (czy na pewno wysyła to co chcesz), a dopiero później dołóż do tego odbiornik.

Jeśli nie jesteś w stanie zrozumieć co w tym kodzie jest źle - wróć do kursu Arduino, bo nikt nie będzie Ci tłumaczyć drugi raz tego, co tam zostało już dokładnie wytłumaczone.

 

Link do komentarza
Share on other sites

Nie tak prędko 🙂

Masz jeszcze jeden błąd w programie - tym razem w założeniach a nie w kodzie.

Weź sobie zwykłego pilota od telewizora, popatrz na diodę nadawczą przez coś co pozwoli ci widzieć podczerwień (np. smartofon z kamerką) , wciśnij i przytrzymaj jakiś klawisz (najlepiej od głośności, bo ten na 100% jest powtarzalny) i pomyśl jaka jest różnica między tym co emituje pilot, a Twoim nadajnikiem.

Owszem, ten prosty kod zadziała. Ale jeśli spróbujesz zrobić coś bardziej skomplikowanego - zaczną się jakieś dziwne problemy które ciężko będzie zdiagnozować.

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.