Bouwverslag: zelfbouw flight controler op basis van Arduino Uno

Discussie in 'Multicopters bouwverslagen' gestart door JoopB, 31 jan 2014.

  1. JoopB

    JoopB

    Lid geworden:
    10 jan 2013
    Berichten:
    2.181
    Locatie:
    Zwolle
    In verband met de winter van 2013/2014 ben ik op zoek gegaan naar een nieuw project. Deze keer wil ik een quadrocopter gaan bouwen. Nu is het bouwen van een quadrocopter niet heel spectaculair en er zijn al voldoende bouwverslagen van.

    Echter wil ik mijn eigen controller programmeren op basis van een Arduino Uno inclusief de noodzakelijke sensoren. Dus ZONDER gebruik te maken van reeds bestaande programma’s. En dat zie je volgens mij niet zo vaak. Mede omdat de Arduino Uno een relatief lichte en trage processor is. In dit verslag wil ik de problemen (die ik zeker tegen ga komen) beschrijven.

    Het frame wil ik mij niet druk om maken en kies daarom voor een F330 van DJI. Door het formaat past deze goed op het bureau tijdens het programmeren en testen. Een nadeel van een klein frame is dat deze van nature onstabieler is dan een grote.

    “Waarom het wiel opnieuw uitvinden?” zullen sommigen zich afvragen. Omdat ik wil weten of ik het kan en omdat ik het leuk vind om probleemoplossend te programmeren.

    Er zijn voorlopig vier stappen die ik deze winter wil bereiken:
    1) Vliegen op basis van gyro’s;
    2) Automatisch stabiliseren op basis van een versnellingssensor;
    3) Automatisch hoogteregeling op basis van luchtdruk;
    4) Een servo aangedreven gimbal.


    [​IMG]


    De onderdelen die ik ga gebruiken (de meeste had ik nog liggen):
    - DJI Flame Wheel 330;
    - Arduino Uno;
    - ST L3G4200D 3-assige gyro;
    - CMPS10 kompasmodule met versnellingssensor;
    - Driekleuren led voor signalering;
    - druksensor MS5607;
    - Futaba R617FS ontvanger;
    - 3250mAh / 3S lipo;

    De communicatie tussen de Arduino en de sensoren is op basis van I2C. Het inlezen van de ontvangersignalen en de aansturing van de servo en esc’s is op basis van pulsbreedte (1000 – 2000us).

    Een avond solderen levert mij een shield op die ik eenvoudig op de Arduino Uno kan plaatsen. Een CD4075 (drievoudige or-poort) gebruikt ik voor het verzamelen van de ontvangersignalen.

    [​IMG]


    [​IMG]


    De eerste stap is het realiseren van de communicatie tussen de Arduino en de ontvanger. Het probleem wat zich direct voordoet is tijd. Ik streef er naar om een verversingsfrequentie van de esc’s te behalen van 250Hz. Om 250 Hz te halen mag de programmalus niet langer zijn dan 4ms. Hierdoor is het niet mogelijk om het programma te laten wachten tot de pulsen van de diverse kanalen voorbij zijn gekomen.

    De Arduino bied de mogelijkheid om gebruikt te maken van een interrupt. De processor stopt (interrupt) bij een wijziging aan de ingang het lopende programma en voert dan een stuk code uit. Dit gebeurt zo snel dat er bijna geen tijd verloren gaat. Echter heeft de Arduino Uno maar 2 beschikbare interrupt ingangen en heeft de Futaba R617FS ontvanger meer dan twee uitgangen.

    De processor op bijvoorbeeld een KK controller heeft meer interrupt ingangen waardoor het verzamelen van ontvangeruitgangen makkelijker is. Maar helaas heb ik mijzelf een Arduino Uno opgelegd.

    In het onderstaand schema is de volgorde te zien waarop de pulsen door de R617FS ontvanger uitgestuurd worden. De volgorde is vastgesteld met behulp van de Arduino. Door de signalen van kanaal 1, 3 en 5 te combineren ontstaat er een “somsignaal” waarbij de tijd tussen de statusverandering overeenkomt met de tijd. Door middel van een interrupt ingang is de tijd van de eerste 5 kanalen te bepalen.

    [​IMG]

    Voor het combineren van de signalen maak ik gebruik van een CD4075 (drievoudige or-poort).

    [​IMG]

    Door kanaal 6 van de ontvanger te koppelen aan de tweede interrupt is het mogelijk om 6 kanalen “tijdloos” in te lezen. Onderstaand schema laat de koppeling tussen de Arduino en de ontvanger zien.



    [​IMG]


    Een belangrijk onderdeel is een goede statusmelding. Door middel van een driekleurenled. Op basis van kleur en het aantal pulsen is het eenvoudig om een foutmelding , status of waarschuwing te melden.

    Zoals al gemeld is het niet mogelijk om de programmalus te stoppen. Om toch de led aan en uit te zetten is het noodzakelijk om na het inschakelen van de led de actuele “tijd” vast te leggen en daar bijvoorbeeld 1 seconden bij op te tellen. Zolang de actuele tijd onder deze waarde blijft mag de led blijven branden. Is de actuele tijd langer dan schakelt de led uit. Op deze manier zijn er zonder tijdverlies diverse statusmeldingen mogelijk.

    Door een weerstanddeler aan te sluiten op een analoge ingang is het ook mogelijk om de spanning van de lipo te meten. Met enkele minuten solderen en een aanpassing in het programma hebben we een alarmmelding bij een te lage spanning van de lipo.


    [​IMG]

    Deze spanningsmeting wil ik ook gaan gebruiken om te zorgen dat de signalen naar de esc’s versterkt worden naarmate de spanning van de lipo daalt. Hierdoor blijft het vlieggedrag bij volle en lege lipo gelijk en kan de regelaar optimaal blijven functioneren.

    Het uitlezen van de gyro buffers is met behulp van de datasheet redelijk eenvoudig voor elkaar te krijgen. In de buffers staan steeds de meest actuele rotatiewaardes van alle drie de assen in graden per seconden.

    De communicatie is op basis van I2C en standaard staat de kloksnelheid op 100kHz. Mits de sensoren dit aan kunnen is het mogelijk om de kloksnelheid te verhogen naar 400kHz. In de wire library staat het bestand twi.h. Door de regel #define TWI_FREQ 100000L te veranderen in #define TWI_FREQ 400000L gaat de kloksnelheid omhoog. Dit verkort behoorlijk de doorlooptijd.

    Door de actuele rotatie te vergelijken met de met de stickpositie van de zender ontstaat er een actuele en gewenste waarde voor de regelkring. Deze twee waardes vormen de input van de pid-regelaar. Afhankelijk van het verschil tussen de twee input waardes ontstaat er een output waarmee de motoren aangestuurd zullen worden.

    In programmavorm stelt de pid regelaar niet zo veel voor.
    Improving the Beginner?s PID: Direction « Project Blog

    Voor de Aurduino is er een library beschikbaar waar de noodzakelijke stukken code zijn verwerkt. Op de implementatie van de regelaar ga ik niet in,en ga er van uit dat dit iedereen wel lukt.

    In een notendop hebben we nu voor de drie assen van de quadrocopter de aanstuurwaardes voor de motoren. Door de signalen op de juiste manier te mixen ontstaat er een signaal per motor.

    Het mixen van de signalen is eigenlijk eenvoudig. Ik programmeer de quad voor een X opstelling waardoor het signaal voor de motor links voor bijvoorbeeld wordt:

    Motor_1 = gas + pid_uitgang_pitch – pid_uitgang_roll + pid_uitgang_yaw

    Op deze manier zijn eigenlijk alle bekend configuraties eenvoudig te mixen. En zelfs modellen waarbij de symmetrie afwijkt!

    Het aansturen van de esc’s gaat door middel van 1000 t/m 2000us pulsen. Omdat ik ook een servo voor de gimbal toe wil passen kom ik op 5 signalen. Als deze pulsen stuk voor stuk worden uitgestuurd gaat er in het ergste geval 10ms verloren (5 x 2000us). En dat is te lang omdat de verversingsfrequentie daardoor onder de 100Hz zakt. Het is dus noodzakelijk om de signalen gelijktijdig uit te sturen.

    Dat lijkt eenvoudiger dan dat het is. Enkele microseconden verschil tijdens het uitsturen zijn direct op te merken in het bewegen van de servo en het vlieggedrag. Iedere puls moet dus keer op keer exact dezelfde lengte hebben en zelfs het in en uitschakelen kost al enkele microseconden.

    Ik heb er voor gekozen om de signalen op lengte te selecteren. De kortste puls eerst en de langste puls als laatste. Vervolgens stuur ik de betreffende uitgangen in die volgorde “hoog”. Na de betreffende wachttijd van 1000 t/m 2000us kan ik de uitgangen in dezelfde volgorde weer “laag” sturen. Hierdoor ontstaat een zeer solide en constant uitgangssignaal.

    [​IMG]

    De eerste uitdaging schiet al aardig op en binnenkort ga ik de eerste vluchten maken. Dan zal ik ook een film posten van het eerste resultaat.

    Maar eerst nog even wat regels erbij programmeren :thumbsup:
     
    Laatst bewerkt door een moderator: 17 nov 2015
  2. Lama

    Lama

    Lid geworden:
    5 nov 2010
    Berichten:
    4.554
    Locatie:
    venlo
    Whooo Joop waar ga je aan beginnen kerel :D , tof ik ga het volgen ;)

    Nick
     
  3. Atchoo

    Atchoo Guest

    Erg leuk project, zie je inderdaad niet zo vaak. Ik heb het zelf ook overwogen, maar ga denk ik toch apm als basis nemen. Ga het zeker even in de gaten houden, wie weet als het lijkt mee te vallen :D.
     
  4. Chow

    Chow Forum veteraan

    Lid geworden:
    21 mrt 2011
    Berichten:
    10.452
    Locatie:
    Paramaribo
    Ik ben je technisch gezien nu al kwijt :) Maar ik blijf het wel volgen..
     
  5. Tasz

    Tasz

    Lid geworden:
    10 okt 2011
    Berichten:
    3.548
    Locatie:
    Kudelstaart
    Leuk project. Ga ik volgen
     
  6. JoopB

    JoopB

    Lid geworden:
    10 jan 2013
    Berichten:
    2.181
    Locatie:
    Zwolle
    Bedankt voor de reacties allemaal!

    Tja, ik probeer het zo eenvoudig mogelijk te brengen maar kan mij goed voorstellen dat je de draad snel kwijt bent. Maar hopelijk heeft iemand er ooit eens iets aan ;)

    Er is in ieder geval weer een update aan het verhaal. Ik ben bijna zo ver dat ik de eerste vluchten kan gaan maken :thumbsup: En video volgt natuurlijk.
     
  7. Andreotti

    Andreotti

    Lid geworden:
    20 jun 2012
    Berichten:
    372
    Locatie:
    Alphen aan den Rijn
    Hoi Joop,
    Dapper dat je zelf gaat proberen om de software te schrijven. Ik was dat ook van plan, maar vond eigenlijk op internet al precies wat ik zocht. Ik heb de aeroquad software gebruikt als basis voor mijn arduino uno quad. Die vliegt inmiddels uitstekend, al zeg ik het zelf.

    De uno heeft idd niet een hele snelle processor. Bij de aeroquad hebben ze dat opgelost door processen te scheiden tussen zaken die bij elke loop doorlopen moeten worden, en zaken die bv elke 10 loops aangeroepen worden. Er zit een scheiding in op Hz. Ik vond dat ze dat heel goed hadden aangepakt. Misschien heb je hier wat aan.

    Groetjes en suc6. Ik hou je project in de gaten.
    Andre
     
  8. JoopB

    JoopB

    Lid geworden:
    10 jan 2013
    Berichten:
    2.181
    Locatie:
    Zwolle
    @Andre: bedankt voor je reactie. Het is inderdaad mogelijk om zaken niet iedere loop mee te nemen. Maar voorlopig wil ik eerst proberen om zoveel mogelijk zaken (gyro, luchtdruk, versnelling, zender inputs, pid-berekeningen, enz) in iedere loop mee te nemen. Schrappen kan altijd nog ;-)

    Een servopuls duurt minimaal 1000us. Deze tijd wil ik ook gaan gebruiken om zaken te regelen. Maar het is inderdaad puzzelen en schuiven om alles op tijd afgehandeld te krijgen. Maar tot op heden lukt het heel aardig :cool:

    Ik heb liever een iets lagere refresh rate dan een hoge refresh rate waarbij ik niet alle data actueel hou. Wat is de refresh rate van de Aeroquad?

    Maar ik neem je tip zeker mee :thumbsup:
     
    Laatst bewerkt: 1 feb 2014
  9. Andreotti

    Andreotti

    Lid geworden:
    20 jun 2012
    Berichten:
    372
    Locatie:
    Alphen aan den Rijn
    Dat zou ik je eerlijk gezegd niet kunnen vertellen. Simpelweg omdat ik daar niet naar gezocht heb. De aeroquad code is opensource, dus een kijkje nemen kan nooit kwaad.

    Ik heb trouwens een heel handige shield gebruikt voor de arduino uno. Dat ding bevat zelf geen electronica, alleen maar groepjes pinnen (waar servo's en ontvangers op aangesloten kunnen worden) die verbonden zijn met de poorten van de arduino. De Sainsmart sensor shield V4.

    Dus eigenlijk was ik in 1 dag klaar met mijn quad. Het leren vliegen duurde wat langer...
     
  10. JoopB

    JoopB

    Lid geworden:
    10 jan 2013
    Berichten:
    2.181
    Locatie:
    Zwolle
    Vandaag de eerste videovlucht gemaakt. Deze vlucht is puur op gyro zonder autolevel of iets dergelijks. Daarmee is de eerste uitdaging afgerond en kan ik mij gaan richten op het de versnellingsmeting.

     
    Laatst bewerkt door een moderator: 13 nov 2015
  11. Andreotti

    Andreotti

    Lid geworden:
    20 jun 2012
    Berichten:
    372
    Locatie:
    Alphen aan den Rijn
    Niet gek voor een eerste vlucht. Ik ben benieuwd naar je code want dat heb je wel heel snel voor elkaar gekregen.

    Heb je nog filters gebruikt, zoals Kalman of iets?
     
  12. Devil31

    Devil31

    Lid geworden:
    16 nov 2013
    Berichten:
    610
    Locatie:
    Zuid-Limburg
    coool,dat je dat voor elkaar hebt gekregen,doe ik je echt niet na.:thumbsup:
    vliegt zo te zien gewelig.:cool:
     
  13. JoopB

    JoopB

    Lid geworden:
    10 jan 2013
    Berichten:
    2.181
    Locatie:
    Zwolle
    Bedankt voor de reacties!

    @Andre: de vlucht is alleen met gyro's. Daar heb je geen filter voor nodig omdat gyro's bijna niet verstoord worden door trillingen. Bij het gebruik van een versnellingsmeting is een filter wel van belang omdat trillingen de meetwaarden verzieken ;-) Daar ga ik nog eens rustig over nadenken :cool:
     
  14. Andreotti

    Andreotti

    Lid geworden:
    20 jun 2012
    Berichten:
    372
    Locatie:
    Alphen aan den Rijn
    Ik heb hier nog een beknopt stukje code liggen voor een kalman filter en low-pass filter voor de arduino. Dat zou je opweg kunnen helpen. Ik hoor het wel als je daar interesse in hebt. Maar kan me ook voorstellen dat je alles liever zelf uitpuzzelt.

    Suc6 met je project, gaat lekker tot nu toe.
    Groetjes, Andre
     
  15. JoopB

    JoopB

    Lid geworden:
    10 jan 2013
    Berichten:
    2.181
    Locatie:
    Zwolle
    Bedankt voor het aanbod Andre mocht ik het nodig hebben laat ik het zeker even weten.

    Ik streef er naar om eerst de hardware te optimaliseren en daarna de rest op te pakken in de software. Hoe ik het precies aan ga pakken weet ik nog niet omdat ik tot op heden onvoldoende simulatiedata heb. Dat ga ik eerst verzamelen en dan kijken wat de beste methode is voor het "filteren". Ook wil ik kijken of ik de berekeningen kan optimaliseren. Hier gaat in ieder geval nog wel wat tijd in zitten ;-)

    Ik wil de software in ieder geval zo eenvoudig mogelijk houden. maar als een Kalman "filter" nodig is ga ik deze zeker gebruiken.
     
  16. Lama

    Lama

    Lid geworden:
    5 nov 2010
    Berichten:
    4.554
    Locatie:
    venlo
    Die gaat volgens mij als een speer dat ding

    Well done Joop , knap stukje werk:thumbsup:

    Crasher
     
  17. JoopB

    JoopB

    Lid geworden:
    10 jan 2013
    Berichten:
    2.181
    Locatie:
    Zwolle
    Stap 2: Automatisch stabiliseren op basis van een versnellingssensor
    Om de quad automatisch te kunnen stabiliseren is het noodzakelijk om een goede en vooral betrouwbare positiebepaling te hebben. Ofwel: hoeveel graden is de quad gekanteld. Nu is het mogelijk om door het optellen van de gyrosignalen (integreren) tot een goede en betrouwbare positiebepaling te komen. Dit werkt voor 7 seconden prima maar door de drift van de gyro’s verloopt de positie langzaam.

    Een versnellingssensor is in staat om op alle assen (x,y,z) de aantrekkingskracht (versnelling) van de aarde te meten. Op de quad is de sensor met dubbelzijdig tape direct op het frame gemonteerd. Hierdoor is het mogelijk om de kantelhoek van de quad te berekenen. Dit werkt op het bureau prima en lijkt het alsof je de gyro’s niet meer nodig hebt…… tot je de motoren start…..

    Hoe goed een motor ook gebalanceerd is, trillingen blijven. Ook de turbulentie van de propellers veroorzaken trillingen. Alle trillingen zijn variaties in versnelling en detecteerbaar door de versnellingsmetingen. Door de hoge frequentie verstoren de trillingen de meting.

    In onderstaande afbeelding blijft de kantelhoek van de versnellingssensor gelijk en staan links de kantelhoek in graden. Naarmate het toerental van de motoren toeneemt nemen ook de trillingen toe.


    [​IMG]


    De versnellingssensor geeft pieken terug van 80 graden terwijl de quad horizontaal staat…… Zelfs bij een langdurig gemiddelde is het signaal niet direct bruikbaar. Het toverwoord is filteren. Maar de vraag is dan: hoe?

    Er zijn verschillende filtermethoden voor. Van eenvoudig tot zeer complex. Mijn uitgangspunt is altijd om zoveel mogelijk de bron aan te pakken. Dus eerst de motoren en propellers balanceren en dan de versnellingsmeting zoveel mogelijk trillingsvrij opstellen zonder dat de hoek van de sensor ten opzichte van de quad kan veranderen. Onder de versnellingssensor zit nog een extra gewicht voor demping in de vorm van een stuk aluminium.


    [​IMG]

    Deze aanpassingen resulteerde in het volgende resultaat:


    [​IMG]


    Nu de basis goed is kan ik rustig kijken wat er in de software nog nodig is. :cool:

    EDIT: 08-02-2014

    De extreme pieken zijn weg en het signaal is inmiddels betrouwbaarder. Als lange termijn gemiddelde geeft het een bruikbare waarde. Even wat gedachten: - Op basis van de gyro’s is de quad 5 seconden stabiel voordat deze begint te driften.
    - De trillingen zijn voornamelijk de oorzaak van de motoren.
    - Hierdoor is de positieve en negatieve versnelling door trillingen gelijk.
    - amplitude en frequentie veranderd met het toerental van de motoren.
    - Turbulentie en extreem vlieggedrag verstoren de meetwaarde ook en zijn willekeurig..

    Dit resulteert in:
    - Eens in de 5 seconden moet de gyro maximaal 2 graden bijgesteld worden.
    - De motortrillingen geven gemiddeld een goede waarde.
    - Tijdens extreem vlieggedrag en turbulentie is het signaal niet bruikbaar.
    - Tijdens extreem vlieggedrag en turbulentie veranderd de gemiddelde versnelling.

    Tijdens normale omstandigheden waarbij de gemiddelde versnelling ongeveer 9,81 N/kg is het signaal bruikbaar. Ik heb er voor gekozen om het signaal niet te gebruiken als de gemiddelde versnelling bijvoorbeeld kleiner is dan 9,4N/kg of groter is dan 10,2 N/kg. Als het signaal wel bruikbaar is stelt de versnellingsmeter de gyro per rekenlus 2% bij:

    gyro = (gyro x 0,98 ) + (versnelling x 0,02)

    Hierdoor is de correctie zeer geleidelijk en niet merkbaar tijdens het vliegen. Met deze methode heb ik een aardige basis gelegd voor een stabiele autolevel. Door de hardware demping van de sensor is het niet nodig om een complexe filtermethode zoals Kalman toe te passen.

    Tijdensde autolevel kan ik gewoon blijven sturen. Het zendersignaal loopt van 1000 t/m 2000us met een middenpositie van 1500us. Bij het uitsturen van volledig pitch resulteert dit in een waarde van 500us. Door het zendersignaal tegen te sturen op basis van het aantal graden ten opzichten van horizontaal ontstaat er een punt waarop de quad niet verder kantelt:

    Zenderpuls - kantelhoek quad (maximaal 36 graden) x 14 ==> 2000 – 36 x 14 = 1496us

    De pid regelaar zorgt voor een stabiel vlieggedrag waardoor het mogelijk om probleemloos tussen de verschillende vliegstijlen om te schakelen.

    En hiermee is er weer een stap afgerond. Volgende stap is het automatisch behouden van de hoogte op basis van een luchtdrukmeter. Hieronder volgt nog een film van het resultaat.
     
    Laatst bewerkt door een moderator: 17 nov 2015
  18. JoopB

    JoopB

    Lid geworden:
    10 jan 2013
    Berichten:
    2.181
    Locatie:
    Zwolle
    Vandaag de eerste testen gedaan met auto level. Deze verliepen boven verwachting! Op de elevator bleef de quad prachtig recht hangen. Echter verliep na verloop van tijd de roll. Waarschijnlijk door het verlopen van het nulpunt van de gyro op de roll.

    Even kijken hoe ik dat opgelost krijg en dan is het weer tijd voor een filmpje :cool:
     
  19. JoopB

    JoopB

    Lid geworden:
    10 jan 2013
    Berichten:
    2.181
    Locatie:
    Zwolle
    En er zijn weer enkele problemen getackeld en we hebben een werkende auto level:



    Volgende stap is de hoogteregeling op basis van de druksensor :thumbsup:
     
    Laatst bewerkt door een moderator: 13 nov 2015
  20. Andreotti

    Andreotti

    Lid geworden:
    20 jun 2012
    Berichten:
    372
    Locatie:
    Alphen aan den Rijn
    Goed bezig Joop!
    Dat is al een zeer veelbelovend resultaat.

    Bij mijn aeroquad heb ik ook zo'n barometer (of druk) sensor. Dat heb ik verschillende keren buiten getest. De ene keer lijkt het heel aardig te werken maar de andere keer valt de quad meteen naar beneden.

    Of het aan de software ligt dat weet ik niet precies, maar een mede vlieger vertelde mij dat er op het vliegveld toch al erg veel drukverschil heerst vanwege een dijkje en andere zaken.

    Misschien ga ik van aeroquad over op MultiWii software want die schijnen het iets beter voor elkaar te hebben. Maar eens een testje aan wagen (als de wind een keer gaat liggen!).

    Succes man, ik blijf het volgen,
    Andre
     

Deel Deze Pagina