Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
hoy limpiando el trastero me he encontrado un viejo Ferrari teledirigido y ya sabeis... no he podido resistirme a abrirlo, resulta que solo usaba 2 motores cc, uno para mover las 2 ruedas traseras a la vez y otro para girar las delanteras como si tuviera un volante. El caso es que toda la parte electronica estaba para tirarla: cables rotos, soldaduras oxidadas, una placa caotica (yo por lo menos no la he entendido)... y ya que todo el "montaje" viene hecho, pensaba en motarme yo mismo la placa, y aprender un poco más, mi idea es la siguiente:
Controlar el motor trasero mediante un L293D en ambas direcciones y el motor delantero con otro L293D para girar las ruedas, y controlarlos con un pic 16F84A.
Tambien tenia pensado incorporale 4 CNY70 para que puede seguir lineas...
La verdad, todavia estoy un poco verde.... espero vuestros consejos 😀
Saludos
uff... vaya lios que me monto yo solito... obviamente lo que he puest arriba está mal... olvidandonos de lo de arriba:
Esto estaría bien??:
int sensorPin = 2; // sensor CNY70
int motor1Pin1 = 3; // pin 2 en L293D // motor delantero
int motor1Pin2 = 4; // pin 7 L293D // motor delantero
int motor2Pin1 = 5; // pin 15 L293D // motor trasero
int motor2Pin2 = 6; // pin 10 L293D // motor trasero
int enable1Pin = 9; // pin 1 L293D
int enable2Pin = 10; // pin 9 L293
void setup() {
//Establecer el sensor como entrada:
pinMode(sensorPin, INPUT);
// pines de salida:
pinMode(motor1Pin1, OUTPUT);
pinMode(motor1Pin2, OUTPUT);
pinMode(enable1Pin, OUTPUT);
pinMode(motor2Pin1, OUTPUT);
pinMode(motor2Pin2, OUTPUT);
pinMode(enable2Pin, OUTPUT);
// Establecer enablePin alto para que el motor se puede activar:
digitalWrite(enable1Pin, HIGH);
digitalWrite(enable2Pin, HIGH);
}
void loop(){
digitalWrite(motor2Pin1, LOW); // El motor trasero siempre funcionando
digitalWrite(motor2Pin2, HIGH); // El motor trasero siempre funcionando
// Si el sensor es alto, el motor se enciende en una sola dirección:
if (digitalRead(sensorPin) == HIGH){
digitalWrite(motor1Pin1, LOW); // establecer el pin 2 L293D baja
digitalWrite(motor1Pin2, HIGH); // establecer el pin 7 L293D alta
}
// Si el interruptor es bajo, el motor girará en la dirección opuesta:
else {
digitalWrite(motor1Pin1, HIGH); // establecer el pin 2 L293D alta
digitalWrite(motor1Pin2, LOW); // establecer el pin 7 L293D baja
}
}
Hola!
El programa funcionaria, pero creo que no hace lo que piensas. Me explico; el motor delantero intuyo que es un motor de CC y controla la dirección. Lo tipico es que estos sistemas de direccion incluyan un resorte de forma que cuando no alimentas el motor el resorte mantine la dirección en el centro y el coche va recto. Cuando activas el motor gira la direccion a un lado venciendo al resorte y el coche gira en el sentido que manda la direccion.
Pues eso; tu programa hace que el coche gire en un sentido cuando el sensor detecta y en el otro cuando no detecta, pero nunca va recto.
Otra cosa, para contorlar la velocidad de los motores se usa la señal de ENABLE. Si escribes un HIGH el motor gira a la máxima velocidad. Si quieres controlar la velocidad necesitas utilizar la función analogWrite() en los enables del L293.
Aunque ya te digo que para probar el motor de la direccion el programa puede funcionar.
Salu2!
Hola Oliva,
Has hecho una pregunta sencilla, que se contesta con una respuesta sencilla: ¿Bien para hacer que? Si lo que pretendes es que el motor 1 gire en un sentido u en otro dependiendo de la lectura que te de el sensor, supongo que sí. Si lo que quieres hacer es otra cosa (como comenta Bastian) entonces será que no. Que un código funcione depende de que quieres que haga y, para eso, lo mejor es probarlo en el robot, o en un prototipo como mínimo. Si estás programando sin poder hacer ninguna prueba real, de poco te va a servir eso; mejor que acabes de montar las placas y después empieces con la programación.
De todos modos, creo que siempre es más educativo, al principio, atacar cada cosa por separado, y después juntarlas cuando ya se dominan. Por ejemplo: La lectura de los sensores. Para eso (y para cualquier cosa, a modo de debuger) va muy bien utilizar la librería Serial de Arduino. Un ejemplo de código sería este:
#define sensorPin 2 //Las variables si no han de "variar" desperdician espacio en memoria
void setup() {
pinMode( sensorPin, INPUT);
Serial.begin(9600);
Serial.println("Comenzando...");
}
void loop() {
Serial.print("Sensor cny = ");
Serial.println(digitalRead(sensorPin),DEC);
delay(200);
}
Cuando hayas probado esto prueba a leer varios sensores, no solo uno, y a visualizar sus lecturas por el terminal. El siguiente paso sería calcular el error (la diferencia de posición de la linea respecto al centro del morro sensor). Y así sucesivamente, utilizando siempre la librería Serial para ir comprobando que todo sucede como esperabas (y en caso de que no, arreglar el código o el hardware).
Con el motor de tracción sigue el mismo procedimiento: primero encender y apagar el motor (lo que hacías ahora), después alternar adelante/libre/atrás/freno, por ejemplo, continua por enviar diferentes velocidades utilizando pwm (función analogWrite de Arduino), primero con valores fijos (10%, 20%, 50%, 75%, 100%) y después con un bucle que vaya incrementando la velocidad. Finalmente puedes hacer pruebas de aceleración y frenada del motor (para ver como responde). En este apartado también puedes seguir usando la librería Serial para saber que es lo que se supone que está haciendo el motor.
Por cierto, si el motor de la dirección es un servo y quieres usar su electrónica directamente, así no necesitas el otro L293D y evitas dolores de cabeza con su control, puedes usar la librería Servo de Arduino.
si, como bien decis el coche nunca iria recto, iria dando tumbos de un lado para otro...
El motor de direccion es un motor cc y la electronica que traia estaba un poco estropeada, traia 3 "mc14040bcp" de motorola y un monton de transistores y condensadores... ademas, estaban soldados directamente a la placa y es imposible sacarlos porque estan soldados hasta el fondo...
Si en vez de un motor cc usara un servo si que podria posicionarlo para que volviera a la posicion para que fuera recto ¿no?
Saludos