Go Down

Topic: 2 Motoren + Servo mit dem Arduino Uno steuern (Read 2554 times) previous topic - next topic

Torrentula

Hallo Arduino pros!

Bin gerade dabei, einen Roboter zu bauen, der einen Arduino Uno als Haupt-Controllerboard verwendet.

Ich möchte mit den Pins 9 und 10 meine Motoren in der Geschwindigkeit regeln. Wenn ich nun aber die Servo-Lib verwende, sind diese für PWM allerdings nicht mehr verfügbar. Deshalb trenne ich den Servo immer wieder mittels der Methode detach() von Pin 6 um auf den Pins 9 und 10 wieder ein PWM-Signal ausgeben zu können. Obwohl nun kein Servo mehr "attached" ist, fahren die Motoren nicht wieder an. Auch der Servo bewegt sich kein Stück.

Code: [Select]


#include <Servo.h>

int duration;                                                          //Stores duration of pulse in
int distance;                                                          // Stores distance
const int sensorpin = 4;

Servo servo;

int distR;
int distL;


void getDistance(){
 
  distance = 0;
 
  pinMode(sensorpin, OUTPUT);
  digitalWrite(sensorpin, LOW);                          // Make sure pin is low before sending a short high to trigger ranging
  delayMicroseconds(2);
  digitalWrite(sensorpin, HIGH);                         // Send a short 10 microsecond high burst on pin to start ranging
  delayMicroseconds(10);
  digitalWrite(sensorpin, LOW);                                  // Send pin low again before waiting for pulse back in
  pinMode(sensorpin, INPUT);
  duration = pulseIn(sensorpin, HIGH);                        // Reads echo pulse in from SRF05 in micro seconds
  distance = duration/58;                                      // Dividing this by 58 gives us a distance in cm
}

void getDistanceR(){
 
  servo.attach(6); // servo attached to pin 6
  servo.write(0); // right position
  servo.detach(); // detach servo
 
  distR = 0;
 
  pinMode(sensorpin, OUTPUT);
  digitalWrite(sensorpin, LOW);                          // Make sure pin is low before sending a short high to trigger ranging
  delayMicroseconds(2);
  digitalWrite(sensorpin, HIGH);                         // Send a short 10 microsecond high burst on pin to start ranging
  delayMicroseconds(10);
  digitalWrite(sensorpin, LOW);                                  // Send pin low again before waiting for pulse back in
  pinMode(sensorpin, INPUT);
  duration = pulseIn(sensorpin, HIGH);                        // Reads echo pulse in from SRF05 in micro seconds
  distR = duration/58;                                      // Dividing this by 58 gives us a distance in cm
}

void getDistanceL(){
 
  servo.attach(6); // servo attached to pin 6
  servo.write(170); // left position
  servo.detach(); // detach servo
 
  distL = 0;
 
  pinMode(sensorpin, OUTPUT);
  digitalWrite(sensorpin, LOW);                          // Make sure pin is low before sending a short high to trigger ranging
  delayMicroseconds(2);
  digitalWrite(sensorpin, HIGH);                         // Send a short 10 microsecond high burst on pin to start ranging
  delayMicroseconds(10);
  digitalWrite(sensorpin, LOW);                                  // Send pin low again before waiting for pulse back in
  pinMode(sensorpin, INPUT);
  duration = pulseIn(sensorpin, HIGH);                        // Reads echo pulse in from SRF05 in micro seconds
  distL = duration/58;                                      // Dividing this by 58 gives us a distance in cm
}

void rightForward(void){
  digitalWrite(8, HIGH);
  digitalWrite(11, LOW);
}

void leftForward(void){
  digitalWrite(12, LOW);
  digitalWrite(7, HIGH);
}

void rightBackward(){
  digitalWrite(8, LOW);
  digitalWrite(11, HIGH);
}

void leftBackward(void){
  digitalWrite(12, HIGH);
  digitalWrite(7, LOW);
}

void accelerate(){
 
    analogWrite(10, 0); // R
    analogWrite(9, 0); // L
 
    for(int i = 0; i < 100; i += 5){
      analogWrite(10, i); // R
      analogWrite(9, i); // L
      delay(40);
    }
   
    analogWrite(10, 100); // R
    analogWrite(9, 100); // L
    delay(40);
}

void slowdown(){
 
  for(int i = 100; i > 0; i -= 5){
    analogWrite(10, i); // R
    analogWrite(9, i); // L
    delay(40);
  }
 
  analogWrite(10, 0); // R
  analogWrite(9, 0); // L
}

void setup(){
 
    // right motor 
    pinMode(8, OUTPUT); // 1A
    pinMode(11, OUTPUT); // 1B
    pinMode(10, OUTPUT); // PWM
   
    // left Motor
    pinMode(9, OUTPUT); // PWM
    pinMode(12, OUTPUT); // 2A
    pinMode(7, OUTPUT); // 2B
   
   
   
    //**** SRF05 Power ****
    pinMode(2, OUTPUT);
    pinMode(3, OUTPUT);
    pinMode(5, OUTPUT);
   
    digitalWrite(2, HIGH);
    digitalWrite(3, LOW);
    digitalWrite(5, LOW);
    //*********************

}

void loop(){
     
      servo.attach(6); // servo attached to pin 6
      servo.write(80); // middle position
      servo.detach(); // detach servo
     
      getDistance();
 
      rightForward();
      leftForward();
      accelerate();
     
      while(distance > 30){
        getDistance();
        delay(100);
      }
     
     slowdown();
     
     getDistanceR();
     getDistanceL();
     
     if(distL < distR){
       
        servo.attach(6); // servo attached to pin 6
        servo.write(80); // middle position
        servo.detach(); // detach servo
       
       rightBackward();
       leftForward();
       accelerate();
       
       while(distance < distR){
         getDistance();
         delay(100);
       }
       
       slowdown();
       
     }
     
     if(distR < distL){
       
       servo.attach(6); // servo attached to pin 6
       servo.write(80); // middle position
       servo.detach(); // detach servo
       
       rightForward();
       leftBackward();
       accelerate();
   
       while(distance < distL){
         getDistance();
         delay(100);
       }
     
     slowdown();
     }
}




Hoffe jemand kann mir helfen!

MfG

Torrentula

uwefed

kannst Du nicht einen anderen Timer und dementsprechend andere PWM Ausgänge verwenden?
Grüße Uwe

Torrentula

Gehts nicht auch so?

Weil in der beschreibung der Servo-Lib steht, dass das eigentlich gehen soll wenn alle Servos "detached" sind...

Naja dann muss ich wohl nen andern timer benutzen..

Go Up