Lo visto hasta ahora son estructuras y sintaxis de programación que es casi genérica a C++, pero el core de Arduino incluye algunas funciones propias para el uso de Arduino como la lectura de entradas analógicas y digitales y la escritura de salidas analógicas y digitales.
Para saber más de C y de la API de Arduino:
- http://cslibrary.stanford.edu/101/EssentialC.pdf
- http://playground.arduino.cc/uploads/Main/arduino_notebook_v1-1.pdf
Veamos estas estructuras más específicas que están documentadas en el reference de Arduino https://www.arduino.cc/en/Reference/HomePage
Cómo Leer el Reference Arduino
En el reference de Arduino tenemos toda la información necesaria para entender cómo funciona el lenguaje o core de programación de Arduino. Está todo perfectamente documentado de cómo funciona cada estructura y cómo se comportan las funciones,
Reference: https://www.arduino.cc/en/Reference/HomePage
Cuando entramos en el reference y vemos un nuevo método o función deberemos leer:
- Description: Hace una descripción de lo que hace ese método y función
- Syntax: Sintaxis de la función con todas las formas de llamarlo y los parámetros a pasar. Puede haber varias formas de llamar a una función, por ejemplo https://www.arduino.cc/en/Reference/EthernetBegin
- Parameters: Descripción de los parámetros a pasar a esa función. Puede que no haya que pasar ninguno: https://www.arduino.cc/en/Reference/Millis
- Returns: que valor me devuelve y qué tipo de dato es. Puede que no devuelva nada como https://www.arduino.cc/en/Reference/PinMode
- Note: Nota sobre el uso de la función
- Example: Un ejemplo de cómo usar la función
- See Also: Otras funciones relacionadas
Entradas y Salidas Digitales
En arduino para tratar las entradas y salidas digitales usamos las siguientes funciones:
- pinMode() – configura en el pin especificado si se va a comportar como una entrada o una salida. http://arduino.cc/en/Reference/PinMode
- digitalWrite() – Escribe un valor HIGH o LOW en el pin digital especificado. Si el pin está configurado como OUTPUT pone el voltaje correspondiente en el pin seleccionado. Si el pin está configurado como INPUT habilita o deshabilita la resistencia interna de pull up del correspondiente pin. http://arduino.cc/en/Reference/DigitalWrite
- digitalRead() – lee el valor del pin correspondiente como HIGH o LOW. http://arduino.cc/en/Reference/DigitalRead
En la imagen siguiente se muestra el estado por defecto de una I/O digital en un microcontrolador de Arduino. Se ha simplificado con interruptores la compleja electrónica que hay dentro. Por defecto los digital I/O pins están configurados como inputs en un estado de alta impedancia (equivalente a una resistencia de 100 Mohms en frente del pin), es decir, SW3 a ON y no hace falta llamar a la función pinMode() aunque es recomendable para aclarar el código.
- PinMode(x, INPUT) –> SW3 = ON (resto a OFF). Los valores leídos serán aleatorios si el pin de Arduino está al aire. El pin está en un estado de alta impedancia (resistencia de 100 Mohms).
- PinMode(x,INPUT_PULLUP) –> SW3 = ON & SW4 = ON (resto a OFF). Los valores leídos sin nada conectado al pin es HIGH. La Resistencia R1 tiene un valor dependiendo del microcontrolador, pero tiene un valor entre 20kOhm y 150kOhm.
- PinMode(x, OUTPUT) & digitalWrite(x,HIGH) –> SW2 = ON & SW1 = +5V (resto a OFF). Estado de baja impedancia, no hay resistencia interna y es necesario poner una resistencia adecuada a la salida el pin para no superar los 40mA (source) máximos admitidos
- PinMode(x, OUTPUT) & digitalWrite(x,LOW) –> SW2 = ON & SW1 = GND (resto a OFF). Estado de baja impedancia, no hay resistencia interna y es necesario poner una adecuada para no superar los 40mA (sink) máximos admitidos
Entradas y Salidas Analógicas
En Arduino para tratar las entradas y salidas analógicas usamos las siguientes funciones:
- analogReference() – configura la referencia de voltaje usada para la entrada analógica. http://arduino.cc/en/Reference/AnalogReference
- analogRead() – lee el valor del pin analógico especificado. http://arduino.cc/en/Reference/AnalogRead
- analogWrite() – escribe un valor analógico (onda PWM) al pin especificado. No en todos los pines digitales se puede aplicar PWM. http://arduino.cc/en/Reference/AnalogWrite
Otras funciones interesantes con entradas/salidas analóicas:
- map(value, fromLow, fromHigh, toLow, toHigh): http://arduino.cc/en/Reference/Map
- constrain(x, a, b): http://arduino.cc/en/Reference/Constrain
La mayoría de Arduino no tienen salidas analógicas puras sino PWM. Algunos pines digitales pueden usarse como salidas analógicas PWM:
Las Salidas PWM (Pulse Width Modulation) permiten generar salidas analógicas desde pines digitales. Arduino Uno no posee salidas analógicas puras, sin embargo el Arduino Due sí tiene salidas analógicas puras mediante dos DAC. El arduino due, posee dos salidas analógicas puras mediante dos conversores digital a analógico. Estos pines pueden usarse para crear salidas de audio usando la librería correspondiente.
La modulación por ancho de pulsos (también conocida como PWM, siglas en inglés de pulse-width modulation) de una señal o fuente de energía es una técnica en la que se modifica el ciclo de trabajo de una señal periódica (una senoidal o una cuadrada, por ejemplo), ya sea para transmitir información a través de un canal de comunicaciones o para controlar la cantidad de energía que se envía a una carga.
El ciclo de trabajo de una señal periódica es el ancho relativo de su parte positiva en relación con el período. duty cycle = (tiempo que la salida está a uno o HIGH)/ (periodo de la función)
Diferentes valores de una señal PWM:
Entradas y Salida Avanzadas
Advanced I/O:
- tone() – Genera una onda cuadrada (ciclo y 50% de servicio) de la frecuencia especificada en un pin. Una duración se puede especificar, de lo contrario la onda continúa hasta una llamada a noTone (). El pin puede ser conectado a un zumbador piezo u otro altavoz para reproducir tonos.
- noTone() – Detiene la generación de una onda cuadrada provocada por tone(). No tiene ningún efecto si no se está generando el tono.
- shiftOut() – Desplaza un byte de datos de un bit cada vez. Comienza a partir del más o menos significativo. Cada bit es escrito en un pin cada vez que se produce un pulso de reloj.
- shiftIn() – Desplaza un byte de datos de un bit cada vez. Comienza a partir dell más o menos significativo. Para cada bit, el reloj es puesto a HIGH, el siguiente bit es leído de la línea de datos y entonces el reloj es puesto a LOW.
- pulseIn() – Lee un pulso de un pin. Si el valor es HIGH, la función espera a que el pin se ponga a HIGH, comienza a temporizar y espera hasta que el pin vuelve a LOW, devolviendo la longitud del pulso en microsegundos.
Ejemplo de uso: https://www.arduino.cc/en/Tutorial/ShiftOut
Bits y Bytes
Bits and Bytes
- lowByte(): extrae el byte más a la derecha (low-order o menos significativo de una variable.
- highByte(): extrae el byte más a la izquierda (high-order o más significativo de una variable.
- bitRead(): lee el bit de una variable numérica.
- bitWrite(): escribe el bit de una variable numérica
- bitSet(): pone a 1 un bit de una variable numérica
- bitClear(): pone a 0 un bit de una variable numérica
- bit(): Calcula el valor del bit especificado (el bit 0 es 1, el bit 1 es 2, el bit 2 es 4, etc.)
Constantes
Constants;
- HIGH | LOW – Al leer o escribir en un pin solo hay estas dos posibilidades. Su significado es diferente si el pin está configurado como INPUT o OUTPUT.
- INPUT | OUTPUT | INPUT_PULLUP – Modo en el que pueden configurarse los pines digitales.
- LED_BUILTIN – La mayoría de las placas Arduino tienen un pin conectado a un led en la placa y esta constante devuelve el número de pin en función de la placa.
- true | false – Representación de las constantes booleanes en arduino
- integer constants – son los números usados directamente en un sketch como ‘123’. Por defecto estos números son tratados como enteros pero puede cambiarse con los modificadores U y L. Las constante enteras se tratan como base 10 (decimal) pero puede usarse otra notación.
- floating point constants – al igual que las constantes enteras, las constantes de coma flotante permite definir los número decimales. Son posibles varias notaciones para expresar constantes de coma flotante, por ejemplo: n = .005. También pueden expresarse en notación científica como 2.34E5.
Utilidades
Utilities:
- sizeof() – devuelve el número de bytes en una variable o el número de bytes ocupados por un array.
- PROGMEM – se usa para guardar en la memoria flash en lugar de en la SRAM. Al usarlo le dice al compilador que ponga la información de la variable en la memoria flash en lugar de la SRAM, donde iría normalmente.
PROGMEM es parte de la librería pgmspace.h http://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html que solo está disponible para la arquitectura AVR, así que para usarlo hay que inclirla al principio del sketch con #include <avr/pgmspace.h>
La macro F() se puede usar para facilitar el manejo de PROGMEM en las instrucciones print, de forma que todo el texto a imprimir (ya sea en Serial, Ethernet u otra librería) se lea de la Flash y no ocupando tamaño en la SRAM. Esta macro está incluida en el core de Arduino.
Operadores Bit a Bit
Bitwise Operators:
- & (bitwise and)
- | (bitwise or)
- ^ (bitwise xor)
- ~ (bitwise not)
- << (bitshift left)
- >> (bitshift right)
Operadores Compuestos
Compound Operators
- ++ (increment)
- — (decrement)
- += (compound addition)
- -= (compound subtraction)
- *= (compound multiplication)
- /= (compound division)
- %= (compound modulo)
- &= (compound bitwise and)
- |= (compound bitwise or)
Ambito de las Variables y Calificadores
Variable Scope & Qualifiers
- variable scope – ámbito de la variable
- static – hace que el valor de una variable local persista más alla de la función haciendo que su valor se mantenga entre llamadas a funciones
- volatile – Declarar una variable volátil es una directiva para el compilador. Específicamente, dice al compilador que cargue la variable desde la RAM y no desde un registro de almacenamiento, que es una ubicación de memoria temporal donde se almacenan y manipulan las variables del programa. Bajo ciertas condiciones, el valor de una variable almacenada en registros puede ser inexacto.
- const – es un cualificador de variable que modifica el comportamiento de la variable haciendo que sea de solo lectura.
Se deben declarar como “volatile” cualquier variable que sea modificada dentro de la función llamada por una interrupción.
Funciones de Tiempo
Funciones para trabajar con el tiempo
- delay() – Para el programa en unidades de ms
- delayMicroseconds() – Para el programa en unidades de us
- micros() – Microsegundos transcurridos desde el inicio o reset de la placa
- millis() – Milisegundos transcurridos desde el inicio o reset de la placa
Funciones USB
Keyboard – Las funciones del teclado permiten que las tarjetas micro basadas en 32u4 o SAMD envíen las pulsaciones de teclas a un ordenador conectado a través del puerto USB nativo de su micro.
Mouse – Las funciones del ratón permiten a las tarjetas micro basadas en 32u4 o SAMD controlar el movimiento del cursor en un ordenador conectado a través del puerto USB nativo de su micro. Cuando se actualiza la posición del cursor, siempre es relativa a la posición anterior del cursor.
Funciones Matemáticas
La librería math.h ya está incluida por defecto en Arduino.
Librería math C++: http://www.cplusplus.com/reference/cmath/
Librería math.h de AVR libc:
- https://www.nongnu.org/avr-libc/user-manual/group__avr__math.html
- https://www.microchip.com/webdoc/AVRLibcReferenceManual/group__avr__math.html
Algunas de la funciones matemáticas del Reference de Arduino:
- abs() – Valor absoluto
- constrain() – Limitación de un valor en un rango
- map() – Mapeo de un número de un rango a otro
- max() – Máximo
- min() – Mínimo
- pow() – Potencia
- sq() – Cuadrado
- sqrt() – Raíz cuadrada
- cos() – Coseno
- sin() – Seno
- tan() – Tangente
Números Pseudoaleatorios
random() – generador de números pseudoaleatorios
randomSeed() – Inicializa el generador de números
Comunicación Serie
Librería Stream de la que heredan las librerías de comunicación serie: https://www.arduino.cc/reference/en/language/functions/communication/stream/
Comunicación serie: https://www.arduino.cc/reference/en/language/functions/communication/serial/
Funciones: