• 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
Odbiór MIDI
#1
Witam, od pewnego czasu głowię się z odbiorem przez Arduino MEGA nadawanego sygnału midi poprzez nożny kontroler do gitary. Kontroler ten po załączeniu przycisku wysyła sygnał który zawiera w tym wypadku kanał i Control Change. W celu selekcji kanału i przesłania go dalej przez przelotkę zastosowałem taki oto układ https://www.midikits.net/MIDI_IN_OUT_ARD...rduino.htm Lecz istnieje jeszcze problem z odczytem wartości CC. Szukałem po necie i znalazłem taki filmik https://www.youtube.com/watch?v=AYx55nj5vSo Ale kombinując na wszelkie sposoby mój wykonany odbiornik z powyższego interfejsu, Arduino MEGA i podpiętego do tego modułu zawierającego 16 przekaźników nie odczytuje komunikatów. Ma ktoś jakiś pomysł na kod? Prawie wszędzie pisze o wysyłaniu MIDI a o odbieraniu mało kiedy i wydaje mi się, że w sposób nieprzydatny do tego projektu. Sterownik działa na takiej samej zasadzie jak ten http://www.marklcustom.com/en/guitar-sys...x-25-mk-ii
 
Odpowiedź
#2
Witam po raz kolejny. Napisałem program do tego urządzenia. Problem teraz polega na tym, że po podaniu presetu (zestawu paru przycisków na raz) wszystkie przekaźniki odbiorą krótki impuls po czym gasną. Po włączeniu przycisku odpowiedzialnego za dany przekaźnik działa na zasadzie odbicia lustrzanego-gdy włącznik jest włączony przekaźnik nie reaguje, natomiast gdy włącznik jest wyłączony przekaźnik załącza się. Moje pytanie brzmi, co jest źle w kodzie? Program jest edycją pewnego programu znalezionego w necie.

Kod:
#include <MIDI.h>  // Add Midi Library

#define CH1 22
#define CH2 23
#define CH3 24
#define CH4 25
#define CH5 26
#define CH6 27
#define CH7 28
#define CH8 29
#define CH9 30
#define CH10 31
#define CH11 32
#define CH12 33
#define CH13 34
#define CH14 35
#define CH15 36
#define CH16 37

MIDI_CREATE_DEFAULT_INSTANCE();

void setup() {
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
digitalWrite(3, LOW); // GND 0 Volt supply to opto-coupler
digitalWrite(2, HIGH); // +5 Volt supply to opto-coupler
//pinMode (LED, OUTPUT); // Set Arduino board pin 13 to output
MIDI.begin(1); // Initialize the Midi Library.
// OMNI sets it to listen to all channels.. MIDI.begin(2) would set it
// to respond to notes on channel 2 only.
MIDI.setHandleControlChange(MyCCFunction); // This command tells the MIDI Library
// the function you want to call when a Continuous Controller command
// is received. In this case it's "MyCCFunction".
}

void loop() { // Main loop
MIDI.read(); // Continuously check if Midi data has been received.
}

// MyCCFunction is the function that will be called by the Midi Library
// when a Continuous Controller message is received.
// It will be passed bytes for Channel, Controller Number, and Value
// It checks if the controller number is within the 22 to 27 range
// If it is, light up the corresponding LED with the PWM brightness equal to the Value byte
void MyCCFunction(byte channel, byte number, byte value) {
switch (number) {
  case 25:
    analogWrite(CH1, value * 2);
    break;
  case 16:
    analogWrite(CH2, value * 2);
    break;
  case 19:
    analogWrite(CH3, value * 2);
    break;
  case 20:
    analogWrite(CH4, value * 2);
    break;
  case 21:
    analogWrite(CH5, value * 2);
    break;
  case 22:
    analogWrite(CH6, value * 2);
    break;
  case 23:
    analogWrite(CH7, value * 2);
    break;
  case 24:
    analogWrite(CH8, value * 2);
    break;
  case 13:
    analogWrite(CH9, value * 2);
    break;
  case 18:
    analogWrite(CH10, value * 2);
    break;
  case 17:
    analogWrite(CH11, value * 2);
    break;
  case 12:
    analogWrite(CH12, value * 2);
    break;
  case 11:
    analogWrite(CH13, value * 2);
    break;
  case 10:
    analogWrite(CH14, value * 2);
    break;
  case 15:
    analogWrite(CH15, value * 2);
    break;
  case 14:
    analogWrite(CH16, value * 2);
    break;
}
}
 
Odpowiedź
#3
Nie wiem, czy w Andruino da się prechowywać gdzieś stan przekaźnika , ale spróbuj zwykłym warunkiem if sprawdzać stan przekaźnika tam gdzie masz switch'a {}

Kod:
if (relayA == true)
{
analogWrite(true)
}
else
{
analogWrite(false)
}
 
Odpowiedź
#4
Nie wie ktoś, co robię źle w pętli?

.bmp   1.bmp (Rozmiar: 2.07 MB / Pobrań: 11)
 
Odpowiedź
#5
https://www.arduino.cc/en/Reference/SwitchCase

Czytamy dokumentacje, czytamy. Smile
[Obrazek: Sygnatura1-w60.jpg]
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości