Build a Better Bear
How much can a SparkFun Pro Micro do?
Components and supplies
Arduino Pro Mini 328 - 5V/16MHz
Project description
Code
Code snippet #11
text
1#define hornpin 16 2#define hornresetpin 4 3 4void setup{ 5pinMode(hornpin, OUTPUT); 6pinMode(hornresetpin, OUTPUT); 7 8digitalWrite(hornresetpin, LOW); 9 10} 11 12 13void resethorns(){ 14// Reset decade counter chip to turn off horn lights 15 digitalWrite(hornresetpin, HIGH); 16 delay(10); 17 digitalWrite(hornresetpin, LOW); 18} 19 20void horns(int col, int repeat, int speed) 21{ 22// Sets the colour of the horn lights by 23// cycling through the decade counter pins 24// really quickly and stopping at the 25// chosen colour 26// parameters are colour, number of times to 27// repeat the sequence and speed</p><p> int start; 28 int end; 29 int limit; 30 31 for (int i = 0; i < repeat; i++) 32 { 33 resethorns(); 34 35 switch (col) 36 { 37 case 0: 38 limit = 10; 39 break; 40 case 1: //red 41 limit = 3; 42 break; 43 case 2: //green 44 limit = 3; 45 for (int k = 0; k < 3; k++) // skip red 46 { 47 digitalWrite(hornpin, LOW); 48 delay(1); 49 digitalWrite(hornpin, HIGH); 50 delay(1); 51 } 52 break; 53 case 3: // blue 54 limit = 3; 55 for (int k = 0; k < 7; k++) // skip red and green 56 { 57 digitalWrite(hornpin, LOW); 58 delay(1); 59 digitalWrite(hornpin, HIGH); 60 delay(1); 61 } 62 break; 63 } 64 65 for (int j = 0; j < limit; j++) 66 { 67 digitalWrite(hornpin, LOW); 68 delay(speed); 69 digitalWrite(hornpin, HIGH); 70 delay(speed); 71 } 72 } 73 74 resethorns(); 75}
Code snippet #8
text
1#define lightpin 20 2int light = 0; 3 4void darkactions() 5 6{ 7// Randomly select an action to perform when it's dark 8 9 choice = random(5); 10 eyes(0, 0, 255); 11 12 switch (choice) 13 { 14 case 0: 15 speak("Is that the moon"); 16 delay(1500); 17 FXserial.println("#06"); 18 break; 19 case 1: 20 sleepnoise(); 21 sleepnoise(); 22 break; 23 case 2: 24 speak("Who turned off the lights"); 25 delay(1500); 26 break; 27 case 3: 28 speak("Ooh creepy"); 29 delay(750); 30 break; 31 case 4: 32 speak("It's dark"); 33 delay(750); 34 break; 35 } 36 horns(3, 10, 5); // colour, repeat, speed 37} 38 39void setup() { 40 41pinMode(lightpin, INPUT); 42 43} 44 45void loop() { 46 47light = analogRead(lightpin); 48 49// Is it dark? 50 51 if (light > 900) // dark 52 { 53 darkactions(); 54 delay(1000); 55 timethen = timenow; 56 } 57 58} 59
Code snippet #1
text
1// initialise variables and constants 2// Arduino pins 3 4#define redpin 5 5#define greenpin 6 6#define bluepin 9 7 8 9void eyes(int r, int g, int b) 10{ 11// writes to pins to change eye colours 12analogWrite(redpin, r); 13analogWrite(greenpin, g); 14analogWrite(bluepin, b); 15} 16 17void rollseyes() 18{ 19// loops to change eye colours 20 21int colour; 22eyes(0, 0, 0); 23 24for (colour = 0; colour < 255; colour++) 25 { 26// blue fades, red brightens 27 eyes(colour, 0, 255 - colour); 28 delay(10); 29} 30 31for (colour = 0; colour < 255; colour++) 32{ 33// red fades, green brightens 34eyes(255 - colour, colour, 0); 35delay(10); 36} 37 38for (colour = 0; colour < 255; colour++) 39{ 40// green fades, blue brightens 41eyes(0, 255 - colour, colour); 42delay(10); 43 } 44} 45 46void setup() 47{ 48/* output pins */ 49pinMode(redpin, OUTPUT); 50pinMode(greenpin, OUTPUT); 51pinMode(bluepin, OUTPUT); 52} 53 54void loop() 55{ 56 57rollseyes(); 58 59}
Code snippet #3
text
1/* New file order - clear SD, download new files, YAFS */ 2 3#include "SoftwareSerial.h" 4 5# define Start_Byte 0x7E 6# define Version_Byte 0xFF 7# define Command_Length 0x06 8# define End_Byte 0xEF 9# define Acknowledge 0x00 //Returns info with command 0x41 [0x01: info, 0x00: no info] 10 11SoftwareSerial MP3player(10, 9); // RX, TX</ 12 13void setVolume(int volume) 14{ 15 execute_CMD(0x06, 0, volume); // Set the volume (0x00~0x30) 16 delay(2000); 17} 18 19void play(int file) 20{ 21 int state = LOW; 22while (state == LOW) 23 { 24 state = digitalRead(busy); 25 } 26 27 execute_CMD(0x03, 0, file); 28 delay(100); 29} 30 31void execute_CMD(byte CMD, byte Par1, byte Par2) 32// Execute the command and parameters 33{ 34 // Calculate the checksum (2 bytes) 35 word checksum = -(Version_Byte + Command_Length + CMD + Acknowledge + Par1 + Par2); 36 // Build the command line 37 byte Command_line[10] = { Start_Byte, Version_Byte, Command_Length, CMD, Acknowledge, 38 Par1, Par2, highByte(checksum), lowByte(checksum), End_Byte 39 }; 40 //Send the command line to the module 41 for (byte k = 0; k < 10; k++) 42 { 43 MP3player.write( Command_line[k]); 44 } 45 46 delay(100); 47 48} 49 50void setup() { 51 52 MP3player.begin(9600); 53 setVolume(21); 54 play(34); 55} 56 57void loop() { 58// play a random track between 1 and 49 59 track = random(1, 50; 60 61}
Code snippet #8
text
1#define lightpin 20 2int light = 0; 3 4void darkactions() 5 6{ 7// Randomly select an action to perform when it's dark 8 9 choice = random(5); 10 eyes(0, 0, 255); 11 12 switch (choice) 13 { 14 case 0: 15 speak("Is that the moon"); 16 delay(1500); 17 FXserial.println("#06"); 18 break; 19 case 1: 20 sleepnoise(); 21 sleepnoise(); 22 break; 23 case 2: 24 speak("Who turned off the lights"); 25 delay(1500); 26 break; 27 case 3: 28 speak("Ooh creepy"); 29 delay(750); 30 break; 31 case 4: 32 speak("It's dark"); 33 delay(750); 34 break; 35 } 36 horns(3, 10, 5); // colour, repeat, speed 37} 38 39void setup() { 40 41pinMode(lightpin, INPUT); 42 43} 44 45void loop() { 46 47light = analogRead(lightpin); 48 49// Is it dark? 50 51 if (light > 900) // dark 52 { 53 darkactions(); 54 delay(1000); 55 timethen = timenow; 56 } 57 58} 59
Code snippet #6
text
1#define motorpin 10 2 3void motor(int turns) 4 5{ 6// Active motor pin to turn on motor briefly 7 for (int i = 0; i < turns; i++) 8 { 9 digitalWrite(motorpin, HIGH); 10 delay(2); 11 digitalWrite(motorpin, LOW); 12 } 13} 14 15void setup() { 16 17pinMode(motorpin, OUTPUT); 18 19digitalWrite(motorpin, LOW); 20 21} 22 23void loop() { 24 25motor(10); 26 27}
Code snippet #2
text
1#include <softwareserial.h> 2SoftwareSerial FXserial(7, 8); // RX | TX 3 4 5void growl() 6{ 7// Use software serial to tell Adafruit FX card 8// to play a sound 9 FXserial.println("#03"); 10 delay(500); 11} 12 13void fart() 14{ 15// Use software serial to tell Adafruit FX card 16// to play a sound 17 FXserial.println("#02"); 18 delay(500); 19} 20 21void burp() 22{ 23// Use software serial to tell Adafruit FX card 24// to play a sound 25 FXserial.println("#04"); 26 delay(500); 27} 28 29void laugh() 30{ 31// Use software serial to tell Adafruit FX card 32// to play a sound 33 FXserial.println("#00"); 34 delay(500); 35} 36 37void setup() { 38// Initialise Bobbs on start up</p><p>// Serial communications with 39// sound card 40 FXserial.begin(9600); 41} 42 43void loop(){ 44 fart(); 45 burp(); 46 laugh(); 47 growl(); 48}</p>
Code snippet #4
text
1#include <softwareserial.h> 2<SoftwareSerial emicserial(2, 3); // RX | TX 3 4void speak(String message) 5{ 6// Send message to speech chip 7 emicserial.print("S"); 8 emicserial.print(message); 9 emicserial.write("\ 10"); 11 12} 13 14void setup() { 15 16// Serial communications with speech chip 17 emicserial.begin(9600); 18 19// Set volume for speech 20 emicserial.print('V16'); 21 emicserial.print('\ 22'); 23 24void loop() 25{ 26 speak("Hello"); 27}
Code snippet #10
text
1#define pawpin 18 2 3void pawthing() 4 5{ 6// Interactive paws 7// Bobbs asks for his hands to be shaken 8// The user must respond in time to activate 9// motor, eyes and horns 10 11 int paw = 0; 12 speak("Give me high five"); 13 eyes (0, 0, 0); 14 15 timethen = millis(); 16 while ( millis() < timethen + 5000) 17 { 18 paw = analogRead(pawpin); 19 20 if (paw < 650) 21 { 22 23 speak("Purrr"); 24 horns(2, 5, 5); 25 } 26 27 eyes(255, 215, 0); 28 delay(500); 29 motor(100); 30 } 31 } 32 33 34void setup() { 35 36pinMode(pawpin, INPUT); 37}
Code snippet #7
text
1#define tiltpin 21 2 3void tiltactions() 4{ 5// Randomly select an action when Bobbs in tilted 6 7 choice = random(6); 8 eyes(255, 0, 0); 9 growl(); 10 delay(750); 11 switch (choice) 12 { 13 case 0: 14 speak("Whats happening"); 15 delay(750); 16 break; 17 case 1: 18 speak("This is not cool"); 19 delay(750); 20 break; 21 case 2: 22 speak("Human I need help"); 23 delay(750); 24 break; 25 case 3: 26 speak("This sucks"); 27 delay(750); 28 break; 29 case 4: 30 speak("I'm going to puke"); 31 delay(750); 32 break; 33 case 5: 34 speak("Make it stop"); 35 delay(750); 36 break; 37 } 38 horns(1, 10, 5); // colour, repeat, speed 39} 40 41void setup() { 42pinMode(tiltpin, INPUT); 43} 44 45void loop() { 46 47// Is Bobbs tilited? 48 49 if (tilt > 500) 50 { 51 tiltcount += 1; 52 if (tiltcount > 500) 53 { 54 tiltactions(); 55 delay(1000); 56 timethen = timenow; 57 } 58 } 59 else 60 { 61 tiltcount = 0; 62 } 63 64}
Code snippet #9
text
1#define feetpin 19 2 3void feet() 4 5{ 6// Interactive feet 7// Bobbs asks for his feet to be tickled 8// user must respond within a set period of 9// time to activate eyes, horns and make Bobbs laugh</p><p> int feetnow = 0;</p><p> speak("Tickle my feet"); 10 eyes (0, 0, 0);</p><p> timethen = millis();</p><p> while ( millis() < timethen + 5000) 11 { 12 for (int i = 0; i < 200; i++) 13 { 14 feetnow = feetnow + analogRead(feetpin); 15 } 16 feetnow = feetnow / 200;</p><p> if ( feetnow < 0) 17 { 18 FXserial.println("#00"); // play the laugh sound on the Adafruit board 19 eyes(255, 215, 0); 20 motor(100); 21 horns(1, 10, 5); // colour, repeat, speed 22 } 23 } 24} 25void setup(){ 26 27pinMode(feetpin, INPUT); 28 29} 30void loop(){ 31 32feet(); 33 34}
Code snippet #3
text
1/* New file order - clear SD, download new files, YAFS */ 2 3#include "SoftwareSerial.h" 4 5# define Start_Byte 0x7E 6# define Version_Byte 0xFF 7# define Command_Length 0x06 8# define End_Byte 0xEF 9# define Acknowledge 0x00 //Returns info with command 0x41 [0x01: info, 0x00: no info] 10 11SoftwareSerial MP3player(10, 9); // RX, TX</ 12 13void setVolume(int volume) 14{ 15 execute_CMD(0x06, 0, volume); // Set the volume (0x00~0x30) 16 delay(2000); 17} 18 19void play(int file) 20{ 21 int state = LOW; 22while (state == LOW) 23 { 24 state = digitalRead(busy); 25 } 26 27 execute_CMD(0x03, 0, file); 28 delay(100); 29} 30 31void execute_CMD(byte CMD, byte Par1, byte Par2) 32// Execute the command and parameters 33{ 34 // Calculate the checksum (2 bytes) 35 word checksum = -(Version_Byte + Command_Length + CMD + Acknowledge + Par1 + Par2); 36 // Build the command line 37 byte Command_line[10] = { Start_Byte, Version_Byte, Command_Length, CMD, Acknowledge, 38 Par1, Par2, highByte(checksum), lowByte(checksum), End_Byte 39 }; 40 //Send the command line to the module 41 for (byte k = 0; k < 10; k++) 42 { 43 MP3player.write( Command_line[k]); 44 } 45 46 delay(100); 47 48} 49 50void setup() { 51 52 MP3player.begin(9600); 53 setVolume(21); 54 play(34); 55} 56 57void loop() { 58// play a random track between 1 and 49 59 track = random(1, 50; 60 61}
Code snippet #11
text
1#define hornpin 16 2#define hornresetpin 4 3 4void setup{ 5pinMode(hornpin, OUTPUT); 6pinMode(hornresetpin, OUTPUT); 7 8digitalWrite(hornresetpin, LOW); 9 10} 11 12 13void resethorns(){ 14// Reset decade counter chip to turn off horn lights 15 digitalWrite(hornresetpin, HIGH); 16 delay(10); 17 digitalWrite(hornresetpin, LOW); 18} 19 20void horns(int col, int repeat, int speed) 21{ 22// Sets the colour of the horn lights by 23// cycling through the decade counter pins 24// really quickly and stopping at the 25// chosen colour 26// parameters are colour, number of times to 27// repeat the sequence and speed</p><p> int start; 28 int end; 29 int limit; 30 31 for (int i = 0; i < repeat; i++) 32 { 33 resethorns(); 34 35 switch (col) 36 { 37 case 0: 38 limit = 10; 39 break; 40 case 1: //red 41 limit = 3; 42 break; 43 case 2: //green 44 limit = 3; 45 for (int k = 0; k < 3; k++) // skip red 46 { 47 digitalWrite(hornpin, LOW); 48 delay(1); 49 digitalWrite(hornpin, HIGH); 50 delay(1); 51 } 52 break; 53 case 3: // blue 54 limit = 3; 55 for (int k = 0; k < 7; k++) // skip red and green 56 { 57 digitalWrite(hornpin, LOW); 58 delay(1); 59 digitalWrite(hornpin, HIGH); 60 delay(1); 61 } 62 break; 63 } 64 65 for (int j = 0; j < limit; j++) 66 { 67 digitalWrite(hornpin, LOW); 68 delay(speed); 69 digitalWrite(hornpin, HIGH); 70 delay(speed); 71 } 72 } 73 74 resethorns(); 75}
Code snippet #5
text
1#include <SoftwareSerial.h> 2 3SoftwareSerial BTserial(14, 15); // RX | TX 4 5void instruction() 6{ 7// Decode instructions from BT device and 8// take action 9 10 command = BTserial.read(); 11 int commandvalue = command.toInt(); 12 switch (commandvalue) 13 { 14 case 71: // G 15 growl(); 16 break; 17 case 84: // T 18 getmessage(); 19 break; 20 case 70: // F 21 fart(); 22 break; 23 case 66: //B 24 burp(); 25 delay(500); 26 speak("Better out than in"); 27 break; 28 case 69: // E 29 speak("All the colours of the bow man"); 30 rollseyes(); 31 break; 32 case 83: // S 33 shake(); 34 break; 35 case 76: // L 36 laugh(); 37 break; 38 } 39 40void setup() { 41 42// Initialise Bobbs on start up 43// Serial communications with BT device 44 BTserial.begin(9600); 45} 46 47void loop() { 48// BT device instruction received? 49 50 51 if (BTserial.available()) 52 { 53 instruction(); 54 }
Code snippet #4
text
1#include <softwareserial.h> 2<SoftwareSerial emicserial(2, 3); // RX | TX 3 4void speak(String message) 5{ 6// Send message to speech chip 7 emicserial.print("S"); 8 emicserial.print(message); 9 emicserial.write("\ 10"); 11 12} 13 14void setup() { 15 16// Serial communications with speech chip 17 emicserial.begin(9600); 18 19// Set volume for speech 20 emicserial.print('V16'); 21 emicserial.print('\n'); 22 23void loop() 24{ 25 speak("Hello"); 26}
Code snippet #9
text
1#define feetpin 19 2 3void feet() 4 5{ 6// Interactive feet 7// Bobbs asks for his feet to be tickled 8// user must respond within a set period of 9// time to activate eyes, horns and make Bobbs laugh</p><p> int feetnow = 0;</p><p> speak("Tickle my feet"); 10 eyes (0, 0, 0);</p><p> timethen = millis();</p><p> while ( millis() < timethen + 5000) 11 { 12 for (int i = 0; i < 200; i++) 13 { 14 feetnow = feetnow + analogRead(feetpin); 15 } 16 feetnow = feetnow / 200;</p><p> if ( feetnow < 0) 17 { 18 FXserial.println("#00"); // play the laugh sound on the Adafruit board 19 eyes(255, 215, 0); 20 motor(100); 21 horns(1, 10, 5); // colour, repeat, speed 22 } 23 } 24} 25void setup(){ 26 27pinMode(feetpin, INPUT); 28 29} 30void loop(){ 31 32feet(); 33 34}
Code snippet #2
text
1#include <softwareserial.h> 2SoftwareSerial FXserial(7, 8); // RX | 3 TX 4 5 6void growl() 7{ 8// Use software serial to tell Adafruit FX card 9// 10 to play a sound 11 FXserial.println("#03"); 12 delay(500); 13} 14 15void 16 fart() 17{ 18// Use software serial to tell Adafruit FX card 19// to play a sound 20 21 FXserial.println("#02"); 22 delay(500); 23} 24 25void burp() 26{ 27// 28 Use software serial to tell Adafruit FX card 29// to play a sound 30 FXserial.println("#04"); 31 32 delay(500); 33} 34 35void laugh() 36{ 37// Use software serial to tell Adafruit 38 FX card 39// to play a sound 40 FXserial.println("#00"); 41 delay(500); 42} 43 44void 45 setup() { 46// Initialise Bobbs on start up</p><p>// Serial communications with 47 48// sound card 49 FXserial.begin(9600); 50} 51 52void loop(){ 53 fart(); 54 burp(); 55 laugh(); 56 growl(); 57}</p>
Code snippet #7
text
1#define tiltpin 21 2 3void tiltactions() 4{ 5// Randomly select 6 an action when Bobbs in tilted 7 8 choice = random(6); 9 eyes(255, 0, 0); 10 11 growl(); 12 delay(750); 13 switch (choice) 14 { 15 case 0: 16 speak("Whats 17 happening"); 18 delay(750); 19 break; 20 case 1: 21 speak("This 22 is not cool"); 23 delay(750); 24 break; 25 case 2: 26 speak("Human 27 I need help"); 28 delay(750); 29 break; 30 case 3: 31 speak("This 32 sucks"); 33 delay(750); 34 break; 35 case 4: 36 speak("I'm 37 going to puke"); 38 delay(750); 39 break; 40 case 5: 41 speak("Make 42 it stop"); 43 delay(750); 44 break; 45 } 46 horns(1, 10, 5); // 47 colour, repeat, speed 48} 49 50void setup() { 51pinMode(tiltpin, INPUT); 52} 53 54void 55 loop() { 56 57// Is Bobbs tilited? 58 59 if (tilt > 500) 60 { 61 tiltcount 62 += 1; 63 if (tiltcount > 500) 64 { 65 tiltactions(); 66 delay(1000); 67 68 timethen = timenow; 69 } 70 } 71 else 72 { 73 tiltcount = 0; 74 75 } 76 77}
Code snippet #1
text
1// initialise variables and constants 2// Arduino pins 3 4#define 5 redpin 5 6#define greenpin 6 7#define bluepin 9 8 9 10void eyes(int 11 r, int g, int b) 12{ 13// writes to pins to change eye colours 14analogWrite(redpin, 15 r); 16analogWrite(greenpin, g); 17analogWrite(bluepin, b); 18} 19 20void rollseyes() 21{ 22// 23 loops to change eye colours 24 25int colour; 26eyes(0, 0, 0); 27 28for (colour 29 = 0; colour < 255; colour++) 30 { 31// blue fades, red brightens 32 eyes(colour, 33 0, 255 - colour); 34 delay(10); 35} 36 37for (colour = 0; colour < 255; colour++) 38{ 39// 40 red fades, green brightens 41eyes(255 - colour, colour, 0); 42delay(10); 43} 44 45for 46 (colour = 0; colour < 255; colour++) 47{ 48// green fades, blue brightens 49eyes(0, 50 255 - colour, colour); 51delay(10); 52 } 53} 54 55void setup() 56{ 57/* 58 output pins */ 59pinMode(redpin, OUTPUT); 60pinMode(greenpin, OUTPUT); 61pinMode(bluepin, 62 OUTPUT); 63} 64 65void loop() 66{ 67 68rollseyes(); 69 70}
Code snippet #10
text
1#define pawpin 18 2 3void pawthing() 4 5{ 6// Interactive paws 7// Bobbs asks for his hands to be shaken 8// The user must respond in time to activate 9// motor, eyes and horns 10 11 int paw = 0; 12 speak("Give me high five"); 13 eyes (0, 0, 0); 14 15 timethen = millis(); 16 while ( millis() < timethen + 5000) 17 { 18 paw = analogRead(pawpin); 19 20 if (paw < 650) 21 { 22 23 speak("Purrr"); 24 horns(2, 5, 5); 25 } 26 27 eyes(255, 215, 0); 28 delay(500); 29 motor(100); 30 } 31 } 32 33 34void setup() { 35 36pinMode(pawpin, INPUT); 37}
Code snippet #6
text
1#define motorpin 10 2 3void motor(int turns) 4 5{ 6// Active motor pin to turn on motor briefly 7 for (int i = 0; i < turns; i++) 8 { 9 digitalWrite(motorpin, HIGH); 10 delay(2); 11 digitalWrite(motorpin, LOW); 12 } 13} 14 15void setup() { 16 17pinMode(motorpin, OUTPUT); 18 19digitalWrite(motorpin, LOW); 20 21} 22 23void loop() { 24 25motor(10); 26 27}
Code snippet #5
text
1#include <SoftwareSerial.h> 2 3SoftwareSerial BTserial(14, 15); // 4 RX | TX 5 6void instruction() 7{ 8// Decode instructions from BT device 9 and 10// take action 11 12 command = BTserial.read(); 13 int commandvalue 14 = command.toInt(); 15 switch (commandvalue) 16 { 17 case 71: // G 18 growl(); 19 20 break; 21 case 84: // T 22 getmessage(); 23 break; 24 case 25 70: // F 26 fart(); 27 break; 28 case 66: //B 29 burp(); 30 31 delay(500); 32 speak("Better out than in"); 33 break; 34 case 35 69: // E 36 speak("All the colours of the bow man"); 37 rollseyes(); 38 39 break; 40 case 83: // S 41 shake(); 42 break; 43 case 44 76: // L 45 laugh(); 46 break; 47 } 48 49void setup() { 50 51// 52 Initialise Bobbs on start up 53// Serial communications with BT device 54 BTserial.begin(9600); 55} 56 57void 58 loop() { 59// BT device instruction received? 60 61 62 if (BTserial.available()) 63 64 { 65 instruction(); 66 }
Downloadable files
Eyes
Eyes

Horns
Horns

DF Mini Player
DF Mini Player

EMIC 2 Speech chip
EMIC 2 Speech chip

Feet Sensor
Feet Sensor

EMIC 2 Speech chip
EMIC 2 Speech chip

Feet Sensor
Feet Sensor

Paw
Paw

Light Sensor
Light Sensor

Adafruit FX board
Adafruit FX board

Feet Sensor
Feet Sensor

DF Mini Player
DF Mini Player

Horns
Horns

Tilt
Tilt

Motor
Motor

Tilt
Tilt

Motor
Motor

Feet Sensor
Feet Sensor

Paw
Paw

Adafruit FX board
Adafruit FX board

Light Sensor
Light Sensor

Comments
Only logged in users can leave comments