Bygga en robotarm för Science Olympiad (9 / 14 steg)
Steg 9: P.3, kod: genomföra seriell kommunikation
För denna tutorial, jag antar att du väljer att använda en Arduino med möjlighet att seriell kommunikation via USB (så, inte en Arduino Pro Mini eller kala Atmega chip) och att använda C, C++, eller en annan C-baserade språk som Objective-C (vad vi gjorde) på datorns sida för att styra armen. Jag antar också att du använder ett UNIX-baserat operativsystem såsom OSX (vad vi gjorde) eller linux. Koden för att skicka seriella överföringar är olika på windows - du kan fortfarande följa med resten av handledning, men du måste göra ändringar i några rader kod (jag syftar till popen och pclose, som inte fungerar på windows såvitt jag vet - jag kan ha fel).
Målet med din hela programpaketet är att fastställa en uppsättning koordinater och gripdon (främst, på eller av) för armen bläddra plocka och placera objekten i styrelsen, och sedan skicka dessa koordinater som en ström av servo vinklar till Arduino, som kommer att översätta denna information in i servo PWM pulser. Eftersom platserna för alla objekt är kända före tävlingen, kommer platserna att hårdkodade, med möjlighet att justera dem något under de tre minuters springa för små variationer i spelplanen.
Så låt oss komma igång!
Den första uppgiften är att skriva några grundläggande kod som tar användarindata från konsolen och skicka den till Arduino. Mikrokontroller sedan svarar genom att ställa in vinkeln på en servo till användaren ingång. Felkontroll användardata är inte nödvändig på denna punkt eftersom vi kan anta att i slutändan hårdkodade servo vinkel platser inte kommer att ha fel, och att alla användare input kommer att ske genom ett GUI som inte lider av fel om användaren mosar på slumpmässiga nycklar i konsolen... eftersom det brukar vara en konsol.
I C används popen för att komma åt kommandon, mycket som man skulle göra med hjälp av kommandoraden. Skicka data till Arduino skulle se ut så här på datorns sida (i Objective-C):
.. .i filen .h:
(i deklarationen)
NSString * serialPort;
.. .i .m filen:
(i init-metoden)
serialPort = [[NSString alloc] initWithString:
... några kod...
(i sändnings-metoden)
NSString * str = [NSString stringWithFormat: % @ > % toBeSent, serialPort]; Fil * avsändare = popen (toSend, "r");
char * toSend = [str UTF8String];
pclose(Sender);
Dessa rader kod skulle överföra sträng toBeSent till Arduino på seriell port /dev/tty.usbmodemfd121.
För att hitta den seriella porten som din Arduino sitter på, allt du behöver göra är plugg den i, och titta på det namn som visas under Verktyg > Serial Port i verktyget Arduino. Ska du se till att du kopplar din Arduino i samma USB-port för att detta skall förbli detsamma.
Uppgiften att hämta numeriska indata från konsolen och skicka det via seriell lämnas till läsaren... om du inte vill att fuska genom att ta en titt på exempelkoden jag ingår. Om du bygga och köra det med Xcode, och skriv in siffrorna mellan 0 och 176 (gränserna för den särskild servo vi testade med), bör det ge samma produktion som på bilden längst upp:
sh: /dev/tty.usbmodemfd121: Permission denied
Som inte ser bra ut! Det, dock säger oss att kommandot echo framgångsrikt kallas, men att det finns ingen "/ dev/tty.usbmodemfd121". För att åtgärda detta, måste vi ansluta en Arduino.