Índice:

EAL - Controlador MIDI Arduino: 7 etapas
EAL - Controlador MIDI Arduino: 7 etapas

Vídeo: EAL - Controlador MIDI Arduino: 7 etapas

Vídeo: EAL - Controlador MIDI Arduino: 7 etapas
Vídeo: The 5 BEST ARDUINOS for Building a MIDI CONTROLLER 2024, Novembro
Anonim
EAL - Controlador Arduino MIDI
EAL - Controlador Arduino MIDI

Fabricado por Søren Østergaard Petersen, OEAAM16EDA

Este instrutível descreve um controlador MIDI baseado em Arduino. Este é um projeto escolar. Usando sua mão, você pode tocar melodias simples por meio da conexão MIDI e um instrumento MIDI conectado (ou, como neste caso, um notebook executando um software softsynth). Você pode tocar notas em uma escala de dó maior, dó-d-e-f-g-a-b-c. Para poder conectar o controlador MIDI a um notebook, você precisará de uma interface MIDI para USB como o m-audio Uno.

Etapa 1: Vídeo de demonstração

Image
Image

Aumente o volume e divirta-se!

Como funciona:

O controlador MIDI usa uma placa Arduino MEGA 2560. Dois sensores de luz (LDR) embutidos em um tubo elétrico de 16 mm formam um sistema de sensor duplo e são usados para criar um gatilho estável sem qualquer disparo duplo falso. Uma lanterna está criando um feixe de luz, quando o feixe é interrompido pela mão que toca o controlador, o sensor de luz inferior detecta o feixe ausente e um sensor ultrassônico HC-SR04 mede a distância do sensor à mão.

A distância medida é usada no programa Arduino para calcular e configurar o valor do número da nota apropriado a ser compactado em uma mensagem MIDI Note On e transmittet na interface MIDI. A interface de saída MIDI usa um inversor hexadecimal 74HC14 e é praticamente um circuito padrão. A comunicação MIDI usa serial1, a porta serial padrão é usada para depuração.

Quando a mão é movida diretamente para cima e para longe do feixe de luz, o sensor de luz superior detecta o feixe de luz novamente e uma mensagem MIDI Note Off é embalada e transmitida na saída MIDI.

A área de jogo entre os sensores é de cerca de 63 cm, e o comprimento total do controlador MIDI é de cerca de 75 cm.

Etapa 2: detalhes dos sensores de luz

Detalhes dos sensores de luz
Detalhes dos sensores de luz
Detalhes dos sensores de luz
Detalhes dos sensores de luz

Os dois sensores de luz são montados um em cima do outro para formar um sistema de sensor duplo. Ele evita disparos falsos quando usado corretamente no software. Cada sensor de luz consiste em um módulo de foto-resistor integrado em um tubo elétrico padrão de 16 mm. Um slot é feito em cada tubo com uma serra e o PCB do foto-resistor pode ser pressionado no slot. Os sensores são colados com fita adesiva e também fixados em uma das extremidades de um pedaço de madeira. Nenhuma luz deve ser capaz de alcançar os sensores por trás. Os sensores de luz possuem resistores pull-up de 10k.

Etapa 3: Detalhes do Sensor Ultrassônico HC-SR04

Detalhes do Sensor Ultrassônico HC-SR04
Detalhes do Sensor Ultrassônico HC-SR04

O sensor ultrassônico HC-SR04 é fixado na outra extremidade do controlador MIDI. Uma lanterna brilhante é colocada aqui também, ela cria o feixe de luz necessário.

Etapa 4: O circuito Aduino

O Circuito Aduino
O Circuito Aduino
O Circuito Aduino
O Circuito Aduino

O circuito de saída MIDI é basicamente um inversor hexadecimal 74HC14 padrão e alguns resistores mais um conector fêmea DIN de 5 pinos. O circuito 74HC14 comanda a saída MIDI e ao mesmo tempo fornece alguns meios de proteção para a placa Arduino contra o "mundo real" conectado à saída MIDI. Um recurso prático extra é o LED de atividade MIDI que sinaliza quando os dados são enviados.

Usei um protótipo de PCB adequado para meu hardware porque tive muitos problemas com conexões ruins em minha placa de ensaio. O esquema é feito em Fritzing, uma cópia em pdf em alta resolução pode ser baixada clicando no link abaixo. Eu prefiro usar um programa esquemático adequado como Kicad, acho que Fritzing é limitado para qualquer coisa, exceto os experimentos mais simples.

Materiais utilizados:

1 pcs Arduino MEGA 2560

2 pcs Foto resistor (LDR) com resistor pull up embutido (do kit de 37 sensores)

1 pcs HC-SR04 sensor ultrassônico

1 pcs 74HC14 hexadecimal invertendo gatilho Schmitt

2 pcs resistor 220 Ohm 0,25 W

1 pcs resistor 1k Ohm 0,25W

1 pcs LED de baixa corrente 2mA

1 pcs capacitor de cerâmica 100nF (para desacoplamento da fonte de alimentação, diretamente nos pinos de alimentação do 74HC14)

Placa de ensaio ou protótipo PCB

2 pcs tubo elétrico de 16 mm, comprimento 65 mm

1 peça de madeira, comprimento 75cm

Fita adesiva

Fios

Etapa 5: Listagem de E / S

Listagem de E / S
Listagem de E / S

Etapa 6: O Código Aduino

O sketch test_Midi6 usa a biblioteca NewPing que você deve incluir em seu ambiente de programação Arduino, para usar o sensor ultrassônico HC-SC04. O esboço é comentado em dinamarquês, desculpe. Para manter o esboço bem estruturado, funções separadas são feitas para diferentes partes lógicas do esboço e as variáveis globais são evitadas principalmente. O fluxo do programa é visualizado no fluxograma do controlador MIDI em PDF.

// versão 15-05-2017: test_Midi6

// Søren Østergaard Petesen // Arduino MEGA 2560 // Dette o programa udgør e um controlador de MIDI simples que pode usar o ekstern MIDI enhed, f.eks e softsynt no PC. // Controlador MIDI kan sende toneanslag (nota no comando) hhv. (anote o kommando) para en oktav C-C, C dur skala. // Der spilles med en "karate hånd" på et brædt // hvor sensorerne er monteret. MIDI kommandoerne trigges af en dobbelt LDR sensor, da der skal laves en sikker // detektering af både når hånden lander på brættet (nota ligada), samt når hånden fjernes igen (nota desligada). // MIDI kommandoerne "note on" og "note off" består hver af 3 bytes som sendes på serial1 porten // vha det i hardware opbyggede interface MIDI. // Tonehøjden bestemmes vha ultralydssensor HC-SR04 #include // bibliotek til den anvendte ultralydssensor HC-SR04 #define TRIGGER_PIN 3 // Arduino pin til trigger pin på sensor ultrasônico #define ECHO_PIN 2 // Arduino pin til echo pin på sensor define MAX_DISTANCE 100 // Máximo afstand for Ping #define Median 5 // Antal målinger der beregnes gennemsnit af para at få en sikker afstandsbestemmelse Sonar NewPing (TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // Criando o objeto NewPing. int Senspin1 = 53; // Underste LDR1 føler int Senspin2 = 52; // Øverste LDR2 føler byte MIDIByte2; // Demonstração da variável para MIDIByte2 bool klar_note_on = 1; // Variabel deklaration para klar_note_on, styrer afsendelse af note on kommando. Første kommando er en note on kommando bool klar_note_off = 0; // Definição da variável para klar_note_off, styrer afsendelse af note off kommando void setup () {pinMode (Senspin1, INPUT); // sensor input pinMode (Senspin2, INPUT); // sensor input Serial1.begin (31250); // Serial1 bruges até a comunicação MIDI: 31250 bit / sekundt Serial.begin (9600); // monitor serial, teste de til} void loop () {bool Sensor1 = digitalRead (Senspin1); // Læs LDR1 - underte LDR bool Sensor2 = digitalRead (Senspin2); // læs LDR2 - øverste LDR if (Sensor1 && klar_note_on) // hvis LDR1 aktiveret e klar til note on {byte Note_Byte = Hent_tonehojde (); // Tom Hent højde via sensor ultralyds MIDIByte2 = Hent_MidiByte2 (Note_Byte); // Hent MidByte2, número da nota MIDI, værdien 0xFF er fora do intervalo Send_Note_On (MIDIByte2); // função kald Send_Note_On klar_note_on = 0; // der skal kun sendes en nota no kommando klar_note_off = 1; // næste kommando er note off} if (Sensor2 &&! Sensor1 && klar_note_off) // Hvis der skal envia nota off kommando gøres det her.. {Send_Note_Off (MIDIByte2); // enviar nota kommando klar_note_off = 0; // der skal kun sendes en note off kommando} if (! Sensor1 &&! Sensor2) // ela gøres klar to ny note on kommando, hånd er væk fra brædt {klar_note_on = 1; }} byte Hent_MidiByte2 (byte NoteByte) {// Denne funktion returnerer número da nota MIDI, valgt ud fra NoteByte byte MIDIB2; switch (NoteByte) // seu defineres hvilken værdi MIDIByte2 skal ud fra værdien af Note_Byte {case 0: {MIDIB2 = 0x3C; // tonen 'C'} break; caso 1: {MIDIB2 = 0x3E; // tonen 'D'} break; caso 2: {MIDIB2 = 0x40; // tonen 'E'} break; caso 3: {MIDIB2 = 0x41; // tonen 'F'} break; caso 4: {MIDIB2 = 0x43; // tonen 'G'} break; caso 5: {MIDIB2 = 0x45; // tonen 'A'} break; caso 6: {MIDIB2 = 0x47; // tonen 'B'} break; caso 7: {MIDIB2 = 0x48; // tonen 'C'} break; padrão: {MIDIB2 = 0xFF; // fora do intervalo}} return MIDIB2; // número da nota MIDI do retornador} byte Hent_tonehojde () {// Denne funktion henter resultatet af ultralydsmålingen unsigned int Tid_uS; // målt tid i uS byte Afstand; // beregnet afstand i cm byte resultat; // inddeling af spille område const float Omregningsfaktor = 58.3; // 2 * (1/343 m / s) / 100 = 58, 3uS / cm, der ganges med 2 da tiden er summen ap tiden frem og tilbage. Tid_uS = sonar.ping_median (mediana); // Send ping, få tid retur i uS, gennemsint af Median målinger Afstand = Tid_uS / Omregningsfaktor; // Omregn tid til afstand i cm (0 = fora da faixa de distância) resultat = Afstand / 8; // Beregn resultat return resultat; // Returner resultat} void Send_Note_On (byte tonenr) {// Denne funktion sender en note on kommando på MIDI interfacet const byte kommando = 0x90; // Nota no kommando på MIDI kanal 1 const byte volumen = 0xFF; // volumen / velocidade = 127 Serial1.write (kommando); // envia nota no kommando Serial1.write (tonenr); // envia o número do tom Serial1.write (volumen); // enviar volumen (velocidade)} void Send_Note_Off (byte tonenr) {// Denne funktion sender note off kommando på MIDI interfacet const byte kommando = 0x80; // Anote o kommando på MIDI kanal 1 const byte volumen = 0xFF; // volumen / velocidade = 127 Serial1.write (kommando); // enviar nota kommando Serial1.write (tonenr); // envia o número do tom Serial1.write (volumen); // enviar volume (velocidade)}

Etapa 7: Noções básicas de comunicação MIDI

MIDI (Musical Instrument Digital Interface) é um protocolo de comunicação serial universal para a interface de instrumentos musicais eletrônicos e outros dispositivos. A comunicação serial é usada (31250 bit / s, meio de transmissão é um loop de corrente, opto-isolado na extremidade do receptor. São usados conectores DIN de 5 pinos. 16 canais de comunicação lógicos são possíveis em uma conexão MIDI física. Muitos comandos são definidos no MIDI padrão, eu uso dois comandos neste projeto, esses comandos consistem em 3 bytes:

a) Nota no comando:

1. byte send = 0x90 significando nota no comando no canal MIDI 1

2. envio de byte = 0xZZ ZZ é o número da nota, eu uso o intervalo de 0x3C a 0x48

3. envio de bytes = 0xFF FF = 255 significando volume máximo, faixa de 0x00 a 0xFF

b) Comando de desativação da nota: 1. byte send = 0x80 significando comando note off no canal MIDI 1

2. envio de byte = 0xZZ ZZ é o número da nota, eu uso o intervalo de 0x3C a 0x48

3. envio de bytes = 0xFF FF = 255 significando volume máximo, faixa de 0x00 a 0xFF

Recomendado: