Ayuda de Robótica Básica. Control de velocidad variable del motor por entrada de sensor ultrasónico en arduino

2

Primero, gracias por tomarse el tiempo de leer mi publicación.

Estoy intentando usar un sensor ultrasónico para controlar un motor de CC usando la salida PWM de un arduino. Bastante simple, lo sé, pero soy solo un principiante. :)

Aquí está mi código, con una explicación de mi teoría y mi error después.

#define trigPin 7
#define echoPin 2
#define motorPin 9

void setup(){
 Serial.begin(9600);
 pinMode(trigPin, OUTPUT);
 pinMode(echoPin, INPUT);
 pinMode(motorPin, OUTPUT);
}

void loop(){
  int duration, distance;
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(1000);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH); 
  distance = (duration/2) /29.1; 
  if (distance <5)
  {
    analogWrite(motorPin, 0);
  }
  else if(5 <= distance <15)
  {
    analogWrite(motorPin, 50);
  }
  else if(15 <= distance <25)
  {
    analogWrite(motorPin, 100);
  }
  else if(25 <= distance < 35)
  {
    analogWrite(motorPin, 150);
  }
  else if(35 <= distance < 45)
  {
    analogWrite(motorPin, 200);
  }
  else if(45 <= distance)
  {
    analogWrite(motorPin, 255);
  }
  else;
  {
    analogWrite(motorPin, 0);
  }
  Serial.print (distance);
  Serial.println (" cm");
  delay(500);
}

Entonces, esto es increíblemente simple. Todavía no he comenzado a conducir con diferencial ni a frenar, y pronto quiero aprender a cambiar la programación del sensor ultrasónico con la biblioteca NewPing para obtener más sensores y menos demoras.

Ahora mismo, espero que el arduino interprete el ping ultrasónico como una distancia en centímetros y, en base a esa distancia, establezca el motor de CC a una velocidad definida. La salida PWM va a una resistencia de 210 ohmios conectada al pin base de un transistor, en el colector / emisor está el circuito de 18 V conectado al motor de CC. En un circuito aparte se encuentra el arduino y el sensor ultrasónico.

El circuito me da con éxito distancias precisas en la ventana del monitor serie. Sin embargo, el motor solo va al 100% de velocidad. No acelera su velocidad independientemente del valor de la variable de distancia.

Me asusta que la velocidad del motor predeterminada para esta configuración sea del 100%, me hace pensar que la velocidad está actuando digitalmente. Intenté eliminar el final de elseif condicional para que la distancia fuera mayor a 45 cm de velocidad establecida al 100% y el circuito aún alimentara el motor al 100%.

Cualquier ayuda sería muy apreciada!

    
pregunta Quark

1 respuesta

1

Es posible que hayas descubierto que no todos los pines pueden hacer PWM, y el "IDE" de Arduino no te lo dice. AnalogEscribe un valor mayor que 0 y está 100% activado.

Escriba un boceto de prueba que haga pasar el pin a través del 25%, 50%, 100% y verifique que funcione.

Luego, intente obtener algunas ecuaciones para el control del motor; . Tiene tres regiones, seleccionadas por una declaración If:

  • distancia > 100: velocidad máxima
  • distancia < 20: detener
  • 20 < distancia < 100: velocidad = 3 * (distancia-20)

editar No está tan indocumentado ... la página de AnalogWrite dice

  

En la mayoría de las placas Arduino (aquellas con el ATmega168 o ATmega328), esta función funciona en los pines 3, 5, 6, 9, 10 y 11. En el Arduino Mega, funciona en los pines 2 - 13 y 44 - 46 Las placas Arduino más antiguas con un ATmega8 solo admiten analogWrite () en los pines 9, 10 y 11.

edit2 parece que el pin 9 debería funcionar en casi cualquier Arduino. Quizás su problema esté en el circuito de transistores.

    
respondido por el tomnexus

Lea otras preguntas en las etiquetas