Go Down

Topic: fabriquer un controleur midi (footswitch) (Read 4 times) previous topic - next topic

frascal

Merci beaucoup Skywodd j'essaie cela desuite. :smiley-eek:

frascal

Bon eh bien j'ai écrit ton code dans le logiciel arduino et je fais une vérification, cela me dit :

avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_getsync(): timeout communicating with programmer
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_getsync(): timeout communicating with programmer
avrdude: stk500v2_command(): failed miserably to execute command 0x11
avrdude: stk500v2_disable(): failed to leave programming mode

voilà :smiley-eek-blue:
a +
Pascal

skywodd


Bon eh bien j'ai écrit ton code dans le logiciel arduino et je fais une vérification, cela me dit :

avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
(...)

C'est qu'il y a eu un probléme lors de l'envoi sur l'arduino, essaye d'uploader le sketch blink en appuyant sur reset lorsque "binary done ..." s'affiche.
Ps: ce n'est pas une vérification que tu as fait mais un upload vu que avrdude à était lancé ;)

Par contre je viens de me rendre compte que j'ai utilisé la mauvaise version du pinmapping pour mega 2560 (le fichier tableur sur le playground) et pas la version finale ... donc mes correspondance broches <> port sont fausse, je vais corriger tout ça désolé :. (en réalité sur la version tableur c'est la correspondance broches ATmega <> port et non broche "arduino" <> port :smiley-yell:) ou plus simplement je vais faire une version avec digitalRead (ce sera plus simple pour toi).
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

skywodd

Voila ce coup ci c'est le bon pinmapping ^_^
Code: [Select]
/*
*
* 24 BP Midi Footswitch by SkyWodd
*
* Boutons :
* 1 ~ 8 : D22 ~ D29 (PORTA)
* 9 ~ 16 : D37 ~ D30 (PORTC)
* 17 ~ 24 : A8 ~ A15 (PORTK)
*
* Dx -> BP -> GND
*/

void setup() {
  DDRA = 0x0;
  PORTA = 0xFF; // PORT A -> INPUT + Pull-up
  DDRC = 0x0;
  PORTC = 0xFF; // PORT C -> INPUT + Pull-up
  DDRK = 0x0;
  PORTK = 0xFF; // PORT K -> INPUT + Pull-up

  Serial.begin(31250); // Serial -> midi
}

void loop() {
  if(bitRead(PINA, 0)) { // BP 1

  }
  if(bitRead(PINA, 1)) { // BP 2

  }
  if(bitRead(PINA, 2)) { // BP 3

  }
  if(bitRead(PINA, 3)) { // BP 4

  }
  if(bitRead(PINA, 4)) { // BP 5

  }
  if(bitRead(PINA, 5)) { // BP 6

  }
  if(bitRead(PINA, 6)) { // BP 7

  }
  if(bitRead(PINA, 7)) { // BP 8

  }
  if(bitRead(PINC, 0)) { // BP 9

  }
  if(bitRead(PINC, 1)) { // BP 10

  }
  if(bitRead(PINC, 2)) { // BP 11

  }
  if(bitRead(PINC, 3)) { // BP 12

  }
  if(bitRead(PINC, 4)) { // BP 13

  }
  if(bitRead(PINC, 5)) { // BP 14

  }
  if(bitRead(PINC, 6)) { // BP 15

  }
  if(bitRead(PINC, 7)) { // BP 16

  }
  if(bitRead(PINC, 0)) { // BP 17

  }
  if(bitRead(PINK, 1)) { // BP 18

  }
  if(bitRead(PINK, 2)) { // BP 19

  }
  if(bitRead(PINK, 3)) { // BP 20

  }
  if(bitRead(PINK, 4)) { // BP 21

  }
  if(bitRead(PINK, 5)) { // BP 22

  }
  if(bitRead(PINK, 6)) { // BP 23

  }
  if(bitRead(PINK, 7)) { // BP 24

  }
  delay(1000); // Evite le flood
}

void midiCmd(byte db1, byte db2, byte db3) {
  Serial.write(db1);
  Serial.write(db2);
  Serial.write(db3);
}

void midiCmd(byte db1, byte db2 ) {
  Serial.write(db1);
  Serial.write(db2);
}


Ou sinon version digitalRead :
Code: [Select]

/*
*
* 24 BP Midi Footswitch by SkyWodd
*
* Boutons :
* 1 ~ 24 : D22 ~ D45
*
* Dx -> BP -> GND
*/

void setup() {
  for(byte i = 22 ; i < 46 ; i++) {
    pinMode(i, INPUT); // mise en entrée
    digitalWrite(i, HIGH); // active pull-up
  }

  Serial.begin(31250); // Serial -> midi
}

void loop() {
  if(digitalRead(22)) { // BP 1

  }
  if(digitalRead(23)) { // BP 2

  }
  if(digitalRead(24)) { // BP 3

  }
  if(digitalRead(25)) { // BP 4

  }
  if(digitalRead(26)) { // BP 5

  }
  if(digitalRead(27)) { // BP 6

  }
  if(digitalRead(28)) { // BP 7

  }
  if(digitalRead(29)) { // BP 8

  }
  if(digitalRead(30)) { // BP 9

  }
  if(digitalRead(31)) { // BP 10

  }
  if(digitalRead(32)) { // BP 11

  }
  if(digitalRead(33)) { // BP 12

  }
  if(digitalRead(34)) { // BP 13

  }
  if(digitalRead(35)) { // BP 14

  }
  if(digitalRead(36)) { // BP 15

  }
  if(digitalRead(37)) { // BP 16

  }
  if(digitalRead(38)) { // BP 17

  }
  if(digitalRead(39)) { // BP 18

  }
  if(digitalRead(40)) { // BP 19

  }
  if(digitalRead(41)) { // BP 20

  }
  if(digitalRead(42)) { // BP 21

  }
  if(digitalRead(43)) { // BP 22

  }
  if(digitalRead(44)) { // BP 23

  }
  if(digitalRead(45)) { // BP 24

  }
  delay(1000); // Evite le flood
}

void midiCmd(byte db1, byte db2, byte db3) {
  Serial.write(db1);
  Serial.write(db2);
  Serial.write(db3);
}

void midiCmd(byte db1, byte db2 ) {
  Serial.write(db1);
  Serial.write(db2);
}
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

frascal

Grand merci Skywodd,
donc si je comprend bien je dois rejouter cela

if(bitRead(PINA, 0)) { // BP 1
   midiCmd(0xb0,0x5b,0x00);
  }

et cela m'enverra le message midi  0xb0,0x5b,0x00 ?

skywodd

Quote
donc si je comprend bien je dois rajouter cela

if(bitRead(PINA, 0)) { // BP 1
   midiCmd(0xb0,0x5b,0x00);
  }

et cela m'enverra le message midi  0xb0,0x5b,0x00 ?

Voila c'est ça ^^
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

AlienArea51

Salut
Il m'énèrve ce SKYWODD    :D :D :D :D :D :D :D :D

Toujours réponses à tout  ;) ;)

@+
The truth is elsewhere !!

frascal

Salut,
Donc j'ai rentré le code dans la carte et ... tout a l'air de bien ce passer.
maintenant il faut que je me penche sur le patch max et l'objet [serial].
est ce que la ligne:
Serial.begin(31250); // Serial -> midi

veux dire que je dois mettre l'argument 31250 dans mon objet [serial] ?
en tout cas merci de la précieuse aide.
à bientôt
Pascal

skywodd

Quote
est ce que la ligne:
Serial.begin(31250); // Serial -> midi
veux dire que je dois mettre l'argument 31250 dans mon objet [serial] ?

J'ai mis 31250 bauds comme vitesse pour le port série car c'est le standard midi, après je ne sait pas comment tu contrôle ton systéme, il faut juste que tu fasse coïncider les deux vitesses (patch max / arduino).
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

frascal

Salut a tous,
j'ai entrée le code de skywodd suivant:

/*
*
* 24 BP Midi Footswitch by SkyWodd
*
* Boutons :
* 1 ~ 8 : D22 ~ D29 (PORTA)
* 9 ~ 16 : D37 ~ D30 (PORTC)
* 17 ~ 24 : A8 ~ A15 (PORTK)
*
* Dx -> BP -> GND
*/

void setup() {
  DDRA = 0x0;
  PORTA = 0xFF; // PORT A -> INPUT + Pull-up
  DDRC = 0x0;
  PORTC = 0xFF; // PORT C -> INPUT + Pull-up
  DDRK = 0x0;
  PORTK = 0xFF; // PORT K -> INPUT + Pull-up

  Serial.begin(31250); // Serial -> midi
}

void loop() {
  if(bitRead(PINA, 0)) { // BP 1

  }
  if(bitRead(PINA, 1)) { // BP 2

  }
  if(bitRead(PINA, 2)) { // BP 3

  }
  if(bitRead(PINA, 3)) { // BP 4

  }
  if(bitRead(PINA, 4)) { // BP 5

  }
  if(bitRead(PINA, 5)) { // BP 6

  }
  if(bitRead(PINA, 6)) { // BP 7

  }
  if(bitRead(PINA, 7)) { // BP 8

  }
  if(bitRead(PINC, 0)) { // BP 9

  }
  if(bitRead(PINC, 1)) { // BP 10

  }
  if(bitRead(PINC, 2)) { // BP 11

  }
  if(bitRead(PINC, 3)) { // BP 12

  }
  if(bitRead(PINC, 4)) { // BP 13

  }
  if(bitRead(PINC, 5)) { // BP 14

  }
  if(bitRead(PINC, 6)) { // BP 15

  }
  if(bitRead(PINC, 7)) { // BP 16

  }
  if(bitRead(PINC, 0)) { // BP 17

  }
  if(bitRead(PINK, 1)) { // BP 18

  }
  if(bitRead(PINK, 2)) { // BP 19

  }
  if(bitRead(PINK, 3)) { // BP 20

  }
  if(bitRead(PINK, 4)) { // BP 21

  }
  if(bitRead(PINK, 5)) { // BP 22

  }
  if(bitRead(PINK, 6)) { // BP 23

  }
  if(bitRead(PINK, 7)) { // BP 24

  }
  delay(1000); // Evite le flood
}

void midiCmd(byte db1, byte db2, byte db3) {
  Serial.write(db1);
  Serial.write(db2);
  Serial.write(db3);
}

void midiCmd(byte db1, byte db2 ) {
  Serial.write(db1);
  Serial.write(db2);
}

et j'ai changé cette ligne:
Serial.begin(9600); // Serial -> midi

vu que sur les tutoriels que j'ai trouvé pour max la plupart du temps on trouve ce baud ?

après cela pour ceux qui connaissent max/msp j'ai fait un patch avec l'objet [serial a 9600 8]
en sortie je me retrouve avec cette série de 3 nombres 176, 11, 0
sans que j'appuie sur le moindre boutons qui est cablé sur le gnd qui ce trouve à coté de l'entrée aref (est ce que c'est le bon endroit ?) et mon entrée digitale 22 qui devrait correspondre à mon bouton poussoir 1.
et quand j'appuis sur mon boutons il n'y a aucun changement.

enfin j'ai un doute sur la commande:

void loop() {
  if(bitRead(PINA, 0)) { // BP 1
  midiCmd(0xb0,0x0b,0x00);
  }

en effet est ce que (0xb0,0x0b,0x00) correspond à une information midi valide ??
(j'ai trouvé cela sur un tutoriel midi).

avec toute les aide que l'on m'a filé (merci encore skywodd ;)) je pense être près du but.
Pascal




skywodd


après cela pour ceux qui connaissent max/msp j'ai fait un patch avec l'objet [serial a 9600 8]
en sortie je me retrouve avec cette série de 3 nombres 176, 11, 0
sans que j'appuie sur le moindre boutons qui est cablé sur le gnd qui ce trouve à coté de l'entrée aref (est ce que c'est le bon endroit ?) et mon entrée digitale 22 qui devrait correspondre à mon bouton poussoir 1.
et quand j'appuis sur mon boutons il n'y a aucun changement.

La série de 3 nombres je pense qu'il doit s'agir du bootloader arduino qui se lance et qui regarde si un nouveau programme doit être reçu (mais pas sur à 100%).

Ps: met ton code entre balises code (le # dans l'éditeur) ce sera beaucoup plus lisible et ça évitera du travail en plus à nos chères modérateurs ;)
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

frascal

Resalut a tous,

donc, j'ai réessayé en faisant comme ceci:

Code: [Select]
/*
*
* 24 BP Midi Footswitch by SkyWodd
*
* Boutons :
* 1 ~ 24 : D22 ~ D45
*
* Dx -> BP -> GND
*/

void setup() {
  for(byte i = 22 ; i < 46 ; i++) {
    pinMode(i, INPUT); // mise en entrée
    digitalWrite(i, HIGH); // active pull-up
  }

  Serial.begin(9600); // Serial -> midi
}

void loop() {
  if(digitalRead(22)) { // BP 1
  midiCmd(0x0,01,0x01);
  }
  if(digitalRead(23)) { // BP 2
   midiCmd(0x0,01,0x02);
  }
  if(digitalRead(24)) { // BP 3
   midiCmd(0x0,01,0x03);
  }
  if(digitalRead(25)) { // BP 4
   midiCmd(0x0,01,0x04);
  }
  if(digitalRead(26)) { // BP 5
   midiCmd(0x0,01,0x05);
  }
  if(digitalRead(27)) { // BP 6
   midiCmd(0x0,01,0x06);
  }
  if(digitalRead(28)) { // BP 7
   midiCmd(0x0,01,0x07);
  }
  if(digitalRead(29)) { // BP 8
   midiCmd(0x0,01,0x08);
  }
  if(digitalRead(30)) { // BP 9
   midiCmd(0x0,01,0x09);
  }
  if(digitalRead(31)) { // BP 10
   midiCmd(0x0,01,0x10);
  }
  if(digitalRead(32)) { // BP 11
   midiCmd(0x0,01,0x11);
  }
  if(digitalRead(33)) { // BP 12
   midiCmd(0x0,01,0x12);
  }
  if(digitalRead(34)) { // BP 13
   midiCmd(0x0,01,0x13);
  }
  if(digitalRead(35)) { // BP 14
   midiCmd(0x0,01,0x14);
  }
  if(digitalRead(36)) { // BP 15
   midiCmd(0x0,01,0x15);
  }
  if(digitalRead(37)) { // BP 16
   midiCmd(0x0,01,0x16);
  }
  if(digitalRead(38)) { // BP 17
   midiCmd(0x0,01,0x17);
  }
  if(digitalRead(39)) { // BP 18
   midiCmd(0x0,01,0x18);
  }
  if(digitalRead(40)) { // BP 19
   midiCmd(0x0,01,0x19);
  }
  if(digitalRead(41)) { // BP 20
   midiCmd(0x0,01,0x20);
  }
  if(digitalRead(42)) { // BP 21
   midiCmd(0x0,01,0x21);
  }
  if(digitalRead(43)) { // BP 22
   midiCmd(0x0,01,0x22);
  }
  if(digitalRead(44)) { // BP 23
   midiCmd(0x0,01,0x23);
  }
  if(digitalRead(45)) { // BP 24
   midiCmd(0x0,01,0x24);
  }
  delay(1000); // Evite le flood
}

void midiCmd(byte db1, byte db2, byte db3) {
  Serial.write(db1);
  Serial.write(db2);
  Serial.write(db3);
}

void midiCmd(byte db1, byte db2 ) {
  Serial.write(db1);
  Serial.write(db2);
}


et la dans ma fenêtre de contrôle max cela m'envoie toute les environs 500ms: 1,2,3,4,5,6,7,8,9,16,17,18,19,20,21,22,23,24,25,32,33,34,35.
et quand j'appuie par exemple sur mon bp numero 1 (donc l'entrée digital 22) je trouve la même série sauf le 1 ? pareil pour le 2 etc.

Mais après réflexion, je me suis dit qu'il n'était pas important que je reçoive à tout pris un message midi, puisque je vais travailler directement avec un cable usb et non un cable midi.
Dans max/msp il suffirait que je récupère ne serais ce qu'un numéro, après ça je fait ma cuisine.

frascal

Salut à tous,
J'ai trouvé un tutoriel avec un exemple qui m'a bien servi et ... ça marche ;)
la==> http://www.mon-club-elec.fr/pmwiki_mon_club_elec/pmwiki.php?n=MAIN.ArduinoExpertSons2AppuiBPx5lanceSonProcessing

j'ai adapté le code comme cela:
Code: [Select]
const int APPUI=LOW;

const int BP_1=22;
const int BP_2=23;
const int BP_3=24;
const int BP_4=25;
const int BP_5=26;
const int BP_6=27;
const int BP_7=28;
const int BP_8=29;
const int BP_9=30;
const int BP_10=31;
const int BP_11=32;
const int BP_12=33;
const int BP_13=34;
const int BP_14=35;
const int BP_15=36;
const int BP_16=37;
const int BP_17=38;
const int BP_18=39;
const int BP_19=40;
const int BP_20=41;
const int BP_21=42;
const int BP_22=43;
const int BP_23=44;
const int BP_24=45;

void setup()   {

Serial.begin(9600);

pinMode (BP_1,INPUT);
pinMode (BP_2,INPUT);
pinMode (BP_3,INPUT);
pinMode (BP_4,INPUT);
pinMode (BP_5,INPUT);
pinMode (BP_6,INPUT);
pinMode (BP_7,INPUT);
pinMode (BP_8,INPUT);
pinMode (BP_9,INPUT);
pinMode (BP_10,INPUT);
pinMode (BP_11,INPUT);
pinMode (BP_12,INPUT);
pinMode (BP_13,INPUT);
pinMode (BP_14,INPUT);
pinMode (BP_15,INPUT);
pinMode (BP_16,INPUT);
pinMode (BP_17,INPUT);
pinMode (BP_18,INPUT);
pinMode (BP_19,INPUT);
pinMode (BP_20,INPUT);
pinMode (BP_21,INPUT);
pinMode (BP_22,INPUT);
pinMode (BP_23,INPUT);
pinMode (BP_24,INPUT);

digitalWrite (BP_1,HIGH);
digitalWrite (BP_2,HIGH);
digitalWrite (BP_3,HIGH);
digitalWrite (BP_4,HIGH);
digitalWrite (BP_5,HIGH);
digitalWrite (BP_6,HIGH);
digitalWrite (BP_7,HIGH);
digitalWrite (BP_8,HIGH);
digitalWrite (BP_9,HIGH);
digitalWrite (BP_10,HIGH);
digitalWrite (BP_11,HIGH);
digitalWrite (BP_12,HIGH);
digitalWrite (BP_13,HIGH);
digitalWrite (BP_14,HIGH);
digitalWrite (BP_15,HIGH);
digitalWrite (BP_16,HIGH);
digitalWrite (BP_17,HIGH);
digitalWrite (BP_18,HIGH);
digitalWrite (BP_19,HIGH);
digitalWrite (BP_20,HIGH);
digitalWrite (BP_21,HIGH);
digitalWrite (BP_22,HIGH);
digitalWrite (BP_23,HIGH);
digitalWrite (BP_24,HIGH);

void loop(){

if (digitalRead(BP_1)==APPUI){
Serial.println(11);
delay(500);
}

if (digitalRead(BP_2)==APPUI){
Serial.println(12);
  delay(500);
}

if (digitalRead(BP_3)==APPUI){
Serial.println(13);
  delay(500);
}

if (digitalRead(BP_4)==APPUI){
Serial.println(14);
  delay(500);
}

if (digitalRead(BP_5)==APPUI){
Serial.println(15);
  delay(500);
}
if (digitalRead(BP_6)==APPUI){
Serial.println(16);
delay(500);
}

if (digitalRead(BP_7)==APPUI){
Serial.println(17);
  delay(500);
}

if (digitalRead(BP_8)==APPUI){
Serial.println(18);
  delay(500);
}

if (digitalRead(BP_9)==APPUI){
Serial.println(19);
  delay(500);
}

if (digitalRead(BP_10)==APPUI){
Serial.println(20);
  delay(500);
}
if (digitalRead(BP_11)==APPUI){
Serial.println(21);
delay(500);
}

if (digitalRead(BP_12)==APPUI){
Serial.println(22);
  delay(500);
}

if (digitalRead(BP_13)==APPUI){
Serial.println(23);
  delay(500);
}

if (digitalRead(BP_14)==APPUI){
Serial.println(24);
  delay(500);
}

if (digitalRead(BP_15)==APPUI){
Serial.println(25);
  delay(500);
}
if (digitalRead(BP_16)==APPUI){
Serial.println(26);
delay(500);
}

if (digitalRead(BP_17)==APPUI){
Serial.println(27);
  delay(500);
}

if (digitalRead(BP_18)==APPUI){
Serial.println(28);
  delay(500);
}

if (digitalRead(BP_19)==APPUI){
Serial.println(29);
  delay(500);
}

if (digitalRead(BP_20)==APPUI){
Serial.println(30);
  delay(500);
}
if (digitalRead(BP_21)==APPUI){
Serial.println(31);
  delay(500);
}

if (digitalRead(BP_22)==APPUI){
Serial.println(32);
  delay(500);
}

if (digitalRead(BP_23)==APPUI){
Serial.println(33);
  delay(500);
}

if (digitalRead(BP_24)==APPUI){
Serial.println(34);
  delay(500);
}


}


bon, maintenant si je veux rajouter sur une entrée un potentiomètre qui m'envoie par exemple des integrés (1 à 1024 par exemple), est ce vraiment compliqué ?

merci de vos réponses

frascal

Super pour le potentiomètre ça marche !!
j'ai juste mis la ligne de code suivante:

Code: [Select]
int sensorValue = analogRead(A0);
Serial.println(sensorValue,DEC);


par contre j'ai déjà des données (avec les BP) de 11 à 34.
mon potard de 250K m'envoie de 0 à 1023 comment faire pour qu'il m'envoie de 35 à 1058 ?

AlienArea51

Bonsoir Frascal
Essaye avec ça :
Quote
map(value, fromLow, fromHigh, toLow, toHigh)

Quote
val = map(val, 0, 1023, 35, 1058);


@+
The truth is elsewhere !!

Go Up