midi footswitch sketch probleem

Arduino specifieke Software
Berichten: 9
Geregistreerd: 04 Sep 2018, 20:18

midi footswitch sketch probleem

Berichtdoor adinatha » 20 Sep 2018, 12:44

Hallo,
Ik heb een midi footswitch gebouwd (zie ook projecten)
In het kort komt het hier op neer:
5 schakelaars, vijf leds, en een midiplug
Elke schakelaar heeft zijn bijbehorende led en zend een bijbehorende midicode uit.
Het systeem heeft goed gewerkt maar de schakelaars schakelden de IO ingangen eerst naar massa.
Nu maak mijn footswitch draadloos, maar dat betekent dat de schakelaars nu de ingangen naar +5v schakelen.
Dat werkt allemaal wel nu maar de leds werken niet goed.
Als ik schakelaar1 indruk gaat led1 wel aan maar als ik een schakelaar2 indruk gaat led2 aan maar led1 blijft ook aan, en die moet nu juist uit.
In het programma doet het subprogje 'reset leds' dat.

Onderstaand is het oude programma die goed werkte. daaronder de nieuwe
cpp code
//constants:
#define SWITCHCOUNT 5

// input IO pins
#define SWITCHoffset 2
#define SWITCH1 3
#define SWITCH2 4
#define SWITCH3 5
#define SWITCH4 6
#define SWITCH5 7

// assignes LED1 t/m 5 to I/O pins 8 t/m 12
#define LED1 8
#define LED2 9
#define LED3 10
#define LED4 11
#define LED5 12

#define BOUNCEDELAY 100

//Variabeles:
int switches[5] = { SWITCH1, SWITCH2, SWITCH3, SWITCH4, SWITCH5 };
int switchState[5] = { HIGH, HIGH, HIGH, HIGH, HIGH };
// initial switchstate is high

int leds[5] = { LED1, LED2, LED3, LED4, LED5 };
int ledState[5] = { LOW, LOW, LOW, LOW, LOW };
// initial all leds out

int currentProgram = 0;
int offset = 0;


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

// Setup Offset switch
pinMode(SWITCHoffset, INPUT ); //pin2 is input
digitalWrite(SWITCHoffset, HIGH ); //pullup geactiveerd


// Setup Switches and leds initial states, loop runs 5 times = amount 'SWITCHCOUNT'
for( int currentSwitch = 0; currentSwitch < SWITCHCOUNT; currentSwitch++ )
{
// SWITCH 1 t/m 5 configured as inputs and activation pullup
pinMode( switches[currentSwitch], INPUT );
digitalWrite( switches[currentSwitch], HIGH );

// LED 1 t/m 5 configured as outputs and initial put off.
pinMode( leds[currentSwitch], OUTPUT );
digitalWrite(leds[currentSwitch], ledState[currentSwitch]);
}
}

void resetLeds () { //alle leds uit
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
digitalWrite(LED4, LOW);
digitalWrite(LED5, LOW);
}

void loop() //first part, prog for offset switch.
{
int value = digitalRead(SWITCHoffset);
if (value == HIGH) {
offset = 0; //patches repetitie 0 t/m 5
}
else {
offset = 5; //patches live 6 t/m 10
}

// prog read switches, set led, send MIDI
for( int currentSwitch = 0; currentSwitch < SWITCHCOUNT; currentSwitch++ ) //loop runs 5 times
{
if(( digitalRead(switches[currentSwitch]) != switchState[currentSwitch]) && (switchState[currentSwitch] == HIGH))
{
switch( currentSwitch )
{
case 0:
currentProgram = 01;
resetLeds;
digitalWrite(LED1, HIGH);
Serial.print(0xC0); //send midi progchange code
Serial.print(01+offset); //send patch code, depending on switch offset
break;

case 1:
currentProgram = 02;
resetLeds;
digitalWrite(LED2, HIGH);
Serial.print(0xC0);
Serial.print(02+offset);
break;

case 2:
currentProgram = 03;
resetLeds;
digitalWrite(LED3, HIGH);
Serial.print(0xC0);
Serial.print(03+offset);
break;

case 3:
currentProgram = 04;
resetLeds;
digitalWrite(LED4, HIGH);
Serial.print(0xC0);
Serial.print(04+offset);
break;

case 4:
currentProgram = 05;
resetLeds;
digitalWrite(LED5, HIGH);
Serial.print(0xC0);
Serial.print(05+offset);
break;
}
delay( BOUNCEDELAY );
}
switchState[currentSwitch] = digitalRead( switches[currentSwitch] );
}
}


Dan de nieuwe waar dus een fout in moet zitten, maar het lijkt m.i goed
Dus snap ik niet waar de fout zit.
Ik heb wel een en ander verwijderd zoals 'offset' , aan de stand van een schakelaar werd de midicode verhoogt met 5.
en zaken veranderd van high naar low, of andersom.

//constants:
#define SWITCHCOUNT 5
// switchcount dient als scanner

// input IO pins
#define SWITCH1 3
#define SWITCH2 4
#define SWITCH3 5
#define SWITCH4 6
#define SWITCH5 7

// assignes LED1 t/m 5 to I/O pins 8 t/m 12
#define LED1 8
#define LED2 9
#define LED3 10
#define LED4 11
#define LED5 12

#define BOUNCEDELAY 100
//anti dender schakelaars

//Variabeles:
int switches[5] = { SWITCH1, SWITCH2, SWITCH3, SWITCH4, SWITCH5 };
int switchState[5] = { LOW, LOW, LOW, LOW, LOW };
// initial switchstate is low

int leds[5] = { LED1, LED2, LED3, LED4, LED5 };
int ledState[5] = { LOW, LOW, LOW, LOW, LOW };
// initial all leds out

int currentProgram = 0;


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


// Setup Switches and leds initial states, loop runs 5 times = amount 'SWITCHCOUNT'
for( int currentSwitch = 0; currentSwitch < SWITCHCOUNT; currentSwitch++ )
{
// SWITCH 1 t/m 5 configured as inputs and initially put off.
pinMode( switches[currentSwitch], INPUT );
digitalWrite( switches[currentSwitch], LOW );

// LED 1 t/m 5 configured as outputs and initial put off.
pinMode( leds[currentSwitch], OUTPUT );
digitalWrite(leds[currentSwitch], ledState[currentSwitch]);
}
}

void resetLeds () { //alle leds uit
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
digitalWrite(LED4, LOW);
digitalWrite(LED5, LOW);
}

void loop() //f
{

// prog read switches, set led, send MIDI
for( int currentSwitch = 0; currentSwitch < SWITCHCOUNT; currentSwitch++ ) //loop runs 5 times
{
if(( digitalRead(switches[currentSwitch]) != switchState[currentSwitch]) && (switchState[currentSwitch] == LOW))
{
switch( currentSwitch )
{
case 0:
currentProgram = 01;
resetLeds;
digitalWrite(LED1, HIGH);
Serial.print(0xC0); //send midi progchange code
Serial.print(01);
break;

case 1:
currentProgram = 02;
resetLeds;
digitalWrite(LED2, HIGH);
Serial.print(0xC0);
Serial.print(02);
break;

case 2:
currentProgram = 03;
resetLeds;
digitalWrite(LED3, HIGH);
Serial.print(0xC0);
Serial.print(03);
break;

case 3:
currentProgram = 04;
resetLeds;
digitalWrite(LED4, HIGH);
Serial.print(0xC0);
Serial.print(04);
break;

case 4:
currentProgram = 05;
resetLeds;
digitalWrite(LED5, HIGH);
Serial.print(0xC0);
Serial.print(05);
break;
}
delay( BOUNCEDELAY );
}
switchState[currentSwitch] = digitalRead( switches[currentSwitch] );
}
}

Kan iemand van de forumleden mij hiermee helpen de fout te vinden.?

Advertisement

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: midi footswitch sketch probleem

Berichtdoor nicoverduin » 20 Sep 2018, 13:17

adinatha schreef:Hallo,
Nu maak mijn footswitch draadloos, maar dat betekent dat de schakelaars nu de ingangen naar +5v schakelen.

Ik snap de logica ff niet.
Je hebt nog steeds een - van de Arduino dus blijf je gewoon schakelen naar de -.
Als je naar de Plus wil schakelen, dan moet je de pullup-uitzetten en van elke datapin een weerstand (4K7-10K) naar GND (dus de -) verbinden. Daarnaast moet je deze regel aanpassen:
cpp code
if(( digitalRead(switches[currentSwitch]) != switchState[currentSwitch])  && (switchState[currentSwitch] == LOW))

Immers je schakelt nu naar HOOG en niet LAAG
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 9
Geregistreerd: 04 Sep 2018, 20:18

Re: midi footswitch sketch probleem

Berichtdoor adinatha » 20 Sep 2018, 13:36

Hoi Nico ik maak ook gebruik van pulldowns van 10k.
Regel 200 staat ook wel "LOW", dat heb ik wel aangepast.
Maar hij blijkt ook geen midisignaal te sturen, dus ik denk dat er nog wel meer niet goed is.

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: midi footswitch sketch probleem

Berichtdoor nicoverduin » 20 Sep 2018, 14:05

Volgens mij moet een switch high zijn als hij is ingedrukt
En waarom een digitalWrite op low op je ingangen?
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 9
Geregistreerd: 04 Sep 2018, 20:18

Re: midi footswitch sketch probleem

Berichtdoor adinatha » 20 Sep 2018, 14:26

De digital write 'low' is inderdaad niet nodig.
bij de vorige versie werd er een high geschreven om de interne pullup weerstanden te activeren.
Maar nu heb ik externe pulldown weerstanden.
Ik ga het aanpassen

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: midi footswitch sketch probleem

Berichtdoor nicoverduin » 20 Sep 2018, 16:03

En die switch test is nog fout
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 9
Geregistreerd: 04 Sep 2018, 20:18

Re: midi footswitch sketch probleem

Berichtdoor adinatha » 22 Sep 2018, 09:42

Nou schiet mij maar lek.
Ik heb regel 178 verwijderd, en bij regel 200 'LOW' veranderd in 'HIGH'.
Vreemde is nu als ik de board reset dat led 4 en 5 voor een seconde of twee gaan branden, en dan uit.
Hij zend een midicode uit maar niet de goede???
Dat moet betekenen dat case 0 t/m 5 uitvoert maar daar staat ook dat hij subprog 'resetleds' moet uitvoeren en dat gebeurt niet, terwijl ik daar niets aan veranderd heb.

Enige wat ik veranderd heb is ingangen naar 5v schakelen ipv massa en het is op de hobbel.
Ik ben er te lang uit en programmeren is ook niet echt mijn ding, heb toen ook hulp gehad van iemand maar snappen?
Onderstaande regel snap ik ook niet echt wat daar gebeurt

if(( digitalRead(switches[currentSwitch]) != switchState[currentSwitch]) && (switchState[currentSwitch] == HIGH))
{
switch( currentSwitch )

Het moet toch niet zo moeilijk om 5 schakelaars continu te scannen en een paar ledjes aan te sturen?

Als iemand nog tips heeft, of wellicht helemaal opnieuw beginnen, ik houd me aanbevolen.

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: midi footswitch sketch probleem

Berichtdoor nicoverduin » 22 Sep 2018, 10:02

Laat eerst de laatste versie van jouw sketch zien
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 9
Geregistreerd: 04 Sep 2018, 20:18

Re: midi footswitch sketch probleem

Berichtdoor adinatha » 23 Sep 2018, 09:34

cpp code
//constants:
#define SWITCHCOUNT 5
// switchcount dient als scanner

// input IO pins
#define SWITCH1 3
#define SWITCH2 4
#define SWITCH3 5
#define SWITCH4 6
#define SWITCH5 7

// assignes LED1 t/m 5 to I/O pins 8 t/m 12
#define LED1 8
#define LED2 9
#define LED3 10
#define LED4 11
#define LED5 12

#define BOUNCEDELAY 100
//anti dender schakelaars

//Variabeles:
int switches[5] = { SWITCH1, SWITCH2, SWITCH3, SWITCH4, SWITCH5 };
int switchState[5] = { LOW, LOW, LOW, LOW, LOW };
// initial switchstate is low

int leds[5] = { LED1, LED2, LED3, LED4, LED5 };
int ledState[5] = { LOW, LOW, LOW, LOW, LOW };
// initial all leds out

int currentProgram = 0;


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


// Setup Switches and leds initial states, loop runs 5 times = amount 'SWITCHCOUNT'
for( int currentSwitch = 0; currentSwitch < SWITCHCOUNT; currentSwitch++ )
{
// SWITCH 1 t/m 5 configured as inputs and initially put off.
pinMode( switches[currentSwitch], INPUT );

// LED 1 t/m 5 configured as outputs and initial put off.
pinMode( leds[currentSwitch], OUTPUT );
digitalWrite(leds[currentSwitch], ledState[currentSwitch]);
}
}

void resetLeds () { //alle leds uit
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
digitalWrite(LED4, LOW);
digitalWrite(LED5, LOW);
}

void loop()
{

// prog read switches, set led, send MIDI
for( int currentSwitch = 0; currentSwitch < SWITCHCOUNT; currentSwitch++ ) //loop runs 5 times
{
if(( digitalRead(switches[currentSwitch]) != switchState[currentSwitch]) && (switchState[currentSwitch] == HIGH))
{
switch( currentSwitch )
{
case 0:
currentProgram = 01;
resetLeds;
digitalWrite(LED1, HIGH);
Serial.print(0xC0); //send midi progchange code
Serial.print(01);
break;

case 1:
currentProgram = 02;
resetLeds;
digitalWrite(LED2, HIGH);
Serial.print(0xC0);
Serial.print(02);
break;

case 2:
currentProgram = 03;
resetLeds;
digitalWrite(LED3, HIGH);
Serial.print(0xC0);
Serial.print(03);
break;

case 3:
currentProgram = 04;
resetLeds;
digitalWrite(LED4, HIGH);
Serial.print(0xC0);
Serial.print(04);
break;

case 4:
currentProgram = 05;
resetLeds;
digitalWrite(LED5, HIGH);
Serial.print(0xC0);
Serial.print(05);
break;
}
delay( BOUNCEDELAY );
}
switchState[currentSwitch] = digitalRead( switches[currentSwitch] );
}
}

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: midi footswitch sketch probleem

Berichtdoor nicoverduin » 23 Sep 2018, 14:50

Ik zou bijna denken dat jouw aansluitwerk een beetje gammel is
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Volgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Bing [Bot] en 26 gasten