Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Mijn servo's kalibreren

Componenten en benodigdheden

Arduino UNO
× 1
Adafruit PWM Servo Driver Shield
× 1
M3-bout
× 8
M3-ring
× 8
LM2596 DC-DC Step-down spanningsomvormer
× 1
Rood PLA
× 1
Wit PLA
× 1
180 graden duidelijke wiskunde gradenboog
× 1
Draaipotentiometer (algemeen)
× 1
9g servomotor
× 1

Benodigde gereedschappen en machines

3D-printer (algemeen)

Apps en online services

Arduino IDE
Autodesk Fusion 360

Over dit project

In een eerdere post op Hackster schreef ik over hoe ik een rig heb gemaakt om te vergelijken hoe verschillende servo's van dezelfde batch draaien, en ik heb laten zien dat het verzenden van dezelfde PWM-signalen naar verschillende servo's resulteert in enkele significante verschillen - de afbeelding hieronder toont servo's die allemaal begonnen in de verste positie tegen de klok in en hetzelfde PWM-signaal kregen - ze gedragen zich allemaal iets anders.

Waarom geen bestaande servobibliotheken gebruiken voor de Arduino?

Ik gebruik de Adafruit PWM Servo Driver om een ​​aantal servo's aan te sturen, en hierdoor kan ik een ander PWM-signaal naar elke servo sturen. Ik zou de Servo-bibliotheek kunnen gebruiken die in mijn Arduino-installatie is ingebouwd, maar ik heb een paar redenen om dit niet te doen:

  • Met de Adafruit PWM Servo Driver kan ik mijn servo's besturen met slechts twee pinnen via I2C, in plaats van een pin op mijn Arduino te wijden aan elke servo.
  • Ik heb soms met de Arduino Servo-bibliotheek ontdekt dat wanneer ik aan een servo bevestig en een signaal stuur om deze naar de nulgradenpositie te draaien, deze roteert naar de limiet van reizen en de tandwielen in de servo maalt.
  • /li>

Natuurlijk zijn de 9g-servo's die ik gebruik goedkoop en niet ontworpen voor nauwkeurigheid - maar ik denk dat ik er wat meer waarde uit kan halen. Ik wil ze gebruiken voor een lopende robot, en hun gedrag moet wat nauwkeuriger en voorspelbaarder zijn.

Hoe kan ik mijn hobbyservo's nauwkeuriger besturen?

Toen ik bevestigde dat mijn servo's zich allemaal iets anders gedragen, wilde ik een apparaat bouwen waarmee ik een servo kon kalibreren - welke PWM-waarden heb ik nodig om een ​​servo naar een positie van 0 graden te sturen? Of het middelpunt van 90 graden? Hoe voorkom ik dat ik een PWM-waarde stuur die de servo in een extreme positie zet met veel geknars en tandwielslijpen?

Ik besloot een paar eenvoudige concepten te combineren.

  • Lijn mijn servo uit met het midden van een eenvoudige gradenboog, zodat als de wisser van de servo draait, ik zijn positie kan meten.
  • Sluit een potentiometer aan op een analoge ingang van de Arduino, zodat ik de positie van de wisser van de servo kan regelen door de PWM-waarde aan te passen terwijl ik de positie van de potentiometeras aanpas.

Voor deze versie was ik blij om de seriële monitor van mijn Arduino IDE te gebruiken om me de waarde van het PWM-signaal te vertellen, dat ik handmatig kan opnemen.

Ik gebruikte Autodesk 123D om een ​​eenvoudige installatie te ontwerpen die de potentiometer, de gradenboog, een enkele servo, mijn Arduino en de Adafruit PWM-servodriver samen met een voeding zou bevatten.

Ik wil de Adafruit PWM-servodriver blijven gebruiken voor mijn kalibratie, want dat is wat ik waarschijnlijk ga gebruiken in mijn afstudeerproject. Als ik de servo rechtstreeks vanaf een pin op de Arduino zou besturen, zou ik dat in het apparaat repliceren en de servo tegen PWM van de Arduino kalibreren.

Het apparaat bouwen

Ik heb elk van de onderdelen uitgeprint en aan elkaar bevestigd met behulp van de M3-bouten en ringen.

De montagegaten in het ontwerp van mijn apparaat zijn aangepast aan mijn componenten - verschillende componenten kunnen afwijkingen hebben in de gatdiameters en posities.

Voor elektronica heb ik de middelste pin van de potentiometer bevestigd aan de A0-pin van de Arduino en de andere pinnen aan 0v en 5v op de Arduino. Ik heb de PWM-servomotordriver op de Arduino aangesloten en vervolgens de DC-DC buck-converter aangesloten (ik had afgestemd om de 9v-voedingsingang om te zetten in een 5v-uitgang). Ik heb de 9g-servo aangesloten op de eerste sleuf op het servomotorstuurprogramma en vervolgens mijn schets naar de Arduino geüpload.

Het eindresultaat is te zien op onderstaande foto's. Door aan de knop in de linkerbovenhoek van het apparaat te draaien, kan ik de positie van de servo regelen en door de seriële monitor in de Arduino IDE te gebruiken, kan ik het PWM-signaal lezen dat naar de servomotor wordt gestuurd voor een bepaalde hoek.

Dus wat vertelt het apparaat me?

Voor mijn servo heb ik hem naar de verste limiet met de klok mee gedraaid en de wisser op de servo geplaatst zodat deze net voorbij de 180 graden-markering op de gradenboog van mijn kalibratieapparaat zou komen.

Ik heb de stroom op het apparaat aangesloten en vervolgens aan de potentiometerknop gedraaid totdat de servo-naald was uitgelijnd met de 0 graden-markering op de gradenboog, en noteerde de PWM-waarde die naar de seriële uitvoer van mijn Arduino IDE werd geschreven. Daarna heb ik de potentiometer gedraaid totdat de servo-naald op 10 graden wees en de PWM-waarde opnieuw genoteerd. Ik zette dit proces elke 10 graden voort totdat ik 180 graden bereikte, en ik heb de resultaten in de onderstaande tabel gedeeld.

Ik heb een grafiek van de resultaten gemaakt (hieronder weergegeven), en zoals je zou verwachten, is het duidelijk dat er een sterk lineair verband is tussen PWM en servohoek.

Nu heb ik enkele PWM- en hoekwaarden die kenmerkend zijn voor deze specifieke servo - andere servo's kunnen vergelijkbare kenmerken hebben, maar ze zullen niet identiek zijn.

Ik heb nu een aantal opties voor nauwkeurigere servoprestaties:

  • Neem deze waardeparen op en houd ze in een array in mijn Arduino-schets, en als ik de servo-wisser naar 90 graden wil verplaatsen (bijvoorbeeld), kijk dan gewoon welke PWM-waarde betrekking heeft op deze hoek en stuur die PWM-waarde naar de servomotor. Dit heeft als nadeel dat ik alleen kan draaien naar hoeken die veelvouden van 10 zijn.
  • Of als ik volledige controle wil over de hoek waarnaar ik verzend, kan ik lineaire regressie op de dataset gebruiken om uit te zoeken welke formule hoek en PWM-waarde met elkaar in verband brengt (voor deze servo, PWM =2,35 * Hoek + 159,4). Op deze manier kan ik de hoek doorgeven waarnaar ik wil draaien als een parameter, en programmatisch de PWM berekenen die nodig is om deze specifieke servo naar die positie te draaien.

Hoe dan ook, ik kan deze servo met meer nauwkeurigheid en vertrouwen besturen dan voorheen. Het is nogal wat meer moeite om elke servo precies te kalibreren, maar voor mijn project is het de moeite waard vanwege de extra nauwkeurigheid.

Als ik de servo van het apparaat verwijder, moet ik natuurlijk de servo-wisser eraan houden, omdat de metingen betrekking hebben op hoe de wisser is bevestigd terwijl deze wordt gekalibreerd.

Verbeteringen voor de volgende versie

Na het kalibreren van een paar servo's, heb ik enkele verbeteringen bedacht die ik in de volgende versie zal inbouwen.

  • De servo moet een snelontgrendelingsmechanisme hebben - misschien de servo op zijn plaats vastzetten met een clip met neodymiummagneten, in plaats van hem vast te zetten met M3-bouten.
  • Ik wil dit kleiner maken - misschien kan ik de Arduino en de voeding heroriënteren om dit te bereiken.
  • Ik heb een aan/uit-schakelaar nodig tussen de 9v-batterij en de buck-converter, dus ik hoef de batterij niet telkens volledig los te koppelen als ik de machine wil uitschakelen.
  • Ik wil de rig in minder stukken kunnen printen.
  • In plaats van handmatig waarden van de gradenboog te lezen, zou het beter zijn als een sensor zou kunnen detecteren wanneer de servo zich in specifieke hoekposities bevindt en dit terug zou kunnen sturen naar de Arduino - dit zou een parallaxfout kunnen elimineren.
  • Ten slotte zou een LCD-scherm om eventuele resultaten weer te geven enorm helpen, omdat ik mijn computer niet op het apparaat hoef te hebben aangesloten.

Afsluiten

Dus dat is het - mijn hobbyservo's zijn goedkoop en niet ontworpen voor nauwkeurigheid - en voor veel toepassingen zijn ze prima in orde. Ik zou echter graag wat meer nauwkeurigheid en herhaalbare prestaties van de mijne willen krijgen, en de rig in dit bericht helpt me om dat te bereiken.

Code

  • Schets voor servokalibratorapparaat
Schets voor servokalibratorapparaatC/C++
#include #define analogIn A0Adafruit_PWMServoDriver pwm =Adafruit_PWMServoDriver();int inputValue =0;int tmpPwmValue =0;void setup() { Serial.begin(9600); pwm.begin(); pwm.setPWMFreq(60);}void loop() { inputValue =analogRead(analogIn); // inputValue zal tussen 0 en 1024 liggen // Door observatie liggen de servo min en max PWM-waarden gewoonlijk tussen 100 en 612 // Met de onderstaande formule kunnen we de analoge input eenvoudig omzetten naar PWM int pwmValue =(int)(100 + ( invoerwaarde / 2)); pwm.setPWM(0, 0, pwmValue); // Controleer of we niet onnodig dubbele gegevens weergeven if (pwmValue !=tmpPwmValue) { Serial.print("Potentiometer Input ="); Serial.print (invoerwaarde); Serieel.print(", PWM ="); Serial.println(pwmValue); } tmpPwmValue =pwmWaarde; vertraging(15);}

Aangepaste onderdelen en behuizingen

Repo voor onderdelen van servokalibrator
https://github.com/jeremylindsayni/ServoCalibrator

Productieproces

  1. PLA 3D-printen:alles wat u moet weten
  2. Pan / Tilt face-tracking met de raspberry pi
  3. PLA vs ABS vs Nylon
  4. Walbi, de wandelende tweevoeter
  5. Arduino IoT-robotarm
  6. 3D printen met PLA vs. ABS:wat is het verschil?
  7. DC-schijven als vervanging voor AC-servo's
  8. Is PLA recyclebaar of zelfs biologisch afbreekbaar?
  9. Zal PLA oplossen in water en zal het uiteenvallen?
  10. Is PLA-filament geleidend (zijn filamenten geleidend)?
  11. Is PLA geleidend? 3D-filament elektrische eigenschappen.