Criando controladoras MIDI — parte 3

Gabriel Yshay
4 min readJan 21, 2020

--

Nessa terceira parte vamos aprender a usar potenciômetros. As ideias que vamos ver aqui continuam o que vimos nas parte 1 e parte 2.

O que é resistencia

Em eletrônica, resistencia é o quanto a corrente diminui sobre um componente.

Aqui temos uma fonte de tensão (poderia ser algo como uma pilha) ligada a um resistor (o símbolo de zig-zag) de 1kΩ.

A lei de Ohm diz que Tensão é a resistencia vezes a corrente, ou U = RI para os mais chegados.

Com esses valores poderíamos ver que pelo resistor passa uma corrente de 0.05A ou 5mA.

Esse circuito teoricamente é igual aquele anterior, a única diferença é que ao invés de um resistor de 1000 ohms nós temos um de 100 e um de 900, totalizando 1000.

Porém se olharmos qual a tensão entre os dois resistores vamos perceber algo interessante. Ela se divide proporcionalmente ao resistor de cima!

V_meio = V_total * R1 / (R1 + R2)

Nesse caso vemos então que a tensão no meio é 0.5 V, ou 10% da tensão original.

Assim conforme nos ajustarmos o equilíbrio entre R1 e R2, nós conseguimos obter qualquer tensão entre 0 e a tensão original.

Esse circuito é o que chamamos de divisor de tensão.

O potenciômetro

O potenciômetro, na verdade, nada mais é do que dois resistores um ligado no outro como no segundo circuito que vimos.

Se o potenciômetro tem o valor de 10K por exemplo, isso significa que a soma dos dois resistores é 10kΩ.

Nós podemos então explorar aquela ideia do divisor de tensão para converter a rotação do potenciômetro para uma voltagem, para assim conseguirmos ler a voltagem com o nosso Arduino.

Lendo o valor do potenciômetro

Aqui podemos ver aquele circuito na pratica. Uma "perninha" do potenciômetro é ligada no 5V do Arduino, outra no GND (terra) e outra no A0, que é a porta que vamos usar para ler o valor do potenciômetro.

void setup(){
Serial.begin(112500); // iniciamos o serial
}
void loop(){
int valor = analogRead(A0); // le o valor do pot em "valor"
Serial.println(valor); // escreve o valor no serial
delay(300); // espera 300ms
}

Tente rodar esse circuito e veja a saida no monitor serial da IDE do Arduino. Voce deve ver o valor variando conforme voce mexe no potenciômetro. Qual o valor minimo? E o maximo?

Usando MIDI

Agora sim, vamos usar esse valor do potenciômetro que pegamos para controlar alguma coisa no nosso computador.

Para fazer isso vamos usar o ControlChange, que eu mencionei na parte 1.

Para mandar um ControlChange (ou CC, como vou chamar daqui pra frente) devemos mandar 3 números por MIDI. O primeiro é dizendo que a mensagem é um CC, isso é o valor 176. Depois mandamos o número do controle, esse número é único para cada potenciômetro da sua controladora. Se voce tem 18 potenciômetros, por exemplo, eles vão ter os valores de 1 a 18. Por último mandamos o valor daquele controle, esse valor obtemos com o código acima.

Vamos então criar a função que recebe um número de controle e o valor do controle e manda um MIDI CC com esses valores.

void setup() {
Serial.begin(112500); // iniciamos o serial
}
void loop() {
int valor = analogRead(A0); // lemos o valor
mandaCC(1, valor);
}
void mandaCC(controle, valor){
Serial.write(176); // = é CC
Serial.write(controle); // mando o controle
Serial.write(valor); // mando o valor
}

Esse código está quase certo mas ele tem alguns probleminhas.

Primeiro, se você fez o circuito e viu o monitor, voce percebeu que o valor lido do potenciômetro vai de 0 até 1023. Isso é um problema para nós, por que o MIDI só aceita valores de 0 até 127, para resolver isso, vamos ler o valor do potenciômetro e dividir por 4 para que ele seja aceito pelo MIDI.

void setup() {
Serial.begin(112500); // iniciamos o serial
}
void loop() {
int valor = analogRead(A0) / 4; // lemos o valor e div. por 4
mandaCC(1, valor);
}
void mandaCC(controle, valor){
Serial.write(176); // = é CC
Serial.write(controle); // mando o controle
Serial.write(valor); // mando o valor
}

O outro problema é que esse código fica constantemente mandando mensagens para o seu computador, isso vai fazer o computador ficar atrapalhado com tanta coisa que esta recebendo. Assim vamos mandar o CC somente se o potenciômetro mudou de valor.

int valorAnterior = 0;
void setup() {
Serial.begin(112500); // iniciamos o serial
}
void loop() {
int valor = analogRead(A0) / 4; // lemos o valor e div. por 4
if(valor - valorAnterior > 2|| valor - valorAnterior < -2){
mandaCC(1, valor);
valorAnterior = valor;
}
}
void mandaCC(controle, valor){
Serial.write(176); // = é CC
Serial.write(controle); // mando o controle
Serial.write(valor); // mando o valor
}

Assim, só mandamos o CC se o valor mudar mais do que 2 unidades, evitando que mandemos mensagens demais.

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

--

--

Gabriel Yshay
Gabriel Yshay

Written by Gabriel Yshay

Data Science, Hardware and Music

No responses yet

Write a response