Étape 7: Contrôle de direction (contrôle proportionnel - P)
Parfait ! À ce stade, notre Robot est assemblé et opérationnel. Vous devez effectuer certains tests de base avec les moteurs, lire la sortie des capteurs et les tester sur une ligne. Ce qui manque est le véritable « cerveau », les premiers pas d’une « intelligence artificielle ». Nous aurons cela, mettre en œuvre une logique de contrôle qui garantie que le Robot sera gardé en suivant la ligne.
Simple commande proportionnelle:
Supposons que le Robot est en cours d’exécution sur une ligne et la sortie des capteurs est: « 0 0 1 0 0 ". L’erreur correspondante est « 0 ». dans ce cas, les deux moteurs fonctionnent vers l’avant sur une vitesse constante :
Par exemple, avec iniMotorSpeed = 250; signifie que le Servo de gauche recevra des impulsions de 1, 250us et 1 Servo de droite, à 750us et le Robot seront déplace vers l’avant à mi-vitesse. N’oubliez pas que la vitesse d’avancement Servo droit variera avec la durée d’impulsion de 1, 500us (arrêté) à 2, 000us (pleine vitesse) et le Servo de gauche de 1, 500us (arrêté) à 1, 000us (pleine vitesse).
rightServo.writeMicroseconds(1500 + iniMotorPower) ;
leftServo.writeMicroseconds (1500 - iniMotorPower) ;
Supposons maintenant que le Robot piloté par vers la gauche (c’est comme la « ligne va à droite ») et aussi couvert le capteur 3. La sortie du tableau sera: « 0 0 1 1 0" et l’erreur = 1. Dans ce cas ce dont vous avez besoin, c’est tourner le Robot à droite. Pour ce faire, vous devez diminuer la vitesse du Servo de droite, ce qui signifie réduire la durée de l’impulsion". Aussi, la vitesse du Servo de gauche doit augmenter, quels moyens diminuer la longueur de l’impulsion de la servocommande gauche. Pour ce faire, nous devons changer la fonction de contrôle du moteur :
rightServo.writeMicroseconds (1500 + iniMotorPower - erreur); == > Erreur positive : réduire la vélocité
leftServo.writeMicroseconds (1500 - iniMotorPower - erreur) ; == > Erreur positive : augmenter la vitesse
La logique ci-dessus est correcte, mais il est aise de comprendre que l’addition ou la soustraction de « 1 » microseconde à longueur de l’impulsion ne générera pas la correction requise sur un temps réaliste. Il est intuitif que le nombre à ajoute ou soustraite devrait être plus grand. par exemple, 50, 100, etc. Pour obtenir cela, le « erreur » doit être multipliée par une constante « K ». Une fois que l’influence de cette constante sera proportionnelle à l’erreur, nous il nommera « proportionnel Constant : Kp).
La fonction motrice sera :
int Kp = 50 ;
rightServo.writeMicroseconds (1500 + iniMotorPower - Kp * erreur) ;
leftServo.writeMicroseconds (1500 - iniMotorPower - Kp * erreur) ;
Nous pouvons reprendre ce qui se passera avec les moteurs comme illustré ci-dessous :
- Capteurs: 0 0 1 0 0 == > error = 0 == > durée d’impulsion Servo droit = 1, 750us == > durée d’impulsion Servo gauche = 1, 250us (les deux moteurs à la même vitesse)
- Capteurs: 0 0 1 1 0 == > erreur = 1 == > durée d’impulsion Servo droit = 1, 700us (plus lent) == > durée d’impulsion Servo gauche = 1, 200us (plus rapide)
Si la situation est inversée et le Robot piloté par vers la droite, l’erreur serait « négative » et devrait changer la vitesse des servos :
- Capteurs: 0 0 1 0 0 == > error = 0 == > durée d’impulsion Servo droit = 1, 750us == > durée d’impulsion Servo gauche = 1, 250us (les deux moteurs à la même vitesse)
- Capteurs: 0 1 1 0 0 == > erreur = -1 == > durée d’impulsion Servo droit = 1, 800us (plus rapide) == > durée d’impulsion Servo gauche = 1, 300us (plus lent)
À ce stade est évident qu’aussi bien le Robot piloté par d’un côté, plus grand sera l’erreur et plus vite elle doit retourner au centre. La vitesse avec le Robot réagissent à l’erreur sera proportionnelle à celle-ci.