Modules

Maintenant que nous avons décrit la démarche générale pour utiliser le système Fraise, nous allons décrire les différents modules.

Module Analog

Supposons que vous vouliez réaliser une application faisant intervenir des capteurs (des interrupteurs, des potentiomètres,…). Le module Analog a été conçu à cet effet. « Analog » signifie que le signal sera analogique et non pas digital ; c'est à dire que le signal sera continu sur un certain intervalle. Sur la version Versa1, le signal est compris entre 0 et 16383.
Remarque : un interrupteur étant ouvert/fermé ou allumé/éteint, seules deux valeurs sont importantes. Il serait plus approprié d'utiliser le module Switch ;mais le module Analog peut être utilisé malgré tout, en testant si la valeur fournie est supérieure à un certain seuil, allumé, ou inférieur à ce seuil, éteint.

Branchements

Les capteurs se branchent sur les connecteurs trois broches de la carte Fruit. Il y a trois broches qui correspondent à :

  • un fil de masse, correspondant à la broche la plus proche du bord de la carte ;
  • un fil d'alimentation 5V, correspondant à la broche centrale du connecteur ;.
  • un fil de signal, correspondant à la broche la plus éloignée du bord de la carte.

Vous avez à votre disposition neuf connecteurs pour brancher des capteurs avec un signal analogique (tous les connecteurs sauf K4, K11 et K12 ; les connecteurs sont identifiés sur la carte)

Un potentiomètre est une résistance variable.
potentiomètre

Sur un potentiomètre, il y a donc trois pattes : une pour la masse, une pour l'alimentation et une pour le signal. Quand vous tenez le potentiomètre, axe vers vous et pattes vers le bas, la patte à gauche doit être reliée à la masse ; la patte de droite doit être reliée au 5V (attention broche centrale du connecteur 3 broches) ; la patte du milieu à la broche signal du connecteur. Il y a donc inversion des deux dernières pattes.
Comme le potentiomètre est une résistance, les branchements ne nécessitent pas de résistance supplémentaire mais il faut prendre un potentiomètre dont la valeur à pleine résistance est de l'ordre de quelques kΩ.
Des interrupteurs peuvent aussi être branchés sur les entrées analogiques. Il faut alors placer une résistance de 10 kΩ entre le fil 5V et le fil de signal. L'interrupteur sera branché entre le fil de masse et le fil de signal.

Instructions du micro-processeur

Tout d'abord, il faut déclarer le module et ses fonctions.

#include <analog.h>
inclusion dans le programme des fonctions du module Analog.
Cette instruction s'écrit au début du programme, dans les déclarations.

analogInit();
fonction d'initialisation du module.

analogSelect(canal,connecteur);
association entre un canal et un connecteur ; cela permet d'associer un connecteur physique à un canal logique qui sera utilisé dans les patchs Pure Data. Le canal est un numéro compris entre 0 et 16.
Ces deux instructions devront être placées dans la fonction setup().

analogService();
fonction de gestion du module Analog

analogSend();
fonction d'envoi des valeurs recueillies sur les connecteurs déclarés analogiques, envoi de la carte Fraise vers la carte Pied, et vers l'ordinateur.
Ces deux instructions devront être placées dans la fonction loop(). La première doit être exécutée le plus souvent possible ; la deuxième n'est exécutée qu'à intervalles réguliers.

analogDeselect(canal)
supprime l'association entre un canal et un connecteur.

analogSetMode(mode)
définit le mode de fonctionnement du module analogique. Si la valeur du paramètre est AMODE_SCALE, les valeurs analogiques seront normalisées en pourcentage ; si la valeur du paramètre est AMODE_NUM, les valeurs analogiques seront numériques ; si la valeur du paramètre est AMODE_CROSS, les valeurs analogiques d'un canal ne seront envoyées que si les valeurs croisent la valeur qui aura été défini par l'instruction analogSet().

analogSet(canal,valeur)
définit la valeur de référence d'un canal, pour le mode analogique AMODE_CROSS.

analogGet(canal)
renvoie la valeur analogique d'un canal.

analogGetDistance(canal)
renvoie la distance entre la valeur analogique et la valeur définie par l'instruction analogSet(), pour un canal donné.

analogScaling(scaling)
permet d'étalonner tous les canaux en recherchant le minimum et le maximum. Utiliser analogScaling(1) pour démarrer l'étalonnage et analogScaling(0) pour terminer l'étalonnage.

Rappelons qu'une fois le programme écrit, vous devez le compiler et le mémoriser dans le circuit (voir la section programmation )

Utilisation dans les patchs Pure Data.

Pour que la carte Pied écoute une carte Fruit donnée, il faut cocher la case on de l'objet fruit/fruit qui correspond à cette carte, même nom et même identifiant. Si les cartes sont en communication, on obtient

fruit OK
Si même coché, l'objet reste gris, fruit pb communication il y a un problème de communication entre la carte pied et la carte Fruit

Comme nous l'avons vu dans le premier exemple, l'objet fruit/receive avec le nom de la carte Fruit écoute les signaux émis par la carte. Une carte Fruit peut émettre différents types de messages. Il faut donc, dans un premier temps, filtrer les messages analogiques. C'est un objet analog/parse qui réalise cette opération. Puis il faut filtrer le canal, puisqu'on peut utiliser jusqu'à neuf entrées analogiques. C'est un objet route qui réalise cette opération.

Si nous supposons que quatre entrées analogiques ont été déclarées dans le programme main.c.

    analogSelect(0,K1);
    analogSelect(1,K3);
    analogSelect(2,K5);
    analogSelect(3,K6);

utilisant les connecteurs K1, K3, K5 et K6. Nous aurions pu prendre d'autre canaux que 0 à 3, par exemple 1, 3, 5, 6, mais de toute façon entre 0 et 16.

fruit receive analogue

Dans cet exemple, le potentiomètre branché en K3 envoie une valeur à 5448.

Module Servo

Supposons que vous vouliez réaliser une application faisant intervenir des servo-moteurs. Le module Servo a été conçu à cet effet.

Branchements

Un servo-moteur se branche directement sur un connecteur trois broches de la carte Fraise. Rappelons que la masse se situe sur la broche proche du bord de la carte. Vous avez à votre disposition les douze connecteurs trois broches. Mais des servo-moteurs sont des moteurs et ainsi consomment une certaine intensité électrique, donc ont une certaine puissance, dépendant aussi du couple demandé. La carte Fruit Versa1 ne possède qu'une alimentation par le port USB et il n'est pas conseillé d'utiliser douze servo-moteurs à couple maximum simultanément.

Il est possible d'aider la carte Fruit en fournissant une alimentation annexe pour les servo-moteurs. Les servo-moteurs sont alimentés en 5V. La masse de cette alimentation annexe doit être reliée à la masse de la carte. Un condensateur 6.3V, 1000μF viendra assister l'alimentation.
alimentation servo

On peut brancher plusieurs servo-moteurs sur cette alimentation annexe.
alimentation servo 2

Programmation du micro-processeur

Tout d'abord, il faut déclarer le module et ses fonctions.

#include <servo.h>
inclusion dans le programme des fonctions du module Servo.
Cette instruction s'écrit au début du programme, dans les déclarations.

servoInit();
fonction d'initialisation du module.

servoSelect(canal,connecteur);
association entre un canal et un connecteur ; cela permet d'associer un connecteur physique à un canal logique qui sera utilisé dans les patchs Pure Data. Le canal est un numéro compris entre 0 et 16. Par exemple, servoSelect(0,K1); associe le canal logique 0 au connecteur K1.
Ces deux instructions devront être placées dans la fonction setup().

servoService();
fonction de gestion du module Servo.
Cette instruction doit être placée dans la fonction loop(). Elle doit être exécutée le plus souvent possible.

Pour chaque servo-moteur, cette dernière fonction va envoyer du courant pendant un temps proportionnel à la position que doit occuper l'axe du servo-moteur. Cela se fait en utilisant un timer. Le timer est amorcé dans la fonction servoService() et, lorsque le timer sera arrivé à son terme, une interruption sera déclenchée. Tout cela est inclus dans le module Servo mais il faut quand même appeler la fonction d'interruptions des servo-moteurs. Pour cela, dans le programme main.c, il faut définir la fonction suivante :

void highInterrupts() 
{ 
    servoHighInterrupt(); 
} 

Le servo-moteur sera commandé par le patch Pure Data. Il faudra donc envoyer des messages de commande pour modifier la position du servo-moteur. Un message de commande se composera

  • d'un code signifiant « ce message concerne les servo-moteurs »
  • du canal du servo-moteur concerné et
  • de la position souhaitée.

Nous préconisons d'utiliser 20 comme code pour un message de servo-moteur afin d'éviter des confusions par la suite. La fonction fraiseReceive() se charge de décoder les messages destinés à la carte Fruit. Elle contiendra donc les instructions :

unsigned char c=fraiseGetChar(); 
if(c==20) servoReceive(); // 

qui se comprennent facilement : si le message commence par 20, on appelle la fonction servoReceive() qui se chargera d'interpréter la suite du message.

Si on associe le canal logique 0 au connecteur K11 et le canal 1 au connecteur K12, le fichier main.c ressemblera à ceci :

#define BOARD Versa1 
#include <fruit.h>  
#include <servo.h>   

//----------- Setup ----------------  
void setup() {  
    fruitInit();     
    servoInit();   
    servoSelect(0,K11);  
    servoSelect(1,K12); 
}    

// ---------- Main loop ------------     
void loop() {    
    fraiseService();    
    servoService();  
}  

// ---------- Interruptions ------------     
void highInterrupts()     
{   
    servoHighInterrupt();    
}  

// ---------- Réception ------------     
void fraiseReceive()    
{   
    unsigned char c=fraiseGetChar();     
    if(c==20) servoReceive();     
}   

Rappelons qu'une fois le programme écrit, vous devez le compiler et le mémoriser dans le circuit (voir la section programmation )

Utilisation dans les patchs Pure Data.

On vient de voir que les commandes sont envoyées dans des messages commençant par 20. On indique ensuite le canal et la position. Nous avons vu, dans le premier exemple, que la fonction fruit/send envoie les messages vers la carte Fruit et que la fonction fruit/send2 envoie les messages vers la carte Fruit après avoir testé sa présence.

fruit send commande servo

Mais quelles sont les valeurs possibles indiquant la position ? Celles-ci ne peuvent pas être définies de façon universelle pour tous les servo-moteurs. Cela dépend du modèle de servo-moteur ; de plus, il y a des servo-moteurs qui ne font que 180°, d'autres presque 360°, d'autres sont multitours.... Les positions s'étendent rarement au-delà de 4000 et 16000 mais il faudra tester votre servo-moteur.

Si on suppose que vous avez utilisé 20 comme code des messages de servo-moteurs et que vous avez défini le canal 0 pour le connecteur K1, ce petit patch vous permettra de tester le comportement de votre servo-moteur facilement. Ajoutez une boîte glissière horizontale et modifiez les propriétés pour que la plage de sortie varie entre 3500 et 18000. Ajoutez une boîte nombre pour voir la valeur précise. Ajoutez une boîte message qui contiendra le code , le canal et la position considérée comme paramètre $1 venant de la boîte nombre précédente.

fruit send test du servo

Il est possible de demander la position actuelle d'un servo-moteur. Il suffit d'envoyer la demande dans un message constitué du code de message des servo-moteurs 20, puis du code 254, puis du canal souhaité. La réponse sera renvoyée par la carte Fruit et l'objet fruit/receive écoute les messages envoyés par la carte Fruit. Le message de réponse commence par 20, puis le canal. Des objets route permettront de filtrer la réponse.

fruit send position du servo

Si on utilise plusieurs servo-moteurs, il est évidemment possible d'avoir des messages demandant la position de chaque servo-moteur.

fruit send positions du servo

Module Switch

Supposons que vous vouliez réaliser une application faisant intervenir des interrupteurs. Le module Switch a été conçu à cet effet. Le signal fournie par la carte Fruit sera 0 ou 1, selon l'état de l'interrupteur.

Branchements

Les interrupteurs se branchent sur les connecteurs trois broches de la carte Fruit Versa1. Il y a trois broches qui correspondent à :

  • un fil de masse, correspondant à la broche la plus proche du bord de la carte ;
  • un fil d'alimentation 5V, correspondant à la broche centrale du connecteur ;.
  • un fil de signal, correspondant à la broche la plus éloignée du bord de la carte.

Vous avez à votre disposition ??? connecteurs pour brancher des interrupteurs (???? tous les connecteurs sauf K4, K11 et K12 ; les connecteurs sont identifiés sur la carte ?????)

Pour savoir si l'interrupteur est ouvert ou fermé, nous allons relier une des bornes de l'interrupteur à la broche de signal et l'autre borne de l'interrupteur à la broche de masse et nous allons brancher une résistance de 10 kΩ entre la broche d'alimentation 5V et la broche de signal.

swich Branchement

  • fil marron à la broche de masse, au bord du circuit imprimé
  • fil vert à la broche d'alimentation 5V
  • fil rouge à la broche de signal

Les ergots du connecteur femelle trois broches évitent un branchement inversé.

Instructions du micro-processeur

Tout d'abord, il faut déclarer le module et ses fonctions.

#include <switch.h>
inclusion dans le programme des fonctions du module Switch. Cette instruction s'écrit au début du programme, dans les déclarations.

switchInit();
fonction d'initialisation du module.

switchSelect(canal,connecteur);
association entre un canal et un connecteur ; cela permet d'associer un connecteur physique à un canal logique qui sera utilisé dans les patchs Pure Data. Le canal est un numéro compris entre 0 et 16.
Ces deux instructions devront être placées dans la fonction setup().

switchService();
fonction de gestion du module Switch

switchSend();
fonction d'envoi des valeurs recueillies sur les connecteurs déclarés pour les interrupteurs, envoi de la carte Fraise vers la carte Pied, et vers l'ordinateur.
Ces deux instructions devront être placées dans la fonction loop(). La première doit être exécutée le plus souvent possible ; la deuxième n'est exécutée qu'à intervalles réguliers.

Rappelons qu'une fois le programme écrit, vous devez le compiler et le mémoriser dans le circuit (voir la section programmation )

Utilisation dans les patchs Pure Data.

Pour que la carte Pied écoute une carte Fruit donnée, il faut cocher la case on de l'objet fruit/fruit qui correspond à cette carte, même nom et même identifiant. Si les cartes sont en communication, on obtient

fruit OK

Si même coché, l'objet reste gris, fruit pb communication alors il y a un problème de communication entre la carte pied et la carte Fruit

Comme nous l'avons vu dans le premier exemple, l'objet fruit/receive avec le nom de la carte Fruit écoute les signaux émis par la carte. Une carte Fruit peut émettre différents types de messages. Il faut donc, dans un premier temps, filtrer les messages ; ici on veut isoler les messages envoyés par le module Switch. C'est un objet route qui réalisera cette opération. Puis il faut filtrer le canal, puisqu'on peut utiliser jusqu'à ???? entrées analogiques. C'est un autre objet route qui réalise cette opération. Si nous supposons que trois entrées pour interrupteurs ont été déclarées dans le programme main.c

switchSelect(0,K1);
switchSelect(1,K3);
switchSelect(2,K7);

utilisant les connecteurs K1, K3 et K7. Nous aurions pu prendre d'autre canaux que 0 à 3, par exemple 1, 3, 7, mais de toute façon entre 0 et 16.

fruit switch
Ici, l'interrupteur sur le connecteur K1 est fermé ; les autres sont ouverts.

results matching ""

    No results matching ""