Voir la source de Carte Romeo
De Wiki Arobose
Aller à :
Navigation
,
rechercher
La carte ROMEO de DFROBOT est une carte tout-en-un conçue pour faire ses premiers pas vers la robotique. Cette carte très simple d'utilisation permet de commander 2 moteurs, d'interfacer des capteurs et de piloter le robot à distance via un module X-bee. Elle est basée sur un microcontroleur ATMEGA32u4 (V2.0 R3). Pour tester la carte ROMEO, nous avons utilisé la plateforme de développement Turtle 2WD de DFROBOT. Cette plateforme est équipée de 2 roues montées en direct sur 2 motoréducteurs. == Commande des moteurs == Le moteur à courant continu est l'élément principal qui permet au robot de se déplacer. Sa vitesse est proportionnelle à la tension d'alimentation. Plus la tension est élevée plus le moteur va tourner rapidement. Il faut donc créer une tension continue variable pour faire varier la vitesse du moteur. === Signaux PWM === Les signaux PWM permettent de fournir une tension continue variable à partir de signaux numériques (0 et 5V). Le microcontroleur va générer un signal en forme de créneaux. En faisant varier le rapport cyclique, la tension moyenne va varier et le moteur va tourner plus ou moins vite. === Electronique === La carte ROMEO est équipée d'un module de commande pour moteur à courant continu (L298). Ce pont H va fournir la puissance nécessaire au moteur pour tourner. Le microcontroleur va fournir un signal PWM et un signal de direction pour chaque moteur. === Exemple de code === ==== Langage Arduino ==== Le L298 utilise la pin 4 (M1 : direction) et 5 (E1 : PWM) pour le moteur 1 et la pin 6 (E2 : PWM) et 7 (M2 : direction) pour le moteur 2. Un exemple avec le langage ARDUINO est expliqué [http://www.dfrobot.com/wiki/index.php/DFRduino_Romeo-All_in_one_Controller_V1.1%28SKU:DFR0004%29 ici] ==== Langage C ==== Pour générer un signal PWM, le microcontroleur a besoin d'un timer interne. Il utilise le timer 3A pour E1 et le timer 4D pour E2. Dans un premier temps, il faut initialiser les timers en mode PWM. Nous configurons le mode PWM avec des valeurs fréquemment utilisées pour la commande de moteurs. <syntaxhighlight lang="c"> /* timer3 is used for phase-correct 8-bits PWM mode and with clock prescaled to system clock divided by 64 */ void pwm_3_setup(void) { /* set timer3 prescale factor to 64 */ TCCR3B = (1 << CS31) | (1 << CS30); /* put timer3 in phase correct PWM mode */ TCCR3A = (1 << WGM30); } /* timer4 is used for phase and frequency correct 10-bits PWM mode * and with clock prescaled to system clock divided by 64 */ void pwm_4_setup(void) { TC4H = 0; /* set timer4 prescale factor to 64 */ TCCR4B = (1 << CS42) | (1 << CS41) | (1 << CS40); /* put timer 4 in phase and frequency correct PWM mode */ TCCR4D =(1 << WGM40); /* not used */ TCCR4E = 0; /* Set top to 0xFF */ OCR4C = 0xFF; } </syntaxhighlight> Il faut activer les pins utilisées par le L298 (5:OC3A et 6:OC4D). <syntaxhighlight lang="c"> /* enable OC4D (pin D6) as pwm output */ void pwm_3A_enable(void) { /* enable PC6(OC3A) pin as output pin */ DDRC |= (1 << PORTC6); /* enable OC3A pin as PWM pin */ TCCR3A |= (1 << COM3A1); } /* enable OC4D (pin D6) as pwm output */ void pwm_4D_enable(void) { /* enable PD7 pin as output pin */ DDRD |= (1 << PORTD7); /* enable OC4D pin as PWM pin */TCCR4C |= (1 << PWM4D); TCCR4C |= (1 << COM4D1); } </syntaxhighlight> Pour finir, il faut indiquer la valeur du PWM : cette valeur indique le temps haut du signal compris entre 0 et 255. Par exemple, pour avoir un signal carré (temps haut = temps bas), il faut avoir une valeur de 127. Ces valeurs sont écrites dans les registres OCRnx. <syntaxhighlight lang="c"> /* write value a in PWM 3A */ void pwm_3A_write(char a) { OCR3A = a; } /* write value a in PWM 4D */ void pwm_4D_write(char a) { OCR4D = a; } </syntaxhighlight> Nous avons ensuite créer des fonctions qui permettent au robot d'avancer, reculer et tourner en précisant la vitesse (de 0 à 255). <syntaxhighlight lang="c"> /* stop */ void stop(void) { pwm_4D_write(0); pwm_3A_write(0); } /* advance * speed from 0 to 255 */ void advance(char speed) { PORTD |= (1 << PORT4); /* E1 (PD4) = 1 */ PORTE |= (1 << PORT6); /* E2 (PE6) = 1 */ pwm_4D_write(speed); pwm_3A_write(speed); } /* back off * speed from 0 to 255 */ void back_off(char speed) { PORTD &= ~(1 << PORT4); /* E1 (PD4) = 0 */ PORTE &= ~(1 << PORT6); /* E2 (PE6) = 0 */ pwm_4D_write(speed); pwm_3A_write(speed); } /* turn left * speed from 0 to 255 */ void turn_left(char speed) { PORTD &= ~(1 << PORT4); /* E1 (PD4) = 0 */ PORTE |= (1 << PORT6); /* E2 (PE6) = 1 */ pwm_4D_write(speed); pwm_3A_write(speed); } /* turn right * speed from 0 to 255 */ void turn_right(char speed) { PORTD |= (1 << PORT4); /* E1 (PD4) = 1 */ PORTE &= ~(1 << PORT6); /* E2 (PE6) = 0 */ pwm_4D_write(speed); pwm_3A_write(speed); } </syntaxhighlight> Pour finir, les fonctions main() et setup() <syntaxhighlight lang="c"> void pin_setup(void) { /* Motor controller */ DDRD = (1 << PORTD4); /* PD4 as output pin */ DDRE = (1 << PORTE6); /* PE6 as output pin */ } void setup(void) { pin_setup(); pwm_3_setup(); pwm_4_setup(); pwm_3A_enable(); pwm_4D_enable(); } int main(void) { setup(); while (1) { turn_left(100); //advance(200); // stop(); } return 0; } </syntaxhighlight> [[Category:Produits]]
Revenir à la page
Carte Romeo
.
Affichages
Page
Discussion
Voir le texte source
Historique
Outils personnels
Connexion
Navigation
Accueil
Communauté
Actualités
Modifications récentes
Page au hasard
Aide
Rechercher
Boîte à outils
Pages liées
Suivi des pages liées
Pages spéciales
Catégories
[
×
]
Produits
[
×
]
Tutoriels