Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Introducción.
Son muchas las páginas en la red que hablan de las resistencias y cómo
identificarlas por sus colores, todas muy buenas y con la misma información,
pero en muy pocas se encuentra el pilar de la electrónica, aquel enunciado
conocido por todo el mundo, en cambio, por unas u otras causas se olvida y
es que erróneamente damos por sentado que se conoce. Siempre puede
empezar por el principio, si le interesa le invitamos a que siga próximo enlace
de apuntes de la electricidad.
Hay muchos que nos piden que les indiquemos dónde han de buscar para
aprender los principios de la electrónica, por este motivo aquí se va a tratar
de documentar en parte estos principios y de esta forma aquellos, se inicien,
estamos seguros que será así.
Este es el principal motivo por el que nos propusimos crear esta página que,
creemos no pasará desapercibida, estamos convencidos que habrá muchos
visitantes que acudan a ella para tomar nota y a lo mejor, alguno, hasta
aprende algo sobre los fundamentos básicos de electrónica. Ya en la lección
9, se hizo un esbozo de los principios de la corriente eléctrica, en ella se dice:
Corriente eléctrica.
"He de mencionar aquí que, esta es la definición que recuerdo desde que
empecé mis estudios de electricidad y posteriormente electrónica, decía así:
- Cuando se mueven cargas eléctricas de un mismo signo, se
establece una corriente eléctrica. La corriente eléctrica, es el flujo
de electrones por los conductores eléctricos, por los cuales se
mueven fácilmente, debido a la diferencia de potencial creada por
un generador de corriente eléctrica.
Los generadores eléctricos son dispositivos en los que, a expensas
del consumo de energía mecánica, calorífica o química, se efectúa el
trabajo necesario para desplazar los electrones por un circuito
cerrado y ponerlos en movimiento, venciendo la resistencia que el
generador y conductores oponen a su paso.
La corriente eléctrica se definió por un flujo de electrones positivos y
se fijo un sentido convencional de circulación de la corriente, desde
el polo positivo al negativo, posteriormente se observó que, en los
metales los portadores de cargas negativas son electrones, los
cuales fluyen en sentido contrario al convencional. -
En el Sistema Internacional, la unidad de intensidad (I) de la corriente
eléctrica es el amperio, representado por el símbolo A y es la intensidad de
una corriente tal que hace fluir cada segundo un culombio. [Q = I x t]
Fuerza electromotriz.
Conocida como f. e. m. es el impulso que se desarrolla en los generadores
eléctricos, absorbiendo los electrones de un polo (+) y acumulándolos al otro
polo (-). La unidad de fuerza electromotriz es el voltio (V). Es la f. e. m. de un
generador que establezca una corriente de un amperio en un circuito cuya
resistencia total (interna del generador más la del circuito) (R) de un Ohmio,
se puede calcular por la conocida Ley de Ohm: V = I x R.
Se pueden distinguir dos tipos de electricidad, la electricidad estática y la
electricidad dinámica. La electricidad dinámica puede ser de corriente
continua (CC) o corriente alterna (CA).
Corriente Continua.
La Corriente Continua implica un flujo de carga que fluye siempre en una sola
dirección. Los electrones en el circuito se mueven siempre en la misma
dirección, del polo positivo al polo negativo. Si la corriente se mueve a
impulsos, siempre que lo haga en una sola dirección es Corriente Continua.
Corriente Alterna.
La Corriente Alterna se comporta como su nombre indica. El flujo de
electrones del circuito se desplazan primero en una dirección y luego en
sentido opuesto, de forma alterna. Esto se consigue alternando la polaridad
del voltaje del generador o alternador. La Corriente Alterna, se puede
transmitir a grandes distancias mediante elevadas tensiones que reducen las
pérdidas en los cables. "
Para una mejor descripción vamos a considerar una instalación eléctrica, así
pues, cuando ésta se pone en funcionamiento podemos decir que está
constituida al menos por un circuito cerrado, por el cual circula una corriente
que le permite su funcionamiento. Partiendo de este enunciado como luego
se verá, los circuito pueden estar formados por distintas ramas que por su
formación se dividen en circuitos serie, circuitos paralelo y a su vez pueden
estar formados por la combinación de ambos tipos combinados entre sí.
Todos los circuitos se rigen por unas reglas naturales a las que los hombre
les hemos dado el rango de leyes. Estas leyes se basan en la llamada Ley de
Ohm que es quien la descubrió, de esta Ley se derivan todas las demás y
estas leyes son las que, nos permiten conocer anticipadamente los resultados
que se prevén dándolos por buenos, en otros casos se encargan de evitarnos
largos procesos que no llevarían a ninguna parte, ya que con el calculo
desarrollado nos dicen la inviabilidad del proyecto. Y sin más dilación, vamos
a ocuparnos de los siguientes temas:
La Ley de Ohm
Circuitos serie
Circuitos paralelo
Circuitos mixtos
El shunt
Las Leyes de Kirchoff
Divisores de tensión
La Ley de Ohm
George Simon Ohm, descubrió en 1827 que la corriente en un circuito de
corriente continua varía directamente proporcional con la diferencia de
potencial, e inversamente proporcional con la resistencia del circuito. La ley
de Ohm, establece que la corriente eléctrica (I) en un conductor o circuito, es
igual a la diferencia de potencial (V) sobre el conductor (o circuito), dividido
por la resistencia (R) que opone al paso, él mismo. La ley de Ohm se aplica a
la totalidad de un circuito o a una parte o conductor del mismo.
I=V/R ;
V=IxR
En los circuitos de corriente continua, puede resolverse la relación entre la
corriente, voltaje, resistencia y potencia con la ayuda de un gráfico de
sectores, este diagrama ha sido uno de los más socorridos:
Fig. 01
Fig. 02
Fig. 04
Estos son los cálculos:
Fig. 05
Las pequeñas variaciones son debidas a las fracciones decimales
despreciadas.
Circuitos paralelos.
Los circuitos paralelos se caracterizan por estar formados por dispositivos
cuyas respectivas resistencias están en paralelo respecto a la tensión de
alimentación. La particularidad de un elemento que está en paralelo con otro
es que la tensión en ambos es la misma, en cambio la corriente total del
circuito es la suma de la corriente que atraviesa cada carga. Para calcular la
resistencia total de un circuito paralelo, la formula que utilizaremos es la que
sigue:
Fig. 06
Un nuevo ejemplo puede aclarar más el tema. Entre los puntos A y B del
circuito siguiente se aplica una tensión de 12 V. Qué intensidad circulará por
el circuito, cual es la intensidad en cada resistencia y de qué potencia debe
ser cada resistencia.
Fig. 07
El calculo nos indica que la resistencia total es de 56'38 Ω y de este resultado
obtendremos la solución del resto. Así que, la intensidad que atraviesa R1
será el cociente de la tensión por la resistencia que será 0'1A, en R2 será de
0'066A y en R3 será de 0'046A, por lo tanto la corriente en el punto A o en el
B será la suma de estos, es decir 0'212A o sea 212 mA.
Hallar el consumo total, es fácil aplicando la formula adecuada. Si aplicamos
PT = I2 * R = 2'55W y si aplicamos PT = V * I = 2'54W como vemos en la
práctica es el mismo resultado. La potencia de R1 es de 1'2Wat, la de R2 es
de 0'792Wat y la de R3 es de 0'552Wat, al sumar estas potencias
encontramos la coincidencia con la potencia total de 2'544Wat.
Circuitos mixtos.
Estos circuitos son combinaciones del tipo serie y paralelo, su resolución
resulta ser un poco más laboriosa, sin embargo, el nivel de dificultad sigue
siendo el mismo. Para comprender mejor la dinámica a seguir pondremos un
ejemplo que nos ayude a comprenderlo mejor.
La propuesta es, con los datos presentados en la figura 08, queremos
conocer el valor de R1, la tensión E del Generador, la corriente total IT que
suministra al circuito y la PT.
Fig. 08
Cálculos:
Como siempre ayudándonos del gráfico del principio, vamos a dar solución al
problema planteado. Primero la tensión entre A-B será el producto entre R3 y
la corriente que la atraviesa 2A que, nos da 120V. V A-B = 120V.
La intensidad en R2, ahora es fácil de hallar, es el cociente de la tensión A-B y
su resistencia, esto es 1A. En cuanto a la corriente que fluye por R 1 es,
también el cociente del cuadrado de la tensión A-B y la potencia en R1=
360W, esto nos da para R1 = 40 Ω.
De aquí obtenemos la intensidad que la atraviesa, esto nos indica que la
intensidad en R1 es de 3A. Así podemos saber que, la corriente total del
circuito es de 6A que atraviesan a R4 y la tensión en sus extremos (B-C) será
de 54V. La potencia total se obtiene del producto de: PT =174 * 6
=1044W
La tensión del generador G, sabiendo que su resistencia interna es 1 , la
tensión en G es, V= 6 * 1 = 6V, que sumados a los 174 nos da 180V, en el
interior de G la tensión es 180 pero G tiene una resistencia interior de 1 así
al exterior sólo presenta los 174V.
Resistencia de absorción.
Cuando necesitamos conectar un equipo a un generador o fuente de tensión,
cuya tensión es mayor de la que exige el circuito, podemos poner una
resistencia en serie que reduzca la tensión de diferencia. Esta resistencia
toma el nombre de resistencia de absorción, su cálculo se lleva a cabo con
esta formula:
Ra =
Resistencia de
Vd - Vu absorción
Ra = ------------- Vd = Tensión
disponible
I Vu = Tensión útil
I = Corriente
necesaria
El shunt.
Es el acoplamiento de una resistencia a un galvanómetro, si llamamos R s a la
resistencia del shunt y Rg a la del galvanómetro, así como Is e Ig a las
intensidades del shunt y del galvanómetro respectivamente, entonces
evidentemente la intensidad total IT será:
I = Is + Ig ; y también
Is * Rs = Ig * Rg
Fig. 09
Por definición se le denomina poder multiplicador m, a la relación entre la
intensidad de línea I y la intensidad ig de G y es la constante por la que hay
que multiplicar ig para obtener la intensidad de línea I.
I
m = ------- ; [1
ig ]
I = ig +
ix
rg
rs =-------- [4]
m-1
Esta última es la expresión de la resistencia del shunt en función de la
resistencia del galvanómetro y del poder multiplicador.
[2
a]
La cual podemos recordar mejor con esta nueva formula [2a].
Resistencia de compensación.
En muchas ocasiones, ocurre que en medidas eléctricas hay que 'shuntar' un
miliamperímetro sin que varíe la resistencia intercalada en el circuito, evitando
de este modo que se falsee la lectura, para ello, se coloca en serie con el
galvanómetro y el shunt una resistencia Rx (resistencia de compensación), tal
que el nuevo conjunto presente una resistencia rg idéntica a la que
presentaba el galvanómetro sólo.
Fig. 10
rg * r s
--------- + RX =
rg
rg + rs
de donde;
[
5]
Shunt universal.
El shunt universal tiene la ventaja de presentar varios multiplicadores en el
mismo medidor, pudiendo elegir uno u otro según convenga. Su esquema
(utilizado en los amperímetros), se muestra a continuación:
Fig. 11
Veamos otro método con una evidente diferencia en la construcción. En esta
ocasión según se aprecia en la figura 06, siguiente todas las resistencias se
encuentran de algún modo sometidas al paso de la corriente, la cual dispone
de dos caminos para su recorrido, pero como siempre una imagen mejor que
...
Fig. 06
La corriente I (en la entrada de 500µA) recorre dos caminos, uno por 460µA y
por el otro 40µA, como se ve y hemos comentado. Para obtener más
información sobre los cálculos específicos recomendamos visitar la
documentación puentes de medida.
Fig. 13
En la figura anterior, la suma de las caídas de voltaje en R1, R2 y R3 deben
ser igual a 10V o sea, 10V =V1+ V2+ V3. Aquí un ejemplo:
Fig. 14
Otro ejemplo:
Supongamos que queremos saber la potencia de cada fuente de tensión y la
potencia que disipa cada resistencia en el siguiente circuito:
Fig.14
para I1 y
para I2
Fig. 15
Puede calcularse el voltaje en R1 usando la ecuación:
Project 1 - LEDS
01_Blink
Esquema en Fritzing
Abrimos Arduino y una vez dentro de el, pulsamos el boton OPEN (El que tiene
la flechita hacia
arriba), vamos al submenu DIGITAL y abrimos el ejemplo BLINK.
Codigo del ejemplo Blink de Arduino
TrAFFIC LIGHTS
We are now going to create a set of UK traffic lights
that will change from green to red, via amber, and
back again, after a set
length of time using the
4-state system. This
project could be used
on a model railway to
Connect it up
This time we have connected 3 LEDʼs with the Anode
of each one going to Digital Pins 8, 9 and 10, via a
220Ω resistor each.
We have taken a jumper wire from Ground to the
Ground rail at the top of the breadboard and a ground
wire goes from the Cathode leg of each LED to the
common ground rail.
Enter the code
Enter the following code, check it and upload.
If youʼve read up on Projects 1 & 2 then this code will
be self explanatory as will the hardware.
In the next project, we are going add to this project by
including a set of pedestrian lights and adding a push
button to make the lights interactive.
/*
Fade
*/
int brightness = 0; // how bright the LED is
int fadeAmount = 5; // how many points to fade the LED by
void setup() {
// declare pin 9 to be an output:
pinMode(9, OUTPUT);
}
void loop() {
// set the brightness of pin 9:
analogWrite(9, brightness);
Esquema en Fritzing
Codigo del ejemplo Arrays de Arduino
int timer = 100; // Variable para controlar el retardo del loop (100 milisegundos)
void setup() {
void loop() {
/* Bucle FOR para ir encendiendo de uno en uno los leds. Funciona asi:
Para el PRIMER led...lo enciendo durante los milisegundos que he indicado con la variable
timer...y lo apago...enciendo el SEGUNDO led, etc...
*/
/* Bucle FOR para ir encendiendo de uno en uno los leds. Funciona asi:
Para el ULTIMO led...lo enciendo durante los milisegundos que he indicado con la variable
timer...y lo apago...enciendo el PENULTIMO led, etc...
*/
//int timer = 60; // Variable para controlar el retardo del loop (100 milisegundos)
int ledPins[] = { 2, 3, 4, 5, 6, 7 }; // Array de los pines donde conectaremos los LEDs
int pinCount = 6; // Longitud de la Array
void setup() {
Serial.begin(9600);
int thisPin; // Variable temporal
// La Array esta numerada desde 0 hasta (pinCount – 1), es decir de 0 a 5
// Usamos un bucle FOR para inicializar cada pin como SALIDA
for (int thisPin = 0; thisPin < pinCount; thisPin++) {
pinMode(ledPins[thisPin], OUTPUT);
}
}
void loop() {
valor = analogRead(potPin);
timerMapeado = map(valor,0,1023,50,200);
/* Bucle FOR para ir encendiendo de uno en uno los leds. Funciona asi:
Para el PRIMER led...lo enciendo durante los milisegundos que he indicado con la variable
timer...y lo apago...enciendo e l SEGUNDO led, etc...
*/
for (int thisPin = 0; thisPin < pinCount; thisPin++) {
digitalWrite(ledPins[thisPin], HIGH);
delay(timerMapeado);
// Serial.println(timerMapeado);
digitalWrite(ledPins[thisPin], LOW);
}
/* Bucle FOR para ir encendiendo de uno en un o los leds. Funciona asi:
Para el ULTIMO led...lo enciendo durante los milisegundos que he indicado con la variable
timer...y lo apago...enciendo el PENULTIMO led, etc...
*/
for (int thisPin = pinCount - 1; thisPin >= 0; thisPin --) {
// Encendemos el LED
digitalWrite(ledPins[thisPin], HIGH);
delay(timerMapeado);
// Apagamos el LED
digitalWrite(ledPins[thisPin], LOW);
}
}
Fading
En este sencillo experimento vamos a provocar que un led se apague poco a
poco.
Una posible traduccion al español del "Fading" es "Desvanecimiento".
Codigo
int value = 0; // variable para conservar el valor actual
int ledpin = 9; // Led conectado al pin 9
void setup()
{
// Nada que configurar
}
void loop()
{
for(value = 0 ; value <= 255; value+=5) // Desvanecimiento del led desde el minimo al maximo
{
analogWrite(ledpin, value); // Configura un valor (rangeo desde 0 a 255)
delay(30); // Espera 30 milisegundos para ver el efecto
}
for(value = 255; value >=0; value -=5) // desvanecimiento desde el maximo al minimo
{
analogWrite( ledpin, value);
delay(30);
}
}
Pulsadores
Introducción
Que son los pulsadores. Pulsadores o interruptores, hay toneladas de ellos en su
casa. Un interruptor es un dispositivo simple con dos posiciones, EN y AP
(ENcendido y APagado). Una clase de interruptor que usted usa cada día es el
interruptor de la luz. Cuando conecta, dentro del interruptor, dos cables son unidos,
lo que permite fluir a la corriente que enciende la luz o la tostadora se caliente.
Cuando lo desconecta, los dos cables son desunidos y corta el flujo de la corriente.
Esto esta muy bien pero creo que esto no es lo que interesa aquí.
En definitiva, se trata de un mecanismo simple (los hay muy sofisticados),
constituido por un par de contactos eléctricos que se unen o separan por medios
mecánicos. En electricidad, los falsos contactos que se producen el ser utilizados
normalmente, en algunos casos produce una chispa debido a la corriente que
atraviesa los contactos, provocando que quemen en parte y ennegreciendo los
contactos eléctricos, lo que a la larga acaba deteriorando dichos contactos. La
chispa se produce siempre al separar los contactos (desconectar), en ocasiones
parece que también salta al conectarlos, eso es debido a los rebotes mecánicos que
se producen al cambiar de estado.
Esto que en electricidad se considera normal, en electrónica es un verdadero nido
de problemas, debido a dichos falsos contactos. Por su propia naturaleza, al
cambiar de posición un interruptor, los contactos chocan entre sí y esto significa una
serie de falsos contactos que se reproducen de un modo sin control, por lo que se
generan los temidos rebotes (debounce en inglés), estos rebotes, se producen
incluso cuando unimos dos cables desnudos, simulando un interruptor o pulsador.
Pulsadores.
Estos pequeños pulsadores son un 1/4 " por cada lado, son bastante económicos
y se pueden 'pinchar' directamente en una placa de prototipado. Estos dispositivos
mecánicos tienen 4 patillas, que pueden hacernos pensar que hay 4 cables que son
EN y AP, pero de hecho, dos de cada lado en realidad dentro están unidos. Por
tanto realmente, este pulsador es solamente un pulsador de 2 cables.
Como digo, en electrónica los rebotes suelen fastidiar a los intrépidos recién
iniciados que creen en la teoría y sin embargo se salta este punto en muchas
ocasiones, lo que les lleva a recordar la importancia que tiene el antirrebote.
Resistencias de polarización.
Cuando nos de desenvolvemos en el entorno de los microcontroladores, nos
encontramos con un término poco común, me refiero a la polarización de una E/S,
debemos saber que hay dos tipos de polarización, polarización alta la resistencia va
conectada a + (5V) (término inglés Pullup) o polarización baja la resistencia va
conectada a masa - (0V) (término inglés Pulldown). Siguen dos esquemas de estos
términos:
Resistencia polarización baja. Resistencia polarización alta.
Si disponemos los tres componentes del esquema para realizar el circuito que
representa, cada vez que se presione el pulsador, el LED irá a EN (encender) y al
ser liberado el pulsador el LED irá a AP (apagar).
Pulsador.
Vamos a hacer nuestra primera prueba de botón (pulsador) conectando un LED en
nuestra tarjeta Arduino. El símbolo del esquema para un pulsador de botón es algo
diferente que el mostrado. Prepare un LED rojo y una resistencia de 10K Ohms, así
como el pulsador de botón y construya un montaje del esquema en su tabla de
prototipado cerca del Arduino.
El código.
En primer lugar, quiero recordar al lector que debe documentar sobre la marcha
los códigos, esto hará que no pierda tiempo posteriormente, cuando quiera reutilizar
alguna rutina de este listado, para no volver a escribir tanto código.
Como siempre, es buena costumbre darle un nombre al principio del archivo
dentro del mismo y una pequeña descripción de que hace o para que sirve, fecha de
creación, autor, etc. Así que empecemos.
Este es el listado del código que utilizaremos en esta ocasión, servirá para el caso.
Como se ve, es propiedad de Massimo Banzi (gracias). Copiar este código y
guardarlo con el nombre pulsador03.pde en la carpeta destino de vuestros ejemplos
o ejercicios, para comprobar su funcionamiento.
/* Pulsador y LED
*
* Detectar si el botón ha sido presionado o no y encender
* el LED en consecuencia.
*
* Basado en un código de: Massimo Banzi
*
*/
*
* Detectar si el botón ha sido presionado o no y encender
* el LED en consecuencia.
*
* Basado en un código de: Massimo Banzi
*
*/
voi d s e tu p( )
Tenemos que decirle a Arduino que ponga el pin que designamos para el
pulsador, como entrada. Esto es bastante fácil, empleando pinMode () para usar la
ENTRADA, para leer el pulsador o en su lugar de SALIDA para leer el el valor del
pin. Por cierto, el módulo void setup() sólo se leerá una vez, cuando se inicia o
reinicia la ejecución del programa.
Le ctu r a D i gi tal.
Podemos usar el nuevo procedimiento digitalRead (), que solamente toma como
entrada el pin a examinar. El procedimiento digitalRead () devuelve un resultado
cada vez que es leído. Dicho resultado es 0 (BAJO) o 1 (ALTO) dependiendo de lo
que vio cuando miró el voltaje del pin. En este caso, leemos el pin y luego pasamos
el resultado como una entrada a otro procedimiento, println (), por ejemplo.
Seguramente podríamos usar una variable para guardar el resultado de digitalRead
() y luego usar aquella variable como entrada al println () pero esto es mucho más
directo.
. . .
pinMode(switchpin, INPUT); // hace switchpin, pin de entrada.
pinMode(ledpin, OUTPUT); // hace ledpin, pin de salida.
. . .
. . .
Serial.println(digitalRead(switchpin)); // imprime el estado
del (pulsador)
. . .
El caso de la variable se verá más adelante.
value = digitalRead(inPin); // Lee el valor de la entrada digital
(pulsador)
Serial.print(value); // imprime el estado del (pulsador)
Es cr i tu r a Di gi tal .
Con el procedimiento DigitalWrite() pondremos el voltaje en un pin a ALTO 5V o a
BAJO masa 0V y luego usaremos DigitalRead() para preguntar si aquel pin es
ALTO o BAJO. Este procedimiento se usa normalmente como salida, mayormente
en el módulo void loop(), como tendremos ocasión de comprobar.
Compilar el código.
Utilizando el software, libre de Arduino. Copie y pegue el código del ejercicio, en la
zona habilitada para este fin. Conecte la tarjeta Arduino a su computadora (PC) y
pulse el icono (nº1) de Verify.
Iconos de Arduino.
Si todo va bien, el código saldrá bien, sin errores, a continuación pulse el icono de
Upload to I/O board (es el nº 6), esta vez también cargará el programa que acaba
de compilar en la memoria del Atmega (Arduino) y ahora, pulse el Serial Monitor
(nº 7) para ven en la parte inferior cómo se muestra el estado del pulsador.
Compilar el programa.
Tercer ejercicio.
En este momento, vamos a desarrollar el código que nos permita constatar el
efecto rebote. Para este fin, he aprovechado un código de un maestro en esta
materia como es H. Barragan, sólo he hecho unas pequeñas modificaciones para
que se aprecie con más detalle lo que ocurre al ejecutar el programa.
/*
Pulsador Conmutador
*/
void setup() {
Serial.begin(9600); // establece comunicacion serie
pinMode(switchPin, INPUT); // pone el pin digital 8 como la entrada
pinMode(ledPin, OUTPUT); // pone el pin digital 2 como la salida
}
void loop()
{
if(digitalRead(switchPin) == HIGH) // si el interruptor es presionado
{
direction *= -1; // alterna entre 1 o -1
if (direction == 1) // para decidir conectar o no la luz
{
digitalWrite(ledPin, HIGH); // conecta la luz
}
else
{
digitalWrite(ledPin, LOW); // desconecta la luz
}
Serial.print(direction);
delay(20); // espera 20 milliseconds
}
}
Aunque está bien comentado, describiré lo que hace el programa, sobre todo, en
el punto que más define el efecto rebote. El punto determinante del programa se
encuentra justo en la orden direction *= -1; , es la responsable de cambiar su
estado, en cada paso del programa por ese punto. Y esto se produce muy
velozmente (depende del reloj del micro). No se ha provocado nada nuevo, tan solo
se ha puesto de relieve el efecto que habitualmente ocurre con un contacto
mecánico.
Mantenga el pulsador presionado por un momento. Que ocurre. Que sucede. Que
el LED parece que parpadea, sólo lo parece, que va, realmente parpadea, dicen que
alguno no ha visto parpadear a nadie tan rápido ¡Un momento! Calma. Si, parpadea,
es lo que ocurre normalmente, cuando un contacto no se protege contra los rebotes.
Eso es lo que yo pretendía demostrar con tanto listado de código y aquí está.
Primero las variables:
// Aquí irán los #includes XXXXXX.h si se usan y la definición de
variables.
Operadores de Comparación:
x == y (x es igual a y)
x != y (x no es igual a y)
x < y (x es menor que y)
x > y (x es mayor que y)
x <= y (x es menor o igual a y)
x >= y (x es mayor o igual a y)
En la primera línea del if, se compara el estado del pin de entrada perteneciente al
pulsador, para saber si se ha pulsado. Si se ha presionado, el estado del pulsador
será 1 (H) y por lo tanto se ejecutará lo que hay dentro del siguiente corchete "{ ....
}"
if(digitalRead(switchPin) == HIGH) // si el interruptor es
presionado
{
. . .
}
En cuyo caso, se conmunta el estado de la variable direction y se consulta si su
valor ahora es 1 (o -1).
direction *= -1; // alterna entre 1 o -1
if (direction == 1) // nueva comapración. Para
decidir conectar o no el LED
{
digitalWrite(ledPin, HIGH); // conecta el LED
Serial.print(" H:"); // muestra la H de Alto.
}
Si no, se ejecutará lo que sigue a else { , que puede ser lo contrario a la acción
anterior.
else
{
digitalWrite(ledPin, LOW); // desconecta el LED
Serial.print(" L:"); // muestra la L de Bajo.
}
En este caso, también añadimos una salida para el puerto serie que permita ver el
resultado de los dos estados posibles del pulsador.
Serial.print(direction); // imprime el contenido de la variable
'direction'.
delay(20); // espera 20 milliseconds
Presencia de Rebote
Esto es lo que siempre trataremos de evitar. Imaginase por un momento que,
hemos construido de un reloj electrónico y ha llegado el esperado momento de su
puesta en hora. Qué ocurre si al realizar el programa no hemos previsto un sistema
antirrebote, cree usted que puede poner en hora el minutero o acaso el segundero,
sinceramente creo que le costaría incluso poner la hora actual sin más. Piense que
con cada pulsación, se produce un tren de impulsos (observe la imagen anterior)
que el contador del reloj interpretará como pulsos separados, de modo que será una
ardua tarea la puesta en hora.
Volvamos al tema que nos ocupa, vayamos a dar solución a nuestro problema. Si
usted ha hecho los cambios que le he sugerido, habrá notado que al comentar el
delay, aumentan exageradamente el número de rebotes, sin embargo, si aumentó el
valor del tiempo (dentro del paréntesis), por ejemplo, si subimos el valor a 200, se
observa que dejan de producirse rebotes, salvo que mantengamos presionado el
pulsador, cosa a todas luces, innecesaria.
/*
Pulsador Conmutador
*/
void setup() {
Serial.begin(9600); // establece comunicacion serie
pinMode(switchPin, INPUT); // pone el pin digital 8 como la entrada
pinMode(ledPin, OUTPUT); // pone el pin digital 2 como la salida
}
void loop() {
A pesar de todo, no es esta la solución definitiva. Hemos de dar con una forma
que de ninguna manera se produzcan rebotes, o al menos que, no dependa de
condiciones circunstanciales dependientes del azahar.
El lapsus de tiempo se puede variar para que no se lea más que el primer pulso
del tren de pulsos que se generan. Y este es el listado del código que cumple estos
parámetros. Puede copiar y pegar este código que sigue, en su software para
comprobar su efectividad.
/* conmutador.pde (switch)
*
* Cada vez el pin de entrada va de BAJO a ALTO (p.ej. debido a apretar un botón),
* el pin de salida es basculado de BAJO a ALTO o de ALTO a BAJO. Hay un
* retraso mínimo entre basculados para los rebotes del circuito.
* (no hacer caso del ruido).
*
* http://www.arduino.cc/en/Tutorial/Switch
*
* David A. Mellis
* 21 November 2006
*
* Modificado por V.Garcia 29072009 23:10H
*
*
* Funciona correctamente, emplea 2.442 bytes.
*
*/
// las sig uientes variables son largas por el tiempo medido en miliseconds,
// rápidamente se hará un número más grande que puede ser almacenado en un int.
long time = 0; // la ultima vez que el pin de salida fue basculado
long debounce = 500; // tiempo d e rebote, se aumenta si la salida parpadea
void loop()
{
reading = digitalRead(inPin);
if (reading == HIGH && previous == LOW && millis()+100 - time > debounce) {
if (state == HIGH) {
state = LOW;
Serial.print(" Estado Pin: L "); // muestra estado actual de variable state
Serial.println(state);
time = millis();
}
else {
state = HIGH;
Serial.print(" Estado Pin: H "); // muestra estado actual de variable state
Serial.println(state);
time = millis();
}
}
digitalWrite(outPin, state);
previous = reading;
}
El listado del código está bastante comentado, sin embargo hago recordar que en
este listado hay una gran diferencia ante los listados anteriores, consiste en que si
usted mantiene presionado el pulsador, no se modifica nada en la salida. Si viera un
cambio, es debido a que ha cambiado el estado del pulsador, aunque sólo sea por
un inapreciable instante. Ver el resultado que muestra wl monitor.
void setup() {
pinMode(switchPin, INPUT); // pone el pin switch como entrada
pinMode(ledPin, OUTPUT);
Serial.begin(9600); // Comunicación se rie puesta a 9600bps
botonStado = digitalRead(switchPin); // lee el estado inicial
}
void loop(){
val = digitalRead(switchPin); // lee el valor de entrada y almacénlo en val
delay(10); // 10 milisegundos son una cantidad de tie mpo buena
val2 = digitalRead(switchPin); // lea la entrada otra vez para comprobar saltos
if (val == val2) { // asegúrar que conseguimos 2 lecturas constantes
if (val != botonStado) { // el estado de botón ha cambiado!
if (val == LOW) { // compruebe si el botón es presionado
if (lightMode == 0) { // esta la luz AP?
lightMode = 1; // conecta la luz!
digitalWrite(ledPin, HIGH);
Serial.print("Estado: ");
Serial.println(lightMode);
} else {
lightMode = 0; // apaga la luz!
digitalWrite(ledPin, LOW);
Serial.print("Estado: ");
Serial.println(lightMode);
}
}
}
botonStado = val; // guardar el nuevo estado en la variable
}
}
Véase en la figura que sigue los resultados que se corresponden con lo que se
describe más arriba.
Sin rebotes
A D ESTA CA R.
Que podemos destacar en el procedimiento que se sigue para realizar el código
que evita los rebotes. Si observamos con atención el comportamiento del programa,
veremos que los cambios en la salida del pin #2, se producen justo en lo que se
llama, flanco de bajada o borde de bajada, es decir, no en el momento de la
conexión, si no en el momento de soltar o dejar de presionar.
Compruebe usted el efecto, presiones y mantenga presionado el pulsador, no ha
ocurrido nada, se ha cambiado el estado del LED, ahora, suelte el pulsador, en ese
momento se produce el cambio del LED, vuelva a realizar lo mismo y experimente
que los cambios se producen siempre al ser liberado el pulsador. Considero
probado la eliminación del efecto que se perseguía, el rebote o debounce.
Una vez comprobado que, el programa proporciona los resultados esperados,
puesto que no siempre se tienen que mostrar los resultados en el monitor, se puede
eliminar del código las referencias a la comunicación serie, dejando más compacto
el código.
El lector, nuevamente, con unos pocos cambios puede adaptar este listado a sus
proyectos.
Como siempre, comentarios, criticas y sugerencias para mejorar este artículo, son
bienvenidos y apreciados.
Project2- Led y Botón
Entrada digital
El pulsador es un componente que conecta dos puntos de un circuito cuando
es presionado. En este ejemplo, cuando pulsas el botón se enciende un LED.
Conectamos tres cables a la placa Arduino. El primero conecta una patilla del
pulsador, a través de una resistencia de carga (de 2k2), a la alimentación de
5V. El segundo, va desde la correspondiente patilla del pulsador a masa. Por
último, la tercera se conecta a una entrada/salida digital (en este caso al pin 7)
para leer el estado del botón.
Cuando el pulsador está abierto (sin pulsar), no hay conexión entre sus dos
patillas, por lo que el pin está conectado a los 5v (a través de la resistencia de
carga) por lo que leeremos un valor alto (HIGH).
Cuando el botón está cerrado (pulsado), realiza una conexión entre masa y el
pin, por lo que leeremos un nivel bajo (LOW). (El pin continúa conectado a 5
voltios, pero la resistencia entre ellos hace que el pin esté más cercano a
masa)
Ci r cu i to
Cód i g o
/* invert
* <http://www.arduino.cc/en/Tutorial/Invert>
*
* Enciende o apago un diodo emisor de luz (LED) conectado al pin digital 13,
* cuando se presiona un pulsador conectado al pin digital 7. Esto explica el
* concepto de activo a nivel bajo, que consiste en conectar botones usando
* una resistencia de carga de entre 1k y 10k.
*
*/
int ledPin = 13; // escoge el pin para el LED
int inPin = 7; // elige el pin de entrada (para el pulsador)
int val = 0; // variable para la lectura del estado del pin
void setup() {
pinMode(ledPin, OUTPUT); // configura el LED como salida
pinMode(inPin, INPUT); // y el pulsador como entrada
}
void loop(){
val = digitalRead(inPin); // lee el valor de entrada
if (val == HIGH) { // si la entrada está a nivel alto (botón sin pulsar)...
digita lWrite(ledPin, LOW); // apaga el LED
} else { // si está a nivel bajo (botón pulsado)...
digitalWrite(ledPin, HIGH); // enciende el LED
}
}
Esquema:
Código
Otro ejemplo:
APUNTES
A) La entrada analógica 0, se puede usar como entrada digital (la numero 14).
B) Activar la resistencia de pull-up de esta entrada y conectar el pulsador entre
esta entrada y GND.
C) El comando digitalRead(X) lee la tensión en la resistencia de pull-up de la
entrada X
D) He usado como salida la D13 porque ya tiene conectado un LED integrado
en la placa
int boton = 2;
int led = 13;
void setup(){
pinMode(boton, INPUT);
digitalWrite (boton, HIGH);
pinMode(led, OUTPUT);
digitalWrite(led, LOW);
Serial.begin(115200);
}
void loop(){
if(digitalRead(boton)==HIGH) {
digitalWrite(led,LOW);
} else {
digitalWrite(led,HIGH);
}
}
Project3- potenciometros
Potenciómetro
Descripción:
Listado de componentes:
* 1 Potenciómetro de 1kΩ o 100k
* un par de cables.
Circuito:
Se conectan tres cables a la tarjeta Arduino. El primero va a tierra desde uno
de los terminales externos (1 o 3) del potenciómetro. El segundo va desde la
salida de 5 voltios hacia el otro termianl externo del potenciómetro. EL tercero
va desde la entrada analógica #2 hasta el terminal interno del potenciómetro.
Girando el dial o ajustando el potenciómetro, cambiamos el valor de la
resistencia variable. Esto produce oscilaciones dentro del rango de 5 y 0
voltios, que son capturados por la entrada analógica.
Código1:
/* Analog Read
* ------------------
*
* enciende y apaga un LED (light emitting diode) conectado al pin digital #13.
* La cantidad de tiempo que el LED parpadeará depende del
* valor obtenido mediante analogRead(). En este caso al pin analógico #2 se
* encuentra conectado un potenciómetro.
*
*
* Created 1 December 2005
* copyleft 2005 DojoDave <http://www.0j0.org>
* http://arduino.berlios.de
*
*/
int potPin = 2; // seleccionar el pin de entrada analógico para el potenciómetro
int ledPin = 13; // seleccionar el pin de salida digital para el LED
int val = 0; // variable para almacenar el valor capturado desde el sensor
void setup() {
pinMode(ledPin, OUTPUT); // declara el ledPin en modo salida
}
void loop() {
val = analogRead(potPin); // lee el valor del sensor
digitalWrite(ledPin, HIGH); // enciende LED
delay(val); // detiene el programa por un tiempo determinado por la variable
digitalWrite(ledPin, LOW); // apaga el LED
delay(val); // detiene el programa por un tiempo determinado por la variable
}
Código2:
// potenciometro y led
int potPin = 2;
int ledPin = 13;
int val = 0;
void setup(){
pinMode(ledPin, OUTPUT);
}
void loop() {
val = analogRead(potPin); //lee valor del sensor
val = val/4 ; //convierte de 0 -1023 to 0 -255
analogWrite(ledPin,val); //enciende ledpin
Código3:
Codigo del ejemplo 04_Sensor_Analogico_Potenciometro_SerialPrintln
void setup() {
Serial.begin (9600); // Abrimos el puerto Serie de Arduino a una velocidad de 9600 baudios
pinMode(ledPin, OUTPUT); // Declaramos el LED como SALIDA
}
void loop () {
valor = analogRead(potPin);
valorMapeado = map(valor,0,1023,0,255);
// Abrimos el Serial Monitor de Arduino y ahi podremos ver que valores le vamos pasando al
LED
Serial.println(valorMapeado);
}
En este ejemplo, vamos a empezar a ver como monitorizar operaciones o
eventos en Arduino,
gracias al Puerto Serie. Esta tecnica nos permitira, posteriormente mandar
datos o acciones a otros
programas como Processing, Grasshopper, Pure Data, Flash, o incluso a un
Iphone/ Ipad o similar … para
dotar de mayor interactividad a nuestra instalacion.
Project4- servos
Todo de una manera sencilla y gráfica para simplificar todo el proceso, siendo
sin duda un buen ejemplo para iniciarse en el uso de Arduino + Servomotores.
No me ha sido posible grabar ningun video para este tutorial, pues aun no
dispongo de un medio de grabación de calidad, pero pronto tendré uno, y
grabaré todo el proceso + pruebas de funcionamiento.
-Rojo (+)
Donde por norma general el cable Rojo es el positivo o fase, el Marrón o Negro
es el tierra o masa, y el restante de varios posibles colores es el señal, que nos
permitirá controlar el servomotor con precisión.
Pues muy sencillo usando uno de los pines marcados como PWM en arduino.
#include <Servo.h>
void setup()
{
servo1.attach(3); // Selecionamos el pin 3 como el pin de control para els ervo
}
void loop()
{
Conectamos nuestro arduino al usb del pc, cargamos este programa con las
conexiones especificadas anteriormente y moveremos nuestro servo a la
posicion 150º
Ejemplo2 servo giro
Cambiamos como experimentación al pin 2 que no es pwm, perteneciente a
una placa Arduino Uno y le aplIcamos el programa para que gire de 10 a 170
grados:
Servo; potenciometro
http://www.youtube.com/watch?v=mOEF1mMKI-A
#include <Servo.h>
Servo servo;
void setup ()
{
servo.attach (9); //pin de conexion digital servo
void loop ()
{
int val = analogRead(3); //pin conexion analogica potenciometro valor
val = map(val,0,1023,0,179); //reglade3 0 es 0 como 1023 es a 179
servo.write (val);
delay(15);
}
Otro que realiza movimiento del servo al intervalo que adoptemos, depende de
la calidad del mismo.
#include <Servo.h>
void setup()
{
myservo.attach(7); // attaches the servo on pin 9 to the servo object
}
void loop()
{
for(pos = 90; pos < 1 10; pos +=.05) // avanza de 0 a 180 grados
{ // en saltos de un grado
myservo.write(pos); // mueve a la posición de la variable 'pos'
delay(800); // espera 15ms
}
for(pos = 1 10; pos>=90; pos -=.05) // va de 180 a 0 grados
{
myservo.write(pos);
delay(800);
}
}
Project4- servos
continous
Funcionan todos los ejemplos ok
http://dukevisualstudies.org/lastmiles/?p=11
Arduino
int servoPin = 7;
void setup()
{
pinMode(servoPin,OUTPUT);
}
void loop()
{
int temp;
for (temp = 0; temp <= 200; temp++)
{
digitalWrite(servoPin,HIGH);
delayMicroseconds(1500); // 1.5ms ajusta el se tpoint del screwdriver
digitalWrite(servoPin,LOW);
delay(20); // 20ms
}
for (temp = 0; temp <= 200; temp++)
{
digitalWrite(servoPin,HIGH);
delayMicroseconds(1800); // 1.8ms sentido antiagujas reloj
digitalWrite(servoPin,LOW);
delay(20); // 20ms
}
for (temp = 0; temp <= 200; temp++)
{
digitalWrite(servoPin,HIGH);
delayMicroseconds(1200); // 1.2ms sentido agujas reloj
digitalWrite(servoPin,LOW);
delay(20); // 20ms
}
}
That's it!
Otro ejemplo, pulsando teclado ‘a’ ‘s’ ‘spc’ izq dcha parada:
/*
* Serial Port Continuous Rotation Servo - Movement and Speed Control
* --------------
*
* Alteration of the control interface to use < and > keys
* to slew the servo horn left and right. Works best with
* the Linux/Mac terminal "screen" program.
*
* Adapted for Continuous Rotation Servo (Parallax)
* by Orfeus (for http://www.grobot.gr)
* v.200910211932
*
* For Serial Port Terminal on Windows I used PuTTY SSH Client
* ( freeware at http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html )
*
*
*
*
* Created 10 December 2007
* copyleft 2007 Brian D. Wendt
* http://principialabs.com/
*
* Adapted from code by Tom Igoe
* http://itp.nyu.edu/physcomp/Labs/Servo
*
*/
/** Adjust these values for your servo and setup, if necessary **/
int servoPin = 2; // control pin for servo motor
int minPulse = 1170; // maximum servo speed clockwise
int maxPulse = 1770; // maximum servo speed anticlockwise
int turnRate = 75; // servo turn rate increment (larger value, faster rate)
int refreshTime = 20; // time (ms) between pulses (50Hz)
/** The Arduino will calculate these values for you **/
int centerServo; // center servo position
int pulseWidth; // servo pulse width
int moveServo; // raw user input
long lastPulse = 0; // recorded time (ms) of the last pulse
void setup() {
pinMode(servoPin, OUTPUT); // Set servo pin as an output pin
centerServo = maxPulse - ((maxPulse - minPulse)/2);
pulseWidth = centerServo; // Give the servo a stop command
Serial.begin(9600);
Serial.println("Arduino Serial Continuous Rotation Servo Control");
Serial.println(" by Orfeus for GRobot.gr");
Serial.println(" Press < or > to move, spacebar to center");
Serial.println();
}
void loop() {
// wait for serial input
if (Serial.available() > 0) {
// read the incoming byte:
moveServo = Serial.read();
/* Orfeus 200910212001 */
Otro ejemplo, mueve acelerando y desacelerando:
/* mueve a izq y dcha aclerando y decelarando */
int servoPin = 7;
void setup()
{
pinMode(servoPin,OUTPUT);
}
void loop()
{
digitalWrite(servoPin,HIGH);
delayMicroseconds(dirInt);
digitalWrite(servoPin,LOW);
delay(20); // 20ms
dirInt += dir;
if(dirInt >= fullClock)
{
dir = -1;
} else if(dirInt <= fullCounter) {
dir = 1;
}
+++++++++++++++++++++++++++++++++++
Otro ejemplo de momento : OK
int servoPin = 2; // the number of the output pin for the servo
int ledPin = 5;
void setup()
{
digitalWrite(servoPin,LOW);
digitalWrite(ledPin,LOW);
void loop()
{
/* lanzar los pulsos que el servo necesita para controlar su posición, teniendo en cuenta que:
* 90º = 1500us
* 180º = 1500us + ampl
* 0º = 1500us -ampl
*/
pulso = map(angulo,0,180,1500 -ampl,1500+ampl);
digitalWrite(servoPin,HIGH);
delayMicroseconds(pulso);
digitalWrite(servoPin,LOW);
delay(20);
if ((millis() - tiempo) > 500)
{
angulo = angulo + 5;
tiempo = millis();
if (angulo > 180) {
angulo = 0;
}
}
}
EJEMPLO
Control Servo Rotacion Continua OK
Según el codigo deberia estar quieto (pulso de 1,5ms) y luego girar a los
dos lados. Pero hay un lado al que no gira (izquierda)
int servoPin = 7;
void setup()
{
pinMode(servoPin,OUTPUT);
}
void loop()
{
int temp;
for (temp = 0; temp <= 200; temp++)
{
digitalWrite(servoPin,HIGH);
delayMicroseconds(1500); // 1.5ms
digitalWrite(servoPin,LOW);
delay(20); // 20ms
}
for (temp = 0; temp <= 200; temp++)
{
digitalWrite(servoPin,HIGH);
delayMicroseconds(1800); // 1.8ms
digitalWrite(servoPin,LOW);
delay(20); // 20ms
}
for (temp = 0; temp <= 200; temp++)
{
digitalWrite(servoPin,HIGH);
delayMicroseconds(1200); // 1.2ms
digitalWrite(servoPin,LOW);
delay(20); // 20ms
}
}
Hay unas patitas especiales para esto, así además puedes liberar el
procesador mientras haces otras cosas, prueba el siguiente codigo:
Code:
#define SERVO_MOVEMENT <algun_pin_digital_pwm>
#define CENTER_RANGE 5
/* MOTOR 360 */
float potPin = 2; //entrada señal potenciometro analogica
int pwmPin = 3; //salida señal servo
int sensorValue;
float calibrate;
void setup() {
pinMode (pwmPin, OUTPUT);
}
void loop() {
sensorValue = analogRead(potPin);
calibrate = map(sensorValue,0,1024,120,240); /*ajustes de ancho pulso segun potenc */
analogWrite (pwmPin, calibrate); /* ancho de pulso segun la conversion analog a digital */
aa
bb
Cc
STEPPERS BIPOLAR
I build a step motor controller based on the schematics found on the Arduino
Web site. First I try the 2 pins one for bipolar stepper motor. I wont be able to
make it work, even less with the library available on the site. Maybe I’m dumb
and I really dont understand something, but this circuit keeps both coils active at
the same time.
So I tried the second circuit, the 4 pins one. With the same library I wasn’t able
to make it work either. So I create a piece of code of my own and I finally
managed to make the motor run correctly.
After that, I realize that I can merge the to circuits to possibly create a PWM
abled bipolar motor controller with the L297D. A somewhat bizzare idea, but I
think it’s possible if we can program the Arduino to send 4 synced PWM signals.
I’ll come back later (maybe never) with this thought. After some research I found
that the TI DRV8811 and the Allegro A3977 are much more appropriate chips to
do microstepping.
But for now, there is my circuit. It’s advantage is that it can release the coils.
Download the schematics (Fritzing format).
The two PNP transistors are connected like the circuit proposed on the Arduino
Web site. Plus, I use the enable pins. So my circuit needs four pins, and I don’t
found a way to use less.
Par ts li s t
1 x Arduino
1 x LD290 Quadruple Half H-Bridge
2 x 1K Ohm Resistors
2 x 10K Ohm Resistors
2 x 2N2222 PnP Transistors
1 x Bipolar Step Motor
There is the sequence to make the motor turn one direction, invert it to make it
turn the other.
Control sequence
CTRL A EN A CTRL B EN B
0 0 1 1
1 1 0 0
0 0 0 1
0 1 0 0
There is my code to control the stepper motor. Like you see in my code I use
direct port command to take less processor time. And I create a function called
in the main loop for each steps. This way the code can do something else when
the motor is running.
/*
St epper M ot or C ont roll er
b y Kevi n Fil t eau 2010 -05- 29
Pl aywit hm yl ed . com
*/
/ *** *** ** *** *** *** *** *** ** *** *** *** *** *** ** *** *
M O TO R
* *** *** ** *** *** *** *** *** *** ** *** *** *** *** *** ** /
/ / Set up t he m ot or.
voi d mot orSet up() {
pi nM ode( pi nM ot orC t rl A, O UT PUT ) ;
pi nM ode( pi nM ot orC t rl B , O UT PUT ) ;
pi nM ode( pi nM ot orE nA , O UT PUT ) ;
pi nM ode( pi nM ot orE nB , O UT PUT) ;
// E veryb od y t o L OW .
di g it al W rit e( pi nM ot orCt rlA , L OW ) ;
di g it al W rit e( pi nM ot orCt rlB , L O W) ;
di g it al W rit e( pi nM ot orE nA , L O W) ;
di g it al W rit e( pi nM ot orE nB, L O W ) ;
}
/ / Free t he m ot or.
voi d mot orFree( ) {
di g it al W rit e( pi nM ot orE nA , L O W) ;
di g it al W rit e( pi nM ot orE nB, LO W ) ;
}
st = st epsSeq[ pos] ;
i f ( d i r == GO LE FT ) {
pos++; if ( pos>3) pos=0;
m ot orPos++;
} el se {
pos- - ; i f( pos<0) pos=3;
m ot orPos -- ;
}
PO R TD &= 0x F;
PO R TD | = st ;
}
/ *** *** ** *** *** *** *** *** ** *** *** *** *** *** ** *** *
M AI N FUNC TI O N S.
* *** *** ** *** *** *** *** *** *** ** *** *** *** *** *** ** /
voi d set up( ) {
mot orSet up() ;
voi d l oop( ) {
mot orSpi n( GO LE FT ) ;
/ / m ot orSpi n( GOR I GH T ) ;
}
And to close this post. Some pictures of the prototype, the finalized circuit board
(useful for the pinout) and a video taken while testing the circuit.
DC motor control using Arduino and L293D
We can drive dc motors using an Arduino and an L293D motor controller ic. We can
control two dc motors simultaneously.
The circuit diagram is as follows
The simple code for rotating the dc motor in one direction is as follows.
int ledPin1 = 8;
int ledPin2= 9;
void setup() {
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
}
void loop()
{
digitalWrite(ledPin1, HIGH);
digitalWrite(ledPin3, LOW);
delay(5);
}
Para saber si un motor es "paso a paso", realizaremos la comprobación siguiente: Giraremos con la
mano el eje del motor y deberemos notar que éste ejerce una resistencia al giro a golpes (o pasos).
Existen dos tipos de motores paso a paso: unipolares y bipolares. En los primeros la corriente circula
siempre en el mismo sentido por cada bobina, y en el segundo se alterna cambia el sentido de la
intensidad.
Un modo de identificarlos es contando el número de cables que tiene el motor:
4 cables (bipolar)
Necesariamente será bipolar. Para identificar los terminales, cojemos uno y con un tester medimos el
resto de terminales, si es infinito, pertenece a la otra bobina, y si nó es el otro terminal de la bobina.
6 cables (unipolar-bipolar)
5 cables (unipolar-bipolar)
En este caso se han unido los terminales intermedios de las dos bobinas. El borne 5 es el único que mide
R con el resto de los cables, el resto de cables (con los que mide 2R) deberemos intercambiarlos en la
placa haste que el motor gire.
Para conectarlo deberemos unir los terminales 5 y 6 y si al conectarlo en la placa el motor no gira,
deberemos alternar los terminales 3 y 4.
NOTA: Una página muy buena sobre motores paso a paso es la siguiente: Tutorial sobre
motores paso a paso
Otra página muy interesante, con un simulación de funcionamiento de diferentes motores paso a paso y
con diferentes tipos de paso (una forma muy fácil de entender los micropasos) y control nos la ofrece
nanotec, una empresa alemana: http://de.nanotec.com/schrittmotor_animation.html
Aunque la página está en alemán, puedes ver una traducción en la imagen inferior. Elige el tipo de motor,
y elige una velocidad de demo.
Descripción
Para la realización de este proyecto nos basaremos en el circuito siguiente:
NOTA
Aunque en el esquema está representado el chip L239B, puedes utilizar el chip SN754410,
más potente y económico.
En este circuito vemos que con sólo 2 pines de control (D1 y D2) controlamos las 4 bobinas del motor
paso a paso (L1,L2,L3 y L4). Esto lo podemos hacer ya que para mover un motor paso a paso debemos
alimentar las bobinas en el orden siguiente:
En esta tabla vemos que los valores del devanado 2 es el invertido del 1 y que los del devanado 4 son los
invertidos del 3, por lo que si invertimos la señal del L1 obtenemos la señal de control necesaria para L2 y
de la misma manera si invertimos la señal de L3 obtendremos la señal de control de L4, con lo que la
tabla para poder mover el motor quedaría de la forma siguiente:
Esta inversión de señal la realizamos en el circuito utilizando 2 transistores Q1 y Q2, que cuando estan
activos (señal IN1 o IN4) derivan a masa las entradas IN2 o IN3 que están a positivo con las resistencia
Pull-Up R1 y R3.
Si utilizas Arduino, no es necesario que envies manualmente los pulsos a cada bobina del motor, tienes la
vida un poco más fácil, ya que dispone de la librería Stepper, que simplifica este proceso. (Tienes más
información en la sección de enlaces).
NOTA: Ten en cuenta que este este circuito necesita dos señales D1 y D2, que deben
activarse según la tabla anterior (o la librería Stepper en Arduino).
ESTE CIRCUITO NO FUNCIONA CON SEÑALES PASO y DIRECCIÓN.
Componentes
2 resistencias de 1K (~0,02x2=0,04€)
2 resistencias de 10K (~0,02x2=0,04€)
1 Zócalo de 16 patillas (0,3€)
1 CI L293D (2,7€) ó SN754410 (1,66€)
un trozo de placa de 11 filas por 14 agujeros. (0,8€)
Cables de colores (0,5€)
3 regletas CI de paso 2,54 (0,4x3=1,2€)
(En la entrada puedes soldar directamente los cables, y en la salida utilizar
una regleta típica de electricista)
NOTA
Precios orientativos y aproximados para que sepas si hablamos de millones de dolares o de
céntimos de euro, sin IVA y suministrados por Biltron - 2011
(No tengo nada que ver con Biltron, pero son muy majos les hago publicidad).
Realización
El método Paper consiste en ayudarnos en unas pegatinas para facilitarnos el proceso de montaje y
soldadura.
Una vez impreso el documento, comprobaremos que la impresión se ha realizado a la escala correcta con
la ayuda de la regla impresa situada en el lateral izquierdo de la hoja. Al colocar a su lado un regla en
centímetros deberán coincidir las marcas.
Si quieres puedes proteger la paperetiqueta con un plástico transparente autoadhesivo:
Alineamos la línea a cortar con el canto de una superficie dura (borde de mesa)
y apretamos suvemente.
Y con una lija conseguimos unos cantos lisos:
NOTA
en la foto ves que he cortado la paperetiqueta un poco más grande que lo indicado para poder
ajustarla a la placa una vez encolada y corregir el descentramiento de los agujeros de la placa.
El único componente con polaridad es el circuito integrado y los transistores, así que comprobaremos que
el zócalo tiene la zona con marca en la parte superior (como lo indica la paper-etiqueta).
Si no quieres utilizar bornas para soldar en circuito impreso, puedes utilizar una clema de electricista (más
baratas y fáciles de conseguir).
Una vez soldados todos los componentes, y fijándote en la imagen del documento impreso (lado pistas)
puedes cortar con un taladrín y una fresa fina las pistas indicadas (yo hago este paso una vez soldados
todos los elementos para poder tomar como referencia las patillas soldadas):
Y el resultado es ...
Funcionamiento
Si no has descargado y descomprimido el archivo PaperStepperXX.zip, ha llegado el momento de
hacerlo. Lo tienes disponible en el enlace inferior.
Deberás compilar e instalar en el Arduino (o Paperduino) el programa de ejemplo realizado por Tom Igoe
que tienes disponible en el archivo de descargas (/Sketches/PaperStepper2w.pde).
NOTA
En mi caso como el motor es de 12v, utilizo una vieja fuente de alimentación de un PC para el
motor y el Arduino se alimenta a través de USB.
Otra posibilidad es alimentar el Arduino y el motor paso a paso con la fuente de Alimentación.
Dependiendo de tu motor, quizás puedas utilizar este circuito con un motor unipolar, como ves en la
imagen, los terminales intermedios de las bobinas (cables blanco y negro) están al aire.
El programa simplemente da un número de vueltas en un sentido, y en otro indefinidamente.
Debes modificar el valor de la linea:
#define motorSteps PASOSVUELTA, donde PASOSVUELTA indica el número de pasos que hay que
suministrar al motor para que el eje de una vuelta completa.
En mi caso al utilizar un motor de paso 3,75grados => 360/3,75=96.
También puede ser necesario que reduzcas la velocidad del motor si éste tiene mucha inercia, reduciendo
el valor de VELOCIDAD de la linea: myStepper.setSpeed(VELOCIDAD)
/*
Stepper Motor Controller
language: Wiring/Arduino
The motor moves 100 steps in one direction, then 100 in the other.
*/
// define the pins that the motor is attached to. You can use
// any digital I/O pins.
void setup() {
// set the motor speed at 60 RPMS:
myStepper.setSpeed(50);
// Initialize the Serial port:
Serial.begin(9600);
void loop() {
// Step forward 100 steps:
Serial.println("Forward");
myStepper.step(96);
delay(500);
void setup () {
pinMode( 2 , OUTPUT ) ; // tell Arduino to use pin 2 as OUTPUT
pinMode( 3 , OUTPUT ) ; // tell Arduino to use pin 3 as OUTPUT
pinMode( 4 , OUTPUT ) ; // tell Arduino to use pin 4 as OUTPUT
pinMode( 5 , OUTPUT ) ; // tell Arduino to use pin 5 as OUTPUT
}
void loop () {
// forward
digitalWrite ( 2 , HIGH ) ; // engage magnet on pin
digitalWrite ( 4 , LOW ) ; // disagle magnet on pin
digitalWrite ( 3 , LOW ) ;
digitalWrite ( 5 , LOW ) ;
delay ( 500 ) ; // wait for 500 milliseconds
digitalWrite ( 2 , LOW ) ;
digitalWrite ( 4 , HIGH ) ;
digitalWrite ( 3 , LOW ) ;
digitalWrite ( 5 , LOW ) ;
delay ( 500 ) ;
digitalWrite ( 2 , LOW ) ;
digitalWrite ( 4 , LOW ) ;
digitalWrite ( 3 , HIGH ) ;
digitalWrite ( 5 , LOW ) ;
delay ( 500 ) ;
digitalWrite ( 2 , LOW ) ;
digitalWrite ( 4 , LOW ) ;
digitalWrite ( 3 , LOW ) ;
digitalWrite ( 5 , HIGH ) ;
delay ( 500 ) ;
// backward
digitalWrite ( 2 , LOW ) ;
digitalWrite ( 4 , LOW ) ;
digitalWrite ( 3 , HIGH ) ;
digitalWrite ( 5 , LOW ) ;
delay ( 500 ) ;
digitalWrite ( 2 , LOW ) ;
digitalWrite ( 4 , HIGH ) ;
digitalWrite ( 3 , LOW ) ;
digitalWrite ( 5 , LOW ) ;
delay ( 500 ) ;
digitalWrite ( 2 , HIGH ) ;
digitalWrite ( 4 , LOW ) ;
digitalWrite ( 3 , LOW ) ;
digitalWrite ( 5 , LOW ) ;
delay ( 500 ) ;
digitalWrite ( 2 , LOW ) ;
digitalWrite ( 4 , LOW ) ;
digitalWrite ( 3 , LOW ) ;
digitalWrite ( 5 , HIGH ) ;
delay ( 500 ) ;
}
// Arduino Code:
// more advanced example
Over vi ew
In this tutorial, you'll learn how to control a DC motor's direction using an H-bridge.
To reverse a DC motor, you need to be able to reverse the direction of the current in the motor. The
easiest way to do this is using an H-bridge circuit. There are many different models and brands of H-
Bridge. This tutorial uses one of the most basic, a Texas Instruments L293NE or a Texas Instruments
SN754410.
If you simply want to turn a motor on and off, and don't need to reverse it, for example if you're controlling
a fan, try the tutorial on controlling high current loads with transistors.
Table of Contents (hide)
1. 1.Parts
2. 2.Prepare the breadboard
3. 3.Add a Digital Input (a switch)
4. 4.Find a motor
5. 5.Set up the H-bridge
6. 6.How your H-bridge works
7. 7.Connect the motor to the H-bridge
8. 8.Program the Microcontroller
9. 9.Get creative
Parts 1.
For this lab you'll need:
Solderless breadboard
10Kohm resistors
Switch
L293NE
or SN754410 H-bridge
DC Motor
Prepare the breadboard 2.
Connect power and ground on the breadboard to power and ground from the microcontroller. On the
Arduino module, use the 5V and any of the ground connections:
Find a motor 4.
Find yourself a DC motor that runs on low DC voltage within the range of 5 - 15V. RadioShack often sells
several small DC motors, the NYU Computer Store on occasion has small a few, the junk shelf is almost
always a goldmine for discarded motors and fans.Asking classmates and second years is another good
approach.
Solder leads to the motor's terminals. With DC motors, there is no polarity regarding the motor terminals so
you can connect it any way you'd like.
Optional: Consider testing your motor with a bench power supply from the equipment room. Ask a teacher
or resident if you need help setting one up. Begin by adjusting the voltage on the bench power supply and
observe its effects. Take note of its speed at different voltages without dipping to low or too high. Running
a motor at a voltage much lower or much higher than what it's rated for could potentially damage or
permanently destroy your motor. When the motor doesn't spin, the voltage is too low. When the motor runs
hot, or sounds like it's straining, the voltage is too high.
This example uses an H-bridge integrated circuit, the Texas Instruments L293NE or Texas Instruments
SN754410. There is one in your Physical Computing Kit, and the NYU Computer Store and many
distributors such as Digikey, SparkFun, Mouser and Jameco sell them as well.
The L293NE/SN754410 is a very basic H-bridge. It has two bridges, one on the left side of the chip and
one on the right, and can control 2 motors. It can drive up to 1 amp of current, and operate between 4.5V
and 36V. The small DC motor you are using in this lab can run safely off a low voltage so this H-bridge will
work just fine.
Pin 1 (1,2EN) enables and disables our motor whether it is give HIGH or LOW
Pin 2 (1A) is a logic pin for our motor (input is either HIGH or LOW)
Pin 3 (1Y) is for one of the motor terminals
Pin 4-5 are for ground
Pin 6 (2Y) is for the other motor terminal
Pin 7 (2A) is a logic pin for our motor (input is either HIGH or LOW)
Pin 8 (VCC2) is the power supply for our motor, this should be given the rated voltage of your
motor
Pin 9-11 are unconnected as you are only using one motor in this lab
Pin 12-13 are for ground
Pin 14-15 are unconnected
Pin 16 (VCC1) is connected to 5V
Below is a diagram of the H-bridge and which pins do what in our example. Included with the diagram is a
truth table indicating how the motor will function according to the state of the logic pins (which are set by
our Arduino).
For this lab, the enable pin connects to a digital pin on your Arduino so you can send it either HIGH or
LOW and turn the motor ON or OFF. The motor logic pins also connected to designated digital pins on
your Arduino so you can send it HIGH and LOW to have the motor turn in one direction, or LOW and HIGH
to have it turn in the other direction. The motor supply voltage connects to the voltage source for the
motor, which is usually an external power supply. If your motor can run on 5V and less than 500mA, you
can use the Arduino's 5V output. Most motors require a higher voltage and higher current draw than this,
so you might need an external power supply.
Or, if you are using an external power for Arduino, you can use Vin pin.
If you need an external power supply, y ou can use any DC power supply or battery from 9 - 15V as long
as your motor can run at that voltage, and as long as the supply can supply as much current as your motor
needs.
Plug an external DC power source into the Arduino's external power input. You may still leave your USB
cable plugged in for quick and easy reprogramming. Whichever motor you use, make sure the power
source is compatible (i.e. don't use a 9V battery for a 3V motor!). The external voltage input is available at
the Vin pin, so you can use it both to power the Arduino, and to power the motor.
If you find that your microcontroller is resetting whenever the motor turns on, add a capacitor across power
and ground close to the motor. The capacitor will smooth out the voltage dips that occur when the motor
turns on. This use of a capacitor is called a decoupling capacitor. Usually a 10 - 100uF capacitor will
work. The larger the cap, the more charge it can hold, but the longer it will take to release its charge.
void setup() {
// set the switch as an input:
pinMode(switchPin, INPUT);
void loop() {
// if the switch is high, motor will turn on one direction:
if (digitalRead(switchPin) == HIGH) {
digitalWrite(motor1Pin, LOW); // set leg 1 of the H-bridge low
digitalWrite(motor2Pin, HIGH); // set leg 2 of the H-bridge high
}
// if the switch is low, motor will turn in the other direction:
else {
digitalWrite(motor1Pin, HIGH); // set leg 1 of the H-bridge high
digitalWrite(motor2Pin, LOW); // set leg 2 of the H-bridge low
}
}
/*
blinks an LED
*/
void blink(int whatPin, int howManyTimes, int milliSecs) {
int i = 0;
for ( i = 0; i < howManyTimes; i++) {
digitalWrite(whatPin, HIGH);
delay(milliSecs/2);
digitalWrite(whatPin, LOW);
delay(milliSecs/2);
}
}
Once you've seen this code working, try modifying the speed of the motor using the analogWrite() function,
as explained in the Analog Lab. Use analogWrite() on pin 9, the enable pin of the motor, and see what
happens as you change the value of the analogWrite().
Get creative 9.
This is a suggestion for a possible project. You can do any project you wish as long as it demonstrates
your mastery of the lab exercises and good physical interaction.
Use your motor to make something move, vibrate, rise, fall, roll, creep, or whatever you can think of, in
response to user input from a digital input device (switch, floor sensor, tripwire, etc). Look inside moving
toys, you'll find a number of excellent motors and gears you can re-purpose. See the innards of a cymbal
monkey below as an example. Perhaps you can re-design the user interface to a toy, using the
microcontroller to mediate between new sensors on the toy and the motors of the toy. Whatever you build,
make sure it reacts in some way to human action.
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 los resultados. Cabe la
posibilidad de utilizar dos transistores en sendos pines, cada cual
conduciría un borne del motor, como diría, el motor entre dos pines,
pero no quiero perder más tiempo. Es el momento de utilizar el L293,
en una de las aplicaciones que vienen en las hojas de
especificaciones.
Además con el L293, no tiene que preocuparse por la regulación de
una tensión mayor, ya que permite dos fuentes de energía - una
fuente directa, hasta 36 V para los motores y otra de 5V, para
controlar el CI que, puede ser conectada a la fuente de alimentación
ya que el suministro de alimentación del motor proviene es
independiente. En el circuito de abajo, se supone una alimentación
superior para el motor. A continuación se puede ver la disposición de
las conexiones para el chip y el motor. La tabla de verdad muestra la
lógica de la salida.
El códi go.
La teoría es bastante sencilla. Se trata de poner, un estado lógico 1
en la entrada A1, al mismo tiempo que en la A2 ponemos un 0 lógico.
El código para este caso es sencillo, veamos un ejemplo:
Code:
/*
* 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 el pin 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
*
*/
void loop() {
digitalWrite( pinA1, HIGH); // Valores ALTO en A y BAJO en B simulaneamente
digitalWrite( pinB1, LOW); // hacen girar el motor 1 hacia ADELANTE
valorPot = analogRead(pinPot); // Lee el valor del potenciometro
valorVeloc = map(valorPot, 0, 1023, 55, 255); //Convierte un valor entre 0 y 1023 al rango 0 -
255
// valorVeloc = valorPot / 4 ; // segunda opción
analogWrite(pinEN1, valorVeloc);// y establece la velocidad del motor con ese valor
}
/* 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 considero necesario entrar
en mayores detalles. Copie el código o si lo prefiere, bájelo de aquí
y cárguelo en el IDE, para comprobar su efectividad.
He realizado este ejemplo, utilizando un escudo para Arduino,
realizado con placa de tiras preformada, como se puede apreciar en
la imagen de abajo, el esquema utilizado corresponde a la imagen
anterior. Sigue una demo del resultado obtenido.
Vídeo.
http://hispavila.com/3ds/atmega/motorescc.html
El L293
El circuito integrado L293B, es un driver de 4 canales, capaz de
proporcionar una corriente de salida de hasta 1A por canal. Cada
canal, se puede controlar por señales de entrada compatibles TTL y
cada pareja de canales dispone de una señal de habilitación que
desconecta las salidas de los mismos.
Ahora, vamos a ocuparnos del código necesario para controlar un
motor de corriente continua con Arduino. He decidido probar una idea
para que los que tengan interés en hacer su primer mini robot,
empiecen con una experiencia que les anime y levante la moral.
La idea es que con un motor de juguete, movamos el eje delantero
de una pequeña caja, cualquier recinto pequeño nos puede servir, en
esta, tiene que alojar las cuatro pilas de 1'5V con su porta pilas, el
propio Arduino, el motor, el soporte del eje y una rueda de giro libre
en todas direcciones. Algo parecido a la imagen.
void setup() {
// pone el switch como una entrada
pinMode(switchPin, INPUT);
digitalWrite(switchPin, HIGH);
// pone todos los otros pines usados como salidas
pinMode(motor1Pin, OUTPUT);
pinMode(motor2Pin, OUTPUT);
pinMode(speedPin, OUTPUT);
pinMode(ledPin, OUTPUT);
void loop() {
// si el switch es high, motor gira en una direccion
if (digitalRead(switchPin) == HIGH) {
digitalWrite(motor1Pin, LOW); // pone motor1 del H -bridge low
digitalWrite(motor2Pin, HIGH); // pone motor2 del H -bridge high
}
/* 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);
}
}
En los ejercicios que se han desarrollado en este documento, aunque
hemos utilizado el circuito integrado L293, tan sólo se ha empleado
de los cuatro, un amplificador para manejar el motor o dos
amplificadores, uno para cada devanado del motor. La parte más
relevante de este circuito integrado, está en utilizar los cuatro
amplificadores de forma que se conoce como Puente-H.
Although I’ve only used 1 motor, it is possible to use 2 motors on a single L293D chip,
of course you then have to compensate on the current accordingly to ensure enough
juice for both motors under peak load. Remember that if you use 2 motors, the power
source will be the same voltage but the current needed will be doubled – a good start is
by altering how your batteries are connected in series or parallel.
“The L293D is a monolithic integrated, high voltage, high current, 4-channel driver.”
Basically this means using this chip you can use DC motors and power supplies of up to
36 Volts, thats some pretty big motors and the chip can supply a maximum current of
600mA per channel, the L293D chip is also what’s known as a type of H-Bridge. The
H-Bridge is typically an electrical circuit that enables a voltage to be applied across a
load in either direction to an output, e.g. motor.
This means you can essentially reverse the direction of current and thus reverse the
direction of the motor. It works by having 4 elements in the circuit commonly known as
corners: high side left, high side right, low side right, and low side left. By using
combinations of these you are able to start, stop and reverse the current. You could
make this circuit out of relays but its easier to use an IC – The L293D chip is pretty
much 2 H-Bridge circuits, 1 per side of the chip or 1 per motor.
The bit we really care about in all of this is the 2 input pins per motor that do this logic
and these, more importantly for our needs, can be controlled from the Arduino board.
You also don’t have to worry about voltage regulation so much because it allows for 2
power sources – 1 direct source, upto 36V for the motors and the other, 5V, to control
the IC which can be supplied from the Arduino power supply or since my motor power
supply is only 6V I’m going to use this (if the motor supply was higher I would consider
using a transistor or voltage regulator). The only thing to remember is that the
grounding connection must be shared/ common for both supplies. Below you can see
the pin layout for the chip and the truth table showing the output logic.
Pin 1 Pin 2 Pin 7 Function
High Low High Turn clockwise
High High Low Turn anti-clockwise
High Low Low Stop
High High High Stop
Low Not applicable Not applicable Stop
Generally speaking most DC motors require a lot more current than the Arduino board
can provide for instance the motor that I’m using needs around 5 to 6 Volts. Now I
could use a 12 Volt power source for the Arduino, but then its going to drain quickly
when it has to power everything, especially if I was to add in another motor and a
couple of servos, so instead my Arduino runs off of my 9 Volt power supply I made.
(here)
You’ll need a few capacitors in this circuit to smooth out the power load to the motors
as much as possible to help avoid any spikes and stabalise the current. I’m using a 50
Volt 10 uF capacitor on the power supply – I suggest you do this as the bare minimum.
You could also add in a capacitor for each motor that you use – something like a 220nF
multilayer ceramic capacitor should be OK for the small motors.
1. Enables and disables the motor whether it is on or off (high or low) comes from
the Arduino digital PWM pin 9
2. Logic pin for the motor (input is either high or low) goes to Arduino digital pin
4
3. Is for one of the motor terminals can be either +/-
4. Ground
5. Ground
6. Is for the other motor terminal
7. Logic pin for our motor (input is either high or low) goes to Arduino digital
PWM pin 3
8. Power supply for the motor, this should be given the rated voltage of your
motor, so mine is from a 6V supply
9. Enables and disables the 2nd motor on or off (high or low)
10. Logic pin for the 2nd motor (input is either high or low)
11. Is for one of the 2nd motor terminals can be either +/-
12. Ground
13. Ground
14. Is for the 2nd motors other terminal
15. Logic pin for the 2nd motor (input is either high or low)
16. Connected to +5V, in this case the power from motor supply
You can see from my photos how I’ve placed the L293D and wired it according to the
above pins. Next I have my switch on Arduino digital pin 2 and I have the GND pin
from Arduino connected to the GND rail on my breadboard. I also add the capacitor in
between the power supply – making sure that the negative and positive terminals are
correctly aligned. Finally I complete the circuit by adding in wires to carry the current
from one side of the breadboard to the other and I add in the motor and its power
supply.
Arduino L293D code original
So the final bit is to upload the sketch below to the board and give it a test
}
}
COMO FUENTE DE ALIMENTACIÓN SE PUEDE PONER UN CARGADOR
SONY ERICSSON CONVENCIONAL DE 5V EN LUGAR DE LAS PILAS
BB
CC
DD
EE
/*
* motordc potenciometro y boton cambia dirección
* Hace girar un motor de CC mediante un L293 conectado a los pines digitales
* 3 y 4 controlando la velocidad por PWM sobre el pin 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: sergioc64 el 27.02.201 2
*
*/
void setup() {
Serial.begin(9600);
pinMode(switchPin, INPUT); // set the switch as an input:
pinMode(motor1Pin1, OUTPUT); // set all the other pins you're using as outputs:
pinMode(motor1Pin2, OUTPUT);
pinMode(enablePin, OUTPUT);
digitalWrite(enablePin, HIGH);// set enablePin high so that motor can turn on:
pinMode(pinPot, INPUT);
}
void loop() {
// if the switch is high, motor will turn on one direction:
if (digitalRead(switchPin) == HIGH) {
digitalWrite(motor1Pin1, L OW); // set pin 2 on L293D low
digitalWrite(motor1Pin2, HIGH); // set pin 7 on L293D high
analogWrite(enablePin, valorVeloc);// y establece la velocidad del motor con ese valor
Serial.println(valorVeloc);
}
// if the switch is low, motor will turn in the opposite direction:
else {
digitalWrite(motor1Pin1, HIGH); // set pin 2 on L293D high
digitalWrite(motor1Pin2, LOW); // set pin 7 on L293D low
valorPot = analogRead(pinPot); // Lee el valor del potenciometro
valorVeloc = map(valorPot, 0, 1023, 55, 255); //Convierte un valor entre 0 y 1023 al rango
0-255
// valorVeloc = valorPot / 4 ; // segunda opción
analogWrite(enablePin, valorVeloc);// y establece la velocidad del motor con ese valor
Serial.print("switch low..");
delay(1000);
Serial.println(valorVeloc);
}
}
EasyDriver 4.2 Tutorial
(FUNCIONA)
Finally I had some time to do a tutorial on the Easydriver v4.2 board. The
following example code is just for demonstrating the board's new functionality. It
is was tested on a sparkfun stepper motor. You will notice in the code that each
time the step mode changes, so to does the delay time between steps and the
number of steps per revolution. The is not absolutely necessary but it helps you
compare the differences between stepping modes.
Make sure you have the serial monitor open in the Arduino IDE when running
this code. This will give you some feedback about the various modes of the
board as they switch on an off.
Note: For real world use I would recommend hard-wiring the MS1 and MS2 pins
to some switches to pull them high or low. This way you can free up some more
pins on your Arduino.
For a tutorial on how to use the Easydriver v3.1 check out this post
CODIGO: ok!
/ // /// /// // /// // /// /// // /// /// // /// // /// /// /// // /// /// // ///
/ / St epper M ot or sk ect h f or use wi th t he EasyD ri ver v4. 2 / /
/ // /// /// // /// // /// /// // /// /// // /// // /// /// /// // /// /// // ///
/ // /// E D _ v4 St ep M od e C hart // // //
// //
/ / M S1 M S2 R esol uti on //
/ / L L Full st ep ( 2 phase) / /
/ / H L H alf st ep //
/ / L H Q uart er st ep //
/ / H H E i ght h st ep //
// //
/ // /// /// // /// // /// /// // /// /// // /// /
i nt D IR = 3; / / PIN 3 = D IR
i nt STE P = 2; // PI N 2 = STE P
i nt M S1 = 13; // PI N 13 = M S
i nt M S2 = 9; // PI N 9 = M S2
i nt SLE EP = 12; // PIN 12 = SL P
voi d l oop( )
{
i nt modeT ype = 1; / / T hi s num b er i ncreases b y m ult i pl e of 2 each t hroug h t he whi l e
l oop..
// .. t o i d enti f y our st ep m od e t ype.
whil e ( mod eT ype<=8){ // l oops t he f oll owi ng bl ock of cod e 4 ti m es b ef ore repeati ng .
dig it alW rit e( DI R, L O W) ; / / Set t he d irect i on chang e L OW t o H I GH t o g o i n opposi t e
di rect i on
dig it alW rit e(M S1, M S1_ M OD E( m od eT ype) ) ; / / Set st at e of M S1 b ased on t he ret urned val ue f rom t he
M S1_M O DE () swi t ch st at em ent .
dig it alW rit e(M S2, M S2_ M OD E( m od eT ype) ) ; / / Set st at e of M S2 b ased on t he ret urned val ue f rom t he
M S2_M O DE () swi t ch st at em ent .
dig it alW rit e( SLE E P, H I GH) ; / / Set t he Sl eep m od e t o A WA KE.
i ++;
}
modeType = m od eT ype * 2; / / M ul ti pl y t he current m od eT ype val ue b y 2 and m ak e t he resul t
t he new val ue f or m od eT ype.
// T hi s wi ll m ak e t he m od eT ype vari abl e count 1, 2, 4, 8 each t i m e we pass
t houg h t he whi l e l oop.