Stap 5: Code
Ik schreef een bibliotheek en een voorbeeld-programma met behulp van mbed voor een quadcopter die u in hier vinden kunt. Mbed is een stuk sneller dan de Arduino en het heeft meer geheugen dat dus het kan worden gebruikt voor grotere quadcopter.
I2C & PWM Clash
Voordat het programma kon worden geschreven is er een noodzaak om te gaan met bepaalde problemen die zich als gevolg van een beperkt aantal pinnen beschikbaar op het bord van de kever voordoen. Uit verbindingentabel is het duidelijk dat zelfs al zijn er 4 PWM-uitgangen, een van de PWM ook voor SCL gebruikt wordt (I2C naar MPU6050). Daarom twee opties beschikbaar - gebruik een externe bibliotheek voor aanpassing van de I2C in andere pinnen of een externe bibliotheek voor de aanpassing van de PWM-uitgangen op alle pinnen. Beide opties zijn beschikbaar, maar ik wilde specifiek SoftI2C bibliotheek gebruiken, zoals blijkbaar het zelfs beter dan Wire.h werkt lib die heeft specifieke snelheid en draad lengte problemen. PWM is ook erg belangrijk in ons geval dus dat ik wil kunnen beheren het geenszins mogelijk aan te passen voor de beste werking. Broncode is beschikbaar op github. U zult opmerken dat er
Pin onderbreken
Van documentatie Leonardo heeft bestuur interrupts op 0, 1, 2, 3 & 7 pennen. Pinnen 0 & 1 zijn beschikbaar, maar ik was van plan om ze te gebruiken voor seriële communicatie (misschien later tijdens het uploaden van de schets via bluetooth die is niet moeilijk om te doen, maar vereist een andere module HC-05). Daarom kan een andere externe bibliotheek worden gebruikt toe te voegen een interrupt aan elke pin "PinChangeInterrupt.h" (door 2014-2015 NicoHood). Importeren die door Android: Sketch -> omvatten bibliotheek -> bibliotheken beheren -> zoeken van PinChangeInterrupt. Een voorbeeldcode wordt gegeven die verschilt van de reguliere Interrupt-bibliotheek door de volgende regels:
pinMode (interruptPin, INPUT_PULLUP);
attachPinChangeInterrupt(digitalPinToPinChangeInterrupt(interruptPin), postInterruptFunction, stijgt);
of
attachPCINT(digitalPinToPCINT(interruptPin), postInterruptFunction, stijgt);
MPU6050 bibliotheek
MPU6050 bibliotheek is beschikbaar door Jeff Rowberg 2012. De voorbeeldcode MPU6050_DMP6 wordt gebruikt als de belangrijkste code voor het project.
Als je besloten om mijn frame & motoren gebruiken, meest waarschijnlijk hoeft u te wijzigen van de code niet meer als de PID-regelaar was al voor meer of minder goede prestaties. Maar als u een ander frame gebruikt, moet u nieuwe waarden instellen voor de PID-regelaar. Duurt het geruime tijd als je het doet voor de eerste keer.