Capítulo 8. Trabajo con motores

Imágenes

Códigos

Masaylo: código de introducción. Giro a izquierda

const int mIzq1=5;
const int mIzq2=6;
const int enIzq=3;
const int mDer1=9;
const int mDer2=10;
const int enDer=11;
void setup(){
//En realidad, da igual si llamamos a la función en setup() o en loop(),
//dado que no se realizarán más cambios a lo largo de este programa.
izquierda();
}
void loop(){
//No hay código disponible de momento en esta función
}
void izquierda(){
//Desactivamos motor izquierdo
digitalWrite(enIzq,LOW);
//Activamos motor derecho
digitalWrite(enDer,HIGH);
//No es necesario, pero desactivamos también ambas patillas del motor izquierdo
digitalWrite(mIzq1,LOW);
digitalWrite(mIzq2,LOW);
//Activamos las patillas del motor derecho
digitalWrite(mDer1,HIGH);
digitalWrite(mDer2,LOW);
}
//Aún no llamamos a esta función en setup()
void derecha (){
digitalWrite(enIzq,HIGH);
digitalWrite(enDer,LOW);
digitalWrite(mIzq1,HIGH);
digitalWrite(mIzq2,LOW);
digitalWrite(mDer1,LOW);
digitalWrite(mDer2,LOW);
}

Masaylo: uso de la setencia switch. Cinco movimientos aleatorios

//Declaración de constantes
const int mIzq1=5;
const int mIzq2=6;
const int enIzq=3;
const int mDer1=9;
const int mDer2=10;
const int enDer=11;
//Función adelante()
void adelante (){
digitalWrite(enIzq,HIGH);
digitalWrite(enDer,HIGH);
digitalWrite(mIzq1,HIGH);
digitalWrite(mIzq2,LOW);
digitalWrite(mDer1,HIGH);
digitalWrite(mDer2,LOW);
}
//Función izquierda()
void izquierda (){
digitalWrite(enIzq,LOW);
digitalWrite(enDer,HIGH);
digitalWrite(mIzq1,LOW);
digitalWrite(mIzq2,LOW);
digitalWrite(mDer1,HIGH);
digitalWrite(mDer2,LOW);
}
//Función derecha()
void derecha (){
digitalWrite(enIzq,HIGH);
digitalWrite(enDer,LOW);
digitalWrite(mIzq1,HIGH);
digitalWrite(mIzq2,LOW);
digitalWrite(mDer1,LOW);
digitalWrite(mDer2,LOW);
}
//Función atras()
void atras (){
digitalWrite(enIzq,HIGH);
digitalWrite(enDer,HIGH);
digitalWrite(mIzq1,LOW);
digitalWrite(mIzq2,HIGH);
digitalWrite(mDer1,LOW);
digitalWrite(mDer2,HIGH);
}
//Parada de MASAYLO
void alto (){
digitalWrite(enIzq,LOW);
digitalWrite(enDer,LOW);
digitalWrite(mIzq1,LOW);
digitalWrite(mIzq2,LOW);
digitalWrite(mDer1,LOW);
digitalWrite(mDer2,LOW);
}
//La función principal esta vez está en setup()
void setup() {
//"Plantamos" la semilla que garantiza aleatoriedad
randomSeed(analogRead(A0));
//Declaramos las patillas de control como salidas
pinMode(enIzq,OUTPUT);
pinMode(enDer,OUTPUT);
pinMode(mIzq1,OUTPUT);
pinMode(mIzq2,OUTPUT);
pinMode(mDer1,OUTPUT);
pinMode(mDer2,OUTPUT);
for (int i=0;i<5;i++){
//Valor aleatorio entre 0 y 3
int valor=random(4);
//Tiempo en milisegundos aleatorio entre 2000 y 5000
int tiempo=random(2000,5000);
//Dependiendo de valor, sucederá un case u otro
switch(valor){
case 0:
adelante();
delay(tiempo);
break;
case 1:
atras();
break;
case 2:
izquierda();
delay(tiempo);
break;
case 3:
derecha();
delay(tiempo);
break;
}
}
alto();
}
void loop() {
//En esta ocasión no hay código para loop()
}

Control de velocidad en Masaylo mediante PWM

//Declaración de constantes
const int mIzq1=5;
const int mIzq2=6;
const int enIzq=3;
const int mDer1=9;
const int mDer2=10;
const int enDer=11;
//Función adelante()
void adelante (int velocidad){
analogWrite(enIzq,velocidad);
analogWrite(enDer,velocidad);
digitalWrite(mIzq1,HIGH);
digitalWrite(mIzq2,LOW);
digitalWrite(mDer1,HIGH);
digitalWrite(mDer2,LOW);
}
//Función izquierda()
void izquierda (int velocidad){
digitalWrite(enIzq,LOW);
analogWrite(enDer,velocidad);
digitalWrite(mIzq1,LOW);
digitalWrite(mIzq2,LOW);
digitalWrite(mDer1,HIGH);
digitalWrite(mDer2,LOW);
}
//Función derecha()
void derecha (int velocidad){
analogWrite(enIzq,velocidad);
digitalWrite(enDer,LOW);
digitalWrite(mIzq1,HIGH);
digitalWrite(mIzq2,LOW);
digitalWrite(mDer1,LOW);
digitalWrite(mDer2,LOW);
}
//Función atras()
void atras (int velocidad){
analogWrite(enIzq,velocidad);
analogWrite(enDer,velocidad);
digitalWrite(mIzq1,LOW);
digitalWrite(mIzq2,HIGH);
digitalWrite(mDer1,LOW);
digitalWrite(mDer2,HIGH);
}
//Parada de MASAYLO
void alto (){
digitalWrite(enIzq,LOW);
digitalWrite(enDer,LOW);
digitalWrite(mIzq1,LOW);
digitalWrite(mIzq2,LOW);
digitalWrite(mDer1,LOW);
digitalWrite(mDer2,LOW);
}
//La función principal esta vez está en setup()
void setup() {
//Declaramos las patillas de control como salidas
pinMode(enIzq,OUTPUT);
pinMode(enDer,OUTPUT);
pinMode(mIzq1,OUTPUT);
pinMode(mIzq2,OUTPUT);
pinMode(mDer1,OUTPUT);
pinMode(mDer2,OUTPUT);
//Hacia adelante en tres velocidades, 3 segundos cada una
adelante(167);
delay(3000);
adelante(200);
delay(3000);
adelante(255);
delay(3000);
//Hacia la izquierda en tres velocidades, 3 segundos cada una
izquierda(167);
delay(3000);
izquierda(200);
delay(3000);
izquierda(255);
delay(3000);
//Hacia atras en tres velocidades, 3 segundos cada una
atras(167);
delay(3000);
atras(200);
delay(3000);
atras(255);
delay(3000);
//Hacia la derecha en tres velocidades, 3 segundos cada una
derecha(167);
delay(3000);
derecha(200);
delay(3000);
derecha(255);
delay(3000);
alto();
}
void loop() {
//En esta ocasión no hay código para loop()
}

Moviendo mi primer servomotor

//Incluimos libreria
#include <Servo.h>
//Declaramos un servo
Servo miMotor;
void setup(){
//avisamos al código de que el servo está conectado al pin 6
miMotor.attach(6);
}
void loop(){
//Con la instruccion write indicamos la posición deseada, de 0 a 180
miMotor.write(90);
}

Paso del servomotor por tres posiciones sincronizadas

#include <Servo.h>
Servo miMotor;
void setup(){
miMotor.attach(6);
}
void loop(){
miMotor.write(0);
delay(1000);
miMotor.write(90);
delay(1000);
miMotor.write(180);
delay(1000);
}

Control de la posición del servomotor mediante un potenciómetro

#include <Servo.h>
Servo motor;
int valorLeido,valorEscrito;
void setup(){
Serial.begin(9600);
motor.attach(6);
}
void loop(){
valorLeido=analogRead(A0);
valorEscrito=map(valorLeido,0,1023,0,180);
Serial.print("Valor leido: ");
Serial.print(valorLeido);
Serial.print("\t");
Serial.print("Valor Escrito: ");
Serial.println(valorEscrito);
motor.write(valorEscrito);
delay(50);
}

Motor paso a paso o stepper: control directo de su movimiento

#define azul 2
#define rosa 3
#define amarillo 4
#define naranja 5
#define nPasos 256
void setup() {
// declaramos las patillas digitales como salidas
pinMode(azul,OUTPUT);
pinMode(rosa,OUTPUT);
pinMode(amarillo,OUTPUT);
pinMode(naranja,OUTPUT);
//Bucle que provoca el giro de la rueda. Se puede experimentar con nPasos
for (int i=0;i<nPasos;i++){
//Fase 1
digitalWrite(azul,HIGH);
digitalWrite(rosa,LOW);
digitalWrite(amarillo,LOW);
digitalWrite(naranja,LOW);
delay(10);
//Fase 2
digitalWrite(rosa,HIGH);
digitalWrite(azul,LOW);
digitalWrite(amarillo,LOW);
digitalWrite(naranja,LOW);
delay(10);
//Fase 3
digitalWrite(amarillo,HIGH);
digitalWrite(rosa,LOW);
digitalWrite(azul,LOW);
digitalWrite(naranja,LOW);
delay(10);
//Fase 4
digitalWrite(naranja,HIGH);
digitalWrite(rosa,LOW);
digitalWrite(amarillo,LOW);
digitalWrite(naranja,LOW);
delay(10);
//Fin de ciclo
}
}
void loop() {
//Sin código
}

Control de un stepper mediante la librería Stepper

#include <Stepper.h>
//Hay que saber cuantos pasos por vuelta exige nuestro modelo
const int pasosporVuelta = 512;
Stepper miMotor(pasosporVuelta, 6,8,7,9);
void setup() {
// Ponemos la velocidad a 20 (velocidades superiores pueden conducir a error)
miMotor.setSpeed(60);
//Movemos el motor el mismo número de pasos para dar 1 vuelta
miMotor.step(512);
}
void loop() {
//Sin código para loop()
}

Control de dos stepper mediante la librería Stepper

#include <Stepper.h>
//Hay que saber cuantos pasos por vuelta exige nuestro modelo
const int pasosporVuelta = 512;
Stepper motor1(pasosporVuelta, 2,4,3,5);
Stepper motor2(pasosporVuelta, 6,8,7,9);
void setup() {
// Ponemos la velocidad a 60 (por ejemplo<9
motor1.setSpeed(20);
motor2.setSpeed(20);
//Movemos el motor el mismo número de pasos para dar 1 vuelta
for (int i=0;i<512;i++){
motor1.step(1);
motor2.step(1);
}
}
void loop() {
//Sin código para loop()
}

Uso de la librería AccelStepper

//Incluimos la libreria
#include <AccelStepper.h>
//Declaramos los objetos AccelStepper
AccelStepper motorDerecha(4,2,4,3,5);
AccelStepper motorIzquierda(4,6,8,7,9);
void setup(){
//Definimos los parámetros del motor de la derecha
motorDerecha.setSpeed(0);
motorDerecha.setMaxSpeed(100);
motorDerecha.setAcceleration(10);
//Definimos los parámetros del motor de la izquierda
motorIzquierda.setSpeed(0);
motorIzquierda.setMaxSpeed(100);
motorIzquierda.setAcceleration(10);
//Establecemos el destino en pasos de ambos motores
motorDerecha.moveTo(512);
motorIzquierda.moveTo(-512);
}
void loop(){
//Los motores girarán a cada repetición de loop hasta alcanzar su destino
//Después de eso, seguirán parados a cada ejecución del bucle
motorDerecha.run();
motorIzquierda.run();
}