Skocz do zawartości

Sterowanie bezprzewodowe serwomechanizmem za pomocą tact switchy i nrf24l01.


Pomocna odpowiedź

ethank...

Nie uważam Cię za "starego dziada" tylko naprawde mi pomogłeś i wiem że powinno być tak ale zrozum ja się uczę i eksperymentuje. Jestem tego zdania że jak coś jest głupie ale działa to nie jest głupie.

farmaceuta 

Co to tego pinu EN to nie wiem co na niego mam dać.

Link to post
Share on other sites

 

7 minut temu, Lolheadshootpl napisał:

Co to tego pinu EN to nie wiem co na niego mam dać.

W necie znajdziesz...jaki masz sterownik? A jak podlaczysz silnik i dasz zasilamie to os stawia opor? Czy bez roznicy?

@ethanak ma racje...delaje won! hehe...akurat u Ciebie to millis z jedna zmienna chyba wystarczy...bo rozumiem ze w danym momencie poruszasz tylko jednym serwem tak?

 

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)
uint32_t last = 0;



if( pos > 0 && (millis() - last) > 50UL) {
     --pos;
   myservo.write(pos);  
 last = millis;              
    
}

Masz cos takiego dopisac do tych wszystkich serw i juz nic nie blokujesz...

Te 50UL to twoja przerwa w milisekundach

wedlug tego co pisza to stan LOW na pinie enable wlacza sterownik...ale sie upewnij...podaj na ten pin stan niski..najlepiej wgraj tylko ten kawalek kodu ktory odpowiada za silnik...bez if itp...tylko zeby sprawdzic czy kreci

Edytowano przez farmaceuta
Link to post
Share on other sites
(edytowany)

Jeszcze jeden problem wyszedł podczas głównego testowania ramienia. A wygląda on tak...

Załóżmy że przycisk 1 i 2 są podłączone do serwa A a przycisk 3 i 4 do serwa B. Kiedy pierwszy raz po uruchomieniu nacisnę jakikolwiek przycisk to serwo do którego jest podłączony przycisk najpierw się centruje i dopiero potem reaguje. Sytuacja występuje także kiedy próbuje po tym jak nacisnąłem przycisk 1 czy 2 nacisnąć przycisk 3 lub 4 i serwo B najpierw się centruje a potem działa normalnie. Ktoś wie jak ominąć ten etap centrowania? Chodzi o to że nie dałem delaya w nadajniku czy to nie ma nic do tego?

Zapomniałem jeszcze kodu :

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

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() {
  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;   }               
  } 

  }
  }
}
   
 
  
  
  
  
  
  


  

 

Edytowano przez Lolheadshootpl
Link to post
Share on other sites
7 minut temu, Lolheadshootpl napisał:

Ktoś wie jak ominąć ten etap centrowania?

Musisz mieć serwo z wyjściem (czteroprzewodowe - np. takie), inaczej nie ma szans.

Link to post
Share on other sites

int pos = 90;

int pos1 = 90;

Myślę, że kazałeś serwom się ustawić w pozycji środkowej.

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

@matural A wiesz może co można wykombinować zamiast tego pos = 90?

mozesz ustawic domyslnie wartosci dla tych serw...tak ze ustawiasz to ramie na starcie i czekasz na ruchy/dane

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

Czyli dodani czegoś takiego może pomóc? :


myservo.write(50);

 

Dokladnie tak...w setup() to daj. I ustal pozycje jaka Cie interesuje

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.