¿Alguien sabe como crear una librería para Arduino?

Scooter

Cascarrabias crónico
Conforme voy haciendo cosas en arduino me vendría bien empaquetar algunos trozos de código para reutilizarlos. El corta y pega funciona pero enturbia el resultado final.
Me he leído el manual de la web oficial varias veces de como crear una librería y me he quedado igual.
¿Sabéis que algún sitio en el que lo expliquen para dummies?
 
Gracias por contestar. El manual "normal" ya lo había mirado pero como si no. Lo volveré a intentar de nuevo a ver si acabo interiorizándolo.
 
Es simplemente C/c++, lo unico que vos en el ide seleccionas donde estan las librerias.
Un lugar donde estan las que vienen por defecto es dentro de la misma carpeta del arudino hay una carpeta libraries. ahi estan las librerias
La carpeta tiene lleva el nombre de la libreria y dentro de esta esta el .h y/o .cpp con el mismo nombre. ademas de que pueden existir otros archivos de codigo necesarios. Ademas dentro de esta tambine puedes poner una carpeta examples, que tambien te la toma el ide de arduino.
 
Este es un enlace en donde puedes encontrar como se hacen algunas de las librerias para arduino.
playground.arduino.cc/Code/Library#.Uxns4-N5OGc

Basicamente son 3 archivos: un .h, .cpp y keywords.txt.
En el .h, indicas que atributos y metodos va a tener la libreria. (cuales son enteros, si retornan valor, etc. )
En .cpp, Escribes la funcionalidad de cada uno de los metodos y atributos.(Aquí es donde ya haces sumas, restas, asignaciones, comparaciones, etc. Lo que quieres que haga cada método/función)
keywords.txt Es para que le ponga color a las palabras reservadas que creaste (metodos) al momento ya de usar la libreria.


Si sabes programación de objetos ( de preferencia en C++) se te va a facilitar.
 
Con esta pagina: https://cide.google.com/p/arduinotimerone/downloads
Tengo el Timer1 tanto para UNO como MEGA pero necesito mas, ya puestos todos

Por mi cuenta utilizando el compilador 1.6.9 mediante:
-programas
-librerias
-gestion de librerias
No es bueno lo que e descargado. De hecho el compilador me lanza error cada vez que lo abro ya que faltan otras para que funcionen estas.
¿Cuales son los pasos para poder bajarme los Timers?
U otra pagina que me de todos (como la de arriba) tanto para UNO y MEGA2560

E cogido uno de tus codigos Scooter estas utilizando el timer2?
Código:
#include <avr/interrupt.h>
    #include <avr/io.h>
    int Inyector = 3;    //
    int LED = 13;        //Pin del led
    int PotOn=A0;
    int recarga=100;
    int RPM;
    unsigned long tOn=0;
    unsigned long tOnOld;
    unsigned long apertura;
    volatile int state = LOW;
    // 
    
    ISR(TIMER2_OVF_vect) {
    digitalWrite( Inyector, LOW);
//Parar el timer 2
    TCCR2B &= ((0<<CS22) | (0<<CS21) | (0<<CS20));
    //TIMSK2 |= (0<<TOIE2) ;  //InHabilita interrupción por desbordamiento del Timer2
    apertura=millis()-tOn;
    state = !state;
    Serial.print("R=");
    Serial.print(recarga);
    Serial.print("  Ap=");
    Serial.print(apertura);
    Serial.print("mS ");
    Serial.print(RPM);
    Serial.println("rpm");
    };
    void setup() {
    //Parar el timer 2
    TCCR2B &= ((0<<CS22) | (0<<CS21) | (0<<CS20));      
    // Use normal mode
    TCCR2A |= (0<<WGM21) | (0<<WGM20);
    // Usar reloj interno. No se usa el reloj externo en arduino
    ASSR |= (0<<AS2);
    TIMSK2 |= (1<<TOIE2) | (0<<OCIE2A);  //Habilita interrupción por desbordamiento del Timer2
    //Initialize serial and wait for port to open:
    Serial.begin(9600); 
    // prints title with ending line break 
    Serial.println("ECU 004 (c) Felix Diaz"); 

      // initialize the digital pin as an output.
  pinMode(Inyector, OUTPUT);  
  pinMode (LED  , OUTPUT);
   attachInterrupt(0, inicio, FALLING); //Puede ser LOW, CHANGE, RISING Y FALLING
    }

    void loop() {
        recarga=255-analogRead(PotOn)/4;    //El potenciometro va al revés que el timer
          digitalWrite(LED, state);
        delay(100);
    }

void inicio()
{
  digitalWrite( Inyector, HIGH);
  tOnOld=tOn;
  tOn=millis();
  sei();
  //Recargar el timer:
    TCNT2=recarga;
    //Configuración del timer 2: Preescaler /1024,
    TCCR2B |= ((1<<CS22) | (1<<CS21) | (1<<CS20));
    //Resetear el preescaler
    GTCCR |= (1<<PSRASY);
  RPM=60000/(tOn-tOnOld);
}

Me compila gracias pero ni lo entiendo
ISR(TIMER2_OVF_vect) { } Esta fuera de void setup()

El libro que estoy leyendo (el que me da la pajina descrita)
Me enseña a declarar Timer1 a si utilizo #include <TimerOne.h>

Timer1.initialize(tiempo);//tiempo es long tiempo=500000; defecto 0.5 sg
Timer1.attachInterrupt(t1);// t1(); es la funcion que ocurrira en cada desbordamiento

Aunque me azmite #include <avr/interrupt.h>

No azmite Timer2.initialize(tiemp2); Timer2.attachInterrupt(t2);
ISR(TIMER2_OVF_vect) { t2(); } //Esto compila pero no salta (como se define su desbordamiento )

Si que pareces metido en AXM Como dices Veras la forma de escrivir y declarar que e visto es mas inteligible para mi Es de un tal Jeremy Blum su libro ARDUINO a Fondo pero voy a necesitar traductor con el

Código:
#include <TimerOne.h>
#include <avr/interrupt.h>
#include <avr/io.h>
const byte led=12;
const byte led2=13;
const byte e8=8; 
const byte e9=9; 
long tiempo=500000;
long temp2=500000;
boolean elt=0;
#include <LiquidCrystal.h> // Incluye la Libreria LiquidCrystal
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); // Crea un Objeto LC. Parametros: (rs, enable, d4, d5, d6, d7)
ISR(TIMER2_OVF_vect) { t2(); };

void setup() {
  // put your setup code here, to run once:
pinMode(led,OUTPUT);
pinMode(led2,OUTPUT);
pinMode(e8,INPUT);
pinMode(e9,INPUT);
 lcd.begin(16,2); //delay(2);// Inicializa la interface para el LCD screen, and determina sus dimensiones (ancho y alto) del display

Timer1.initialize(tiempo);
Timer1.attachInterrupt(t1);
//Timer2.initialize(tiemp2);

}


void loop() {
lcd.setCursor(0,lcd.print(" Proyet TIMER ")); lcd.print("200");
  delay(200);  lcd.clear(); // Limpia la pantalla  // X 0.2 segundos de espera
while(1){
if(digitalRead(e8)==HIGH && digitalRead(e9)==HIGH){
elt=!elt; delay(300);
} else {
if(digitalRead(e8)==HIGH){ incre(5000); }  
if(digitalRead(e9)==HIGH){ if(!elt && tiempo>6000){ incre(-5000); } else { incre(-5000); }  }
}
}//while(1)

}
//delay(300);

void t1(){ digitalWrite(led,!digitalRead(led)); }
void t2(){digitalWrite(led2,!digitalRead(led2)); }

void incre(signed int suma){
if(!elt){
tiempo+=suma; 
Timer1.initialize(tiempo);
}else{
temp2+=suma; 
//Timer2.initialize(temp2);
}    
lcd.setCursor(0,0); lcd.print("Tmp1="); lcd.print(tiempo); lcd.print("        "); 
lcd.setCursor(0,1);
lcd.print("Tmp2="); 
lcd.print(temp2); 
lcd.print("        "); 
delay(2);
}
 
Saludos. Estoy tratando de ver cómo se crea una librería y en principio parecía fácil, pero no consigo hacerla funcionar.
Pensando en que tal vez, o lo más seguro que fuere un error mío, he copiado un ejemplo de google y mi sorpresa es que también me sale error.

La versión de arduino que utilizo es la 1.6.9, no sé si será por eso.

Os pongo el ejemplo a ver si puedo ver la luz.:)

Archivo .h:

Código:
#include "WProgram.h"
#include "Morse.h"

Morse::Morse(int pin)
{
   pinMode(pin, OUTPUT);
   _pin = pin;
}

void Morse::dot()
{
   digitalWrite(_pin, HIGH); delay(250);
   digitalWrite(_pin, LOW); delay(250);
}

void Morse::dash()
{
   digitalWrite(_pin, HIGH); delay(1000);
   digitalWrite(_pin, LOW); delay(250);
}

----------------------------------------------
archivo cpp
/*
Morse.h - Library for flashing Morse code.
Created by David A. Mellis, November 2, 2007. Released into the public domain.
*/
#ifndef Morse_h
#define Morse_h
#include "WConstants.h"

class Morse
{
   public: Morse(int pin); void dot();
   void dash();
   private:
   int _pin;
};

#endif

-------------------------------
y el programa del ejemplo
#include <Morse.h>

Morse morse(13);

void setup() {}

void loop()
{
   morse.dot(); morse.dot(); morse.dot();
   morse.dash(); morse.dash(); morse.dash();
   morse.dot(); morse.dot(); morse.dot();
   delay(3000);
}
Ya lo he iniciado antes, se crea en la librería y he probado varias cosas pero sin éxito.

A ver qué puede estar mal,

Como siempre, un saludos a todos los compañeros del foro. :)
 
hola
pdro dijo:
Saludos, estoy tratando de ver como se crea una libreria y en principio parecia facil, pero no consigo hacerla funcionar. Pensando en que tal vez o lo mas seguro que fuere un error mio he copiado ejemplo en google y me sorpresa es que tambien me sale error.
La version de arduino que utilizo es la 1.6.9 no se si sera por eso, os pongo ejemplo haber si puedo ver la luz.
ya lo he iniciado antes, se crea en la libreria he probado varias cosas pero sin exito. Haber que puede estar mal, como siempre un saludos a todos los compañeros del foro.:)
Scooter dijo:
En eso mismo estoy yo desde hace tiempo, será una tontería pero no entiendo el proceso.
yo le recomendaria a los dos., que desintalen la interfaz de IDE de arduino ., y limpien todo​
luego instalen el AVRstudio7 ( pueden bajarlo de la pagina de ATMEL)​
aparte de tener la IDE de arduino mejorada ., el compilador va indicando errores y sugerencia de correccion ( ingles claro)​
lo que pasa es que el IDE de arduino., va generando una bola de codigo que no se ve​
porque en definitiva es lenguaje C el que usa., usa uun interrprete por asi decirlo ., para definir puertos ., funciones ., variables., ETC​
para luego decompilarce en ASM ., para generar el .HEX que es lo que se graba en arduino​
sino fijence en la hoja de datos del atmega 328p ., las de finiciones son una sola ., se use el IDE que se use​
y son esas trasformaciones de definiciones ., las que no se ven y pueden generar muchos problemas​
yo no uso arduino., pero uso AVRstudio ., y al tratar de pasar una librerias de arduino encontre ese problema​
fijence eso ., y veran que por alli ., esta la solucion de su problema​
 
Si el compilador de Arduino puede trabajar con C, en C para hacer una librería se tiene que hacer lo siguiente:

1- Crear el un archivo ".h" con el nombre de tu librería, ej. "MiLibreria.h".
2- Crear el un archivo ".c" con el nombre de tu librería, ej. "MiLibreria.c".
3- Agregar todas las funciones que va a tener la librería en el archivo "MiLibreria.c" e incluir al principio el llamada al archivo ".h", ej:

Código:
#include "MiLibreria.h"

int Suma(int a, int b)
{
	return a+b;
}

int Resta(int a, int b)
{
	return a-b;
}

4- En "MiLibreria.h", agregar los prototipos de las funciones que se encuentran en el archivo ".c" utilizando la palabra "extern" al principio:

Código:
extern int Suma(int a, int b);
extern int Resta(int a, int b);

Con eso, ya se tiene tanto el archivo ".c" como ".h" listo para usar, solo será necesario agregarlos en el proyecto y desde cualquier lado bastará con agregar "#include "MiLibreria.h"" para acceder a las funciones.

En el ".h" no solo se pueden agregar los prototipos de funciones, incluso se podría agregar defines, tipo de estructuras o variables globales :)desaprobacion:).
 
Hola.

A ver si puedo aportar algo.
Vaya por delante que hacer una librería es un proceso "peculiar" y la ayuda de arduino es mas bien parca.
Lo primero que hay que hacer son dos archivos: cabecera (.h) y funciones (.cpp). Y aquí viene la primera tontería: tiene que llamarse cpp aunque dentro tengas todo escrito en C.
El archivo de cabecera es un indicador para el compilador; le dice que funciones va a compilar, que forma tienen estas, que variables usan, etc... Aumenta la velocidad de compilación. Hoy en día con estas pedazo de máquinas que tenemos no importa demasiado, pero con máquinas lentas o programa muy grandes si que importa.
El otro archivo es un programa en C donde están tus funciones.
Va un ejemplo:
comunes.h
Código:
///________________________________________________________________________________________________
//                                                                                      Vidal 2016
//                                                                              www.naparlinex.com
//                                             funciones comunes a todos los programas (scketches)
//                                                                                       cabeceras

#ifndef COMUNES_H_
#define COMUNES_H_

#include <Arduino.h>

// Para la recepción de datos vía serie
boolean split_cadena(String cadena,String array[],int items,char separador,boolean csum_sn);


#endif // COMUNES_H_
Ahora el comunes.cpp
Código:
//________________________________________________________________________________________________
//                                                                                      Vidal 2016
//                                                                              www.naparlinex.com
//                                             funciones comunes a todos los programas (scketches)


#include "comunes.h"

//------------------------------------------------------------------------
// comprueba que los datos de la cadena sean correctos (check_sum al final)
// y si lo son los mete en el array que tendrá tantos items  
//------------------------------------------------------------------------
boolean split_cadena(String cadena,String array[],int items,char separador,boolean csum_sn) 
{
boolean devuelve = false;
int a,item,inicio_csum,c_sum;
String subcadena = "";

item = 0;
c_sum = 0;
inicio_csum = 0;
for(a=0;a < (int)cadena.length();a++) 
   {
   if(item < items) c_sum += cadena.charAt(a);
   if(cadena.charAt(a) == separador) 
     {
     if(item <= items) 
       {
       array[item++] = subcadena;
       subcadena = "";
       }
       
     if(item == items) inicio_csum = a;
     }
   else subcadena.concat(cadena.charAt(a));  
   }
   
if(csum_sn) 
  {
  subcadena = cadena.substring(inicio_csum+1,cadena.length()-1);
  if(subcadena.toInt() == c_sum) devuelve = true;
  }
else {
     array[item++] = subcadena;
     devuelve = true;
     }
return devuelve;
}

Fíjate que en el comunes.cpp hay un include "comunes.h y MUY importante en el comunes.h hay un include "Arduino.h", este tiene las referencia que necesita el compilador de arduino para compilar tu librería.



Ya tienes creada una librería, ahora hay que copiarla al directorio donde arduino almacena las librerías. en el ejemplo, haces una carpeta que se llame "comunes", le metes dentro el comunes.h y el comunes.cpp y copias la carpeta a /usr/share/arduino/libraries/ (en win no sé donde va, pero será algo parecido).
Ojo a los permisos si estás en linux, esto lo tiene que hacer como su.



Ahora te tiene que aparecer una librería llamada comunes en el IDE de arduino.
No he podido probar esta librería en concreto por que la parte hardware de mi proyecto está ahora mismo repartida en piezas entorno al soldador, pero esto se compila sin problemas, así que imagino que no tendrás problemas para hacer algo así en tu proyecto.
Una última cuestión, yo no uso el IDE y compilo desde la linea de comandos, y así funciona. si tienes problemas con el IDE, intentaré ayudar con ellos.
Espero que todo este tochazo ayude a clarificar el tema.
Suerte!!!



P.D. Un ultimo apunte que no he probado; parece que si dentro de la carpeta donde tienes el scketch creas una carpeta libraries y le metes ahi esta libreria en vez de en /usr/share... te debe funcionar, pero lo leí hace tiempo y no me ha funcionado nunca.
 
Última edición:
Atrás
Arriba