Étape 10 : Arduino Code pour Obstacle évitant Robot
Le code ci-dessous utilise les capteurs de cette instructable pour contrôler un obstacle autonome en évitant de robot. Les commutateurs de feuilles sont utilisés pour détecter des contact avec des objets vers la gauche et la droite. Si un interrupteur de contact est activé, le robot s’arrête, sauvegarde et puis se détourne l’objet avant de continuer. Le capteur de distance infrarouge est utilisé pour déterminer la distance aux objets devant le robot. Si un objet est plus proche qu’une tolérance établies, l’arrêt du robot et un servo tourne le capteur infrarouge à droite et à gauche pour les mesures. Le robot se transforme alors en direction du chemin plus clair avant de continuer. Un bouton sert à démarrer le robot. Bien que techniquement pas de capteurs, le laser, la sonnerie et la LED est utilisés pour donner une rétroaction visuelle et sonore des capteurs. Lorsque le robot est en marche, le voyant vert s’allume. Lorsque le robot s’arrête, le buzzer sonne et la LED rouge est allumée. Le laser est attaché au capteur IR donnant une indication visuelle de pointe où le capteur de distance infrarouge.
J’ai collé le code Arduino ci-dessous (avec vissé vers le haut mise en forme), mais pour une raison quelconque, je n’étais pas en mesure de télécharger un fichier contenant le code. C’est étrange car j’ai été capable de le faire pour mon précédent instructable. Mais cette fois, chaque fois que je tente de télécharger le fichier .ino j’obtiens le message « erreur 400 : impossible de télécharger scripts: »
/ * 4/29/14
Ce code utilise plusieurs capteurs pour contrôler le comportement
d’un obstacle autonome en évitant de robot. Comme le robot
se déplace vers l’avant, qu'un capteur de distance infrarouge mesure la distance
obstacles dans le chemin d’accès du robot. Si la distance mesurée
est inférieure à une tolérance établies, l’arrêt du robot et une casseroles servo
le capteur infrarouge à droite et à gauche pour déterminer le chemin d’accès les plus manifestes.
Le robot puis tourne dans le sens de la trajectoire plus claire
et puis le produit.
Feuilles droites et gauches commutateurs détecter un contact avec des objets
vers la droite ou la gauche du robot. Lorsque le contact est établi, la
robot de sauvegarde et puis se détourne de l’objet détecté
avant de continuer.
Un laser monté au-dessus du capteur IR indique la direction
dans lequel le robot « recherche ». Quand le robot s’arrête un
LED rouge s’allume et un buzzer piezo sonne. Lorsque le robot est
aller de l’avant, une LED verte s’allume. Quand le robot est alimenté
vers le haut, aucun mouvement ne se déroule jusqu'à ce qu’un bouton sur le robot est
pressé.
*/
#include < Servo.h >
Servo leftWheelServo ;
Servo rightWheelServo ;
Servo panServo ;
Déclarer les broches numériques
int stopLightPin = 2 ;
int leftContactPin = 3 ;
int rightContactPin = 4 ;
int servoPinLeft = 5 ;
int servoPinRight = 6 ;
int laserPin = 7 ;
int goLightPin = 8 ;
int servoPinPan = 9 ;
int buzzerPin = 12 ;
int buttonPin = 13 ;
Déclarer les broches analogiques
int IRpin = 4 ;
Définir des variables
int distanceReading ;
int wallDistance ;
int wallDistanceTolerance = 30 ;
int distanceReadingLeft ;
int distanceReadingRight ;
int wallDistanceLeft ;
int wallDistanceRight ;
int panDelay = 1000 ; Retard pour permettre le capteur IR de prendre une lecture
int turnTime = 250 ; Durée du tour issu des tâtonnements
int Buzztime† = 200 ;
buttonValue int = 0 ;
int oldButtonValue = 0 ;
int leftContactValue = 0 ;
int rightContactValue = 0 ;
void setup()
{
pinMode (buzzerPin, sortie) ;
pinMode (stopLightPin, sortie) ;
pinMode (goLightPin, sortie) ;
pinMode (buttonPin, entrée) ;
pinMode (laserPin, sortie) ;
digitalWrite (buzzerPin, basse) ;
digitalWrite (stopLightPin, basse) ;
digitalWrite (goLightPin, basse) ;
leftWheelServo.attach(servoPinLeft) ;
rightWheelServo.attach(servoPinRight) ;
panServo.attach(servoPinPan) ;
Avertisseur sonore pour indiquer que le robot a puissance
digitalWrite (stopLightPin, HIGH) ;
digitalWrite (buzzerPin, HIGH) ;
Delay(buzzTime) ;
digitalWrite (buzzerPin, basse) ;
Attendez jusqu'à ce que la touche avant de passer
tandis que (buttonValue == faible)
{
leftWheelServo.write(90) ;
rightWheelServo.write(90) ;
buttonValue = digitalRead(buttonPin) ;
}
Avertisseur sonore pour indiquer le bouton de démarrage a été pressé
digitalWrite (buzzerPin, HIGH) ;
Delay(buzzTime) ;
digitalWrite (buzzerPin, basse) ;
Supprimez l’alimentation serial pour tester si besoin être
Serial.Begin(9600) ;
}
void loop()
{
Allumez laser
digitalWrite (laserPin, HIGH) ;
Capteur de distance point tout droit
panServo.write(90) ;
Aller de l’avant
leftWheelServo.write(0) ;
rightWheelServo.write(120) ;
digitalWrite (goLightPin, HIGH) ;
digitalWrite (stopLightPin, basse) ;
Test pour les abordages de mur
leftContactValue = digitalRead(leftContactPin) ;
Si (leftContactValue == HIGH)
{
Arrêter
leftWheelServo.write(90) ;
rightWheelServo.write(90) ;
digitalWrite (goLightPin, basse) ;
digitalWrite (stopLightPin, HIGH) ;
digitalWrite (buzzerPin, HIGH) ;
Delay(buzzTime) ;
digitalWrite (buzzerPin, basse) ;
Sauvegarde
leftWheelServo.write(120) ;
rightWheelServo.write(0) ;
digitalWrite (goLightPin, HIGH) ;
digitalWrite (stopLightPin, basse) ;
Delay(500) ;
Tourner à droite
leftWheelServo.write(180) ;
rightWheelServo.write(180) ;
Delay(turnTime) ;
leftWheelServo.write(90) ;
rightWheelServo.write(90) ;
Réinitialiser la variable contact gauche
leftContactValue = 0 ;
}
rightContactValue = digitalRead(rightContactPin) ;
Si (rightContactValue == HIGH)
{
Arrêter
leftWheelServo.write(90) ;
rightWheelServo.write(90) ;
digitalWrite (goLightPin, basse) ;
digitalWrite (stopLightPin, HIGH) ;
digitalWrite (buzzerPin, HIGH) ;
Delay(buzzTime) ;
digitalWrite (buzzerPin, basse) ;
Sauvegarde
leftWheelServo.write(120) ;
rightWheelServo.write(0) ;
digitalWrite (goLightPin, HIGH) ;
digitalWrite (stopLightPin, basse) ;
Delay(500) ;
Tourner à gauche
leftWheelServo.write(0) ;
rightWheelServo.write(0) ;
Delay(turnTime) ;
leftWheelServo.write(90) ;
rightWheelServo.write(90) ;
Reset capteur droit variable
rightContactValue = 0 ;
}
Prendre la lecture du capteur de distance
distanceReading = analogRead(IRpin) ;
wallDistance = 40-distanceReading/10 ;
La formule de distance du mur ci-dessus est déterminée par l’essai
et erreur et conversion linéaire
Un test pour voir si un mur est proche
Si (wallDistance < wallDistanceTolerance)
{
Arrêter
leftWheelServo.write(90) ;
rightWheelServo.write(90) ;
digitalWrite (goLightPin, basse) ;
digitalWrite (stopLightPin, HIGH) ;
digitalWrite (buzzerPin, HIGH) ;
Delay(buzzTime) ;
digitalWrite (buzzerPin, basse) ;
Pan de servo de distance à gauche et à droite pour voir quelle direction
offre une voie plus claire
panServo.write(170) ;
Delay(panDelay) ;
distanceReadingLeft = analogRead(IRpin) ;
Delay(panDelay) ;
wallDistanceLeft = 40-distanceReadingLeft/10 ;
panServo.write(20) ;
Delay(panDelay) ;
distanceReadingRight = analogRead(IRpin) ;
Delay(panDelay) ;
wallDistanceRight = 40-distanceReadingRight/10 ;
Décommentez la série relevés imprimés pour des fins de débogage
Serial.Print(wallDistance) ;
Serial.println ("cm") ;
Serial.Print(wallDistanceLeft) ;
Serial.println ("cm") ;
Serial.Print(wallDistanceRight) ;
Serial.println ("cm") ;
Serial.println("") ;
Serial.println(distanceReading) ;
Serial.println(distanceReadingLeft) ;
Serial.println(distanceReadingRight) ;
Serial.println("") ;
Test pour voir quelle direction vous propose une voie claire
et tourner le robot dans cette direction
Si (wallDistanceLeft > wallDistanceRight)
{
Tourner à gauche
leftWheelServo.write(180) ;
rightWheelServo.write(180) ;
Delay(turnTime) ;
leftWheelServo.write(90) ;
rightWheelServo.write(90) ;
}
d’autre
{
Tourner à droite
leftWheelServo.write(0) ;
rightWheelServo.write(0) ;
Delay(turnTime) ;
leftWheelServo.write(90) ;
rightWheelServo.write(90) ;
}
}
Delay(200) ;
}