Tutorial bibliothèque SRIO :

Dans ce tutorial nous allons voir comment utiliser la bibliothèque SRIO avec la platine Dilicktal

Pour ce tutorial vous avez besoin de :
-1x Midilickuino
-1x Arduino
            -1x à 8x  Dilicktal
-Arduino software (version 1.0 or newer)
-la bibliothèque SRIO_v1.2
-1x câble USB


Description de la bibliothèque SRIO:
void Initialize();
//Initialise les entrées/sorties utilisées avec Dilciktal

void Led_SR_Write (byte SR_num, byte data);
//Envoi une valeur de 8bits à la platine Dilicktal sélectionné
// le nombre de SRIO va de 0 à 7 (0 =>  première Dilicktal connectée, 1 => deuxième Dilicktal connectée ...)
// la valeur envoyée va de 0 à 255
//Exemple: 
//  Led_SR_Write(0,255) allume toutes les Leds de la première platine Dilicktal connectée dans la chaine.

void Led_Pin_Write (byte Pin_num, byte flag);
//Envoi 0 ou 1 à la Pin de la Led sélectionné
//Le nombre de Pin va de 0 à 63 (0 étant la première Pin de la première Dilicktal...)
//la valeur envoyée est soit 1=>allumée ou 0 =>éteinte
//Exemple:
//  Led_Pin_Write(34,1) allume la troisième Led de la cinquième Dilicktal de la chaine.

void Led_All_On();
//Allume toutes les leds connectées
//Ne demande aucun paramètre

void Led_All_Off();
//Eteint toutes les leds connectées
//Ne demande aucun paramètre

byte Led_SR_Read (byte SR_num);
//Renvoie la valeur (8bits) de l'état des Leds de la platine Dilicktal sélectionnée
// le nombre de SRIO va de 0 à 7 (0 =>  première Dilicktal connectée, 1 => deuxième Dilicktal connectée ...)

byte Button_SR_Read (byte SR_num);
//Renvoie la valeur (8bits) de l'état des boutons de la platine Dilicktal sélectionnée
// le nombre de SRIO va de 0 à 7 (0 =>  première Dilicktal connectée, 1 => deuxième Dilicktal connectée ...)

byte Button_Pin_Read (byte Pin_num);
//Renvoie l'état du bouton sélectionné, 0=> relaché ou 1=>appuyé
//Le nombre de Pin va de 0 à 63 (0 étant la première Pin de la première Dilicktal...)



Utilisation de la bibliothèque SRIO:

Attention: La bibliothèque SRIO fonctionne uniquement avec Arduino UNO, Pro, Duemilanove,
Diecimila, NG et Extreme.
Pour les autres Boards allez voir sur le forum ici ou contactez nous et nous vous enverrons le code correspondant à votre Arduino

1-Copier le dossier "SRIO" qui se trouve dans la fichier Zip de la bibliothèque
SRIO et le coller dans le dossier "libraries" de votre environnement Arduino
Il se trouve dans: X:/.../arduino-1.0.x/libraries/
Vous êtes prêts maintenant à utiliser le bibliothèque SRIO.

2-Nous allons maintenant créer un code simple qui utilise les fonctions de la bibliothèque SRIO
Lancer Arduino et importer notre bibliothèque
Allez dans "Croquis" puis "Importer Bibliothèque..." vous devriez voir apparaitre SRIO, cliquez dessus.
Suivi de "void setup" et "void loop"
Dans "void setup" entrée la fonction d'initialisation de la bibliothèque: SR.Initialize()
Votre code devrai ressembler au suivant:


#include <SRIO.h>
 

void setup()
{
  SR.Initialize();
}

void loop()
{
}

3-Amusons nous un peu avec les fonctions.
Connectez Arduino avec Midilickuino à votre ordinateur en USB
Connectez maintenant la ou les platines Dilicktal à Midilickuino
L'ordre dans lequel vous les connectez vous donnera le numéro de chaque Dilciktal et celui de chaque Pin.

Lickogic NumSR et bouton

4-Nous allons créer un programme qui va nous donner sur le moniteur série d'arduino
le numéro de chaque platine Dilicktal.
Voici le code et ces commentaires pour que vous puissiez comprendre le fonctionnement.
Téléversez le code et ouvrez le moniteur série en appuyant sur CTRL+MAJ+M
Vous devez voir une ligne qui dit : "La platine numero X est allumee".


////////////////////////////////////////////////////////
//Ce programme nous montre le numéro de chaque platine
//Dilicktal connectée à Midilickuino                   
////////////////////////////////////////////////////////

#include <SRIO.h>


//Variable du nombre de platine connectée
int nbr_platine = 8;

void setup()
{
  //Initialise le port série à 9600 baud
  Serial.begin(9600);
  //Initialise les entrées/sorties utilisées par Dilicktal
  SR.Initialize();
}

void loop()
{
  //Boucle autant de fois que de platine connectée
  for(int i=0; i<nbr_platine; i++){
    //Allumer les leds de la platine Dilciktal
    SR.Led_SR_Write(i,255);
    //Envoi au moniteur Série le numero de la platine Dilicktal allumée
    Serial.print("La platine numero ");
    Serial.print(i,DEC);
    Serial.println(" est allumee");
    //delay pour que ce soit lisible 
    delay(2000);
    //Eteint les leds de la platine Dilicktal
    SR.Led_SR_Write(i,0);
  }
}


5-Un petit exercice, et oui ne croyez pas que l'on va vous mâcher tout le travail.
Essayez de faire la même chose mais cette fois-ci, il faut que le moniteur série indique
le numéro de chaque led.
Servez vous de la fonction "Led_Pin_Write" au lieu de "Led_SR_Write"
Voici le corrigé: (Surligné le cadre pour voir le code)
 
////////////////////////////////////////////////////////
//Ce programme nous montre le numéro de chaque led//
//connectée à Midilickuino                   //
////////////////////////////////////////////////////////

#include <SRIO.h>


//Variable du nombre de led connectée
int nbr_led = 64;

void setup()
{
  //Initialise le port série à 9600 baud
  Serial.begin(9600);
  //Initialise les entrées/sorties utilisées par Dilicktal
  SR.Initialize();
}

void loop()
{
  //Boucle autant de fois que de nombre de led
  for(int i=0; i<nbr_led; i++){
    //Allumer les leds de la platine Dilicktal
    SR.Led_Pin_Write(i,1);
    //Envoi au moniteur Série le numero de la platine Dilicktal allumée
    Serial.print("La Led numero ");
    Serial.print(i,DEC);
    Serial.println(" est allumee");
    //delay pour que ce soit lisible
    delay(2000);
    //Eteint les leds de la platine Dilicktal
    SR.Led_Pin_Write(i,0);
  }
}

 

6-Maintenant que nous savons utiliser les fonctions attribuées au Led nous allons voir celle 
attribuées au boutons.
Nous allons créer un programme qui va nous afficher sur le moniteur série d'Arduino quel bouton
est appuyé.
voici le programme commenté:
 
//Ce programme nous montre l'état des boutons de chaque
//Lickogic connectée à Midilickuino                   

#include <SRIO.h>


//Constante du nombre de bouton connecté, mettez votre nombre de bouton
#define nbr_button  64

//Variable de l'état des boutons 
//La taille de l'Array correspond au nombre de bouton
int button_state[nbr_button];

void setup()
{
  //Initialise le port série à 9600 baud
  Serial.begin(9600);
  //Initialise les entrées/sorties utilisées par Dilicktal
  SR.Initialize();
}

void loop()
{
  //Boucle autant de fois que de nombre de bouton
  for(int i=0; i<nbr_button; i++){
    //Enregistre l'état du bouton dans la variable
    button_state[i]=SR.Button_Pin_Read(i);
    //l'état de mon bouton est il appuyé?
    if(button_state[i] == 1){
      //Envoi au moniteur Série le numero du bouton appuyée
      Serial.print("Le bouton numero ");
      Serial.print(i,DEC);
      Serial.println(" est appuye");
    }
  }
}

Vous remarquerez que dans ce programme tant que nous appuyons sur le bouton le moniteur série affiche
sans cesse: "Le bouton X est appuye". Vous me direz que ça ne pose pas de problème.
Dans ce cas non, mais il ne faut pas oublier que nous voulons envoyer des évenement MIDI et
si lors de l'appuie sur le bouton on envoie tout le temps un message MIDI cela va saturer la liaison et
vous ne pourrez plus rien envoyer d'autre comme donnée MIDI.

7-Donc l'execice suivant sera d'affiché sur le moniteur série l'état du bouton: appuyé ou
 relaché. Courage, ce n'est pas bien compliqué, il vous faut utiliser une autre
variable temoin de l'état des boutons
Voici le corrigé: (Surligné le cadre pour voir le code)

//Ce programme nous montre l'état des boutons de chaque
//Lickogic connectée à Midilickuino                   

#include <SRIO.h>


//Constante du nombre de bouton connecté
#define nbr_button  64

//Variable de l'état des boutons
//La taille de l'Array correspond au nombre de bouton
int button_state[nbr_button];

//Variable témoin de l'état des boutons
int old_button_state[nbr_button];

void setup()
{
  //Initialise le port série à 9600 baud
  Serial.begin(9600);
  //Initialise les entrées/sorties utilisées par Dilicktal
  SR.Initialize();
}

void loop()
{
  //Boucle autant de fois que de nombre de bouton
  for(int i=0; i<nbr_button; i++){
    //Enregistre l'état du bouton dans la variable
    button_state[i]=SR.Button_Pin_Read(i);
    //l'état de mon bouton a t il changé?
    if(button_state[i] != old_button_state[i]){
      //l'état du bouton est il à 1 ou à 0?
      switch(button_state[i]){
      case 0:
        //Envoi au moniteur Série le numero du bouton relaché
        Serial.print("Le bouton numero ");
        Serial.print(i,DEC);
        Serial.println(" est relache");
        break;
      case 1:
        //Envoi au moniteur Série le numero du bouton appuyée
        Serial.print("Le bouton numero ");
        Serial.print(i,DEC);
        Serial.println(" est appuye");
        break;
      }
    }
    //On oublie pas de mettre à jour notre variable témoin
    old_button_state[i] = button_state[i];
  }
}

8-Maintenant que nous avons ce programme il n'est pas très compliqué de la modifier pour envoyer
des données MIDI avec nos boutons.
Commençons par créer une fonction qui envoie des message Control Change.

 
void Send_CC(byte num_CC, byte value)
{
  Serial.write (0xB0);//Message "control change" sur canal MIDI 1
  Serial.write (num_CC);
  Serial.write (value);
}
 
Pour le changement du canal MIDI ou du type de message référencez vous au Tutoriel Midilickuino
Insérons notre fonction dans notre code précédent et remplaçons les messages d'envoie vers
le moniteur série par l'envoie d'un message MIDI
Ajoutons la fonction "Led_Pin_Write" pour que la led correspondante au bouton s'allume lors de l'appuie
Ajoutons aussi le choix de la vitesse de communication série
Et voila ce que cela donne:

 
//Envoie de donnée MIDI suivant action sur un bouton
                    #include <SRIO.h> //Constante qui défine si on utilise la liaison USB => 2, MIDI => 1 ou SERIE => 0 #define serial_baud 2 //Constante du nombre de bouton connecté, mettez votre nombre de bouton #define nbr_button  64 //Variable de l'état des boutons  //La taille de l'Array correspond au nombre de bouton int button_state[nbr_button]; //Variable témoin de l'état des boutons int old_button_state[nbr_button]; //Fonction qui envoie un message de CC sur le canal MIDI 1 void Send_CC(byte num_CC, byte value) {   Serial.write (0xB0);//Message "control change" sur canal MIDI 1   Serial.write (num_CC);   Serial.write (value); } void setup() {   //Choix de la vitesse de communication du port série   switch (serial_baud){   case 0:     Serial.begin(9600);//Communication serie pour le debuggage     break;   case 1:     Serial.begin(31250);//communication MIDI     break;   case 2:     Serial.begin(115200);//communication USB     break;   }   //Initialise les entrées/sorties utilisées par Lickogic   SR.Initialize();   //Animation des leds qui témoigne que le programme a demarré   SR.Led_All_On();   delay(500);   SR.Led_All_Off(); } void loop() {   //Boucle autant de fois que de nombre de bouton   for(int i=0; i<nbr_button; i++){     //Enregistre l'état du bouton dans la variable     button_state[i]=SR.Button_Pin_Read(i);     //l'état de mon bouton a t il changé?     if(button_state[i] != old_button_state[i]){       //l'état du bouton est il à 1 ou à 0?       switch(button_state[i]){       case 0:         //Envoi du message CC sur canal 1 correspondant au bouton relaché         Send_CC(i,0);         //Eteint la led correspondante au bouton         SR.Led_Pin_Write(i,0);         break;       case 1:         //Envoi du message CC sur canal 1 correspondant au bouton appuyé         Send_CC(i,127);         //Allume la led correspondante au bouton         SR.Led_Pin_Write(i,1);         break;       }     }     //On oublie pas de mettre à jour notre variable témoin     old_button_state[i] = button_state[i];   } }
 
Voila il ne vous reste plus qu' à faire vos propres applications.
D'autres codes seront données comme le choix entre un bouton TOGGLE ou MOMENTARY ou
encore un Drum sequencer.... libre court à votre imagination.