25- Arduino, Usando las Bibliotecas

Las bibliotecas son una herramienta muy poderosa cuando se trabaja con Arduino, especialmente para principiantes. Una biblioteca es un archivo (un conjunto de archivos) que contiene exactamente el mismo c贸digo C ++ en el que escribimos un boceto (a veces tambi茅n hay inserciones de ensamblador). Podemos conectar la biblioteca a nuestro c贸digo y utilizar las capacidades que proporciona, y hay muchas opciones: 鈥渉erramientas鈥 listas para usar y para trabajar con sensores y m贸dulos externos, para trabajar con los perif茅ricos internos del microcontrolador (temporizadores, ADC, memoria), bibliotecas de diversas herramientas, matem谩ticas y mucho m谩s. Mi lista personal de bibliotecas interesantes, compilada a lo largo de los a帽os de trabajo con la plataforma, se puede ver aqu铆.

La belleza de trabajar con una biblioteca es que no necesitamos saber c贸mo funciona el c贸digo que contiene, utilizamos herramientas listas para usar proporcionadas por el desarrollador de la biblioteca. Muy a menudo hay descripciones / documentaci贸n y ejemplos de uso de bibliotecas.


C贸mo instalar las bibliotecas.

Asistente de bibliotecas

Como dije antes, una biblioteca es una colecci贸n de archivos de texto con c贸digo. La biblioteca se puede instalar de dos formas: desde el repositorio oficial o manualmente. Arduino tiene varias bibliotecas que se pueden obtener directamente del programa Arduino IDE utilizando el administrador de bibliotecas incorporado, que le permite instalar, eliminar y actualizar bibliotecas. Esto es estupendo, pero esta lista no incluye todas las bibliotecas existentes y el administrador no proporciona una descripci贸n normal. Para instalar una biblioteca del repositorio oficial de Arduino, vaya a Programa / Incluir librer铆a … Se abrir谩 el administrador de la biblioteca, en el que puede encontrar e instalar una biblioteca de la lista con un solo clic.

Gestor de bibliotecas del arduino Ide
Gestor de bibliotecas del arduino Ide

Instalaci贸n manual

La instalaci贸n manual de la biblioteca significa mover la carpeta con la biblioteca a la carpeta en la que Arduino IDE buscar谩 esta biblioteca. Hay dos carpetas de este tipo: una se encuentra en la carpeta del programa:

  • Windows de 64 bits – C: \ Archivos de programa (x86) \ Arduino \ libraries \
  • Windows 32bit –  C: \ Archivos de programa \ Arduino \ libraries \

El segundo se encuentra a lo largo de la ruta especificada en la configuraci贸n. Por defecto, este es Documentos / Arduino . Recomiendo instalar las bibliotecas en la carpeta del programa. Mueva la biblioteca que usted necesita a la carpeta de bibliotecas, en la carpeta con el nombre de la biblioteca est谩n los archivos de la biblioteca (archivos con las extensiones .H ,. Cpp , archivos de palabras clave , la carpeta de los ejemplos …).

Ruta de las librer铆as de arduino
Ruta de las librer铆as de arduino

A la carpeta con el boceto

Puede colocar la biblioteca en la carpeta del proyecto, por ejemplo, si realiza cambios en el c贸digo de la biblioteca que son necesarios solo para este proyecto. En este caso, los archivos de la biblioteca deben estar junto al archivo de boceto .ino, y en el boceto, la biblioteca debe estar conectada mediante comillas dobles, para que el compilador comience a buscar la biblioteca desde la carpeta con el boceto:

Al mismo tiempo, las bibliotecas que contienen varios archivos en diferentes carpetas, se niegan a funcionar. Quiz谩s este sea un problema del propio IDE de Arduino:


驴D贸nde conseguir bibliotecas?

Es muy com煤n encontrar un proyecto publicado por alguien que usa bibliotecas. El autor puede adjuntar directamente los archivos de la biblioteca que utiliz贸, puede dar un enlace a la biblioteca o simplemente indicar su nombre. Tambi茅n se encuentran bibliotecas interesantes en foros donde las personas simplemente escriben para s铆 mismos y comparten con otros. En el sitio web oficial de la biblioteca o en su p谩gina en GitHub, puede encontrar una descripci贸n detallada de la biblioteca (documentaci贸n, wiki), consejos de uso, diagramas y otra informaci贸n 煤til.

La mayor铆a de las bibliotecas se publican en el sitio de GitHub , una persona no preparada puede tener problemas para descargar archivos de este recurso. Digamos que se top贸 con una biblioteca interesante y quer铆a descargarla. Por ejemplo, IRLremote es una biblioteca para trabajar con receptores de infrarrojos. No importa en qu茅 carpeta del repositorio se encuentre, siempre puede hacer clic en el nombre de la biblioteca ( nombre del autor / nombre del repositorio ) e ir a la p谩gina principal del repositorio.

Bibliotecas arduino en github
Bibliotecas arduino en github

Desde la p谩gina principal, puede descargar todo el repositorio como un archivo haciendo clic en Clonar o descargar, tambi茅n Descargar ZIP. Este m茅todo es universal para todas las bibliotecas.

Descarga de bibliotecas arduino de github
Descarga de bibliotecas arduino de github

Esto descargar谩 el c贸digo fuente de la biblioteca, que puede contener archivos que no est谩n relacionados con la biblioteca en s铆. La mayor铆a de los autores publican versiones de lanzamiento (release) de bibliotecas, que se encuentran en la pesta帽a Lanzamientos.

Desde la pesta帽a Versiones, puede descargar el archivo con la biblioteca de la versi贸n requerida.

GitHub tambi茅n te permite abrir para leer o descargar un solo archivo del repositorio. Para hacer esto, debe abrir el archivo y hacer clic en el bot贸n Raw.

Inspeccionar archivos en github
Inspeccionar archivos en github

Resoluci贸n de conflictos.

A veces hay un conflicto de bibliotecas, lo que significa que el IDE encuentra varias bibliotecas id茅nticas en la computadora. Esto se informa en el registro de compilaci贸n con una advertencia: 禄 varias bibliotecas encontradas … 芦. Si instal贸 algunas bibliotecas a trav茅s del administrador ( Programas/ Incluir libreria … ), chocar谩 con las bibliotecas instaladas manualmente en la carpeta del programa. 驴D贸nde est谩n las bibliotecas en general?

  • Bibliotecas compartidas est谩ndar: en la carpeta Archivos de programa / libraries
    • Windows de 64 bits – C: \ Archivos de programa (x86) \ Arduino \ libraries \ 
    • Windows 32 bit –  C: \ Archivos de programa \ Arduino \ libraries \
  • Instalado a trav茅s del administrador – Documentos \ Arduino \ libraries
  • Bibliotecas de n煤cleos espec铆ficos:
    • Arduino Standard Core – C: \ Archivos de programa (x86) \ Arduino \ hardware \ arduino \ avr \ libraries
    • Otros kernels – C: \ Users \ username \ AppData \ Local \ Arduino15 \ packages \ kernel \ hardware \ platform \ version \ libraries

Los n煤cleos tambi茅n pueden entrar en conflicto, por lo que una instalaci贸n limpia del IDE de Arduino con la eliminaci贸n de los restos de la versi贸n anterior puede ser la soluci贸n a todos los problemas. Eliminamos el programa como tal y borramos manualmente las carpetas:

  • Carpeta de programa
    • Windows de 64 bits – C: \ Archivos de programa (x86) \ Arduino \ libraries \ 
    • Windows 32bit –  C: \ Archivos de programa \ Arduino \ libraries \
  • Documentos \ Arduino \
  • C: \ Usuarios \ nombre de usuario \ AppData \ Local \ Arduino15 \

芦Dentro禄 de la biblioteca.

La biblioteca, dependiendo de la cantidad de c贸digo y el estado de 谩nimo del programador, se puede dise帽ar de forma muy compacta y detallada, con un mont贸n de archivos y carpetas adicionales. Consideremos la composici贸n cl谩sica de la biblioteca. Para mayor comodidad, recomiendo habilitar la visibilidad de las extensiones de archivo . Todos los siguientes archivos de muestra son archivos de texto ordinarios, puede abrirlos con un bloc de notas normal. Tambi茅n recomiendo usar el 芦bloc de notas de programador禄 – Notepad ++ ( enlace al sitio oficial ), que resalta la sintaxis y, en general, es una herramienta muy adecuada para el desarrollador.

<nombre de biblioteca>.h: archivo de encabezado, el archivo de biblioteca m谩s importante. Es tan importante que la biblioteca solo puede estar formada por 茅l. Por lo general, se encuentra en la ra铆z de la biblioteca o en la carpeta src, source (fuente). Este archivo generalmente enumera todas las clases / m茅todos / funciones / tipos de datos, contiene informaci贸n sobre la biblioteca, a menudo hay una descripci贸n extendida para cada m茅todo o funci贸n. Muy a menudo, el archivo de encabezado principal es la mini documentaci贸n de la biblioteca. Una biblioteca puede tener una estructura de varios archivos con una gran cantidad de archivos de encabezado, pero el archivo de encabezado principal siempre es uno, tiene el mismo nombre que la carpeta con la biblioteca.

Un archivo con la extensi贸n .cpp es un archivo de implementaci贸n que contiene el c贸digo ejecutable principal del programa. Por lo general, va en parejo a su archivo .h de encabezado , es decir, <nombre de la biblioteca> .cpp .

keywords.txt: un archivo que enumera los nombres de funciones, m茅todos y otros nombres de trabajo de la biblioteca resaltados en el IDE de Arduino (resaltados en un color diferente) en el c贸digo.

Archivo library.properties: archivo que contiene informaci贸n sobre la biblioteca para los desarrolladores y el administrador de la biblioteca (nombre, versi贸n, autor, categor铆a, etc.).

Carpeta Src: esta carpeta puede contener los archivos de la biblioteca principal ( .h , .cpp , .c ).

La carpeta de ejemplos es una carpeta con ejemplos de uso de la biblioteca.

Adem谩s de los archivos y carpetas enumerados, la carpeta con la biblioteca puede contener otros archivos y carpetas de servicio, a veces incluso puede encontrar documentaci贸n completa en forma de archivos de texto o p谩ginas html.


驴C贸mo trabajar con la biblioteca?

Digamos que compr贸 alg煤n tipo de m贸dulo o sensor, busc贸 informaci贸n en Google sobre 茅l, encontr贸 un art铆culo con un ejemplo. Los ejemplos suelen ser sencillos, muestran c贸mo se conecta y funciona. Descargamos la biblioteca del art铆culo, lo probamos, todo funciona. 驴Que sigue? A continuaci贸n, debe abrir la carpeta con la biblioteca y ver los ejemplos oficiales, averiguar c贸mo funcionan y qu茅 pueden hacer. Los ejemplos se encuentran en la carpeta de ejemplos en la carpeta de la biblioteca.

Los ejemplos generalmente no revelan todas las capacidades de la biblioteca, por lo que abrimos y leemos el archivo de encabezado, que es library_name.h. Contiene literalmente una lista de herramientas de biblioteca, a menudo con descripciones para cada una. Con esta informaci贸n, puede extraer del m贸dulo todas las funciones que el desarrollador de la biblioteca le ha prescrito. Echemos un vistazo a la biblioteca de servo.h, creo que la mayor铆a ha trabajado con ella.

Veamos los ejemplos que est谩n en la carpeta de la biblioteca:

knob.ino

/ *
 Controlar la posici贸n de un servo usando un potenci贸metro (resistencia variable)
 por Michal Rinott <http://people.interaction-ivrea.it/m.rinott>
 modificado el 8 de noviembre de 2013
 por Scott Fitzgerald
 http://www.arduino.cc/en/Tutorial/Knob
* /
#include <Servo.h>
Servo myservo; // crea un objeto servo para controlar un servo
int potpin = 0; // pin anal贸gico utilizado para conectar el potenci贸metro
int val;   // variable para leer el valor del pin anal贸gico
void setup() {
  myservo.attach(9); // conecta el servo en el pin 9 al objeto servo
}
void loop() {
  val = analogRead ( potpin ) ;           // lee el valor del potenci贸metro (valor entre 0 y 1023)
  val = map ( val, 0, 1023, 0, 180 ) ;    // escalarlo para usarlo con el servo (valor entre 0 y 180)
  myservo.write(val);                 // establece la posici贸n del servo de acuerdo con el valor escalado
  delay(15);                        // espera a que llegue el servo
}

sweep.ino

/ * sweep
 por BARRAGAN <http://barraganstudio.com>
 Este c贸digo de ejemplo es de dominio p煤blico.
 modificado el 8 de noviembre de 2013
 por Scott Fitzgerald
 http://www.arduino.cc/en/Tutorial/Sweep
* /
#include <Servo.h>
Servo myservo; // crea un objeto servo para controlar un servo
// Se pueden crear doce objetos servo en la mayor铆a de las placas
int pos = 0;   // variable para almacenar la posici贸n del servo
void setup() {
  myservo.attach(9); // conecta el servo en el pin 9 al objeto servo
}
void loop() {
  for ( pos = 0; pos < = 180; pos + = 1 ) { // va de 0 grados a 180 grados  
    // en pasos de 1 grado
    myservo.write(pos);           // decirle al servo que vaya a la posici贸n en la variable 'pos'
    delay ( 15 ) ;                      // espera 15ms a que el servo alcance la posici贸n
  }
  for ( pos = 180; pos > = 0; pos - = 1 ) { // va de 180 grados a 0 grados  
     myservo.write(pos) ;             // decirle al servo que vaya a la posici贸n en la variable 'pos'
    delay (15) ;                      // espera 15ms a que el servo alcance la posici贸n
  }
}

De estos ejemplos, aprendimos que existe una clase Servo y necesitamos crear un objeto de esta clase. En el bloque de configuraci贸n, podemos especificar a qu茅 pin est谩 conectado el servo (el m茅todo attach() ), y podemos rotar el servo al 谩ngulo deseado (en grados) usando el m茅todo write (). Esto es b谩sicamente todo lo que aprendimos del ejemplo oficial. Abramos ahora el archivo de encabezado Servo.h, que se encuentra en la carpeta src (se adjunta todo el c贸digo despu茅s de la descripci贸n).

servo.h

#define Servo_VERSION 2 // versi贸n de software de esta biblioteca
#define MIN_PULSE_WIDTH 544 // el pulso m谩s corto enviado a un servo  
#define MAX_PULSE_WIDTH 2400 // el pulso m谩s largo enviado a un servo 
#define DEFAULT_PULSE_WIDTH 1500 // ancho de pulso predeterminado cuando el servo est谩 conectado
#define REFRESH_INTERVAL 20000 // tiempo m铆nimo para actualizar los servos en microsegundos 
#define SERVOS_PER_TIMER 12 // el n煤mero m谩ximo de servos controlados por un temporizador 
#define MAX_SERVOS (_Nbr_16timers * SERVOS_PER_TIMER)
#define INVALID_SERVO 255 鈥嬧// bandera que indica un 铆ndice de servo no v谩lido
#if! !defined(ARDUINO_ARCH_STM32F4)
typedef struct {   
  uint8_t nbr: 6;            // un n煤mero de pin de 0 a 63
  uint8_t isActive: 1;            // verdadero si este canal est谩 habilitado, pin no pulsado si es falso
} ServoPin_t   ;  
typedef struct {
  ServoPin_t Pin;
  volatile unsigned int ticks;
} servo_t;
class Servo
{
public:
  Servo () ;
  uint8_t attach ( pin int ) ;          // adjunta el pin dado al siguiente canal libre, establece pinMode, devuelve el n煤mero de canal o 0 si falla 
  uint8_t attach ( int pin, int min, int max ) ; // como arriba pero tambi茅n establece valores m铆nimos y m谩ximos para escrituras. 
  detach vac铆o () ; 
  void write(int value);            // si el valor es <200, se trata como un 谩ngulo, de lo contrario como ancho de pulso en microsegundos 
  void writeMicroseconds(int value) ; // Escribe el ancho del pulso en microsegundos 
  int read () ;                       // devuelve el ancho de pulso actual como un 谩ngulo entre 0 y 180 grados 
  int readMicroseconds () ;           // devuelve el ancho de pulso actual en microsegundos para este servo (fue read_us () en la primera versi贸n) 
  bool attached();                  // devuelve verdadero si este servo est谩 adjunto, de lo contrario falso 
private :
  uint8_t servoIndex;              // indexa los datos del canal para este servo
  int8_t min;                      // m铆nimo es este valor multiplicado por 4 a帽adido a MIN_PULSE_WIDTH    
  int8_t max;                      // m谩ximo es este valor multiplicado por 4 sumado a MAX_PULSE_WIDTH   
} ;

驴Qu茅 podemos aprender de este c贸digo? 隆Muchas cosas interesantes!

  • Impulso m铆nimo * – 544 渭s
  • Impulso m谩ximo * – 2400 渭s
  • Impulso est谩ndar despu茅s attach() – 1500 渭s – 隆esto significa que el servo girar谩 al 谩ngulo apropiado despu茅s de conectarse!
  • El n煤mero m谩ximo de servos se puede definir se muestra con la definici贸n MAX_SERVOS al puerto (Serial.print(MAX_SERVOS)) – para Arduino NANO ser谩 12 servos
  • En la clase Servo, podemos ver m茅todos que no fueron cubiertos en los ejemplos:
    • Versi贸n attach() con la capacidad de especificar min. y m谩x. longitud del pulso * manualmente!
    • dettach() – desconectar el servo del control
    • writeMicroseconds () – aplicar una se帽al de control en 渭s, no en grados
    • read() – leer la posici贸n actual del servo (煤ltimo enviado v铆a write())
    • Y algunos otros 

* Longitud de pulso: el servo est谩 controlado por una se帽al PWM con una cierta longitud de pulso, esta longitud para el 谩ngulo m谩ximo y m铆nimo de rotaci贸n del servo difiere en los diferentes fabricantes (m铆nimo – 450-600, m谩ximo – 2000-2400), por lo que 隆la biblioteca de servos es una herramienta muy vers谩til!

Tambi茅n hay una descripci贸n muy detallada de la biblioteca y algunas sutilezas antes del c贸digo. Lo que quiero decir con esto: muy a menudo es el archivo de encabezado el que contiene la mayor parte de la informaci贸n 煤til sobre las capacidades de la biblioteca, y lo m谩s probable es que no encuentre esta informaci贸n en los 鈥渁rt铆culos鈥 sobre m贸dulos y sensores. Siempre estudie el archivo de encabezado si necesita trabajar seriamente con un m贸dulo o con la biblioteca en general.


Deja un comentario