« Micro contrôleurs AVR/Travail pratique/Télécommande NRF24L01 pour Robot » : différence entre les versions

Contenu supprimé Contenu ajouté
Ligne 1 098 :
* Dpwm est aussi un calcul réalisé avec deltaPWM. Nous l'avons limité à 100 (sur 255) pour éviter de trop importantes vitesse du robot. Les deux valeurs +100 et -100 qui apparaissent dans le tableau sont liés au fait que nous voulions que pour aucun avancement ou recul le robot tourne avec sa vitesse maximale.
* Ces deux sorties vont permettre de gérer le calcul des deux PWM, un pour le moteur droit pwmD et un pour le moteur gauche pwmG.
 
1°) '''Écrire''' la partie de programme qui calcule cas, Dpwm, pwm, pwmD et pwmG.
2°) '''Écrire''' la partie de programme qui prend pwmD et pwmG et calcule les valeurs à envoyer sur le L298D.
 
{{Boîte déroulante|titre=Correction|contenu=
<syntaxhighlight lang="C">
// question 2°
void deplaceToi(int16_t pwmD, int16_t pwmG) {
if (pwmD > MAXPWM) pwmD = MAXPWM;
if (pwmD < -MAXPWM) pwmD = -MAXPWM;
if (pwmG > MAXPWM) pwmG = MAXPWM;
if (pwmG < -MAXPWM) pwmG = -MAXPWM;
if (pwmD > 0) {
digitalWrite(A2,HIGH);
digitalWrite(A3,LOW);
analogWrite(6,pwmD);
}
if (pwmD == 0) {
digitalWrite(A2,HIGH);
digitalWrite(A3,HIGH);
analogWrite(6,pwmD);
}
if (pwmD < 0) {
digitalWrite(A2,LOW);
digitalWrite(A3,HIGH);
analogWrite(6,-pwmD);
}
if (pwmG > 0) {
digitalWrite(A0,LOW);
digitalWrite(A1,HIGH);
analogWrite(5,pwmG);
}
if (pwmG == 0) {
digitalWrite(A0,HIGH);
digitalWrite(A1,HIGH);
analogWrite(5,pwmG);
}
if (pwmG < 0) {
digitalWrite(A0,HIGH);
digitalWrite(A1,LOW);
analogWrite(5,-pwmG);
}
}
 
int main() {
uint16_t joystick_x,joystick_y;
uint8_t rx_buffer[RX_PLOAD_WIDTH],status1,cas=0;
// setup
serialInit();
//ADC_Init();
SPIMasterInit();
SetRX_Mode();
// loop
while (1) {
status1=nRF24L01_RxPacket(rx_buffer);
if (status1 & (1<<RX_DR)) {
joystick_x = (rx_buffer[1]<<8)+rx_buffer[0];
joystick_y = (rx_buffer[3]<<8)+rx_buffer[2];
pwm = y-513;
// calcul de deltaPWM
deltaPWM = x-504;
// gestion de différentes possibilités
if (pwm > 30) cas |= 0x08; else cas &= 0x07;
if (pwm < -30) cas |= 0x04; else cas &= 0x0B;
if (deltaPWM > 30) cas |= 0x02; else cas &= 0x0D;
if (deltaPWM < -30) cas |= 0x01; else cas &= 0x0E;
switch (cas) {
case 0x08 :
case 0x04 : pwm = (pwm >> 2); deltaPWM = 0; break;
case 0x02 : pwm=0; deltaPWM=-100; break;
case 0x01 : pwm=0; deltaPWM=100;break;
case 0x0A :
case 0x09 : pwm = (pwm >> 2); deltaPWM = (deltaPWM >> 3); break;
case 0x06 :
case 0x05 : pwm = (pwm >> 2); deltaPWM = -(deltaPWM >> 3); break;
default : pwm = 0; deltaPWM=0;
} // switch
pwmG = pwm - deltaPWM;
pwmD = pwm + deltaPWM;
deplaceToi(pwmD,pwmG);
} // if (status1 & (1<<RX_DR))
} // while(1)
} // main
 
</syntaxhighlight>
}}
 
==Réalisation et programmation de la télécommande==