Skocz do zawartości

Podłączenie dwóch 16-kanałowych i2c sterowników serw


espiridion

Pomocna odpowiedź

Cześć,

Nie jestem osobą wykształconą technicznie, jestem artystą, ale potrzebuję porady.

Mam dwa sterowniki 16-kanałowe do serw Adafruit PCA9685 oraz drugi PCA9685 innej firmy (tańszy).

Jako pwm0 mam podłączony ten tańszy i zasila on moje małe serwa i duże serwa (razem 16 sztuk) płynnie przy zasilaniu 5V i 2A

Jako pwm1 mam podłączony Adafruit (jako 0x41 - zaadresowałem cyną punkt A0) i wszystkie kabelki są podłączone zgodnie ze schematem, sprawdzałem nawet prąd wyjściowo jest 4.75V i do małych 4-5 serw, ale jednak nie działają, ale dioda się świeci, więc chyba z zasileniem nie ma problemu? Nie wiem ile A? Ale jeśli miałbym zasilacz 5V i 10A to by lepiej działało?

Chyba, że to kwestia kodu? Zastanawiam się nad funkcją "uint8_t" przy parametrach servo. 

#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

Adafruit_PWMServoDriver pwm0 = Adafruit_PWMServoDriver(0x40);
Adafruit_PWMServoDriver pwm1 = Adafruit_PWMServoDriver(0x41);

// Depending on your servo make, the pulse width min and max may vary, you 
// want these to be as small/large as possible without hitting the hard stop
// for max range. You'll have to tweak them as necessary to match the servos you
// have!
#define SERVOMIN  150 // this is the 'minimum' pulse length count (out of 4096)
#define SERVOMAX  600 // this is the 'maximum' pulse length count (out of 4096)

// our servo # counter
uint8_t servo1 = 0;
uint8_t servo2 = 1;
uint8_t servo3 = 2;
uint8_t servo4 = 3;
uint8_t servo5 = 4;
uint8_t servo6 = 5;
uint8_t servo7 = 6;
uint8_t servo8 = 7;
uint8_t servo9 = 8;
uint8_t servo10 = 9;
uint8_t servo11 = 10;
uint8_t servo12 = 11;
uint8_t servo13 = 12;
uint8_t servo14 = 13;
uint8_t servo15 = 14;





void setup() {
  Serial.begin(9600);
  Serial.println("32 channel Servo test!");

  pwm0.begin();
  pwm0.setPWMFreq(60);  // Analog servos run at ~60 Hz updates
  
  pwm1.begin();
  pwm1.setPWMFreq(1600);  // This is the maximum PWM frequency

  delay(10);
}

// you can use this function if you'd like to set the pulse length in seconds
// e.g. setServoPulse(0, 0.001) is a ~1 millisecond pulse width. its not precise!
void setServoPulse(uint8_t n, double pulse) {
  double pulselength;
  
  pulselength = 1000000;   // 1,000,000 us per second
  pulselength /= 60;   // 60 Hz
  Serial.print(pulselength); Serial.println(" us per period"); 
  pulselength /= 4096;  // 12 bits of resolution
  Serial.print(pulselength); Serial.println(" us per bit"); 
  pulse *= 1000000;  // convert to us
  pulse /= pulselength;
  Serial.println(pulse);
  pwm0.setPWM(n, 0, pulse);
  pwm1.setPWM(n, 0, pulse);
}

void loop() {
  for (uint16_t pulselen = SERVOMIN; pulselen < SERVOMAX; pulselen++) {
    pwm0.setPWM(servo1, 0, pulselen);
    pwm0.setPWM(servo2, 0, pulselen);
    pwm0.setPWM(servo3, 0, pulselen);
    pwm0.setPWM(servo4, 0, pulselen);
    pwm0.setPWM(servo5, 0, pulselen);
    pwm0.setPWM(servo6, 0, pulselen);
    pwm0.setPWM(servo7, 0, pulselen);
    pwm0.setPWM(servo8, 0, pulselen);
    pwm0.setPWM(servo9, 0, pulselen);
    pwm0.setPWM(servo10, 0, pulselen);
    pwm0.setPWM(servo11, 0, pulselen);
    pwm0.setPWM(servo12, 0, pulselen);
    pwm0.setPWM(servo13, 0, pulselen);
    pwm0.setPWM(servo14, 0, pulselen);
    pwm0.setPWM(servo15, 0, pulselen);
    pwm1.setPWM(servo1, 0, pulselen);
    pwm1.setPWM(servo2, 0, pulselen);
    pwm1.setPWM(servo3, 0, pulselen);
    pwm1.setPWM(servo4, 0, pulselen);
    pwm1.setPWM(servo5, 0, pulselen);
  }
  
  delay(500);
  for (uint16_t pulselen = SERVOMAX; pulselen > SERVOMIN; pulselen--) {
    pwm0.setPWM(servo1, 0, pulselen);
    pwm0.setPWM(servo2, 0, pulselen);
    pwm0.setPWM(servo3, 0, pulselen);
    pwm0.setPWM(servo4, 0, pulselen);
    pwm0.setPWM(servo5, 0, pulselen);
    pwm0.setPWM(servo6, 0, pulselen);
    pwm0.setPWM(servo7, 0, pulselen);
    pwm0.setPWM(servo8, 0, pulselen);
    pwm0.setPWM(servo9, 0, pulselen);
    pwm0.setPWM(servo10, 0, pulselen);
    pwm0.setPWM(servo11, 0, pulselen);
    pwm0.setPWM(servo12, 0, pulselen);
    pwm0.setPWM(servo13, 0, pulselen);
    pwm0.setPWM(servo14, 0, pulselen);
    pwm0.setPWM(servo15, 0, pulselen);
    pwm1.setPWM(servo1, 0, pulselen);
    pwm1.setPWM(servo2, 0, pulselen);
    pwm1.setPWM(servo3, 0, pulselen);
    pwm1.setPWM(servo4, 0, pulselen);
    pwm1.setPWM(servo5, 0, pulselen);
  }

  delay(500);
}

 

Link do komentarza
Share on other sites

4 minuty temu, espiridion napisał:

Jako pwm0 mam podłączony ten tańszy i zasila on moje małe serwa i duże serwa (razem 16 sztuk) płynnie przy zasilaniu 5V i 2A

2A przy 16 serwera to podejrzanie mało, co to za napędy?

5 minut temu, espiridion napisał:

Jako pwm1 mam podłączony Adafruit (jako 0x41 - zaadresowałem cyną punkt A0) i wszystkie kabelki są podłączone zgodnie ze schematem, sprawdzałem nawet prąd wyjściowo jest 4.75V i do małych 4-5 serw, ale jednak nie działają, ale dioda się świeci, więc chyba z zasileniem nie ma problemu? Nie wiem ile A? Ale jeśli miałbym zasilacz 5V i 10A to by lepiej działało?

Z czego zasilasz dokładnie ten układ w takim razie i jakimi serwami próbujesz sterować?

6 minut temu, espiridion napisał:

Zastanawiam się nad funkcją "uint8_t" przy parametrach servo. 

"uint8_t" to typ danych (8 bitów bez znaku), jest to praktycznie to samo co zmienna typu "byte" w Arduino.

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

(edytowany)

@Treker 

Dziękuje Ci za odpowiedź. Wiem, sam jestem zdziwiony, że jednak dają radę działać przy 2A, ale mam w planach kupić jakiś zasilacz 5V z 10A albo 20A ale dlaczego takiego nie ma na Botlandzie? Od czego to zależy?

Micro serwa to TowerPro SG-90 

Standard serwa to TowerPro SG 5010 

 

EDIT: Jednak była pomyłka w kodzie bo przy parametrze pwm1.setPWMFreq(); dałem 1600 zamiast 60 i teraz działa jak należy, nie ma żadnych zacięć.

@ethanak Właśnie już to zauważyłem. Dziękuje za pomoc.

 

EDIT: Serwa przy 2A działają wolniej niż pojedynczy, dlatego przymierzam się do kupna 5V z 18-20A zasilacza. Serdecznie pozdrawiam.

Edytowano przez espiridion
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

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!

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