Étape 8: Conception de logiciels
Le rover est un obstacle en évitant le robot qui transformera graduellement afin d’éviter un obstacle à proximité et geler si elle est complètement incapable de bouger, ce qui devrait éviter d’endommager. Le logiciel du robot est une base machine d’État, qui en fait pour un contrôle simple et clair. Après avoir initialisé les directions GPIO, l’Edison sera continuellement le sens, traiter et réagir sans cesse. Dans ce cas, la seule sortie possible du robot est un changement de sens du moteur. Les capteurs IR sont sorties propre numériques qui sont soit haut ou bas, ce qui rend les convertissant en événements simples qui peuvent être conservés comme un état booléen. En raison de la nature de courte portée des capteurs, le logiciel du robot est simplement réactif aux événements extérieurs. Si équipé d’un télémètre à ultrasons ou d’IR, le robot serait en mesure de déterminer proactivement un chemin d’accès, ce qui en ferait pour un comportement plus intéressant. Lors du démarrage, je suggère de travailler avec un seul type de capteur et apprendre comment vous pouvez traiter les données. Une fois que vous êtes à l’aise de travailler avec un seul type d’entrée, lentement, ajouter plus de capteurs et testez-les le long du chemin. Cette approche est beaucoup plus méthodique, mais vous permettra d’économiser le maux de tête d’essayer d’intégrer de nombreux capteurs différents en même temps, qui peut être difficile à déboguer.
INTEL Intro à la robotique démo #define PIN_MOTOR1IN1 4 #define PIN_MOTOR1IN2 5 #define PIN_MOTOR1PWM 6 #define PIN_MOTOR2IN1 7 #define PIN_MOTOR2IN2 8 #define PIN_MOTOR2PWM 9 #define PIN_SENSOR_FRONT_L 0 / / avant gauche #define PIN_SENSOR_FRONT_R 1 #define PIN_SENSOR_REAR_L 2 / / arrière gauche #define PIN_SENSOR_REAR_R 3 #define STATE_TURNING_L 0 #define STATE_TURNING_R 1 #define STATE_FORWARD 2 #define STATE_REVERSE 3 #define STATE_IDLE 4 boolean sensorFrontLActive = false ; sensorFrontRActive booléen = false ; sensorRearLActive booléen = false ; sensorRearRActive booléen = false ; driveTime int = 4000 ; millisecondes unsigned long curTime = 0 ; unsigned long lastTime = 0 ; currentState int = STATE_FORWARD ; int lastState = STATE_IDLE ; motorSpeed octets = 64 ; Max est 255 setup() Sub {pinMode (PIN_MOTOR1IN1, sortie) pinMode (PIN_MOTOR1IN2, OUTPUT); pinMode (PIN_MOTOR2IN1, sortie); pinMode (PIN_MOTOR2IN2, OUTPUT); pinMode (entrée, PIN_SENSOR_FRONT_L); pinMode (entrée, PIN_SENSOR_FRONT_R); pinMode (entrée, PIN_SENSOR_REAR_L); pinMode (entrée, PIN_SENSOR_REAR_R);} / / fin d’installation ROUTINE void loop() {getSensorInput(); / / enregistrer l’état brut de l’état actuel les détecteurs IR = processSensorData(); / / décider quel État pour entrer / * curTime = millis(); / / petit test de routine pour parcourir les États si (curTime - lastTime > driveTime) {lastTime = curTime ; currentState ++; if (currentState > 4) {currentState = 0;}} * / if (currentState! = lastState) {/ / mise à jour uniquement le pilote, si quelque chose a changé lastState = currentState ; switch (currentState) {affaire STATE_FORWARD : moveForward() ; break ; case STATE_REVERSE : moveReverse() ; break ; case STATE_IDLE : idle() ; break ; case STATE_TURNING_L : moveLeft() ; break ; case STATE_TURNING_R : moveRight() ; break ; default: / / ralenti si processSensorData() fait une erreur idle() ; break;} / / fin SWITCHCASE} / / END IF currentState} / / fin de boucle principale void getSensorInput() {sensorFrontLActive =! digitalRead(PIN_SENSOR_FRONT_L); / / enregistrer la logique n’est pas état de la digitalRead(), parce que les capteurs sont actives BAS sensorFrontRActive =! digitalRead(PIN_SENSOR_FRONT_R) ; sensorRearLActive =! digitalRead(PIN_SENSOR_REAR_L) ; sensorRearRActive =! digitalRead(PIN_SENSOR_REAR_R) ; } / / FIN de fonction getSensorInput() int processSensorData() {//If il n’y a aucune entrée, juste aller de l’avant si (! sensorFrontLActive & &! sensorFrontRActive & &! sensorRearLActive & &! sensorRearRActive) {return STATE_FORWARD;} / / si quelque chose est devant le robot, inversez si (sensorFrontLActive & & sensorFrontRActive) {return STATE_REVERSE;} //If quelque chose est sur la droite tout en se déplaçant vers l’avant, tourner à gauche si (currentState == STATE_FORWARD & & sensorFrontRActive) {return STATE_TURNING_L;} //If quelque chose est sur la gauche tout en se déplaçant vers l’avant , tourner à droite si (currentState == STATE_FORWARD & & sensorFrontLActive) {return STATE_TURNING_R;} //If quelque chose est sur la droite tout en se déplaçant en sens inverse, tourner à droite si (currentState == STATE_REVERSE & & sensorFrontLActive) {return STATE_TURNING_R;} //If quelque chose n’est que sur la gauche tout en se déplaçant en sens inverse, tourner à gauche si (currentState == STATE_REVERSE & & sensorFrontLActive) {return STATE_TURNING_L;} //If tous les capteurs sont actives , idle en place si (sensorFrontLActive & & sensorFrontRActive & & sensorRearLActive & & sensorRearRActive) {return STATE_IDLE;} / * accélération (non implémentée) si aucun obstacle n’est détectés, par défaut à une vitesse lente si quelque chose est détecté ! Si quelque chose est devant le robot en marche arrière, accélérer ! Si quelque chose est détecté derrière le robot, accélérer! * / < Br >} / / END FUNCTION processSensorData() void moveForward() {/ / gauche = vers l’avant, droite = inverser digitalWrite (PIN_MOTOR1IN2, basse); analogWrite (PIN_MOTOR1PWM, motorSpeed); digitalWrite (PIN_MOTOR2IN1, HIGH); digitalWrite (PIN_MOTOR2IN2, basse), digitalWrite (PIN_MOTOR1IN1, HIGH); analogWrite (PIN_MOTOR2PWM, motorSpeed);} void moveReverse() {/ / gauche = marche arrière, droite = digitalWrite (PIN_MOTOR1IN1, LOW); digitalWrite (PIN_MOTOR1IN2, HIGH); analogWrite (PIN_MOTOR1PWM, motorSpeed); digitalWrite (PIN_MOTOR2IN1, basse), digitalWrite (PIN_MOTOR2IN2 en avant ÉLEVÉ) ; analogWrite (PIN_MOTOR2PWM, motorSpeed) ; } void moveLeft() {/ / gauche = marche arrière, droite = inverser digitalWrite (PIN_MOTOR1IN2, HIGH); analogWrite (PIN_MOTOR1PWM, motorSpeed); digitalWrite (PIN_MOTOR2IN1, HIGH); digitalWrite (PIN_MOTOR2IN2, basse), digitalWrite (PIN_MOTOR1IN1, basse); analogWrite (PIN_MOTOR2PWM, motorSpeed);} void moveRight() {/ / gauche = vers l’avant, droite = transmettre digitalWrite (PIN_MOTOR1IN2, basse); analogWrite (PIN_MOTOR1PWM, motorSpeed); digitalWrite (PIN_MOTOR2IN1, LOW); digitalWrite (PIN_MOTOR2IN2, élevé), digitalWrite (PIN_MOTOR1IN1, HIGH); analogWrite (PIN_MOTOR2PWM, motorSpeed);} void idle() {/ / moteur entrées basse digitalWrite (PIN_MOTOR1IN1 ÉLEVÉ) ; digitalWrite (PIN_MOTOR1IN2, basse) ; digitalWrite (PIN_MOTOR1PWM, basse) ; digitalWrite (PIN_MOTOR2IN1, élevé) ; digitalWrite (PIN_MOTOR2IN2, basse) ; digitalWrite (PIN_MOTOR2PWM, basse) ; }