Criando controladoras MIDI — parte 3
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.