Code Ultraschall Sensor mit Code Motor verbinden

Hallo zusammen,

ich muss für ein Schulprojekt ein Auto programmieren. Wir versuchen im Moment herauszufinden, wie man unseren Code für den Ultraschallsensor mit dem Code für die Motoren verbinden kann, denn unsere aktuelle Version funktioniert nicht wie erwartet. Findet jemand vielleicht den Fehler , den wir im angehängten Code machen, und kann uns weiterhelfen? Das wäre super nett.


#include <IRremote.h>
IRrecv IR(3) ;
int motor1Pin1 = 10; // Pin für Motor 1 Richtung 1 
int motor1Pin2 = 11; // Pin für Motor 1 Richtung 2
int motor2Pin1 = 6; // Pin für Motor 2 Richtung 1
int motor2Pin2 = 5; // Pin für Motor 2 Richtung 2
int motorSpeed1 = 150;
int motorSpeed2 = 150;
int trigger = 7;
int echo = 9;
long dauer = 0;
long entfernung = 0;
void setup() {
Serial.begin(9600) ;
pinMode (trigger, OUTPUT) ;
  pinMode (echo, INPUT) ;
  pinMode (A1, OUTPUT) ;
IR.enablelRIn();
pinMode (motor1Pin1, OUTPUT);
  pinMode (motor1Pin2, OUTPUT) ;
 pinMode(motor2Pin1, OUTPUT) ; 
  pinMode (motor2Pin2, OUTPUT) ;
}
void loop() {
if (IR. decode()){ 
switch (IR.decodedIRData.decodedRawData) {
case 0xE916FF00: // Power 0
// Beide Motoren stoppen
digitalWrite(motor1Pin1, LOW) ; 
digitalWrite(motor1Pin2, LOW) ; 
digitalWrite(motor2Pin1, LOW) ; 
digitalWrite(motor2Pin2, LOW) ;
break;
case 0xBF40FF00: // Vorwärts
// Beide Motoren vorwärts mit maximaler Geschwindigkeit 
  digitalWrite(motor1Pin1, HIGH) ; 
digitalWrite(motor1Pin2, LOW) ;
 digitalWrite(motor2Pin1, HIGH) ; 
digitalWrite(motor2Pin2, LOW) ;
break;
case 0xBB44FF00: // Rückwärts
// Beide Motoren rückwärts mit maximaler Geschwindigkeit 
  digitalWrite(motor1Pin1, LOW) ; 
digitalWrite(motor1Pin2, HIGH) ; 
digitalWrite(motor2Pin1, LOW) ; 
digitalWrite(motor2Pin2, HIGH) ;
break ;
case 0xEA15FF00: // Motor Schneller
analogWrite(motor1Pin1, motorSpeed1);
analogWrite(motor2Pin1, motorSpeed1) ;
break;
case 0xF807FF00: //Motor  Langsamer
motorspeed1= constrain(motorspeed1 - 10, 0, 255);
motorspeed2= constrain(motorspeed2 - 10, 0, 255);
analogWrite(motor1Pin1, motorSpeed1) ;
analogWrite(motor2Pin1, motorSpeed1) ;
break;
case 0xF30CFF00 : // Auto  Dreht sich in die eine richtung 
digitalWrite(motor1Pin1, LOW) ;
digitalWrite(motor1Pin2, HIGH) ;
digitalWrite(motor2Pin1, LOW) ; 
digitalWrite(motor2Pin2, LOW) ;
break;
case 0xA15EFF00 :// Auto dreht sich in die andere Richtung 
digitalWrite(motor1Pin1, LOW) ;
digitalWrite(motor1Pin2, LOW) ;
digitalWrite(motor2Pin1, HIGH) ; 
digitalWrite(motor2Pin2, LOW) ;
break;
}
IR.resume () ;
}
  digitalWrite(trigger, LOW) ;
delay(5) ;
digitalWrite(trigger, HIGH) ;
delay (10) ;
digitalWrite(trigger, LOW) ;
dauer = pulseIn(echo, HIGH) ;
entfernung = (dauer / 2) * 0.03432;
if (entfernung >= 500 entfernung <= 0) {
Serial.println( "Kein Messwert") ;
} else
Serial. print (entfernung) ;
Serial.println(" cm");
delay (1000) ;
}
if (entfernung==5)// Wenn der Ultraschallsensor eine Entfernung von 5 cm misst
tone (A1,440) ; // gibt der Lautsprecher einen Ton mit 440 Herz
if (entfernung==4)// wenn der Abstand geringer wird wird der Ton höher
tone (A1, 493) ;
if (entfernung==3)
tone (A1,523) ;
if (entfernung==2)
tone (A1,587) ;
if (entfernung==1)
tone (A1,659) ;
if (entfernung==0)// Wenn Entfernung 0cm Motoren stoppen
tone (A1, 698) ;
digitalWrite(motor1Pin1, LOW) ; 
digitalWrite(motor1Pin2, LOW) ; 
digitalWrite(motor2Pin1, LOW) ; 
digitalWrite(motor2Pin2, LOW) ;

 if (entfernung>5) 
noTone (10) ;
}

Kannst du denn auch noch beschreiben, was euer Sketch machen soll und was er nicht macht. Und bitte kommentiert euren Sketch noch so, das externe auch erkennen können, was da abgeht.
Und mit Strg. + T in der IDE wird der auch lesbar formatiert.

Falsch! unsigned long !

Da gehört ein Semikolon und kein Doppelpunkt hin.

Die Zeile mit der letzten Klammer } im setup() komplett löschen - da ist ein verstecktes Steuerzeichen drin. Und dann die Klammer neu schreiben.
Das habt ihr späte rnoch einmal:
grafik

Das muss Euch doch auffallen, wenn ihr in der IDE schreibt, dass das komisch aussieht.
Hinter dem letzten CASE aus dem switch / decode fehlt eine schliessende Klammer.
TIPP: STRG-T drücken!

Was soll denn passieren , vermutlich anhalten wenn der Sensor was sieht ?

Auf jeden Fall muss das delay(1000) raus sonst macht Ihr einen Blindflug

Der Sketch soll die Motoren in verschiedene Richtungen drehen lassen und langsamer und schneller drehen lassen, wenn der passende Kopf der Fernbedienung gedrückt wird. Außerdem soll der Ultraschall Sensor die Entfernung messen und beim seriellen Monitor anzeigen und wenn der Abstand zu einem Gegenstand kleiner wird, soll ein immer höher werdender Ton hörbar sein. Außerdem soll, wenn der Abstand 0 ist, das Auto stehen bleiben.
Im Moment ist es aber so, dass der Ultraschall zwar den Abstand misst und anzeigt, die Motoren aber nicht mehr richtig auf die Fernbedienung reagieren

... das der Code da oben nicht einmal compiliert.
Also erst berichtigen.
Wo und wie habe ich ja nun schon geschrieben.

das wird vermutlich an dem delay(1000) liegen

geht step by step vor und schaut Euch die logischen Verknüpfungen UND ODER NICHT an

#include <IRremote.h>
const byte IR_Pin = 3;
IRrecv IR(IR_Pin) ;
int motor1Pin1 = 10; // Pin für Motor 1 Richtung 1
int motor1Pin2 = 11; // Pin für Motor 1 Richtung 2
int motor2Pin1 =  6; // Pin für Motor 2 Richtung 1
int motor2Pin2 =  5; // Pin für Motor 2 Richtung 2

int motorSpeed1 = 150;
int motorSpeed2 = 150;

int trigger = 7;
int echo = 9;
unsigned long dauer = 0;
unsigned long entfernung = 0;

unsigned long myPrintTimer     = 0; // Timer-variables MUST be of type unsigned long
unsigned long myMeasuringTimer = 0; // Timer-variables MUST be of type unsigned long

void setup() {
  Serial.begin(9600) ;
  pinMode (trigger, OUTPUT) ;
  pinMode (echo, INPUT) ;
  pinMode (A1, OUTPUT) ;
  //IR.enablelRIn();
  IR.enableIRIn();

  pinMode (motor1Pin1, OUTPUT);
  pinMode (motor1Pin2, OUTPUT) ;
  pinMode(motor2Pin1, OUTPUT) ;
  pinMode (motor2Pin2, OUTPUT) ;
}

void loop() {
  IR_Empfangen_MotorenSteuern();

  // nur alle 100 Millisekunden Abstand messen
  // damit sich die Pulse nicht gegenseitig stören
  if ( TimePeriodIsOver(myMeasuringTimer, 100) ) {
    entfernungMessen();
  }

  tonAusgabe(entfernung);

  // nur alle 1005 millisekunden serielle Ausgabe
  if ( TimePeriodIsOver(myPrintTimer, 1005) ) {
    entfernungAusgeben();
  }
}


// easy to use helper-function for non-blocking timing
boolean TimePeriodIsOver (unsigned long & startOfPeriod, unsigned long TimePeriod) {
  unsigned long currentMillis  = millis();
  if ( currentMillis - startOfPeriod >= TimePeriod ) {
    // more time than TimePeriod has elapsed since last time if-condition was true
    startOfPeriod = currentMillis; // a new period starts right here so set new starttime
    return true;
  }
  else return false;            // actual TimePeriod is NOT yet over
}


void motorStop() {
  digitalWrite(motor1Pin1, LOW) ;
  digitalWrite(motor1Pin2, LOW) ;
  digitalWrite(motor2Pin1, LOW) ;
  digitalWrite(motor2Pin2, LOW) ;
}


void tonAusgabe(unsigned long entfernung) {

  switch (entfernung) {
    case 5: // Wenn der Ultraschallsensor eine Entfernung von 5 cm misst
      tone (A1, 440); // gibt der Lautsprecher einen Ton mit 440 Herz
      break;

    case 4: // wenn der Abstand geringer wird wird der Ton höher
      tone (A1, 493);
      break;

    case 3:
      tone (A1, 523);
      break;

    case 2:
      tone (A1, 587);
      break;

    case 1:
      tone (A1, 659);
      break;

    case 0: // Wenn Entfernung 0cm Motoren stoppen
      tone (A1, 698);
      break;
  }

  if (entfernung > 5)
    noTone (10) ;
}


void entfernungAusgeben() {
  if (entfernung >= 500 || entfernung <= 0) {
    Serial.println( "Kein Messwert") ;
  }
  else {
    Serial. print (entfernung) ;
    Serial.println(" cm");
    //delay (1000);
  }
}


void entfernungMessen() {
  digitalWrite(trigger, LOW) ;
  delay(5) ;
  digitalWrite(trigger, HIGH) ;
  delay (10) ;
  digitalWrite(trigger, LOW) ;
  dauer = pulseIn(echo, HIGH) ;
  entfernung = (dauer / 2) * 0.03432;
}


void IR_Empfangen_MotorenSteuern() {

  if (IR.decode()) {
    switch (IR.decodedIRData.decodedRawData) {
      case 0xE916FF00: // Power 0
        // Beide Motoren stoppen
        motorStop();
        break;

      case 0xBF40FF00: // Vorwärts
        // Beide Motoren vorwärts mit maximaler Geschwindigkeit
        digitalWrite(motor1Pin1, HIGH) ;
        digitalWrite(motor1Pin2, LOW) ;
        digitalWrite(motor2Pin1, HIGH) ;
        digitalWrite(motor2Pin2, LOW) ;
        break;

      case 0xBB44FF00: // Rückwärts
        // Beide Motoren rückwärts mit maximaler Geschwindigkeit
        digitalWrite(motor1Pin1, LOW) ;
        digitalWrite(motor1Pin2, HIGH) ;
        digitalWrite(motor2Pin1, LOW) ;
        digitalWrite(motor2Pin2, HIGH) ;
        break;

      case 0xEA15FF00: // Motor Schneller
        analogWrite(motor1Pin1, motorSpeed1);
        analogWrite(motor2Pin1, motorSpeed1) ;
        break;

      case 0xF807FF00: //Motor  Langsamer
        motorSpeed1 = constrain(motorSpeed1 - 10, 0, 255);
        motorSpeed2 = constrain(motorSpeed2 - 10, 0, 255);
        analogWrite(motor1Pin1, motorSpeed1) ;
        analogWrite(motor2Pin1, motorSpeed1) ;
        break;

      case 0xF30CFF00 : // Auto  Dreht sich in die eine richtung
        digitalWrite(motor1Pin1, LOW) ;
        digitalWrite(motor1Pin2, HIGH) ;
        digitalWrite(motor2Pin1, LOW) ;
        digitalWrite(motor2Pin2, LOW) ;
        break;

      case 0xA15EFF00 :// Auto dreht sich in die andere Richtung
        digitalWrite(motor1Pin1, LOW) ;
        digitalWrite(motor1Pin2, LOW) ;
        digitalWrite(motor2Pin1, HIGH) ;
        digitalWrite(motor2Pin2, LOW) ;
        break;

      // wenn unbekannter IR-code dann motorstop
      default:
        motorStop();
        break;
    }
    IR.resume();
  }
  else { // kein IR-code motor stop
    motorStop();
  }
}

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.