Skocz do zawartości

Sterowanie bezprzewodowe serwomechanizmem za pomocą tact switchy i nrf24l01.


Pomocna odpowiedź

A popatrzyłeś jak miga dioda? Bo na to miałeś zwrócić uwagę a nie na próby sterowania nrf-a przez podczerwień.

Link to post
Share on other sites

Korzystając że temat jeszcze żyje to chciałbym się dowiedzieć o sterowaniu silnikiem krokowym za pomocą dwóch przycisków ( stała prędkość , zmienny kierunek obrotu). Najlepiej jakiś projekt gdzie ktoś takiego czegoś użył.

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

Korzystając że temat jeszcze żyje to chciałbym się dowiedzieć o sterowaniu silnikiem krokowym za pomocą dwóch przycisków ( stała prędkość , zmienny kierunek obrotu). Najlepiej jakiś projekt gdzie ktoś takiego czegoś użył.

A4988

PWM na pin STEP (im większa częstotliwość tym większa prędkość), dla typowych silników 360 stopni = 400 kroków
MS0-MS2 ustawione wedle uznania (mogą wisieć z tego co kojarzę)
EN "wisi" bez podpięcia
RST+SLEEP złączone razem
VDD = 3.3-5V, kondensator 10uF do masy
VMOT = 12V, kondensator 47uF do masy
DGND i MGND złączone razem (masy połączone)

kierunkiem sterujesz za pomocą pinu DIR 😉 

W momencie wciśnięcia przycisku zmieniasz stan na pinie DIR na konkretny i gotowe 😉 

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

Może głupie pytanie ale nie umiem sobie poradzić chciałem sobie dodać kolejne serwa do kodu i takie coś napisałem ale nie działa ktoś wytłumaczy?

#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_HIGH);
  radio.stopListening();
  radio.setPayloadSize(5);
  radio.setAutoAck(true) ;
  radio.setDataRate(RF24_2MBPS);


}

 void loop(){
  char text1[] = "upup0";
  char text2[] = "down0";    //1 serwo
 
  char text3[] = "upup1";
  char text4[] = "down1";    //2 servo
  
  char text5[] = "upup2";
  char text6[] = "down2";    //3 servo

  char text7[] = "upup3";
  char text8[] = "down3";    //4 servo

  char text9[] = "upup4";
  char text10[] = "down4";   //5 servo

  char text11[] = "step1";
  char text12[] = "step2";   // Step motor 
  
  
  
  int button_1 = digitalRead(1);
  int button_2 = digitalRead(2);
  
  int button_3 = digitalRead(3);
  int button_4 = digitalRead(4);
  
  //int button_5 = digitalRead(5);
  //int button_6 = digitalRead(6);
  
  int button_7 = digitalRead(A0);
  int button_8 = digitalRead(A1);

  int button_9 = digitalRead(A2);
  int button_10 = digitalRead(A3);

  int button_11 = digitalRead(A4);
  int button_12 = digitalRead(A5);
  

  
  if (button_1 == 1){
    radio.write(&text1, sizeof(text1));
    
  }
  if (button_2 == 1){
    radio.write(&text2, sizeof(text2));
    
  }
 
  
  if (button_3 == 1){
    radio.write(&text3, sizeof(text3));
    
  }
  if (button_4 == 1){
    radio.write(&text4, sizeof(text4));
    
  }
  
  
//  if (button_5 == 1){
  //  radio.write(&text5, sizeof(text5));
    
 // }
  //if (button_6 == 1){
    //radio.write(&text6, sizeof(text6));
    
 // }
  
  
  if (button_7 == 1){
    radio.write(&text7, sizeof(text7));
    
  }
  if (button_8 == 1){
    radio.write(&text8, sizeof(text8));
    
  }
  
  if (button_9 == 1){
    radio.write(&text9, sizeof(text9));
    
  }
  if (button_10 == 1){
    radio.write(&text10, sizeof(text10));
    
  }
  
  if (button_11 == 1){
    radio.write(&text11, sizeof(text11));
    
  }
  if (button_12 == 1){
    radio.write(&text12, sizeof(text12));
    
  }
  
  
  
  
  
  
  }
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Servo.h> 
int pos = 90;
int delayPeriod = 50;

Servo myservo;
Servo myservo1;
Servo myservo2;
Servo myservo3;
Servo myservo4;
Servo myservo5;

int dirPin = 7;
int stepPin = 8;

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_HIGH);
  radio.startListening();
  radio.setPayloadSize(4);
  radio.setAutoAck(true) ;
  radio.setDataRate(RF24_2MBPS);
 
 
 myservo.attach(2);   
 myservo1.attach(3);   
 myservo2.attach(4);   
 myservo3.attach(5);   
 myservo4.attach(6);   
 

}

void loop()
{  
  {
  digitalWrite(stepPin,HIGH); 
  delayMicroseconds(500); 
  digitalWrite(stepPin,LOW); 
  delayMicroseconds(500);
  }
  
  
  
  if (radio.available())
  {
    char text[32] = {0};
    radio.read(&text, sizeof(text));

   
   if (!strcmp(text,"upup0")) {
     if( pos > 0)
     --pos;
   myservo.write(pos);             
   delay(delayPeriod);     
   }
   if (!strcmp(text,"down0")) {
     if( pos < 180)
      ++pos;
   myservo.write(pos);              
   delay(delayPeriod); 
   }
 
    if (!strcmp(text,"upup1")) {
     if( pos > 0)
     --pos;
   myservo1.write(pos);             
   delay(delayPeriod);     
   }
   if (!strcmp(text,"down1")) {
     if( pos < 180)
      ++pos;
   myservo1.write(pos);              
   delay(delayPeriod); 
   Serial.print("123");
   }



   if (!strcmp(text,"upup2")) {
     if( pos > 0)
     --pos;
   myservo2.write(pos);             
   delay(delayPeriod);     
   }
   if (!strcmp(text,"down2")) {
     if( pos < 180)
      ++pos;
   myservo2.write(pos);              
   delay(delayPeriod); 
   Serial.print("121");
   }


 if (!strcmp(text,"upup3")) {
     if( pos > 0)
     --pos;
   myservo3.write(pos);             
   delay(delayPeriod);     
   }
   if (!strcmp(text,"down3")) {
     if( pos < 180)
      ++pos;
   myservo3.write(pos);              
   delay(delayPeriod); 
   }

 
 
  if (!strcmp(text,"upup4")) {
     if( pos > 0)
     --pos;
   myservo4.write(pos);             
   delay(delayPeriod);     
   }
   if (!strcmp(text,"down4")) {
     if( pos < 180)
      ++pos;
   myservo4.write(pos);              
   delay(delayPeriod); 
   }
 
  
  if (!strcmp(text,"down4")) {
     if( pos > 0)
     --pos;
   myservo5.write(pos);             
   delay(delayPeriod);     
   }
   if (!strcmp(text,"upup4")) {
     if( pos < 180)
      ++pos;
   myservo5.write(pos);              
   delay(delayPeriod); 
   }
 
 
  if (!strcmp(text,"step1")) {
    digitalWrite(dirPin , HIGH);
  
  }

 if (!strcmp(text,"step2")) {
    digitalWrite(dirPin , LOW);
   
 }
}


}

 

Link to post
Share on other sites

Dlaczego payloadsize jest różne dla nadajnika i odbiornika i dlaczego nie jest 6? Jeśli czytasz cztery znaki to wynikowy napis nigdy nie będzie np. "down1".

I przestań wreszcie przesyłać stringi, wystarczą liczby byte.

Link to post
Share on other sites

Zmiana nic nie dała. Zrobiłem to liczbami o ile dobrze, ale dalej nie działa.

#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_HIGH);
  radio.stopListening();
  radio.setPayloadSize(6);
  radio.setAutoAck(true) ;
  radio.setDataRate(RF24_2MBPS);


}

 void loop(){
  int text1 = 1;
  int text2 = 2;
 
  int text3 = 3;
  int text4 = 4;
  
  //int text5 = 5;
  //int text6 = 6;

  int text7 = 7;
  int text8 = 8;

  int text9 = 9;
  int text10 = 10;

  int text11 = 11;
  int text12 = 12;
  
  
  
  int button_1 = digitalRead(1);
  int button_2 = digitalRead(2);
  
  int button_3 = digitalRead(3);
  int button_4 = digitalRead(4);
  
  //int button_5 = digitalRead(5);
  //int button_6 = digitalRead(6);
  
  int button_7 = digitalRead(A0);
  int button_8 = digitalRead(A1);

  int button_9 = digitalRead(A2);
  int button_10 = digitalRead(A3);

  int button_11 = digitalRead(A4);
  int button_12 = digitalRead(A5);
  

  
  if (button_1 == 1){
    radio.write(&text1, sizeof(text1));
    
  }
  if (button_2 == 1){
    radio.write(&text2, sizeof(text2));
    
  }
 
  
  if (button_3 == 1){
    radio.write(&text3, sizeof(text3));
    
  }
  if (button_4 == 1){
    radio.write(&text4, sizeof(text4));
    
  }
  
  
//  if (button_5 == 1){
  //  radio.write(&text5, sizeof(text5));
    
 // }
  //if (button_6 == 1){
    //radio.write(&text6, sizeof(text6));
    
 // }
  
  
  if (button_7 == 1){
    radio.write(&text7, sizeof(text7));
    
  }
  if (button_8 == 1){
    radio.write(&text8, sizeof(text8));
    
  }
  
  if (button_9 == 1){
    radio.write(&text9, sizeof(text9));
    
  }
  if (button_10 == 1){
    radio.write(&text10, sizeof(text10));
    
  }
  
  if (button_11 == 1){
    radio.write(&text11, sizeof(text11));
    
  }
  if (button_12 == 1){
    radio.write(&text12, sizeof(text12));
    
  }
  
  
  
  
  
  
  }
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Servo.h> 
int pos = 90;
int delayPeriod = 50;

Servo myservo;
Servo myservo1;
Servo myservo2;
Servo myservo3;
Servo myservo4;
Servo myservo5;

int dirPin = 7;
int stepPin = 8;

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_HIGH);
  radio.startListening();
  radio.setPayloadSize(6);
  radio.setAutoAck(true) ;
  radio.setDataRate(RF24_2MBPS);
 
 
 myservo.attach(2);   
 myservo1.attach(3);   
 myservo2.attach(4);   
 myservo3.attach(5);   
 myservo4.attach(6);   
 

}

void loop()
{  
  {
  digitalWrite(stepPin,HIGH); 
  delayMicroseconds(500); 
  digitalWrite(stepPin,LOW); 
  delayMicroseconds(500);
  }
  
  
  
  if (radio.available())
  {
    char text[32] = {0};
    radio.read(&text, sizeof(text));

   
   if (!strcmp(text,"1")) {
     if( pos > 0)
     --pos;
   myservo.write(pos);             
   delay(delayPeriod);     
   }
   if (!strcmp(text,"2")) {
     if( pos < 180)
      ++pos;
   myservo.write(pos);              
   delay(delayPeriod); 
   }
 
    if (!strcmp(text,"3")) {
     if( pos > 0)
     --pos;
   myservo1.write(pos);             
   delay(delayPeriod);     
   }
   if (!strcmp(text,"4")) {
     if( pos < 180)
      ++pos;
   myservo1.write(pos);              
   delay(delayPeriod); 
   Serial.print("123");
   }



 //  if (!strcmp(text,"5")) {
  //   if( pos > 0)
 //    --pos;
 //  myservo2.write(pos);             
  // delay(delayPeriod);     
 //  }
  // if (!strcmp(text,"6")) {
  //   if( pos < 180)
   //   ++pos;
  // myservo2.write(pos);              
  // delay(delayPeriod); 
  // Serial.print("121");
  // }


 if (!strcmp(text,"7")) {
     if( pos > 0)
     --pos;
   myservo3.write(pos);             
   delay(delayPeriod);     
   }
   if (!strcmp(text,"8")) {
     if( pos < 180)
      ++pos;
   myservo3.write(pos);              
   delay(delayPeriod); 
   }

 
 
  if (!strcmp(text,"9")) {
     if( pos > 0)
     --pos;
   myservo4.write(pos);             
   delay(delayPeriod);     
   }
   if (!strcmp(text,"10")) {
     if( pos < 180)
      ++pos;
   myservo4.write(pos);              
   delay(delayPeriod); 
   }
 
  
  if (!strcmp(text,"11")) {
     if( pos > 0)
     --pos;
   myservo5.write(pos);             
   delay(delayPeriod);     
   }
   if (!strcmp(text,"12")) {
     if( pos < 180)
      ++pos;
   myservo5.write(pos);              
   delay(delayPeriod); 
   }
 
 

   
 }
}

 

Link to post
Share on other sites

strcmp nie działa z liczbami tak jak myślisz, że powinno działać

 

zacznij może wypisywać co tam dostajesz na seriala, zamiast używać forum jako debugera

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

Czekaj moment.

Czy ty w ogóle rozumiesz co robisz czy po prostu próbujesz zastosować się do różnych sugestii nie zwracając uwagi na to, że dotyczą różnych sytuacji i czasami są ze sobą sprzeczne? Przykładowo: przesyłasz liczbę (w postaci binarnej, całkiem prawidłowo) ale w odbiorniku oczekujesz tekstu... niby skd on się ma tam pojawić? Przykładowo: zmieniłeś payLoadSize na 6, ale tym razem przesyłasz dwa bajty (poprzednio było sześć, a payLoadSize miałeś 5).

Zacznijmy może od ustaleń:

Ustawiasz payLoadSize na 1 (jeden) i przesyłasz pojedynczy bajt. (żeby było łatwiej i się nie myliło)

Nie tworzysz fafnastu zmiennych "textileśtam", tylko jedną typu byte, a do niej podstawiasz odpowiednie wartości

Tę jedną zmienną przesyłasz do odbiornika, np. w ten sposób:
 

void loop()
{
  byte wysylka = 0;
  if (nacisniety_klawisz_1) {
    wysylka = 1;
  }
  if (nacisniety_klawisz_2) {
    wysylka = 2;
  }
  /* i tak dalej */
  /* a teraz najważniejsze */
  if (wysylka) { // czyli mamy co wysłać
    radio.write(&wysylka, 1);
    delay(100); // tu a nie w odbiorniku!!!!!
  }
}
  

oczywiście zamiast nacisniety_klawisz_X podstawiając jakiś sposób rzeczywistego odczytu.

Analogicznie po stronie odbiornika:

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

Na razie  żadnych serw, silniczków i innych firdymałków, dopóki odbiornik nie pokaże tego co trzeba nie będziemy o tym dyskutować.

A, żadnych, powtarzam, żadnych delajów w odbiorniku!

 

 

Edytowano przez ethanak
Link to post
Share on other sites

Napierdziela mi 2 w serial monitorze .

#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_HIGH);
  radio.stopListening();
  radio.setPayloadSize(1);
  radio.setAutoAck(true) ;
  radio.setDataRate(RF24_2MBPS);
}
void loop() 
{
   
  int button_1 = digitalRead(3);
  int button_2 = digitalRead(4);

  
  byte wysylka = 0;
 
 if (button_1 = 1) {
    wysylka = 1;
  }
 if (button_2 = 1) {
    wysylka = 2;
  }



  
   if (wysylka) { // czyli mamy co wysłać
    radio.write(&wysylka, 1);
    
    
    
    delay(100); // tu a nie w odbiorniku!!!!!
  }
}
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

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_HIGH);
  radio.startListening();
  radio.setPayloadSize(1);
  radio.setAutoAck(true) ;
  radio.setDataRate(RF24_2MBPS);

}

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

 

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.