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 >

Se Steg
Relaterade Ämnen

En SK450 död katt Quadcopter att kalla din egen

Innan vi börjar vill jag bara ta den första meningen i detta Instructable att du vet att det finns inga döda katter inblandade i att göra den quadcopter som beskrivs i de kommande stegen. Anledningen till att titeln på detta Instructable innehåller "...

Pingbot - Micro RC uppladdningsbara musikaliska Robot Pal

Pingbot är en mycket liten (38mm diameter), usb Laddningsbar, programmerbar, musikal, fjärrkontrollen robot utformad för maximalt nöje och danceability.Jag har byggt några experimentella robotar tidigare och för att vara ärlig, de alla såg delen. De...

Hur till spår din Robot med OpenCV

UPPDATERING: Låter göra robotar, mitt hem digital hackerspace, köptes av RobotShop. Jag vill inte gå in, men de nya ägarna förbjudit mig själv och de flesta veteran medlemmarna. Som sagt, de flesta av länkarna där kommer att brytas. Lyckligtvis kunde...

Musikaliska Melodyian MIDI Robot

Hälsningar jorden! Detta Instructable visar dig hur man bygger din egen Melodyian - en Arduino-baserad, 3D-printable robot som kan flytta, lyser upp och göra musik! Det är också en MIDI-robot och trådlöst kan styras via MIDI via Bluetooth.Denna robot...

Med Fusion att skapa Plug formar

I denna tutorial kommer jag att använda Fusion 360 skapa en plug mögel för vakuumformning akryl så att slutprodukten liknar en blåst glas skala insekt.Material som används:1/4 tum akryl, klar och vit3/4 tum MDF, limmade med trälim för lager materialK...

Bar Cart

Sprit är ridning en pop-kultur våg just nu, som drivs av en TV-show om en konfliktfyllda, känslomässigt tillgängliga ad man och ett uppsving i cocktail konsumtion. Bar vagnar har vuxit upp överallt, utlåning en lågmäld bohemiska luft även den drabbes...

Hur man gör alla det VideoGame saker du alltid velat

Ah TV-spel... Jag menar, seriöst... har det någonsin funnits en bättre senaste tiden? OK, så det har, men ingen som är brytt sig om att klicka på denna speciella post har inte lidit sinne bedövande timmar det tar att verkligen och desperat älskar ett...

Inte gör det själv: Starta en Book Publishing imperium med mekanisk Turk

så du vill starta du egen bok publicerande empire. Men vem ska skriva dessa böcker? Och vem ska dra illustrationerna? Låt andra göra det åt dig! Anonym online massorna fullmatat med väntar på att få höra berättelser och bilder som väntar på att dras....

Photoshop Plugins i GIMP

bra dag!Photoshop är ofta anses vara den bästa stationära rastergrafik editor bildhanteringsprogram på marknaden, med zillions av funktioner, för att inte nämna en massiv samling av filter tillgänglig online och från butiker. Många grafikskonstnärer...

Hur man bryter upp

bryta upp är inte lätt, rätt? De skrev en hel låt om det.Nonetheless, break-ups är en oundviklig del av växa in i de människor som vi vill bli, leva de liv vi vill leda.Break-ups kan hända gränslös skäl. Men du kan hantera denna händelse med värdighe...

Att göra äktenskapet senaste

jag var gift vid 23 års ålder och har varit gift med samma kvinna för nästan 43 år. Det är den första och enda äktenskap för oss båda. Jag tillbringade också de senaste 40 åren som Luthersk pastor, under vilken tid jag pratade med flera personer om d...

Skaka hand som JFK

visste du att John F. Kennedy lät genomföra en hel undersökning att fastställa den mest effektiva handslagen? Och med goda skäl!Mer än bara ett tecken på vänskap, ditt handslag talar volymer om vem du är som person. En mjuk hand skaka kan indikera os...

Stinger, fiende av små däggdjur överallt

Inte du älskar påläggande smärta på små däggdjur? Vad du inte? OK antar jag det är bara jag. Även om du inte är en sadistisk freak kan du fortfarande njuta av underverk av skytte saker. Stinger är en liten, mycket enkel air kanon att jag utformade oc...

Bygga militär modell pjäs "Medkänsla"

Rob Henden talar Militär modellering genom Classicaes "medkänsla.Den gamla Monty Python säger "Och nu till något helt annat" mer än väl beskriver tillverkaren Classicae första utgåvan. Till skillnad från de flesta andra 1:9 skala figur utgå...

Ekologisk tabell såg staket / arbete bänk

detta är en berättelse om ändringar i en tabell såg att göra det en ännu mer användbart verktyg. Jag tycker att det är mitten av min verkstad, både fysiskt och känslomässigt. Tyvärr slutar det också att vara arbetsbänken för många gånger. Detta proje...

3D tryckt ställningar för cellkultur

> Kultur celler på 3D utskrifter < > Hur man gör 3D utskrifter för Cell och vävnadsodling < > Kultur celler på 3D tryckta ställningar <Konst x teknik x biologiJag är en konstnär som använder kroppen, biologi och teknik för att skapa kons...

Bil nyckel mod med elektronik

Hej DIYers :)Inspirerad av lite enklare projekt med HotWheels bilmodell och ingen elektronik av användaren Schnurrbarten, projektet är här: Hot hjul bilnyckelså, låt oss komma igång... eller vänta... innan du åta sig att sådana bygga, se till att din...

Hur du kopplar från en Stalker Ex

När en Ex kommer inte att sluta försöka ansluta med dig online behöver du en checklista till snabbt vägg bort oönskade kontakt. Det här är en checklista att följa. Jag kunde inte hitta en när jag behövde det, så jag hoppas det kommer att hjälpa andra...

Hur man kan förbereda för återvinning av beroende

"Jag hade bara en drink. Var det bara en? Nej, jag hade två drinkar. Det var som en timme sedan. Det borde vara tillräckligt med tid. Jag kommer att bli bra. Jag kan inte vara över gränsen. Spricka i fönstret. Var det en dubbel vodka i bara den först...