Strumbot — устройство, при помощи которого гитара играет самостоятельно.
Чтобы его собрать, потребуется совсем немного:
гитара, контроллер Arduino, сервомашинка и палочки для еды.
Всю основную работу выполняет микро-серва, к качалке которой приклеены две палочки для еды, которые и водят по струнам гитары. Возможно, небольшим недостатком может быть шум от пластиковых шестерёнок редуктора.
Для управления игрой на гитаре, используются три кнопки и три светодиода. Каждая кнопка активирует свой шаблон игры, что отображается при помощи соответствующего светодиода.
Программа для Arduino
#include <Servo.h>
Servo myservo;
int pos = 0;
int Lled = 8; // led for low
int Mled = 9; // led for meduim
int Hled = 10; // led for hig
int Lbutt = 5; // button for low
int Mbutt = 6; // butt for meduim
int Hbutt = 7; // button for heigh
int Hstep = 1;// for rythmn
int Mstep = 1;
//first button
int Lstate = LOW; // the current state of the output pin
int Lreading; // the current reading from the input pin
int Lprevious = LOW; // the previous reading from the input pin
//secondbutton
int Mstate = LOW; // the current state of the output pin
int Mreading; // the current reading from the input pin
int Mprevious = LOW; // the previous reading from the input pin.+
//third button
int Hstate = LOW; // the current state of the output pin
int Hreading; // the current reading from the input pin
int Hprevious = LOW; // the previous reading from the input pin
// the follow variables are long's because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long time = 0; // the last time the output pin was toggled
long debounce = 200; // the debounce time, increase if the output flickers
int delayTime = 0;
int servoState = 0 ;
unsigned long previousMillis = 0; // will store last time LED was updated
long OnTime = 250; // milliseconds of on-time
long OffTime = 750; // milliseconds of off-time
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
myservo.attach(11);
pinMode(Lled, OUTPUT); // declare LED as output
pinMode(Lbutt, INPUT_PULLUP); // declare pushbutton as input
pinMode(Mled, OUTPUT); // declare LED as output
pinMode(Mbutt, INPUT_PULLUP); // declare pushbutton as input
pinMode(Hled, OUTPUT); // declare LED as output
pinMode(Hbutt, INPUT_PULLUP); // declare pushbutton as input
}
void loop() {
unsigned long currentMillis = millis();
Serial.print(Hstep);
Serial.println();
Lreading = digitalRead(Lbutt);
Mreading = digitalRead(Mbutt);
Hreading = digitalRead(Hbutt);
// how inconsistanct rythmn is coded, wait an amount of time, and then moves onto the next step
/*
if(Hstate == HIGH){
if(Hstep == 1){
if(currentMillis - previousMillis >= 400){
myservo.writeMicroseconds(1300);
servoState =0;
Hstep = 2;
previousMillis = currentMillis;
}
}
else if(Hstep == 2){
if(currentMillis - previousMillis >= 400){
myservo.writeMicroseconds(1000);
servoState =1;
Hstep = 3;
previousMillis = currentMillis;
}
}
else if(Hstep == 3){
if(currentMillis - previousMillis >=400){
myservo.writeMicroseconds(1300);
servoState =0;
Hstep =4;
previousMillis = currentMillis;
}
}
else if (Hstep == 4){
if(currentMillis - previousMillis >= 400){
myservo.writeMicroseconds(1000);
servoState =1;
Hstep = 5;
previousMillis = currentMillis;
}
} else if(Hstep == 5){
if(currentMillis - previousMillis >= 100){
myservo.writeMicroseconds(1300);
servoState =0;
Hstep= 6;
previousMillis = currentMillis;
}
} else if(Hstep == 6){
if(currentMillis - previousMillis >= 400){
myservo.writeMicroseconds(1000);
servoState =1;
Hstep =1;
previousMillis = currentMillis;
}
}
}
*/
// different rythmn
/*
if(Mstate == HIGH){
if(Mstep == 1){
if(currentMillis - previousMillis >= 100){
myservo.writeMicroseconds(1300);
servoState =0;
Mstep = 2;
previousMillis = currentMillis;
}
}
else if(Mstep == 2){
if(currentMillis - previousMillis >= 1000){
myservo.writeMicroseconds(1000);
servoState =1;
Mstep = 3;
previousMillis = currentMillis;
}
}
else if(Mstep == 3){
if(currentMillis - previousMillis >=100){
myservo.writeMicroseconds(1300);
servoState =0;
Mstep =4;
previousMillis = currentMillis;
}
}
else if(Mstep == 4){
if(currentMillis - previousMillis >=100){
myservo.writeMicroseconds(1000);
servoState =0;
Mstep =5;
previousMillis = currentMillis;
}
}
else if(Mstep == 5){
if(currentMillis - previousMillis >=1000){
myservo.writeMicroseconds(1300);
servoState =0;
Mstep =1;
previousMillis = currentMillis;
}
}
}
*/
//checks to see if light is on, if it is it plays guitar
if(Lstate == HIGH || Mstate == HIGH || Hstate == HIGH){
if(currentMillis - previousMillis >= delayTime)
{
if( servoState == 1){
myservo.writeMicroseconds(1300);
servoState =0;
}
else{
myservo.writeMicroseconds(1000);
servoState =1;
}
previousMillis = currentMillis; // Remember the time
}
}
//changes delay time and light if button was pressed
if (Lreading == HIGH && Lprevious == LOW && millis() - time > debounce) {
if (Lstate == HIGH)
Lstate = LOW;
else
Lstate = HIGH;
Mstate = LOW;
Hstate = LOW;
delayTime = 1000;
time = millis();
}
if (Mreading == HIGH && Mprevious == LOW && millis() - time > debounce) {
if (Mstate == HIGH)
Mstate = LOW;
else
Mstate = HIGH;
Lstate =LOW;
Hstate= LOW;
delayTime = 500;
time = millis();
}
if (Hreading == HIGH && Hprevious == LOW && millis() - time > debounce) {
if (Hstate == HIGH)
Hstate = LOW;
else
Hstate = HIGH;
Lstate=LOW;
Mstate= LOW;
delayTime = 100;
time = millis();
}
digitalWrite(Lled, Lstate);
Lprevious = Lreading;
digitalWrite(Mled, Mstate);
Mprevious = Mreading;
digitalWrite(Hled, Hstate);
Hprevious = Hreading;
}
Ссылки
Strumbot
По теме
Своя гитарная видеоигра на Arduino и PIC32
Nod Bang — создание ритма при покачивании головы
Роботизированный барабан на Arduino
MIDI контроллер на Arduino
Музыка ветра от Winduino
Arduino
Ардуино что это и зачем?
Arduino, термины, начало работы
КМБ для начинающих ардуинщиков
Состав стартера (точка входа для начинающих ардуинщиков)
