Hulp bij shield

Ik heb vandaag een adafruit 16-Chanel 12bit PWM/servo shield binnen gekregen. Zelf in elkaar gesoldeerd. Niks aan de hand. Het voor gestelde test programma laten draaien. Maar daar houdt het op.
Ik weet niet wat ik moet veranderen om de servo minder ver te laten draaien. Ook niet hoe ik de snelheid kan veranderen.

Daarnaast wil ik hem gebruiken om LED mee aan te sturen. Maar hier voor kan ik al helemaal niks vinden.

Iemand ervaring met deze shield die mijn kan helpen

Alvast bedankt

Wat heb je zelf al geprobeerd? De voorbeeldcode moet al aardig laten zien hoe je hem aan stuurt en moet vrij snel duidelijk worden hoe dat zelf ook te doen.

Voor ons zou het fijn zijn als je een linkje naar het shield hier te plaatsen en naar de library die je gebruikt.

Omdat de details (nog) ontbreken, geef ik hier ook een meer algemeen antwoord.

Een servo moet zelf maar zorgen dat ie op de gewenste positie belandt (of eigenlijk, die zegt dat regel ik zelf wel).
Bij een servo stuur je dus alleen door wat de volgende positie moet worden, en de servo gaat dan proberen dat zo snel mogelijk te doen.
Wanneer je dat te snel vind gaan, kun je er wel wat aan doen.
Dan laat je de servo namelijk niet in 1 keer naar de gewenste positie lopen, maar doe je dat in stappen.
Helemaal mooi word het als je de grootste afstand wel met de volle snelheid doet, en het laatste stukje steeds langzamer.
Dat is een uitdaging, maar het kan.
Natuurlijk houd je dan de servo een beetje voor de gek en gooi je het idee van de servo gedeeltelijk overboord.
En echt langzamer gaat die servo zo niet, maar je creëert wel de illusie dat dat gebeurt.

Verder, als het om een Adafruit product gaat, dan ben ik er zonder er naar te gaan zoeken, van overtuigd dat die er echt alles over vertellen wat er te vertellen is.
En dat moet dus inclusief het aansturen van je LEDs (PWM dus) zijn.

Wat ik geprobeerd heb? Tot nu toe nog alleen maar het servo test programma van adafruit zelf. Die staat in hun library. Ik wordt er helemaal niet wijs uit.

Adafruit beidt verschillende vergelijkbare producten.
Daarom vroeg septillion je ook om een link naar het betreffende product, zodat anderen met je mee kunnen zoeken voor het oplossen van jouw probleem.

Dit shield heb ik nu om te proberen daar mee LEDs aan te sturen.
Maar ik weet niet welke code ik daar voor moet gebruiken om ze te laten branden. Verder weet ik ook niet hoe ik het shield moet aan sturen zodat mijn arduino hem kan vinden

jerommeke1975:
Adafruit 16-Channel 12-bit PWM/Servo Shield - I2C interface : ID 1411 : $17.50 : Adafruit Industries, Unique & fun DIY electronics and kits
Dit shield heb ik nu om te proberen daar mee LEDs aan te sturen.
Maar ik weet niet welke code ik daar voor moet gebruiken om ze te laten branden. Verder weet ik ook niet hoe ik het shield moet aan sturen zodat mijn arduino hem kan vinden

Je vangt de subtiele hints blijkbaar niet op, 'k zal het maar gewoon zeggen: we zullen je helpen als je iets probeert, maar gaan jou de oplossing niet gewoon geven, anders leer je toch niets.

En zoals iemand anders al zegt, adafruit geeft toch goede documentatie, lees hier eens hoe je de library moet gebruiken. lees het eens door en experimenteer ermee, en als het je niet lukt, kom dan zeggen waar je vastloopt en dan geven we je wel een tip om verder te geraken (maar ja, als je er nog weinig van kent ga je toch wel even bezig zijn eer je ergen geraakt ^^)
library reference

welk programma heb je geprobeerd?
dit ding wordt gebruikt voor Servo aansturing, en dat is toch iets heel anders dan leds.
leds zijn overigens on/off en niet PWM.

Huh??? ???

in de bibliotheek zitten 2 voorbeelden, "pwmtest" en "servo"

pwmtest voor aansturen 16 LED's

void loop() {
  // Drive each PWM in a 'wave'
  for (uint16_t i=0; i<4096; i += 8) {
    for (uint8_t pwmnum=0; pwmnum < 16; pwmnum++) {
      pwm.setPWM(pwmnum, 0, (i + (4096/16)*pwmnum) % 4096 );
    }
  }
}

servo voor aansturen van 8 servo's

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(50);
  for (uint16_t pulselen = SERVOMAX; pulselen > SERVOMIN; pulselen--) {
    pwm.setPWM(servonum, 0, pulselen);
  }

  delay(50);

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

als je deze code niet begrijpt zal je inderdaad eerst wat meer basiskennis moeten opdoen.

voor alle duidelijkheid, zowel analoge servos aansturen als LED's dimmen gebeurt met PWM, vandaar ook pwm.setPWM
het extra aan deze bibliotheek is dat ze toelaat om zowel de timing van de stijgende als de dalende flank in te stellen; je kan dus zowel de duur van de puls als het startmoment instellen.

Servo's worden gezet met ppm en niet pwm.

shooter:
dit ding wordt gebruikt voor Servo aansturing, en dat is toch iets heel anders dan leds.
leds zijn overigens on/off en niet PWM.

Heb je wel naar de informatie van Adafruit gekeken ?
Want nagenoeg alles wat je zei is niet waar.
Dit ding is gemaakt met een PCA9685 (klik !), en dat is een uitgebreide LED controller.
Zo uitgebreid, dat je er ook op de juiste wijze een servo mee kan bedienen, lees de datasheet maar eens.
En een LED die on/off is (das een feit, dus correct) is daarmee bij uitstek geschikt voor PWM.

Werkelijk, jerommeke1975 alles wat je nodig hebt word je door Adafruit aangereikt.
Maar men gaat wel van een bepaalde basis kennis uit.
Dan nog is de vereiste kennis niet heel hoog.
Maar men neemt wel aan dat je hen kunt volgen.
Als die kennis nog ontbreekt, omdat je gewoon nog maar net met deze technieken in aanraking bent gekomen, dan kan het lastig worden.
Dan gaat het ook nog om een andere taal, helpt misschien ook niet erg.
Das helemaal niet erg, het meest nog voor jou zelf.
Maar het begint bij het opnemen van de geboden stof.
Lees het allemaal eens door voor je verder gaat.
Dus niet 2 pagina's lezen en dan toegeven aan de verleiding om er mee aan de slag te gaan, maar eerst alles uitlezen.
En dan nog een keer, want de 2e keer lees je dingen die je de vorige keer deden duizelen, maar heb je de hele stof al gezien en gaat er ineens veel meer op z'n plaats vallen.
Daarna kun je er mee gaan spelen.

Mocht je dan nog in de problemen komen, ben je van harte welkom om je vragen te stellen.
Laat daarbij wel zien wat je allemaal al gedaan hebt.
En wat je wil bereiken, maar wat je in plaats daarvan gekregen hebt.
Dan kan er een veel gerichter antwoord gegeven worden.

Jantje:
Servo's worden gezet met ppm en niet pwm.

Huh, nee... Echt met PWM. De frequentie maakt hier niet zo bij uit maar alle info zit toch echt in de breedte van de puls, niet in de positie.

septillion:
Huh, nee... Echt met PWM. De frequentie maakt hier niet zo bij uit maar alle info zit toch echt in de breedte van de puls, niet in de positie.

Ikzelf heb een rc receiver in men robot en wat er uitkomt (en dus ook rechtstreeks naar servo gaat) is ppm en niet pwm.
Indien het pwm zou zijn... waarom is er dan een servo library die op elke pin werkt? ook niet pwm pinnen?
Als het pwm zou zijn zou pulsein helemaal niet blokkerend zijn. en je zou ook met een rc filter en analoge pin kunnen lezen.

lees meer op RCArduino: How To Read an RC Receiver With A Microcontroller - Part 1

Het is toch echt PWM :wink:

Jantje:
waarom is er dan een servo library die op elke pin werkt? ook niet pwm pinnen?

Omdat het software PWM is. Kan ook makkelijk omdat de PWM frequentie laag wordt verwacht en niet eens vast. Het enige waar het een servo om gaat is de puls duur (Pulse Width dus).

Toegegeven, meestal zit de informatie bij PWM in de duty cycle ipv puur in de puls duur. Dus eigenlijk is wat wij meestal PWM noemen een beetje een foute naam. Pulse Duty Cycle Modulation zou eigenlijk een betere naam zijn :D. En wat de servo doet is echt puur PWM. Alle info zit in de puls duur, onafhankelijk van de duty cycle of frequentie.

Jantje:
Als het pwm zou zijn zou pulsein helemaal niet blokkerend zijn.

Weet even niet wat pulseIn() hier mee van doen heeft..

Jantje:
en je zou ook met een rc filter en analoge pin kunnen lezen.

Dat zou prima kunnen MITS je een vaste frequentie gebruikt voor de servo's. Iets wat de meeste controllers (en de servo library zeker) niet doen. En ook al zouden ze het wel doen, de gebruikelijke tijd tussen twee pulsen is 20ms (of meer). Dat geeft nogal een traag signaal om netjes door een RC filter te stoppen en weinig rimpel te verwachten. Het zou er enorm traag van worden. Ook geeft het maar een kleine variatie omdat de pulsduur maar (ongeveer, servoLib doet iets meer) schommelt tussen 1ms en 2ms. Op 20ms zou dat maar een duty cycle geven van max 10% dus maximaal 0,5V (0,1 x 5V = 0,5V).

Hier nog even een plaatje wat laat zien hoe het servo signaal er uit ziet bij verschillende hoeken. Kan je duidelijk zien dat het de puls breedte is wat het sturen doet, niet de puls positie. Iets wat jouw artikel ook aan geeft.

Nee septilion, dat is het niet.
Het is een techniek die veel verward word met PWM, maar het is dus echt geen PWM.
Door de enorm veel verschillende beschrijvingen die er rond zweven, maar ook door dat de decoders veel accepteren, ontstaat de eerder aangehaalde en hier nu ineens leidende onderwerp en misverstand.

Een servo word gestuurd met puls duur modulatie.
Daarbij gaat het dus over de lengte van de puls , gemeten in tijd.
Inderdaad doet dan de puls repetitie frequentie er niet meer heel veel toe.
Puls breedte modulatie wordt gemeten in duty cycle.
Daarbij is de gehele cyclus dus leidend, en kun je ook alleen meten wat de verzonden waarde is, na afsluiten van die complete cyclus.
Als je een fictief 15 KHz signaal hebt van de ene timer, dan moet die dus 10% duty cycle hebben om de middenstand te bereiken wanneer je die aansluit op je standaard servo of snelheidsregelaar.
Maar als je dan een 20 KHz signaal hebt van een andere timer, dan gaat ie met 10% duty cycle dus wel ineens vol gas.

Daarom gaat de door Jantje aangehaalde pagina ook scheef, ze spreken over een 2µS puls breedte, terwijl het een 2 µS puls duur is.
De breedte van de puls moet je in procenten uitdrukken, de duur word in seconden (of delen daarvan) uitgedrukt.

Je kunt nu beargumenteren dat dit allemaal geneuzel is, en zelfs ook dat zowel Jantje als septilion gelijk hebben.
Maar door dit soort misverstanden en halve waarheden ontstaat dus grote verwarring en word het een groot probleem om de materie werkelijk te gaan begrijpen.

Ik gooi mijn visie er daarom ook maar eens tegen aan:

  • Puls Breedte Modulatie betekent dat de totale cyclus van een golfvorm leidend is, en de grootheid word weergegeven in het percentage waarin van 1 hele cyclus, de positieve kant gemeten wordt.

  • Puls Duur Modulatie betekent dat de duur van de puls gemeten word in tijd, waarbij de puls herhalingsfrequentie van ondergeschikt belang is (er is overigens wel een reden voor de tijd tussen de pulsen, maar die valt voor mij nu even buiten dit verhaal).

  • Puls Positie Modulatie ken ik niet, maar de naam zou mij doen vermoeden dat er ook nog een klokpuls moet zijn, en dan de tijd tussen de klok en de puls gemeten zou moeten worden.
    Klokpulsen kun je ook maken met dezelfde lijn, maar niet met een enkele digitale in;- of uitgang.

Laten we allemaal wel de neuzen dezelfde kant op hebben, anders gaat het nooit goed komen met die servo's.

@MAS3, je hebt helemaal gelijk. Maar Puls Breedte Modulatie (PWM) en Puls Duur Modulatie (PDM) worden vaak beide onder de noemer PWM gevat omdat in beide gevallen de informatie in de puls breedte zit het zij relatief of absoluut. Ik heb ze dan ook geleerd als zijnde beide vormen van PWM. Beetje hoe we FM en PM ook over één kant scheren :stuck_out_tongue:

Waar het mij vooral om ging is dat het absoluut geen PPM is. En dat de stelling dat je het niet met een RC filter zou kunnen doen niet ligt aan het feit dat het PPM is maar dat de frequentie niet vast ligt.