Arduino Piano

Ich versuche zur Zeit ein Arduino Piano zu programmieren. Wir haben die Schaltung soweit aufgebaut. Wir nutzen einen Arduino Uno. Wir benötigen für dieses Projekt die CapitiveSense Library. Und haben diese bereits installiert und ein Programm geschrieben. Nun möchten wir das ganze ausprobieren. Das Programm funktioniert jedoch nicht. Könnte mir vielleicht jemand helfen? ich habe hier das Programm:

#include <CapacitiveSensor.h>

CapacitiveSensor   cs_0_1 = CapacitiveSensor(0,1);        
CapacitiveSensor   cs_0_2 = CapacitiveSensor(0,2);     
CapacitiveSensor   cs_0_3 = CapacitiveSensor(0,3);
CapacitiveSensor   cs_0_4 = CapacitiveSensor(0,4); 
CapacitiveSensor   cs_0_5 = CapacitiveSensor(0,5); 
CapacitiveSensor   cs_0_6 = CapacitiveSensor(0,6); 
CapacitiveSensor   cs_0_7 = CapacitiveSensor(0,7); 
CapacitiveSensor   cs_0_8 = CapacitiveSensor(0,8); 

void setup()  
{

  pinMode (1, OUTPUT); //Ton 1
  pinMode (2, OUTPUT); //Ton 2
  pinMode (3, OUTPUT); //Ton 3
  pinMode (4, OUTPUT); //Ton 4
  pinMode (5, OUTPUT); //Ton 5
  pinMode (6, OUTPUT); //Ton 6
  pinMode (7, OUTPUT); //Ton 7
  pinMode (8, OUTPUT); //Ton 8
  
  pinMode (13, OUTPUT); //Lautsprecher 

  
 
   // cs_0_1.set_CS_AutocaL_Millis(0xFFFFFFFF); 
   Serial.begin(9600);
}

void loop()                    
{
    //long start = millis();
    long total1 =  cs_0_1.capacitiveSensor(2);
    long total2 =  cs_0_2.capacitiveSensor(2);
    long total3 =  cs_0_3.capacitiveSensor(2);
    long total4 =  cs_0_4.capacitiveSensor(2);
    long total5 =  cs_0_5.capacitiveSensor(2);
    long total6 =  cs_0_6.capacitiveSensor(2);
    long total7 =  cs_0_7.capacitiveSensor(2);
    long total8 =  cs_0_8.capacitiveSensor(2);
    
    /* Serial.print(millis() - start);        
    Serial.print("\t");   */                 

    Serial.print(total1);                  
    Serial.print("\t");
    Serial.print(total2);                  
    Serial.print("\t");
    Serial.print(total3);                
    Serial.print("\t");
    Serial.print(total4);  
    Serial.print("\t");
    Serial.print(total5); 
    Serial.print("\t");
    Serial.print(total6); 
    Serial.print("\t");
    Serial.print(total7); 
    Serial.print("\t");
    Serial.println(total8);     
       
       
    delay(10);

    tone (1, 131);
    tone (2, 147);
    tone (3, 165);
    tone (4, 175);
    tone (5, 196);
    tone (6, 220);
    tone (7, 247);
    tone (8, 262);
 
   
}

Hier ein Video vom Projekt wie es am Ende aussehen soll! DIe Coladosen wegdenken :smiley:

Bitte um baldige Hilfe! =(

Das Programm funktioniert jedoch nicht.

Hoffst Du auf unsere hellseherischen Fähigkeiten oder glaubst Du mehr an die Kristallkugel?

Bitte klare Fehlerbeschreibung.
Grüße Uwe

So wie ich das Programm verstehe machst du das:

  1. Capacitve Sensoren einlesen und werte speichern.
  2. Werte serial ausgeben.
  3. auf 8 Pins Töne fester Frequenz und unendlicher Dauer einschalten.

Das sieht nicht nach Klavier aus!

bevor du einen kompletten Code schreibst, und dann versuchst zu raten, warum das nicht funktioniert, solltest du das in kleinen Schritten machen!

zuerst einen Ton ausgeben (hörbar!!!)
wenn das klappt, pobieren ob du die kapazitiven Taster einlesen kannst. (Prüfen über Serial.print)
dann probieren mit EINEM Taster EINEN Ton ein und ausschalten.
dann erweitern auf mehrere Töne.

Wenn du so einen Schritt nach dem anderen machst, ist die wahrscheinlichkeit am Ziel anzukommen deutlich größer.

was von dem, was ich skizziert habe klappt denn?

edit:
Ach ja, noch was:
der Lautsprecher scheint mit Pin13 angesteuert zu werden.
Die Töne gibst du aber auf den Pins 1-8 aus. Falls da nicht irgendeine geniale Mischerschaltung dahinter hängt, wirst du nie was hören.

UPDATE !!!

Habe mich nun einmal Stück für Stück mit dem Problem auseinandergesetzt und habe nun ein Funktionierendes Programm geschaffen! Das Programm erkennt es nun wenn man die Alufolie berührt und es gibt einen Ton aus! Dieser Ton ist allerdings ziemlich schlecht und man kann kaum etwas hören, der ton ist wie ein leises brummen! Hat jemand dafür eine Lösung?
Hier das Programm!

#include <CapacitiveSensor.h>

CapacitiveSensor   cs_0_1 = CapacitiveSensor(4,9);        
CapacitiveSensor   cs_0_2 = CapacitiveSensor(4,5);       
CapacitiveSensor   cs_0_3 = CapacitiveSensor(4,8);
CapacitiveSensor   cs_0_4 = CapacitiveSensor(4,10);
CapacitiveSensor   cs_0_5 = CapacitiveSensor(4,6);
CapacitiveSensor   cs_0_6 = CapacitiveSensor(4,11);
CapacitiveSensor   cs_0_7 = CapacitiveSensor(4,12);
CapacitiveSensor   cs_0_8 = CapacitiveSensor(4,7);

void setup()                    
{
   cs_0_1.set_CS_AutocaL_Millis(50); 
   cs_0_2.set_CS_AutocaL_Millis(50); 
   cs_0_3.set_CS_AutocaL_Millis(50);
   cs_0_4.set_CS_AutocaL_Millis(50); 
   Serial.begin(9600);   
}

void loop()                    
{
    long start = millis();
    long total1 =  cs_0_1.capacitiveSensor(30);
    long total2 =  cs_0_2.capacitiveSensor(30);
    long total3 =  cs_0_3.capacitiveSensor(30);
    long total4 =  cs_0_4.capacitiveSensor(30);
    long total5 =  cs_0_5.capacitiveSensor(30);
    long total6 =  cs_0_6.capacitiveSensor(30);
    long total7 =  cs_0_7.capacitiveSensor(30);
    long total8 =  cs_0_8.capacitiveSensor(30);
    
      if (total1 > 500)
   {
     tone(13,262);
   }
      if (total1 < 500)
   {
     noTone(13);
   }
   
        if (total2 > 500)
   {
     tone(13,294);
   }
      if (total2 < 500)
   {
     noTone(13);
   }
   
        if (total3 > 500)
   {
     tone(13,330);
   }
      if (total3 < 500)
   {
     noTone(13);
   }
   
        if (total4 > 500)
   {
     tone(13,349);
   }
      if (total4 < 500)
   {
     noTone(13);
   }
   
        if (total5 > 500)
   {
     tone(13,392);
   }
      if (total5 < 500)
   {
     noTone(13);
   }
   
        if (total6 > 500)
   {
     tone(13,440);
   }
      if (total6 < 500)
   {
     noTone(13);
   }
   
        if (total7 > 500)
   {
     tone(13,494);
   }
      if (total7 < 500)
   {
     noTone(13);
   }
   
        if (total8 > 500)
   {
     tone(13,523);
   }
      if (total8 < 500)
   {
     noTone(13);
   }   

    Serial.print(millis() - start);        
    Serial.print("\t");                    
    Serial.print(total1);                 
    Serial.print("\t");
    Serial.print(total2);                 
    Serial.print("\t");
    Serial.print(total3);
    Serial.print("\t");
    Serial.print(total4);
    Serial.print("\t");
    Serial.print(total5);
    Serial.print("\t");
    Serial.print(total6);
    Serial.print("\t");
    Serial.print(total7);
    Serial.print("\t");
    Serial.println(total8);
    delay(10);                             
}

Hoffe auf baldige Hilfe von Euch! Danke schon mal im Vorraus :smiley:

Dieser Ton ist allerdings ziemlich schlecht und man kann kaum etwas hören, der ton ist wie ein leises brummen! Hat jemand dafür eine Lösung?

Vieleicht liegt das am Lautsprecher bzw dessen Ansteuerung.
Wir brauchen immernoch Informationen.
Grüße Uwe

Statt eines Videos von einem anderen Projekt, wäre ein Bild vom eigentlichen hardwareaufbau plus ein Schaltplan hilfreich.
Am Programm kann man leider nicht sehen wie die Hardware aufgebaut ist.
Mario.

trickworldent:
Dieser Ton ist allerdings ziemlich schlecht und man kann kaum etwas hören, der ton ist wie ein leises brummen! Hat jemand dafür eine Lösung?

Hast Du mal technische Daten zum angeschlossenen Lautsprecher und den Wert des zur Anpassung angeschlossenen Widerstands oder Kondensators?

Wenn der Lautsprecher direkt an Pin-13 und GND hängt (in Deinen Postings kann ich zwar irgendwo "Lautsprecher" lesen aber nichts von Widerstand/Kondensator), kannst Du von Glück reden, wenn Du den Controller nicht bereits durch Überlastung geschrottet hast, weil dann viel zu viel Strom durch den Controllerpin fließt.

Rechenbeispiel für Lautsprecherimpedanz 8 Ohm, Spannung an Pin-13 5V, dann fließt nach Ohm wenn sonst der Strom nicht gebremst wird:
I = U/R = 5 V / 8 Ohm = 0,625 A = 625 mA.

So viel kann natürlich nicht fließen, weil die Arduino-Pins (max. erlaubt 40 mA) gar nicht so viel Strom hergeben. Aber so im Kurzschlussversuch mal eben gut den 15-fachen des erlaubten Stroms ziehen zu wollen, kann natürlich nicht zu einem schönen Ausgangssignal führen. Höchstens zu einem durchgebrannten Controller.

if (total4 > 500)
   {
     tone(13,349);
   }
      if (total4 < 500)
   {
     noTone(13);
   }

das ist auch schlecht. erstmal fragst du auf größer und kleiner ab. was ist aber, wenns genau 500 ist?
dann hast du auch noch zwei Abfragen drin. das verbraucht nur unnötig rechenleistung. mach lieber sowas:

if (total4 > 500) {
     tone(13,349);
} else {
     noTone(13);
}

Damit hast du beides erledigt.

Problem gelöst! Freitag Fertiges Programm online!

Das Problem lag am Programm, da es nur den Reiz eines Sensors mit einem Ton ausgeben konnte Genaueres Freitag!