Se queres usar esse teclado ligado ao pc, para usar os dados num programa, será dificil fazer isso com o Arduino, pois vais precisar de um driver para ler o que o Arduino para serial e para transformar esses dados no que os programas estão á espera, e assim, mais barato fica comprar um conversor midi-usb no ebay por meia duzia de euros.
Mas deixo-te aqui alguns links:
http://www.arduino.cc/playground/Main/InterfacingWithHardware#MIDI (http://www.arduino.cc/playground/Main/InterfacingWithHardware#MIDI)
http://itp.nyu.edu/physcomp/Labs/MIDIOutput (http://itp.nyu.edu/physcomp/Labs/MIDIOutput)
http://tomscarff.110mb.com/USB_MIDI/USB_MIDI.htm (http://tomscarff.110mb.com/USB_MIDI/USB_MIDI.htm)
http://shiftmore.blogspot.com/2010/01/quick-and-dirty-arduino-midi-over-usb.html (http://shiftmore.blogspot.com/2010/01/quick-and-dirty-arduino-midi-over-usb.html)
E é claro que tens de programar sempre..
E o que queres fazer com esses leds, botões e potenciómetros?O objectivo é utilizar os ditos nos programas MIDI
Para os usares tens de os ligar no Arduino, ler os seus valores e transformar isso em sinais MIDI para juntar aos que vêm do teclado.
O sinal que sai do usb do Arduino já é serial.
Não sabes programar?
Essa breakoutboard serve perfeitamente, com a adenda que o Teclado liga no MIDI-IN, e a saída do sistema é no -OUT.
O Arduino vai ler o MIDI do teclado, e fazer o output. Ou seja, o q o teclado envia é sempre mastigado pelo Arduino.
Esta é uma forma de somar os sinais do teclado com o resto dos botões.
No entanto, a programação é importante de saber fazer. Sem isso o Diogo não vai conseguir fazer o projecto.
Apesar do Arduino ser uma boa plataforma de inicio para quem pouco ou nada sabe, vai acabar sempre por aprender programação.
Não, é facil, se percebes pascal tambem vais acabar por perceber o C/C++.
Qualquer potenciometro, desde que tenha 3 patas está tudo bem, podes usar de 10Kohm lineares que são muito comum e baratos.
mas afinal o q queres fazer ?
ligar o MIDI ao computador, ou ligar todo o sistema por USB ?
Podes fazer isso, mas o q está no PC para fazer a leitura dos dados ?
Queres usar o teclado para fazer de sintetizador com o teu software? tens q saber q tipo de informação é enviada por USB.
A ELEKTOR de Novembro de 2000, portuguesa, tem um Misturador MIDI.
O 595 só serve para saidas, mas há outros que servem para entrada, ou usas um port expander por i2c por exemplo que faz entrada e saida, tens deles da microchip que com apenas 2 pinos ganhas 16 pinos de IO.
olá diogo,
não tens que agradecer, estamos aqui é para partilhar e ajudar!
Tendo o Arduino Uno a identificar-se ao computador como sendo um dispositivo midi, já não precisarias de uma interface USB-MIDI, pois o arduino já seria a tua interface!
Eu, no teu caso, não usaria o sparkfun midi breakout neste projecto, este shield com o arduino fica com uma altura muito grande (não caberia no teclado), claro que podes usar o shield na mesma, ao lado do arduino, com fios a estabelecer as ligações necessárias!
eu construiria uma porta midi e montava-a no próprio teclado. (até era capaz de ir mais longe: soldaria fios nos terminais da porta midi que já está no teclado para ligar ao arduino, assim não havia necessidade de ter um cabo cá fora)
Quanto ao número de pinos do arduino serem ou não suficientes para o trabalho, depende muito de quantos leds, botões e potenciómetros quiseres por.
Se quiseres mais que 6 potenciómetros, eu usaria um multiplexador, são fáceis de usar e não custa perceber como escrever código para os usar.
para leds e botões, se forem muitos, recomendo um expansor de portas i/o como o senso falou!
E se por acaso precisasse de programar novamente o arduino? Há maneira se rever a actualização de Firmware?Sim, é possível reverter o firmware para o original!
E quando ao soldar os fios nos terminais da porta midi do teclado, isso desactivava a porta original do piano?Não, não a desactiva, continuas a poder usá-la para outra coisa qualquer, se quiseres! :)
Que modelos de multiplexador e de expansor de portas i/o usarias?Para um multiplexador, acho que consegues arranjar facilmente em qualquer loja de electrónica este: HEF4067BP, é um multiplexador de 16 portas!
Sim, é possível reverter o firmware para o original!
Não, não a desactiva, continuas a poder usá-la para outra coisa qualquer, se quiseres! :)
Para um multiplexador, acho que consegues arranjar facilmente em qualquer loja de electrónica este: HEF4067BP, é um multiplexador de 16 portas!
Para um expansor de portas lógicas, nunca usei nenhum da microchip, porém, conheço o MAX6956 da Maxim, mandei vir umas amostras do próprio fabricante!
eu tenciono fazer o mesmo que tu a dois teclados que por aqui tenho, mas tenciono por também um ecrã :P
Consegues programar tudo, fazendo uma coisa de cada vez!
Se vais fazer tudo fora do piano, eu faria a caixa de maneira a que ela encaixe directamente no piano! Ou então pelo menos já podes usar o MIDI breakout shield :)
A única coisa que não havia na inmotion é o mux e o i// expander! De resto comprei lá os meus arduinos e o midi breakout shield!
O i// expander manda-se vir da fabricante :P
holy %&$#
http://www.sonigate.com/pt/product/show_details/25567/Potenciometro-Metal-Simples-10K-Linear (http://www.sonigate.com/pt/product/show_details/25567/Potenciometro-Metal-Simples-10K-Linear)
lucro de 1000%?
O fade é feito por ti e não pelo led.
Esse potenciometros andam com um preço que até mete medo :/
E as resistencias são um bocadinho baixas para os leds, deviam ser de 270Ohms.
Provavelmente vais é reduzir o tempo de vida dos leds, e se forem meio sensiveis até os podes queimar.
Podes meter duas em série para cada um, ou três para teres a certeza que não estragas nada.
Pessoal ja tenho preços :) Que acham dos preços?
DIMOFEL (LISBOA)
- Potenciómetro linear 10K - 3.60€
- Botão de Potenciometro - 1.1€
- LED's 5mm - Depende da cor. Comprei, para testes, 5 LED's vermelhos por 0.75 €
- Suportes para LED's 5mm - 10 por 1.20€
- Resistências carvão 1/4W 100 ohms - 10 por 0.30€
- Interruptor tipo tecla (para testes) - 2 por 0.26€
- Interruptor tipo alavanca (havia um mais barato mas com um movimento mais pesado, ainda por considerar) - 1.01€
INMOTION (ONLINE)
- Arduino UNO - 20.00€
de facto, esses potenciómetros... :-X
Atenção a uma coisa, na InMotion os preços são apresentados sem IVA, está avisado no site...
o arduino uno ficará em 24.6€
Sabes onde posso comprar potenciómetros bons por um bom preço, sem ser no eBay? :-\Sinceramente não tenho uma resposta concreta para ti. O máximo que já dei por um potenciómetro foram 2€. Os da InMotion custam +/- 1.20€ só que são logarítmicos...
Ah ok... Nao tinha reparado nesse "pequeno" promenor :-XÉ comum não se reparar, mas como está avisado não há desculpas depois quando temos a surpresa desagradável...
Sinceramente não tenho uma resposta concreta para ti. O máximo que já dei por um potenciómetro foram 2€. Os da InMotion custam +/- 1.20€ só que são logarítmicos...
É comum não se reparar, mas como está avisado não há desculpas depois quando temos a surpresa desagradável...
não percebo o que queres dizer com "ressalto no meio" nos potenciómetros :-\
Com ressalto no meio como dizes são potênciometros de pan/fade e provavelmente são estupidamente caros cá em Portugal.
Qualquer potenciómetro serve, mesmo os logarítmicos, a diferença é que quando os mexes os valores que medes têm um comportamento logarítmico, que normalmente não é o desejado por nós!
Qualquer potenciometro serve para ligar no Arduino, desde que alimentes o potenciometro com menor ou igual voltagem que tens no teu micro-controlador e não queimas nada.
Pode ser de mais, mas de muito mais não convem, porque depois a corrente que é fornecida ao conversor analógico para digital do Arduino é muito reduzida e o teu valor pode ser corrompido por ruido electrico e não vais perceber porque é que os teus valores dos potênciometros anda a dançar por todo o lado.
Algo entre 5k e 100K é o tipico que tenho visto, mas eu até agora só usei potenciómetros de 10K.
E em relação a porta MIDI para entrada do sinal do teclado, como a conectaria ao arduino para que este o encaminha-se para o pc via USB? Seria pelo Pino Digital 1 (TX) certo?Os pinos 0 e 1 do Arduino são usados para ele comunicar apenas com o computador. Para receberes os dados do teclado, precisas de outra porta série, neste caso, uma por software, dado que o Arduino só tem uma em hardware e já está a ser usada.
Sim dão, mas tambem, um teclado não assim nada de muito mau em termos de ruido.
Os pinos 0 e 1 do Arduino são usados para ele comunicar apenas com o computador. Para receberes os dados do teclado, precisas de outra porta série, neste caso, uma por software, dado que o Arduino só tem uma em hardware e já está a ser usada.
O shield midi é simplesmente uma placa com tomadas midi, nem mais, nem menos.
Soldas um fio ao midi out do teclado, metes esse fio no pino digital 1 se não me engano que é RX do Arduino, e depois o Tx serve para enviares dados por serial para o pc.
Soldas um fio ao midi out do teclado, metes esse fio no pino digital 1 se não me engano que é RX do Arduino, e depois o Tx serve para enviares dados por serial para o pc.
O usb do Arduino é simplesmente uma porta serial por usb, mas os dados entram e saem pelos pinos digital 0 e 1 que estão ligados á uart do atmega.Soldas um fio ao midi out do teclado, metes esse fio no pino digital 1 se não me engano que é RX do Arduino, e depois o Tx serve para enviares dados por serial para o pc.
Eu quando falei disso a pouco disse TX mas enganei-me ;D
Então preciso do TX para enviar os dados para o PC? Não pode ser via USB?
1º - A ligação como eu tinha pensado não é possivel certo? (o arduino enviar o sinal do piano por usb)sim, é possível... A porta usb do arduino é apenas um adaptador usb-porta série, ligado à porta série do ATmega328 que está no arduino (pinos 0 e 1). Como o arduino apenas vai enviar dados para o computador, e segundo as ideias aqui partilhadas, o canal TX da porta série do arduino vai servir para enviares os dados para o computador e sobra-te assim o canal RX. Com o canal RX podemos receber os dados midi do teclado.
2º - Não percebi bem onde entre esse tal circuito optico :oO optoisolador vai ''isolar electricamente'' a comunicação entre o teclado e o arduino, como já foi dito. Consiste apenas de um chipzito que compras facilmente (acho que é o 4N35) e uma resistência associada. Não tem nada de muito complicado. Se pesquisares sobre optoisoladores rapidamente perceberás como funcionam.
Tens que "descontar" a queda de tensão que o LED impõe nos seus terminais (~2V)
http://en.wikipedia.org/wiki/Light-emitting_diode (http://en.wikipedia.org/wiki/Light-emitting_diode)
http://en.wikipedia.org/wiki/LED_circuit (http://en.wikipedia.org/wiki/LED_circuit)
Por exemplo se a tensão de alimentação for 5V, o LED impõe ~2V e queres que conduza com corrente 20mA. As contas que tens de fazer são:
R = (5-2)/0.020 = 150. Se o valor te desse estranho escolhias um valor próximo (http://www.interfacebus.com/resistor_table.html (http://www.interfacebus.com/resistor_table.html))
Do pouco que me lembro, acho que o S2MIDI não converte midi em serial. Ele serve apenas para converter o que sai do arduino para midi. Era aqui que eu testaria a ideia de programar o ATMEGA8U2 do arduino numa interface midi para o arduino se identificar ao computador como sendo um dispositivo midi, mas não é algo que se faça ddo nada, pode ser muito confuso...
primeiro tens que saber a que controlos midi queres que os leds respondam! creio que decidas isso no programa que vás usar com o teu teclado...
Nunca explorei muito isto, mas se me souberes dizer a que controlos queres que os leds respondam, não me parece ser difícil programar esse comportamento.
a minha dúvida é se tu queres que os leds acendam em função de uma mensagem midi enviada pelo software no computador ou em função de um evento no próprio teclado! eu suponho que seja a primeira hipótese :)
desculpa não ter tido grande tempo para te ajudar :S
olha, estás a usar a biblioteca MIDI para arduino? com essa biblioteca consegues definir funções que são chamadas automaticamente em determinadas situações (eventos). neste caso, a biblioteca MIDI pode fazer-te com que ao receberes uma mensagem midi, se for uma mensagem Control Change, é chamada uma função que tu definiste, se for outra coisa qualquer, é chamada outra função que tu defines. Chamam-se funções call-back.
sinceramente nunca cheguei a usar esta biblioteca, mas creio que ao usá-la, possas sentir-te mais seguro de que o teu arduino faz exactamente o que queres!
http://www.arduino.cc/playground/Main/MIDILibrary (http://www.arduino.cc/playground/Main/MIDILibrary)
acho que encontrei a ferramenta de que precisas para poderes enviar MIDI pela porta série de volta para o arduino :)
http://www.stephenhobley.com/blog/2010/02/15/serial-port-midi-relay/ (http://www.stephenhobley.com/blog/2010/02/15/serial-port-midi-relay/)
desculpa não ter tido grande tempo para te ajudar :S
/* Midi In Basic 0.2 // kuki 8.2007
*
* -----------------
* listen for midi serial data, and light leds for individual notes
IMPORTANT:
your arduino might not start if it receives data directly after a reset, because the bootloader thinks you want to uplad a new progam.
you might need to unplug the midi-hardware until the board is running your program. that is when that statusLed turns on.
#####################################################################################################################################################
SOMETHING ABOUT MIDI MESSAGES
midi messages start with one status byte followed by 1 _or_ 2 data bytes, depending on the command
example midi message: 144-36-100
the status byte "144" tells us what to do. "144" means "note on".
in this case the second bytes tells us which note to play (36=middle C)
the third byte is the velocity for that note (that is how powerful the note was struck= 100)
example midi message: 128-36
this message is a "note off" message (status byte = 128). it is followed by the note (data byte = 36)
since "note off" messages don't need a velocity value (it's just OFF) there will be no third byte in this case
NOTE: some midi keyboards will never send a "note off" message, but rather a "note on with zero velocity"
do a web search for midi messages to learn more about aftertouch, poly-pressure, midi time code, midi clock and more interesting things.
#####################################################################################################################################################
HARDWARE NOTE:
The Midi Socket is connected to arduino RX through an opto-isolator to invert the midi signal and seperate the circuits of individual instruments.
connect 8 leds to pin2-pin9 on your arduino.
####################################################################################################################################################
*/
//variables setup
byte incomingByte;
byte note;
byte velocity;
int statusLed = 13; // select the pin for the LED
int action=2; //0 =note off ; 1=note on ; 2= nada
//setup: declaring iputs and outputs and begin serial
void setup() {
pinMode(statusLed,OUTPUT); // declare the LED's pin as output
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
pinMode(8,OUTPUT);
pinMode(9,OUTPUT);
//start serial with midi baudrate 31250 or 38400 for debugging
Serial.begin(31250);
digitalWrite(statusLed,HIGH);
}
//loop: wait for serial data, and interpret the message
void loop () {
if (Serial.available() > 0) {
// read the incoming byte:
incomingByte = Serial.read();
// wait for as status-byte, channel 1, note on or off
if (incomingByte== 144){ // note on message starting starting
action=1;
}else if (incomingByte== 128){ // note off message starting
action=0;
}else if (incomingByte== 208){ // aftertouch message starting
//not implemented yet
}else if (incomingByte== 160){ // polypressure message starting
//not implemented yet
}else if ( (action==0)&&(note==0) ){ // if we received a "note off", we wait for which note (databyte)
note=incomingByte;
playNote(note, 0);
note=0;
velocity=0;
action=2;
}else if ( (action==1)&&(note==0) ){ // if we received a "note on", we wait for the note (databyte)
note=incomingByte;
}else if ( (action==1)&&(note!=0) ){ // ...and then the velocity
velocity=incomingByte;
playNote(note, velocity);
note=0;
velocity=0;
action=0;
}else{
//nada
}
}
}
void blink(){
digitalWrite(statusLed, HIGH);
delay(100);
digitalWrite(statusLed, LOW);
delay(100);
}
void playNote(byte note, byte velocity){
int value=LOW;
if (velocity >10){
value=HIGH;
}else{
value=LOW;
}
//since we don't want to "play" all notes we wait for a note between 36 & 44
if(note>=36 && note<44){
byte myPin=note-34; // to get a pinnumber between 2 and 9
digitalWrite(myPin, value);
}
}
O R2 é uma pequena alteração no circuito do autoreset, por isso pesquisa unicamente por uno.
O programa para reprogramares o Atmega8u2 podes sacar da Atmel e chama-se Flip.
Video!!:P
Pessoal depois deste tempo todo e das cenas que fui aprendendo, descobri que não consigo fazer o que quero com o arduino.Daria para fazer, mas atraves de processo diferente do que estavas a seguir...
Eu perciso que os pots sejam precisos e, por causa da função map, os valores dos pots saltam de 5 em 5 :S
De qualquer maneira não tenho muito tempo para me dedicar a este projecto agora...
Obrigado pela vossa ajuda
Cumprimentos
Os pics que usavam nesse projecto inicialmente eram mais lentos que o avr do Arduino lol....A velha guerra entre AVR e PIC?!?
E agora usam um processador 32 bits, ou seja, ou usam arm ou o mips que a microchip usou no pic32..