Schritt 8: Software-Design
Der Rover ist ein Hindernis, Vermeidung von Roboter, der allmählich zu einem nahe gelegenen Hindernis vermeiden und Einfrieren, wenn es völlig unfähig sich zu bewegen, ist die Schäden verhindern sollen. Die Software für den Roboter ist eine grundlegende Zustand-Maschine, die für klare und einfache Kontrolle macht. Nach der Initialisierung der GPIO-Richtungen, die Edison wird ständig spüren, verarbeiten, und endlos zu reagieren. In diesem Fall ist der Roboter nur Ausgabe eine Änderung in Motordrehrichtung. Die IR-Sensoren haben sauber Digitalausgänge sind entweder hoch oder niedrig, wodurch die Umwandlung in einfache Ereignisse, die leicht als boolescher Zustand gespeichert werden können. Aufgrund der geringen Reichweite der Sensoren ist der Roboter-Software lediglich reaktiv auf externe Ereignisse. Wenn mit einem IR oder Ultraschall-Entfernungsmesser ausgestattet, wäre der Roboter in der Lage, proaktiv einen Pfad zu bestimmen, die für weitere interessante Verhalten machen würde. Wenn es anfängt, schlage ich mit einer einzigen Art von Sensor arbeiten und lernen, wie gut Sie die Daten bearbeiten können. Sobald Sie bequemes Arbeiten mit einer einzigen Art von Eingabe sind, langsam fügen Sie mehr Sensoren und auf dem Weg zu testen. Dieser Ansatz ist viel mehr methodische, sondern speichern Sie die Kopfschmerzen zu versuchen, viele verschiedene Sensoren gleichzeitig zu integrieren, die schwierig zu debuggen sein kann.
INTEL Intro zu Robotik Demo #define PIN_MOTOR1IN1 4 #define PIN_MOTOR1IN2 5 PIN_MOTOR1PWM 6 PIN_MOTOR2IN1 7 PIN_MOTOR2IN2 8 PIN_MOTOR2PWM 9 #define PIN_SENSOR_FRONT_L 0 #define #define #define #define / / vorne links #define PIN_SENSOR_FRONT_R 1 #define PIN_SENSOR_REAR_L 2 / / hinten links #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 boolescher Wert SensorFrontLActive = False; Boolesche SensorFrontRActive = False; Boolesche SensorRearLActive = False; Boolesche SensorRearRActive = False; Int "DriveTime" = 4000; Millisekunden unsigned long CurTime = 0; unsigned long LastTime = 0; Int CurrentState = STATE_FORWARD; Int LastState = STATE_IDLE; MotorSpeed Byte = 64; Max ist 255 void setup() {PinMode (PIN_MOTOR1IN1, Ausgabe) PinMode (PIN_MOTOR1IN2, Ausgabe) PinMode (PIN_MOTOR2IN1, Ausgang); PinMode (PIN_MOTOR2IN2, OUTPUT); PinMode (PIN_SENSOR_FRONT_L, Eingabe); PinMode (PIN_SENSOR_FRONT_R, Eingabe); PinMode (PIN_SENSOR_REAR_L, Eingabe); PinMode (PIN_SENSOR_REAR_R, Eingabe);} / / Ende-SETUP-ROUTINE void loop() {getSensorInput(); / / Rekord-den rohe Status des IR-Detektoren CurrentState = processSensorData(); / / entscheiden, welchem Staat man eingeben / * CurTime = millis(); / / kleine Routine durchlaufen den Staaten wenn testen (CurTime - LastTime > "DriveTime") {LastTime = CurTime; CurrentState ++; wenn (CurrentState > 4) {CurrentState = 0;}} * / if (CurrentState! = LastState) {/ / nur den Treiber zu aktualisieren, wenn sich etwas geändert hat, LastState = CurrentState; wechseln (CurrentState) {Fall 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: / / idle bei processSensorData() ein Fehler idle(); Break;} / / Ende SWITCHCASE} / / END IF CurrentState} / / MAIN ENDSCHLAUFE void getSensorInput() {SensorFrontLActive =! digitalRead(PIN_SENSOR_FRONT_L); / / speichern das logische NOT Stand der der digitalRead(), da die Sensoren aktiv sind NIEDRIGE SensorFrontRActive =! digitalRead(PIN_SENSOR_FRONT_R); SensorRearLActive =! digitalRead(PIN_SENSOR_REAR_L); SensorRearRActive =! digitalRead(PIN_SENSOR_REAR_R); } / / END Funktion getSensorInput() Int processSensorData() {//If es ist keine Eingabe, nur vorankommen, wenn (! SensorFrontLActive & &! SensorFrontRActive & &! SensorRearLActive & &! SensorRearRActive) {return STATE_FORWARD;} / / wenn etwas vor dem Roboter ist, rückwärts wenn (SensorFrontLActive & & SensorFrontRActive) {return STATE_REVERSE;} //If etwas ist auf der rechten Seite während der Bewegung nach vorne, links abbiegen, wenn (CurrentState == STATE_FORWARD & & SensorFrontRActive) {return STATE_TURNING_L;} //If etwas auf der linken Seite ist während der Bewegung nach vorne , Zug rechts wenn (CurrentState == STATE_FORWARD & & SensorFrontLActive) {return STATE_TURNING_R;} //If etwas ist auf der rechten Seite während der Bewegung in umgekehrter Richtung, biegen Sie rechts ab, wenn (CurrentState == STATE_REVERSE & & SensorFrontLActive) {return STATE_TURNING_R;} //If etwas ist nur auf der linken Seite während der Bewegung in umgekehrter Richtung, links abbiegen, wenn (CurrentState == STATE_REVERSE & & SensorFrontLActive) {return STATE_TURNING_L;} //If alle Sensoren sind aktiv , im Ort im Leerlauf, wenn (SensorFrontLActive & & SensorFrontRActive & & SensorRearLActive & & SensorRearRActive) {return STATE_IDLE;} / * (nicht implementiert) beschleunigen wenn keine Hindernisse erkannt werden, standardmäßig auf eine langsame Geschwindigkeit wenn etwas erkannt wird! Wenn etwas vor dem Roboter beim Rückwärtsfahren, beschleunigen! Wenn etwas hinter den Roboter erkannt wird, beschleunigen! * / < Br >} / / END FUNCTION processSensorData() void moveForward() {/ / links = vorwärts, rechts = umkehren DigitalWrite (hohe PIN_MOTOR1IN1), DigitalWrite (PIN_MOTOR1IN2, LOW), AnalogWrite (PIN_MOTOR1PWM, MotorSpeed); DigitalWrite (hohe PIN_MOTOR2IN1); DigitalWrite (PIN_MOTOR2IN2, LOW), AnalogWrite (PIN_MOTOR2PWM, MotorSpeed);} void moveReverse() {/ / links = Rückseite, rechts = vorwärts DigitalWrite (PIN_MOTOR1IN1, LOW); DigitalWrite (PIN_MOTOR2IN2 DigitalWrite (hohe PIN_MOTOR1IN2); AnalogWrite (PIN_MOTOR1PWM, MotorSpeed); DigitalWrite (PIN_MOTOR2IN1, LOW) HOCH); AnalogWrite (PIN_MOTOR2PWM, MotorSpeed); } void moveLeft() {/ / links = Rückseite, rechts = umkehren DigitalWrite (PIN_MOTOR1IN1, LOW), DigitalWrite (hohe PIN_MOTOR1IN2), AnalogWrite (PIN_MOTOR1PWM, MotorSpeed); DigitalWrite (hohe PIN_MOTOR2IN1); DigitalWrite (PIN_MOTOR2IN2, LOW), AnalogWrite (PIN_MOTOR2PWM, MotorSpeed);} void moveRight() {/ / links = vorwärts, rechts = vorwärts DigitalWrite (hohe PIN_MOTOR1IN1), DigitalWrite (PIN_MOTOR1IN2, LOW), AnalogWrite (PIN_MOTOR1PWM, MotorSpeed); DigitalWrite (PIN_MOTOR2IN1, LOW); DigitalWrite (hohe PIN_MOTOR2IN2), AnalogWrite (PIN_MOTOR2PWM, MotorSpeed);} void idle() {/ / Motor Eingängen niedrig DigitalWrite (PIN_MOTOR1IN1 HOCH); DigitalWrite (PIN_MOTOR1IN2, LOW); DigitalWrite (PIN_MOTOR1PWM, LOW); DigitalWrite (PIN_MOTOR2IN1, hohe); DigitalWrite (PIN_MOTOR2IN2, LOW); DigitalWrite (PIN_MOTOR2PWM, LOW); }