Skocz do zawartości

Sterowanie serw potencjometrami bezprzewodowo przy nrf24l01


TurBan

Pomocna odpowiedź

Witam
Korzystam z arduino Mega 2560, a do serw mam podpięte osobne wystarczające zasilanie.
Otóż mój problem polega na tym, że przy sterowaniu jednym serwem inne zaczynają drgać. Najlepiej da się to zauważyć przy sterowaniu serwa powiązanego z potencjometrem podpiętym do A8, wtedy zaczyna drgać serwo powiązane z A6 ( piszę tu skrótowo, wszystko widać na kodzie).
Wie ktoś jak można temu zaradzić? problem w tym, że sygnał jest niewyraźny, czy jakieś wartości/sygnały się mieszają?

Tam znajdują się jeszcze silniki dc, do których są te wiersze ze skrętami itp.

Nadajnik

#include <SPI.h>  
#include "RF24.h"  
RF24 radio(9,10); 
const uint64_t pipe = 0xE8E8F0F0E1LL;  
int msg[1];  
int potpin_1 = A0;  // VRy z modułu joysticka
int val_1;  
int potpin_2 = A1;  // VRx z modułu joysticka
int val_2; 
 
int potpin_3 = A3; // potencjometr do sterowania serwomechanizmem
int val_3; 
int potpin_4 = A4; // potencjometr do sterowania serwomechanizmem
int val_4; 
int potpin_5 = A5; // potencjometr do sterowania serwomechanizmem
int val_5; 
int potpin_6 = A6; // potencjometr do sterowania serwomechanizmem
int val_6; 
int potpin_7 = A7; // potencjometr do sterowania serwomechanizmem
int val_7; 
int potpin_8 = A8; // potencjometr do sterowania serwomechanizmem
int val_8; 
 
 
void setup(void){ 
 
radio.begin(); 
radio.openWritingPipe(pipe);  
} 
 
void loop() { 
//przypisanie wysyłanej informacji odpowiednim wychyleniom potencjometrów 
 
val_1 = analogRead(potpin_1); val_1 = map(val_1, 0, 1023, 71, 170); msg[0] = val_1; radio.write(msg, 1);  
val_2 = analogRead(potpin_2); val_2 = map(val_2, 0, 1023, 0, 70); msg[0] = val_2; radio.write(msg, 1); 
val_3 = analogRead(potpin_3); val_3 = map(val_3, 0, 1023, 171, 184); msg[0] = val_3; radio.write(msg, 1);
val_4 = analogRead(potpin_4); val_4 = map(val_4, 0, 1023, 186, 198); msg[0] = val_4; radio.write(msg, 1);
val_5 = analogRead(potpin_5); val_5 = map(val_5, 0, 1023, 200, 212); msg[0] = val_5; radio.write(msg, 1);
val_6 = analogRead(potpin_6); val_6 = map(val_6, 0, 1023, 214, 226); msg[0] = val_6; radio.write(msg, 1);
val_7 = analogRead(potpin_7); val_7 = map(val_7, 0, 1023, 228, 240); msg[0] = val_7; radio.write(msg, 1);
val_8 = analogRead(potpin_8); val_8 = map(val_8, 0, 1023, 242, 254); msg[0] = val_8; radio.write(msg, 1);
}

 

Odbiornik
 

#include <Servo.h> 
#include <SPI.h> 
#include "RF24.h"   
RF24 radio(9,10); 
const uint64_t pipe = 0xE8E8F0F0E1LL;  
int msg[1];  
int data;   
int pos;
 
Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;
Servo servo5;
Servo servo6;
 
int sspeed;           // prędkość
 
//silnik-lewy przód
const int in1 = 15;   
const int in2 = 14;    
const int ena = 5;    // PWM pin do zmiany prędkości
 
//silnik-lewy tył
const int in1t = 4;     
const int in2t = 2;    
 
//silnik-pawy przód
const int in12 = 17;     
const int in22 = 16;    
 
//silnik-prawy tył
const int in12t = 8;     
const int in22t = 7;    
 
void setup()  
{ 
servo1.attach(6); 
servo2.attach(3);
servo3.attach(4);
servo4.attach(5);
servo5.attach(2);
servo6.attach(7);

  
  pinMode(in1, OUTPUT);        
  pinMode(in2, OUTPUT);       
  pinMode(ena, OUTPUT);      
 
  pinMode(in1t, OUTPUT);       
  pinMode(in2t, OUTPUT);     
 
  pinMode(in12, OUTPUT);     
  pinMode(in22, OUTPUT);     
 
  pinMode(in12t, OUTPUT);       
  pinMode(in22t, OUTPUT);      
  
delay(50); 
radio.begin(); 
radio.openReadingPipe(1,pipe);  
radio.startListening();  
} 
 
void loop()  //przypisanie odbieranym sygnałom odpowiednich czynności
{  
if (radio.available())radio.read(msg, 1); 
 
if (msg[0] >0 && msg[0] <30){data = msg[0]; sspeed = map(data, 0, 30, 255, 50); right(sspeed);} 
 
if (msg[0] >40 && msg[0] <70){data = msg[0]; sspeed = map(data, 700, 40, 255, 50); left(sspeed);} 
 
if (msg[0] >70 && msg[0] <115){data = msg[0]; sspeed = map(data, 71, 115, 255, 50); backward(sspeed);} 
 
if (msg[0] >125 && msg[0] <170){data = msg[0]; sspeed = map(data, 170, 124, 255, 50); forward(sspeed);} 
 
if ((msg[0] >=115 && msg[0] <=125)&&(msg[0] >=30 && msg[0] <=40)){data = msg[0]; stopp(); }
 
if (radio.available())radio.read(msg, 1);
if (msg[0] <184 && msg[0] >170){data = msg[0]; pos = map(data, 171, 183, 0, 180); servo1.write(pos);}
if (msg[0] <198 && msg[0] >185){data = msg[0]; pos = map(data, 186, 197, 0, 180); servo2.write(pos);}
if (msg[0] <212 && msg[0] >199){data = msg[0]; pos = map(data, 200, 211, 0, 180); servo3.write(pos);}
if (msg[0] <226 && msg[0] >213){data = msg[0]; pos = map(data, 214, 225, 0, 180); servo4.write(pos);}
if (msg[0] <240 && msg[0] >227){data = msg[0]; pos = map(data, 228, 239, 0, 180); servo5.write(pos);}
if (msg[0] <254 && msg[0] >241){data = msg[0]; pos = map(data, 242, 253, 0, 180); servo6.write(pos);}
delay(15);
  } 
 
  void stopp() 
 
{  
  analogWrite(ena, 0);  
  
  digitalWrite(in1, LOW); 
  digitalWrite(in2, LOW); 
  digitalWrite(in12, LOW); 
  digitalWrite(in22, LOW); 
  
  digitalWrite(in1t, LOW); 
  digitalWrite(in2t, LOW); 
  digitalWrite(in12t, LOW); 
  digitalWrite(in22t, LOW); 
} 
 
void forward(int sspeed) //jazda w przód
 
{  
  digitalWrite(in1, HIGH);
  digitalWrite(in12, HIGH);  
  digitalWrite(in2, LOW); 
  digitalWrite(in22, LOW); 
 
  digitalWrite(in1t, HIGH);
  digitalWrite(in12t, HIGH);  
  digitalWrite(in2t, LOW); 
  digitalWrite(in22t, LOW);
  analogWrite(ena, sspeed);
  
} 
 
void backward(int sspeed) //jazda w tył
 
{  
  digitalWrite(in1, LOW);  
  digitalWrite(in12, LOW); 
  digitalWrite(in2, HIGH); 
  digitalWrite(in22, HIGH);
 
  digitalWrite(in1t, LOW);  
  digitalWrite(in12t, LOW); 
  digitalWrite(in2t, HIGH); 
  digitalWrite(in22t, HIGH);
  analogWrite(ena, sspeed); 
 
} 
 
void left(int sspeed) // prawe silniki do przodu, a lewe do tyłu
 
{  
  digitalWrite(in1, LOW);  
  digitalWrite(in12, HIGH); 
  digitalWrite(in2, HIGH); 
  digitalWrite(in22, LOW);
 
  digitalWrite(in1t, LOW);  
  digitalWrite(in12t, HIGH); 
  digitalWrite(in2t, HIGH); 
  digitalWrite(in22t, LOW);
  analogWrite(ena, sspeed); 
 
} 
 
void right(int sspeed) // lewe silniki do przodu, a prawe do tyłu
 
{  
  digitalWrite(in1, HIGH);  
  digitalWrite(in12, LOW); 
  digitalWrite(in2, LOW); 
  digitalWrite(in22, HIGH);
 
  digitalWrite(in1t, HIGH);  
  digitalWrite(in12t, LOW); 
  digitalWrite(in2t, LOW); 
  digitalWrite(in22t, HIGH);
  analogWrite(ena, sspeed); 
 
}

 

Edytowano przez TurBan
Link do komentarza
Share on other sites

@TurBan z opisu Twojego problemu wynika, że jest to jednak raczej coś z zasilaniem. Nie napisałeś z czego dokładnie zasilasz te układy oraz jak masz je połączone, więc ciężko coś doradzić. Zakładam, że sprawdziłeś wcześniej czy to nie wina programu (czyli sprawdziłeś, że nie wysyłasz przypadkiem do serw losowych wartości). Podejrzałeś np. przez UART jakie sygnały są "wysłane" do serw przez Twój program?

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

3 minuty temu, Treker napisał:

@TurBan z opisu Twojego problemu wynika, że jest to jednak raczej coś z zasilaniem. Nie napisałeś z czego dokładnie zasilasz te układy oraz jak masz je połączone, więc ciężko coś doradzić. Zakładam, że sprawdziłeś wcześniej czy to nie wina programu (czyli sprawdziłeś, że nie wysyłasz przypadkiem do serw losowych wartości). Podejrzałeś np. przez UART jakie sygnały są "wysłane" do serw przez Twój program?

zasilam 6v/8,4Ah i właśnie zobaczyłem, że woltomierz zaczął wskazywać 5,2v, także zobaczę jak naładuje się akumulator czy wszystko wtedy chodzi, a co do UART to zapomniałem wsumie sprawdzić, dzięki !

Link do komentarza
Share on other sites

1 godzinę temu, TurBan napisał:

Chyba jednak tak, arduino ma swoje zasilanie, serwa swoja i maja wspólną masę.

A możesz tu nam napisać na podstawie jakich dokładnie obliczeń wnioskujesz, że zasilanie serw jest wystarczające?

Przy okazji, warto by było zrobić zdjęcie tego twojego wystarczającego zasilania, bo być może bateria jest rzeczywiście wystarczająca, ale podłączyłeś ją pojedynczą parą cienkich drucików, nie daj boże jeszcze przez płytkę stykową...

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

56 minut temu, deshipu napisał:

A możesz tu nam napisać na podstawie jakich dokładnie obliczeń wnioskujesz, że zasilanie serw jest wystarczające?

Przy okazji, warto by było zrobić zdjęcie tego twojego wystarczającego zasilania, bo być może bateria jest rzeczywiście wystarczająca, ale podłączyłeś ją pojedynczą parą cienkich drucików, nie daj boże jeszcze przez płytkę stykową...

No może i tak zrobiłem, i może tak działało jak robiłem cały przewodowo na jednym arduino.

 

Link do komentarza
Share on other sites

Dobra, naładowałem akumulator i sprawa wygląda tak: mogę sterować każdym serwem, ale jak steruje serwo przypisane do potencjometru A8 to wtedy zaczynają się wariacje z resztą. Myślałem, że coś z serwem jest nie tak i pozamieniałem serwa pinami na arduino i niestety dalej przy sterowaniu serwem przypisanym do A8 wszystko wariuje. Możecie proszę sprawdzić czy w kodzie wszystko się zgadza? (pin 8 dla val 8, dla servo6).

Link do komentarza
Share on other sites

A jak odłączysz fizycznie to serwo i próbujesz wysyłać sygnały sterujące to wtedy inne też wariują? Czy dzieje się tak tylko, gdy serwo jest faktycznie podłączone?

Link do komentarza
Share on other sites

Dobra, znalazłem przyczynę okazało się, że do silników jak i do serw przypisałem ten sam pin, prze to jak sterowałem to program się gubił w wartościach, teraz jak pozmieniałem piny w programie to wszystko działa!!! 

Dzięki za pomoc!
Temat można zamknąć

  • Lubię! 1
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.