Publicidad

sábado, 17 de junio de 2017

Keyes L298 Stepper Motor Driver

En el siguiente tutorial aprenderemos a controlar motores paso a paso con Arduino y el driver L298. Este controlador puede gestionar cargas de hasta 35V y 2A, por lo que está especialmente indicado para motores de tamaño medio-alto.

Esquema

El siguiente esquema muestra la conexión de un motor paso a paso NEMA 17, concretamente un modelo KH42JM2-852 de Japan Servo Co. ver datasheet al final de la página.

Las entradas EN_A y EN_B se conectan a +5V. Y las entradas IN_1 a IN_4 se conectan a los pines D8 a D11. Se pueden conectar a cualquier otro pin del Arduino si así lo deseamos, pero lo he conectado de esta manera para aprovechar los ejemplos ya creados que vienen con la librería Stepper.




Arduino KEYES L298 STEPPER  MOTOR DRIVER w KH42JM2-852 - Schematic.png

Sketch

Vamos a ver un ejemplo sencillo. El siguiente sketch hace que nuestro motor gire una vuelta en sentido horario y otra en antihorario, con una pausa de 500ms entre ambas.

Este código está disponible en Ejemplos→Stepper→stepper_oneRevolution


screenshot.png

/*
Stepper Motor Control - one revolution

This program drives a unipolar or bipolar stepper motor.
The motor is attached to digital pins 8 - 11 of the Arduino.

The motor should revolve one revolution in one direction, then
one revolution in the other direction.

Created 11 Mar. 2007
Modified 30 Nov. 2009
by Tom Igoe

*/

#include <Stepper.h>

const int stepsPerRevolution = 200;  // change this to fit the number of steps per revolution
// for your motor

// initialize the stepper library on pins 8 through 11:
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);

void setup() {
 // set the speed at 60 rpm:
 myStepper.setSpeed(60);
 // initialize the serial port:
 Serial.begin(9600);
}

void loop() {
 // step one revolution  in one direction:
 Serial.println("clockwise");
 myStepper.step(stepsPerRevolution);
 delay(500);

 // step one revolution in the other direction:
 Serial.println("counterclockwise");
 myStepper.step(-stepsPerRevolution);
 delay(500);
}



Este ejemplo puede servir para probar motores paso a paso y verificar su correcto funcionamiento.

Links

Más información sobre la librería Stepper y los motores paso a paso.

Tutorial sobre el driver L298 en tronixstuff.com

Barco Aerodeslizador RC Bluetooth

Estaba el otro día paseando por el parque, cuando vi a unos niños jugando con un barquito hecho con corchos de botellas de vino unidos entre sí con palillos de madera, y un pañuelo a modo de vela.

barco con corchos.jpg
Imagen cortesía elhadadepapel.com

Como fan de las cosas DIY que soy, me pareció una idea brillante por su simplicidad y funcionalidad. Y ahí estaban los niños, soltando el barquito en un lado del estanque y corriendo hacia el contrario esperando para recogerlo, mientras el viento lo empujaba.

Pensé en lo divertido que sería tener tu propio barco de radiocontrol. Y se me encendió la bombilla. Esos peques me enseñaron como hacer el barco, del resto me encargo yo.

En el siguiente proyecto veremos cómo hacer un sencillo barco de radiocontrol mediante bluetooth. La idea es imitar el funcionamiento de un aerodeslizador.

aerodeslizador.jpg
Fuente wikipedia

Vale que nuestro barquito desentonaría un poco entrando en Puerto Banús, pero es 100% DIY y eso es lo que importa.

Como hacer el barco

Para el barco propiamente dicho, voy a emplear una botella de agua de 1 litro abierta por la mitad. En la parte trasera he pegado con una pistola de silicona un trozo de plástico donde irá un pequeño ventilador montado sobre un servo para dirigir el barco.



A continuación pegamos a cada lado, una botella más pequeña, de 33cl con el fin de dar estabilidad al barco y evitar que naufrague.


Para terminar introducimos en el interior del barco, las baterías y la electrónica. También he añadido dos leds blancos en la proa y dos rojos en la popa.


Para el control remoto vamos a utilizar un módulo HC-05 conectado a un Arduino NANO V3 controlado con una aplicación desde un móvil Android.


Al utilizar el móvil, nos ahorramos tener que hacer un mando de control remoto, pues lo único que necesitamos es instalar la aplicación Arduino Bluetooth RC Car de Andi Co.
Además el bluetooth ofrece mayor alcance y fiabilidad que los mandos por radiofrecuencia.





Esquema

Como se aprecia en el esquema, he utilizado un L293D para controlar el motor del ventilador, de esta manera podemos invertir el sentido de giro y mover el barco hacia delante y atrás.

Para evitar sobrecargar los pines del Arduino NANO, he alimentado los leds y el zumbador mediante transistores. También se pueden conectar directamente, siempre que el consumo sea inferior a 40mA por cada pin digital del Arduino.

Es posible simplificar el circuito, sustituyendo el L293D por un transistor, pero con la desventaja de no poder invertir el sentido de giro del motor. Pincha aquí para más info.

Todo el circuito se alimenta con cuatro pilas recargables NI-MH de 1,2V.







Sketch

Vamos a pasar a la parte del código.

El funcionamiento es muy sencillo, dependiendo del botón que pulsemos en la pantalla de nuestro móvil, la aplicación manda un mensaje por bluetooth correspondiente a una letra. El receptor lo interpreta y actúa en consecuencia invocando a la función que corresponda.

Mira el Tutorial Oficial de la aplicación para obtener más información.


/* Bluetooth RC Boat
  version On Change mode
  LEDS en Proa y Popa
  Buzzer
*/

#include <Servo.h>
Servo myservo;

int in1Pin = 8; // pin 2 del L293D
int in2Pin = 7; // pin 7 del L293D
int enableM1 = 6; // pin 1 del L293D
int ledsProa = 4; // Leds Proa al pin D4 del Arduino
int ledsPopa = 3; // Leds Popa al pin D3 del Arduino
int buzzer = 2; // Buzzer al pin D2 del Arduino

char command = 'S';
void setup() {
 
  myservo.attach(5);  // Servo al pin D5 del Arduino
   pinMode(in1Pin, OUTPUT);
   pinMode(in2Pin, OUTPUT);
   pinMode(enableM1, OUTPUT);
   pinMode(ledsProa, OUTPUT);
   pinMode(ledsPopa, OUTPUT);
   pinMode(buzzer, OUTPUT);
   Serial.begin(9600);
}

// Funciones
// Si el commando es 'S' el motor se para
void motorsOff(){
 
 digitalWrite(enableM1, LOW);  
 digitalWrite(in1Pin, LOW);
 digitalWrite(in2Pin, LOW);
 myservo.write(90);
  
}

// Si el commando es 'F' el barco avanza
void goForward() {
 digitalWrite(enableM1, HIGH);
 digitalWrite(in1Pin, HIGH);
 digitalWrite(in2Pin, LOW);
 myservo.write(90);
       
}

// Si el commando es 'B' el barco retrocede
void goBackward() {
 digitalWrite(enableM1, HIGH);
 digitalWrite(in1Pin, LOW);
 digitalWrite(in2Pin, HIGH);
 myservo.write(90);
       
}

// Si el comando es 'R' el barco gira a estribor
void turnRight() {
 digitalWrite(enableM1, HIGH);
 digitalWrite(in1Pin, HIGH);
 digitalWrite(in2Pin, LOW);
 myservo.write(120);
}

// Si el comando es 'L' el barco gira a babor
void turnLeft() {
 digitalWrite(enableM1, HIGH);
 digitalWrite(in1Pin, HIGH);
 digitalWrite(in2Pin, LOW);
 myservo.write(60);
}

// Si el comando es 'U' encender los leds de popa
void ledsPopaOn() {
       digitalWrite(ledsPopa, HIGH);
}

// Si el comando es 'u' apagar los leds de popa
void ledsPopaOff() {
       digitalWrite(ledsPopa, LOW);
}

// Si el comando es 'W' encender los leds de proa
void ledsProaOn() {
       digitalWrite(ledsProa, HIGH);
}

// Si el comando es 'w' apagar los leds de proa
void ledsProaOff() {
       digitalWrite(ledsProa, LOW);
}

// Si el comando es 'V' activar el zumbador
void buzzerOn() {
       digitalWrite(buzzer, HIGH);
}

// Si el comando es 'v' desactivar el zumbador
void buzzerOff() {
       digitalWrite(buzzer, LOW);
}

// Si el comando es 'D' apagar todo
void allOff(){
 digitalWrite(ledsProa, LOW);
 digitalWrite(buzzer, LOW);
 digitalWrite(ledsPopa, LOW);
 digitalWrite(enableM1, LOW);
 digitalWrite(in1Pin, LOW);
 digitalWrite(in2Pin, LOW);
 myservo.write(90);
}

void loop() {
   //if some date is sent, reads it and saves in command
   if(Serial.available() > 0){
     command = Serial.read();
     
       switch(command){
         case 'S':
           motorsOff();
           break;
         case 'F':
           goForward();
           break;
         case 'B':
           goBackward();
           break;
         case 'R':
           turnRight();
           break;
         case 'L':
           turnLeft();
           break;
         case 'U':
           ledsPopaOn();
           break;
         case 'u':
           ledsPopaOff();
           break;
         case 'W':
           ledsProaOn();
           break;
         case 'w':
           ledsProaOff();
           break;
         case 'V':
           buzzerOn();
           break;
         case 'v':
           buzzerOff();
           break;
         case 'D':
           allOff();
           break;
             
           
         }   
       }
      }




Una vez subido el código al Arduino, abrimos la aplicación Bluetooth RC Car y tocamos en Settings . Seleccionar Connect to car, en la lista de dispositivos, seleccionamos HC-05 y ponemos el PIN 1234 o bien 0000 si es la primera vez que conectamos con el módulo bluetooth.

Una vez el móvil se conecta por bluetooth, el icono pasa a verde y al pulsar sobre los mandos, el barco actuará en consecuencia.



Barco Aerodeslizador RC Bluetooth v2

Actualizado el 6 de mayo de 2017

He sometido al barco aerodeslizador a una pequeña actualización. Los cambios que he realizado son, por un lado sustituir el motor original procedente de un ventilador a pilas, por dos motores de cuadricóptero y he simplificado el esquema de conexión. Clic sobre la imagen siguiente para ver un gift.


Esquema

Como se aprecia en el esquema, he prescindido de los transistores que alimentaban los ledes y el zumbador. Este cambio no supone ningún problema, siempre que no se superen los 40mA por cada pin digital del Arduino NANO, o 20mA si estamos utilizando al Arduino UNO.

Aunque no lo he dibujado en el esquema, los dos motores están conectados en paralelo en los pines 3 y 6 del L293D.

Arduino Bluetooth RC BOAT - Schematic v2.PNG


Sketch

Solo queda modificar el código visto más arriba, para adaptarlo al nuevo esquema.


/* Bluetooth RC Boat
  version On Change mode Rev 2
  LEDS en Proa y Popa
  Buzzer
*/

#include <Servo.h>
Servo myservo;

int in1Pin = 8; // pin 2 del L293D
int in2Pin = 7; // pin 7 del L293D
int enableM1 = 6; // pin 1 del L293D
int DL1 = 12; // Led Proa al pin D12 del Arduino
int DL2 = 11; // Led Proa al pin D11 del Arduino
int DL3 = 10; // Led Popa al pin D10 del Arduino
int DL4 = 9; // Led Popa al pin D9 del Arduino
int buzzer = 2; // Buzzer al pin D2 del Arduino

char command = 'S';
void setup() {
 
  myservo.attach(5);  // Servo al pin D5 del Arduino
   pinMode(in1Pin, OUTPUT);
   pinMode(in2Pin, OUTPUT);
   pinMode(enableM1, OUTPUT);
   pinMode(DL1, OUTPUT);
   pinMode(DL2, OUTPUT);
   pinMode(DL3, OUTPUT);
   pinMode(DL4, OUTPUT);
   pinMode(buzzer, OUTPUT);
   Serial.begin(9600);
}

// Funciones
// Si el commando es 'S' el motor se para
void motorsOff(){
 
 digitalWrite(enableM1, LOW);  
 digitalWrite(in1Pin, LOW);
 digitalWrite(in2Pin, LOW);
 myservo.write(90);
  
}

// Si el commando es 'F' el barco avanza
void goForward() {
 digitalWrite(enableM1, HIGH);
 digitalWrite(in1Pin, HIGH);
 digitalWrite(in2Pin, LOW);
 myservo.write(90);
       
}

// Si el commando es 'B' el barco retrocede
void goBackward() {
 digitalWrite(enableM1, HIGH);
 digitalWrite(in1Pin, LOW);
 digitalWrite(in2Pin, HIGH);
 myservo.write(90);
       
}

// Si el comando es 'R' el barco gira a estribor
void turnRight() {
 digitalWrite(enableM1, HIGH);
 digitalWrite(in1Pin, HIGH);
 digitalWrite(in2Pin, LOW);
 myservo.write(120);
}

// Si el comando es 'L' el barco gira a babor
void turnLeft() {
 digitalWrite(enableM1, HIGH);
 digitalWrite(in1Pin, HIGH);
 digitalWrite(in2Pin, LOW);
 myservo.write(60);
}

// Si el comando es 'U' encender los leds de popa
void ledsPopaOn() {
       digitalWrite(DL3, HIGH);
       digitalWrite(DL4, HIGH);
}

// Si el comando es 'u' apagar los leds de popa
void ledsPopaOff() {
       digitalWrite(DL3, LOW);
       digitalWrite(DL4, LOW);
}

// Si el comando es 'W' encender los leds de proa
void ledsProaOn() {
       digitalWrite(DL1, HIGH);
       digitalWrite(DL2, HIGH);
}

// Si el comando es 'w' apagar los leds de proa
void ledsProaOff() {
       digitalWrite(DL1, LOW);
       digitalWrite(DL2, LOW);
}

// Si el comando es 'V' activar el zumbador
void buzzerOn() {
       digitalWrite(buzzer, HIGH);
}

// Si el comando es 'v' desactivar el zumbador
void buzzerOff() {
       digitalWrite(buzzer, LOW);
}

// Si el comando es 'D' apagar todo
void allOff(){
 digitalWrite(DL1, LOW);
 digitalWrite(DL2, LOW);
 digitalWrite(DL3, LOW);
 digitalWrite(DL4, LOW);
 digitalWrite(buzzer, LOW);  
 digitalWrite(enableM1, LOW);
 digitalWrite(in1Pin, LOW);
 digitalWrite(in2Pin, LOW);
 myservo.write(90);
}

void loop() {
   //if some date is sent, reads it and saves in command
   if(Serial.available() > 0){
     command = Serial.read();
     
       switch(command){
         case 'S':
           motorsOff();
           break;
         case 'F':
           goForward();
           break;
         case 'B':
           goBackward();
           break;
         case 'R':
           turnRight();
           break;
         case 'L':
           turnLeft();
           break;
         case 'U':
           ledsPopaOn();
           break;
         case 'u':
           ledsPopaOff();
           break;
         case 'W':
           ledsProaOn();
           break;
         case 'w':
           ledsProaOff();
           break;
         case 'V':
           buzzerOn();
           break;
         case 'v':
           buzzerOff();
           break;
         case 'D':
           allOff();
           break;
             
           
         }   
       }
      }


Una vez subido el código al Arduino, abrimos la aplicación Bluetooth RC Car y tocamos en Settings . Seleccionar Connect to car, en la lista de dispositivos, seleccionamos HC-05 y ponemos el PIN 1234 o bien 0000 si es la primera vez que conectamos con el módulo bluetooth.

Una vez el móvil se conecta por bluetooth, el icono pasa a verde y al pulsar sobre los mandos, el barco actuará en consecuencia.




Enlaces

Descarga la aplicación Arduino Bluetooth RC Car de Andi Co

Tutorial oficial de la aplicación.

Más sobre Arduino y módulos bluetooth aquí y aquí.



Publicidad