Show Posts
Pages: [1] 2 3 ... 33
1  International / Proyectos / Re: Proyecto: añadir sensores a un robot submarino on: July 26, 2014, 06:01:49 pm
Una de las características de C++ que para algunos será virtud y para otros defecto, es que es muy estricto en cuanto a los tipos de variable, lo que incluye las funciones. Si miras la referencia, verás que el parámetro que se pasa a wire.onRequest es una función de tipo void y sin parámetros. Si la función que le asignas no coincide, el compilador te dará error. De la misma forma, para wire.onReceive el parámetro es una función tipo void y que va a recibir un parámetro int, así que tu función debe ser así. Si lees más, verás que a través de ese parámetro vas a recibir la cantidad de bytes que se te envían (yo lo he llamado computer_bytes_received), así que lo mejor es leer ese parámetro para saber cuántos bytes leer (como ves lo he utilizado en el for).
El código del master no debería ser muy complejo, sabiendo qué hay que enviar y recibir.
En el vínculo que te pasé en otro post tienes un ejemplo de transmisión master, recepción master, recepción esclavo y transmisión esclavo (al recibir onrequest).
2  International / Software / Re: ¿Threads en Arduino??¿? on: July 26, 2014, 05:38:03 pm
Hola.
Arduino no soporta nativamente multitarea, así que, aunque existen por ahí algunas librerías de usuarios que la emulan (por ejemplo), no es una forma demasiado eficiente de programar. Ten en cuenta que cada salto de un hilo a otro va a suponer una penalización de tiempo, pues se deben guardar los estados de los registros de la tarea en curso y recuperar los estados de los registros de la siguiente tarea. Esto, en procesadores preparados para multitarea se suele realizar con instrucciones específicas que se realizan en pocos ciclos de reloj.
Además cada hilo va a ocupar memoria RAM (no muy abundante en arduino) adicional para guardar el estado de la tarea.
Para mover cinco servos "simultaneamente", creo que lo mejor podría ser crear una "agenda" en la que se vayan colocando ordenadamente las instrucciones. Como tú dices, "engañar" al arduino, o más bien, engañar al ojo humano.
Discrepo con Naruto128. Para llevar varios procesos mezclados en el tiempo, lo mejor es huir de los delay como del diablo.
Saludos.

3  International / Proyectos / Re: Proyecto: añadir sensores a un robot submarino on: July 26, 2014, 10:51:07 am
Claro. Te da ese error, precisamente porque la función que asignes a onReceive debe ser void y recibir un parámetro int. Prueba el receiveEvent que te puse cuatro post arriba.
Code:
void receiveEvent(int computer_bytes_received)
{
      for (int i=0; i<computer_bytes_received; i++){
            computerdata[i]=wire.read();
      }
}

Y en cuanto a la función que asignas a requestEvent, prueba por este otro camino (escribiendo los datos previamente en un buffer de memoria), ya que creo que desde el esclavo se debe escribir, si no me equivoco, en un solo comando.
Code:
void requestEvent()
{
      char buffer_envio[20];
      sprintf(buffer_envio,"%s%f", sensordata, temp);
      wire.write(buffer_envio); // El envío desde esclavo i2c se debe hacer de una vez, creo
}
4  International / Software / Re: duda inclusion librerias en skecht on: July 26, 2014, 12:31:02 am
Hola.
#include <libreria>
va a buscar directamente a las carpetas predefinidas de librerías.
#include "libreria"
busca primeramente en el propio directorio de proyecto o la ruta que le indiques.
5  International / Software / Re: Pasar definicion de un fichero a otro. on: July 26, 2014, 12:09:49 am
Uffff  smiley-eek A veces es mucho más difícil entender la pregunta que conocer la respuesta.
Tengo varias respuestas posibles que van desde declarar u8g en la librería como extern, pasarle la pantalla a tu clase como un parámetro más, o heredar tu clase de la pantalla; pero sin ver el código de tu librería ni entender exactamente qué necesitas, pues sólo puedo señalarte la dirección aproximada, no la respuesta concreta.
6  International / Proyectos / Re: Proyecto: añadir sensores a un robot submarino on: July 25, 2014, 11:44:07 pm
Con lo del buffer, me refiero a un espacio de memoria en el que irás preparando los datos a enviar. Puede ser una cadena, en cuyo caso la "construyes" cuando el master te envía sus mensaje, y será la cadena que permanecerá a la espera de ser enviada cuando el master te diga "habla".
Digamos que antes, cuando te llegaba la pregunta ibas contestando la respuesta; ahora sólo preparas la respuesta para cuando te den permiso para hablar.
Sería interesante saber en qué "dialecto" van a ir esas preguntas y respuestas y podría decirte códigos más concretos.
7  International / Proyectos / Re: Proyecto: añadir sensores a un robot submarino on: July 24, 2014, 05:36:04 pm
Bien. En el código del esclavo i2c debes, básicamente, construir las funciones callback para onReceive y onRequest

Code:
void receiveEvent(int computer_bytes_received)
{
      for (int i=0; i<computer_bytes_received; i++){
            computerdata[i]=wire.read();
      }
      // analizar los datos recibidos en computerdata, preparar una respuesta en sensordata
}


void requestEvent(void)
{
      wire.write(sensordata); // Si es una cadena, así valdría. si es una estructura sería wire.write(estructura, numbytes)     
}


La principal diferencia es que cuando recibes datos del maestro, no puedes contestar inmediatamente, sino que irás preparando una respuesta en un buffer a la espera de que el master solicite datos. En requestEvent enviaremos esos datos previamente preparados en ese buffer.
8  International / Español / Re: [SOLUCIONADO] Convertir variable long a seis digitos. on: July 23, 2014, 05:57:50 pm
De nada, max_saeta. Si has comprendido el código, verás que con cambiar la comparación del for, puedes obtener más o menos dígitos.
Por supuesto que puedes utilizar 0x30 (también 48, ó B110000). Yo utilizo directamente '0' porque no sabía (ni me hacía falta) el código ascii del cero, y también porque queda más "autoexplicado" lo que  estoy sumando al valor del dígito.
Saludos.
9  International / Proyectos / Re: Proyecto: añadir sensores a un robot submarino on: July 23, 2014, 05:40:00 pm
Bueno; entiendo que lo que quieres es sustituir la transmisión-recepción serial en codigosensoresesclavo por una i2c y en codigosensoresordenador aún no has implementado nada del master.  Ya puedes poner dispositivos esclavos perfectamente programados, que como no haya un master que les dé la palabra, no van a decir ni pío.
Creo que podíamos empezar concretando más qué información deseas enviar del master al esclavo y viceversa, y centrarnos en un pequeño programa que muestre en el monitor del master lo que se recibe del esclavo. Una de las cuestiones a tener en cuenta es que el máximo de datos que se puede enviar en una trama i2c creo que es 32 bytes (aunque se puede modificar en la librería), así que lo ideal sería enviar los datos mínimos, con lo que además optimizamos tanto el tiempo de transmisión como la posterior extracción y conversión de los datos. No tiene sentido que algo que vamos a enviar para consumo del arduino se le envíe "humanizado" en plan cadenas tipo "temperatura1=27.56,temperatura2=27.30". Lo mismo se podría aplicar a las transmisiones serie entre dispositivos (otra cosa es una transmisión destinada al usuario, como el monitor serial).
De todas formas, si de momento sólo te interesa conseguir una transmisión i2c tal vez esto te ayude para empezar.
Ya irás contando.
Saludos.
10  International / Proyectos / Re: Ayuda Arduino + Variador de Velocidad Trifasico 220v on: July 22, 2014, 05:07:11 pm
Hola.
Perdón por el "off-topic", pero me pica la curiosidad, ya que mi padre es aficionado a la apicultura, pero utiliza un extractor manual, con lo que la aceleración la tiene bastante controlada smiley. Lo que no hace (aunque supongo que podría) es invertir el sentido de giro ¿qué misterio tiene? pues al fin y al cabo los panales van "mirando" hacia el exterior, con lo que el sentido de giro no debería influir mucho, ¿no?
11  International / Proyectos / Re: Proyecto: añadir sensores a un robot submarino on: July 22, 2014, 04:50:57 pm
Hola.
Tal vez deberías poner ese esquema que refieres, porque yo al menos no me termino de aclarar.
Si estos dos códigos se deben comunicar entre sí por i2c, entiendo que codeigosensoresordenador sería el master, ¿no?
Pero el caso es que ni has iniciado Wire en él (de hecho ni incluyes la librería) así que el otro ya puede esforzarse smiley-razz.
La verdad es que yo no he utilizado i2c, pero si miras en la referencia el ejemplo write y el ejemplo read, verás al menos cómo empezar con la parte de master.
Saludos.
12  International / Español / Re: Convertir variable long a seis digitos. on: July 21, 2014, 06:11:01 pm
Prueba a ver así:
Code:
void longtodig(unsigned long valor){
      for (int i=0;i<6;i++){
            digito[i]=valor%10;
            // si en lugar del valor del dígito queremos el carácter, sustituimos por
            // digito[i]=valor%10 + '0';
            valor/=10;
      }
}
13  International / Software / Re: Descargar unos 60 kb desde servidor web a SD de arduino on: July 21, 2014, 05:18:08 pm
Hola

Gracias por responder.

No creo que esa sea la mejor solución.

Saludos

Prueba con este bucle de recepción. No tienes nada que perder.

Code:
      do{
            Serial.print("Bytes a leer: ");
            Serial.println(cliente.available());
            while(cliente.available()) {
                  c = cliente.read();
                  Serial.print(c);
                  Archivo.print(c);
                  if (c==10){
                        Serial.println();
                        filas++;
             }
            delay(500);
      }  while (cliente.available());
14  International / Software / Re: Duda con los tiempo de los codigos on: July 20, 2014, 05:36:29 pm
¿Cómo vas a modificar los parámetros? Básicamente se tratará de escuchar un determinado evento en uno o varios puntos del loop y cuando se produzca ese evento llamar a una función que se encargue de leer el valor a modificar.
Por ejemplo, si utilizáramos el puerto serie para modificar parámetros, podemos incluir uno o varios
if (Serial.available) leeparametro();
y desde dicha funcion leer el valor y modificar el parámetro correspondiente.
15  International / Software / Re: Descargar unos 60 kb desde servidor web a SD de arduino on: July 20, 2014, 05:24:36 pm
Intuyo que lo que podría estar pasando es que dejas de leer tras finalizar un paquete de datos. Deberías combinar cliente.available() con algún control de timeout. Vamos, que no salga del bucle de recepción simplemente porque no haya caracteres disponibles, sino porque pase x tiempo sin haber caracteres disponibles.
Pages: [1] 2 3 ... 33