Stap 5: De code, de ziel
Het meest interessante deel, het is waar al je harde werk tot nu toe vruchten zullen afwerpen. We hebben gewerkt om te zorgen voor alle fysieke details, nu, wat over de emotionele ones? : p
Om te beginnen moet u naar de Arduino IDE geïnstalleerd voor uw OS, dan u handmatig installeren de Adafruit bibliotheek moet om te kunnen bepalen van de NeoPixel in het geval dat je hebt besloten om ze te gebruiken.
Bijgevoegd is de volledige code van oiO vanaf het moment dat ik dit schrijf. Hij krijgt definitief meer code en onderwijs als ik ga :) Merk op dat de code gekalibreerd is om te werken met de sensoren en de servo's die ik gebruikte, dus misschien is dat het niet zinvol voor u wanneer u het probeert. U zult moeten vele proeven doorlopen totdat je de goede waarden (meer hierover in de volgende sectie)
Introductie
Voor mij is het hele punt achter dit project dat oiO interactieve en autonoom, op zijn eigen. Hij moet blijven verstrekken zijn hoofdfunctie, geeft je licht, maar hij heeft ook zijn humeur, en stemmingswisselingen, verandert van houding en communiceert met de gebruiker.
Maar er was een uitdaging voor mij, samengevat in de onderstaande punten
1) hoe kan ik 3 servo's verplaatsen op hetzelfde moment, of afzonderlijk indien nodig
2) hoe kan ik verlichten de bewegingen, en voeren sommige versoepelen om te simuleren een vloeiende bewegingen. Ook hebben sommige controle op de snelheid van de servo's te simuleren van verschillende gedragingen.
3) hoe kan ik lezen en controleren van alle sensoren en servo's parallel te weten dat Arduino niet natively multitasking steunt.
4) hoe kan ik van oiO gedrag geloofwaardig en vermijden van robotic reacties op soortgelijke ingangen, als ik wil hem anders reageren voor dezelfde input (geluid en nabijheid), alle dit wetende dat de Arduino gewoon de code van boven naar beneden en vervolgens lussen leest
5) oiO dient te beschikken over een gevoel voor tijd voorbij, een wet volgens het.
Dit alles gebeuren met 32KB dynamisch geheugen beschikbaar op de Arduino voor de code, en terwijl het houden van het eenvoudig!
Na 2 dagen van het schrijven van code, ik denk dat ik mijn doelen bereikt en beantwoordt de vijf vraag op een acceptabele wijze met enkele compromissen.
We kunnen debatteren over hoe goed ik deed dit en hoe geloofwaardig is, maar einde van de dag, de video die je zag, is met behulp van slechts 17% van het geheugen van de code, en er is veel ruimte voor verbeteringen, die ik zal blijven nastreven. maar omdat u de code hebt, schrijf me een suggestie, of gewoon het delen van uw verbeteringen.
In de volgende secties zal ik deel enkele fragmenten van code die ik voelde ik wil bespreken, laat ik aan jou lezen van de volledige code en gevoel van het maken, ook het is zwaar commentaar om te helpen beter te begrijpen, en voor mij te herinneren de details 3 maanden vanaf nu:). Ik hoop dat ik niet over doen!
Punten 1 & 2
3 servo's tegelijkertijd verplaatsen op Arduino is niet mogelijk native. dus moest ik een functie schrijven die duurt 3 servo's en 3 doel posities voor elk, naast een versoepeling factor om te controleren de snelheid en het gemak van servo's. De functie bepaalt de servo's met behulp van writeMicroseconds() in plaats van write(), als de voormalige geeft meer controle vanwege zijn breder scala van waarden, beheersing van de servo's door het instellen van de exacte pulsbreedte van PWM in milliseconden, in plaats van de laatste die gebruikers hoekige graden.
De functie is:
void <strong>move3Servos</strong>(Servo <strong>servo1Name</strong>, float<strong> target_pos1</strong>,Servo <strong>servo2Name</strong>, float <strong>target_pos2</strong>,Servo <strong>servo3Name</strong>, float <strong>target_pos3</strong>,float <strong>easing</strong>)<br>
- target_posX: grenzen aan begin en eind posities, tussen 600 en 2400 mS heeft, enkele servo's werken tussen 1000 en 2000... Please check je servo's grenzen tests of gegevensblad voordat u de waarden
-versoepeling: is een waarde tussen 0,0 en 5.0, waar:
-waarden tussen 0.0 te 1.0 oorzaak de servo's om te beginnen verkeer snel maar eindigen slowely, waarden van rond nul (ex: 0.05) geeft veel langzamer/gewenste reactie van vloeiendheid, waarde van 0.1 is snel genoeg
-waarden tussen 1.0 en 5.0, worden niet beschouwd als versoepeling van factoren, zoals ze een verandering in gedrag veroorzaken, veroorzaken servo's verplaatsen lineair beginnen om te stoppen met x stappen afhankelijk van de opgegeven waarde. Waarde van 2.0 is schildpad snelheid, terwijl een waarde van 5.0 relatief snel is.
Om te simuleren gelijktijdige controle van de 3 servo's, het besturingselement van de functie elke servo één stap tegelijk, maar in een rij, dat wil zeggen, verplaatst servo1 een heel klein stapje, dan beweegt servo 2 een heel klein stapje, vervolgens servo3 op dezelfde manier, dan dit weer doet en agin in een lus tot alle servo's had bereikt de standpunten van hun doel. Het eindresultaat, alle servo's lijken te hebben verplaatst op hetzelfde moment naar hun doel-posities.
Punten 3 & 4
Om aan te pakken dit, was de truc om te scheiden lezen de sensoren waarde van daadwerkelijk optreden op de servo's en de ogen. Dit kan ik maken tellers die geluid tellen en de daaruit voortvloeiende detecties nabijheid en timing tussen die keren ook te meten. Deze tellers en tijdstempels kunnen later zelfstandig worden gebruikt in het deel die inwerken op de servo's en de ogen. Ik test voor waarden van de items en zie hoe lang het duurde de gebruiker tussen elke detectie. Dit is bijvoorbeeld hoe oiO onderscheid kan maken tussen een gebruiker hem 3 keer op snelle wijze benadert, aldus oiO boos met rode ogen en schokkerige bewegingen te maken, of als de gebruiker hem achter elkaar in een langzame manier benaderde, waardoor oiO rustiger met warmere kleur van de ogen en sierlijke bewegingen...
In een notendop, sensoren waarde eerste krijgen, dan treden later. maar aangezien de Arduino loop snel genoeg loopt, de gebruiker zal de vertraging merken.
Punt 5
Aangezien de Arduino niet met een externe timing bron verbonden is, kan niet dus het vertellen de absolute tijd, dus oiO is met behulp van de interne timing van Arduino met behulp van de functie millis() die het aantal milliseconden sinds de start/reset van de Arduino telt. De toonbank rolt over na de aprox. 50 dagen, meer dan genoeg voor de hele levenscyclus van oiO. Dit moet genoeg zijn voor het berekenen van bijvoorbeeld: 15 minuten verstreken zo doen dit en dat, of is het 60 seconden die de gebruiker niet met oiO communiceren.
Dit is bijvoorbeeld hoe oiO zal detecteren die de gebruiker niet interactief met hem sinds 1 uur, en dienovereenkomstig begint Dommelen, gevolgd door diepe slaap!
...
//oiO will go to sleep if no action by user for more than 'sleepIfNoActionTimer' seconds
if((millis() - lastAction) > sleepIfNoActionTimer) { doseOff(); }
< p > //oiO elke min van de 'sneezeTimer' (zal niet worden opgenomen als een handeling van de gebruiker) zal niezen < /p > if(millis() % sneezeTimer == 0) {sneeze();} <p>//oiO will sneeze each 'sneezeTimer' min (will not be recorded as a user action)</p>if(millis() % sneezeTimer == 0) { sneeze(); } ...
Controle van de ogen
Ik heb de Adafruit bibliotheek gebruikt als ze bieden interessante functies om te controleren de NeoPixels, voegde ik heb enkele functies zoals setEyesColor() en dimmer() te gemakkelijk toegang hebben tot het instellen van beide ogen kleuren en ook bepalen het dimmen op een bepaalde kleur met een bepaalde snelheid en richting.
void dimmer(int a, int b, int red, int green, int blue,int fadeDirection, int stepSpeed)
een: min helderheid
b: max helderheid
r, g, b: zijn de RGB-kleuronderdelen, elke kan hebben een waarde tussen 0-255
fadeDirection: 1 kan = omhoog, 2 = omlaag, 3 = updown
stepSpeed, vertraging in milliseconden tussen kleur vervagen stappen
Conclusie
Ik sterk aanbevelen lezen van de code en begrijpen en breng indien nodig wijzigingen. Alle variabelen in de fase van de initialisatie van de code (dwz vóór en binnen de setup()) moet worden ingesteld volgens uw behoeften.