Skocz do zawartości

Sterowanie bezprzewodowe serwomechanizmem za pomocą tact switchy i nrf24l01.


Lolheadshootpl

Pomocna odpowiedź

Witam. Potrzebuję jakiejś inspiracji lub czyjegoś projektu do sterowania serwomechanizmem przy pomocy tact switchy. Jestem w trakcie projektu ramienia robota i szukam kodu do pilota i odbiornika. Do kontrolowania jednego serwomechanizmu chcę użyć dwóch przycisków ( jeden obraca w jedną a drugi w drugą stronę). Pozdrawiam.

Serwo : MG996R

Kontroler : Arduino nano ( nadajnik) Arduino MEGA ( odbiornik)

ps. jedną osią w robocie obracam za pomocą silnika krokowego i do tego też bym potrzebował jakieś porady.

Link do komentarza
Share on other sites

Ja bym zaczął od zapoznania się z biblioteką do nrf24l01 — szczególnie przykładami. Dalej, badasz bibliotekę Servo i przykłady do niej, oraz szukasz biblioteki do sterownika silników jakiego planujesz użyć. Wszystkie one powinny mieć przykłady, co chyba powinno wystarczyć, jeśli dobrze zrozumiałem co masz na myśli przez "inspirację".

Link do komentarza
Share on other sites

Okej coś tam ogarnąłem lecz nie za bardzo działa. Co mam źle w tym programie? ( uprzedzając pytanie komunikacja pomiędzy nrf24l01 działa poprawnie)

//Nadajnik
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(7, 8); // CE, CSN         
const uint64_t pipe = 0xF0F0F0F0D2L;     //Byte of array representing the address. This is the address where we will send the data. This should be same on the receiving side.
int button_pin = 11;

boolean button_state = 0;

void setup() {
pinMode(button_pin, INPUT);

  Serial.begin(9600);
  radio.begin();
  radio.openWritingPipe(pipe);
        
}
void loop()
{
button_state = digitalRead(button_pin);

if(button_state == HIGH)
    radio.write(&button_state, sizeof(button_state));  //Sending the message to receiver 

   
}
//Odbiornik
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Servo.h>      // include the Servo library
Servo myServo1;


boolean button_state = 0;

int pos = 0;

RF24 radio(7,8);
//pin number for the arduino you're using. this pin is diffrent for diffrent arduino models.
const uint64_t pipe = 0xF0F0F0F0D2L;



void setup()
{
 myServo1.attach(11);

  Serial.begin(9600);
  radio.begin();
  radio.openReadingPipe(1, pipe);
  radio.startListening();
}

void loop(){
  if(radio.available())
   
    radio.read(&button_state1, sizeof(button_state1));
    if (button_state1 == HIGH && pos < 180) {
    pos++;
   myServo1.write(pos);
    }

    radio.read(&button_state, sizeof(button_state));
    if (button_state == HIGH && pos > 0) {
    pos--;
   myServo1.write(pos);
  delay(15);
  }

}
    
    
  

 

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

A jakiej reakcji oczekujesz?

Wiesz, ciężko jest czytać w myślach i zgadywać jak twój program powinien twoim zdaniem działać. Ciężko też zgadnąć jak masz wszystko podłączone. Jak nam nie napiszesz, to jak mamy pomóc?

Link do komentarza
Share on other sites

Dobrze napisze jeszcze raz. Chce za pomocą dwóch przycisków kontrolować jedno serwo w taki sposób że jednym steruje obrotem w lewo a drugim w prawo. Chodzi o sterowanie ramienia robota więc wszystko powinno odbywać się powoli. W załączniki jest zdjęcie na którym jest poglądowy schemat połącznia ( sorki za jakość) Przyciski podłączone są również do rezystorów podciągających. Przy arduino nano podłączyłem piny MISO,MOSI,SCK do pinów ICSP (tych sześciu z tyłu płytki). Serwomechanizm podłączony do pinu 11. Kod powyżej.

123.png

Link do komentarza
Share on other sites

A testowałeś najpierw samo serwo, same przyciski i samo radio?

Jak na przyciskach masz rezystory podciągające, to domyślnie sygnał jest HIGH, a przy wciśniętym przycisku LOW — twój kod zakłada odwrotnie.

W nadajniku masz tylko jeden przycisk i wysyłasz jeden bajt, a w odbiorniku czytasz dwa bajty. Skąd się bierze drugi?

Jeden stopień to bardzo mała zmiana, jesteś pewien, że zauważysz?

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

Radio , serwo , przyciski sprawne bo testowałem. Co do kodu to wiem że nie dodałem drugiego przycisku bo chciałem przetestować na jednym. A co do jednego stopnia do jak przytrzymam przycisk to zrobi parę stopni więc to zauważe. Zmienie jeszcze to HIGH na LOW i spróbuje.

Link do komentarza
Share on other sites

(edytowany)
1 godzinę temu, Lolheadshootpl napisał:

Co do kodu to wiem że nie dodałem drugiego przycisku bo chciałem przetestować na jednym.

Ale odbiornik oczekuje dwóch, zresztą w bardzo dziwny sposób, bo sprawdzasz czy jest jeden bajt do odebrania, odbierasz go, a potem próbujesz odebrać drugi bez żadnego sprawdzania — jak to ma działać?

Poza tym po co wysyłasz osobny bajt dla każdego przycisku, skoro mógłbyś wysyłać tylko jeden dla 8 przycisków, i tylko ustawiać w nim bity?

Edytowano przez deshipu
Link do komentarza
Share on other sites

1 godzinę temu, Lolheadshootpl napisał:

Radio , serwo , przyciski sprawne bo testowałem.

Jak byś testował, to chyba byś zauważył, że masz HIGH zamiast LOW? Słabo to testowałeś.

Link do komentarza
Share on other sites

No to przetestuj te kawałki swojego kodu, które się zajmują serwem, przyciskami i radiem — niezależnie od siebie. Będzie ci łatwiej potwierdzić, że kod jest dobry i/lub znaleźć co jest źle. Możesz na przykład, zamiast wysyłać radiem, wypisać coś na konsoli — żeby widzieć, że przycisk działa.

Link do komentarza
Share on other sites

Takie cos chyba nie bedzie robilo tego co chcesz...

if (button_state1 == HIGH && pos < 180) {
    pos++;
   myServo1.write(pos);
    }

    radio.read(&button_state, sizeof(button_state));
    if (button_state == HIGH && pos > 0) {
    pos--;
   myServo1.write(pos);
  delay(15);
  }

zwroc uwage ze jak juz otrzymasz informacje o wcisnietym guziku to w loop() nigdzie juz nie modyfikujesz tej zmiennej i warunek w if'ach (polowa) zawsze spelnione...poza tym zmienna "pos" na starcie ma "0" wiec pierwszy if sie wykona i doda "1"..w drugim if "pos" wieksze od zera i odejmie...i petla sie powtorzy, i tak caly czas dopoki nie zmienisz zmiennej od guzika..

Link do komentarza
Share on other sites

Okej znalazłem sobie nowy kod i sprawdziłem bez NRF'a w sensie normalnie podłączyłem do arduino 2 przyciski i wszystko elegancko działa i teraz moje pytanie jak dodać do tego kodu NRF'a.

#include <Servo.h> 

Servo myservo; 
#define leftPin 2
#define rightPin 3
int pos = 90;
int delayPeriod = 50;  // increasing this slows down the servo movement



void setup() 
{ 
 myservo.attach(9);  // attaches the servo on pin 9 to the servo object 
 myservo.write(pos); // center the servo
 pinMode(leftPin, HIGH);   // turn on pullup resistors
 pinMode(rightPin, HIGH);
} 


void loop() 
{ 
 if(digitalRead(leftPin) == LOW)  
 {                              
  // in steps of 1 degree 
  if( pos > 0)
     --pos;
   myservo.write(pos);              // tell servo to go to position in variable 'pos' 
   delay(delayPeriod);                      
 } 
 if(digitalRead(rightPin) == LOW)  
 {                              
  if( pos < 180)
      ++pos;
   myservo.write(pos);              // tell servo to go to position in variable 'pos' 
   delay(delayPeriod);        
 }
}

Chodzi mi dokładnie o ten moment.

void loop() 
{ 
 if(digitalRead(leftPin) == LOW)  
 {                              
  // in steps of 1 degree 
  if( pos > 0)
     --pos;
   myservo.write(pos);              // tell servo to go to position in variable 'pos' 
   delay(delayPeriod);                      
 } 
 if(digitalRead(rightPin) == LOW)  
 {                              
  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

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • 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.