Aller au contenu


Photo
- - - - -

Tête en ballons - servos - record des mouvements


44 réponses à ce sujet

#21 Sam Balloons

Sam Balloons

    Membre

  • Membres
  • 25 messages

Posté 18 septembre 2017 - 07:05

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.



#22 Ulysse

Ulysse

    Membre passionné

  • Membres
  • PipPipPip
  • 486 messages
  • Gender:Not Telling

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



#23 Sam Balloons

Sam Balloons

    Membre

  • Membres
  • 25 messages

Posté 20 septembre 2017 - 10:33

Ok! Super! :)



#24 Ulysse

Ulysse

    Membre passionné

  • Membres
  • PipPipPip
  • 486 messages
  • Gender:Not Telling

Posté 02 octobre 2017 - 11:33

Merci d'avoir été patient, je sorts un peu la tête de l'eau :wacko:

 

Je te propose d'installer sur une machine windows

  • Reaper : un séquenceur de pistes audio + midi. Les évènements sont très faciles à éditer à la souris pour commencer
  • LoopMIDI : un port MIDI virtuel
  • Hairless MIDI : pour rediriger les messages du port virtuel vers un port physique ( notre arduino )

 

Ç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 ?



#25 Ulysse

Ulysse

    Membre passionné

  • Membres
  • PipPipPip
  • 486 messages
  • Gender:Not Telling

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 :-)

midi_ctrl_PAN_01.jpg

 

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();
}


#26 Sam Balloons

Sam Balloons

    Membre

  • Membres
  • 25 messages

Posté 03 octobre 2017 - 10:31

Wahou, cool! Hâte d'essayer ça!!! C'est à mon tour d'être super pris par le taf... je pourrais essayer tt ça ce we ou début semaine pro!

Va falloir que je dépoussière le pc ;)

Merci!



#27 Ulysse

Ulysse

    Membre passionné

  • Membres
  • PipPipPip
  • 486 messages
  • Gender:Not Telling

Posté 05 octobre 2017 - 05:54

j'ai fais évoluer le code pour faire bouger un servo par la réception du contrôle VOLUME du canal 01 mais il me reste un peu de mise au point car tous les évènement ne sont pas pris en compte. Je regarde ça.



#28 Sam Balloons

Sam Balloons

    Membre

  • Membres
  • 25 messages

Posté 06 octobre 2017 - 12:23

J'ai installé les logiciels (j'avais déjà reaper).

Petite question, à terme, sera-t-il possible d'utilisé un raspberry pi pour faire tourner qqchose en boucle? Histoire d'avoir toute la technique dans un petit compartiment.



#29 Sam Balloons

Sam Balloons

    Membre

  • Membres
  • 25 messages

Posté 06 octobre 2017 - 05:16

Sur reaper, comment es-tu arrivé à cette vue? J'y suis presque...j'ai juste le piano affiché sur la gauche de l'écran...



#30 Ulysse

Ulysse

    Membre passionné

  • Membres
  • PipPipPip
  • 486 messages
  • Gender:Not Telling

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.

 

midi_ctrl_VOL_01.jpg

 

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 :

  • le contrôleur est remplacé par un petit module arduino avec quelques potentiomètres
  • les mouvements sont enregistrés pas le séquenceur
  • les mouvements sont reproduits ( maintenant c'est validé ) par les servos

 

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 ...

  • la lecture des caractères reçus
  • la capture de l'évènement midi CONTROLE 7 (le volume ) du canal 1
  • la commande du servo

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);
		}
	
	}
 
 





#31 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 6 732 messages
  • Gender:Male

Posté 08 octobre 2017 - 05:58

Ulysse, tu m'épates !
Là, tu es bon pour un tuto sur ton interface MIDI.
Qu'en pensez-vous, les autres ?

#32 Telson

Telson

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 975 messages
  • Gender:Male
  • Location:Punaauai - Tahiti

Posté 08 octobre 2017 - 12:17

Tous les tutos sont bon à prendre. Merci.



#33 Sam Balloons

Sam Balloons

    Membre

  • Membres
  • 25 messages

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?? 



#34 Ulysse

Ulysse

    Membre passionné

  • Membres
  • PipPipPip
  • 486 messages
  • Gender:Not Telling

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 .

 

 



#35 Sam Balloons

Sam Balloons

    Membre

  • Membres
  • 25 messages

Posté 08 octobre 2017 - 06:57

Wouhhouuuuu!!! ça fonctionne!!!! :)



#36 Ulysse

Ulysse

    Membre passionné

  • Membres
  • PipPipPip
  • 486 messages
  • Gender:Not Telling

Posté 08 octobre 2017 - 07:33

Excellent, On va pouvoir travailler sur le sujet

#37 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 934 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 08 octobre 2017 - 07:43

Maintenant on a le droit aussi à un petit tuto pour faire une tête sympas avec des ballons ? :P 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

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!

 

Les réalisations de Mike118  

 

 

 


#38 Sam Balloons

Sam Balloons

    Membre

  • Membres
  • 25 messages

Posté 08 octobre 2017 - 08:19

Dois-je commencer par les noeuds???  :)



#39 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 934 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

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  !  :thank_you:

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!

 

Les réalisations de Mike118  

 

 

 


#40 Sam Balloons

Sam Balloons

    Membre

  • Membres
  • 25 messages

Posté 08 octobre 2017 - 08:43

 

Moi je ne sais pas ! C'est toi l'expert ! ;)

En fait, je voulais dire: sais-tu faire les noeuds? :) Et puis as-tu des ballons??? ;)

Il va ptet falloir commencer par le chien! :)





Répondre à ce sujet



  


0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users