Ardumoto und Ultra Sonic Sensor arbeiten nicht zusammen [Solved]

Hallo Allerseits,

ich nutze das Mega2560, Ardumoto H Brige, 2 DC Motoren und den SDM-IO-UART (Ultra Sonic) Sensor.

Folgender Test Code:

int dist = 0;                 // variable to store the values from sensor(initially zero)

int leftdist;
int rightdist;

int pwm_a = 3; //PWM control for motor outputs 1 and 2 is on digital pin 3
int pwm_b = 11; //PWM control for motor outputs 3 and 4 is on digital pin 11
int dir_a = 12; //dir control for motor outputs 1 and 2 is on digital pin 12
int dir_b = 13; //dir control for motor outputs 3 and 4 is on digital pin 13

#define TIMEOUT_OVERFLOW 1000

int TrigPin = 6;
int EchoPin = 7;
unsigned long ultrasoundDuration;
unsigned long  distance_sensor;


void setup()
{
  Serial.begin(9600);               // starts the serial monitor

  pinMode(pwm_a, OUTPUT); //Set control pins to be outputs
  pinMode(pwm_b, OUTPUT);
  pinMode(dir_a, OUTPUT);
  pinMode(dir_b, OUTPUT);
}

void loop()
{
  
  getDistance_sensor();
  dist=distance_sensor;

  Serial.print("Distance is = ");
  Serial.print( dist , DEC);
  Serial.print(" cm");
  Serial.println();
  delay(100);
  
  
  
 if(dist > 20) 
 forward();
  
 
  if(dist <= 20) 
  stop_engine();
  
}


void forward() { 
  digitalWrite(dir_a,LOW);
  digitalWrite(dir_b,HIGH);

  analogWrite(pwm_a, 100); //set both motors to run at (100/255 = 39)% duty cycle (slow) 
  analogWrite(pwm_b, 100);

  return;
}


void stop_engine() {
  digitalWrite(dir_b,LOW);
  digitalWrite(dir_a,LOW);

 analogWrite(pwm_a, 0); 
  analogWrite(pwm_b, 0);
  
  delay(200); //wait after stopping
  
  return;
}


int getDistance_sensor(){

  unsigned char pin = 0;
  unsigned int time_flag = 0;

  pinMode(TrigPin, OUTPUT); //pin is output
  pinMode(EchoPin, INPUT); // pin is now input
  digitalWrite(TrigPin, HIGH);
  delayMicroseconds(2);
  digitalWrite(TrigPin, LOW);
  delayMicroseconds(10);
  digitalWrite(TrigPin, HIGH);

  // wait for a LOW pulse
  //ultrasoundDuration = pulseIn(EchoPin, HIGH);// will not work for HIGH pulse

  TCCR1A = 0x00;
  TCNT1 = 0x0000;
  TCCR1B = 0x01;
  pin = digitalRead(EchoPin);
  while(pin)
  {
    pin = digitalRead(EchoPin);
    time_flag++;
    if(time_flag > TIMEOUT_OVERFLOW)
      break;
  }
  TCCR1B = 0x00;
  ultrasoundDuration = TCNT1;
  ultrasoundDuration = ultrasoundDuration / 16;
  // get results

  distance_sensor= ultrasoundDuration*0.017;

  return distance_sensor;
}

Ich versuche hier schlicht und einfach den Sensor parallel zu den DC Motoren zu betreiben. Leider funktioniert nur der linke Motor wenn der Sensor Code aktiv ist. Sobald ich den Sensor Code:

 getDistance_sensor();
  dist=distance_sensor;

  Serial.print("Distance is = ");
  Serial.print( dist , DEC);
  Serial.print(" cm");
  Serial.println();
  delay(100);

auskommentiere funktionieren beide Motoren und der Roboter fährt wie gewollt vorwärts.
Ich hab auch schon gelesen das es ein Energie Problem sein könnte in älteren Posts, das habe ich aber durch ausprobieren einer zweiten Energiequelle allein für den Ardumoto ausschließen können. Zudem teste ich mein Arduino mit einem Netzteil um Batterien zu sparen.

Ich hoffe Ihr könnt mir weiter helfen. Wäre super, ich komme einfach nicht weiter....

Drive_test.ino (2.82 KB)

Mach das delay() raus. Das hält dein Programm immer für 100ms an. Das ist ok für manche Tests und einfache Anwendungen, aber nicht wenn man mehrere Sachen gleichzeitig machen will.

Siehe hier wie man Verzögerungen nicht-blockierend programmiert:

Danke für deine Antwort. Allerdings ist das leider nicht die Lösung meines Problems... Mein rechter DC Motor funktioniert immer noch nicht.

keiner eine Idee? oder ne Lösung?

Das Problem war Timer 1 der die Pins 11 und 12 steuert. Die Timeradressen auf Timer2 zu ändern hat leider nicht funktioniert.
Ich hab allerdings einen Code gefunden der ohne die Timer funktion auskommt. Nun arbeiten Motoren und der Sensor zusammen.

Mein Code dafür ist im Anhang mit dabei. Viel Spass.

Drive_test.ino (2.76 KB)

ARG! Sorry, ich hatte irgendwie völlig übersehen, das du auf dem Mega bist :frowning:
Ich hatte genau das im Verdacht, aber die Pins mit dem Uno verglichen. :frowning:

Timer2 geht wahrscheinlich nicht, da der nur 8 Bit hat und damit eher überläuft. Man könnte da zwar den Overflow Interrupt auswerten, aber du hast auf dem Mega noch Timer3 bis Timer5, die genauso wie Timer1 funktionieren und auch 16 Bit haben. Und Timer5 hängt an keinen PWM Pins. Also ideal dafür.