En este post comenzamos a trabajar con un robot muy simple. El objetivo es usar un chasis de robot genérico y luego ir agregando funcionalidades, si el tiempo lo permite.
En esta oportunidad mostramos el chasis, el módulo de control de motores, las conexiones y el código necesario para mover los motores.
Todos los detalles después del salto.
Materiales
- Arduino Uno R3
- Batería 9V
- Pilas recargables AA x 4
- Soporte 4 pilas
- Jumper
- Chasis de robot 4 ruedas
- Modulo de control de motor basado en L298
Sobre el Hardware
Conectando el Hardware
Alimentación
Software
// motor A int dir1PinA = 2; int dir2PinA = 3; int speedPinA = 9; // motor B int dir1PinB = 4; int dir2PinB = 5; int speedPinB = 10; unsigned long time; int speed; int dir; void setup(){ pinMode(dir1PinA,OUTPUT); pinMode(dir2PinA,OUTPUT); pinMode(speedPinA,OUTPUT); pinMode(dir1PinB,OUTPUT); pinMode(dir2PinB,OUTPUT); pinMode(speedPinB,OUTPUT); time = millis(); dir = 1; digitalWrite(speedPinA, HIGH); digitalWrite(speedPinB, HIGH); } void loop(){ if(1==dir){ digitalWrite(dir1PinA, LOW); digitalWrite(dir2PinA, HIGH); digitalWrite(dir1PinB, LOW); digitalWrite(dir2PinB, HIGH); } else{ digitalWrite(dir1PinA, HIGH); digitalWrite(dir2PinA, LOW); digitalWrite(dir1PinB, HIGH); digitalWrite(dir2PinB, LOW); } if (millis() - time > 3000){ time= millis(); if( 1==dir){ dir=0; } else { dir =1; } } }
- IN1 HIGH, IN2 LOW motor va en un sentido
- IN1 LOW, IN2 HIGH motor va en sentido contrario
- IN1 = IN2 motor se detiene
- Lo mismo es válido para IN3, IN4 (dir1PinB, dir2PinB).
// motor A int dir1PinA = 2; int dir2PinA = 3; int speedPinA = 9; // motor B int dir1PinB = 4; int dir2PinB = 5; int speedPinB = 10;unsigned long time; int speed; int dir; void setup(){ pinMode(dir1PinA,OUTPUT); pinMode(dir2PinA,OUTPUT); pinMode(speedPinA,OUTPUT); pinMode(dir1PinB,OUTPUT); pinMode(dir2PinB,OUTPUT); pinMode(speedPinB,OUTPUT); time = millis(); speed = 0; dir = 1; }void loop(){ analogWrite(speedPinA, speed); analogWrite(speedPinB, speed); //set direction if(1==dir){ digitalWrite(dir1PinA, LOW); digitalWrite(dir2PinA, HIGH); digitalWrite(dir1PinB, LOW); digitalWrite(dir2PinB, HIGH); } else{ digitalWrite(dir1PinA, HIGH); digitalWrite(dir2PinA, LOW); digitalWrite(dir1PinB, HIGH); digitalWrite(dir2PinB, LOW); } if (millis() - time > 3000){ time= millis(); speed += 40; if (speed > 255){ speed = 0; } if( 1==dir){ dir=0; } else { dir =1; } } }
Ambos sketchs fueron probados con Arduino Uno y con Teensy 3.0. La unica salvedad que en el caso de Teensy las puertas ENA yENB (speedPinA y speedPinB) son la 20 y 21, pues estas tienen la funcionalidad de PWM.
Un ejemplo de programación
El usuario de Youtube iainportalupi creó una rutina para controlar los motores de tal manera que sea muy fácil de utilizar
El video con su explicación se puede ver a continuación y es un ejemplo de como usar subrutinas en Arduino
Y el código creado por iainportalupi esta en el siguiente link
LA pila de 9v es para alimentar el motorshield(l298), pero solo dura como 5 minutos, luego se muere…. considero necesario hacer un elevador de corriente… para que dure mas la pila o usar otra … Hice uno con sensor de ultrasonido.. y eso paso…
Hola, gracias por tus posts,
te comento que hice un proyecto similar, nada mas que le agregue sensores de luz y proximidad, y funciona de acuerdo a su entorno, buscando de la luz u ocultandose de ella sin que alla una pared cerca.
Hace un tiempo hice un proyecto similar.
[Enlace editado]
Slds
Edgardo, nos parece super interesante el proyecto que realizaste, pero la idea de internetdelascosas.cl es compartir conocimientos, no videos de youtube, si el video hiciera un enlace al codigo fuente o a mayor informacion de como realizar el proyecto no tenemos problemas en difundirlo, por ahora nos reservamos el derecho a editarlo. Saludos.