Hilfe bei Projekt, Laser Harfe

Hallo zusammen :slight_smile:

Ich bin noch ein blutiger Anfänger was Arduino angeht, dachte aber dass ich dieses Projekt: https://www.instructables.com/Arduino-Laser-Harp-1/ dank der sehr ausführlichen Anleitung umsetzen kann. Es ist alles wie beschrieben verdrahtet und verbunden, jedoch funktioniert es nicht, bzw. wird es auch nicht erkannt im MIDI Programm. Leider weiß ich nicht woran das Problem liegen kann, bzw. ist mein Verständnis dafür noch nicht gut genug.

Danke im Voraus

Stell mal dein Code hier rein in CODE Task, keine hat Lust das suchen und Downloaden.

Hier ist der Code:

  
  #define MIDI_LASER_COUNT 9
  #define MIDI_LASER_OCTAVE_DOWN 0
  #define MIDI_LASER_OCTAVE_UP 8
  
  short midiCalibrateAmbientLight = 1023;
  boolean midiLaserState[MIDI_LASER_COUNT] = {false, false, false, false, false, false, false, false, false};
  byte midiNotes[MIDI_LASER_COUNT] = {0, 0, 2, 4, 5, 7, 9, 11, 0};
  byte midiOctave = 5;
  byte midiPinLaser[MIDI_LASER_COUNT] = {3, 4, 5, 6, 7, 8, 9, 10, 11};
  byte midiPinVelocity = A0;
  unsigned long midiRateLimit[MIDI_LASER_COUNT] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
  unsigned long midiRateLimitThreshold = 35;
  unsigned long midiRateLimitThresholdOctave = 70;
  byte midiVelocity = 127;

  void setup() {
    calibrateAmbientLight();
    midiInitSerial();
    midiInitPins();
    midiIntroSong();
  }
  
  void loop() {
    midiReadLasers();
    midiReadVelocity();
  }
  
  void calibrateAmbientLight() {
    delay(100);
    midiCalibrateAmbientLight = analogRead(midiPinVelocity);
  }
  
  void midiIntroSong() {
    delay(1);
    midiSendNoteOn(60, 127);
    delay(125);
    midiSendNoteOff(60);
    midiSendNoteOn(64, 127);
    delay(125);
    midiSendNoteOff(64);
    midiSendNoteOn(67, 127);
    delay(125);
    midiSendNoteOff(67);
    midiSendNoteOn(72, 127);
    delay(250);
    midiSendNoteOff(72);
    midiSendNoteOn(67, 127);
    delay(125);
    midiSendNoteOff(67);
    midiSendNoteOn(72, 127);
    delay(500);
    midiSendNoteOff(72);
  }
  
  boolean midiHandleOctave(byte thePin, boolean theState) {
    if (!theState) {return false;}
    if ((thePin == MIDI_LASER_OCTAVE_DOWN) && midiOctave == 0) {return false;}
    if ((thePin == MIDI_LASER_OCTAVE_UP) && midiOctave == 9) {return false;}
    midiOctaveKill();
    switch(thePin) {
      case MIDI_LASER_OCTAVE_DOWN:
        midiOctave--;
        break;
      case MIDI_LASER_OCTAVE_UP:
        midiOctave++;
        break;
    }
    return true;
  }
  
  boolean midiHandleRateLimit(byte thePin) {
    unsigned long theMillis = millis();
    unsigned long theThreshold = 0;
    switch (thePin) {
      case MIDI_LASER_OCTAVE_DOWN:
      case MIDI_LASER_OCTAVE_UP:
        theThreshold = midiRateLimitThresholdOctave;
        break;
      default:
        theThreshold = midiRateLimitThreshold;
        break;
    }
    if (theMillis - midiRateLimit[thePin] >= theThreshold) {
      midiRateLimit[thePin] = theMillis;
      return true;
    }
    return false;
  }
  
  void midiHandleReadLaser(byte thePin, boolean theState) {
    if ((midiLaserState[thePin] != theState) && midiHandleRateLimit(thePin)) {
      midiLaserState[thePin] = theState;
      if ((thePin == MIDI_LASER_OCTAVE_DOWN) || (thePin == MIDI_LASER_OCTAVE_UP)) {
        midiHandleOctave(thePin, theState);
      } else if (theState) {
        midiSendNoteOn(midiNotes[thePin] + (12 *midiOctave), midiVelocity);
      } else {
        midiSendNoteOff(midiNotes[thePin] + (12 *midiOctave));
      }
    }
  }
  
  void midiInitPins() {
    for (byte thePin = 0; thePin < MIDI_LASER_COUNT; thePin++) {
      pinMode(midiPinLaser[thePin], INPUT);
    }
  }
  
  void midiInitSerial() {
    Serial.begin(31250);
  }
  
  void midiOctaveKill() {
    for (byte thePin = 0; thePin < MIDI_LASER_COUNT; thePin++) {
      if ((thePin == MIDI_LASER_OCTAVE_DOWN) || (thePin == MIDI_LASER_OCTAVE_UP)) {continue;}
      midiHandleReadLaser(thePin, LOW);
    }
  }
  
  void midiReadLasers() {
    for (byte thePin = 0; thePin < MIDI_LASER_COUNT; thePin++) {
      midiHandleReadLaser(thePin, digitalRead(midiPinLaser[thePin]));
    }
  }
  
  void midiReadVelocity() {
    midiVelocity = map(analogRead(midiPinVelocity), 0, midiCalibrateAmbientLight, 1, 127);
  }
  
  void midiSendCC(byte theCC, byte theValue) {
    Serial.write(B10110000);
    Serial.write(theCC);
    Serial.write(theValue);
  }
  
  void midiSendNoteOff(byte theNote) {
    Serial.write(B10000000);
    Serial.write(theNote);
    Serial.write(0);
    delay(1);
  }
  
  void midiSendNoteOn(byte theNote, byte theVelocity) {
    Serial.write(B10010000);
    Serial.write(theNote);
    Serial.write(theVelocity);
    delay(1);
  }

Stimmt die Baudratte im MIDI PRG (31250)?
Ist das Kabel mit den DIN Steckern 1zu1?
Bin kein Musiker, habe auch keine nötige Hardware, das Programm scheint IO. sein = kompiliert sauber. wird die MIDI Box im Windows erkannt,

Was für Spannung ist an den Eingangs Pins am Uno wenn die LED Draufstrahlen auf die LDR, und was wen die LDR zugedeckt mit der Hand sind?
Die muss sein Minimum 3,3V wenn die LED drauf Draufstrahlen und unter 1V wen zugedeckt, sonst erkennt der Uno nicht den unterscheid zw. High und Low


bzw

Meines erachtens ist das Schaltbild falsch.

grafik

Dabei ist Grün GND; Rot +5V und Gelb der digitale Eingang.

Richtig ist die verschiedenen digitalen Eingänge (gelb) zwischen Widerstand und LDR und +5V (rot) an den Widerstand.

Grüße Uwe

Hab ein bißchen herumgezeichnet ( und nur 2 nicht 9 Sensoren) gezeichnet:

Falls die Sensoren falsch reagieren ( als unterbrochen gemessen werden wenn nichts dazwischen ist) ist GND und ´+5V umzutauschen, ( am besten an den Pins des Arduino).
Grüße Uwe

Kleiner Fehler ist Digitaler :wink:
Was aber egal ist so wie gezeichnet wird nix, nur der der Arduino wo möglich defekt bei LDR mit 50R Widerstand x9, je nach dem wie tief der runtergeht bei Bestrahlung durch die LED

9 x 50Ω photo-resistors (LDRs);

Ps. Habe auf den Schaltplan auf der verlinkter Seite nicht genau geschaut :roll_eyes:

Danke, hab ich korrigiert

Dieser Autor (des Projekts auf Instructables) ärgern mich.
Selbst nichts verstehen und sich wichtig machen, indem er Anleitungen zu Bastelprojekten veröffentlichen, die nicht funktionieren bzw unfertig, sprich im Sketch sind noch Teile einer vorhergehenden Version, die nicht funktionierte.

Alternativ könnte man ihm unterstellen, daß er bewußt ein falschen Schaltbild veröffentliche um das Nachbauen des Projekts zu verhindern, Nachbauer zu ärgern oder zu trollen.

Dann noch im Komentar wurde von 6 Jahren auf den Fehler hingewiesen und es erfolgte keine reaktion.

Solche fehlerhaften Projekte machen Anfängern das Leben schwer weil diese nicht erkennen können was falsch ist und in der annahme daß der Autor ein astreines Projekt presentiert, verzweifeln weil sie den Fehler bei sich suchen.

Grüße Uwe

Ist doch in 50% so.

Mal eine Laserharfe von Make (Heise). Ich habe sie nicht getestet, aber Make macht eigentlich gute Sachen.

Gruß Tommy

1 Like

Sehr schön nur etwas kompliziert, vor allem der Galvo-Scanner, ist nicht so rucki-zucki gebaut

Ein schönes Projekt, aber sicher zu schwierig für Anfänger.

Aber wird wohl funktionieren.
Entweder ewig experimentieren bei falschen oder unvollständigen Internet-Veröffentlichungen oder gleich was Richtiges machen.
Entscheiden muss das jeder selbst, was ihm seine Zeit und sein Geld (wer billig kauft, kauft doppelt) wert sind.

Gruß Tommy

Vor allem wird geantwortet wen Fragen auftauchen.

Größtes Vorteil ist das.

Als Laserharfen-Erprobter mische ich mich auch mal ein, auch wenn @juliax offenbar abgetaucht ist.

Hier hatte ich ja meine Make-Variante gezeigt. Funktioniert, ist aber wegen des rahmenlosen Aufbaus deutlich anspruchsvoller als die hier angefragte Rahmenvariante.
Den Galvo muss man übrigens nicht bauen, gibt's fertig incl. Steuerung, aber das steht ja in dem Make-Artikel alles drin. Alle meine vorherigen Versuche mit Schrittmotoren etc. waren unbrauchbar, also hab ich so ein Ding einfach gekauft.

Zurück zum Thema: hier brutzeln n Lasermodule auf n LDRs, unterbricht man den Strahl wird's halt detektiert und ein Note-On gesendet, ist die Unterbrechung weg wieder ein Note-Off. Welcher Notenwert ist halt ein Parameter.

Ich empfehle @juliax, mal auf einen Minimalsketch mit EINEM Empfänger zu gehen. Dann sieht man auch, ob die Hardware richtig verstöpselt ist. Dann die Anzahl erhöhen, dann Gimmicks einbauen.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.