Salut.
3 servos. Pour comprendre, pourquoi l'idéal serait 3 identiques? Ds mon install actuelle, il y en a 2 identiques, et un 3ème plus puissant.
Posté 18 septembre 2017 - 10:31
Ce n'est pas bloquant
La valeur d'une commande MIDI sera comprise entre 0 (valeur min) et 127 (valeur max)
L'interface Arduino va faire le lien entre cette valeur et un angle de rotation
Mais comme tous les servomoteurs n'ont pas une amplitude de mouvement identique il faudra expérimenter un peu
Rien de bien méchant, ça reste simple.
Si possible cette semaine :
on choisi le séquenceur
on envoi des commandes vers une interface de type 'bidouille' pour la mise au point
Posté 02 octobre 2017 - 11:33
Merci d'avoir été patient, je sorts un peu la tête de l'eau
Je te propose d'installer sur une machine windows
Ça va donner quelque chose comme ça :
Reaper (midi OUT) ---> LoopMIDI ---> Hairless MIDI ---> Arduino (USB) ---> servomoteurs
Reaper et Hairless MIDI existent aussi pour MAC, par contre je ne peux pas tester un équivalent à LoopMIDI pour MAC
On essaye ça ?
Posté 02 octobre 2017 - 09:43
Je viens d'essayer ce soir : c'est tout bon. Les évènements saisis à la souris (dans l'image le contrôleur volume sur le canal 01) sont bien reçus par une carte Arduino MEGA. Pour l'instant je fais juste clignoter une LED quelque soit la valeur reçue (entre 0 et 127), l'étape suivante je fais bouger un servomoteur. Tranquille quoi :-)
On a une vingtaine de contrôleurs disponibles sur 16 canaux, ça laisse pas mal possibilités.
// Tête en ballons v0.1 du 02/10/2017 // Utilisation d'évènements MIDI pour contrôler des servomoteurs #include <MIDI.h> #if defined(USBCON) #include <midi_UsbTransport.h> static const unsigned sUsbTransportBufferSize = 16; typedef midi::UsbTransport<sUsbTransportBufferSize> UsbTransport; UsbTransport sUsbTransport; MIDI_CREATE_INSTANCE(UsbTransport, sUsbTransport, MIDI); #else // No USB available, fallback to Serial MIDI_CREATE_DEFAULT_INSTANCE(); #endif // -- #define LED 13 // LED pin on Arduino Uno void BlinkLed() // Basic blink function { digitalWrite(LED,HIGH); delay(50); digitalWrite(LED,LOW); delay(50); } void handleNoteOn(byte inChannel, byte inNumber, byte inVelocity) { // à implémenter si on veut } void handleNoteOff(byte inChannel, byte inNumber, byte inVelocity) { // à implémenter si on veut } void handleProgramChange(byte inChannel, byte number) { // à implémenter si on veut } void handleControlChange(byte ControlNumber, byte ControlValue, byte Channel ) { // cet évènement nous intéresse ! // ControlNumber The controller number (0 to 127). See the detailed description here: http://www.somascape.org/midi/tech/spec.html#ctrlnums // ControlValue The value for the specified controller (0 to 127). // Channel The channel on which the message will be sent (1 to 16). // c'est ici qu'on va lire la valeur ControlValue (0 to 127) pour contrôler un servo // Mais pour l'instant : blink ! BlinkLed(); } void setup() { Serial.begin(115200); while (!Serial); MIDI.begin(); MIDI.setHandleNoteOn(handleNoteOn); MIDI.setHandleNoteOff(handleNoteOff); MIDI.setHandleProgramChange(handleProgramChange); MIDI.setHandleControlChange(handleControlChange); ) } void loop() { MIDI.read(); }
Posté 07 octobre 2017 - 11:20
.j'ai juste le piano affiché sur la gauche de l'écran...
l'icone en haut à gauche permet de masquer les touches du clavier
tu peux diminuer l'espace d'affichage des touches pour augmenter l'espace d'affichage des contrôles ( on n'a pas besoin des touches )
tu dois sélectionner le contrôle O7 ( le volume ). on peut dessiner à la souris une suite de valeurs qui seront poussées vers la sortie MIDI.
Pour la mise au point du soft de l' arduino je m'aide d'un contrôleur midi, c'est plus pratique. J'ai un bouton de volume sur le canal 01. Toutes les positions du bouton sont bien reproduites en temps réel par le servo, ce qui valide le principe.
Dans ton projet :
J'ai tout réécrit depuis la version précédant. La norme MIDI est largement documentée sur le net.
Voici le code de base qui réalise en boucle ...
Dans ton cas c'est la fonction actionne(midi_controle, midi_chanel, midi_value) qui est importante. C'est là qu'on décide de ce qu'on fait sur le canal 1, 2,3 ...
C'est une base à partir de laquelle on peut travailler
// Tête en ballons // Utilisation d'évènements MIDI pour contrôler des servomoteurs // v0.1 02/10/2017 création // v0.2 06/10/2017 ajout de la rotation d'un servo #include <Servo.h> //variables byte midi_controle; byte midi_chanel; byte midi_value; //int statusLed = 14; // select the pin for the LED //int statusLed = 17; // select the pin for the LED int statusLed = 20; // select the pin for the LED Servo myservo1; // create servo object to control a servo int pinServo1 = 2; // connection électrique sur la sortie xx void blink() { digitalWrite(statusLed, HIGH); delay(50); digitalWrite(statusLed, LOW); delay(50); } //setup: declaring iputs and outputs and begin serial void setup() { pinMode(statusLed,OUTPUT); // declare the LED's pin as output //start serial with midi baudrate Serial.begin(115200); // 31250 myservo1.attach(pinServo1); // attaches the servo on pin 9 to the servo object myservo1.write(150); } boolean get_midi_message( byte & controle, byte & channel, byte & value ) { static int nrbyte = 1; static byte statut; static byte data1 ; static byte data2 ; static boolean acceptmessage; controle = 0; channel = 0; value = 0; if (Serial.available() > 0) { // lecture du caractère byte incomingByte = Serial.read(); switch (incomingByte) { case 0xF8: // clock controle = incomingByte; nrbyte = 1; return true; break; case 0xFA: // start controle = incomingByte; nrbyte = 1; return true; break; case 0xFB: // continue controle = incomingByte; nrbyte = 1; return true; break; case 0xFC: // stop controle = incomingByte; nrbyte = 1; return true; break; } int event; switch (nrbyte) { case 1 : // le premier caractère doit obligatoirement être >= 0x80, sinon sortie if (incomingByte < 0x80) { statut = 0; data1 = 0; data2 = 0; return false; } // le controle change ? event = incomingByte; event = event & 0xF0; // masque les 4 bits de poids faible xxxx 0000 if (event == 0xB0) { // c'est le contrôle Change statut = incomingByte; nrbyte = 2; } else { statut = 0; data1 = 0; data2 = 0; return false; } // le channel data1 = incomingByte & 0x0F; // masque les 4 bits de poids forte 0000 xxxx break; case 2 : // second caractère : data1 if (incomingByte != 0x07) { statut = 0; data1 = 0; data2 = 0; nrbyte = 1; return false; } nrbyte = 3; break; case 3 :// troisième caractère : data2 data2 = incomingByte; controle = statut; channel = data1; value = data2; nrbyte = 1; return true; break; } } // pas de message à lire. return false; } void actionne(byte controle, byte channel, byte value) { switch (controle) { case 0xFA : // start digitalWrite(statusLed, HIGH); break; case 0xFC : // stop digitalWrite(statusLed, LOW); break; case 0xB0 : // Controle du volume switch(channel) { case 0 : // servo 1 //blink(); myservo1.write(value); break; case 1 : // servo 2 break; case 2 : // servo 3 break; case 3 : // servo 4 break; default: myservo1.write(value); break; } break; } } //loop: s'il y a un message, on le traite void loop () { if (get_midi_message(midi_controle, midi_chanel, midi_value ) ) { actionne(midi_controle, midi_chanel, midi_value); } }
Posté 08 octobre 2017 - 05:58
Ma chaine YouTube : https://www.youtube..../oracid1/videos
Posté 08 octobre 2017 - 01:02
Merci beaucoup Ulysse!
Je t'avoue qu'au niveau du code, c'est un peu du chinois pour moi... je vais qd même essayer de comprendre le cheminement.
Sur la vidéo, le contrôleur MIDI est bien branché sur l'ordi?
Le servo est en pin9. Il n'y a rien d'autre au niveau de l'arduino?
Est-ce que le servo doit bouger qd je fais "play" sur Reaper??
Posté 08 octobre 2017 - 05:39
Sur la vidéo, le contrôleur MIDI est bien branché sur l'ordi?
Oui, sur un port usb qui est vu comme une interface midi (in)
Le servo est en pin9. Il n'y a rien d'autre au niveau de l'arduino?
J'utilise le port 2 :
int pinServo1 = 2; // connection électrique sur la sortie xx
Est-ce que le servo doit bouger qd je fais "play" sur Reaper??
Oui, avec pour conditions ( dans cet ordre )
LoopMIDI doit être lancé
Hairless MIDI doit être lancé et configuré
midi in = le nom qui apparait dans LoopMIDI
serial port = le port série ouvert par le module arduino connecté en USB
la case Sérial <-> MIDI Bridge On cochée (debug aussi peut être utile au début)
Reaper doit être configuré
Options \ Préférences \ Midi outputs : le non qui apparait dans LoopMIDI doit être Enable
Le port midi de la piste doit être configuré : icone Route \ MIDI hardware output = le non qui apparait dans LoopMIDI et Send to channel 1
Dans cette piste il faut saisir quelques valeurs de volume (controle 7) comme indiqué sur l'illustration précédente
Ce qui nous fait :
Evènements Volume de la piste 1 -> LoopMIDI (channel 1) -> Hairless MIDI -> Arduino
Première chose à faire pour contrôler : Hairless MIDI affiche les messages reçu .
Posté 08 octobre 2017 - 07:43
Maintenant on a le droit aussi à un petit tuto pour faire une tête sympas avec des ballons ?
Si mon commentaire vous a plus laissez nous un avis !
Nouveau sur Robot Maker ?
Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope aux articles, à la boutique et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être !
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!
Posté 08 octobre 2017 - 08:39
Dois-je commencer par les noeuds???
Moi je ne sais pas ! C'est toi l'expert !
Si mon commentaire vous a plus laissez nous un avis !
Nouveau sur Robot Maker ?
Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope aux articles, à la boutique et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être !
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!
0 members, 1 guests, 0 anonymous users