Brobot: Känslomässigt lyhörd roboten (6 / 6 steg)
Steg 6: kod!
Jag har tagit 4 filer som du kan ladda ner:
Brobot.apk:
Detta är den app jag gjorde med MIT App uppfinnare, en gratis online android app IDE. Sätt denna filen på din Android-enhet, och det kommer att dyka upp som ett program. Ovan ser du hur jag skrev denna app i App Inventor. Du kan utforma menyn layout med knappar och alternativ, då går du till en block där du faktiskt kan programmera app med förinställda block. Detta gör programmering mycket enkelt.
Brobot.zip:
Zippade mappen innehåller Brobot.h och Brobot.cpp.
Brobot.h innehåller Brobot klass funktion instansieringar, variabeldeklarationer och lite kartor för alla känslor visas på LED ögon. Dessa lite kartor kan jag inte ändra hur varje känslor ser snabbt genom att ändra varje bit individuellt.
Brobot.cpp innehåller alla funktionsdefinitioner för klassen Brobot. De viktigaste funktionerna här inkluderar:
updateFace: denna funktion styr vad Brobot för närvarande visar känslor och vilka känslor han kommer visar nästa. Den hanterar också de slumpmässiga blinkar och vad LCD-skärmen visar.
playComplete: funktionen hanterar de olika ljud som Brobot kommer att göra beroende på sina känslor.
checkProx: detta är den funktion som avgör om Brobot bör omedelbart stoppa vad han gör och agera förvånad. Det genererar en interrrupt.
brobot_sketch.zip:
Denna mapp är självförklarande. Den innehåller de viktigaste skiss som jag skrev för Brobot. Det i princip instansierar alla Brobot's timers och variabler, och uppdateras inför varje slinga. Den hanterar också alla servo kontroll eftersom av någon anledning inte kunde jag få servon att arbeta i sin egen funktion i Brobot.cpp. Alla servon har nuvarande och nästa vinkel variabler som aktiverar servon att flytta en eller mindre gånger någonsin loop tills den nuvarande vinkeln är lika med net vinkeln.
BBSounds.zip:
Denna mapp innehåller alla wav-filer för varje ljud Brobot kan göra. För att läsa in dessa på wave skölden, bara pop ut SD-kortet, lägga den i din dator, och dra och släppa vilka ljud du vill använda för Brobot på SD-kortet. Sedan pop bara det tillbaka in i wave sköld, ändra filnamnen i playComplete funktion att filnamnen du laddat på kortet, och lyssna till Brobot göra roliga ljud! Alla den fria öppen källkod ljud var hämtat från th
/*************************************************************
Brobot: Header-fil
Den här filen innehåller Brobot klass funktion och variabel
deklarationer som ledde bitmapparna för varje känsla
Programmerare: Chris Frazier
Datum: 4/8/2015
**************************************************************/
#ifndef BROBOT_H
#define BROBOT_H
#include "Arduino.h"
#include "C:\Users\ChristopherEvan\Documents\Arduino\libraries\Wire\Wire.h"
#include "C:\Users\ChristopherEvan\Documents\Arduino\libraries\SoftwareServo\SoftwareServo.h"
#include "C:\Users\ChristopherEvan\Documents\Arduino\libraries\Adafruit_LEDBackpack\Adafruit_LEDBackpack.h"
#include "C:\Users\ChristopherEvan\Documents\Arduino\libraries\Adafruit_GFX\Adafruit_GFX.h"
#include "C:\Users\ChristopherEvan\Documents\Arduino\libraries\WaveHC\FatReader.h"
#include "C:\Users\ChristopherEvan\Documents\Arduino\libraries\WaveHC\SdReader.h"
#include
#include "C:\Users\ChristopherEvan\Documents\Arduino\libraries\WaveHC\WaveUtil.h"
#include "C:\Users\ChristopherEvan\Documents\Arduino\libraries\WaveHC\WaveHC.h"
#include "C:\Users\ChristopherEvan\Documents\Arduino\libraries\LiquidCrystal_I2C\LiquidCrystal_I2C.h"
Varje känslor representeras av ett heltal från 0 - 6
#define NEUTRAL 0xF0
#define glad 0xF1
#define SAD 0xF2
#define arga 0xF3
#define FÖRVÅNADE 0xF4
#define kärlek 0xF5
#define BLINK 0xF6
#define NECK_SPEED 1
#define MAX_TILT_ANGLE 135
#define MIN_TILT_ANGLE 65
#define MAX_PAN_ANGLE 120
#define MIN_PAN_ANGLE 40
klass Brobot {
offentlig:
Brobot (byte byte byte, byte, byte, byte); Konstruktören
void setup();
void setEmotion(byte); Tillåter huvudfilen komma åt nuvarande känslor
void updateFace();
bool checkProx();
void playComplete();
void playFile(char*);
byte freeRam();
void sdErrorCheck();
void checkBT();
SoftwareServo pan;
SoftwareServo tilt;
SoftwareServo leftBrow;
SoftwareServo rightBrow;
byte currentEmotion;
byte nextEmotion;
byte incomingByte;
byte currentPanAngle;
byte currentTiltAngle;
byte nextPanAngle;
byte nextTiltAngle;
byte currentLBAngle;
byte currentRBAngle;
byte nextLBAngle;
byte nextRBAngle;
byte neckSpeed;
byte neckTimer;
bool headMoveToggle;
bool upToggle;
bool downToggle;
bool leftToggle;
bool rightToggle;
bool soundToggle;
bool togglePause;
SdReader kort; Detta objekt innehåller information för kortet
FatVolume vol; Detta innehåller information för partitionen på kortet
FatReader rot. Detta innehåller information för filsystemet på kortet
FatReader f; Detta innehåller information för filen vi är spelar
WaveHC våg; Detta är enda våg (audio)-objektet, eftersom vi bara kommer att spela en i taget
privat:
void displayString(const char *);
byte previousEmotion;
byte blinkTimer;
byte surpriseTimer;
byte triggerPin;
byte echoPin;
bool _setup;
byte randSound;
byte k;
char myChar;
};
#endif
statisk const uint8_t PROGMEM
happyL_bmp [] =
{B00000000,
B00011100,
B00100100,
B01011100,
B01011100,
B00100100,
B00011100,
B00000000},
happyR_bmp [] =
{B00000000,
B00011100,
B00100100,
B01011100,
B01011100,
B00100100,
B00011100,
B00000000},
neutralL_bmp [] =
{B00000000,
B00111100,
B01000010,
B01011010,
B01011010,
B01000010,
B00111100,
B00000000},
neutralR_bmp [] =
{B00000000,
B00111100,
B01000010,
B01011010,
B01011010,
B01000010,
B00111100,
B00000000},
angryL_bmp [] =
{B00000000,
B00001100,
B00010010,
B00111010,
B01011010,
B11000010,
B00111100,
B00000000},
angryR_bmp [] =
{B00000000,
B00111100,
B11000010,
B01011010,
B00111010,
B00010010,
B00001100,
B00000000},
surprisedL_bmp [] =
{B01111110,
B10000001,
B10000001,
B10011001,
B10011001,
B10000001,
B10000001,
B01111110},
surprisedR_bmp [] =
{B01111110,
B10000001,
B10000001,
B10011001,
B10011001,
B10000001,
B10000001,
B01111110},
sadL_bmp [] =
{B00000000,
B00111100,
B01000010,
B01011010,
B00111010,
B00010010,
B00001100,
B00000000},
sadR_bmp [] =
{B00000000,
B00001100,
B00010010,
B00111010,
B01011010,
B01000010,
B00111100,
B00000000},
loveL_bmp [] =
{B01111000,
B10000100,
B10000010,
B01011001,
B01011001,
B10000010,
B10000100,
B01111000},
loveR_bmp [] =
{B01111000,
B10000100,
B10000010,
B01011001,
B01011001,
B10000010,
B10000100,
B01111000},
blink_bmp [] =
{B00000000,
B00000100,
B00000010,
B00000010,
B00000010,
B00000010,
B00000100,
B00000000};
< p > / *** < br > / / Brobot: källfilen
Den här filen innehåller funktionen Brobot klass
definitioner
Programmerare: Chris Frazier
Datum: 4/8/2015
/ < /p >< p > #include "Brobot.h" < /p >< p > / / Skapa led matrix-förekomst med hjälp av Adafruits bibliotek
Adafruit_8x16matrix ledmatrix = Adafruit_8x16matrix();
LiquidCrystal_I2C myDisplay = LiquidCrystal_I2C (0x27, 16, 2);
spara några meddelanden
CONST char känslor [] PROGMEM = {"känslor:"};
CONST char Tom [PROGMEM] = {""};
CONST char Hej [PROGMEM] = {"Hej,"};
CONST char imBrobot [] PROGMEM = {"Jag är Brobot!"};
CONST char neutrala [] PROGMEM = {"NEUTRAL"};
CONST char glad [] PROGMEM = {"HAPPY"};
CONST char sorgliga [] PROGMEM = {"SAD"};
CONST char arg [] PROGMEM = {"arg"};
CONST char överraskade [PROGMEM] = {"SURPRISED"};
CONST char älskar [PROGMEM] = {"älskar"};
Konstruktör: låter användaren ställa in stiften
Brobot::Brobot (byte pp, byte tp, byte lbp, byte rbp, byte ep, byte trgp) {
triggerPin = trgp;
echoPin = ep;
neckTimer = 0;
neckSpeed = NECK_SPEED;
previousEmotion = NEUTRAL;
currentEmotion = HAPPY;
nextEmotion = HAPPY;
pinMode (echoPin, ingång); Ange pinmodes för prox sensor
pinMode (triggerPin, produktionen);
soundToggle = false;
togglePause = false;
} < /p >< p > void Brobot::displayString (const char * meddelande) {
för (k = 0; k < 15; k ++)
{
myChar = pgm_read_byte_near (meddelande + k);
myDisplay.print(myChar);
}
} < /p >< p > / / används under installationen. initierar Brobots ansikte
void Brobot::setup() {
ledmatrix.BEGIN(0x70);
myDisplay.init(); initiera lcd
myDisplay.backlight (); //this tänds bakgrundsbelysningen
displayString(hello);
Detta ställer markören på skärmen till den andra raden och 9 teckenposition i den raden
myDisplay.setCursor(1,8);
Vi skriver sedan ut vid markörens position
displayString(imBrobot);
playComplete();
Delay(2000);
myDisplay.setCursor(0,0);
displayString(emotion);
myDisplay.setCursor(1,8);
displayString(neutral);
_setup = sant;
updateFace();
_setup = false;
} < /p >< p > / / tillåter att huvudfilen till nästa känslor
void Brobot::setEmotion(byte i) {
nextEmotion = i.
} < /p >< p > / / beslutar vilka känslor att visa på Brobots ansikte
void Brobot::updateFace() {
Genererar slumpmässiga blinkar
om (currentEmotion! = BLINK) {
IF(Random(1000) == 0) {
nextEmotion = BLINK;
blinkTimer = 50;
}
} / / minskar blinkar timer för att se till att Brobot inte somna!
annat if (currentEmotion == BLINK) {
om (blinkTimer > 0) {
blinkTimer--;
}
annat {
Återgå till föregående känslor efter blink
nextEmotion = previousEmotion;
}
} / / Kontrollera prox sensor och överraska Brobot
om (! _setup & &! togglePause) {
om (checkProx()) {
nextEmotion = SURPRISED;
surpriseTimer = 100;
} / / Kontrollera att Brobot inte går in i chock!
annat if(!checkProx()) {
om (surpriseTimer > 0) {
surpriseTimer--;
}
annars om (currentEmotion! = BLINK) {
om (nextEmotion == currentEmotion) {
Återgå till föregående känslor efter överraskning
nextEmotion = previousEmotion;
}
}
}
}
Ändra känslor om nästa känslor är olika
Detta förhindrar att uppdatera varje slinga och slösa kraft
om (nextEmotion! = currentEmotion) {
om (nextEmotion == NEUTRAL) {
ledmatrix.Clear();
ledmatrix.drawBitmap (0, 0, neutralR_bmp, 8, 8, LED_ON);
ledmatrix.writeDisplay();
ledmatrix.drawBitmap (0, 8, neutralL_bmp, 8, 8, LED_ON);
ledmatrix.writeDisplay();
currentEmotion = NEUTRAL;
previousEmotion = NEUTRAL;
myDisplay.setCursor(1,8);
displayString(neutral);
soundToggle = sant;
}
annat if (nextEmotion == HAPPY) {
ledmatrix.Clear();
ledmatrix.drawBitmap (0, 0, happyR_bmp, 8, 8, LED_ON);
ledmatrix.writeDisplay();
ledmatrix.drawBitmap (0, 8, happyL_bmp, 8, 8, LED_ON);
ledmatrix.writeDisplay();
currentEmotion = HAPPY;
previousEmotion = HAPPY;
myDisplay.setCursor(1,8);
displayString(happy);
soundToggle = sant;
}
annat if (nextEmotion == SAD) {
ledmatrix.Clear();
ledmatrix.drawBitmap (0, 0, sadR_bmp, 8, 8, LED_ON);
ledmatrix.writeDisplay();
ledmatrix.drawBitmap (0, 8, sadL_bmp, 8, 8, LED_ON);
ledmatrix.writeDisplay();
currentEmotion = SAD;
previousEmotion = SAD;
myDisplay.setCursor(1,8);
displayString(sad);
soundToggle = sant;
}
annat if (nextEmotion == arg) {
ledmatrix.Clear();
ledmatrix.drawBitmap (0, 0, angryR_bmp, 8, 8, LED_ON);
ledmatrix.writeDisplay();
ledmatrix.drawBitmap (0, 8, angryL_bmp, 8, 8, LED_ON);
ledmatrix.writeDisplay();
currentEmotion = arg;
previousEmotion = arg;
myDisplay.setCursor(1,8);
displayString(angry);
soundToggle = sant;
}
annat if (nextEmotion == SURPRISED) {
ledmatrix.Clear();
ledmatrix.drawBitmap (0, 0, surprisedR_bmp, 8, 8, LED_ON);
ledmatrix.writeDisplay();
ledmatrix.drawBitmap (0, 8, surprisedL_bmp, 8, 8, LED_ON);
ledmatrix.writeDisplay();
currentEmotion = SURPRISED;
myDisplay.setCursor(1,8);
displayString(surprised);
soundToggle = sant;
}
annat if (nextEmotion == kärlek) {
ledmatrix.Clear();
ledmatrix.drawBitmap (0, 0, loveR_bmp, 8, 8, LED_ON);
ledmatrix.writeDisplay();
ledmatrix.drawBitmap (0, 8, loveL_bmp, 8, 8, LED_ON);
ledmatrix.writeDisplay();
currentEmotion = kärlek;
previousEmotion = kärlek;
myDisplay.setCursor(1,8);
displayString(love);
soundToggle = sant;
}
annat if (nextEmotion == BLINK) {
ledmatrix.Clear();
ledmatrix.drawBitmap (0, 0, blink_bmp, 8, 8, LED_ON);
ledmatrix.writeDisplay();
ledmatrix.drawBitmap (0, 8, blink_bmp, 8, 8, LED_ON);
ledmatrix.writeDisplay();
currentEmotion = BLINK;
}
} SoftwareServo::refresh();
} < /p >< p > / / kolla och se om någon är alltför nära Brobot
bool Brobot::checkProx() {
digitalWrite (triggerPin, hög); göra en 10usec puls
delayMicroseconds(10); < /p >< p > digitalWrite (triggerPin, låg); < /p >< p > flyta avstånd = pulseIn (echoPin, hög); nu läsa den puls som skickas tillbaka av sensorn
pulseIn returnerar puls längd i usec < /p >< p > avstånd = avstånd / 58;
om (avstånd < 6) {
return true;
}
annat {
returnera false;
}
} < /p >< p > void Brobot::checkBT() {
samtidigt (Serial.available()) {
Delay(3);
incomingByte = Serial.read();
}
om ((incomingByte < 0xFE) & & (incomingByte > = 0xE0)) {
Ställa in känslor motsvarande byte som tas emot
om (incomingByte > -1) {
Serial.println(incomingByte);
setEmotion(incomingByte);
IF(incomingByte == 0xE0) {
headMoveToggle =! headMoveToggle;
}
IF(incomingByte == 0xE1) {
upToggle =! upToggle;
}
annat if(incomingByte == 0xE3) {
leftToggle =! leftToggle;
}
annat if(incomingByte == 0xE2) {
rightToggle =! rightToggle;
}
annat if(incomingByte == 0xE4) {
downToggle =! downToggle;
}
}
incomingByte = -1;
}
} < /p >< p > / / spelar en full fil från början till slut med ingen paus.
void Brobot::playComplete() {
Ring vår hjälpare för att hitta och spela detta namn
SoftwareServo::refresh();
Delay(30); < /p >< p > if(currentEmotion == NEUTRAL) {
randSound = random(1,15);
IF(randSound == 1) {
playFile ("NEUT1. WAV");
}
annat if(randSound == 2) {
playFile ("NEUT2. WAV");
}
}
annat if(currentEmotion == HAPPY) {
randSound = random(1,3);
IF(randSound == 1) {
playFile ("HAPPY1. WAV");
}
annat if(randSound == 2) {
playFile ("HAPPY2. WAV");
}
annat if(randSound == 3) {
playFile ("HAPPY3. WAV");
}
}
annat if(currentEmotion == SAD) {
randSound = random(1,3);
IF(randSound == 1) {
playFile ("SAD1. WAV");
}
annat if(randSound == 2) {
playFile ("SAD2. WAV");
}
annat if(randSound == 3) {
playFile ("SAD3. WAV");
}
annat if(randSound == 4) {
playFile ("SAD4. WAV");
}
}
annat if(currentEmotion == ANGRY) {
randSound = random(1,3);
IF(randSound == 1) {
playFile ("ANGRY1. WAV");
}
annat if(randSound == 2) {
playFile ("ANGRY2. WAV");
}
annat if(randSound == 3) {
playFile ("ANGRY3. WAV");
}
}
annat if(currentEmotion == SURPRISED) {
randSound = random(1,6);
IF(randSound == 1) {
playFile ("SURP1. WAV");
}
annat if(randSound == 2) {
playFile ("SURP2. WAV");
}
annat if(randSound == 3) {
playFile ("SURP3. WAV");
}
annat if(randSound == 4) {
playFile ("SURP4. WAV");
}
annat if(randSound == 5) {
playFile ("SURP6. WAV");
}
annat if(randSound == 6) {
playFile ("SURP6. WAV");
}
}
annat if(currentEmotion == LOVE) {
randSound = random(1,3);
IF(randSound == 1) {
playFile ("LOVE1. WAV");
}
annat if(randSound == 2) {
playFile ("LOVE2. WAV");
}
annat if(randSound == 3) {
playFile ("LOVE3. WAV");
}
} soundToggle = false; < /p >< p > while(wave.isplaying) {
pausa
}
dess gjort spelar nu
}
void Brobot::playFile(char *name) {
se om objektet våg för närvarande gör något
om (wave.isplaying) {/ / redan spelar något, så sluta det!
Wave.stop(); Sluta
}
titta i rotkatalogen och öppna filen
om (! f.open (rot, namn)) {
putstring kunde inte ("öppna filen"); Serial.Print(Name); hemkomst.
}
OK läsa filen och förvandla det till en våg objekt
om (! wave.create(f)) {
putstring_nl ("inte en giltig WAV"); hemkomst.
}
OK dags att spela! starta uppspelningen
Wave.Play();
}
Denna behändiga funktionen returnerar antalet byte för närvarande gratis i RAM, bra för felsökning!
byte Brobot::freeRam(void)
{
extern int __bss_end;
extern int * __brkval;
int free_memory;
om ((int) __brkval == 0) {
free_memory = ((int) & free_memory)-((int) & __bss_end);
}
annat {
free_memory = ((int) & free_memory)-((int) __brkval);
}
återvända free_memory;
} < /p >< p > void Brobot::sdErrorCheck(void)
{
om (! card.errorCode()) återvända;
putstring ("\n\rSD I/O fel:");
Serial.Print(Card.ErrorCode(), HEX);
putstring (",");
Serial.println(Card.errorData(), HEX);
While(1);
} < /p >< p > / *** < br > / / Brobot: Main File
Den här filen innehåller setup och körning slingan för Arduino
medan Brobot är i drift.
Programmerare: Chris Frazier
Datum: 4/8/2015
/ < /p >< p > #include "Wire.h"
#include "SoftwareServo.h"
#include "Adafruit_LEDBackpack.h"
#include "Adafruit_GFX.h"
#include
#include
#include "WaveHC.h" < /p >< p > #define panPin 14 / / detta är pan servo pin
#define tiltPin 15 / / detta är tilt servo pin
#define leftBrowPin 16 / / Detta är den vänstra ögonbryn servo pin
#define rightBrowPin 17 / / detta är den högra ögonbryn servo pin
#define echoPin 8 / / detta är echo pin
#define triggerPin 7 / / detta är trigger PIN-koden < /p >< p > / / Skapa en instans av Brobot
Brobot myBrobot (panPin, tiltPin, leftBrowPin, rightBrowPin, echoPin, triggerPin); < /p >< p > void setup() {
Serial.BEGIN(9600); Ange baudvärde för serial protocol
putstring ("fri slå ned:"); Detta kan hjälpa till med felsökning, slut RAM är dålig
Serial.println(myBrobot.freeRam()); om detta är under 150 byte kan det stava problem!
Ställa in produktionen stift för DAC kontroll. Detta stift definieras i biblioteket
pinMode (2, utgång);
pinMode (3, OUTPUT);
pinMode (4, OUTPUT);
pinMode (5, OUTPUT);
om (! card.init(true)) {//play med 4 MHz spi om 8MHz inte fungerar för dig
om (! myBrobot.card.init()) {//play med 8 MHz spi (standard snabbare!)
putstring_nl ("kort init. misslyckades!"); Något gick fel, kan skriva ut varför
myBrobot.sdErrorCheck();
While(1); sedan 'stoppa' - gör ingenting!
}
Aktivera optimera Läs - vissa kort kan timeout. Inaktivera om du har problem
myBrobot.card.partialBlockRead(true);
Nu söker vi en FAT-partition!
uint8_t del;
för (del = 0; del < 5; del ++) {/ / vi har upp till 5 platser att titta i
om (myBrobot.vol.init (myBrobot.card, del))
bryta; Vi hittade en, låter borgen
}
om (del == 5) {/ / om vi slutade inte att hitta en :(
putstring_nl ("ingen giltig FAT-partition!");
myBrobot.sdErrorCheck(); Något gick fel, kan skriva ut varför
While(1); sedan 'stoppa' - gör ingenting!
}
Kan tala om för användaren om vad vi hittade
putstring ("använda partition");
Serial.Print (del, DEC);
putstring (", typ är FAT");
Serial.println(myBrobot.Vol.fatType(),dec); FAT16 eller FAT32?
Försök öppna rotkatalogen
om (! myBrobot.root.openRoot(myBrobot.vol)) {
putstring_nl kan inte ("öppna rotfästa dir!"); Något gick fel,
While(1); sedan 'stoppa' - gör ingenting!
}
Initiera Brobots alla offentliga
myBrobot.incomingByte = -1;
myBrobot.currentPanAngle = 90.
myBrobot.currentTiltAngle = 90.
myBrobot.nextPanAngle = 90.
myBrobot.nextTiltAngle = 90.
myBrobot.currentLBAngle = 90.
myBrobot.currentRBAngle = 90.
myBrobot.neckTimer = 400.
myBrobot.neckSpeed = NECK_SPEED;
myBrobot.headMoveToggle = 0;
myBrobot.leftToggle = 0;
myBrobot.rightToggle = 0;
myBrobot.upToggle = 0;
myBrobot.downToggle = 0;
Kör Brobot setup-funktionen (initierar LED ögon)
myBrobot.setup();
Bifoga och initiera alla 4 servon
myBrobot.pan.attach(panPin);
myBrobot.tilt.attach(tiltPin);
myBrobot.leftBrow.attach(leftBrowPin);
myBrobot.rightBrow.attach(rightBrowPin);
myBrobot.pan.write(myBrobot.currentPanAngle);
Delay(20);
myBrobot.tilt.write(myBrobot.currentTiltAngle);
myBrobot.leftBrow.write(myBrobot.currentLBAngle);
myBrobot.rightBrow.write(myBrobot.currentRBAngle);
SoftwareServo::refresh();
Delay(20);
myBrobot.updateFace();
Delay(2000);
SoftwareServo::refresh();
}
void loop()
{
För varje loop kontroll för Bluetooth data
myBrobot.checkBT();
Följande kod anger Brobots ögonbryn positioner
// - -
IF(myBrobot.nextEmotion == neutral) {
myBrobot.togglePause = sant;
myBrobot.nextLBAngle = 90.
myBrobot.nextRBAngle = 90.
medan ((myBrobot.currentLBAngle! = myBrobot.nextLBAngle) || (myBrobot.currentRBAngle! = myBrobot.nextRBAngle)) {
IF(myBrobot.currentLBAngle < myBrobot.nextLBAngle) {
myBrobot.currentLBAngle++;
}
annat if(myBrobot.currentLBAngle > myBrobot.nextLBAngle) {
myBrobot.currentLBAngle--;
}
IF(myBrobot.currentRBAngle < myBrobot.nextRBAngle) {
myBrobot.currentRBAngle++;
}
annat if(myBrobot.currentRBAngle > myBrobot.nextRBAngle) {
myBrobot.currentRBAngle--;
}
myBrobot.leftBrow.write(myBrobot.currentLBAngle);
myBrobot.rightBrow.write(myBrobot.currentRBAngle);
SoftwareServo::refresh();
}
om ((myBrobot.currentLBAngle == myBrobot.nextLBAngle) & & (myBrobot.currentRBAngle == myBrobot.nextRBAngle)) {
myBrobot.togglePause = false;
//}
}
// / \
annat if (myBrobot.nextEmotion == SURPRISED || myBrobot.nextEmotion == HAPPY || myBrobot.nextEmotion == SAD || myBrobot.nextEmotion == kärlek) {
myBrobot.togglePause = sant;
myBrobot.nextLBAngle = 120;
myBrobot.nextRBAngle = 60.
medan ((myBrobot.currentLBAngle! = myBrobot.nextLBAngle) || (myBrobot.currentRBAngle! = myBrobot.nextRBAngle)) {
IF(myBrobot.currentLBAngle < myBrobot.nextLBAngle) {
myBrobot.currentLBAngle++;
}
annat if(myBrobot.currentLBAngle > myBrobot.nextLBAngle) {
myBrobot.currentLBAngle--;
}
IF(myBrobot.currentRBAngle < myBrobot.nextRBAngle) {
myBrobot.currentLBAngle++;
}
annat if(myBrobot.currentRBAngle > myBrobot.nextRBAngle) {
myBrobot.currentRBAngle--;
}
myBrobot.leftBrow.write(myBrobot.currentLBAngle);
myBrobot.rightBrow.write(myBrobot.currentRBAngle);
SoftwareServo::refresh();
}
om ((myBrobot.currentLBAngle == myBrobot.nextLBAngle) & & (myBrobot.currentRBAngle == myBrobot.nextRBAngle)) {
myBrobot.togglePause = false;
//}
}
// \ /
annat if(myBrobot.nextEmotion == ANGRY) {
myBrobot.togglePause = sant;
myBrobot.nextLBAngle = 60.
myBrobot.nextRBAngle = 120;
medan ((myBrobot.currentLBAngle! = myBrobot.nextLBAngle) || (myBrobot.currentRBAngle! = myBrobot.nextRBAngle)) {
IF(myBrobot.currentLBAngle < myBrobot.nextLBAngle) {
myBrobot.currentLBAngle++;
}
annat if(myBrobot.currentLBAngle > myBrobot.nextLBAngle) {
myBrobot.currentLBAngle--;
}
IF(myBrobot.currentRBAngle < myBrobot.nextRBAngle) {
myBrobot.currentRBAngle++;
}
annat if(myBrobot.currentRBAngle > myBrobot.nextRBAngle) {
myBrobot.currentRBAngle--;
}
myBrobot.leftBrow.write(myBrobot.currentLBAngle);
myBrobot.rightBrow.write(myBrobot.currentRBAngle);
SoftwareServo::refresh();
}
om ((myBrobot.currentLBAngle == myBrobot.nextLBAngle) & & (myBrobot.currentRBAngle == myBrobot.nextRBAngle)) {
myBrobot.togglePause = false;
//}
}
SoftwareServo::refresh();
Uppdatera Brobots ansikte varje slinga
myBrobot.updateFace();
/ * Följande kod styr pan/tilt hals servon
Brobot ser slumpmässigt i en definierad uppsättning vinklar för både pan och tilt.
Varje slinga, om den aktuella variabeln servo ståndpunkt inte är i samma position
som variabeln nästa position, servon kommer increment/minska nuvarande
vinkel 1 som behövs. Variabeln neckSpeed orsakar pan/tilt servon till endast
ändra alla * neckspeed * loop cykel. Variabeln neckTimer orsakar Brobot att pausa
innan i en annan riktning.
*/
IF(myBrobot.headMoveToggle == 0) {
om (myBrobot.currentPanAngle == myBrobot.nextPanAngle) {
IF(myBrobot.neckTimer == 0) {
myBrobot.nextPanAngle = random (MIN_PAN_ANGLE, MAX_PAN_ANGLE);
myBrobot.nextTiltAngle = random (MIN_TILT_ANGLE, MAX_TILT_ANGLE);
}
annat {
myBrobot.neckTimer--;
}
}
annat {
myBrobot.neckSpeed--;
myBrobot.neckTimer = random (60, 80);
IF(myBrobot.neckSpeed == 0) {
IF(Millis() % 2 == 0) {
IF(myBrobot.currentPanAngle < myBrobot.nextPanAngle) {
myBrobot.currentPanAngle++;
}
annat if(myBrobot.currentPanAngle > myBrobot.nextPanAngle) {
myBrobot.currentPanAngle--;
}
myBrobot.pan.write(myBrobot.currentPanAngle);
SoftwareServo::refresh();
Delay(10);
}
annat {
IF(myBrobot.currentTiltAngle < myBrobot.nextTiltAngle) {
myBrobot.currentTiltAngle++;
}
annat if(myBrobot.currentTiltAngle > myBrobot.nextTiltAngle) {
myBrobot.currentTiltAngle--;
}
myBrobot.tilt.write(myBrobot.currentTiltAngle);
SoftwareServo::refresh();
}
myBrobot.neckSpeed = NECK_SPEED;
}
}
}
annat {
myBrobot.neckSpeed--;
IF(myBrobot.neckSpeed == 0) {
om (myBrobot.currentTiltAngle < = MAX_TILT_ANGLE) {
IF(myBrobot.upToggle) {
myBrobot.currentTiltAngle++;
}
}
om (myBrobot.currentTiltAngle > = MIN_TILT_ANGLE) {
IF(myBrobot.downToggle) {
myBrobot.currentTiltAngle--;
}
}
om (myBrobot.currentPanAngle < = MAX_PAN_ANGLE) {
IF(myBrobot.rightToggle) {
myBrobot.currentPanAngle++;
}
}
om (myBrobot.currentPanAngle > = MIN_PAN_ANGLE) {
IF(myBrobot.leftToggle) {
myBrobot.currentPanAngle--;
}
}
myBrobot.pan.write(myBrobot.currentPanAngle);
myBrobot.tilt.write(myBrobot.currentTiltAngle);
SoftwareServo::refresh();
Delay(10);
myBrobot.neckSpeed = NECK_SPEED;
}
}
om (myBrobot.soundToggle & &! myBrobot.togglePause) {
SoftwareServo::refresh();
Delay(200);
myBrobot.playComplete();
}
} < /p >