• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
MIDI oraz toggle switch
#1
witam

Zaznaczam że jestem bardzo początkującym adeptem programowania Smile

Potrzebuję stworzyć teoretycznie prosty program który ma jedno wyjście z arduino ustawiać w stan logicznego 0 lub 1 , na zasadzie toggle za pomoca zwykłego switcha monostabilnego oraz komunikatów midi.

kod zwykłego przełączania stanu wyjścia za pomocą jednego przycisku mam napisane i rozumiem


Kod:
int inPin = 5;        
int outPin = 13;      

int state = 1;      // poczatkowy stan wyjscia
int reading;           // aktualny stan
int previous = 0;    // poprzedni stan


void setup()
{
 pinMode(inPin, INPUT);
 pinMode(outPin, OUTPUT);
}

void loop()
{
 reading = digitalRead(inPin);
 delay(50);

 
 
 if (reading == 1 && previous == 0) {
   if (state == 0)
     state = 1;
   else
     state = 0; {

 }

 digitalWrite(outPin, state);

 previous = reading;
}

Obsługę samego midi również opanowałem, przy otrzymaniu komunikatu program change 1 na kanale 1, ustawiam wyjscie w stan "1", gdy otrzymam komunikat program change 2 na kanale 1 - ustawiam stan wyjścia na "0"


Kod:
byte commandByte;
byte noteByte;

int inPin = 5;        
int outPin = 13;      
 

void setup(){
 Serial.begin(31250);
 pinMode(inPin, INPUT);
 pinMode(outPin, OUTPUT);

}


void loop()
{    if (Serial.available() > 0){
     commandByte = Serial.read();
     noteByte = Serial.read();
     if (commandByte == 192 && noteByte == 1){
       
         digitalWrite(outPin,HIGH);
       }
     }
     if (commandByte == 192 && noteByte == 2){
       
         digitalWrite(outPin,LOW);
       }

         delay(10);
     }
   

Problem mam teraz jak napisać program który łączy midi i zwykłęgo switcha monostabilnego.

Ma to działać tak:
Odpalamy program i na starcie stan wyjścia = 1
jeśli nacisnę przycisk - stan wyjścia = 0
jeśli ponownie nacisnę - stan wyjścia = 1
teraz jeśli przyjdzie komunikat midi program change 1 - stan wyjścia = 1 czyli dalej taki jaki był
jeśli nacisnę przycisk - stan wyjścia = 0
jeśli przyjdzie ponownie komunikat midi program change 1 - stan wyjścia = 1
jeśli przyjdzie komunikat midi program change 2 - stan wyjścia = 0
jeśli teraz nacisnę przycisk - stan wyjścia = 1
po prostu działanie na zasadzie toggle...

Mam nadzieję że zrozumiale napisałem

Próbuje coś sensownego sklecić ale albo błedy wywala albo nie działa.

Można prosić kogoś o pomoć? albo nakierowanie jak to zrobić...

pozdrawiam
 
Odpowiedź
#2
witam

Popracowałem trochę nad tym i udało się
Kod:
int in = 5;       //pin z klawiszem
int out = 13;     //dioda na pokladzie arduino

byte commandByte; //odczyt pierwszego bitu (kanal)
byte noteByte;    //odczyt drugiego bitu (rozkaz)
int state = 1;    //stan poczatkowy wyjscia
int reading;      //zmienna czy klawisz nacisniety
int poprzedni = 0; //zmienna zapisujaca stan poprzedni


void setup()
{
Serial.begin(31250);
pinMode(in, INPUT);
pinMode(out, OUTPUT);

}

void loop()
{
reading = digitalRead(in);    
delay(2);                    
 if (reading == 1 && poprzedni == 0)
  {
   if (state == 0)
    state = 1;
   else
    state = 0;
  }
  else if (Serial.available() > 0)
  {
   commandByte = Serial.read();
   noteByte = Serial.read();
   if (commandByte == 192 && noteByte == 127)
    {
     if (state == 0)
      state = 1;
    }
  else if (commandByte == 192 && noteByte == 2)
    {
     if (state == 1)
      state = 0;
    }
  }
digitalWrite(out, state);
poprzedni = reading;

}

działa dokładnie tak jak chciałem, tylko przy szybkim przełączaniu rozkazów midi, nie zawsze zadziała, pomimo że wyśle to nie przełączy, tak jakby arduino za wolne było.

Ma ktoś pomysł co może być problemem ?
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości