Pour l'interface igepv2-hardware, j'ai décidé d'utiliser un Arduino Duemilanove, qui permet de prototyper rapidement.
La communication se fera via le port USB de l'Igepv2. En effet, les concepteurs de l'Arduino ont eu l'excellente idée d'intégrer à la carte un chipset qui est reconnu comme un port serie.
Le montage des différents modules Tamiya a été très simple et ne m'a pas pris plus de 1h30. Un point positif est que les chenilles sont trouées à intervalle régulier. Je pense m'en servir pour faire de l'odométrie.
Maintenant que tout est branché, il est temps de s'attaquer à la programmation de l'Arduino. Le pont en H du L298 fonctionne ainsi :
IN1 et IN2 permettent de régler le sens de rotation du moteur (cad. la tension est positive ou négative) tandis que ENA permet d'activer d'allumer ou non le moteur (cad. la tension est respectivement non nulle et nulle).
J'ai trouvé sur le site dealextreme.com de la gaine termorétractable. C'est un must-have lorsque l'on soude des fils sur des moteurs ! Le résultat est tout bonnement "professionnel" !
EnA | IN 1 | IN 2 | Status | |
1 | 1 | 0 | Forward | |
1 | 0 | 1 | Reverse | |
1 | 0 | 0 | Brake | |
0 | X | X | Stop |
Pour faire varier la vitesse, on peut faire une PWM sur ENA (qui correspond au principe du hacheur).
Enfin, voici le code Arduino d'une simplicité presque énervante lorsque l'on a fait du micro-controlleur PIC ou 68000
Enfin, voici le code Arduino d'une simplicité presque énervante lorsque l'on a fait du micro-controlleur PIC ou 68000
int EN = 11; int IN1 = 10; int IN2 = 9; int inByte = 0; boolean reverse = false; int speedValue = 0; int MAX_SPEED = 170; void setup() { Serial.begin(9600); pinMode(EN, OUTPUT); pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); establishContact(); } void establishContact() { while (Serial.available() <= 0) { Serial.print('A', BYTE); // send a capital A delay(300); } } void loop() { if (Serial.available() > 0) { // get incoming byte: inByte = Serial.read(); if(inByte == '+'){ speedValue = (speedValue +1) % MAX_SPEED; } else { speedValue = (speedValue - 1) ; if(speedValue < 0) { speedValue = MAX_SPEED; } } if(inByte == 'R') { reverse = !reverse; } forward(speedValue, reverse); Serial.print("new speed : "); Serial.print(speedValue, DEC); Serial.println(reverse ? "forward" : "backward"); } } void forward(int speedValue, boolean reverse){ analogWrite(EN, speedValue); digitalWrite(IN1, reverse); digitalWrite(IN2, !reverse); }
No comments:
Post a Comment