Contrôle de moteurs

Contrôle de servo-moteurs

Directement via l'arduino

Depuis la version 1.7 du logiciel Arduino il est possible de contrôler jusqu'à 12 servo moteurs sur une seul arduino Duemilanove. Il suffit pour cela d'utiliser la librairy Servo.h existante. Voici un exemple du code qui peut être utilisé :

#include <Servo.h>
Servo servo1; // crée un nouvel objet servo
int position = 0; // contient la position du servomoteur

void setup()
{
servo1.attach(9); // attache le servomoteur sur la pin 9
}

void loop()
{
for(pos = 0; pos < 180; pos ++) // Passe de la position 0 à 180 avec 1 pas par degré
{
myservo.write(pos); // Donne l'ordre au servo de se placer à l'angle demandé
delay(15); // Attend 15 ms que le servo soit placé
}
for(pos = 180; pos>=1; pos--) // passe de la position 180 à 0
{
myservo.write(pos);
delay(15);
}
}

Via la carte pololu

Pololu a créé une carte qui peut contrôler jusqu'à 8 servos moteurs via la liaison série : la micro serial servo controler.

Grâce à cette carte il est très simple de contrôler les 8 servos sans avoir besoin de créer une shield sur l'arduino qui soit beaucoup trop grosse et pas forcement fiable ...

Afin de l'utiliser il faut tout d'abord installer la librairie SoftwareSerial.h dans le cas ou vous souhaitez utiliser une arduino ( qui n'est pas une mega) car il faut utiliser la liaison série. Une fois cette librairie installée, il vous faut d'ajouter les fonctions de contrôle des servos à votre programme. Voici d'ailleurs un exemple de programme comprenant les fonctions de contrôle ainsi que quelques déplacements de test.

// Pololu micro serial servo controller modes 

// Software Serial from Arduino example by Tom Igoe

// put() (now position_absolute) & set_speed() functions found on pololu forums & modified

// mike crist 2009-01-03

#include <SoftwareSerial.h>

#define rxPin 2

#define txPin 3



// set up a new serial port

SoftwareSerial softSerial = SoftwareSerial(rxPin, txPin);


void setup()

{

pinMode(rxPin, INPUT);
digitalWrite(txPin, HIGH); // keeps pololu board from getting spurious signal
pinMode(txPin, OUTPUT);


// set the data rate for the hardware serial port
Serial.begin(9600);
// set the data rate for the SoftwareSerial port
softSerial.begin(9600);


// set initial servo speeds
set_speed(0, 10);
set_speed(1, 10);
set_speed(2, 10);
set_speed(3, 10);


//set and move servos to neutral positions using command 5
set_neutral(0, 3000);
set_neutral(1, 3000);
set_neutral(2, 3000);
set_neutral(3, 3000);


//initialize servos using command 0
set_servo_parameters(0, 15);
set_servo_parameters(1, 15);
set_servo_parameters(2, 15);
set_servo_parameters(3, 15);
set_servo_parameters(4, 15);

}


void loop()

{

}


void set_servo_parameters(byte servo, byte rangeVal)
{

//this function uses pololu mode command 0 to set servo parameters
//servo is the servo number (typically 0-7)
//rangeVal of 15 gives 180 deg in 8-bit, 90 deg in 7 bit

byte temp;
byte parameters;

temp = 1 << 6; //set first two bits of parameters (on = 1, forward = 0)
temp = temp + (rangeVal & 0x1f); //put first five bits of rangeVal into temp
parameters = temp & 0x7f; //take only bottom 7 bits

//Send a Pololu Protocol command
softSerial.print(0x80,BYTE); //start byte
softSerial.print(0x01,BYTE); //device id
 softSerial.print(0x00,BYTE); //command number
 softSerial.print(servo,BYTE); //servo number
 softSerial.print(parameters,BYTE); //parameters
}

void set_speed(byte servo, byte speedVal)
{
 //this function uses pololu mode command 1 to set speed
 //servo is the servo number (typically 0-7)
 //speedVal is servo speed (1=slowest, 127=fastest, 0=full)
 //set speedVal to zero to turn off speed limiting

 speedVal = speedVal & 0x7f; //take only lower 7 bits of the speed

 //Send a Pololu Protocol command
 softSerial.print(0x80,BYTE); //start byte
 softSerial.print(0x01,BYTE); //device id
 softSerial.print(0x01,BYTE); //command number
 softSerial.print(servo,BYTE); //servo number
 softSerial.print(speedVal,BYTE); //speed
}

void position_7bit(byte servo, byte posValue)
{

//this function uses pololu mode command 2 to set position
//servo is the servo number (typically 0-7)
 //posValue * range (set with command 0) adjusted by neutral (set with command 5)
 //determines servo position

 byte pos = posValue & 0x7f; //get lower 7 bits of position

 //Send a Pololu Protocol command
 softSerial.print(0x80,BYTE); //start byte
 softSerial.print(0x01,BYTE); //device id
 softSerial.print(0x02,BYTE); //command number
 softSerial.print(servo,BYTE); //servo number
 softSerial.print(pos, BYTE); //position

}

void position_8bit(byte servo, byte posValue)
{

//this function uses pololu mode command 3 to set position
//servo is the servo number (typically 0-7)
 //posValue * range (set with command 0) adjusted by neutral (set with command 5)
 //determines servo position

 byte temp;
 byte pos_hi,pos_low;

 temp = posValue & 0x80; //get bit 8 of position
 pos_hi = temp >> 7; //shift bit 8 by 7
 pos_low = posValue & 0x7f; //get lower 7 bits of position

 //Send a Pololu Protocol command
 softSerial.print(0x80,BYTE); //start byte
 softSerial.print(0x01,BYTE); //device id
 softSerial.print(0x03,BYTE); //command number
 softSerial.print(servo,BYTE); //servo number
softSerial.print(pos_hi, BYTE); //bits 8 thru 13
 softSerial.print(pos_low, BYTE); //bottom 7 bits

}

void position_absolute(byte servo, int angle)
{
 //this function uses pololu mode command 4 to set absolute position
 //servo is the servo number (typically 0-7)
 //angle is the absolute position from 500 to 5500

 unsigned int temp;
 byte pos_hi,pos_low;

 temp = angle & 0x1f80; //get bits 8 thru 13 of position
 pos_hi = temp >> 7; //shift bits 8 thru 13 by 7
 pos_low = angle & 0x7f; //get lower 7 bits of position

 //Send a Pololu Protocol command
 softSerial.print(0x80, BYTE); //start byte
 softSerial.print(0x01, BYTE); //device id
 softSerial.print(0x04, BYTE); //command number
 softSerial.print(servo, BYTE); //servo number
 softSerial.print(pos_hi, BYTE); //bits 8 thru 13
 softSerial.print(pos_low, BYTE); //bottom 7 bits

}

void set_neutral(byte servo, int angle)
{
 //this function uses pololu mode command 5 to set neutral position
 //servo is the servo number (typically 0-7)
 //angle is the absolute position from 500 to 5500

 unsigned int temp;
 byte pos_hi,pos_low;

 temp = angle & 0x1f80; //get bits 8 thru 13 of position
 pos_hi = temp >> 7; //shift bits 8 thru 13 by 7
 pos_low = angle & 0x7f; //get lower 7 bits of position

//Send a Pololu Protocol command
 softSerial.print(0x80, BYTE); //start byte
 softSerial.print(0x01, BYTE); //device id

 softSerial.print(0x05, BYTE); //command number
 softSerial.print(servo, BYTE); //servo number
 softSerial.print(pos_hi, BYTE); //bits 8 thru 13
 softSerial.print(pos_low, BYTE); //bottom 7 bits
}

Contrôle de moteur courant continu

Via la carte Qik de pololu ( moteurs jusqu'à 1A)

Cette carte est celle utilisée dans le robot en CD :



Cette carte permet de contrôler 2 moteurs CC via un liaison série. Attention cette carte ne supporte pas un ampérage supérieur à 1A.
Afin d'utiliser la carte de commande il faut tout d'abord installer la librairie qik2s9v1.
Ensuite l'utilisation est extrêmement simple :



#include <CompactQik2s9v1.h>
#include <NewSoftSerial.h>

/*
Attention
La pin rx va sur la pin "TX" de la Qik
La pin tx va sur la pin "RX" de la Qik#define rxPin 3
*/

#define txPin 4
#define rstPin 5

NewSoftSerial mySerial = NewSoftSerial(rxPin, txPin);
CompactQik2s9v1 motor = CompactQik2s9v1(&mySerial,rstPin);
byte fwVersion = -1;

void setup()
{

mySerial.begin(9600);

motor.begin();

 motor.stopBothMotors()

}

void loop()
{

}


Via la MD22 ( moteur jusqu'à 5A)


La carte MD22 est une carte de controle de moteur CC en I2C ce qui a le gros avantage de ne pas utiliser la liaison série de l'arduino. De plus cette carte permet de controler des moteurs consommant jusqu'à 5A chacun ! Voici un exemple de code utilisable pour controler les moteurs


#include <Wire.h>
#define addr 0b1011000
void setup() {
Wire.begin();// Démarre la liaison
Wire.beginTransmission(addr);// Ecrit à l'esclave à l'adresse addr
Wire.send(0x00);// Choisi le mode
Wire.send(0);// Mode 0
Wire.endTransmission();// Termine la communication
}
void SendDataI2C (int mem_ADDR, int data)
{
Wire.beginTransmission(addr);// Démarre la communication avec l'adresse addr
Wire.send(mem_ADDR);    // Envoi l'adresse du registre concerné

Wire.send(data); // Ecrit la valeur voulu dans le registre

Wire.endTransmission(); // Termine la communication
}
void avance()
{
SendDataI2C (0x01, 160);	//Motor speed = 160
SendDataI2C (0x02, 160); //Motor speed = 160
SendDataI2C (0x03, 0); //Motor direction= tout droit
}

void stop()
{
SendDataI2C (0x01, 127); //Motor speed = 0
SendDataI2C (0x02, 127); //Motor speed = 0 ( < 127 : recule)
}

Contrôle de moteur pas a pas

Via l'arduino

Via la carte de commande de moteur de Soprolec


Tous les codes sources sont tirés du site arduino ou de mes propres codes sources

Publié le lundi, décembre 21 2009 par Antoine MORON

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.

Flux des commentaires de cette page