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ć.

 

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?

 

(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
(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
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.

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

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

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...