collapse

* Posts Recentes

+ LASERs por dropes
[03 de Julho de 2025, 19:35]


Cerca eléctrica por SerraCabo
[14 de Junho de 2025, 23:26]


Alguém arranja motores? por almamater
[10 de Junho de 2025, 22:34]


Condensador 4.7uF 0603 por brunus
[09 de Junho de 2025, 15:52]


Lenovo IdeaPad 3 Não liga por jm_araujo
[07 de Maio de 2025, 19:10]


Identificar Diodo Zenner por filjoa
[01 de Maio de 2025, 23:07]


Meu novo robô por dropes
[18 de Março de 2025, 14:51]


JBL partybox On-The-Go por almamater
[21 de Fevereiro de 2025, 23:32]


Talking Reverse Engineering with an Absolute Legend! por SerraCabo
[13 de Fevereiro de 2025, 09:56]


Motoserra Stihl 120C por brunus
[11 de Fevereiro de 2025, 16:29]

Autor Tópico: Arduino Drumkit  (Lida 110990 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline cellen

  • Mini Robot
  • *
  • Mensagens: 17
Re: Arduino Drumkit
« Responder #90 em: 05 de Abril de 2012, 04:17 »
Voltei a mexer na bateria. :D
porém agora ao ler o mux 16 canais (hef4067bp) quando bato no pad(0), os seguintes pads (1,2,3,4...) recebem valores que vão baixando :P
alguém sabe o porque? Será que está faltando alguma ligação no GND? algum aterramento?
na minha também acontecia isso às vezes, mas normalmente só no pad ao lado. Vê se isso te acontece se isolares o teu pad dos outros (põe-nos em sítios diferentes)
Então Tiago, enquanto estava usando apenas as 6 entradas do arduino estava bem. fiz vários testes, pads juntos, separados, com madeira, metal, igual ao das Rolands Vséries :P
Mas agora colocando o hef4067bp, parece que acontece um vazamento de voltagem no próprio Mux.
Já mexi bastante no código, mas eu acho que o código é o menor dos problemas.
Coloquei bastante resistência hoje e funcionou melhor, mas a resistência ao pulso do piezo também aumentou.
Acho que o sinal elétrico deve ser drenado mais rapidamente do mux através de algum esquema eletrico. Alguem tem alguma idéia? ::)
estou usando o seguinte esquema

piezo
resistor 1 M paralelo terra.
diodo schokkty série (retifica o sinal)
AmP op. Lm324( amplifica o sinal, com resistencia 20k em paralelo com saida e com terra)
hef4067bp
Arduino A0

Sem Amp Op o sinal não chega.

Offline AndréD.

  • Mini Robot
  • *
  • Mensagens: 180
    • AndreD Robotics
Re: Arduino Drumkit
« Responder #91 em: 07 de Abril de 2012, 15:32 »
Boas Pessoal...

Aqui fica o prototipo do meu DrumKit.... Ainda está em desenvolvimento e como é obviu todas as sugestões são bem vindas...

Vou invadir um pouco o topico do grande tcustodio com o meu trabalho espero que gostem...



Espero que possam dar sugestões e opinar sobre a "cenaça" :P

Cumps
AndréD.

Offline tcustodio

  • Mini Robot
  • *
  • Mensagens: 344
  • "beware of programmers who carry a soldering iron"
    • Youtube
Re: Arduino Drumkit
« Responder #92 em: 07 de Abril de 2012, 15:49 »
Então Tiago, enquanto estava usando apenas as 6 entradas do arduino estava bem. fiz vários testes, pads juntos, separados, com madeira, metal, igual ao das Rolands Vséries :P
Mas agora colocando o hef4067bp, parece que acontece um vazamento de voltagem no próprio Mux.
Já mexi bastante no código, mas eu acho que o código é o menor dos problemas.
Coloquei bastante resistência hoje e funcionou melhor, mas a resistência ao pulso do piezo também aumentou.
Acho que o sinal elétrico deve ser drenado mais rapidamente do mux através de algum esquema eletrico. Alguem tem alguma idéia? ::)
estou usando o seguinte esquema

piezo
resistor 1 M paralelo terra.
diodo schokkty série (retifica o sinal)
AmP op. Lm324( amplifica o sinal, com resistencia 20k em paralelo com saida e com terra)
hef4067bp
Arduino A0

Sem Amp Op o sinal não chega.

Olá Cellen! Isso que expões é muito estranho... também deveria acontecer com as 6 entradas do arduino, pois essas 6 entradas do arduino também são entradas para um mux (que está dentro do chip do arduino ;))

Isso não deveria acontecer. Não percebi bem o teu "esquema" de ligação do piezo, mas vou supor que está ligado como nos esquemas que foram partilhados por aqui :)
O ampop, numa fase final do protótipo, deve ser usado entre o mux e o arduino, não entre o piezo e o mux... e devem estar bem definidos os limites, pois o arduino só aceita um sinal entre 0 e 5V.

Podes mostrar o código que usas para controlar o mux? Talvez possa-te estar a escapar alguma coisa aí :)
Tiago Custódio,
- Não me dêem álcool se estiver um piano por perto.

Offline tcustodio

  • Mini Robot
  • *
  • Mensagens: 344
  • "beware of programmers who carry a soldering iron"
    • Youtube
Re: Arduino Drumkit
« Responder #93 em: 07 de Abril de 2012, 15:50 »
Boas Pessoal...

Aqui fica o prototipo do meu DrumKit.... Ainda está em desenvolvimento e como é obviu todas as sugestões são bem vindas...

Vou invadir um pouco o topico do grande tcustodio com o meu trabalho espero que gostem...



Espero que possam dar sugestões e opinar sobre a "cenaça" :P

Cumps
AndréD.

Olá André! Gostei bastante do teu vídeo! Gostei especialmente do facto que consegues encurtar os sons e fazer vários seguidos em volumes diferentes. São os pads que são muito bons ou é o código que é especial de corrida? :P
Tiago Custódio,
- Não me dêem álcool se estiver um piano por perto.

Offline AndréD.

  • Mini Robot
  • *
  • Mensagens: 180
    • AndreD Robotics
Re: Arduino Drumkit
« Responder #94 em: 07 de Abril de 2012, 16:57 »
Boas..

Antes de mais obrigado, e em relação a tua pergunta, os pads é que são porreiros, porque em relação á programação estou com uns problemas... Por exemplo não consigo tocar dois pads ao mesmo tempo... O que é totalmente impensável numa bateria...  E não sei muito bem como eide  resolver o problema...

Em relação ao encurtar os sons e varias batidas com sons diferentes isso esta a funcionar razoavelmente bem...

Cumps
AndréD.

Offline tcustodio

  • Mini Robot
  • *
  • Mensagens: 344
  • "beware of programmers who carry a soldering iron"
    • Youtube
Re: Arduino Drumkit
« Responder #95 em: 07 de Abril de 2012, 17:55 »
Boas..

Antes de mais obrigado, e em relação a tua pergunta, os pads é que são porreiros, porque em relação á programação estou com uns problemas... Por exemplo não consigo tocar dois pads ao mesmo tempo... O que é totalmente impensável numa bateria...  E não sei muito bem como eide  resolver o problema...

Em relação ao encurtar os sons e varias batidas com sons diferentes isso esta a funcionar razoavelmente bem...

Cumps
AndréD.

Não queres partilhar o código para aprendermos todos e ajudarmos-te? :)
Tiago Custódio,
- Não me dêem álcool se estiver um piano por perto.

Offline AndréD.

  • Mini Robot
  • *
  • Mensagens: 180
    • AndreD Robotics
Re: Arduino Drumkit
« Responder #96 em: 07 de Abril de 2012, 18:41 »
Boas...

Sim posso e vou fazê-lo... Ate porque pode vir a servir para outros...

Ora aqui fica...

Código: [Seleccione]
//------------------------------------//
// CODE    ||  SOUND                  //
// 35      ||  Bass Drum 2            //
// 36      ||  Bass Drum 1            //
// 37      ||  Side Stick/Rimshot     //
// 38      ||  Snare Drum 1           //
// 39      ||  Hand Clap              //
// 40      ||  Snare Drum 2           //
// 41      ||  Low Tom 2              //
// 42      ||  Closed Hi-hat          //
// 43      ||  Low Tom 1              //
// 44      ||  Pedal Hi-hat           //
// 45      ||  Mid Tom 2              //
// 46      ||  Open Hi-hat            //
// 47      ||  Mid Tom 1              //
// 48      ||  High Tom 2             //
// 49      ||  Crash Cymbal 1         //
// 50      ||  High Tom 1             //
// 51      ||  Ride Cymbal 1          //
// 52      ||  Chinese Cymbal         //
// 53      ||  Ride Bell              //
// 54      ||  Tambourine             //
// 55      ||  Splash Cymbal          //
// 56      ||  Cowbell                //
// 57      ||  Crash Cymbal 2         //
// 58      ||  Vibra Slap             //
// 59      ||  Ride Cymbal 2          //
// 60      ||  High Bongo             //
// 61      ||  Low Bongo              //
// 62      ||  Mute High Conga        //
// 63      ||  Open High Conga        //
// 64      ||  Low Conga              //
// 65      ||  High Timbale           //
// 66      ||  Low Timbale            //
// 67      ||  High Agogô             //
// 68      ||  Low Agogô              //
// 69      ||  Cabasa                 //
// 70      ||  Maracas                //   
// 71      ||  Short Whistle          //
// 72      ||  Long Whistle           //
// 73      ||  Short Güiro            //
// 74      ||  Long Güiro             // 
// 75      ||  Claves                 //
// 76      ||  High Wood Block        //
// 77      ||  Low Wood Block         //
// 78      ||  Mute Cuíca             //
// 79      ||  Open Cuíca             //
// 80      ||  Mute Triangle          //
// 81      ||  Open Triangle          //
//------------------------------------//


int midiChannel = 9;

int outPin = 13;
int snare = 0;
int crash = 1;
int mtom = 2;
int ltom = 3;
int htom = 4;
int ride = 5;
int Bass = 2;

int DK1[6] = {38,49,43,47,50,51};
int DK2[6] = {40,57,41,45,48,59};

int lastAnalogSnare = 0;
int lastAnalogCrash = 0;
int lastAnalogMtom = 0;
int lastAnalogHtom = 0;
int lastAnalogLtom = 0;
int lastAnalogRide = 0;
int analogSmooth = 10;   

void setup()
{
  pinMode(Bass, INPUT);
  Serial.begin(9600);
}

void loop()
{
  int rsnare = 0;
  int rcrash = 0;
  int rmtom = 0;
  int rltom = 0;
  int rhtom = 0;
  int rride = 0;

// Pedal do BASS
     if (digitalRead(Bass) == LOW) {
         noteOn(midiChannel,35,85);
         delay(100);
         noteOn(midiChannel,35,0);
     }   

  // SNARE
  rsnare = analogRead(snare)/8; // 0-1024 into 0-127
  if (abs(rsnare-lastAnalogSnare) > analogSmooth) {
    lastAnalogSnare = rsnare;
    noteOn(midiChannel,DK2[0],rsnare);
  }

  //  CRASH
  rcrash = analogRead(crash)/8; // 0-1024 into 0-127
  if (abs(rcrash-lastAnalogCrash) > analogSmooth) {
    lastAnalogCrash = rcrash;
    noteOn(midiChannel,DK2[1],rcrash);
  }
 
  // LTOM
  rltom = analogRead(ltom)/8; // 0-1024 into 0-127
  if (abs(rltom-lastAnalogLtom) > analogSmooth) {
    lastAnalogLtom = rltom;
    noteOn(midiChannel,DK2[2],rltom); 
  } 
 
  //  MTOM
  rmtom = analogRead(mtom)/8; // 0-1024 into 0-127
  if (abs(rmtom-lastAnalogMtom) > analogSmooth) {
    lastAnalogMtom = rmtom;
    noteOn(midiChannel,DK2[3],rmtom); 
  }
 
   //  HTOM
  rhtom = analogRead(htom)/8; // 0-1024 into 0-127
  if (abs(rhtom-lastAnalogHtom) > analogSmooth) {
    lastAnalogHtom = rhtom;
    noteOn(midiChannel,DK2[4],rhtom); 
  }   
 
  //  RIDE
  rride = analogRead(ride)/8; // 0-1024 into 0-127
  if (abs(rride-lastAnalogRide) > analogSmooth) {
    lastAnalogRide = rride;
    noteOn(midiChannel,DK2[5],rride); 
  }   
}

void noteOn(byte channel, byte note, byte velocity) {
  midiMsg(channel+0x90, note, velocity);
  delay(50);

}

void midiMsg(byte cmd, byte data1, byte data2) {
  digitalWrite(outPin,HIGH);  // indicate we're sending MIDI data
  Serial.print(cmd, BYTE);
  Serial.print(data1, BYTE);
  Serial.print(data2, BYTE);
  digitalWrite(outPin,LOW);
}


Sei que o código está um pouco trapalhão mas isso depois arranja-se melhor... É que o tempo para estes projectos não e muito então tem de ser sempre a aviar... :P
Desde já muito obrigado pela ajuda...

Cumps
AndréD.
« Última modificação: 07 de Abril de 2012, 19:01 por AndréD. »

Offline tcustodio

  • Mini Robot
  • *
  • Mensagens: 344
  • "beware of programmers who carry a soldering iron"
    • Youtube
Re: Arduino Drumkit
« Responder #97 em: 07 de Abril de 2012, 19:59 »

Código: [Seleccione]
//------------------------------------//
void noteOn(byte channel, byte note, byte velocity) {
  midiMsg(channel+0x90, note, velocity);
  delay(50);

}

Sei que o código está um pouco trapalhão mas isso depois arranja-se melhor... É que o tempo para estes projectos não e muito então tem de ser sempre a aviar... :P
Desde já muito obrigado pela ajuda...

Cumps
AndréD.

O teu problema está no delay(50);, é que a função delay impede o arduino de executar seja o que for durante o tempo que lhe pedes :) por isso é que não consegues várias notas em simultâneo! :) no meu código fiz uma gestão de tempo diferente, dá uma olhada :)
Tiago Custódio,
- Não me dêem álcool se estiver um piano por perto.

Offline microbyte

  • Mini Robot
  • *
  • Mensagens: 1.322
    • http://ricardo-dias.com/
Re: Arduino Drumkit
« Responder #98 em: 07 de Abril de 2012, 20:51 »
Em MIDI, o conceito "ao mesmo tempo" são 2 comandos de NoteON enviados em sequência.
Como a taxa de transmissão é elevada, na prática ouvimos os sons ao mesmo tempo, mas quando falamos em programação, são sempre 2 instruções enviadas em sequência.

Offline AndréD.

  • Mini Robot
  • *
  • Mensagens: 180
    • AndreD Robotics
Re: Arduino Drumkit
« Responder #99 em: 07 de Abril de 2012, 20:59 »
Boas Micro...

Sim certo, mas por exemplo, se eu deixar o delay(50), nao consigo ter 2 toques (exemplo: bass e o Snare) ao mesmo tempo, ou pelo menos de forma a que "pareça" ser ao mesmo tempo, e se baixar o delay por exemplo para 10, toco no pad e acontece como se eu lá tivesse tocado 5+ vezes... Entendes?

Nao estou muito bem a ver como eide resolver a coisa... Ja estive a ver o código do TCustodio, mas não entendi grande coisa... :P

Agora é hora da JANTA... depois volto a pegar nisto... quero ver se deixo o prototipo acabado este fds para depois no próximo fazer uns pads maiores e os suportes e tal... Acabamentos vá...

Cumps
AndréD.

Offline microbyte

  • Mini Robot
  • *
  • Mensagens: 1.322
    • http://ricardo-dias.com/
Re: Arduino Drumkit
« Responder #100 em: 07 de Abril de 2012, 21:27 »
Boas Micro...

Sim certo, mas por exemplo, se eu deixar o delay(50), nao consigo ter 2 toques (exemplo: bass e o Snare) ao mesmo tempo, ou pelo menos de forma a que "pareça" ser ao mesmo tempo, e se baixar o delay por exemplo para 10, toco no pad e acontece como se eu lá tivesse tocado 5+ vezes... Entendes?

Nao estou muito bem a ver como eide resolver a coisa... Ja estive a ver o código do TCustodio, mas não entendi grande coisa... :P

Agora é hora da JANTA... depois volto a pegar nisto... quero ver se deixo o prototipo acabado este fds para depois no próximo fazer uns pads maiores e os suportes e tal... Acabamentos vá...

Cumps
AndréD.
Boas André.

Tu não podes fazer delay, porque literalmente vais deixar o Arduino a dormir durante N milisegundos.
Eu percebo o problema, tem a ver com o debounce, que o Tiago falou anteriormente no tópico.

Tens de fazer uma espécie de delay para cada um dos pads, mas sem usar o delay. Isto é, criares uma espécie de timer para cada pad que faz reset (e envia o comando MIDI) quando bates no pad respectivo e começa a contar até X, ignorando tudo o que se passar com esse pad até atingires esse valor.

Na prática é um contador para cada pad, que incrementas a cada loop, tens é de jogar com o tal valor X, que pode ser diferente para diferentes pads.

Cumps,
Ricardo Dias

Offline AndréD.

  • Mini Robot
  • *
  • Mensagens: 180
    • AndreD Robotics
Re: Arduino Drumkit
« Responder #101 em: 07 de Abril de 2012, 21:46 »
Boas...

Sim, mas depois vou perder a possibilidade de encurtar o Som visto que o pad fica a "fazer contas" por aquele x tempo...

Cumps
AndréD.

Offline tcustodio

  • Mini Robot
  • *
  • Mensagens: 344
  • "beware of programmers who carry a soldering iron"
    • Youtube
Re: Arduino Drumkit
« Responder #102 em: 07 de Abril de 2012, 22:09 »
não, não perdes a capacidade de encurtar o som... até podes depois definir um tempo de espera específico para cada som (reparei que no bass kick tens 100ms)

vou tentar explicar-te mais ou menos como fazer o que queres e também permitindo o uso de outros pads :)
ao usares o delay, impedes que o som se repita indevidamente, mas também impossibilitas o uso dos outros pads, pois estás a obrigar o arduino a bloquear durante 50ms. então temos que arranjar uma forma de esperar na mesma os teus 50ms mas sem que o arduino bloqueie.

Vou considerar apenas partes do meu código, não a sua totalidade.
isto são as declarações iniciais e o setup:
Código: [Seleccione]
short nota[6] = {32, 34, 36, 37, 39, 41};   //aqui digo quais os sons que quero nos meus pads
short valor[6] = {0, 0, 0, 0, 0, 0};        //aqui guardo a intensidade com que bati em cada prato da última vez
long tempo[6] = {0, 0, 0, 0, 0, 0};         //aqui registo quando foi a última vez que bati em cada pad

short canal_bateria = 9;
short threshold = 10;    //um limiar, se os valores lidos nos pads forem superiores a este, considero-os como batidas válidas
short debounce = 50;    //isto é o tempo para esperar entre cada batida (é como o teu delay)
short pratos = 6;

short i = 0;

void setup() {
  Serial.begin(31250);
}
até aqui tudo bem. Vou agora considerar um loop() simples:
Código: [Seleccione]
void loop() {
  for(i = 0; i < pratos; i++){    //tudo acontecerá num ciclo que vai ler as 6 portas analógicas e vai processar tudo

    valor[i] = analogRead(i)/8;    //até aqui, tudo igual ao teu, leio o valor, divido-o por 8 e guardo-o

    if (valor[i] > threshold){    //se o valor lido for superior ao limiar definido, então temos uma batida.
      noteOn(canal_bateria, nota[i], valor[i] + offset);
    }
  }
}
vamos agora adicionar a parte que gere o tempo.
Como lá em cima declarei um array que é suposto guardar quando foi a última vez que bato num pad, vou usá-lo. para isso usamos a função millis(), a função millis() retorna há quanto tempo o arduino está a trabalhar, em mili-segundos.
Código: [Seleccione]
if (valor[i] > threshold){
      noteOn(canal_bateria, nota[i], valor[i] + offset);
      tempo[i] = millis();    //aqui está. estou a guardar em que instante este pad sofreu impacto
    }
Agora é só adicionar a condição para usar o tempo. Temos que ver quando é que a diferença entre o tempo actual e o tempo registado é superior ao tempo que queremos, neste caso 50ms.
Código: [Seleccione]
if ((valor[i] > threshold) && (millis() - tempo[i] >= debounce)){    //aqui está. só será uma batida válida se o valor for superior ao limiar E se o tempo decorrido desde a última batida for superior ao "debounce"
      noteOn(canal_bateria, nota[i], valor[i] + offset);
      tempo[i] = millis();
    }
Tiago Custódio,
- Não me dêem álcool se estiver um piano por perto.

Offline AndréD.

  • Mini Robot
  • *
  • Mensagens: 180
    • AndreD Robotics
Re: Arduino Drumkit
« Responder #103 em: 07 de Abril de 2012, 22:53 »
Boas...

Ok, ja entendi... 5 Minutos... Vou implementar... Ja Edito este post a dizer como ficou...

Obrigado pelo teu tempo e pela tua explicação...

Cumps
AndréD.

Offline AndréD.

  • Mini Robot
  • *
  • Mensagens: 180
    • AndreD Robotics
Re: Arduino Drumkit
« Responder #104 em: 07 de Abril de 2012, 23:34 »
Boas...

A funcionar.... e BEM....
Os números são provisórios, foi so para testar...
Código: [Seleccione]
rride = analogRead(ride)/8; // change 0-1024 into 0-127
if ((rride > 10) && (millis() - tempo[5] >= 50)){    /
      noteOn(midiChannel, DK2[5], rride);
      tempo[5] = millis();
    } 

Algo como isto certo?
Agora isto quer é acabamentos :P

Muito obrigado Tc :P
Breve faço um video decente...

Cumps
AndréD.