Adafruit 16-Channel Servo Shield

zag op youtube dit filmpje: https://www.youtube.com/watch?v=7MrJaA1GWDc

arduino plus Adafruit 16-Channel Servo Shield

nu als ik alles aansluit volgens de uitleg van adafruit werkt alles perfect
code komt van adafruit zelf kun je dowloaden via gidhub

tot zo ver geen probleem alleen de code die adafuit je aanbied is niet het zelfde als in het filmpje
in het filmpje zie je de motortjes allemaal tegelijk draaien 180 graden
en in hun gidhub code gaan ze allemaal 1 vooor 1 180 graden

bij gebrek aan tijd klein familie probleem geen tijd verder in te duiken

dus weet iemand een code dat ik zo makelijk alle motortjes tegelijk kan laten draaien
of nog beter ze alle 16 los van elkaar een beweging kan laten maken ergens tussen 90 en 180 graden en dan liefst minimaal vier tegelijk hoeft niet eens alle 16 te gelijk

met gr jeroen

fripster

Golden Member

Laat eens even zien waar de code staat op GitHub. Kunnen we even meekijken. Zal wel niet erg moeilijk zijn dit aan te passen.

Eens een wirehead,altijd een wirehead.... gopher://fripster.ydns.eu

dit is de code die nu op de laptop staat waar ik een maand geleden mee bezig was

https://github.com/adafruit/Adafruit-PWM-Servo-Driver-Library/blob/mas…

zal straks even voor de zekerheid kijken

fripster

Golden Member

Die is eenvoudig: de twee geneste loops in regels 44 en 45 omdraaien... dan heb je wat je wil.

Dan wordt het zo:

c code:

void loop() {
  // Drive all PWM at the same time
  for (uint8_t pwmnum=0; pwmnum < 16; pwmnum++) {
    for (uint16_t i=0; i<4096; i += 8) {
      pwm.setPWM(pwmnum, 0, (i + (4096/16)*pwmnum) % 4096 );
    }
#ifdef ESP8266
    yield();  // take a breather, required for ESP8266
#endif
}

[Bericht gewijzigd door fripster op zaterdag 19 januari 2019 13:42:31 (64%)

Eens een wirehead,altijd een wirehead.... gopher://fripster.ydns.eu

ga dit morgen even proberen
kijk ik even of ik het aan het werken krijg
ook nog een idee over hoe ik evt 2 van de 16 minder graden kan laten draaien dus 14 van 0 naar 180 2of evt meer van 0 naar 90 graden
kan je me ook in jip en janneke taal uitlegen wat je nu gaan dan hebt aan die code dan snap ik dat voor andere dingen ook beter
mvg jeroen alvast bedankt voor de moeite

fripster

Golden Member

Het beste is als je zelf leert programmeren.. Arduino is een zeer goed startpunt daarvoor. Er zijn superveel tutorials en leermiddelen.

Wat ik gedaan heb is in het kort het volgende.

Er waren twee tel-lussen. Eentje die elke keer van 0 tot 4095 telt in stapjes van 8 (dus 0,8,16,24,32,40,48 enzovoort). Die eerste lus loopt met de variabele 'i'. die getallen 0-4096 vertegenwoordigen de standen 0 tot plm. 180 graden van de servo's. Dus een stuursignaal van 0 is 0 graden en een stuursignaal 4096 leidt tot een servo die op 180 graden staat

De tweede lus telt (in de variabele pwmnum) van 0 tot 15 in stapjes van 1 (dus 0,1,2,3 etc). Dit is het nummer van de servo die moet worden aangestuurd.

de regel "pwm.setPWM(pwmnum, 0, (i + (4096/16)*pwmnum) % 4096 );" wordt elke keer gebruikt om de servo met het nummer 'pwmnum' aan te sturen met positie die afgeleid wordt van positie 'i'. Elke servo krijgt een iets andere positie dan de vorige door de berekening die er gedaan wordt.

in de originele code werd elke keer eerst van servo tot servo geteld, en daarbinnen elke keer de gehele sweep van 0-4095 gedaan. In de aangepaste code wordt er voor elke waarde van 0-4095 elke keer door alle servo's heen gesweept.

Ik heb het dus gewoon omgedraaid.

Probeer ook maar eens de berekening "(i + (4096/16)*pwmnum) % 4096" te vervangen door gewoon 'i' en zie wat er gebeurt....

Fripster

Eens een wirehead,altijd een wirehead.... gopher://fripster.ydns.eu

heb deze code geprobeerd met 2 servo motoren 1op pin 0 andere op pin 8
dan gaat hij prima doe ik motor 3 erbij stop hij ermee je ziet je proberen te draaien maar lijkt niet te Luken
uno op pc met kabel
shielt met 9 volt
uno met stekker in stopcontact

heb het idee dat ik ze meer stroom moet geven???
heb niet heel veel tijd vandaag ivm familie
hierbij de code

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

// called this way, it uses the default address 0x40
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
// you can also call it with a different address you want
//Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x41);
// you can also call it with a different address and I2C interface
//Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(&Wire, 0x40);

// 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 servonum = 0;

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

pwm.begin();

pwm.setPWMFreq(60); // Analog servos run at ~60 Hz updates

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);
pwm.setPWM(n, 0, pulse);
}

void loop() {
// Drive each servo one at a time
Serial.println(servonum);
for (uint16_t pulselen = SERVOMIN; pulselen < SERVOMAX; pulselen++) {
pwm.setPWM(servonum, 0, pulselen);
}

delay(500);
for (uint16_t pulselen = SERVOMAX; pulselen > SERVOMIN; pulselen--) {
pwm.setPWM(servonum, 0, pulselen);
}

delay(500);

servonum ++;
if (servonum > 7) servonum = 0;
}

eindelijk het werkt 1 tm 16 werkt nu
in een wave als ze nu nog vlugger tegelijk kunnen vind ik het prima liefst tegelijk als iemand weet wwar ik dat moet veranderen zou gewelidig zijn
ps als ik stroom verlaag van 9 naar 6 werkt hij niet
nu zitten er 8 servo motortjes aan is het mogelijk om shield aantesluiten met 12 volt
alvast bedankt

benleentje

Golden Member

in een wave als ze nu nog vlugger tegelijk kunnen vind ik het prima liefst tegelijk

De arduino uno en ook de meeste andere varianten. Kan zelf maar 1 ding tegelijk. Normaal doet een CPU dat zo snel achter elkaar dat het lijkt alsof het het allemaal tegelijk gaart Het instellen van de servo gaat traag en vraagt veel CPU tijd. Door deze traagheid merk je pas dat een CPU maar 1 ding tegelijk kan doen.

Als je wel tegelijkertijd wilt dan moet je de stuurdraden van de servo's parallel schakelen. Zet je dan 4 servo's op 1 uitgang dan gaan ze ook echte tegelijk. je zou dat bv kunnen doen met kleine relais of een elektronische switch zoals een CD4016 zodat je eerst de relais schakelt en dan de PWM doet. In de YouTube film zullen ze gewoon alle draden parallel geschakeld hebben en daarom gaan ze daar allemaal tegelijk.

Een andere mogelijkheid is een per servo een aparte controller. De controller vertel je enkel naar welke stand hij moet en deze stelt daarna de servo in. Het instellen van de servo kost meer tijd dan enkel de stand doorgeven. Hierdoor lijkt het alsof ze allemaal tegelijk gaan in werkelijkheid zit er een zeer korte tijd tussen. Die tijd zal je echter niet kunnen merken.
Moet ze echt tegelijk werken dan heb je uitgebreidere controllers nodig

Mensen zijn soms net als een gelijkrichter, ze willen graag hun gelijk hebben.