Top Banner
: Taller de Arduino Presentación Contenido Hardware Software Comunidad Controlando un servomotor con un potenciometro - componentes - circuito - diagrama - código - variantes - referencias - otros - En este proyecto vamos a mover el eje de un servomotor siguiendo el movimiento de un potenciometro. Para hacerlo tomaremos la posición del potenciometro a partir del voltaje que nos proporciona éste y la transformaremos a un valor en grados, que será la posición a la que moveremos el servo. Para mover el servo usaremos la biblioteca Servo, que nos facilita el manejo de estos motores. - al inicio Componentes arduino protoboard un servomotor un potenciometro - al inicio Circuito Los servomotores son motores eléctricos con un mecanismo interno de control que nos da la posibilidad de controlarlo su posición. Normalmente están construidos para girar en un
34

Taller de arduino

Mar 27, 2023

Download

Documents

Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Taller de arduino

  :Taller de 

Arduino  

Presentación Contenido Hardware Software Comunidad

Controlando un servomotor con un potenciometro

-   componentes  - circuito  - diagrama  - código  - variantes  - referencias  - otros    -

En este proyecto vamos a mover el eje de unservomotor siguiendo el movimiento de unpotenciometro. Para hacerlo tomaremos la posicióndel potenciometro a partir del voltaje que nosproporciona éste y la transformaremos a un valoren grados, que será la posición a la quemoveremos el servo.Para mover el servo usaremos la biblioteca Servo,que nos facilita el manejo de estos motores.- al inicio

Componentes

arduino protoboard un servomotor un potenciometro

- al inicio

Circuito

Los servomotores son motores eléctricos con unmecanismo interno de control que nos da laposibilidad de controlarlo su posición.Normalmente están construidos para girar en un

Page 2: Taller de arduino

angulo de de 0 a 180 grados en ambos sentidos,aunque los hay que tienen giro continuo.El servomotor de nuestro kit es un servomotor de5 volts y tiene tres cables para hacerlofuncionar. Un cable rojo, que se debe conectar a5 volts. Un cable negro, que se debe conectar atierra. Y un tercer cable, amarillo en nuestromotor, que es el cable de control y que vamos aconectar a un pin de salida del arduino.

- al inicio

Diagrama

Page 3: Taller de arduino

- al inicio

Código

Para utilizar los servomotores desde el Arduinocontamos con la biblioteca Servo, que nos permitecontrolarlo de manera muy simple.Lo primero que debemos hacer es incorporar labiblioteca Servo en nuestro sketch, que es una delas bibliotecas que ya viene con el software delArduino.Con esta biblioteca primero hay que crear unobjeto Servo. Despues hay que ligarlo al pin conel que vamos a controlarlo y finalmente con lafunción write() lo colocamos en la posicióndeseada.En este caso lo que vamos a hacer es leer elvalor de un potenciometro, entre 0 y 1023, yusando la función map() lo vamos a convertir a unvalor entre 0 y 180 grados, con el que moveremosel servo. /*

Page 4: Taller de arduino

En este proyecto vamos a mover un servo siguiendo el movimiento de un potenciometro

Vamos a leer el valor de potenciometro, entre 0 y 1023 y convertirlo a un valor entre 0 y 180

*/

#include <Servo.h> // incluimos la biblioteca Servo

Servo miservo; // creamos un objecto servo para controlar el motor

const int pinServo = 9; // pin del servo

const int pinPotenciometro = A0; // pin del potenciometro

int valPot = 0; // variable para guardar el valor del potenciometro

int angulo = 0; // variable para guardar la posicion del servo

void setup() { miservo.attach(pinServo); // liga el servo al pin 9

}

void loop() { valPot = analogRead(pinPotenciometro); // leemos el

valor del potenciometro angulo = map(valPot, 0, 1023, 0, 180); // convertimos

los valores del potenciometro a los del servo

miservo.write(angulo); // manda al servo la posicion

delay(15); // espera unos milisegundos para que el servo llegue a su posicion }

- al inicio

Variantes

Puedes hacer que el potenciometro gire en unsentido y el servo en el otro.Puedes usar otros sensores analógicos para moverel servo.- al inicio

Referencias:

Page 5: Taller de arduino

Arduino Reference: Servo LibraryReferencia Arduino: Biblioteca Servo

Biblioteca para el manejo y control de servomotores- al inicio

Ejemplos similares en otras páginas:

Knob (ingles) Mando (español)

- al inicioEsta página está siendo creada para apoyar las actividades del 

Taller de Arduino en la Fac. de Ciencias de la UNAM.Para mayor información comunicarse con eduardosac (at) gmail.com

http://arduineando.matem.unam.mx/proyectos/potenciometroServo

Page 7: Taller de arduino

Con questo mini post scopriremo come plottare con Matlab i dati ricevuti da un pin

dell’Arduino. Specialmente nei progetti Meccatronici, risulta inevitabile acquisire i dati,

processarli e generare un’uscita da inviare ad esempio ad un motore elettrico. Nonostante la

sua semplicità, la capacità di calcolo dell’Arduino è ridotta, non si può di certo pensare

alla creazione di matrici ed operazioni ad esse annesse, risulta quindi molto conveniente

sfruttare le capacità di un software di calcolo numerico come Matlab.

COME INIZIAREInnanzitutto occorre stabilire una comunicazione client-server tra Arduino e Matlab,

rifacendoci al precedente articolo “Arduino incontra Matlab!” i passi necessari per installare il pacchetto sono:

scaricare Arduino IO Package dal sito della Mathworks caricare lo  sketck  /pde/adiosrv/adiosrv.pde nell’Arduino

assicurarsi che si possa scrivere sul file pathdef.m in caso contrario cambiare le proprietà, per i possessori di Linux digitare da terminale il comando (il percorso dipende da dove è stato installato Matlab)

 C | 

 copy code | ? 

1sudo chmod 777 usr/local/matlab/R2012a/toolbox/local/pathdef.m

aprire Matlab, includere nella current folder la cartella scaricata ed eseguire il comando

 C | 

 copy code | ? 

1install_arduinoInstallati i protocolli di comunicazione, occorre infine collegare Arduino, e digitare da

Matlab il comando:

 Matlab M | 

 copy code | ? 

Page 8: Taller de arduino

1

2a=arduino('port')

in cui al posto di port per gli utenti di Windows bisogna specificare la porta COM dove

l’Arduino è collegato, ad esempio la COM1, per gli utenti di Linux, al posto di port inserire /dev/ttyUSB0Se è andato tutto a buon fine, sulla Command Window di Matlab appare il seguente messaggio:

 C | 

 copy code | ? 

1

2>> a=arduino('/dev/ttyUSB1');3Attempting connection ........4Basic I/O Script detected !5Arduino successfully connected !6>> REAL TIME PLOTInstaurata la connessione con Arduino, possiamo raccogliere i dati letti da una porta, ed

effettuare su di essi varie operazioni, tra le più comuni visualizzare l’andamento grafico in

tempo reale. Per prima cosa colleghiamo un sensore all’Arduino, in questo esempio è stato

utilizzato un potenziometro angolare multigiro, di seguito viene riportato lo schema

circuitale in Fritzing

In questo caso si è considerato come pin di lettura l’AnalogIn 0, di conseguenza la caduta di

tensione ai capi del potenziometro viene letta da tale pin e, digitalizzata mediante l’A/D

converter dell’Arduino assumerà un valore che varia tra 0 e 1023. 

Page 9: Taller de arduino

Inizializziamo il tempo, il vettore in cui verranno salvati i valori in ingresso all’Arduino,

il passo del ciclo, e la condizione di ciclo:

 Matlab M | 

 copy code | ? 

1

2t=0;3x=0;4interv=1000; % consideriamo 1000 campioni

5passo=1; %abbassando il passo si ha un numero di cicli e quindi si

acquisiscono più dati6

successivamente facciamo partire un ciclo while al cui interno, viene recuperato il dato dalla

porta analogica, salvato in coda al vettore x e plottato:

 Matlab M | 

 copy code | ? 

1

2while(t<interv)3b=a.analogRead(0);4x=[x,b];5plot(x);6

Bisogna però aggiungere qualche riga di codice per completare il tutto ovvero manca di

definire le caratteristiche (limite inferiore e superiore) dell’asse dell’ascissa e

dell’ordinata, inserire la griglia, incrementare la variabile t, ed infine aggiornare il

grafico.  Nel caso in questione il potenziometro adottato varia all’interno della fascia in

ordinata tra i valori 680 e 800.

 Matlab M | 

 copy code | ? 

1

2%sempre all'interno del ciclo while3axis([0,interv,680,800]) %asse_x [0-interv] asse_y [680,800]

Page 10: Taller de arduino

4grid %disegna la griglia5t=t+passo; %aggiornamento della variabile t6drawnow7end %fine del ciclo whileCODICE COMPLETOin definitiva il codice completo da utilizzare in Matlab è il seguente:

 Matlab M | 

 copy code | ? 

01

02t=1;

03x=0;

04while(t<interv)

05 b=a.analogRead(0);

06 x=[x,b];

07 plot(x);

08 axis([0,interv,680,800]);

09 grid

10 t=t+passo;

11 drawnow;

12end

OssPer valori troppo grandi della variabile interv, o per un valore di passo troppo basso, la

dimensione del vettore x potrebbe diventare elevata rallentando la visualizzazione del plot.

ecco il risultato…

http://www.xploreautomation.com/arduinomatlab-real-time-plot/

Page 11: Taller de arduino

CONTROL DE MOTORES CC con Arduino.

Dom 26.10.2014                     CRTL+D, para volver avisitarnos.Creado por: V. García.

Tema: 

PROLOGO.Este artículo, se puede considerar como una aplicación

que puede ser puesta en práctica, de la teoría que sedescribe, en la que se emplean dos motores de corriente

Buscar

Page 12: Taller de arduino

continua cuya aplicación puede responder a la necesidadde un proyecto, utilizando su propia placa PCB o si seprefiere a un pequeño robot, en la que adquirir ciertaexperiencia en esta materia.

También se puede aplicar, sobre la placa de utilidadque, se encuentra en este mismo sitio, con elnombre escudo Arduino, principalmente debido a que estábasado en la creación de una tarjeta con los conectoresdispuestos de tal manera que ésta tarjeta, se puedaconectar directamente en el soporte del propio Arduino,digamos a lomos del mismo.

EL CIRCUITO L293.El circuito integrado en el que nos basaremos es

el L293d, en sus hojas de datos, podemos ver que, estácompuesto por cuatro amplificadores con salidatriestado, capaz de proporcionar una corriente de salidade hasta 1A por canal a tensiones de alimentación desde4'5V a 36V y con una entrada habilitable (chip Enable)que permite un control de salida de dos  amplificadores.Todas sus entradas son compatibles TTL. En el L293b, sedeben utilizar diodos de alta velocidad externos, en lasalida, para la supresión de transitorios inductivos. Enla figura que sigue, se puede apreciar la tabla de laverdad, con la cual debe familiarizarse para tener unconocimiento más amplio de como se comporta estecircuito.

Según las especificaciones el L293b es un integradomonolítico de alta tensión, controlador de 4 canales, dealta corriente. Básicamente esto significa queutilizando este chip, puede utilizar motores decorriente continua y fuentes de alimentación de hasta 36voltios, esos son motores muy grandes y el chip puedesuministrar una corriente máxima de 1A por canal. Elchip L293b es también lo que se conoce como un tipo depuente H (H-Bridge).

Page 13: Taller de arduino

Según el diagrama, este chip pone a nuestra disposicióndos brazos idénticos e independientes, cada uno, constade dos amplificadores comandados por una línea decontrol (EN), con la cual habilitamos el par deamplificadores que nos interese en cada momento. Estadisposición, permite distintos montajes para un motor omás motores, como veremos. Es necesario resaltar la

Page 14: Taller de arduino

existencia en el mercado de dos versiones L293B yL293D,dos diferencias entre ambas, en la versión B, no llevadiodos 'clamp' internos (se puede utilizar un pequeñopuente en los terminales del motor), sin embargo, admitehasta 1Amperio de consumo, en el caso de laversión D,sólo entrega 600mA, llevando los diodos internos. Elusuario debe tomar la decisión de cual utilizar.

El esquema que utilizaremos, está basado en laaplicación del circuito integrado L293b, que como seaprecia en las hojas del fabricante, es un driver de 4canales, con él y unos pocos componentes más, podemoscontrolar fácilmente el giro de un motor o dos motoresde corriente continua, con distintos circuitos demontaje. Además, también se puede controlar un motorbipolar paso a paso.

No debemos olvidar: 1)- Refrigerar en lo posible este circuito integrado, ya que puede adquirirbastante temperatura, compruebe este dato, si va a aplicar de formacontinuada este chip.2)- Utilice un pequeño puente tipo W01F, para evitar disgustos con lastensiones inducidas del motor.

EL ESQUEMA ELÉCTRICO.El circuito eléctrico en el que nos basaremos es el

recomendado por el fabricante del IC y que es mostradoen la siguiente figura. Podemos distinguir dos pares deamplificadores con salidas triestado, con un controlhabilitador (EN) común para ambos, cuyas propiedadesdescubriremos más adelante. Por el momento nosocuparemos de la parte sencilla.

Page 15: Taller de arduino

INICIO SENCILLO.La figura anterior es bastante explicita. Muestra dos

montajes distintos como ya he mencionado. Vamos aempezar por el control de un motor de juguete M1. Eneste ejercicio, he supuesto que no es necesario utilizarel chip L293, ya que, en muchos casos, no tendremos quedesembolsar el costo del circuito integrado, con unpequeño transistor podemos salir al paso.

Las salidas de Arduino, sus pines son ideales paracontrolar directamente los pequeños elementoseléctricos, como los LED. Sin embargo, cuando se tratade dispositivos de consumos más grandes (como un motorde juguete o el de una máquina de lavar), es necesarioun controlador externo. Un transistor es increíblementeútil. Se obtiene una gran cantidad de corriente con una,mucho menor. Un transistor tipo NPN, conectaremos lacarga (M1) al colector del transistor y el emisor alnegativo o masa. Así, cuando la señal alta del pin denuestro Arduino alcance la base, fluirá una pequeñacorriente por R1 (1K) de la base al emisor y lacorriente a través del transistor fluirá y el motorgirará.

Page 16: Taller de arduino

Hay miles de transistores del tipo NPN, que se adaptanperfectamente a todas las situaciones. Como voy autilizar la tensión de 6V de un cargador que tengo amano, he elegido el BC337 un transistor común de usogeneral. Los factores más relevantes en nuestro caso esque la tensión máxima (45 V) y su corriente media (600mA) son lo suficientemente alta para nuestro motor dejuguete. En cuanto al diodo 1N4001 está actuando como undiodo de seguridad.

Veamos una aplicación sencilla, en la que utilizaremosun código de los muchos que existen en la red. Esto esun programa rápido para probar el circuito:

Código control motor CC

CÓDIGO: SELECCIONAR TODO

Page 17: Taller de arduino

//// motorcc.pde//

const int transistorPin = 9;    // connected to the base of the transistor

void setup() {

   // set the transistor pin as output:    pinMode(transistorPin, OUTPUT);}

void loop() {

   digitalWrite(transistorPin, HIGH);   delay(1000);   digitalWrite(transistorPin, LOW);   delay(1000);}

En este ejemplo, vemos que pertenece a un circuitosencillo, con el cual hacemos girar un motor decorriente continua, con intervalos de parada. Debido alo sencillo del mismo, observamos que no se tiene ningúncontrol sobre el motor. Tendría más aplicaciones sipudiéramos, poner en marcha con un interruptor,modificar la dirección de giro y poder variar lavelocidad de giro.

Conmutador por pulsos

CÓDIGO: SELECCIONAR TODO//// motordc.pde// 

Page 18: Taller de arduino

int pot = 2;         // asigna pin analógico 2 para el potint motorPin = 9;    // motor en el pin 9 PWM

void setup()         // ejecutar una vez, cuando empieza{Serial.begin(9600);  // establecer la librería serie a 9600 bps  pinMode(pot, INPUT);   pinMode(motorPin, OUTPUT);}

int getPot() {  int v;  v = analogRead(pot);  v /= 4;  v = max(v, 50);  v = min(v, 255);  return v;}

int motorFoward() {  analogWrite(motorPin, getPot());  delay(10);  digitalWrite(motorPin, LOW);  }

void loop() {            // ejecutar una y otra vez  motorFoward();}

Page 19: Taller de arduino

Para controlar esto desde el exterior, se puedeutilizar un pot en un puerto analógico para variar elnúmero de grados e incrementar su barrido. Puede hacerla práctica, copie el código o bajelo de aquí y cárgueloen el IDE, para ver su efectividad.

Qué ocurre. El motor gira desde un mínimo de velocidadhasta el máximo según giremos el pot, sin embargo, seobserva que el motor pierde fuerza de torsión (parmotor, torque en inglés), esto puede ser debido enparte, al transistor que utilicemos, pero es más propioque sea debido al código del programa que no se adecua alo que esperábamos. Debemos pensar en otro método paralograr nuestro propósito.

Este es un código bastante bueno, para el control de unmotor de corriente continua que, se comporta muyparecido al código anterior.

Control motor con pot.

CÓDIGO: SELECCIONAR TODO// //    Funccion: CC_motor_control_pot//// Utilizar un potenciometro para controlar motorCC//  

int sensor_pin = 2; // debe ser una entrada analógicaint motor_pin = 9;  // debe ser una salida digital PWM. 

void setup() { Serial.begin(9600);pinMode(motor_pin, OUTPUT)}

Page 20: Taller de arduino

void loop() { int pot_val, motor_speed;pot_val = analogRead( sensor_pin );motor_speed = pot_val*255.0/1024.0; // Incluir decimal/* Sutil: No utilice valores enteros como 255 y1024 aquí. Compiladores agresivo pre-cálculola división entera del 255/1024 como cero.*/analogWrite( motor_pin, motor_speed); // hacer cosas útiles}

Indagando sobre el tema, he llegado a encontrar unafunción reutilizable para actualizar la velocidad delmotor, veamos unas cuestiones a tener en cuenta. Elajuste de la velocidad del motor se establece dentro dellazo loop(), en realidad la parte más relevante seencuentra en el llamado map (), donde los valores leídosdel potenciómetro se escalan a la salida.

Así pues, necesitamos ...

UNA FUNCIÓN PARA TRADUCIR LAS ESCALAS LINEALES.

El escaladolineal de losvalores de x paravalores de y:

y = f(x)

donde f es unmapeado lineal.

Page 21: Taller de arduino

Es decir, dados: x, xmin, xmax, ymin eymax. Calcular y

UNA FUNCIÓN PARA TRADUCIR LAS ESCALAS LINEALES.

Entradas que necesitamos: pin de potenciómetrosensor, pin de salida del motor.   Que tareas vamos a abordar:

Leer tensión del potenciómetro.  Convertir voltaje con escalas de 10 bits a 8 bits PWM y  Cambiar la velocidad del motor.

Introduzca el código de la parte inferior en su boceto.Observe que, el código no está dentro de ningún bloquede otro programa (como setup() ovoid()), es parte de unafunción. ¿Cómo comprobar que esta función estáfuncionando?

int int_scale(int x, int xmin, int xmax, int ymin, intymax) {   int y; y = ymin + float(ymax - ymin)*float( x -xmin )/float(xmax - xmin);  return(y);  }

Este código, es esencialmente una reimplementaciónintegrada de la funciónmap, por los creadores delArduino. Ver http://arduino.cc/en/Reference/Map

Nota.- int Devuelve un entero.   int_scale Es el nombre de la función.   int x Es la primera entrada llamada x.   float Se usa float para una mejor precisión.   return(y) Devuelve el valor almacenado en y.

Page 22: Taller de arduino

Funciones que llaman a otras funciones: (int x, int xmin, intxmax, int ymin, int ymax);

   motor_speed = int_scale(int x = pot_val, int xmin = 0, intxmax = 1024,int ymin = 0, int ymax = 255);

Donde: return(y) = motor_speed

A continuación, a modo de ejemplo, veremos un códigoque usa la funciónint_scale.

Control motor con pot.

CÓDIGO: SELECCIONAR TODO//// Funccion: CC_motor_control_pot//// Utilizar un potenciometro para controlar motorCC

int sensor_pin = 2;   // debe ser una entrada analógicaint motor_pin = 9;    // debe ser una salida digital PWMt

void setup() { Serial.begin(9600);pinMode(motor_pin, OUTPUT)}

void loop() { 

int pot_val, motor_speed;pot_val = analogRead( sensor_pin );motor_speed = int_scale( pot_val, 0, 1024, 0, 255;

Page 23: Taller de arduino

analogWrite( motor_pin, motor_speed);}

int int_scale(int x, int xmin, int xmax, int ymin, int ymax) {int y; y = ymin + float(ymax - ymin)*float( x - xmin )/float(xmax - xmin);return(y);}

Si comprueba este código, observará que el incrementode velocidad propuesta por el potenciómetro, se percibecomo una continuidad lineal. Esta es la mejora esperada.

CONTROL EL CIRCUITO INTEGRADO L293.Hemos probado a utilizar un transistor a la salida de

un pin de Arduino y no hemos quedado satisfechos con losresultados. Cabe la posibilidad de utilizar dostransistores en sendos pines, cada cual conduciría unborne del motor, como diría, el motor entre dos pines,pero no quiero perder más tiempo. Es el momento deutilizar el L293, en una de las aplicaciones que vienenen las hojas de especificaciones.

Además con el L293, no tiene que preocuparse por laregulación de una tensión mayor, ya que permite dosfuentes de energía - una fuente directa, hasta 36 V paralos motores y otra de 5V, para controlar el CI que,puede ser conectada a la fuente de alimentación ya queel suministro de alimentación del motor proviene esindependiente. En el circuito de abajo, se supone unaalimentación superior para el motor. A continuación sepuede ver la disposición de las conexiones para el chipy el motor. La tabla de verdad muestra la lógica de lasalida.

Page 24: Taller de arduino

El puente H, es normalmente un circuito eléctrico quepermite aplicar un voltaje a través de una carga encualquier dirección a una salida, por ejemplo, motor.Esto significa que esencialmente puede invertir ladirección de la corriente y por lo tanto invertir ladirección del motor. Lo único que a de recordar es que,la conexión a tierra debe ser compartida, común paraambas fuentes.

En este circuito que sigue, no se trata más que de uncontrol bidireccional, por lo tanto, no se hacenecesario el puente H, lo que resulta más sencillo entodos los sentidos. Si nos fijamos en la tabla de verdadque aparece arriba, quedan claras las opciones que nospresenta, he de resaltar que la entrada EN (patilla 1),puede ser definitoria.

Veamos cómo es esto, en cualquier momento. Si se aplicaun 1 lógico sobre A1, en la entrada A2, tenemos queaplicar un 0 lógico, esto hará girar el motor en unsentido predeterminado. Para cambiar el sentido de giro,y respetando las reglas de la mecánica, primeropondremos A1 y A2 en un mismo estado lógico y actoseguido invertiremos el estado inicial, es decir, A1 en0 lógico y A2 en 1 lógico.

Con independencia del estado lógico de las entradas A1y A2, si es necesario detener el motor, simplementeenviamos un estado lógico bajo (0) a la patilla EN y elmotor se para de inmediato. En estas condiciones no esposible mover el motor, no hasta que, a dicha entrada

Page 25: Taller de arduino

EN, le enviemos un 1 lógico, en ese momento, podemosdecidir el sentido de giro o la parada del mismo con losvalores lógicos que apliquemos a las patillas A1 y A2.Aunque, lo esencial de esta entrada EN, es que siaplicamos una salida PWM a ella, simplemente podremosregular la velocidad del motor, esta es sufuncionalidad. Ver el esquema eléctrico.

Por seguridad, recomiendo que, conecte una fuenteexterna de alimentación de corriente continua a laentrada de alimentación externa de Arduino, así, puedealimentar el motor y el Arduino. Además, puede dejarconectado el cable USB, para una fácil y rápidareprogramación, si fuera necesaria. De esta forma,cualquiera que sea el motor que utilice, se asegura quela fuente de alimentación es compatible, naturalmente,no utilice un motor de 5V con una alimentación de 12V.

EL CÓDIGO.

Page 26: Taller de arduino

La teoría es bastante sencilla. Se trata de poner, unestado lógico 1 en la entrada A1, al mismo tiempo que enla A2 ponemos un 0 lógico. El código para este caso essencillo, veamos un ejemplo:

Control motor con pot.

CÓDIGO: SELECCIONAR TODO/* * motorpwmpot.pde** Hace girar un motor de CC mediante un L293 conectado a los pines digitales* 7 y 8 controlando la velocidad por PWM sobre elpin Enable del L293 en base* a la lectura de un potenciometro conectado al pin analógico 2* * Basado en un código de: Miguel Grassi* www.miguelgrassi.com.ar** Modificado por: V. García el 07.02.2011* */ 

int ledPin = 13;     // LED conectado al pin digital 13

int pinA1 = 7;  // entrada Motor A 1int pinB1 = 8;  // entrada Motor B 1int pinEN1 = 9; // entrada EN 1int pinPot = 2; // Lectura analógica del Potenciometroint valorPot= 0;int valorVeloc = 0;

Page 27: Taller de arduino

void setup() {  // Inicializa los pines de salidapinMode(ledPin, OUTPUT); pinMode( pinA1, OUTPUT); pinMode( pinB1, OUTPUT); pinMode(pinEN1, OUTPUT); pinMode(pinPot, INPUT); digitalWrite(pinEN1, HIGH); // linea es la clave,RPASerial.begin(9600); 

// El LED parpadea 3 veces. Esto debería ocurrir sólo una vez.// Si usted ve el parpadeo del LED tres veces, significa que // se restablecio (reset) el propio módulo. Probablemente porque// el motor provocó una bajada de voltaje o un corto. blink(ledPin, 3, 100); }

void loop() { digitalWrite( pinA1, HIGH);  // Valores ALTO en Ay BAJO en B simulaneamentedigitalWrite( pinB1, LOW);   // hacen girar el motor 1 hacia ADELANTEvalorPot = analogRead(pinPot); // Lee el valor del potenciometrovalorVeloc = map(valorPot, 0, 1023, 55, 255); //Convierte un valor entre 0 y 1023 al rango 0-255// valorVeloc = valorPot / 4 ;   // segunda opciónanalogWrite(pinEN1, valorVeloc);// y establece lavelocidad del motor con ese valor}

Page 28: Taller de arduino

/* blinks an LED */void blink(int whatPin, int cuantoTiempo, int milliSecs) {for (int i = 0; i < cuantoTiempo; i++) {digitalWrite(whatPin, HIGH);delay(milliSecs/2);digitalWrite(whatPin, LOW);delay(milliSecs/2);}}

El código está bastante bien descrito y no consideronecesario entrar en mayores detalles. Copie el código osi lo prefiere, bájelo de aquí y cárguelo en el IDE,para comprobar su efectividad.

He realizado este ejemplo, utilizando un escudo paraArduino, realizado con placa de tiras preformada, comose puede apreciar en la imagen de abajo, el esquemautilizado corresponde a la imagen anterior. Sigue unademo del resultado obtenido.

Vídeo.

EL L293El circuito integrado L293B, es un driver de 4 canales,

capaz de proporcionar una corriente de salida de hasta1A por canal. Cada canal, se puede controlar por señalesde entrada compatibles TTL y cada pareja de canalesdispone de una señal de habilitación que desconecta lassalidas de los mismos.

Page 29: Taller de arduino

Ahora, vamos a ocuparnos del código necesario paracontrolar un motor de corriente continua con Arduino. Hedecidido probar una idea para que los que tengan interésen hacer su primer mini robot, empiecen con unaexperiencia que les anime y levante la moral.

La idea es que con un motor de juguete, movamos el ejedelantero de una pequeña caja, cualquier recinto pequeñonos puede servir, en esta, tiene que alojar las cuatropilas de 1'5V con su porta pilas, el propio Arduino, elmotor, el soporte del eje y una rueda de giro libre entodas direcciones. Algo parecido a la imagen.

Las fotos, aunque corresponden a otro ejercicio (cosaque no es relevante), dan una idea de lo que sedescribe. La práctica demostrará cómo mover un objeto(bot-tarrina), con un sólo motor y un interruptor deltipo 'bumper'. Cuando conectemos la tensión, el Arduinomandará una señal al motor para que gire, por un tiempo,lo que hará avanzar el pequeño robot. Cuando éste,encuentre un obstáculo, lo detectará con el interruptorque tropezará con el objeto estático, esto producirá unaseñal/orden en el programa, de modo que el motorcambiará su dirección de giro por un tiempo determinado,tras el cual volverá a girar en la dirección de inicio.Las direcciones son mecánicamente, bastante aleatorias.

Page 30: Taller de arduino

Sólo se trata de un ejemplo, de como manejar un pequeñorobot con un mínimo de componentes. El siguiente es elcódigo que se encarga de realizar estos cambio dedesplazamiento. El código como se hace notar, lo headaptado a mis necesidades, con un pequeño cambio.

Control motor con Puente-H.

CÓDIGO: SELECCIONAR TODO/* Control de un motor DC con puente H* motorL293h.pde* * http://itp.nyu.edu/physcomp/Labs/DCMotorControl* * Modificado por V. Garcia el 08.02.2011* * Puede adaptarse a un bot con un motor en las ruedas de traccion* y una rueda de giro libre que pivote cambiando la direccion *

int switchPin = 2;  // entrada del switch int motor1Pin = 7;  // pin 1 del L293int motor2Pin = 8;  // pin 2 del L293int speedPin = 9;   // pin enable del L293 int ledPin = 13;    //LED 

void setup() {// pone el switch como una entradapinMode(switchPin, INPUT); digitalWrite(switchPin, HIGH); // pone todos los otros pines usados como salidas pinMode(motor1Pin, OUTPUT); pinMode(motor2Pin, OUTPUT); 

Page 31: Taller de arduino

pinMode(speedPin, OUTPUT);pinMode(ledPin, OUTPUT);

// activa la RPA del pin speedPin para activar elmotordigitalWrite(speedPin, HIGH); 

// El LED parpadea 3 veces. Esto debería ocurrir sólo una vez.// Si usted ve el parpadeo del LED tres veces, significa que // se restablecio (reset) el propio módulo. Probablemente porque // el motor provocó una bajada de voltaje o un corto. blink(ledPin, 3, 100);}

void loop() {// si el switch es high, motor gira en una direccionif (digitalRead(switchPin) == HIGH) {  digitalWrite(motor1Pin, LOW);  // pone motor1 del H-bridge low  digitalWrite(motor2Pin, HIGH); // pone motor2 del H-bridge high} 

// si el switch es low, motor gira en la otra direccion:else {   digitalWrite(motor1Pin, HIGH); // set leg 1 ofthe H-bridge high   digitalWrite(motor2Pin, LOW); // set leg 2 of the H-bridge low   blink(switchPin, 2000, 2); // si pulsas switch

Page 32: Taller de arduino

cambia giro un tiempo  }}

/* blinks an LED */ void blink(int whatPin, int cuantoTiempo, int milliSecs) {  int i = 0;  for ( i = 0; i < cuantoTiempo; i++) {   digitalWrite(whatPin, HIGH);   delay(milliSecs/2);   digitalWrite(whatPin, LOW);   delay(milliSecs/2); }}

Una vez más, si lo desea, puede copiar y pegar estecódigo, déle un nombre y cárguelo en su Arduino.

En los ejercicios que se han desarrollado en estedocumento, aunque hemos utilizado el circuito integradoL293, tan sólo se ha empleado de los cuatro, unamplificador para manejar el motor o dos amplificadores,uno para cada devanado del motor. La parte más relevantede este circuito integrado, está en utilizar los cuatroamplificadores de forma que se conoce como Puente-H.

Después de lo tratado hasta el momento, en estedocumento, estamos preparados para comprender y

Page 33: Taller de arduino

emprender el montaje del L293 en puente-H, para elcontrol de un motor. Es cierto que el control demotores, también se puede ejercer con un circuitointegrado como es el ULN2003 que integra una matriz desiete transistores darlington, capaces de entregar hasta500mA cada uno y la versión ULN2803, con una matriz deocho transistores darlington. Este último, se utiliza enlos casos que se tienen que controlar más de un motor ysobre todo, con motores unipolares.

Los motores que hemos manejado hasta el momento sonmotores de corriente continua (DC), en próximosartículos desarrollaremos controles para motores paso apaso bipolares y unipolares. El control de un motorunipolar, es más sencillo que el del motor bipolar,debido a la manera de energizar los devanados.

Esto es todo, por este simple tutorial. Si tieneinterés en leer más sobre Arduino, revele esta sección.(Mostrar/Ocultar)

Volver al  Ídice  de artículos Arduino.

Creada el: 02.05.2011 Actualizada el: 01/02/2013      

Desarrollado por V.García © 1998, 2000, 2002, 2006, 2008, 2010, 2011.

Como se puede comprobar, no tenemos patrocinador. Sin anuncios quemolesten, esto lo agradece el lector. 

Desde que se inició la andadura, en marzo del 1998 hasta el momento,el mantenimiento de este sitio, lo asume el propio autor.Soporte | declaración de privacidad | LSSI | Póngase en contacto con nosotros 

http://hispavila.com/3ds/atmega/motorescc.html

Page 34: Taller de arduino