Stap 9: P.3, Code: implementeren van seriële communicatie
Voor de toepassing van deze tutorial, mij zal veronderstellen dat je ervoor kiest om het gebruik van een Arduino met de mogelijkheid voor seriële communicatie via USB (dus, niet een Arduino Pro Mini of blote Atmega-chip) en dat u C, C++ gebruiken zult, of een andere C-gebaseerde taal zoals Objective-C (wat we deden) aan de kant van de computer voor het beheersen van de arm. Ook zal ik neem aan dat u een UNIX-gebaseerd besturingssysteem zoals OSX (wat we deden) of linux gebruikt. De code voor het verzenden van seriële overbrengingen is anders op Vensters - u kunt nog steeds volgen samen met de rest van de tutorial, maar u moet wijzigingen aanbrengen in een paar lijnen van code (ik verwijs naar popen en pclose, die niet werken op windows, voor zover ik weet - ik zou verkeerd kunnen zijn).
Het doel van uw gehele softwarepakket zal zijn om te bepalen van een set van coördinaten en grijper Staten (voornamelijk, in- of uitschakelen) voor de arm om te doorlopen om te kiezen en de plaats van de objecten op het bord, en vervolgens voor het verzenden van deze coördinaten als een stroom van servo hoeken aan de Arduino, die deze informatie in servo PWM pulsen zal vertalen. Omdat de locaties van alle objecten zijn bekend vóór de wedstrijd, zullen de locaties hardgecodeerde, met de optie van het aanpassen van hen iets tijdens de drie minuten lopen om de rekening voor lichte variaties in het bord.
Dus laten we aan de slag!
De eerste taak is het schrijven van sommige basic-code die zal nemen input van de gebruiker van de console en het verzenden van de Arduino. De microcontroller zal dan reageren door het instellen van de hoek van een servo op de input van de gebruiker. Fout bij het controleren van de input van de gebruiker is niet noodzakelijk op dit punt omdat we aannemen kunnen dat uiteindelijk de hardcoded servo hoek locaties zal geen fouten, en dat elke gebruiker input zal gebeuren door middel van een GUI die fouten niet zal lijden als de gebruiker mashes op willekeurige toetsen in de console... omdat er niet zal worden van een console.
In C, wordt popen gebruikt om de toegang van systeemopdrachten, veel als men zou doen met behulp van de opdrachtregel. Verzenden van gegevens naar de Arduino zou als volgt uitzien (in Objective-C) aan van de computer:
.. .in de .h bestand:
(in de verklaring)
NSString * serialPort;
.. .in het .m bestand:
(in de methode init)
serialPort = [[NSString VERD] initWithString:
... wat code...
(in de transmit methode)
NSString * str = [NSString stringWithFormat: % @ > % toBeSent, serialPort];
char * toSend = [str UTF8String];
BESTAND * afzender = popen (toSend, "r");
pclose(Sender);
Deze coderegels zou zenden de tekenreeks toBeSent aan de Arduino op seriële poort /dev/tty.usbmodemfd121.
Om te zoeken naar de seriële poort die je Arduino zit op, alles wat je hoeft te doen is plug het in, en kijk op de naam die wordt weergegeven onder Tools > Serial Port in het hulpprogramma voor Arduino-code. U zult willen ervoor zorgen dat u uw Arduino aansluit op dezelfde USB-poort voor dit om te blijven hetzelfde.
De taak van numerieke invoer vanuit de console ophalen en verzenden dat het via seriële wordt overgelaten aan de lezer... tenzij je wilt te bedriegen door het nemen van een blik op de voorbeeldcode die ik opgenomen. Als u bouwen voeren met Xcode en typ in getallen tussen 0 en 176 (de grenzen van de bijzondere servo we met testen waren), moet het dezelfde output als de afbeelding boven rendement:
sh: /dev/tty.usbmodemfd121: Permission denied
Dat ziet er niet goed! Het, echter, vertelt ons dat de opdracht echo wordt met succes genoemd, maar dat er geen "/ dev/tty.usbmodemfd121". Om dit te verhelpen, moet we verbinden van een Arduino.