Seize > Exemple de commande de servomoteur par Seize

Cet exemple montre comment programmer le contrôleur pour recevoir un message Seize et contrôler un servomoteur branché à la sortie numérique 9. L'angle peut être contrôlé grâce à une valeur entre 1000 et 2000.

1.  Circuit

Le branchement suivant requiert une alimentation stabilisée.

2.  Code embarqué pour recevoir


#include <Servo.h>

//Creer une instance de la logitheque
Servo myservo;

void setup()
{

        Serial.begin(57600);

        //Activer la fonction servo de la broche 9
        myservo.attach(9);

}

void loop() {

        // Tant et aussi longtemps qu'il y a des messages Seize a lire:
        while ( seizeAvailable() ) {
                // Lire le canal du message:
                byte channel = seizeChannel();
                // Ecouter seulement le canal 9:
                if ( channel == 9 ) {
                        // Lire la valeur du message:
                        int data =  seizeData();
                        // Appliquer la donnee en tant que valeur de PWM.
                        myservo.writeMicroseconds(data);
                }

        }
}



/**************************************************
*   ____________________.________________________
*  /   _____/\_   _____/|   \____    /\_   _____/
*  \_____  \  |    __)_ |   | /     /  |    __)_
*  /        \ |        \|   |/     /_  |        \
* /_______  //_______  /|___/_______ \/_______  /
*         \/         \/             \/        \/
*//////////////////////////////////////////////////

/*
BY      : THOMAS O FREDERICKS
CONTACT : tof@t-o-f.info
LICENSE : http://opensource.org/licenses/MIT


/*
FUNCTIONS
===================================================
void seizeWrite(byte channel, int data)
void seizeWrite(byte channel, long data)
byte seizeAvailable( )
byte seizeChannel()
long seizeData()
*/


void seizeWrite(byte channel, int data) {

        Serial.write( (data) & B01111111 );
        Serial.write( (data>>7) & B01111111 );
        // 11 ... channel ... data
        Serial.write( B11000000 | ( ((channel & B00001111) << 2)
        |  ((data>>14) & B00000011) ));

}

void seizeWrite(byte channel, long data) {
        Serial.write( (data) & B01111111 );
        Serial.write( (data>>7) & B01111111 );
        Serial.write( (data>>14) & B01111111 );
        Serial.write( (data>>21) & B01111111 );
        Serial.write( (data>>28) & B01111111 );
        // 10 ... channel ... type
        Serial.write( B10000000 | ( ((channel & B00001111) << 2)
        | B00000000) );
}


byte _seizeBuffer[6];
byte _seizeChannel = 0;
byte _seizeReceived;
long _seizeData = 0L;

byte seizeAvailable( ) {

        while ( Serial.available() ) {
                byte data = Serial.read();

                if ( data > 191 ) { // header == 11

                        _seizeChannel = (data & 0x3C) >> 2;
                        _seizeBuffer[_seizeReceived] =  (data & 0x03);
                        _seizeReceived++;

                        if ( _seizeReceived == 3 ) {
                                _seizeData = _seizeBuffer[0] | (_seizeBuffer[1]<<7)
                                | (_seizeBuffer[2]<<14);
                                _seizeReceived = 0;
                                return 1;
                        }

                        _seizeReceived = 0;


                }
                else if ( data > 127 ) { // header == 10

                        if ( _seizeReceived == 5 ) {
                                _seizeChannel = (data & 0x3C) >> 2;
                                _seizeData = (long)_seizeBuffer[0] | ((long)_seizeBuffer[1]<<7)
                                | ((long)_seizeBuffer[2]<<14) | ((long)_seizeBuffer[3]<<21)
                                | ((long)_seizeBuffer[4]<<28) ;
                                _seizeReceived = 0;
                                return 1;
                        }

                        _seizeReceived = 0;


                }
                else { // header = 0
                        _seizeBuffer[_seizeReceived] =  (data & 0x7F);
                        if ( _seizeReceived < 5 ) {
                                _seizeReceived++;
                        }

                }

        }

        return 0;
}


byte seizeChannel() {
        return _seizeChannel;
}

long seizeData() {
        return  _seizeData;
}

3.  Pour envoyer

Pour transmettre des messages au contrôleur et changer la valeur de fondu de la DEL, utiliser SeizeOSC ou intégrer Seize directement dans Max et envoyer une valeur entre 1000 et 2000 sur le canal 9.