Microcontroladores Parte 2
Microcontroladores Parte 2
02 - Estructura de un Programa
Universidad de Sonora
31 de enero de 2019
2 Variables
3 Constantes
Estructura básica de
un sketch
void setup() {
declaraciones;
}
void loop() {
instrucciones;
}
setup()
La función setup() se invoca una sola vez cuando el programa empieza. Se utiliza para
inicializar los modos de trabajo de los pines, o el puerto serie. Debe ser incluida en un
programa aunque no haya declaración qué ejecutar.
función setup()
void setup() {
pinMode(pin, OUTPUT); // configura el 'pin' como salida
}
loop()
La función loop() hace precisamente lo que sugiere su nombre, se ejecuta de forma
cíclica, lo que posibilita que el programa esté respondiendo continuamente ante los
eventos que se produzcan en la tarjeta.
función loop()
void loop() {
digitalWrite(pin, HIGH); // pone en uno (on, 5v) el 'pin'
delay(1000); // espera un segundo (1000 ms)
digitalWrite(pin, LOW); // pone en cero (off, 0v) el 'pin'
delay(1000);
}
Comentarios de línea //
Los comentarios de una sola línea comienzan con doble diagonal // y terminan al dar
enter en esa línea de código (no requieren un símbolo para terminarlos).
Llaves {. . .}
Las llaves definen el comienzo y el fin de bloques de función o bloques de declaración
(como setup(), loop(), if, for...).
La llave { indica el comienzo de un bloque de instrucciones, finalizando con la llave de
cierre }. Las llaves deben estar balanceadas.
Operador coma ,
El operador coma sirve para separar variables o argumentos de entrada de una función o
instrucción de programación.
Por ejemplo:
int i = 0, j = 100, k;
x = suma(a, b);
Variables
Una variable es una manera de nombrar y almacenar un valor numérico para su uso
posterior por el programa. Como su nombre indica, las variables son números que se
pueden variar continuamente a diferencia de lo que ocurre con las constantes cuyo valor
nunca cambia. Una variable debe ser declarada y, opcionalmente, asignarle un valor. El
siguiente código de ejemplo declara una variable llamada variableEntrada y luego le
asigna el valor obtenido en la entrada analógica del PIN2:
Nota: Las variables deben tomar nombres descriptivos, para hacer el código más legible.
Nombres de variables pueden ser “contactoSensor” o “pulsador”, para ayudar al
programador y a cualquier otra persona a leer el código y entender lo que representa la
variable. Nombres de variables como “var” o “valor”, facilitan muy poco que el código
sea inteligible. Una variable puede ser cualquier nombre o palabra que no sea una palabra
reservada en el entorno de Arduino.
Tabla 1: Reglas para Identificadores. (Para nombrar variables, constantes, funciones, etiquetas....)
Todas las variables tienen que declararse antes de que puedan ser utilizadas. Para declarar
una variable se comienza por definir su tipo como int (entero), long (largo), float (punto
flotante), etc., asignándoles siempre un nombre, y, opcionalmente, un valor inicial. Esto
sólo debe hacerse una vez en un programa, pero el valor se puede cambiar en cualquier
momento usando aritmética y reasignaciones diversas. Esto se llama una asignación.
Ejemplos de declaraciones de variables:
int entradaVariable = 0;
byte b0, b1, b2;
int puerto[] = 0, 3, 5, 7, 9;
Una variable puede ser declarada en una serie de lugares del programa y en función del
lugar en donde se lleve a cabo la definición esto determinará en qué partes del programa
se podrá hacer uso de ella.
Constantes
Constante Descripción
\0 Nulo o fin de un apuntador
\t Inserta tabulación horizontal
\ Barra invertida
\r Retorno de carro
\n Inserta una nueva línea
\b Espacio a atrás
\v Inserta tabulación vertical
\f Salto de página
\o, OCT Despliega números en formato octal (base 8)
\x, HEX Formato hexadecimal (base 16)
BIN Despliega números en formato binario
Constante Descripción
\0 Nulo o fin de un apuntador
\t Inserta tabulación horizontal
\ Barra invertida
\r Retorno de carro
\n Inserta una nueva línea
\b Espacio a atrás
\v Inserta tabulación vertical
\f Salto de página
\o, OCT Despliega números en formato octal (base 8)
\x, HEX Formato hexadecimal (base 16)
BIN Despliega números en formato binario
Nota: Las constantes de la tabla se utilizan cuando se despliega información en el monitor
serial o en cualquier otro programa que permita desplegar texto en modo consola.
Para probar algunas de las constantes vistas, se podrá ejecutar el ejemplo ASCIITable.
Los pasos para hacerlo son:
Constante Descripción
true / false false se define como 0 (cero), mientras que true se asocia
con 1 , pero true también puede ser cualquier otra cosa excepto
cero. Por lo tanto, en sentido booleano, -1, 2 y -200 son todos
tomados como true.
HIGH / LOW Estas constantes definen los niveles de salida altos o bajos y se
utilizan para la lectura o la escritura digital para las patillas. HIGH
se define como en la lógica de nivel 1 , ON , o 5 voltios, mientras
que LOW es lógica nivel 0 , OFF , o 0 voltios.
INPUT / OUTPUT Se utilizan al inicio del programa (en la función setup) para definir
el modo de operación de los puertos digitales: INPUT (entrada)
y OUTPUT (salida).
INPUT_PULLUP Las tarjetas Arduino tienen de manera interna resistencias que
están conectadas a la fuente interna pull-up resistors, las cuales
se pueden usar indicando en la función pinMode(INPUT_PULLUP)
.
pinMode(pin, mode)
Esta instrucción es utilizada en la parte de configuración setup () y sirve para configurar
el modo de trabajo de un PIN pudiendo ser INPUT (entrada) u OUTPUT (salida).
Nota: Las terminales de Arduino, por defecto, están configuradas como entradas, por lo
tanto no es necesario definirlas en el caso de que vayan a trabajar como entradas. Los
pines configurados como entrada quedan, bajo el punto de vista eléctrico, como entradas
en estado de alta impedancia.
Es recomendable colocar una resistencia de pull-up a los pines de entrada. Estos pines
tienen a nivel interno una resistencia de 20 KΩ a las que se puede acceder mediante
software. Estas resistencias se acceden de la siguiente manera:
Los pines configurados como OUTPUT (salida) se dice que están en un estado de baja
impedancia y pueden proporcionar 40 mA (miliamperios) de corriente a otros dispositivos
y circuitos. Esta corriente es suficiente para alimentar un diodo LED (no olvidando poner
una resistencia en serie), pero no es lo suficiente grande como para alimentar cargas de
mayor consumo como relés, solenoides, o motores.
Un cortocircuito en las patillas Arduino provocará una corriente elevada que puede dañar
o destruir el chip Atmega. A menudo es una buena idea conectar en la OUTUPT (salida)
una resistencia externa de 470 o de 1000 Ω.
Los resistores de pull up se usan en circuitos electrónicos para asegurar que las entradas
al Arduino se mantengan en niveles lógicos esperados aún si los aparatos externos se
desconectan o están en alta impedancia. Sólo por el hecho de no tener nada
conectado a una entrada no significa que ésta es un cero lógico.
Pull Up
Pull Down
digitalRead(pin)
Lee el valor de un pin (definido como digital) dando un resultado HIGH (alto) o LOW
(bajo). El pin se puede especificar ya sea como una variable o una constante (0-13).
digitalWrite(pin, estado)
Envía al ’pin’ definido previamente como OUTPUT el valor HIGH o LOW (poniendo en 1
o 0 la salida). El pin se puede especificar ya sea como una variable o como una constante
(0-13).
Ejemplo 2.
Entrada/Salida digital
Ejemplo_Led_PB.ino
void setup( ) {
pinMode(led, OUTPUT); // configura el led (pin13) como salida
pinMode(boton, INPUT); // configura boton (pin7) como entrada
}
void loop( ) {
valor = digitalRead(boton); // lee estado de la entrada boton
digitalWrite(led, valor); // envia a la salida 'led' el
// valor leido
}
Ejemplo_Led_PB_pullup.ino
void setup( ) {
pinMode(led, OUTPUT); // configura el led (pin13) como salida
pinMode(boton, INPUT); // configura boton (pin7) como entrada
digitalWrite(boton, HIGH); // con esto activamos la resistencia
// interna de pull-up
}
void loop( ) {
valor = digitalRead(boton); // lee estado de la entrada boton
digitalWrite(led, valor); // envia a la salida 'led' el
// valor leido
}
Los registros de puertos permiten un manejo más rápido y a nivel interno de los pines de
entrada y salida de la tarjetas Arduino.
Las tarjetas Arduino uno tienen tres puertos:
B (pines digitales 8 al 13)
C (pines de entrada analógica)
D (pines digitales 0 al 7)
Cada Puerto se controla mediante tres registros, que están definidos como variables en el
lenguaje de Arduino. El registro DDR, determina si el pin es OUTPUT o INPUT. El
registro PORT controla si el pin es HIGH o LOW, y el registro PIN lee el estado de los
pines INPUT puestos mediante pinMode().
Los registros DDR y PORT pueden ser de lectura y escritura. Los registros PIN sólo ser
de lectura.
// Ejemplo ManejoPuertos.ino
void setup( ) {
DDRD = B11111110; // configura el puerto D, pines del D1 al D7
// como salida y el pin D0 como entrada
}
void loop( ) {
PORTD = B10101000; // enciende los pines digitales D7, D5 y D3
}
Los operadores lógicos realizan cálculos bit por bit en cada variable.
Operador Símb. Descripción Ejemplo
AND & Realiza la operación byte a = 92; // B01011100
lógica AND byte b = 101; // B01100101
byte c = a & b; // B01000100
OR | Realiza la operación byte a = 92; // B01011100
lógica OR byte b = 101; // B01100101
byte c = a | b; // B01111101
XOR ^ Realiza la operación byte a = 92; // B01011100
lógica XOR byte b = 101; // B01100101
byte c = a ^ b; // B00111001
NOT ~ Cambia cada bit a byte a = 92; // B01011100
su opuesto. byte b = ~a; // B10100011
Corrimien- >> Realiza un corrimien- byte a = 92; // B01011100
to o to de bits indicado byte b = a>>3; // B00001011
<< por el número de posi- byte c = a<<1; // B10111000
ciones especificado
// Ejemplo Blink_Pin_5
// Demo para OR Exclusiva
void setup( ) {
DDRD = DDRD|B00100000; // configura el pin D5 como OUTPUT
Serial.begin(9600);
}
void loop( ) {
PORTD = PORTD^B00100000; // invierte el bit 5.
Serial.print("Valor: ");
Serial.println(PORTD, BIN);
delay(1000);
}