Skocz do zawartości

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


Pomocna odpowiedź

Napisano

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

 

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

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