[Tutorial] Primeros pasos con Arduino parte #2 // Firsts steps with Arduino #part 2

in #utopian-io7 years ago (edited)

This tutorial is the continuation of Firsts Steps with Arduino series, this time we will talk about some basic functions the general workflow on arduino and interrupt functions to deeper our knowledge about the platform.

Este tutorial es el segundo de la serie de los tutoriales primeros pasos con Arduino. Esta dirigido a principiantes en la plataforma de Arduino, que quieran conocer el mundo de la electrónica y el software openSource.

¿Qué se aprenderá con este tutorial?

  • Conceptos básicos de electrónica.
  • Profundizar en el uso de las funciones principales de arduino y algunos conocimientos de lenguaje C.
  • Código y conexión con un pulsador para encender 2 leds de manera intermitente usando interrupciones.

Requerimientos

  • Tarjeta Arduino (Uno)
  • Cable USB tipo B
  • El ide de programacion de arduino o platformio.
  • 1 boton
  • 2 resistencias de 330ohm
  • 2 leds

Dificultad

  • Básica

Conceptos básicos de electrónica

Ahora explicaré unos conceptos básicos sobre electricidad que lejos de ser conceptos técnicos permitirán entender mejor como usar el arduino.

Voltaje: Se conoce también como diferencia de potencial electrico. Para entender este concepto la mejor manera es imaginar el flujo de agua desde un punto de más altura o uno de menor altura. El agua en el punto más alto tiene un potencial mayor que el de menor altura esto permite que el agua fluya hasta abajo.

Para apreciarlo mejor se tiene la siguiente imágen:


waterfall_explanation.jpg


fuente

Ahora supongamos que el punto de mayor altura se reduce poco a poco hasta llegar al mismo nivel que el otro punto, ¿Qué sucedería?


lake_normal.jpg


fuente

El agua dejaría de fluir porque están al mismo nivel los 2 puntos (no hay diferencia entre ellos). Este fenómeno donde existe un flujo debido a la diferencia de alturas se conoce como diferencia de potencial y en la electricidad es mejor conocido como Voltaje. Básicamente es la capacidad que se tiene para hacer que algún elemento fluya de un lado a otro.

Corriente: La corriente es el análogo al agua en la definición anterior. Es el elemento que fluye desde un punto de mayor altura a uno de menor altura. En el caso de la electrónica lo que fluye entre la diferencia de potencial no es agua sino electricidad.

Resistencia: La resistencia es una propiedad que tienen algunos materiales para evitar que fluya la electricidad. Mientras mayor sea el valor de la resistencia menor corriente pasará por un material, dado que ahora más dificil circular por él. En electrónica se usan componentes discretos tales como :


resistor.jpg

fuente

Todos los componentes electrónicos funcionan mediante circuitos electrónicos. Estos circuitos son especies de mapas de corrientes y voltajes que indican (según cuanta corriente pase o cuanto voltaje exista) que debe hacer el componente.

Notese y es muy importante destacar que los componentes electrónicos no pueden recibir una cantidad de corriente ilimitada, si se sobrepasa el limite máximo de lo que pueden recibir se estropearán, lo mismo sucede con el voltaje hay un límite de voltaje que pueden tener los componentes antes de dañarse.

El arduino es básicamente un circuito electrónico muy grande que genera (dependiendo de lo que se programe) en sus salidas voltajes que llamaremos señales, y recibe en sus entradas otras señales que se encarga de procesar.

Pines digitales y análogicos

Hay básicamente 2 tipos de señales para el arduino.

Las señales analógicas son señales que pueden representar una corriente o un voltaje con muchos niveles, es decir, en un momento el voltaje puede ser 2 , luego 3 , luego 2.1 y asi sucesivamente.

Una señal de este tipo es de la forma :

sinusoidal.jpg

fuente

Normalmente estas señales se les denomina señales analógicas porque estan representando valores de un estimulo físico que es cambiante. Los pines del arduino que reciben este tipo de señales se les llama pines analógicos y estan marcados en el arduino con la letra "A" ejemplo A0,A1, etc.

Por otra parte existen otros tipos de señales conocidas como señales digitales las que solo tienen de manera general 2 valores posibles. 0 y y otro valor que depende del dispositivo. Hay alunos dispositivos que funcionan con 5V y otros a 3.3V.

Los pines que mandan este tipo de señal se les denomina pines digitales. Más adelante estudiaremos un poco mas a detalle las implicaciones de estas señales digitales.

Funciones básicas para el manejo de la plataforma

En el tutorial anterior se estudió básicamente en que consisten las funciones void setup() y void loop() si no recuerdas mucho de ellas es recomendable que veas el tutorial anterior en Primeros pasos con Arduino parte #1

int led = 6;

void setup(){

  pinMode(led,OUTPUT);
  digitalWrite(led,HIGH);

}

void loop(){

delay(5);

}

Cada vez que se define una función, dentro de ella se crea un scope en donde se definen las variables que se usarán dentro de dicha función.

Una función no puede llamar variables que se encuentren definidas dentro de otra función (en un scope diferente al suyo). Es decir normalmente si definimos una variable en el void setup() dicha variable no se encontrará disponible en la función void loop() dado que tienen diferentes scopes.

Existen variables que se encuentran en el scope global de toda el programa. Estas variables se conocen comovariables globales. Las funciones si no encuentran la definición de una
variable en su scope local buscarán en el scope global, por lo que todas las funciones definidas dentro del programa pueden usar las variables globales a su conveniencia.

En el caso del código anterior puede notarse que la variable led se definió fuera de las funciones (en el scope global) lo que la hace una variable global y puede ser usada por todas las funciones del programa.

Por otra parte dentro del void loop() se utilizó una función denominada delay la cual se encarga de hacer que el procesador espere cierte cantidad de milisegundos antes de seguir con la siguiente línea de código a ejecutar

En el siguiente ejemplo veremos como hacer que un led se encienda y apague cada 1 segundo para demostrar el uso del delay. Pero primero debemos hacer las conexiones del circuito, las cuales se muestran a continuación:

led_basic.jpg

Luego de tener el circuito se procedé a escribir el código

int led = 6;

void setup(){

  pinMode(led,OUTPUT);
  digitalWrite(led,HIGH);

}

void loop(){

delay(1000);
digitalWrite(led,LOW);
delay(1000);
digitalWrite(led,HIGH);

}

Luego se compila y programa el arduino con los diferentes métodos que se mencionaron en la primera parte de esta serie.

Como se mencionó anteriormente los componentes electrónicos no pueden recibir una cantidad de corriente ilimitada, y el led solo puede recibir una poca cantidad antes de dañarse, por lo tanto es necesario colocar una resistencia para limitar la cantidad de corriente que pasa por él como se ve en el circuito.

El código anterior configura como salida el pin donde se conectará el led, luego dentro del loop esperará 1sg encendido usando la funcion de delay (el argumento de la función esta dada en milisegundos 1sg= 1000ms ). Se apagará porque la señal se coloca en 0 y esperará otro segundo en LOW para volver a encenderse con el valor de HIGH y repetir el ciclo nuevamente.

Así es como se logra que un led haga un "blink". Si queremos cambiar la frecuencia en que se enciende y se apague se puede jugar con los valores de delay.

Pero la funcion delay(ms) es una función que causa que se detenga la ejecución de la siguiente línea de código hasta que pase la cantidad de tiempo especificada. El problema con eso es que bloquea la ejecución de cualquier otro proceso, por lo que se desperdician los recursos del procesador. Lo mejor sería aprovechar el tiempo mientras se espera para hacer algún otro cálculo y cuando se terminé volver a la sección de código donde se estaba esperando.

Esa es la idea detrás de las interrupciones. Es un evento que interrumpe el flujo normal del programa. Al dispararse "interrumpe" la ejecución del programa, realiza algún procedimiento y luego se devuelve al punto del programa donde se disparó la interrupción.

Para ejemplificar lo anterior se creará un código para el siguiente circuito:

pinInterrupción.jpg

Para entender mejor el flujo de corriente para los 2 leds a continuación las siguientes imágenes:

pinInterrupción1.jpg

pinInterrupción2.jpg

Un led como se hizo en el código anterior parpadeará cada 2sg. Durante todo el programa. Pero se conectará adicionalmente un switch y otro led.Este segundo led se encenderá sin importar el estado del primer led (esté o no esperando por el delay) al presionar el botón.


const byte ledPinRed = 6;
const byte ledpinGreen = 5
const byte interruptPin = 2;

volatile byte stateGreen =LOW;

void setup() {

  pinMode(ledPinRed, OUTPUT);
  pinMode(ledPinGreen, OUTPUT);

  pinMode(interruptPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(interruptPin), TurnOnLed, CHANGE);
}

void loop() {

  delay(1000);
  digitalWrite(ledPinRed, stateRed);
  delay(1000);
  digitalWrite(ledPinRed, stateRed);

}

void TurnOnLed() {

  stateGreen = ! stateRed;

}

Este código es un poco más complejo que el anterior. Aparte de contar con las funciones básicas de void loop() se tiene una función TurnOnLed() la cual se llama cuando se activa el pulsador.
Por otra parte en el setup se invoca a la función attachInterrupt(int pin number, ISR, modo) la cual asigna al pin seleccionado (en este caso el pin2) una interrupción.

Los parámetros que recibe esta función son:

  • pin de interrupción. En este caso se configura usando la función digitalPinToInterrupt(interruptPin) la cual mapea el número del pin que se le pasó como parámetro a la interrupción correcta. Es realizado de esta manera para evitar problemas de compatibilidad del código cuando se usen en diferentes boards de arduino.

  • ISR : El nombre de la función que se invocará cuando ocurra una interrupción.

  • Modo: Indica con que evento se activará la interrupción. Existen 4 modos básicos

  1. LOW: Activa la interrupción cuando el pin de interrupcion este en LOW.
  2. CHANGE: Activa la interrupción en cualquier momento que el pin cambie de valor.
  3. RISING: Activa la interrupción cuando el pin vaya de LOW to HIGH.
  4. FALLING: Activa la interrupción cunado el pin vaya de HIGH to LOW.

Si quieres más informacion sobre la función attachInterrupt() puedes leer m[as sobre ella en la
documentación oficial documentación arduino

Debe destacarse que no todos los pines del arduino pueden ser utilizados para las interrupciones. Cada arduino tiene solo un conjunto de pines predefinidos que pueden servir como interrupciones, en el caso del arduino Uno son los pines 2 y 3.

Además de lo anterior existen varios tipos de interrupciones, las que utilizamos en el ejemplo se les conocen como interrupciones externas, pero hay otras interrupciones que se manejan dentro del microcontrolador, tales como las interrupciones por temporizadores, las interrupciones por perifericos como el UART, o como las interrupciones del ADC las cuales indican que una conversión en el módulo esta lista.

Ahora solo basta con compilar nuestro código ya sea con el IDE de arduino o con platformio (después de haber creado el proyecto) y podremos probar nuestro código.

Si no sabes como compilar el código con las herramientas anteriores te sugiero que te dirijas a el tutorial anterior Primeros pasos con arduino parte #1 donde se habla a detalle de las herramientas a utilizar.

El resultado final:

led_1.jpg

led2.jpg

led3.jpg



Posted on Utopian.io - Rewarding Open Source Contributors

Sort:  

Thank you for the contribution. It has been approved.

You can contact us on Discord.
[utopian-moderator]

Hey @fuzeh, I just gave you a tip for your hard work on moderation. Upvote this comment to support the utopian moderators and increase your future rewards!

Hey @cris22 I am @utopian-io. I have just upvoted you!

Achievements

  • You have less than 500 followers. Just gave you a gift to help you succeed!
  • Seems like you contribute quite often. AMAZING!

Suggestions

  • Contribute more often to get higher and higher rewards. I wish to see you often!
  • Work on your followers to increase the votes/rewards. I follow what humans do and my vote is mainly based on that. Good luck!

Get Noticed!

  • Did you know project owners can manually vote with their own voting power or by voting power delegated to their projects? Ask the project owner to review your contributions!

Community-Driven Witness!

I am the first and only Steem Community-Driven Witness. Participate on Discord. Lets GROW TOGETHER!

mooncryption-utopian-witness-gif

Up-vote this comment to grow my power and help Open Source contributions like this one. Want to chat? Join me on Discord https://discord.gg/Pc8HG9x