Explicación del código
nota: el contenido es en su totalidad de lectura solo abra un par de imagenes y estas las usare de referencia para explicar
nota 2: las imgenes me las robe de google
Empecemos por las variables int , estas contienen un array de pines que la primera
(int inputPins[--] = {2,3,4,5}; ) se encargará de los pulsadores y su estado, y el segundo
(int ledPins[--] = {10,11,12,13}; )controla la señal de los leds.
Los arrays son colecciones de variables consecutivas del mismo tipo. Cada variable
en la colección se llama elemento. El número de elementos se llama la dimensión del
array. El ejemplo anterior muestra un uso común de los arrays en el código de Arduino:
Aquí los pins se conectan a pulsadores y LEDs . Las partes importantes de este ejemplo
son la declaración de la matriz y el acceso a los elementos de la matriz.
En este caso los arrays son de cuatro elementos.
El primer elemento se fija igual a 2, el segundo a 3, y así sucesivamente:
int inputPins [--] = {2,3,4,5};
Esto declara un array de cuatro elementos con el valor inicial de cada elemento
puesto a cero. Este array tiene una dimensión de cuatro y puede contener, como
máximo, cuatro valores.
El primer elemento del array es el elemento [-0-]:
int primerElemento = inputPin[-0-]; // este es el primer elemento
El último elemento es uno menos que la dimensión, por lo que en el ejemplo anterior,
con una dimensión de cuatro, el último elemento es el elemento 3:
int ultimoElemento = inputPin [-3-]; // este es el último elemento
Puede parecer extraño que una matriz con una dimensión de cuatro tiene el elemento
de último acceso con arreglo [-3-], pero debido a que el primer elemento es array [0], los
cuatro elementos son:
array [-0-], array [-1-], array [-2-], array [-3-]
En el esquema anterior, se accede a los cuatro elementos mediante un bucle for:
for (int index = 0; index <4; index + +) // el index pasa el array por el bucle comprobando
que cumpla con las condiciones establecidas.
{
/ / Obtener el número de PIN de acceso a todos los elementos de las matrices de pines
pinMode (ledPins [--index--], OUTPUT); // declara LED como salida
pinMode (inputPins [--index--], INPUT); // declara pulsador como entrada
digitalWrite(inputPins[--index--],HIGH); // activa las resistencias pull-up
}
Este bucle se desplazará por el index variable con valores comenzando en 0 y
terminando en 3.
Es un error común es acceder accidentalmente un elemento que está más allá de la
actual dimensión de la matriz. Este es un error que puede tener muchos síntomas
diferentes y deben tomarse medidas para evitarlo.
Una manera de mantener sus arrays bajo control es establecer la dimensión del array
mediante el uso de una constante de la siguiente manera:
const int PIN_COUNT = 4; // se define una constante para el número de elementos
for (int index = 0; index<PIN_COUNT, index + +) //en PIN_COUNT ya ponemos
directamente 4 sin declararlo antes, así reducimos código
El compilador no notificará un error si accidentalmente se trata de almacenar o
leer más allá del tamaño del array.
{
for(int index = 0; index < 4; index++) //se realiza de nuevo el bucle
{
int val = digitalRead(inputPins[--index--]); //se lee el estado de los pulsadores
if (val == LOW) //comprueba si el estado del pulsador
{
digitalWrite(ledPins[---index---], HIGH); //enciende el led si el pulsador esta activo (cerrado)
}
else
{
digitalWrite(ledPins[--index--], LOW); //si el pulsador esta (abierto) el led está apagado
}
}
}
cuales son los componentes de la paca Arduino UNO r3.
aqui les explicare las partes, los componentes asi como unas recomendaciones
1: Puerto USB tipo B, se utiliza para comunicarse con la placa y tambien para la
alimentación de esta si la corriente demandada no excede de 500mA, en el punto 3
veremos porqué.
Pin 1=> Alimentación con un voltaje de 5V DC
Pin 2 y 3 => Sirven para la transmisión de datos del BUS
Pin 4 = Masa o tierra
Para conectar la placa al pc debemos utilizar un cable con conexión USB A-B, en un
extremo tiene conexión A (para PC) y en otra del tipo B (para la placa).
Este tipo de cable es muy común en algunos periféricos de pc como impresoras y
escaners, creo que no nos será difícil encontrar uno.
2: ATMEGA16U2 => Es el chip encargado de convertir la comunicación del puerto USB a
serie.
3: Fusible rearmable de intensidad máxima 500mA => Aunque la mayoría de pc's ya
ofrecen protección interna se incorpora un fusible con la intención de proteger tanto la
placa Arduino como el bus USB de sobrecargas y cortocircuitos.
Si circula una intensidad mayor a 500mA por el bus USB(Intensidad máxima de
funcionamiento), el fusible salta rompiendo la conexión de la alimentación.
4: Cristal oscilador de 16MHz necesario para el funcionamiento del reloj del
microcontrolador ATMEGA16U2.
5: Regulador de voltaje LP2985 de 5V a 3.3V que proporciona una corriente de
alimentación máxima de 150 mA.
6: Conector de alimentación hembra de 2,1 mm, debe
suministrarse un voltaje de entre 7-12 V (límites desde 6V a
20V como máximo).
Para alimentarla si es un pequeño proyecto como los que
haremos en este articulo son suficientes los 5V que nos
proporciona el puerto USB, pero si deseamos alimentarla en
estos u otros montajes mayores necesitaremos un cable con
una conexión macho de 2,1 mm como la que se muestra en la
imagen.
(existen muchos tipos, tiene que ser del tipo y entrada correcta)
7: Condensadores de 47µF de capacidad y 16V
8: Diodo M7 en la entrada de alimentación de la placa. Con este diodo conseguimos
establecer el sentido de circulación de la intensidad, de esta forma si se produce una
contracorriente debido a la apertura de un relé u otros mecanismos eléctricos, el diodo
bloqueará dicha corriente impidiendo que afecte a la fuente de alimentación.
9: IOREF=> Este pin esta conectado al de 5V situado a su lado y sirve para indicarle a la
shield el voltaje de funcionamiento de la placa arduino y en un futuro para establecer la
compatibilidad con placas AVR que funcionan también a 5V.
10: RESET => Esta planteado para trasladar el botón de reset a algunas shields, pero
también podremos utilizarlo en algunos proyectos en el que el botón reset de la placa
arduino no esté accesible. Si suministramos en este pin un valor de 0V resetearemos el
microcontrolador.
11: Es una fuente de tensión de 3.3V (generada por el regulador de voltaje del punto 5)
que como se ha dicho en el punto 5 proporciona una corriente máxima de 150mA.
OJO: Las placas que usan el chip FTDI para hacer la conversión de USB a serial (como por
ejemplo la Duemilanove) tienen un regulador de tensión interno con salida a 3.3V pero
proporcionan una intensidad máxima de 50mA. Debemos de tenerlo en cuenta para no
superar dicha intensidad.
12: Este pin tiene como salida una tensión de 5V regulada por el regulador de la placa.
OJO: El suministro de tensión a través de los pines de 5V o 3.3V no pasa por el regulador,
y puede dañar la placa. No es aconsejable utilizarlos como alimentación de la placa, están
diseñados como salida de tensión no como entrada.
13: Pines de toma de tierra.
14: Vin => Podemos emplear este pin para alimentar la placa si utilizamos una fuente de
alimentación externa, (no la podemos usar como alimentación si ya estamos
alimentando a través del puerto USB o de otra fuente de tensión por el conector de 2,1
mm señalado en el punto 6, entonces en este caso podremos usar esta clavija para
acceder al voltaje de alimentación), es decir, o usamos Vin exclusivamente para
alimentación o si alimentamos por otro medio como toma del voltaje de alimentación.
15: Entradas analógicas, cada una de ellas proporciona 10 bits(1024 valores).
Por defecto se mide de tierra a 5 voltios, aunque es posible cambiar la cota superior de
este rango usando el pin AREF y la función analogReference().
El microcontrolador Atmega328P-PU que usa Arduino lleva integrado un conversor
analógico-digital (A/D) de 6 canales. Tiene una resolución de 10 bits, retornando enteros
desde 0 a 1023. Mientras que el uso principal de estos pines por los usuarios de Arduino
es para la lectura de sensores analógicos, estos pines tienen también toda la
funcionalidad de los pines de entrada-salida de propósito general (GPIO).
Consecuentemente, si un usuario necesita más pines de propósito general de entradasalida,
y no se está usando ningún pin analógico, estos pines pueden usarse como GPIO.
16: ATMEGA328P-PU=> Es un microcontrolador de la marca Atmel que constituye el
procesador central de la placa. Este es el elemento que programamos para manipular sus
entradas y salidas.
Características:
Números de pines= 28
Voltaje de funcionamiento= 5V
Memoria Flash= 32Kbytes
EEPROM= 1Kbytes
SRAM= 2Kbytes
Velocidad del reloj= 16MHz
Corriente por pin = 40 mA
Descripción de los pines:
En este apartado explicaré la función de los pines del microcontrolador Atmega328. La
mayoría de ellos conectan directamente con las entradas y salidas de la placa y serán
explicados profundamente en su punto correspondiente.
PC6 → 1 : Cuando alimentamos la placa arduino bien por usb o con alimentación externa
en este pin tendremos un voltaje de aproximadamente 5V (microcontrolador
funcionando) y se resetea el microcontrolador cuando tenemos un nivel de voltaje bajo
durante más tiempo que la duración mínima del impulso. En el caso de la placa arduino
se produce el reseteo cuando ponemos la rama de alimentación a tierra (0V) pulsando el
botón de reset.
Para asegurarnos de un reseteo correcto pulsaremos el botón durante un par de
segundos.
Botón en estado normal NA (normalmente abierto), el pin 1 está a un voltaje de 5V.
Botón en estado pulsado (cerrado), el pin 1 está a un voltaje de 0V. Se resetea el
microcontrolador.
PD0 → 2 y PD1 → 3: Se corresponden con la entrada (RX) y la salida (LX) para la
transmisión de datos TTL (Transistor Transistor Logic).
VCC 7: → Aliementación del microcontrolador con 5V de corriente continua.
AVCC → 20: Es la toma de la tensión de alimentación (5V) para el conversor A/D.
GND 8 y GND 22: → → La abreviatura GND proviene del inglés (Ground), tierra en español o
comunmente conocida en la electrónica como masa. Es un punto del circuito que se
encuentra a un potencial de 0V.
PB6 → 9 y PB7 → 10: Son los pines a los que está conectado el oscilador formado por un
resonador de 16Mhz en paralelo con una resistencia de 1MΩ.
El circuito está conectado de la siguiente forma:
PD2 → 4, PD4 → 6, PD7 → 13, PB0 → 14, PB4 → 18, PB5 → 19: Pines digitales que pueden ser
configurados como entradas o salidas.
PD3 → 5, PD5 → 11, PD6 → 12, PB1 → 15, PB2 → 16, PB3 → 17: Pines digitales que soportan
modulación por ancho de pulso, (PWM) del inglés Pulse Width Modulation.
AREF 21: → Es el pin de referencia analógica para el conversor A/D
PC0 23, PC1 24, PC2 25, PC3 26, PC4 27, PC5 28: → → → → → → Entradas analógicas.
17: ICSP => Estos pines sirven para la
programación del ATMEGA328P-PU a través del puerto serie, de ahí las siglas ICSP (In Circuit Serial Programming), se utilizan para grabar el bootloader en el microcontrolador o modificarlo a través de este puerto sin necesidad de sacarlo del zócalo. El bootloader ya viene grabado de fábrica en este microcontrolador.
Podemos identificar el pin1 del ISCP en la placa fijándonos el pequeño punto blanco que
esta grabado sobre ella, ese punto nos indica que se trata del pin numero 1, igual ocurre
en los chips, microcontroladores y otros circuitos integrados.
18: Led de color verde que se enciende cuando la placa esta alimentada.
19: RX=> Entrada de datos TTL
20: TX=> Salida de datos TTL
21: PWM=> Pines digitales con PWM (Pulse Width Modulation) o Modulación por Ancho
de Pulso. Se pueden configurar como entradas o salidas Explicado brevemente una señal PWM es
una onda digital cuadrada, donde la frecuencia es constante, pero la fracción de tiempo en que la señal está encendida (el ciclo de trabajo) puede variar entre el 0 y el
100%. Como vemos en la imagen con analogWrite() podemos ir variando la frecuencia de la señal dando los valores apropiados que van desde 0 a 255.
22: Pines digitales que pueden configurarse como entradas o salidas, estos no disponen
de modulación por ancho de pulso.
Una particularidad de los pines 2 y 3 es que pueden ser configurados para activar una
interrupción en un valor bajo, un flanco ascendente o descendente, o un cambio en el
valor. Con attachInterrupt () podremos manejar esta característica de dichos pines.
23: Tierra (0v)
24: Tensión de referencia para las entradas analógicas. Podemos controlar dicho voltaje
con analogReference().
25: SDA => (Serial Data) linea de datos.
26: SCL => (Serial Clock) linea de reloj.
Estos dos pines SDA y SCL sirven para comunicarse con dispositivos I2C / TWI usando la
librería Wire.
27: DFU-ICSP=> Puerto ICSP para el microcontrolador ATMEGA16U2, como en el caso del
ATMEGA328P-PU se emplea para comunicarnos con el microcontrolador por el serial,
para reflashearlo con el bootloader, hacer algunas modificaciones, ponerlo en modo
DFU, etc...
28: JP2=> Pines libres del ATMEGA16U2, dos entradas y dos salidas para futuras
ampliaciones.
29: Encapsulados de resistencias.
30: Pulsador para resetear el microcontrolador central (ATMEGA328P-PU). Su
funcionamiento ya esta explicado en el punto 16 en el que se detallan los pines del
ATMEGA328.
31: Led conectado en paralelo entre el pin 13 y GND, cuando este pin tiene un valor
HIGH(5V) el LED se enciende y cuando este tiene un valor LOW(0V) este se apaga
32: Led TX
33: Led RX
Estos Leds TX y RX se encienden cuando se transmiten datos a traves del puerto serie, es
decir cuando estamos grabando el programa en el microcontrolador.
34: RESET-EN: Significa Reset enabled, en el habla hispana reset habilitado. Esta
habilitado el auto-reset, para deshabilitarlo por cualquier tipo de seguridad (por ejemplo
un proyecto que tenemos funcionando y no queremos que nadie lo reinicie) debemos
desoldar los pads RESET-EN y limpiarlos de forma que estean aislados el uno del otro.
35: Resonador cerámico de 16 Mhz para el microcontrolador ATMEGA328P-PU. Los
resonadores cerámicos son menos precisos que los cristales osciladores, pero para el
caso hace perfectamente la función y ahorramos bastante espacio en la placa.
Como se detalla en el punto 16, el resonador genera da base de tiempos para el
funcionamiento del microcontrolador.
aqui termina el proyecto de arduino