Hoe bouw je een gevechtsrobot?
Door: Lucas van Stiphout en Johan Dijkstra
Klassen: V6C en V6A Vakken: informatica en natuurkunde Hoofdbegeleider: Dhr. Swaving Dijkstra Tweede begeleider: Dhr. Kok Vakdocenten: Dhr. Swaving Dijkstra en Dhr. Kok Inleverdatum: 12 december 2014
Inhoudsopgave: 1. Introductie §1.1 Voorwoord……….………………………………………………………….......... 2 §1.2 Inleiding………………………..……………………………………………...........3 §1.3 Werkplan…………………………………………………………………………….4 §1.3.1 Hoofdvraag………………………………………………………………………..4 §1.3.2 Plan van aanpak………………………………………………………………….4 2. Theorie §2.1 Arduino………………………………………………………………………………5 §2.2 Signalen…………………………………………………………………………......6 §2.2.1 Bluetooth………………………………………………………………………….6 §2.2.2 Servo PWM……………………………………………………………………….6 §2.2.3 PWM……………………………………………………………………………….7 §2.3 Programmeertaal van Arduino……………………………………………………8 §2.4 Onderdelen schakelsysteem…………………………………………………….10 3. Ontwerpfase §3.1 Design van de gevechtsrobot……………………………………………………12 §3.2 Benodigdheden……………………………………………………………………14 §3.3 Ontwikkeling en fouten…………………………………………………………...15 4. Het programmeren §4.1 Arduino IDE………………………………………………………………………..17 §4.2 Wat moet de code doen?..............................................................................18 §4.3 Uitleg code…………………………………………………………………………19 5. Onderzoek §5.1 PWM oscilloscoop………………………………………………………………...23 §5.2 Servo PWM oscilloscoop………………………………………………………...24 6. Resultaten 7. Conclusie Bronnen Logboek Bijlage code
1
§1.1 Voorwoord: Het kiezen van zoal de partner als het onderwerp was geen probleem, in de 5e klas waren we het er al over eens om samen te gaan werken. En als uit de lucht gevallen was daar ons onderwerp: "Gast we kunnen wel zo'n robot bouwen die je op tv ook vaak ziet met van die zieke wapens en zo". We gingen dus een battlebot, ofwel, gevechtsrobot bouwen. We hebben beiden de vakken informatica en natuurkunde. Met dat idee in ons hoofd zaten we zo alweer in de 6e klas. Het was tijd om een partner te kiezen, en ook een onderwerp. Wij lachten in ons vuistje want dat was al lang gedaan. Het idee was er, nu nog de uitvoering. Hoewel het een gezamelijk project was en we er natuurlijk ook beiden veel aan hebben gewerkt, wil ik (Lucas) toch in het speciaal Johan nog even bedanken. Hij was wel het mastermind achter dit project. Vooral het begin was lastig, waar moeten we beginnen? Veel zoek en denkwerk, maar met resultaat. "A journey of a thousand miles, begins with a single step" -Confusius
Illustratie van Chinese Filosoof Confusius
2
§1.2 Inleiding Een gevechtsrobot, zo heet wat wij hebben gemaakt. Het is alleen geen echte robot. Een robot is een apparaat dat dingen uit zichzelf uitvoert, de gevechtsrobot is op afstand bestuurbaar. "A robot is an automatic mechanical device often resembling a human or animal. Modern robots are usually an electro-mechanical machine guided by acomputer program or electronic circuitry. Robots can be autonomous or semi-autonomous and range from humanoids such as Honda's Advanced Step in Innovative Mobility (ASIMO) and TOSY's TOSY Ping Pong Playing Robot (TOPIO) to industrial robots, collectively programmed swarm robots, and even microscopic nano robots. By mimicking a lifelike appearance or automating movements, a robot may convey a sense of intelligence or thought of its own." Van wikipedia Goed, we spreken dus van een gevechtsrobot, maar niet van een echte robot. Een gevechtsrobot is een stevig voertuig met krachtige motoren en een wapen waarmee hij andere robots kan beschadigen. Het voertuig is van afstand te besturen. Hoewel het bouwen het meeste tijd heeft gekost, gaat het PWS met name over het programmeren van de robot. Normaal worden deze robots gebruikt ter vermaak en worden er wedstrijden mee gehouden. Omdat wij niet van plan zijn er echt mee te gaan vechten hebben wij gekozen voor beter bruikbare maar minder stevige materialen en een houten cirkelzaag omdat een echte nog wel eens een ongelukje kan opleveren.
3
§1.3 werkplan Hoofdvraag: Hoe bouw je een gevechtsrobot Deelvragen: Wat is er nodig voor een battlebot Hoe zorgen we er voor dat hij gaat rijden? Hoe gaan we dit programmeren? Hoe werkt het schakelschema? Overige benodigde handelingen? Hypothese: Omdat we niet echt een onderzoek hebben maar meer iets gaan bouwen, is het maken van een hypothese niet echt een mogelijk iets. Daarom maken we geen hypothese. We verwachten namelijk gewoon dat we een robot gaan bouwen die kan rijden en bestuurd kan worden etc. Werkwijze: We willen door middel van Arduino alle signalen verwerken, waardoor het bestuurbaar wordt via een Playstation 3 controller. De motor wordt aangeschaft en het omhulsel wordt door ons gebouwd. Informatiebronnen: -Arduino website www.arduino.cc Ter verduidelijking van sommige programmeeraspecten is wikipedia een prima bron, dus: -Wikipedia www.wikipedia.com Taken: 1. onderzoeken onderdelen en benodigdheden voor de gevechtsrobot: 6 uur. Groepstaak 2. onderdelen bestellen en/of ophalen van de kringloop/sloop: 2 uur. Groepstaak 3. bouwen van de kern van de robot. De arduino en motor ed: 5 uur. Groepstaak 4. programmeren van de robot, arduino. 15 uur. Groepstaak 5. testfase. Werkt alles goed? 0.5 uur. Groepstaak 6. bugs eruit halen en zorgen dat alles wel goed werkt. 4 uur. Dit waren zowel fouten in het bouwen van de robot als in het programmeren Groepstaak 7. omhulsel bouwen. afronden. 4 uur. Groepstaak. 8. dit verslag. 7,5 uur. Groepstaak 6. presentatiefase. 5 uur. Groepstaak De uiteindelijk tijden zijn iets anders gelopen dan verwacht. (zie logboek)
4
2.
Theorie
§2.1 Arduino Arduino is een fabricant die verschillende soorten computerplatformen ontwikkelt. De meest gangbare van allemaal is de Arduino Uno. Je zou dit de ruggengraat van het geraamte kunnen noemen. Hier kun je van alles aan toevoegen. Wij gebruiken voor onze gevechtsrobot een Arduino Uno en een Arduino usb host shield. De Uno(links) en de usb host shield(rechts)
De usb host shield kun je heel makkelijk op de Arduino Uno zetten, zoals getoond hier rechts. Het is dus eigenlijk gewoon een verlengstuk van de Uno. En het enige wat het toevoegt is de usb poort. Die toch wel van essentieel belang is om de robot te besturen. Meer hierover in de volgende paragraaf. Je ziet allerlei pinnen in de Arduino. De pinnen gebruik je om signalen door te sturen, dit wordt eveneens besproken in het volgende hoofdstuk. De processor in de Arduino werkt op een frequentie van 16 MHz. Dit betekent dat hij 16 miljoen berekeningen per seconde kan maken. Op de Arduino Uno zitten verder nog: • Een resetknop. Deze start de hele Arduino opnieuw op. Als je dus een programma uitvoert en je wil hem stoppen of resetten kun je deze knop gebruiken. • Een usb-aansluiting. Hiermee wordt de aansluiting van de Uno bedoeld. (zie afbeelding) Hiermee kun je contact maken met de computer om het programma op de Arduino te zetten, want het schrijven gaat uiteraard via de computer. • Een stroom ingang, want ja, de Arduino heeft natuurlijk ook stroomtoevoer nodig, anders doet hij niks. • En overige dingen wat er eigenlijk niet toe doet.
5
§2.2 Signalen Signalen worden gebruikt om verschillende apparaten met elkaar te laten communiceren. Dit wordt ook gebruikt bij onze robot. We maken hier gebruik van twee soorten signalen: Bluetooth en servo PWM. Zonder signalen zou de robot niet kunnen werken.
§2.2.1 Bluetooth Bluetooth wordt door veel apparaten gebruikt. Het is dan ook een standaard voor een verbinding tussen apparaten op een korte afstand. Bluetooth is ontwikkeld door de Nederlander Jaap Haartsen in 1994. Het is een radioverbinding van 2,4GHz, en wordt voornamelijk gebruikt data op kleine afstand te zenden en ontvangen. Een Arduino kan een verbinding maken met andere apparaten door middel van Bluetooth. Hiervoor zijn twee dingen nodig: een USB Host Shield en een Bluetooth USB dongle. Een USB Host Shield is een uitbreidingsschild voor Arduino, die gemakkelijk op de Arduino te zetten is. Met dit schild is het mogelijk om USB apparaten aan de sluiten op de Arduino. Door de dongle in de USB poort van het te zetten, kan er een Bluetooth verbinding worden gemaakt met apparaten, zoals bijvoorbeeld een smartphone of PlayStation 3 controller.
§2.2.2 Servo PWM PWM staat voor pulsewidthmodulation, ofwel pulsbreedtemodulatie. Servo PWM wordt gebruikt bij servo’s en snelheidsregelaars van bestuurbare auto’s. Het is een signaal dat voor bijna elke servo en snelheidsregelaar te gebruiken is. Het is een signaal van 50 Hz, wat dus betekent dat het elke 20 ms herhaald wordt, want T=1/f => T=1/50=0,020s. De breedte van de blokgolf, die 1,0 tot 2,0 ms breed kan zijn, bepaalt de positie van de servo of de spanning die de snelheidsregelaar geeft. Bij een breedte van 1,0 ms gaan de wielen met een maximale snelheid vooruit, bij een breedte van 1,5 ms staan de wielen stil en bij een breedte van 2,0 ms gaan de wielen met een maximale snelheid achteruit. De waarden tussenin bepalen de snelheid, dus een waarde van 1,25 ms zorgt ervoor dat de wielen met de helft van de maximale snelheid vooruit gaan.
6
§2.2.3 PWM Pwm, pulse width modulation, of in het Nederlands: pulsbreedtemodulatie. Met pulsbreedtemodulatie kun je door pulsen een spanning veranderen. Stel je hebt een maximale spanning van 20 volt. En je geeft per milliseconde een halve milliseconde die 20 volt. Dan geef je dus 0.5 milliseconde 20 volt en 0.5 milliseconde 0 volt. Dit resulteert in een gemiddelde spanning van 10 volt. Zie het plaatje hier rechts. Hoe langer je dus de puls aan doet per periode, hoe een hogere gemiddelde spanning je krijgt. Als je maximale spanning wil geven zijn de pulsen eigenlijk weg en is het een lange puls van 20v. De formule voor het berekenen van de effectieve spanning:
�!""!#$%!" =
Â
đ?‘?đ?‘˘đ?‘™đ?‘ đ?‘?đ?‘&#x;đ?‘’đ?‘’đ?‘‘đ?‘Ąđ?‘’ Ă—đ?‘‰!" đ?‘?đ?‘’đ?‘&#x;đ?‘–đ?‘œđ?‘‘đ?‘’
 7 Â
§2.3 Programmeertaal van Arduino Zoals eerder gezegd, is een Arduino een computerplatform dat zelf te programmeren is. Door middel van het programmaatje wat erop gezet is, kunnen inputs en outputs bestuurd worden. De programmeertaal van Arduino is gebaseerd op C en C++. Deze programmeertalen bestaan al tientallen jaren. Beide programmeertalen hebben veel weg van elkaar. De structuur en syntaxis is vrijwel gelijk. Elk Arduino programma heeft een basisstructuur. Dit bestaat uit een stuk code wat de Arduino in het begin uit moet voeren, en een stuk code wat de Arduino telkens weer uitvoert. void setup() {} laat de code die tussen accolades staat bij het opstarten van de Arduino uitvoeren. void loop() {} laat de code die tussen de accolades staat steeds weer opnieuw uitvoeren. De programmeertaal van Arduino kun je onderverdelen in drie stukken: structuur, variabelen en functies. De structuur gaat voornamelijk over de syntaxis van de programmeertaal. Hier de meestvoorkomende codes:
De structuur De if statement: dit vergelijkt een variabele met een andere waarde, en als het waar of niet waar is, dan voert het een code uit. Een voorbeeld hiervan is: als de leeftijd groter of gelijk is aan 18, dan is de persoon volwassen: if (leeftijd >= 18) volwassen = true; }
{
De if...else statement: doet hetzelfde als de if-statement, maar als de voorwaarde niet waar is als het waar moet zijn, of het is waar als het niet waar moet zijn, dan voert het de code uit tussen de accolades. Voorbeeld: if (leeftijd >= 18) volwassen = true; } else { volwassen = false; }
{
De variabelen Een programma heeft natuurlijk variabelen nodig. Variabelen zijn waarden die kunnen veranderen, maar er zijn ook vaste variabelen, constanten. Voorbeelden hiervan zijn booleans, integers en strings. Een boolean is een variabele die waar of niet waar kan zijn, dus true of false. Een integer is een geheel getal, dus 1, 2, 3, 4, enz. Een string is een stuk tekst tussen aanhalingstekens, dus bijvoorbeeld: "Hallo wereld, dit is een string!" Het maken van variabelen gebeurt voor de void setup() {}. Een voorbeeld hiervan is: int leeftijd = 18; Dit stukje code maakt de variabele leeftijd aan en geeft het ook alvast een waarde mee, namelijk: 18.
8
De functies Functies zijn stukken code die de processor uitvoert. Hierbij kun je denken aan wiskundige formules, zoals: constrain() en map(), maar bijvoorbeeld ook functies waarmee de input en output pins van de Arduino kunnen worden aangestuurd. Voorbeelden hiervan zijn: pinMode(), digitalWrite() en analogWrite(). pinMode() geeft aan welke pin gebruikt wordt en of het een input is of een output. digitalWrite() stuurt een waarde van hoog (5V) of laag (geen spanning) naar één van de Arduino pins. analogWrite() stuurt een waarde van 0-5V naar één van de Arduino pins. De hoogte van de spanning wordt bepaalt door PWM, wat eerder is behandeld. Door middel van al deze stukjes code is het mogelijk om geweldige programma’s te schrijven op de Arduino. Met een Arduino kun je mooie dingen doen: “If we all did the things we are really capable of doing, we would literally astound ourselves.” -Thomas A. Edison Voor een overzicht van alle codes die de programmeertaal van Arduino bevat, ga dan naar: http://arduino.cc/en/Reference/HomePage
9
§2.4 Onderdelen schakelsysteem Het schakelsysteem. Dit is nodig omdat de Arduino zelf niet voldoende spanning en stroom kan geven om de motor van de zaag te laten draaien. Voor de motoren die de wielen aandrijven hebben we zogenaamde speedcontrollers gebruikt. Die worden later behandeld. We kijken nu eerst naar het schakelschema:
Je ziet hier vanaf de Arduino als eerst R1, dat is een weerstand. Daarna komen een transistor, een diode en een relais, uiteindelijk mond het uit in de motor. Op de volgende pagina gaan we het schema per onderdeel behandelen.
10
Weerstand: Allereerst de weerstand, De weerstand zorgt ervoor dat de stroom die naar de transistor gaat niet te hoog wordt. I = U/R. De spanning blijft gelijk, en om een niet te hoge stroomsterkte te krijgen moeten we dus een hogere weerstand hebben, 1 kiloOhm ertussen dus. Arduino kan maximaal een stroomsterkte leveren van 40 milliampère. Als hij meer dan 40 milliampère moet leveren kan hij oververhit raken en kapot gaan. Transistor en relais: De transistor is een halfgeleidercomponent van een schakelsysteem, hij dient om vooral om elektronische signalen te versterken of te schakelen. Hier gebruiken we de transistor om de relais te activeren. Wanneer de transistor een signaal van de Darduino krijgt, (van 5V) loopt er een stroom door de relais en de transistor en sluit de schakelaar in de relais. De relais is een schakelaar die een andere schakeling open of dicht kan doen door een elektromagneet. Loopt er stroom door de relais, dan gaat de schakelaar dicht en kan er stroom naar de motor. Dan is er dus een gesloten stroomkring tussen de motor en de spanningsbron. Diode: Een diode is een elektronisch onderdeel dat de elektrische stroom zeer goed in ÊÊn richting geleidt, maar praktisch niet in de andere. Wanneer je de transistor uitschakelt, zorgt de verandering van het magneetveld voor een hoge spanning. Om ervoor te zorgen dat deze spanning de Arduino niet kapotmaakt, hebben we een diode parallel met het relais geplaatst en tegen de stroomrichting in.
đ?‘ˆ!"#$%&!' = đ?‘ Ă—
∆đ?œ™ ∆đ?‘Ą
Als je de transistor en daarmee dus het relais uitschakelt, verandert de ΔΌ in een korte tijd Δt is dus klein. Het aantal windingen van een spoel, N, is constant. Dat betekent dat de Uind, erg hoog wordt wanneer het relais uitgeschakeld wordt, want de teller van de breuk wordt groter en de noemer kleiner. Om deze hoge inductiespanning te verlagen, maken we gebruik van een diode. Deze diode zorgt ervoor dat de spanning niet te hoog wordt, want hij geleidt goed in de richting van de stroom wanneer het relais wordt uitgeschakeld en de richting van Uind is tegengesteld. De diode beschermt dus de Arduino en de transistor. Verder hebben we een led-lichtje aan de Arduino gekoppeld, zodat wanneer deze aan gaat het led-lichtje gaat branden. Om het lichtje en de Arduino niet te laten overbelasten hebben we een weerstandje nodig van ongeveer 250Ί. I=U/R. De spanning is 5 volt. Zonder een weerstand zou er dus te veel stroom doorheen gaan, omdat er dan alleen de weerstand van het lichtje is en die is laag. Als er een weerstand van 250Ί in serie mee zit dan krijg je I = 5/250 = 20 milliampère. 20 milliampère is het maximum wat de Arduino kan geven. Omdat we geen weerstand van 250Ί tot onze beschikking hadden en wel een van 330Ί hebben we een van 330 Ohm gebruikt. Het lampje brandt dus niet op zijn maximum.
Â
 11 Â
§3.1 Design van de gevechtsrobot Voordat we de robot konden maken moest er natuurlijk een design komen. Hij moest stevig zijn, er moet genoeg ruimte zijn om alle elektronica erin kwijt te kunnen, en we moesten bepalen wat voor wapen erop gezet moest worden. We hebben gekozen voor een horizontale cirkelzaag en hebben er geen echte cirkelzaag op gezet in verband met veiligheid en beschikbaarheid.
Dit is het 3D model. Nu we een model hebben gemaakt kunnen we beginnen met de robot zelf. De eerste vraag is: Wat voor materiaal gaan we gebruiken? Hoewel je bij een echte gevechtsrobot waarschijnlijk metaal wil gebruiken omdat het stevig is, hebben wij gekozen voor een houten robot. We gaan er namelijk niet echt mee vechten en het gaat om hoe je hem bouwt, het materiaal zou dan in principe dus niet uitmaken.
12
Even tekenen en je krijgt de onderkant van de robot:
We hebben het ruim genomen, zodat als we nog veranderingen willen aanbrengen er genoeg ruimte is om dat ook daadwerkelijk te doen. Er is ook gebleken dat dit wel nodig is geweest aangezien we de staven (daar zitten de batterijen in) nog hebben verplaatst. Het uiteindelijk ontwerp is daarom ook iets afgeweken van het oorspronkelijk 3D model.
13
§3.2 De benodigdheden Hier ter verduidelijking nog maar even alle benodigdheden op een rijtje.
Noodzakelijk • • • • • •
• • • • • • • • • • • • •
Een hoop geld. De Arduino Uno De Usb Host Shield Twee speedcontrolers Een computer, Windows of Linux geprefereerd. Bouwmateriaal • Hout • Moeren, bouten • Hoekijzers Twee wielen achter Een wieltje dat zowel verticaal als horizontaal kan draaien voor Batterijen en omhulsels daarvoor, of accu’s Motoren, wij hebben voor de kracht deze gehaald uit elektroboormachines. Bedrading Motor voor de cirkelzaag PlayStation 3 controller Bluetooth dongle Genoeg gereedschap Elastiek voor de zaag Weerstand 1 kilo-ohm Transistor Diode Relais
Optioneel. (Wel door ons gebruikt) • • • • • • • • •
Tiewraps Klemmen voor de batterijbuizen Arduino Stickers Achtergrondmuziek Schilders-en isoleertape 3 schakelaars Soldeerbout Soldeertin Spijkers
14
§3.3 Ontwikkeling en fouten Het ontwerp was klaar, het was tijd om aan het werk te gaan. Met wat hulp van techniek leraar meneer De Vries, was het omhulsel vrij snel uit het hout gezaagd. Op dat moment kwamen we tot de conclusie dat het handigst was om alles in elkaar te zetten met bouten, moeren en hoekijzers, omdat het hout maar 6mm dik is en het dan dus moeilijk is om alles vast te zetten met schroeven. Op naar de Gamma dus. We hebben nu een onderkant, een achterkant en de helft van 2 zijkanten. Tijd om de motoren er in te plaatsen door simpelweg een gat te boren in het hout en ze erin te duwen. Al hoewel ze vrij stevig stonden hebben we ook nog een houder voor de motoren gemaakt. Tot nu toe zijn we dus zo ver:
Vervolgens kunnen de wielen erop gezet worden, de Arduino erin, de speedcontrollers erin en de stroomtoevoer erop, zodat hij natuurlijk zo snel mogelijk kan rijden. De speedcontrollers gaan rechtstreeks naar de Arduino en krijgen vanaf daar signalen binnen. Aan de andere kant van de speedcontrollers zitten de batterijen, (7 AA batterijen per motor, wat een spanning van 10,5V zou moeten geven) en de motoren. De batterijen gaan in de buizen, en toen moesten we iets vinden om alles op z’n plek te houden en de batterijen aan de draden te verbinden. Hiervoor hebben we een snoer tussen een hoekijzer en een houtje gedaan, en daardoor heen een bout. Het hoekijzer en de bout geleiden de stroom vervolgens door naar en van de batterijen. Aan de achterkant kon gemakken een bout door de achterkant en daar zit het snoer stevig tussen een moer en een bout. Op de volgende pagina zie je hoe het nu ongeveer staat:
15
Ook de cirkelzaag (gemaakt van hout), is er al opgezet. Bij het testen bleek de zaag te zwaar voor de motor en kon de motor de zaag dus niet laten draaien. Deze is inmiddels veranderd.
Naast de zaag kwamen voor nog wat probleempjes te staan. Allereerst stond de robot te veel met zijn voorkant omhoog gebogen. Dit kwam omdat het wieltje te groot was. We hebben deze nu ingeruild voor een kleiner wieltje om dit zo veel mogelijk te verhelpen. Ook piepte het oude wieltje nog al en daar heeft het nieuwe wieltje geen last van. De grote wielen, daar zat veel te weinig grip op, dus kon hij niet optimaal rijden, omdat de wielen weg slipten over de grond. Ook dit was makkelijk op te lossen: nieuwe wieltjes met meer grip! Ook dat is nu gebeurd. De batterijen, even gebruikt, en leeg. Dat was ons volgende probleempje, en naast dat ze snel leeg waren, waren ze niet in staat erg veel vermogen te leveren en zo de optimale snelheid te bereiken. Er zaten 14 batterijen in en om nou elke keer nieuwe batterijen er in te doen is zonde van zowel het geld als het milieu. De oplossing daarvoor was duidelijk: nieuwe, betere en oplaadbare batterijen. We zijn uitgekomen op de LiPo batterij; Lithium Polymeer. De bovenkant, hij moet makkelijk eraf te halen zijn, maar je moet wel makkelijk bij de schakelaars kunnen. 2 verschillende bovenkanten dus. De buitenste om eraf te halen en binnen in de robot te werken. De binnenste om te blijven staan. De kleine middelste schakelaar zit tussen de Arduino en de batterij van de Arduino, deze schakelt dus de Arduino aan. De twee buitenste staan tussen de batterijen en de speedcontrollers, deze schakelen dus de motoren aan.
16
4.
Het programmeren
§4.1 Arduino IDE Het programmeren van de Arduino gaat natuurlijk niet zomaar in een tekstverwerker zoals Word of kladblok, het moet in een IDE gedaan worden. IDE staat voor Integrated Development Environment. De Arduino IDE maakt het gemakkelijk om de code te schrijven, vanwege het automatisch structuur en kleur geven aan de code en het herkennen van fouten. Verder compileert het de code naar iets wat de Arduino kan gebruiken, hexadecimale machinetaal. :100FF00097FDA095BA2F2BED35E040E050E0EDB71E :10100000FEB72183328343835483BC01CD0120E0AA :1010100030E040E050E0B5E7EB2EF12C012D112D32 :10102000A8EEAA2EA3E0BA2EC12CD12C0E94BD3569 :101030007093500160934F010F900F900F900F909D :101040008DED94E064EF70E00E94C73460914F0131 :10105000709150018DED94E04AE050E00E94AA3575 :101060008BE193E063E070E00E9403208A3808F48B :1010700046C08BE193E063E070E00E94032090E0C3 :101080009093500180934F0100D000D0AA2797FD84 :10109000A095BA2F20ED37E040E050E0EDB7FEB765 :1010A0002183328343835483BC01CD0129E830E09E :1010B00040E050E0FFEFEF2EF12C012D112DEDED72 :1010C000AE2EE5E0BE2EC12CD12C0E94BD35709312 :1010E00094E066EE70E00E94C73460914F01709109 :1010F00050018DED94E04AE050E00E94AA358BE16A :1011000093E062E070E00E940320853708F04CC055 :101030007093500160934F010F900F900F900F909D :101040008DED94E064EF70E00E94C73460914F0156 :10105000709150018DED94E04AE050E00E94AA3590 :101060008BE193E063E070E00E9403208A3808F45C Een voorbeeld van de machinetaal van de Arduino
De Arduino IDE
17
§4.2 Wat moet de code doen? Voor het laten rijden van de robot zijn signalen nodig. Deze signalen worden opgewekt door de PlayStation 3 controller. De Arduino verwerkt dus eigenlijk de signalen van deze controller en zorgt dat ze omgezet worden in een signaal waar de speedcontrollers iets mee kunnen. De snelheid van de motoren moet variabel zijn, zodat de robot kan draaien. Verder moet de zaag aan en uit worden gezet met de controller en moeten er meerdere manieren zijn om de robot te besturen.
§4.2.1 Signalen van de PS3 controller Wij hebben besloten om een PS3 controller te gebruiken, omdat deze makkelijk te gebruiken is in vergelijking met een smartphone. Bij een smartphone zouden we dan een hele applicatie moeten maken en wij hebben geen ervaring met de programmeertaal die Android gebruikt. Zoals eerder gezegd, stuurt een PS3 controller signalen via Bluetooth. Deze signalen worden verwerkt door de Arduino. De Arduino verwerkt de signalen en stuurt weer een signaal naar de snelheidsregelaars en die sturen uiteindelijk een bepaalde spanning naar de motoren. Het volgende figuur laat de verbindingen tussen de apparaten zien.
In dit figuur is te zien, dat de signalen via Bluetooth worden verstuurd. De PS3 controller stuurt constant data naar de Arduino. De data bestaat uit welke knoppen er ingedrukt zijn en wat de stand van thumbsticks’ is. De stand van de thumbstick is analoog en wordt in de controller omgezet naar een binair getal. Dit is een getal van 28=256. Dit betekent dat de waarde 0 tot 256 kan zijn. Bij 0 is de thumbstick helemaal omhoog of links en bij 255 helemaal omlaag of rechts.
18
§4.3 Uitleg code De Arduino ontvangt dus deze signalen, maar doet daar verder niks mee als het niet geprogrammeerd is om iets met deze signalen te doen. Om de controller te verbinden met de Arduino, en zijn signalen te herkennen maken wij gebruik van een ‘library’. Dit is een uitbreiding van de standaardcode. Om gebruik te maken van zo’n library, moet het eerst aangeroepen worden in de code. Dit gebeurt met #include en daarna de library die je toe wilt voegen tussen groter dan en kleiner dan haakjes. De volgende libraries hebben wij gebruikt: #include <Servo.h> #include <PS3BT.h> #include <usbhub.h> #ifdef dobogusinclude #include <spi4teensy3.h> #endif Deze code zorgt voor alle extra codes die het programma nodig heeft. Aan het begin van de code zeg je dus welke libraries je wilt gebruiken. Verder kun je in het begin instanties maken en variabelen creëren. USB Usb; BTD Btd(&Usb); codes daarvan PS3BT PS3(&Btd); daarvan
Dit zorgt ervoor dat de usb poort gebruikt kan worden Dit maakt de instantie van de Bluetooth dongle, zodat de gebruikt kunnen worden Dit maakt de instantie van de PS3 controller, zodat de codes gebruikt kunnen worden
Verder hebben wij twee servo instanties gemaakt voor de twee motoren. De motoren heten Mlinks en Mrechts. Servo Mlinks; Servo Mrechts; Hiermee kunnen de codes verbonden aan de motoren worden gebruikt. Mlinks.writeMicroseconds(links); Mrechts.writeMicroseconds(rechts); Deze code stuurt het aantal microseconden (1000-2000) per 20 milliseconden (20.000 microseconden) naar de snelheidsregelaars. De variabelen links en rechts zijn een waarde tussen 1000 en 2000. 1000 is maximaal vooruit en 2000 maximaal achteruit. Bij 1500 draait de motor niet. De variabelen worden daarna aangemaakt. De code hiervoor is erg simpel. int links = 1500; int rechts = 1500; boolean zaag = false; (het type variabele) (de naam van de variabele) = (de waarde die aan het begin wordt meegegeven);
19
Links en rechts zijn dus integers, wat betekent dat het hele getallen zijn. Zaag is een boolean, wat betekent dat het waar of niet waar kan zijn, oftewel aan of niet aan. De waarde is in het begin false, omdat de zaag in het begin nog niet moet draaien. Het volgende stuk code is de void setup() {}. Zoals eerder gezegd gebeurt dit alleen bij het opstarten van de Arduino. In dit gedeelte worden de pins van de Arduino gedefinieerd als input of output. De snelheidsregelaars, het lampje en de zaag gebruiken in totaal vier van deze pins. We hebben de onderstaande code gebruikt om ervoor te zorgen dat de Arduino stroom kan sturen naar deze pins: pinMode(3,OUTPUT); pinMode(4,OUTPUT); Mlinks.attach(5); Mrechts.attach(6);
Maakt van pin 3 een output voor het led lampje Maakt van pin 3 een output voor de zaag Met deze code weet de Arduino dat de snelheidsregelaars op de 5e en 6e pin zijn aangesloten
Om te kijken of onze code werkt naar behoren, hebben we ervoor gezorgd dat de Arduino data stuurt naar de computer wanneer het aangesloten is via een usb kabel. De Arduino stuurt deze data serieel, vandaar dat de code voor het beginnen van deze verbinding Serial.begin(115200) is. 115200 is de snelheid waarmee de data verstuurd wordt. Dit is gelijk aan 11,52 kbit/s. Het versturen van data is erg simpel. Hiervoor is de volgende code gebruikt: Serial.print(). Het volgende stukje code stuurt een string naar de computer, vandaar de aanhalingstekens. De string begint op een nieuw regel, dit is te bereiken met \r\n. Serial.print(F("\r\nBattleBot is geactiveerd, verbind de PS3-controller."));
Het grootste gedeelte van de code, is de void loop() {}. De Arduino voert deze code de hele tijd achter elkaar uit. Hier moet dus de signaalverwerking komen. We willen alleen dat dat de Arduino signalen verwerkt wanneer de PS3 controller verbonden is. Vandaar dat de het tussen de volgende code staat: if (PS3.PS3Connected) {}. Hier staat: als de PS3 controller verbonden is, voer dan de code tussen de accolades uit. Om de stand van de thumbsticks op te halen, wordt PS3.getAnalogHat() gebruikt. Tussen de haakjes komt de as te staan van welke thumbstick er gelezen moet worden. PS3.getAnalogHat(LeftHatY) haalt bijvoorbeeld de Y-waarde van de linker thumbstick op. Bij een waarde van 0 is deze helemaal omhoog en bij een waarde van 255 helemaal omlaag. Omdat het moeilijk is om een thumbstick precies in het midden te krijgen, hebben we gebruik gemaakt van een ''dead zone''. Dit zorgt ervoor dat de wielen niet draaien wanneer de thumbstick ongeveer in het midden is. De dead zone bevindt zich tussen 117 en 137. Dit betekent dat er een speling is van 10 in beide richtingen, voordat de snelheidsregelaars een signaal krijgen.
20
De waarden worden opgeslagen in de eerder aangemaakte variabelen links en rechts. Daarna wordt het door de volgende functie gehaald: map(). Deze functie heeft vijf voorwaarden nodig voordat het een waarde teruggeeft. map(de variabele, de minimale waarde die de functie accepteert, de maximale waarde die de functie accepteert, de minimale waarde die de functie teruggeeft, de maximale waarde die de functie teruggeeft); Met deze functie is het mogelijk om variabelen op schaal te veranderen. map(x, 0, 10, 50, 100) neemt bijvoorbeeld van x alleen de waarden 1 tot 10, en zet ze daarna op een schaal van 50 tot 100. Als x=6, dan geeft deze functie ((100-50)/(10-0))/6+50=80 terug. map() geeft altijd een integer (heel getal) terug. De waarde die uit de functie map() komt, wordt daarna naar de snelheidsregelaar gestuurd. Dat gebeurt met deze eerder behandelde code: Mlinks.writeMicroseconds(links);. Verder willen we dat de Arduino de verbinding verbreekt met PS3 controller wanneer er op de PS knop wordt gedrukt. De code hiervoor is: PS3.disconnect(); Ook moet er van besturingstype worden gewisseld. Door de knop select in te drukken, verandert de variabele besturing. Wanneer deze gelijk is aan 1, dan verandert de Arduino deze waarde naar 2. Wanneer het 2 is, verandert de Arduino het naar 3 en wanneer het 3 is, verandert de Arduino de waarde terug naar 1. Dit gebeurt met dit stukje code: if (PS3.getButtonClick(SELECT)) { if (besturing == 1 || besturing == 2) { besturing = besturing++; } else { besturing = 1; } Om te weten te komen welke besturing actief is, laten we de led lichten van de PS3 controller branden. Als besturing 1 actief is, dan brandt het eerste led lichtje van de controller. Eerst gaan alle lichten uit daarna gaat het goede led lichtje aan PS3.setLedOff(); PS3.setLedOn(LED1);
21
Omdat we niet willen dat de robot op hol slaat wanneer de PS3 contoller niet verbonden is, hebben we een soort van dodemansknop toegevoegd aan de code. Dit gebeurt in de code na if (PS3.PS3Connected) {}. Het moet dus gebeuren als deze functie false teruggeeft. Dit doen we door middel van else. if (PS3.PS3Connected) {} else { //hier de code voor de dodemansknop } Na else stuurt de Arduino een signaal naar de snelheidsregelaars dat ze moeten stoppen, en ook dat de zaag moet stoppen met draaien, als deze aan is. Voor een volledige uitleg is de code ook voorzien van commentaar.
22
5. Onderzoek §5.1 PWM oscilloscoop Om onze verwachtingen over de theorie te bevestigen hebben we een aantal metingen gedaan met een oscilloscoop. Allereerst over PWM, de spanning die de speedcontrollers geven aan de motoren.
Linksboven zie je de pulsen die worden gegenereerd als de thumbstick 50% naar boven is gericht. De speedcontroller geeft dus 50% van de maximale spanning door 50% van de tijd puls geen spanning te geven en 50% van de tijd max. (Deze pulsen verlopen heel snel) Als de robot op 12 volt zou lopen zouden de motoren op het plaatje linksboven dus op 6 volt draaien. Rechtsboven op 12 volt. (100%) Linksonder op 3 volt (25%) en rechtsonder op 9 volt (75%) Wanneer de thumbstick naar achteren is, dan krijg je deze metingen alleen horizontaal gespiegeld. Vanwege de kwaliteit van de speedcontrollers die wij hebben gebruikt, is het geen perfecte blokgolf. Maar het werkt volgens onze verwachtingen.
23
§5.2 Servo PWM oscilloscoop Als tweede hebben we de servo PWM signalen van de Arduino naar de speedcontrollers gemeten. We hebben de volgende waarden gekregen: 0,69 aan t.o.v. een periode van 6,9 centimeter met de thumbstick helemaal naar voren. 0,51 aan t.o.v. een periode van 6,9 centimeter met de thumbstick in het midden. 0,38 aan t.o.v. een periode van 6,9 centimeter met de thumbstick helemaal naar achter We weten al dat bij de servo PWM de pulsen 1 tot 2 milliseconde zijn ten opzichte van de totale 20 milliseconde. De totale 6,9 centimeter van de puls op de oscilloscoop stelt dus de 20 milliseconde voor. Als je 0,69 centimeter deelt door 6,9 centimeter kom je uit op 0,1. Dat staat dus gelijk aan 2 milliseconde tegenover 20 milliseconde. 0,51/6,9=0,0739. Dat komt ook ongeveer over met 1,5/20 wat het midden van het signaal betekent en dus het midden van de thumbstick. Als laatste de 0,38 delen door 6,9. Dan kom je op 0.055. Deze wijkt een klein beetje af met de waarde die het zou moeten zijn. 1/20=0,05. Dit zal te maken hebben met een kleine meetfout. Maar over het algemeen komen de resultaten overeen met de theorie.
24
6.Resultaten We hebben de robot niet op tijd af kunnen krijgen, want alleen de cirkelzaag zit er nog niet op. De motor die verbonden is aan deze zaag, draait wel. Verder reed de robot eerst goed, maar vanwege lege batterijen rijdt hij nu nog maar langzaam. Dit gaan we oplossen door LiPo accu’s op de snelheidsregelaars aan te sluiten. De resultaten van het onderzoek met de oscilloscoop zijn bijna hetzelfde als onze verwachtingen. Servo PWM was precies hetzelfde zoals voorspeld, maar PWM was geen blokgolf vanwege de kwaliteit van de snelheidsregelaars. Als de robot van metaal gemaakt zou zijn, zou het in principe mee kunnen doen aan echte gevechtsrobot wedstrijden.
25
7.Conclusie Het programmeren is goed. We hebben wel enige tegenslagen gehad, maar dat is uiteindelijk goed gekomen. De code doet wat hij moet doen, de Arduino werkt naar behoren en de robot kan rijden. Verder werkt het schakelsysteem ook goed. Het was goedkoper en beter om dit zelf te maken en dit is gelukt. Er konden nog wel wat dingen beter. We hebben namelijk een paar niet-bruikbare componenten gekocht. Hierdoor hebben we dus een paar dingen niet gebruikt, maar wel vervangen door de goede componenten. Aan de robot zou in principe nog wel wat veranderd kunnen worden. Zo zou het compacter gemaakt kunnen worden, of van metaal en krachtigere motoren. Onze robot is eigenlijk niet geschikt om mee te doen aan wedstrijden, maar dat is ook onze bedoeling geweest. We wilden namelijk niet dat de robot gevaarlijk zou worden. Kortom: de signalen worden goed verwerkt door de Arduino, de code en de robot werken goed.
26
Bronnen http://en.wikipedia.org/wiki/Integrated_development_environment http://arduino.cc/en/Reference/HomePage http://arduino.cc/en/Reference/Servo https://github.com/felis/USB_Host_Shield_2.0 http://en.wikipedia.org/wiki/Bluetooth http://nl.wikipedia.org/wiki/Inductie_(elektriciteit) http://nl.wikipedia.org/wiki/Arduino_(computerplatform) http://nl.wikipedia.org/wiki/Transistor http://nl.wikipedia.org/wiki/Diode http://nl.wikipedia.org/wiki/Relais http://nl.wikipedia.org/wiki/Weerstand_(component) http://nl.wikipedia.org/wiki/Pulsbreedtemodulatie
27
Logboek: Voorexamenklas → 15 uur Dinsdag 19 augustus - PP 10:20 - 14:30 PWS dag, werkplan maken → 8,5 uur Vrijdag 26 september - PP 14:30 - 15:30 Naar kringloop voor materiaal → 2 uur Dinsdag 30 september - PP 12:50 - 15:30PWS dag → 5 uur Vrijdag 10 oktober - Johan 18:00- 21:00 Inlezen → 3 uur Maandag 13 oktober - Lucas 19:00 - 21:00 Inlezen → 2 uur Dinsdag 14 oktober - PP 20:00 - 22:00 Inlezen Arduino → 4 uur Donderdag 16 oktober - PP 9:00 - 17:00 Programmeren → 16 uur Maandag 27 oktober - PP 10:00 - 11:10, 12:00 - 12:50 3D model → 4 uur Dinsdag 28 oktober - PP 12:00 - 13:40 Robot ontwerpen → 3 uur Donderdag 30 oktober - PP 13:00-15:30 Robot ontwerpen → 5 uur Vrijdag 31 oktober - PP 9:30 - 15:30 Robot ontwerpen → 12 uur Maandag 3 november - PP 10:00 - 11:10, 12:00 - 12:50 Robot maken → 4 uur Dinsdag 4 november - PP 12:00 - 13:40 Robot maken → 3 uur Maandag 10 november - PP 10:00 - 11:10, 12:00 - 12:50 Robot maken → 4 uur Dinsdag 11 november - PP 12:00 - 13:40 Robot maken → 3 uur Maandag 17 november - PP 10:00 - 11:10, 12:00 - 12:50 → 4 uur Dinsdag 18 november - PP 12:00 - 13:40 Robot maken → 3 uur Donderdag 20 november - PP 12:00 - 13:40 Robot maken → 3 uur Dinsdag 25 november - J 11:10 - 14:00. L 12:00 - 14:00 Robot maken → 5 uur Donderdag 27 november - PP 12:00 tot 14:30 Verslag → 5 uur Donderdag 27 november - Lucas 21:00 - 22:00 Verslag → 1 uur Maandag 1 december - PP 10:00 - 11:10, 12:00 - 12:50 13:40 - 14:30 Verslag→ 5,5uur Maandag 1 december - PP 17:00 - 21:00 Verslag → 8 uur Dinsdag 2 december - PP 12:00 - 13:40 Robot maken → 3 uur Dinsdag 2 december - Lucas 19:00 - 21:00 Verslag → 2 uur Dinsdag 9 december - PP 11:10 - 12:50 Verslag → 3 uur Woensdag 10 december - PP 19:00 - 21:00 Verslag → 4 uur Donderdag 11 december - PP 19:30 – 21:00 Verslag → 3 uur ________+ 133 uur
28