Skocz do zawartości

Sterowanie bezprzewodowe serwomechanizmem za pomocą tact switchy i nrf24l01.


Pomocna odpowiedź

2 minuty temu, Lolheadshootpl napisał:

Okej a wiesz może czy da się spowolnić ten proces ustawiania serwa. Bo dzisiaj podłączyłem i wystrzeliło jak z armaty 😄

wroc...moj blad! Musisz zmienne "pos" ustawic na 0 !...jezeli bedzie to wartosc wieksza od 0 np. te 90 jak masz teraz to przy pierwszym spelnionym if'ie  serwo zasuwa ile moze zeby ustawic sie na ta wartosc...poprostu do "pos" zapisz 0...dodatkowo do setup() mozesz dopisac warunki ktore na starcie ustawia Ci zawsze ramie w pozycji "home"...

7 minut temu, Lolheadshootpl napisał:

Okej a wiesz może czy da się spowolnić ten proces ustawiania serwa. Bo dzisiaj podłączyłem i wystrzeliło jak z armaty 😄

Chodzi Ci o ogolna predkosc serw??

Link to post
Share on other sites
2 minuty temu, Lolheadshootpl napisał:

Nie o ogólną prędkość bo tą mam git tylko prędkośC tego ustawiania po włączeniu zasilania, bo ustawia się z pełną prędkością.

no to tak samo musisz to rozwiazac...jak z tym millis() w reszcie kodu...i tak jak mowie, musisz ustawiac ramie zawsze w pozycji wyjsciowej..np. jezeli bys wylaczym zasilanie kiedy twoje serwa sa w "polowie" to po wlaczeniu zmienna "pos" ma znow zera i jesli zaczniesz ruszac to wystapi dokladnie ten sam problem ktory teraz miales na poczatku...

Link to post
Share on other sites

Nie da się, bo nie znasz aktualnej pozycji. Musiałbyś albo tak jak pisze @ethanak mieć serwo, które potrafi ci powiedzieć w jakiej jest pozycji (albo dodatkowym przewodem, albo "chytre" serwo z którym można rozmawiać po serialu). To, co możesz zrobić, to przy wyłączaniu urządzenia zawsze ustawić je w pozycji początkowej. No i możesz ustawiać po jednym serwie na raz, z odstępem, zamiast wszystkie jednocześnie.

Link to post
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

(edytowany)

Ok czyli robie coś takiego i ma być git? : ( serwo myservo5 obraca się w drugą stronę dlatego jest 130 a nie 50, działa on równo z myservo4  ( podnoszą w jednym punkcie ramię bo jedno serwo nie dało rady )).

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Servo.h> 
int pos = 90;
int pos1 = 90;
int delayPeriod = 50;
int dirPin = 12;
int stepPin = 13;
uint32_t last = 0;
RF24 radio(7, 8); // CE, CSN
const byte address[6] = "00001";
 byte odbior;
Servo myservo;
Servo myservo1;
Servo myservo2;
Servo myservo3;
Servo myservo4;
Servo myservo5;


void setup() {
 myservo.write(50);
 myservo1.write(50);  
 myservo2.write(50); 
 myservo3.write(50); 
 myservo4.write(50);
 myservo5.write(130);
 last = millis; 
  
  
  
  pinMode(stepPin, OUTPUT);
  pinMode(dirPin, OUTPUT);
  
  
  Serial.begin(9600);
  radio.begin();
  radio.openReadingPipe(0, address);
  radio.setPALevel(RF24_PA_HIGH);
  radio.startListening();
  radio.setPayloadSize(1);
  radio.setAutoAck(true) ;
  radio.setDataRate(RF24_2MBPS);

 myservo.attach(2);   
 myservo1.attach(3);   
 myservo2.attach(4);   
 myservo3.attach(5);   
 myservo4.attach(6);   
 myservo5.attach(9);
}

void loop()
{
  if (radio.available()) {
   
    radio.read(&odbior, 1);
   Serial.println((int)odbior);  
{    


  

if (odbior == 1){
if( pos > 0 && (millis() - last) > 50UL) {
     --pos;
   myservo.write(pos);  
 last = millis;                 
}
}
if (odbior == 2){
if( pos < 180 && (millis() - last) > 50UL) {
     ++pos;
   myservo.write(pos);  
 last = millis;   
  } 
}
  if (odbior == 3){
if( pos > 0 && (millis() - last) > 50UL) {
     --pos;
   myservo1.write(pos);  
 last = millis;       
}
  }
 if (odbior == 4){
if( pos < 180 && (millis() - last) > 50UL) {
     ++pos;
   myservo1.write(pos);  
 last = millis;   }    
             
  }

if (odbior == 5) {
  digitalWrite(dirPin , HIGH);
  digitalWrite(stepPin,HIGH); 
  delayMicroseconds(500); 
  digitalWrite(stepPin,LOW); 
  delayMicroseconds(500);
}

if (odbior == 13) {
  digitalWrite(dirPin , LOW);
  digitalWrite(stepPin,HIGH); 
  delayMicroseconds(500); 
  digitalWrite(stepPin,LOW); 
  delayMicroseconds(500);
}


   if (odbior == 7){
if( pos > 0 && (millis() - last) > 50UL) {
     --pos;
   myservo2.write(pos);  
 last = millis; 
                
}    
}
 if (odbior == 8){
if( pos < 180 && (millis() - last) > 50UL) {
     ++pos;
   myservo2.write(pos);  
 last = millis;   }               
  } 
  if (odbior == 9){
if( pos > 0 && (millis() - last) > 50UL) {
     --pos;
   myservo3.write(pos);  
 last = millis; }
}
 if (odbior == 10){
if( pos < 180 && (millis() - last) > 50UL) {
     ++pos;
   myservo3.write(pos);  
 last = millis;   }              
  } 
  if (odbior == 11){
if( pos > 0 && (millis() - last) > 50UL) {
     --pos;
   myservo4.write(pos);  
 last = millis; }
}
 if (odbior == 12){
  if( pos < 180 && (millis() - last) > 50UL) {
     ++pos;
   myservo4.write(pos);  
 last = millis;   }              
  } 

  if (odbior == 12){
if( pos > 0 && (millis() - last) > 50UL) {
     --pos;
   myservo5.write(pos);  
 last = millis;   }          
    
}
 if (odbior == 11){
if( pos1 < 180 && (millis() - last) > 50UL) {
     ++pos1;
   myservo5.write(pos);  
 last = millis;   }               
  } 

  }
  }
}
   
 
  
  
  
  
  
  


  

 

Chociaż jak teraz na to patrzę to trochę nie ma sensu 😕

Edytowano przez Lolheadshootpl
Link to post
Share on other sites

Zle...nie czytasz..zmienna "pos" ma miec zero! I masz ustawic na starcie serwa w pozycji zero...jezeli ustawisz serwo na pozycji 50 a zmienna ma 0 to efekt bedzie taki sam jak miales...

Link to post
Share on other sites
2 minuty temu, Lolheadshootpl napisał:

 A ten "delay" jak zrobić ?

Tak samo jak te millis() masz...a powiedz mi..dzialaja Ci te serwa niezaleznie? Bo masz tylko jedna zmienba a kilka serw...nie jest tak ze jesli jedno ustawisz na pozycji 90 np., to jesli zaczynasz ruszac innym to ono zasuwa na ta sama pozycje 90 ?

Link to post
Share on other sites

To znaczy kiedy zaczynam ruszać innym to na samym początku ustawia się na 90 a potem działa i tak z każdym następnym serwem. Pierwsze "dotknięcie" przycisku powoduje ruch serwa na 90 i po tym ruchu już się normalnie steruje. Czy co dodać więcej zmiennych pos?

Link to post
Share on other sites
1 minutę temu, Lolheadshootpl napisał:

To znaczy kiedy zaczynam ruszać innym to na samym początku ustawia się na 90 a potem działa i tak z każdym następnym serwem. Pierwsze "dotknięcie" przycisku powoduje ruch serwa na 90 i po tym ruchu już się normalnie steruje. Czy co dodać więcej zmiennych pos?

Raczej nie dziala poprawnie...bo masz tylko jedna zmienna...latwo mozesz to sprawdzic...ustaw wszystkie serwa na zero...potem jedno przesun na 180...i teraz sprobuj przesunac inne...wtedy to drugie serwo w pierwszej kolejnosci poleci na pozycje 179 odrazu i dopiero wtedy bedzie dzialac poprawnie i tak w kolko...kazde serwo musi miec swoja zmienna do pozycji...wtedy zawsze pietasz gdzie to serwo sie znajduje

Link to post
Share on other sites

Zapytam juz tutaj...zeby sie przelaczac z trybu TX na RX uzywam tylko funkcji "startListening()" i "stopListening()" czy jeszcze czyms musze sie pobawic? 

Link to post
Share on other sites
6 minut temu, farmaceuta napisał:

zeby sie przelaczac z trybu TX na RX uzywam tylko funkcji "startListening()" i "stopListening()"

Powinno wystarczyć (nie próbowałem). A z ciekawości: po co się przełączasz? Nie wystarczy ackPayload?

Link to post
Share on other sites
9 minut temu, ethanak napisał:

A z ciekawości: po co się przełączasz? Nie wystarczy ackPayload?

Wiesz...jeszcze wogole tych rf nie podpialem...czekam na cyne i kwas bo mi braklo a chce to zlutowac odrazu i miec spokoj...pytam na "zapas" zeby sprawniej mi to poszlo...szczerze nie mam pojecia co robi "ackPayload" a czytanie bibliotek to "tak se" mi idzie...no z tego co sie zorientowalem ogolnie z rf to zazwyczaj bylo wymagane przelaczanie trybu pracy...mowie tutaj glownie o modulach si4432...ale w przypadku tych tutaj rf24 tez mi sie o oczy obilo zeby przelaczac...bo jest tutaj jeszcze taka opcja "cos tam pipe (write/reading)" i nie bylem pewny czy tego tez nie trzeba przypadkiem zmieniac...no u mnie to ma dzialac tak ze oba rf sa w stanie RX...jesli nacisne ktorys guzik to ma wyslac...a drugi "RX" co 5s ma mi wysylac bajta z info...

Link to post
Share on other sites
2 minuty temu, farmaceuta napisał:

no u mnie to ma dzialac tak ze oba rf sa w stanie RX...

A, no to trzeba zmieniać tryb.

ackPayload to po prostu informacja, którą zwraca rf w odpowiedzi na odebraną paczkę. Przykładowo (w uproszczeniu) w mojej laleczce:

  • Nadajnik co jakiś czas przesyła do odbiornika w jakim położeniu jest joystick (co sekundę jeśli nie zmieniłem położenia, co 100 msec jeśli zmieniłem).
  • Lalka mierzy sobie co jakiś czas napięcie akumulatora i wrzuca to do rf-a jako payload dla pakietów ack
  • Odbiornik zwracając potwierdzenie wysyła przy okazji stan akumulatora
  • Nadajnik po potwierdzeniu odbioru odczytuje sobie stan akumulatora z odebranego pakietu potwierdzenia.

Wszystko automatycznie, bezobsługowo.

 

  • Lubię! 1
Link to post
Share on other sites

A takie polaczenie bedzie dzialac jak na schemacie tak??nrf24l01_arduino_bb_j5H63VjHSf.thumb.png.389942b003b0c53f465a8a8cb367f350.pngmoje moduly to wersja z zewnetrznymi antenami i PA+LNA...wybacz ze o takie pierdoly pytam, ale bede lutowal odrazu i nie chce bledu popelnic bo kwasu nie bylo i kalafonia musze sie meczy...😕

Link to post
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.