Spil klaver med ARDUINO UNO - eller, at have 8 knapper på en enkelt port.

Under arbejdet med Decoder og Touch-keyeren, fik jeg ideen til et udviddet knap-panel, som kun bruger en enkelt ANALOG port til afkodningen.

Eksperimentet er en afart af Touch-keyerens 4 knapper, som osse læses på en ANALOG port, og her er så 8 knapper, som tydeligvis sagtens kan fungerer med læsning fra en enkelt port.

Eksperimentet kom til at se således ud:

En DEMO video kan ses her: https://www.youtube.com/watch?v=XJVwMmnN26w

I Princippet er det blot en række kontakter som alle er forbundet til stel i den ene ende, og til den næste kontakt via en 1 K Ohms modstand i den anden ende. Den sidste kontakt i rækken er forbundet med en 1 K ohms modstand til + 5 Volt og til den ANALOG-port som skal læses af softwaren, forbundet til ARDUINO UNO som vist  herunder:

Højtaleren er tilføjet for at indikere, at der virkelig sker noget, når man trykker på knapperne.

Software, der kan læse en ANALOG port på ARDUINO UNO kunne se sådan ud:

UPDATE: 30.04.15

//*************************************************************************************

//**                         Test knapper som klaver-toner                           **

//*************************************************************************************

int analogPin = A3;                                // Analog port A3

int audioOutPin = 3;                               // Højtaler forbindes til pin3 og til GND
                                                   // 100 Ohm beskytter porten mod overbelastning
int val = 0;                                       // variable til at gemme den læste værdi

int val1[10] = {51,68,76,81,85,87,89,91};          // Heltals tabel af læste knapper division 10

int node[10] = {523,587,659,698,784,880,988,1047}; // C-dur skalaen i Hertz følger knapperne

int dltime   = 100;                                // delay-tid = 0,1 sekund

//**************************************************************************************

 

//**************************************************************************************

//**  Arduino har en DEBUG-FUNKTION, som kaldes fra ARDUINO software udviklings miljø,**

//**  MENU-liniens Værktøjer, vælg Seriel Overvågning.                                **

//**  Der åbnes et vindue, som kan kommunikere via USB-linien med ARDUINO'en via      **
//**  USB interface. Husk at checke, at BAUD-rate er ens i program og i Winduet       **

//**************************************************************************************

 

void setup()

{

    Serial.begin(9600);                            // Start serial communication DEBUG, 9600 Baud

}

 

 

//**************************   HOVED-LOOP   ********************************************

void loop()

{

    int nyval = 0;

    val = analogRead(analogPin);                   // Læs den ANALOGE input pin

//**************************************************************************************

//** En ANALOG port på ARDUINO kan læse en værdi mellem 0 og 5 Volt. Denne læsning    **
//** resulterer i et tal mellem 0 og 1023                                             **

//** Læsning af porten kan resultere i, at tallet har usynlige decimal-dele, og så    **

//** vil resultatet stå og skifte mellem f. eks. 510 og 511. For at undgå, at vi ikke **
//** står med en værdi der kan skifte til en anden, smider vi det mindst betydende    **
//** ciffer væk, ved at tage heltalsværdien af tallet divideret med 10, som herunder  **

//**************************************************************************************

    nyval = int(val/10);                           // her vil værdien 511 f. eks. blive 51

 

//**************************************************************************************

// En "for-next-løkke" tæller gennem vores knapper og vælger en tilsvarende tone      **

// "i" er en heltalsvariabel, som kan antage en hvilken som helst heltalsværdi mellem **
//
-32,768 til 32,767.                                                                **

// Her starter vi med at sætte værdien til 0 = null                                   **

// derefter spørger vi om det er sandt eller falsk, at "i" er mindre, eller lig med 8,**

// for til sidst, hvis det er sandt, at "i" skal forøges med "1". Men inden da        **

// spørger vi om er sandt eller falsk, at tallet i vores tabel "val1", den            **

// "i-ende" karakter har samme værdi som knappen vi trykkede på, (hvis i=2 testes 68  **

// mod knappens værdi) og hvis de er ens er det jo sandt, så aktiveres en Tone på     **

// porten audioOutPin, med en frekvens svarende til den "i-ende" (2= 587 hz) tone i   **

// tabellen node, som er C-durs skalaen i Hertz. Derefter laves en kort pause, og der **

// udskrives Serial.print og hvis ikke knappen stadig er trykket, stoppes tonen igen  **
//**************************************************************************************

 

    for ( int i = 0; i <= 8; i++ )

    {

        if ( nyval == val1[i] )                    // er der trykket på en knap ?

        {

            tone( audioOutPin,node[i] );           // Send noden til højtaler

 

            if ( nyval == val1[i] )                // er knappen stadig trykket ?

                {

                    delay(dltime);                 // lav et delay

//***************************************************************************************

//** Her kunne indføres en Serial.print for at følge med i, om der læses de forventede **
//** data fra den analoge port.                                                        **

//** Det ville da se således ud:                                                       **

 

Serial.print("Button Value is : ");                // DEBUG funktionen udskriver...

Serial.print(nyval);                               // værdien for den læste knap

Serial.print("  the Tone is = ");

Serial.print(node[i]);

Serial.println(" Hz");

 

//Det ville se sådan ud: Button Value is : 68 the Tone is = 587 Hz

// "println" afslutter den opågældende linie                                           **

// Senere kan vi lære, hvordan man kan aktivere/de-aktivere en sådan funktion          **
//***************************************************************************************

                }

        }

        else

        {

            noTone( audioOutPin );                 // eller sluk for tonen

        }

    }

}

//***************************************************************************************

//**              END af HOVED-LOOP og DEMO-program                                    **

//***************************************************************************************