Stap 4: Gratis RTOS
Om alle taken nodig in realtime uitgevoerd, werd FreeRTOS gebruikt. FreeRTOS is een real-time Operating systeem, wat betekent dat het op gebeurtenissen binnen een voorspelbaar hoeveelheid tijd reageren zal. Dit is belangrijk omdat hierdoor het systeem voorspelbaar. De code is ontworpen voor vier taken die volgen:
- Bij het lezen van de UART
- Bij het lezen van de ESP8266 WiFi Module
- Het lezen van de IMU MPU-6050
- Uitvoeren van een console opdrachtregel
Bij het lezen van de UART
Dit was een eenvoudige taak die de UART voor nieuwe personages ondervraagden. Wanneer een nieuw karakter werd gevonden, werd vervolgens het teken geplaatst in een wachtrij, die was gelezen door de taak van de console opdrachtregel. Dit kan zijn uitgevoerd met behulp van de UART interrupts, maar polling was simpel, werkte, en doordat deze taak de laagste prioriteit, het alleen is toegestaan kan worden uitgevoerd wanneer er niets anders was te doen. Dit betekent dat het niet CPU-cycli die de UART polling verspillen was wanneer andere dingen kunnen worden gedaan. De alleen andere zorg met polling de UART was als personages te snel kwamen. In onze opstelling ondervraagden we de UART voor nieuwe karakters elke 10 ms, die is aanzienlijk sneller dan een mens kan typen. Dit kan problematisch zijn mochten de UART-console worden uitgevoerd vanaf een computer-script, maar hebben we besloten dat de eenvoud van de module gecompenseerd die functie.
Bij het lezen van de ESP8266 WiFi Module
Als onderdeel van dit project wilden we ook draadloze communicatie. Het zou immers jammer zijn als de kubus moest worden aangesloten op een computer. Dit werd bereikt met behulp van een ESP8266, een kleine, makkelijk te gebruiken WiFi module beschikbaar van vele verschillende leveranciers. De ESP8266 communiceert met het bestuur van de Zynq ook met behulp van een UART-interface, waardoor het noodzakelijk is om een andere UART driver te schrijven. Voor dit stuurprogramma UART moeten we lezen in veel personages tegelijk, wat betekende dat interrupts nodig waren. De interrupt handler wass aangeroepen als een karakter door de UART was gelezen en worden die gegevens toegevoegd aan een wachtrij. De wachtrij wordt dan gelezen door de ESP8266 taak, die wat besluit te doen met het teken.
De taak bestond uit een grote statusmachine voor de module initialiseren en het lezen van binnenkomende gegevens. Wanneer de taak van de module pakketten ontvangen stuurde het ze naar dezelfde wachtrij dat werd gebruikt door de UART-module, die was gelezen door de taak van de console. Hierdoor kan dezelfde console commando's worden gebruikt door zowel de exploitant fysiek aangesloten op het systeem of via WiFi. Deze methode ook zorgt voor hergebruik van code en houdt de code base meer georganiseerd.
Het lezen van de IMU MPU-6050
De IMU-6050 is een 6-assige IMU bestaat uit een 3-assige versnellingsmeter en een 3-as gyroscoop. Dit zorgt voor de detectie van de hoek en rotatiesnelheid van het systeem, die beide belangrijk op het algoritme van de besturingselementen. Ophalen van gegevens uit de sensor was eenvoudig. De sensor communiceert via I2C met het adres 0x68. Voor het lezen van de versnellingsmeter en gyroscoop gegevens, moet de sensor men uit slaapwijze door te schrijven van 0 naar adres 0x6B, het power management-register. Vanaf daar kunnen de rauwe versnellingsmeter en gyroscoop lezingen worden gelezen vanaf adres 0x3B. Verwijzen naar de data sheet en registreren van de kaart voor de volledige functionaliteit.
Wanneer we eerst begon te spelen met de sensor, merkten we dat de onbewerkte gegevens niet precies naast luidruchtig was. Wij twee afzonderlijke technieken gebruikt deze problemen op te lossen. Na het bekijken van de gegevens, hebben we gemerkt dat de IMU lijkt te hebben een offset van de juiste lezingen. U kunt dit probleem oplossen, we de IMU op een niveau tafel geplaatst, waar we wisten dat de richting van elk van de as van de versnellingsmeter. Toen we namen en gemiddeld 5 metingen van de IMU. Vervolgens nam de bekende oriëntatie en het afgetrokken van de versnelling die het gaf ons. Het resultaat was een offset vector die was afgetrokken van elke IMU lezen. Dit de nauwkeurigheid van het systeem aanzienlijk toegenomen. Om op te lossen het probleem van lawaai hebben we een eenvoudige 5 punt gemiddeld filter gebruikt. In plaats van retourneren elke IMU lezen, wij slaan 5 lezingen en nemen van het gemiddelde van elke waarde. Dit geholpen elimineren van een eerlijke beetje van het lawaai dat we van de sensor zagen.
Hiervandaan hoopten wij deze informatie naar de FPGA, die de besturingselementen algoritme lopen zou te verzenden. Helaas, we hadden problemen uitvoering van de controles-algoritme in Verilog en besloten om het te implementeren in C. Vanwege dit, zodra een geldig IMU lezen was genomen, de RTO's taak zou dan de nodige motorsnelheid berekenen en stuur het naar de motor door middel van de PWM generatie blok. Terwijl dit de implementatie eenvoudiger gemaakt, zou het mooi geweest om uit te voeren de besturingselementen binnen de FPGA waarvan wij geloven dat de lus controle zouden hebben verbeterd.
Lezen van een Command Line Console
De console opdrachtregel was verantwoordelijk voor het verzenden van hoger niveau opdrachten en polling gegevens, zoals de IMU lezingen uit het systeem. De console opdrachtregel liep als een eigen taak en neemt in de gegevens van zowel de UART en de ESP8266. Hierdoor konden de console worden geëxploiteerd rechtstreeks vanaf een computer of via een draadloos netwerk. De taak geblokkeerd op een FreeRTOS wachtrij totdat gegevens beschikbaar was. De taak vervolgens beheerd als een statusmachine, lezen in een opdrachtnaam en gegevens. Als de opdracht geldig was zou dan het de bijbehorende code uitvoeren en wachten voor een andere opdracht. Dit toegestaan voor flexibele opdrachten en watertje hulpvaardig voor debuggen en commandant van het systeem.