Stap 3: Robot Software
Ik kies ervoor om de schets van de robot in een enkel bestand, die maakt het een beetje lang, maar zet alles op één plek. In plaats van wandelen door de SW-per-regel, zal ik nog ingaan op hoe het wordt georganiseerd, en wat elke sectie is gericht op.
De schets wordt gestart met de standaard reactie header en bibliotheek bestanden opnemen. Ik het documenteren van het schild pin gebruik in de header commentaar te houden mezelf rechtdoor SW gebruik van de pinnen. Ik heb ook een gegevensstructuur die wordt gebruikt door de PID-functie, met de gedachte dat dit zou gemakkelijker toe te voegen een tweede trapsgewijze snelheid PID later gedefinieerd.
Vervolgens zijn dat de #define verklaringen voor constanten en algemeen gebruikte waarden die gemakkelijk kunnen worden gewijzigd. Bijvoorbeeld, zodra u wat de optimale P, I en D waarden voor uw robot bepalen zijn, kunnen ze worden permanent gehercodeerd hier. Vervolgens komen de variabele definities, die ik heb geprobeerd om te groeperen op een logische manier - u kan de rechter van hoe goed ik deed.
De volgende sectie bevat de functies die verderop in de schets worden gebruikt. De eerste functie implementeert de tegenrekening PID. Dit is de SW die ik leveraged zwaar van Brett Beauregard de tutorial. Inbegrepen in de PID-functie is een sectie om vast te leggen van de PID-gegevens op SD-kaart als gegevens logboekregistratie is ingeschakeld. Terwijl het afstemmen van de PID-waarden, vond ik het educatief en onderhoudend, om te zien de individuele PID termijn gedrag. Dit bespaart de gegevens naar een bestand in CSV-indeling, die ik later in Excel geïmporteerd en grafieken voor visualisatie gegenereerd. Dit alle uiteraard werkt alleen als je een SD kaart in de Raad van bestuur van Galileo.
Dit wordt gevolgd door een paar motorische controlefuncties die motorische controle informatie aan besturingselementen van richting, snelheid en rem voor de motor shield toewijzen
Vervolgens is een functie om de Positiegegevens ophalen uit de MPU-6050 module. Ik heb dit met trots van Jeff Rowberg de referentiecode. Ik ben met behulp van een reguliere-interval-gegevens-pull-methode voor gegevensoverdracht, in plaats van met behulp van interrupts als Jeff deed, zoals ik had grote moeite om de interrupts te werken. Het tijdsinterval in het hoofdprogramma lus ten uitvoer wordt gelegd, en ik vond dat een 3ms interval volstond om ervoor te zorgen er waren geen gegevens overstorten.
Vervolgens gaan we over tot een aantal functies om de Bluetooth-communicatie. Deze beginnen met een paar functies voor het verzenden van de complexere opdrachten - dit waren uitgebroken in functies voornamelijk voor de leesbaarheid van code. Dan komt de primaire Bluetooth commando parser, waarmee het communicatieprotocol van de ontvangen met de Android app worden geïmplementeerd. Deze functie accumuleert personages uit de Bluetooth seriële poort tot het einde-van-command teken wordt aangetroffen, en vervolgens het decodeert de opdracht. Zoals verwacht, eindigt de decodeer net als een grote case-statement.
De laatste functie is het hoge niveau robot controle statusmachine. Ik heb het in de mode van een eindig--toestandsmachine (FSM) - geïmplementeerd waarschijnlijk overkill, maar ik voorzag dit uit te breiden als mogelijkheden worden toegevoegd aan de robot.
Volgende halte is de setup functie vereist door alle Arduino schetsen. De opmerkingen in de code moet deze sectie vrij spreekt voor zich. Er is een sectie die bij de initialisatie van de SD-bestand voor data logging en fout uit moet als een SD-kaart niet aanwezig is, maar ik niet besteden veel tijd dit te valideren.
Tenslotte is er de belangrijkste schets lus. De eerste sectie implementeert een timer voor ophalen van gegevens uit de MPU-6050. Als gegevens worden opgehaald, zijn er sommige berekeningen te detecteren als de robot is rechtop of uit balans.
Vervolgens de seriële poort is aangesloten op de Bluetooth-module is ingeschakeld voor een ontvangen teken, en als een wacht, de Bluetooth-functie wordt genoemd.
Dit wordt gevolgd door de PID en motorische controle timer. De "if"-instructie zorgt ervoor dat de PID/motor controle slechts gebeurt wanneer de robot actief probeert om evenwicht te brengen. Dit is waar de MPU_6050-gegevens wordt ingevoerd in de PID, en de output van de PID wordt doorgegeven aan de motorische controle. Dit is ook waar het stuurwiel is geïmplementeerd, door het toevoegen van de Bluetooth afgeleid richting inbreng op een motor, en het af te trekken van de andere. Omdat we extra wiskunde op de PID-uitvoer doen, moeten we opnieuw beperking die de PID Max/Min beperkt te houden binnen de motor PWM-waarden.
Tot slot de robot controle statusmachine heet, en een timer wordt gebruikt voor het implementeren van de robot beat hartfunctie. Ik begon met een aparte hart beat Bluetooth opdracht en batterij spanning, maar hen vervolgens samengevoegd in een enkele functie, met de spanning die wordt verzonden als een indicatie van de hartslag.
En dat is het - een beetje lange adem, maar niets te ingewikkeld.