Saturday, June 5, 2010

Premiers essais chassis

Ca y est ! J'ai pu faire mes premiers essais de chassis ! J'ai utilisé des kits Tamiya (les références se trouvent dans la page Budget SPOP) qui permettent d'obtenir un résultat bien supérieur à une bête plaque de contreplaqué.
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.

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" !


Maintenant que tout est branché, il est temps de s'attaquer à la programmation de l'Arduino. Le pont en H du L298 fonctionne ainsi :
EnAIN 1IN 2Status
110Forward
101Reverse
100Brake
0XXStop
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).
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
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);
}