Seize > Exemple de commande de servomoteur par Seize
Contents (hide)
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.
Le branchement suivant requiert une alimentation stabilisée.
#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; }
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.