Hola a todos, soy recientemente nuevo en Arduino, y tras tocar un poco los tutoriales y ejemplos básicos de Arduino, me he encontrado ante un problema....las librerías. Abro este post por si alguien podría aportar información o ayuda de como crear una librería nueva, que puntos se deben tratar en ella, o simplemente como adaptar una librería que hayas visto, para usarla tu y poder modificarla.
Si tengo una libreria de arduino (la cual no entiendo demasiado xD) como podria adaptarla para que funcionara en alguna placa que no sea de arduino pero sea compatible/semejante ( como por ejemplo un Waspmote tecnología de Libelium)
Yo supuse que al trabajar con el mismo micro, aceptaria la libreria, pero los #includes que se llaman en la libreria parece que no se encuentran o como si fueran distintos en el API de Waspmote al de Arduino. No se si me he explicado bien.... La cuestión esque estoy con un proyecto de transmisión entre arduinos pero como puente intermedio uso 2 Wasp para que se comuniquen inalambricamente, y el que no me funcione la libreria que uso para los Arduinos en los Wasp me retrasando un poco....
No es tan facil, aunque lleven micros iguales no son compatibles sin mas.
Yo pasé una liberia de PIC a arduino para usarla pero tuve que traducir comandos y adaptar ciertas funciones a arduino, porque esta no era muy dificil, pero aun asi, a veces no sera ni posible.
Ya pero el problema que yo creo que es lo que tengo que modificar, es que en la libreria se llama al include WProgram, y en el API de Waspmote el WProgram es distinto al de Arduino...
y cual es el problema? No se como funciona el Waspmote, es la misma filosofia que Arduino? Es decir, con un setup() y un loop() ? Tiene un core con funciones de alto nivel? usa lenguaje de Arduino?
La libreria que quieres adaptar, que es la mia , esta escrita en C, asi que deberia funcionar sin problemas, ya que no usa ninguna funcion de Arduino. Mientras uses gcc + avrlibc, vas bien con ella.
Por otro lado, yo la he usado con un ATmega1280, que es el micro que usaba antes la version Mega de Arduino.... No me he mirado los datasheet, pero no creo que sea muy diferente el atmega1281 del atmega1280.
Es identico a Arduino, lo único que el API se ha cambiado un poco, los programas son cuasi-identicos a los de Arduino.
La verdad es que no entiendo mucho de librerias, pero lo que yo creo que es el problema es lo que he comentado, el #include WProgram de la libreria que llama a ese archivo para usar algo que contenga (lo cual desconozco), y claro al meter la libreria en el API de Waspmote, si existe ese archivo pero es distinto al de Arduino, y al probar un programa de envio de mensajes por bus CAN no compila bien dando un error.
EL PROGRAMA
#include <CAN.h>
#include <pinout.h>
void setup()
{
USB.begin();
USB.println("Empezamos...");
CAN.begin(1);
//Pin 6 INPUT and R pull up ON (Sensor)
pinMode(DIGITAL4,OUTPUT);
}
void loop()
{
CAN_TxMsg.id=0x200; //Device with speaker sends ID=200, Device with sensor sends=ID=100
CAN_TxMsg.header.rtr=0;
CAN_TxMsg.header.length=8;
CAN_TxMsg.data[0]=digitalRead(6);
CAN_TxMsg.data[1]=0x00;
CAN_TxMsg.data[2]=0x00;
CAN_TxMsg.data[3]=0x00;
CAN_TxMsg.data[4]=0x00;
CAN_TxMsg.data[5]=0x00;
CAN_TxMsg.data[6]=0x00;
CAN_TxMsg.data[7]=0x00;
CAN.send(&CAN_TxMsg);
if (CAN.CheckNew())
{
CAN.ReadFromDevice(&CAN_RxMsg);
//Print message via Serial Port
USB.print(CAN_RxMsg.id,HEX);
USB.print(" => ");
USB.print(CAN_RxMsg.data[0],HEX);
USB.print(" - ");
USB.print(CAN_RxMsg.data[1],HEX);
USB.print(" - ");
USB.print(CAN_RxMsg.data[2],HEX);
USB.print(" - ");
USB.print(CAN_RxMsg.data[3],HEX);
USB.print(" - ");
USB.print(CAN_RxMsg.data[4],HEX);
USB.print(" - ");
USB.print(CAN_RxMsg.data[5],HEX);
USB.print(" - ");
USB.print(CAN_RxMsg.data[6],HEX);
USB.print(" - ");
USB.println(CAN_RxMsg.data[7],HEX);
//Byte 0 => Info from the other board with the sensor status
if (CAN_RxMsg.id=0x100 && CAN_RxMsg.data[0])
{
analogWrite(DIGITAL4,HIGH);
}else
{
analogWrite(DIGITAL4,LOW);
}
}
delay(400);
}
EL ERROR
/tmp/build2367687346645494278.tmp/core.a(CAN.cpp.o): In function `CANClass::read(CANClass::msgCAN*)':
/home/luis/Escritorio/Waspmote/IDE-API-OTA/waspmote-ide-v.01-linux/hardware/cores/wasp_v019/CAN.cpp:791: multiple definition of `intFlag'
o:/tmp/build2367687346645494278.tmp/alarmacanbusWASP.cpp:85: first defined here
/tmp/build2367687346645494278.tmp/core.a(CAN.cpp.o): In function `CANClass::read(CANClass::msgCAN*)':
/home/luis/Escritorio/Waspmote/IDE-API-OTA/waspmote-ide-v.01-linux/hardware/cores/wasp_v019/CAN.cpp:791: multiple definition of `intConf'
o:/tmp/build2367687346645494278.tmp/alarmacanbusWASP.cpp:85: first defined here
/tmp/build2367687346645494278.tmp/core.a(CAN.cpp.o): In function `CANClass::read(CANClass::msgCAN*)':
/home/luis/Escritorio/Waspmote/IDE-API-OTA/waspmote-ide-v.01-linux/hardware/cores/wasp_v019/CAN.cpp:791: multiple definition of `intCounter'
o:/tmp/build2367687346645494278.tmp/alarmacanbusWASP.cpp:85: first defined here
/tmp/build2367687346645494278.tmp/core.a(CAN.cpp.o): In function `CANClass::read(CANClass::msgCAN*)':
/home/luis/Escritorio/Waspmote/IDE-API-OTA/waspmote-ide-v.01-linux/hardware/cores/wasp_v019/CAN.cpp:791: multiple definition of `intArray'
o:/tmp/build2367687346645494278.tmp/alarmacanbusWASP.cpp:85: first defined here
He probado a comentar en la libreria el include de WProgram, y el API me deja compilar sin problemas el codigo (aceptando la librerias) pero claro pierde el programa su funcionalidad.
No se si me explico bien....xDDD Voy a probar a compilar la libreria con G++ para intentar depurar los errores, aunque como no soy demasiado diestro en programación ire algo lento, pero a cualquier avance os informo!
Lo unico que uso de Arduino, que a lo mejor te da problemas, es que veo que el Serial no esta implementado en Waspmote (usas funcion USB), y es lo unico que uso en mi libreria para cuando tienes el modo depuracion a ON, que te puede estar dando problemas.
Es decir, todo lo que esta entre #if (DEBUGMODE==1) y #endif. Puedes borrarlo, es solo para depuracion.
Mejor escribeme por mail, que andar por aqui en el foro, ya que es dificil que te ayuden, ya que la gente no sabe de que libreria estas hablando, cual es el codigo, como va el core de Waspmote si no se dispone de el, .....
Bueno que tampoco quiero daros problemas, simplemente era por saber si habia alguna forma sencilla, voy a intentar hacer yo una libreria sencilla para configurar el SPI especifica para Wasp asi voy entendiendo como van las librerias, y a ver si consigo entender que puede fallar, si consigo algo xDDD
Pues entonces vete paso a paso... intenta hacerte una libreria sencilla para el Waspmote, y cuando entiendas como se hace y los requerimientos del core, seguro que no tienes ningun problema..... como dicen por ahi.... " las prisas matan! "
Pero mi libreria es en C, y como te digo solamente los Serial que hay para depurar, te pueden dar problemas. Pero puedes eliminarlos.
Por otro lado, mirarse el "core" es un buen ejercicio didactico, ya que aprendes como gente con experiencia ha creado las funciones.
Si la verdad es que lo he pensado! y voy a intentar hacer mi propia librería, así seguro que lo llego a comprender bien, aunque seguramente me "duela" bastante mas xDD pero bueno el que algo quiere algo le cuesta, también me he bajado algunas librerías del SPI para ver su funcionamiento básico, y las voy a analizar para intentar comprenderlas! De todas formas gracias por la ayuda,aparte de eso pongo tema solucionado, pero una duda, he visto referencias en tu pagina a kreative chaos, ¿me serviría con mis pocos conocimientos intentar leer y entender el tutorial de su libreria, o es demasiado complejo? Gracias a todos por la ayuda.
Mi forma de verlo, a forma de consejo constructivo,ya que estas haciendo un PFC:
-Deberias comprender el core del HW que utilizas.
-Deberias comprender cada una de las librerias que utilizas.
-Deberias saber hacer librerias para la plataforma que utilizas.
-Deberias saber C-C++ en el momento de entregar el proyecto.
-Deberias conocer en profundidad el microcontroladory todo el HW utilizado (datasheets). Incluyendo ATMega1281, MCP2515, etc.
-Deberias conocer en profundidad los protocolos utilizados ( serie, usb, can, spi,...).
Gracias al open hardware-software...tienes la suerte de tener el codigo, esquemas y ver como funcionan!! La curva de aprendizaje es bestial !!
Hay cosas que se han de profundizar mas y otras menos...
Yo si estuviera en el tribunal y me entregan un proyecto con Arduino y usando librerias de terceros, haria un par de preguntas acerca de ello, y es facil saber si se las ha mirado y las comprende o no... No aprobaria un proyecto de "copy and paste" o "plug & play".
Se podria entrar en el debate de que no es necesario reinventar la rueda, pero tambien es cierto que es un proyecto fin de carrera de electronica.
como lo ves? Por supuesto, es mi manera de verlo, puedo estar equivocado.
Si si por su puesto, de acuerdo en todo!! si prisa no tengo ninguna y ganas por aprender muchas, mi proyecto va mas haya de un copy y paste, por eso mismo no tengo una fecha de entrega pensada, sino "cuando lo acabe"; pero bueno también veo en parte que un proyecto de arduino me parece muy interesante, ya que solo por la ayuda que hay en internet y las múltiples fuentes de información que puedes encontrar, es muy difícil que te encuentres perdido.
De hecho ahora mismo, estoy comenzando otra investigación de un protocolo superior, como device net o canopen, con el fin de no solo trabajar con el can. Ya que mi proyecto no va tanto enfocado al protocolo de transmisión (esto me es transparente), en vez de can bus podría haber elegido 485, o DMX. En cuanto a a lo que deberia, 100% de acuerdo, y ya llevo 2 meses de investigación de muchas de esas cosas, aunque también de otras mas (transmisión inalámbrica, Waspmote....etc)
Pero se que aun me queda un largo camino !! ...el cual gracias a gente como la que posetea y ayuda en este foro...como vosotros!! se que va a ser mas llevadero!