Components and supplies
1
Arduino Pro Mini 328 - 5V/16MHz
Tools and machines
1
Soldering iron (generic)
1
Solder Wire, Lead Free
Apps and platforms
1
Arduino IDE
Project description
Code
Furby code
c_cpp
1#include "DFRobotDFPlayerMini.h" 2#include <avr/io.h> 3#include <avr/interrupt.h> 4 5#define mForPin 3 6#define mBakPin 4 7#define led 13 8#define camPin 14 9#define lightPin 15 10#define gearPin 16 11#define mouthPin 17 12#define backPin 18 13#define bellyPin 19 14#define tiltPin 20 15 16 17 18DFRobotDFPlayerMini myDFPlayer; 19 20 21 int aveLight; 22 int annoy; 23 int touchBack; 24unsigned long timethen; 25unsigned long timethen1; 26 27 28 volatile int camPos; 29 volatile int mDir; 30 31// debounce flags 32boolean tiltFlag; 33boolean mouthFlag; 34boolean bellyFlag; 35boolean backFlag; 36boolean lightFlag; 37 38void openMouth() 39{ 40// cam position between 0 and 50 41 Serial.println("Open mouth "); 42 goToCamPos(50); 43} 44 45void closeMouth() 46{ 47// cam position between 50 and 100 48 Serial.println("Close mouth "); 49 goToCamPos(100); 50} 51 52void openEyes() 53{ 54 Serial.println("Open eyes "); 55 goToCamPos(100); 56} 57 58void closeEyes() 59{ 60 Serial.println("Close eyes "); 61 goToCamPos(190); 62} 63 64 65void rock() 66{ 67 Serial.println("Rock"); 68 goToCamPos(240); 69 delay(100); 70 goToCamPos(190); 71 delay(100); 72} 73 74 75void findCamStart() 76{ 77// find start position 78 digitalWrite(mForPin, HIGH); 79 digitalWrite(led, HIGH); 80 81while (digitalRead(camPin) == LOW) 82 { 83 } 84 85 digitalWrite(mForPin, LOW); 86 digitalWrite(led, LOW); 87 camPos =0; 88} 89 90 91void goToCamPos(int targetPos) 92{ 93 while (camPos <targetPos -2 || camPos >targetPos +2) 94 { 95 if (camPos >targetPos +2) 96 { 97 digitalWrite(mForPin, LOW); 98 digitalWrite(mBakPin, HIGH); 99 mDir =-1; 100 } 101 else if (camPos < targetPos -2) 102 { 103 digitalWrite(mForPin, HIGH); 104 digitalWrite(mBakPin, LOW); 105 mDir =1; 106 } 107 } 108 digitalWrite(mForPin, LOW); 109 digitalWrite(mBakPin, LOW); 110 Serial.print("Cam pos "); 111 Serial.println(camPos); 112 mDir =0; 113} 114 115//Interrupt routines 116void gearPinChange() 117{ 118// Interrupt to increase or decrease cam position depending on motor direction 119 camPos += mDir; 120} 121 122void camHome() 123{ 124 camPos =0; 125} 126 127 128void cross() 129{ 130 int track; 131 String folder; 132 String trackNumber; 133 134 myDFPlayer.volume(20); //Set volume value (0~30) 135 track = random(8)+1; 136 trackNumber = "00" + (String)track; 137 folder = "0" + (String)annoy; 138 139 Serial.print(folder); 140 Serial.print("/"); 141 Serial.println(trackNumber); 142 myDFPlayer.playFolder(folder.toInt(), trackNumber.toInt()); 143 144 annoy ++; 145 146 if (annoy >3) 147 { 148 annoy = 3; 149 } 150} 151 152 153 154void happy() 155{ 156 int track; 157 String trackNumber; 158 159 myDFPlayer.volume(20); //Set volume value (0~30) 160 161 track = random(5)+1; 162 trackNumber = "00" + (String)track; 163 Serial.println(trackNumber); 164 myDFPlayer.playFolder(04, trackNumber.toInt()); 165 166 annoy =1; 167} 168 169void actions() 170{ 171 int track; 172 String trackNumber; 173 174 myDFPlayer.volume(20); //Set volume value (0~30) 175 176 track = random(10)+1; 177 trackNumber = "00" + (String)track; 178 179 Serial.println(trackNumber); 180 myDFPlayer.playFolder(05, trackNumber.toInt()); 181 182 annoy =1; 183} 184 185void backTouch() 186{ 187 int track; 188 String folder; 189 String trackNumber; 190 191 myDFPlayer.volume(20); //Set volume value (0~30) 192 193 track = random(3)+1; 194 trackNumber = "00" + (String)track; 195 Serial.println(trackNumber); 196 folder = "0" + (String)(touchBack+7); 197 198 Serial.print(folder); 199 Serial.print("/"); 200 Serial.println(trackNumber); 201 myDFPlayer.playFolder(folder.toInt(), trackNumber.toInt()); 202 203 touchBack ++; 204 205 if (touchBack >2) 206 { 207 touchBack = 2; 208 } 209 210} 211 212 void moveMouth() 213 { 214 do 215 { 216 openMouth(); 217 delay(300); 218 closeMouth(); 219 } 220 while (myDFPlayer.readState() !=0); 221 } 222 223 224void resetFlags() 225{ 226 tiltFlag = false; 227 mouthFlag = false; 228 bellyFlag = false; 229 backFlag = false; 230 lightFlag = false; 231} 232 233void getLightLevel() 234{ 235// get average light level 236 for (int i =0; i<100; i++) 237 { 238 aveLight += analogRead(lightPin); 239 } 240 aveLight = aveLight /100; 241 aveLight -=100; 242} 243 244void setup() 245{ 246 247// Set up pins 248 pinMode(mouthPin, INPUT_PULLDOWN); 249 pinMode(bellyPin, INPUT_PULLDOWN); 250 pinMode(backPin, INPUT_PULLDOWN); 251 pinMode(lightPin, INPUT_PULLDOWN); 252 pinMode(tiltPin, INPUT_PULLDOWN); 253 pinMode(gearPin, INPUT_PULLDOWN); 254 pinMode(camPin, INPUT_PULLDOWN); 255 pinMode(led, OUTPUT); 256 257 pinMode(mForPin, OUTPUT); 258 pinMode(mBakPin, OUTPUT); 259 260 digitalWrite(mForPin, LOW); 261 digitalWrite(mBakPin, LOW); 262 263 264// Other set up 265 Serial.begin(9600); 266 267// Sound card set up 268 269 Serial3.begin(9600); 270 if (!myDFPlayer.begin(Serial3)) { //Use softwareSerial to communicate with mp3. 271 Serial.println(F("Unable to begin:")); 272 Serial.println(F("1.Please recheck the connection!")); 273 Serial.println(F("2.Please insert the SD card!")); 274 } 275 else 276 { 277 Serial.println(F("DFPlayer Mini online.")); 278 myDFPlayer.outputDevice(DFPLAYER_DEVICE_SD); 279 } 280 281 myDFPlayer.playFolder(06, 001); // start up sound 282 283// get average light level 284 getLightLevel(); 285 286// initialise misc variables 287 annoy =1; 288 touchBack =1; 289 timethen = millis(); 290 291 resetFlags(); 292 293 findCamStart(); 294 attachInterrupt(digitalPinToInterrupt(gearPin), gearPinChange, CHANGE); 295 attachInterrupt(digitalPinToInterrupt(camPin), camHome, RISING); 296 goToCamPos(100); // start position 297 298} 299 300void loop() { 301 302 303 if (digitalRead(mouthPin) && !mouthFlag) 304{ 305 Serial.println("Mouth"); 306 happy(); 307 moveMouth(); 308 timethen = millis(); 309 timethen1 = millis(); 310 mouthFlag = true; 311} 312 313 if (digitalRead(backPin) && !backFlag) 314 { 315 Serial.println("Back"); 316 backTouch(); 317 moveMouth(); 318 timethen = millis(); 319 timethen1 = millis(); 320 backFlag = true; 321 } 322 323 324 if (digitalRead(bellyPin) && !bellyFlag) 325 { 326 Serial.println("Belly"); 327 myDFPlayer.playFolder(07,001); //Laugh 328 for (int i =0; i<5; i++) 329 { 330 rock(); 331 } 332 goToCamPos(100); // start position 333 bellyFlag = true; 334 timethen1 = millis(); 335 timethen = millis(); 336 } 337 338// Check tilt sensor 339 if (digitalRead(tiltPin) && !tiltFlag) 340 { 341 cross(); 342 moveMouth(); 343 timethen = millis(); 344 timethen1 = millis(); 345 tiltFlag = true; 346 } 347 348// check light sensor 349 if ((analogRead(lightPin) <aveLight) && !lightFlag) 350 { 351 Serial.print("Dark "); 352 cross(); 353 openMouth(); 354 delay(1500); 355 closeMouth(); 356 timethen1 = millis(); 357 timethen = millis(); 358 lightFlag = true; 359 } 360 361// Reset flags 362 if ( millis() > timethen1 + 2000) 363 { 364 resetFlags(); 365 } 366 367 368// Has Furby been left alone for 60 seconds? 369 if ( millis() > timethen + 60000) 370 { 371 actions(); 372 moveMouth(); 373 timethen = millis(); 374// get average light level 375 getLightLevel(); 376 } 377 378 379 380 381} 382
Comments
Only logged in users can leave comments