Lasergitar

Fra Åpen sone for eksperimentell informatikk
Revisjon per 24. mar 2012 kl. 05:09 av Kyrrehe (Diskusjon | bidrag)

(diff) ← Eldre revisjon | Nåværende revisjon (diff) | Nyere revisjon → (diff)
Gå til: navigasjon, søk
Lasergitar
Den åpnede kontrolleren
Den åpnede kontrolleren
Tittel Lasergitar
Personer janoleos
Status Aktiv
Utstyr Gitar hero kontroller for Xbox, Arduino Uno, 5 Lasermoduler, 5 Lysresistorer, 1 BassBoy

Prosjektet går ut på å gjøre om en Xbox gitar om til en lasergitar. Arduino kortet skal lytte på 10 knapper, et potentiometeret samt fem lysresitorer. Dataene fra disse sensorene skal gennerere midi toner og sendes videre til BassBoy kortet som prosseserer tonene til lyd. Man kan koble gitaren rett til en forsterker eller høytaller gjennom Jack pluggen på BassBoy kortet.

Innhold

Byggplaner

Her kommer det noen tanker og formeninger om hvordan gitaren skal bygges.

Halsen

Det kommer ikke til å bli gjort noen forandringer med gitar halsen, synes den er grei som den er. Den har 10 knapper å tilby som alle kan brukes induviduelt uavhengig av hverandre, noe som tillater rimelig mange forskjellige kombinasjoner av toner, skalaer og det som værre er.

Gitarkroppen

Innvendig

Her er det mye å gjøre, kroppen skal strippes for all elektronikk som ikke lenger skal brukes, og det er faktisk en hel del. Flere knapper og brytere må kobles ut og fjernes. Kretskortet som satt der før må fjernes. Videre må det ryddes i kablene som er igjen og merke de riktig og lodde på pin headers. Jeg tenker å bruke et shiftregister og fem transistorer til å kunne skru av og på laserene fra arduino kortet. Dette vil kunne muligjøre kule oppstartsekvenser og automatisk avspilling der man ser laseren skrur seg av og på av seg selv. Det kan være ganske kult. Tenker å kansje lodde alt fast til et perfboard, og så lodde pinheadere på dette slik at arduiono kortet kan tas rett av perfboardet. Har også lyst til å lage en luke slik at gitaren kan åpnes og Arduino kortet taes ut. Det må uansett finnes en måte å koble det vekk på med tanke på at pin 0 og 1 kommer til å brukes og disse kan ikke være kopblet til noe logikk når kode lastes opp på brettet.

Utvendig

Her skal laserene samt lyssensorene festes. DE må festes skikkelig slik at det ikke er noen fare for at de løsner og faller av. Laserene som skal brukes er grønne lasere på 30mW. De er med andre ord ganske sterke og kan gjøre skade på øyne. For strøm er det mulig å feste en usb kabel permanent på innsiden som kan henge ut fra det hullet som tidligere har vært brukt til usb til xboxen. Det må også lages et hull som gjør at man kan plugge Jack til BassBoy kortet, samt at det trengs en 10 - 13 volts strømforsyning til BassBoy.

Konfigurasjon

Skjematikk og andre finurlige funn lander her.

Gitarhals

Gitarhalsen har ti knapper. Fra halsen kommer det 11 ledninger.

  • Brun - Knapp 1
  • Svart - Knapp 2
  • Hvit - Knapp 3
  • Grå - Knapp 4
  • Lilla - Knapp 5
  • Blå - GND
  • Lyseblå - Knapp 6
  • Gul - Knapp 7
  • Oransje - Knapp 8
  • Rød - Knapp 9
  • Brun med gul stripe - Knapp 10

Bruk intern pull up resistor på knappene. Disse kobles til Arduino digital input 4-13

Tiltsensor

Kobles til med intern pull up resistor på rød kabel og jord på svart kabel.

Effektstang

Bruker et potentiometer, det fungerer i området 394 - 522 på analogRead. Kablingen er som følger:

  • Gul - 5v
  • Rød - analogIn
  • Svart - GND

Lysresistorer

Disse kobles til analog 0-4. Når de er over 900 i verdi er laseren på og treffer sensorer.

BassBoy

BassBoy er et lite kretskort som kan gennerere lyd bassert på midi signaler. Kortet kan dekode signaler på 16 midi kanaler. BassBoy kan enten spille i live mode eller i sequenser mode. I live mode vil en note spille helt til den blir sluppet og en bestemt note høres lik ut uansett når den blir spilt. I sequenser mode vil en tone bære preg av foregående tone. Datablad på BassBoy

Performance test

Innlesning av 10 digitale verdier samt seks analoge verdier og noen enkle kalkulasjoner bassert på disse verdiene er gjort på ~1ms Hvilket er en god ytelse og gir rom for en del beregninger av midi signaler.

Strøm

5x grønne lasere på 30mw trekker ca 350mA hver, hvilket betyr at jeg trenger en ~2A 3v strømforsyning. Bassboy trenger en 10-13v strømforsyning og Arduino kortet trenger mellom 5 og 12v strømforsyning. Siden Arduino kortet ikke kan levere nok strøm til laserene, må laserene ha egen strømforsyning. Arduino og BassBoy kan dele strømforsyning dersom jeg finner en som kan levere mellom 10 og 12v og helst opp mot 2A.

Skjematikk

Slik er perfboardet jeg har tenkt til å bygge planlagt Lasergitar.png

Programmer

Kildekoden til noen av programmene som blir brukt i dette prosjektet vil bli postet her slik at andre kan gjennskape noen av de magiske øyeblikkene som jeg kommer til å oppleve i tiden fremover.

Midi signal test program

Dette programmet følger med Arduino som standard


/*
 MIDI note player
 
 This sketch shows how to use the serial transmit pin (pin 1) to send MIDI note data.
 If this circuit is connected to a MIDI synth, it will play 
 the notes F#-0 (0x1E) to F#-5 (0x5A) in sequence.

 
 The circuit:
 * digital in 1 connected to MIDI jack pin 5
 * MIDI jack pin 2 connected to ground
 * MIDI jack pin 4 connected to +5V through 220-ohm resistor
 Attach a MIDI cable to the jack, then to a MIDI synth, and play music.

 created 13 Jun 2006
 modified 2 Jul 2009
 by Tom Igoe 

 This example code is in the public domain.
 
 http://www.arduino.cc/en/Tutorial/MIDI
 
 */

void setup() {
  //  Set MIDI baud rate:
  Serial.begin(31250);
}

void loop() {
  // play notes from F#-0 (0x1E) to F#-5 (0x5A):
  for (intnote = 0x1E; note < 0x5A; note ++) {
    //Note on channel 1 (0x90), some note value (note), middle velocity (0x45):
    noteOn(0x90, note, 0x45);
    delay(100);
    //Note on channel 1 (0x90), some note value (note), silent velocity (0x00):
    noteOn(0x90, note, 0x00);   
    delay(100);
  }
}

//  plays a MIDI note.  Doesn't check to see that
//  cmd is greater than 127, or that data values are  less than 127:
void noteOn(int cmd, int pitch, int velocity) {
  Serial.print(cmd, BYTE);
  Serial.print(pitch, BYTE);
  Serial.print(velocity, BYTE);
}

Performance test programmet

Dette programmet ble brukt til å kjøre den initielle testen for å skjekke hvor fort man kan klare å oppdatere alle variabler fra deforskjellige sensorene. Det er viktig å merke seg at dette programmet ikke gir de forskjellige sensorene tid til å stabilisere seg og ingen beregninger blir gjort for å finne ut hvilken midi toner og effekt signaler som skal sendes, noe som opplagt tar en den mer tid.



const int ledPin =  13;      // the number of the LED pin
const int buttonPin = 2;
const int buttonPin1 = 3;
const int buttonPin2 = 4;
const int buttonPin3 = 5;
const int buttonPin4 = 6;
const int buttonPin5 = 7;
const int buttonPin6 = 8;
const int buttonPin7 = 9;
const int buttonPin8 = 10;
const int buttonPin9 = 11;
// variables will change:
int buttonState = 0;         // variable for reading the pushbutton status
int buttonState1 = 0; 
int buttonState2 = 0; 
int buttonState3 = 0; 
int buttonState4 = 0; 
int buttonState5 = 0; 
int buttonState6 = 0; 
int buttonState7 = 0; 
int buttonState8 = 0; 
int buttonState9 = 0; 
boolean a = false;
boolean a1 = false;
boolean a2 = false;
boolean a3 = false;
boolean a4 = false;
boolean a5 = false;
boolean a6 = false;
boolean a7 = false;
boolean a8 = false;
boolean a9 = false;
void setup() {
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);      
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, OUTPUT);  
  digitalWrite(buttonPin, HIGH);  
  Serial.begin(9600);
}

void loop(){
  // read the state of the pushbutton value:
  long start = millis();
  buttonState = digitalRead(buttonPin);
  buttonState1 = digitalRead(buttonPin1);
  buttonState2 = digitalRead(buttonPin2);
  buttonState3 = digitalRead(buttonPin3);
  buttonState4 = digitalRead(buttonPin4);
  buttonState5 = digitalRead(buttonPin5);
  buttonState6 = digitalRead(buttonPin6);
  buttonState7 = digitalRead(buttonPin7);
  buttonState8 = digitalRead(buttonPin8);
  buttonState9 = digitalRead(buttonPin9);
  if (buttonState){
   a = true;
  }else{
   a = false;
  }
  if (buttonState1){
   a1 = true;
  }else{
   a1 = false;
  }
  if (buttonState2){
   a2 = true;
  }else{
   a2 = false;
  }
  if (buttonState3){
   a3 = true;
  }else{
   a3 = false;
  }
  if (buttonState4){
   a4 = true;
  }else{
   a4 = false;
  }
  if (buttonState5){
   a5 = true;
  }else{
   a5 = false;
  }
  if (buttonState6){
   a6 = true;
  }else{
   a6 = false;
  }
  if (buttonState7){
   a7 = true;
  }else{
   a7 = false;
  }
  if (buttonState8){
   a8 = true;
  }else{
   a8 = false;
  }
  if (buttonState9){
   a9 = true;
  }else{
   a9 = false;
  }
   
   int i = analogRead(A0);
   i += analogRead(A1);
   i +=  analogRead(A2);
   i += analogRead(A3);
   i += analogRead(A4);
   i +=  analogRead(A5);
  long slutt = millis();
  long res= slutt - start;
  Serial.println(res);

  if (buttonState == HIGH) {     
    digitalWrite(ledPin, HIGH);  
  } 
  else {
    digitalWrite(ledPin, LOW); 
  }
}

Innkjøp

3v strømmforsyning til lasere

Bilder

Film

Mal:youtube Mal:youtube


Eksterne lenker

Midi signaler Arduino Midi tutorial

Personlige verktøy
Navnerom

Varianter
Handlinger
Navigasjon
Kategorier
Verktøy