diff --git a/README.md b/README.md index 5a01162..c612d8c 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,8 @@ # toneroulette -Educational game for children: "Guess The Note" based on Arudino, buzzer, RGB LED, servo and rotary encoder +Educational game for children: "Guess The Note" based on Arudino, buzzer, RGB LED, servo and rotary encoder + +![toneroulette](https://dev.ussr.win/microcontrollers/toneroulette/raw/branch/master/toneroulette_agg.jpg) + +![toneroulette](https://dev.ussr.win/microcontrollers/toneroulette/raw/branch/master/toneroulette_bb.jpg) + diff --git a/barrel.svg b/barrel.svg new file mode 100644 index 0000000..2ecf11a --- /dev/null +++ b/barrel.svg @@ -0,0 +1,537 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + ДО C + МИ E + РЕ D + ФА F + ЛЯ A + СИ B + СОЛЬ G + + + + + diff --git a/pitches.h b/pitches.h new file mode 100644 index 0000000..861ad3a --- /dev/null +++ b/pitches.h @@ -0,0 +1,95 @@ +/************************************************* + + * Public Constants + + *************************************************/ + +#define NOTE_B0 31 +#define NOTE_C1 33 +#define NOTE_CS1 35 +#define NOTE_D1 37 +#define NOTE_DS1 39 +#define NOTE_E1 41 +#define NOTE_F1 44 +#define NOTE_FS1 46 +#define NOTE_G1 49 +#define NOTE_GS1 52 +#define NOTE_A1 55 +#define NOTE_AS1 58 +#define NOTE_B1 62 +#define NOTE_C2 65 +#define NOTE_CS2 69 +#define NOTE_D2 73 +#define NOTE_DS2 78 +#define NOTE_E2 82 +#define NOTE_F2 87 +#define NOTE_FS2 93 +#define NOTE_G2 98 +#define NOTE_GS2 104 +#define NOTE_A2 110 +#define NOTE_AS2 117 +#define NOTE_B2 123 +#define NOTE_C3 131 +#define NOTE_CS3 139 +#define NOTE_D3 147 +#define NOTE_DS3 156 +#define NOTE_E3 165 +#define NOTE_F3 175 +#define NOTE_FS3 185 +#define NOTE_G3 196 +#define NOTE_GS3 208 +#define NOTE_A3 220 +#define NOTE_AS3 233 +#define NOTE_B3 247 +#define NOTE_C4 262 +#define NOTE_CS4 277 +#define NOTE_D4 294 +#define NOTE_DS4 311 +#define NOTE_E4 330 +#define NOTE_F4 349 +#define NOTE_FS4 370 +#define NOTE_G4 392 +#define NOTE_GS4 415 +#define NOTE_A4 440 +#define NOTE_AS4 466 +#define NOTE_B4 494 +#define NOTE_C5 523 +#define NOTE_CS5 554 +#define NOTE_D5 587 +#define NOTE_DS5 622 +#define NOTE_E5 659 +#define NOTE_F5 698 +#define NOTE_FS5 740 +#define NOTE_G5 784 +#define NOTE_GS5 831 +#define NOTE_A5 880 +#define NOTE_AS5 932 +#define NOTE_B5 988 +#define NOTE_C6 1047 +#define NOTE_CS6 1109 +#define NOTE_D6 1175 +#define NOTE_DS6 1245 +#define NOTE_E6 1319 +#define NOTE_F6 1397 +#define NOTE_FS6 1480 +#define NOTE_G6 1568 +#define NOTE_GS6 1661 +#define NOTE_A6 1760 +#define NOTE_AS6 1865 +#define NOTE_B6 1976 +#define NOTE_C7 2093 +#define NOTE_CS7 2217 +#define NOTE_D7 2349 +#define NOTE_DS7 2489 +#define NOTE_E7 2637 +#define NOTE_F7 2794 +#define NOTE_FS7 2960 +#define NOTE_G7 3136 +#define NOTE_GS7 3322 +#define NOTE_A7 3520 +#define NOTE_AS7 3729 +#define NOTE_B7 3951 +#define NOTE_C8 4186 +#define NOTE_CS8 4435 +#define NOTE_D8 4699 +#define NOTE_DS8 4978 diff --git a/russian_code_comments/toneroulette_ru.ino b/russian_code_comments/toneroulette_ru.ino new file mode 100644 index 0000000..49c82e4 --- /dev/null +++ b/russian_code_comments/toneroulette_ru.ino @@ -0,0 +1,187 @@ +#include "pitches.h" // загрузить ноты из pitches.h +#include "Servo.h" // загрузить стандартную библиотеку Servo.h +Servo myservo; // создать объект сервопривода myservo для его контроя +const int redLED = 4; // красный пин светодиода +const int greenLED = 5; // зелёный пин светодиода +const int blueLED = 6; // синий пин светодиода +const int buzzer = 7; // сигнальный пин пищалки +const int servo = 9; // контрольный пин сервопривода +const int encDT = 2; // пин правого поворота (DT) поворотного регулятора +const int encCLK = 3; // пин левого поворота (CLK) поворотного регулятора +const int encSW = 8; // пин нажатия (SW) поворотного регулятора +volatile unsigned int encPos = 32768; // счётчик позиции поворотного регулятора +unsigned int lastReportedPos = 32768; // последнее записанное значение позиции поворотного регулятора +static boolean rotating = false; // управление поворотом регулятора +boolean right_set = false; // переменная процедуры правого поворота регулятора +boolean left_set = false; // переменная процедуры левого поворота регулятора +int pos = 0; // переменная позиции сервопривода +int posnote = 0; // переменная ноты на которую указывает сервопривод +int playednote = 0; // переменная хранящая последнюю сыгранную ноту +int gamma[] = {NOTE_B3, NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4, NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5}; // си3-до5 + +void setup() { // функция выполняемая при запуске + Serial.begin(9600); // инициализация серийного монитора + pinMode(LED_BUILTIN, OUTPUT); // определение встроенного светодиода + digitalWrite(LED_BUILTIN, LOW); // выключить встроенный светодиод подав напряжение низкого уровня + pinMode(buzzer, OUTPUT); // определение пищалки на выходной сигнал + pinMode(encDT, INPUT_PULLUP); // определение правого поворота регулятора на вход с подтягивающим резистором + pinMode(encCLK, INPUT_PULLUP); // определение левого поворота регулятора на вход с подтягивающим резистором + pinMode(encSW, INPUT_PULLUP); // определение нажатия регулятора на вход с подтягивающим резистором + attachInterrupt(0, encRight, CHANGE); // контакт регулятора на прерывании 0 (право) + attachInterrupt(1, encLeft, CHANGE); // контакт регулятора на прерывании 1 (лево) +// randomSeed(analogRead(0)); // устновка случайного семени в зависимости от напряжения на незанетом пине + initAll(); // вызов функции иниализации пищалки, светодиода и севпривода + randomNote(); // вызов функции проигрывания случайной ноты +} + +void loop() { // функция выполняемая постоянно + rotating = true; // указание состояния поворота регулятора + if (lastReportedPos != encPos) { // если последнее записанное значение поворота регулятора неравно нынешнему положению +// Serial.print("POS:"); Serial.print(pos); Serial.print("IN:"); Serial.println(encPos, DEC); // вывод значений для отладки + if (lastReportedPos < encPos) { // если последнее записанное значение поворота регулятора меньше нынешнего + if (pos > 10) rotateRight (pos, (pos-30)); // если позиция севопривода больше 10 - повернуть вправо на 30 градусов + } + if (lastReportedPos > encPos) { // если последнее записанное значение поворота регулятора больше нынешнего + if (pos < 170) rotateLeft (pos, (pos+30)); // если позиция севопривода меньше 170 - повернуть влево на 30 градусов + } + lastReportedPos = encPos; // последнему записанному значению присвоить нынешнее значение регулятора + } + if (digitalRead(encSW) == LOW ) { // если нажата кнопка + posnote = ((((pos / 30) + 1) - 8) * (-1)); // вычисление ноты на которую указывает сервопривод +// Serial.print("NOTE:"); Serial.println(posnote); // вывод значений для отладки + if (posnote == playednote) { // если сервопривод указывает на последнюю сыгранную ноту + int blinking; // объявление временной переменной мерцания светодиода + for (blinking = 0; blinking < 10; blinking += 1) { // цикл 10 шагов мерцания от 0 до 9 + colourGreen(); // зелёный свет светодиода + delay(200); // задержка в 200 миллисекунд + colourBlue(); // синий свет светодиода + delay(200); // задержка в 200 миллисекунд + } + colourOff(); // выключить свечение светодиода + delay(1000); // задержка в 1000 миллисекунд + randomNote(); // вызов функции проигрывания случайной ноты + } else { // иначе + colourRed(); // красный свет светодиода + delay(1000); // задержка в 1000 миллисекунд + colourOff(); // выключить свечение светодиода + } + } +} + +void colourRandom() { // функция случайного цвета светодиода + analogWrite(redLED, random(0,255)); // случайное значение красного + analogWrite(greenLED, random(0,255)); // случайное значение зелёного + analogWrite(blueLED, random(0,255)); // случайное значение синего +} + +void colourRed() { // функция красного цвета светодиода + analogWrite(redLED, 255); // максимальное значение красного + analogWrite(greenLED, 0); // минимальное значение зелёного + analogWrite(blueLED, 0); // минимальное значение синего +} + +void colourGreen() { // функция зелёного цвета светодиода + analogWrite(redLED, 0); // минимальное значение красного + analogWrite(greenLED, 255); // максимальное значение зелёного + analogWrite(blueLED, 0); // минимальное значение синего +} + +void colourBlue() { // функция синего цвета светодиода + analogWrite(redLED, 0); // минимальное значение красного + analogWrite(greenLED, 0); // минимальное значение зелёного + analogWrite(blueLED, 255); // максимальное значение синего +} + +void colourOff() { // функция отсутствия цвета светодиода + analogWrite(redLED, 0); // минимальное значение красного + analogWrite(greenLED, 0); // минимальное значение зелёного + analogWrite(blueLED, 0); // минимальное значение синего +} + +void rotateLeft(int posFrom, int posTo) { // функция поворота сервопривода влево + delay(32); // подождать 32 миллисекундыы + myservo.attach(servo); // присоединиться к сервоприводу + delay(32); // подождать 32 миллисекунды + for (pos = posFrom; pos < posTo; pos += 1) { // цикл увеличения позиции с posFrom до postTo с шагом в 1 градус + myservo.write(pos); // сообщить сервоприводу переместиться в позицию pos + delay(15); // подождать 15 миллисекунд для достижения позиции + } +// Serial.print("LEFTfrom:"); Serial.print(posFrom); Serial.print("to:"); Serial.print(posTo); Serial.print("cur:"); Serial.println(pos); // вывод значений для отладки + delay(32); // подождать 32 миллисекунды + myservo.detach(); // отсоединиться от сервопривода + delay(32); // подождать 32 миллисекунды +} + +void rotateRight(int posFrom, int posTo) { // функция поворота сервопривода вправо + delay(32); // подождать 32 миллисекунды + myservo.attach(servo); // присоединиться к сервоприводу + delay(32); // подождать 32 миллисекунды + for (pos = posFrom; pos > posTo; pos -= 1) { // цикл уменьшения позиции с posFrom до postTo с шагом в 1 градус + myservo.write(pos); // сообщить сервоприводу переместиться в позицию pos + delay(15); // подождать 15 миллисекунд для достижения позиции + } +// Serial.print("RIGHTfrom:"); Serial.print(posFrom); Serial.print("to:"); Serial.print(posTo); Serial.print("cur:"); Serial.println(pos); // вывод значений для отладки + delay(32); // подождать 32 миллисекунды + myservo.detach(); // отсоединиться от сервопривода + delay(32); // подождать 32 миллисекунды +} + +void initAll() { // функция иниализации пищалки, светодиода и севпривода + int gammavar; // обявление временной переменной нотной гаммы + for (gammavar = 1; gammavar <= 8; gammavar += 1) { // цикл увеличение ноты от 1 до 8 + colourRandom(); // случайный цвет светодиода + tone(buzzer, gamma[gammavar]); // подать на пищалку соответствующий тон гаммы + delay(200); // подождать 200 миллисекунд + noTone(buzzer); // нет больше тона на пищалке + delay(10); // подождать 10 миллисекунд + } + for (gammavar = 7; gammavar >= 1; gammavar -= 1) { // цикл уменьшения ноты от 7 до 1 + colourRandom(); // случайный цвет светодиода + tone(buzzer, gamma[gammavar]); // подать на пищалку соответствующий тон гаммы + delay(200); // подождать 200 миллисекунд + noTone(buzzer); // нет больше тона на пищалке + delay(10); // подождать 10 миллисекунд + } + colourRandom(); // случайный цвет светодиода + delay(500); // подождать 500 миллисекунд + colourRandom(); // случайный цвет светодиода + rotateLeft (0, 180); // повернуть сервопривод налево на 180 градусов + colourRandom(); // случайный цвет светодиода + delay(500); // подождать 500 миллисекунд + colourRandom(); // случайный цвет светодиода + rotateRight (180, 0); // повернуть сервопривод направо на 180 градусов + colourRandom(); // случайный цвет светодиода + delay(500); // подождать 500 миллисекунд + colourRandom(); // случайный цвет светодиода + delay (1000); // подождать 1000 миллисекунд + colourOff(); // выключить свечение светодиода +} + +void encRight(){ // обработка прерывния поворотного регулятора на прерывании 0 (право) + if (rotating) delay (1); // подождать миллисекунду, пока поворот не закончится + if (digitalRead(encDT) != right_set) { // если физическое значение регулятора неравно переменной процедуры правого поворота регулятора + right_set = !right_set; // изменить значение переменной процедуры правого поворота регулятора на обратное + if (right_set && !left_set) // если происходит поворот вправо и не происходит вопорота влево (для регулировки) + encPos += 1; // увеличить счётчик позиции поворотного регулятора на 1 + rotating = false; // больше нет вращения до завершения постоянно выполняемой функции loop() + } +} + +void encLeft(){ // обработка прерывния поворотного регулятора на прерывании 1 (лево) + if (rotating) delay (1); // подождать миллисекунду, пока поворот не закончится + if (digitalRead(encCLK) != left_set) { // если физическое значение регулятора неравно переменной процедуры левого поворота регулятора + left_set = !left_set; // изменить значение переменной процедуры левого поворота регулятора на обратное + if (left_set && !right_set) // если происходит поворот влево и не происходит вопорота вправо (для регулировки) + encPos -= 1; // уменьшить счётчик позиции поворотного регулятора на 1 + rotating = false; // больше нет вращения до завершения постоянно выполняемой функции loop() + } +} + +void randomNote() { // функция проигрывания случайной ноты + delay(200); // подождать 200 миллисекунд + playednote = random(1,7); // сгенерировать случайное значение от 1 до 7 для переменной хранящей последнюю сыгранную ноту + tone(buzzer, gamma[playednote]); // подать на пищалку соответствующий тон переменной хранящей последнюю сыгранную ноту + delay(2000); // подождать 2000 миллисекунд + noTone(buzzer); // нет больше тона на пищалке + delay(200); // подождать 200 миллисекунд +} diff --git a/toneroulette.fzz b/toneroulette.fzz new file mode 100644 index 0000000..6cdae7d Binary files /dev/null and b/toneroulette.fzz differ diff --git a/toneroulette.ino b/toneroulette.ino new file mode 100644 index 0000000..d14a080 --- /dev/null +++ b/toneroulette.ino @@ -0,0 +1,187 @@ +#include "pitches.h" // include tones from pitches.h +#include "Servo.h" // include pitches standard Servo.h library +Servo myservo; // create servo object to control a servo +const int redLED = 4; // red pin of LED +const int greenLED = 5; // green pin of LED +const int blueLED = 6; // blue pin of LED +const int buzzer = 7; // signal pin of buzzer +const int servo = 9; // control pin of servo +const int encDT = 2; // pin of the right rotation of encoder (DT) +const int encCLK = 3; // pin of the left rotation of encoder (CLK) +const int encSW = 8; // pin of the switch of encoder (SW) +volatile unsigned int encPos = 32768; // encoder position counter +unsigned int lastReportedPos = 32768; // the last recorded position value of encoder +static boolean rotating = false; // encoder rotation control +boolean right_set = false; // variable for the procedure of right turn of encoder +boolean left_set = false; // variable for the procedure of left turn of encoder +int pos = 0; // variable to store servo position +int posnote = 0; // variable of the note to which servo is pointing +int playednote = 0; // variable storing the last note played +int gamma[] = {NOTE_B3, NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4, NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5}; // ti3-do5 + +void setup() { // function performed at start-up + Serial.begin(9600); // serial monitor initialisation + pinMode(LED_BUILTIN, OUTPUT); // definition of built-in LED + digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW + pinMode(buzzer, OUTPUT); // definition of buzzer to output signal + pinMode(encDT, INPUT_PULLUP); // definition of right turn of encoder as input pullup + pinMode(encCLK, INPUT_PULLUP); // definition of left turn of encoder as input pullup + pinMode(encSW, INPUT_PULLUP); // definition of switch of encoder as input pullup + attachInterrupt(0, encRight, CHANGE); // encoder pin on interrupt 0 (right) + attachInterrupt(1, encLeft, CHANGE); // encoder pin on interrupt 1 (left) +// randomSeed(analogRead(0)); // setting a random seed depending on the voltage on an unswitched pin + initAll(); // call for function of the initialisation of buzzer, LED and servo + randomNote(); // call random note play function +} + +void loop() { // ongoing function + rotating = true; // encoder rotating state set + if (lastReportedPos != encPos) { // if the last recorded encoder position is not equal to the current position +// Serial.print("POS:"); Serial.print(pos); Serial.print("IN:"); Serial.println(encPos, DEC); // output values for debug + if (lastReportedPos < encPos) { // if the last recorded encoder position is less than the present value + if (pos > 10) rotateRight (pos, (pos-30)); // if servo position is greater than 10 - turn right 30 degrees + } + if (lastReportedPos > encPos) { // if the last recorded encoder position is greater than the present value + if (pos < 170) rotateLeft (pos, (pos+30)); // if servo position is less than 170 - turn left 30 degrees + } + lastReportedPos = encPos; // assign current encoder position to the last recorded position + } + if (digitalRead(encSW) == LOW ) { // if encoder switch is pressed + posnote = ((((pos / 30) + 1) - 8) * (-1)); // calculating the note indicated by servo +// Serial.print("NOTE:"); Serial.println(posnote); // output values for debug + if (posnote == playednote) { // if servo points to the last played note + int blinking; // declaration of LED blinking variable + for (blinking = 0; blinking < 10; blinking += 1) { // cycle 10 blinking steps from 0 to 9 + colourGreen(); // green LED light + delay(200); // 200 millisecond delay + colourBlue(); // blue LED light + delay(200); // 200 millisecond delay + } + colourOff(); // switch off LED light + delay(1000); // 1000 millisecond delay + randomNote(); // call the random note play function + } else { // else + colourRed(); // red LED light + delay(1000); // 1000 millisecond delay + colourOff(); // switch off LED light + } + } +} + +void colourRandom() { // random colour LED function + analogWrite(redLED, random(0,255)); // random value of red + analogWrite(greenLED, random(0,255)); // random value of green + analogWrite(blueLED, random(0,255)); // random value of blue +} + +void colourRed() { // red colour LED function + analogWrite(redLED, 255); // maximum value of red + analogWrite(greenLED, 0); // minumum value of green + analogWrite(blueLED, 0); // minumum value of blue +} + +void colourGreen() { // green colour LED function + analogWrite(redLED, 0); // minumum value of red + analogWrite(greenLED, 255); // maximum value of green + analogWrite(blueLED, 0); // minumum value of blue +} + +void colourBlue() { // blue colour LED function + analogWrite(redLED, 0); // minumum value of red + analogWrite(greenLED, 0); // minumum value of green + analogWrite(blueLED, 255); // maximum value of blue +} + +void colourOff() { // no colour LED function + analogWrite(redLED, 0); // minumum value of red + analogWrite(greenLED, 0); // minumum value of green + analogWrite(blueLED, 0); // minumum value of blue +} + +void rotateLeft(int posFrom, int posTo) { // servo's left turn function + delay(32); // 32 millisecond delay + myservo.attach(servo); // attaching to servo + delay(32); // 32 millisecond delay + for (pos = posFrom; pos < posTo; pos += 1) { // cycle of increasing position from posFrom to postTo in 1-degree increments + myservo.write(pos); // tell servo to go to position in variable pos + delay(15); // 15 millisecond delay + } +// Serial.print("LEFTfrom:"); Serial.print(posFrom); Serial.print("to:"); Serial.print(posTo); Serial.print("cur:"); Serial.println(pos); // output values for debug + delay(32); // 32 millisecond delay + myservo.detach(); // detaching from servo + delay(32); // 32 millisecond delay +} + +void rotateRight(int posFrom, int posTo) { // servo's right turn function + delay(32); // 32 millisecond delay + myservo.attach(servo); // attaching to servo + delay(32); // 32 millisecond delay + for (pos = posFrom; pos > posTo; pos -= 1) { // cycle of reduction position from posFrom to postTo in 1-degree increments + myservo.write(pos); // tell servo to go to position in variable pos + delay(15); // 15 millisecond delay + } +// Serial.print("RIGHTfrom:"); Serial.print(posFrom); Serial.print("to:"); Serial.print(posTo); Serial.print("cur:"); Serial.println(pos); // output values for debug + delay(32); // 32 millisecond delay + myservo.detach(); // detaching from servo + delay(32); // 32 millisecond delay +} + +void initAll() { // function of the initialisation of buzzer, LED and servo + int gammavar; // declaration of temporary gamma variable + for (gammavar = 1; gammavar <= 8; gammavar += 1) { // note increase cycle from 1 to 8 + colourRandom(); // random LED light + tone(buzzer, gamma[gammavar]); // sending the appropriate tone to buzzer + delay(200); // 200 millisecond delay + noTone(buzzer); // no more tone on buzzer + delay(10); // 10 millisecond delay + } + for (gammavar = 7; gammavar >= 1; gammavar -= 1) { // note decrease cycle from 7 to 1 + colourRandom(); // random LED light + tone(buzzer, gamma[gammavar]); // sending the appropriate tone to buzzer + delay(200); // 200 millisecond delay + noTone(buzzer); // no more tone on buzzer + delay(10); // 10 millisecond delay + } + colourRandom(); // random LED light + delay(500); // 500 millisecond delay + colourRandom(); // random LED light + rotateLeft (0, 180); // turn servo 180 degrees to left + colourRandom(); // random LED light + delay(500); // 500 millisecond delay + colourRandom(); // random LED light + rotateRight (180, 0); // turn servo 180 degrees to right + colourRandom(); // random LED light + delay(500); // 500 millisecond delay + colourRandom(); // random LED light + delay (1000); // 1000 millisecond delay + colourOff(); // switch off LED light +} + +void encRight(){ // processing encoder interrupt 0 (right) + if (rotating) delay (1); // wait a millisecond for the turn to end + if (digitalRead(encDT) != right_set) { // if physical encoder value is not equal to the variable of the encoder right turn procedure + right_set = !right_set; // change value of encoder right turn procedure variable to the opposite value + if (right_set && !left_set) // if turning to the right occurs and not turning to the left (to adjust) + encPos += 1; // increase encoder position counter by 1 + rotating = false; // no more debouncing until loop() hits again + } +} + +void encLeft(){ // processing encoder interrupt 1 (left) + if (rotating) delay (1); // wait a millisecond for the turn to end + if (digitalRead(encCLK) != left_set) { // if physical encoder value is not equal to the variable of the encoder left turn procedure + left_set = !left_set; // change value of encoder left turn procedure variable to the opposite value + if (left_set && !right_set) // if turning to the left occurs and not turning to the right (to adjust) + encPos -= 1; // decrease encoder position counter by 1 + rotating = false; // no more debouncing until loop() hits again + } +} + +void randomNote() { // random note play function + delay(200); // 200 millisecond delay + playednote = random(1,7); // generate random value from 1 to 7 for the variable storing the last note played + tone(buzzer, gamma[playednote]); // sending the appropriate tone to buzzer + delay(2000); // 2000 millisecond delay + noTone(buzzer); // no more tone on buzzer + delay(200); // 200 millisecond delay +} diff --git a/toneroulette_agg.jpg b/toneroulette_agg.jpg new file mode 100644 index 0000000..1aaf70c Binary files /dev/null and b/toneroulette_agg.jpg differ diff --git a/toneroulette_bb.jpg b/toneroulette_bb.jpg new file mode 100644 index 0000000..0126f18 Binary files /dev/null and b/toneroulette_bb.jpg differ