1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
/** * Author: giltesa * WebSite: http://giltesa.com * License: CC BY-NC-SA 3.0 * * Esta estructura, de tipo union y no struct, permite guardar un dato del tipo que queramos, y hacerlo accesible de dos formas distintas. * - La primera de ellas es accediendo al dato directamente como una variable mas. * - La segunda forma es accediendo a su memoria, en el caso del float este tiene un tamaño de 4 bytes, eso hace que podamos acceder a sus 4 bytes por separado. * Esto aparentemente no tiene ninguna utilidad, salvo que queramos transmitirlo entre dos Arduinos inalambricamente ya que para ello han de ser enviados los bytes uno a uno. Despues se recogen uno a uno y se restauran en otra estructura union: */ union miDato{ float fval; byte b[4]; // Array de bytes de tamaño igual al tamaño de la primera variable: int = 2 bytes, float = 4 bytes } origen, destino; // Se crean dos estructuras Union, cada una es independiente de la otra y guardan distintos datos. void setup() { Serial.begin(9600); delay(1000); // A la estructura de origen se le da un valor float, una temperatura por ejemplo. origen.fval = -103.36; // Se imprime para comprobar que se ha guardado bien: Serial.print("Origen= "); Serial.print(origen.fval); // Ahora se copia byte a byte la estructura de origen en la estructura de destino: for(int i=0 ; i < sizeof(origen.fval) ; i++) destino.b[i] = origen.b[i]; // Y se imprime el float de la estructura de destino, es el mismo dato que el de origen! Serial.print("\nDestino= "); Serial.print(destino.fval); } void loop() { } |
Holaa holaaa
Soy nuevo en esto de arduino
y quiero hacer un robotsito que guarde informacion
emmmm algo asi como si aprendiera nuevos movimientos.
para hacer eso se puede utilizar unicamente el «union» o es con el «eeprom» o es una combinacion o nada de eso?
por ejemplo: para mover un servomotor con un potenciometro a 90º y luego a 30º y que precionando un boton el servo repita los mismos movimientos.
Hola,
Se puede hacer pero no es facil, de hecho si eres nuevo con Arduino / C yo no iría tan rápido porque vas a tener errores por todos lados y te desanimaras.
A modo de resumen tendrias que tener en cuenta:
Tener una parte de código que sepa diferenciar cuando se van a memorizar nuevos movimientos o cuando se van a repetir los almacenados.
Por ejemplo con tres botones que controlase el inicio y final de grabación y también otro para indicar que grabe ese movimiento y pase al siguiente a memorizar, luego con el potenciómetro tendrias que indicar los grados de movimiento.
Todo eso hay que guardarlo, puedes hacerlo con estructuras dejando memoria para X movimientos e ir almacenándolos uno por uno.
También podrías usar una memoria SD y grabar los movimientos en un fichero, un movimiento por linea y tantos movimientos como lineas haya en ese fichero… esto seria mas facil que usar la EEPROM y las estructuras, aunque en el fichero estarías guardando caracteres no números así que tendrias que hacer conversiones…
También puedes guardar la información en la SD como datos, aunque entonces seria lo mismo que la EEPROM y tendrias que jugar con las estructuras…
Como ves hay muchas cosas a tener en cuenta y las que me estaré dejando… ves probando todo poco a poco y cuando lo domines «solo» tendrás que juntarlo!
Saludos!
aaaaaaaaawww ok ok entonces investigare cada uno de los puntos que me dijiste para ver que puedo hacer
gracias por todo y saludos 🙂
Estaba intentando recibir en el arduino un numero de 32b desde el servidor php. Para enviarlo desde php lo divido en 4 caracteres ascii usando el operador >>. Luego en arduino muevo esos 4 caracteres con el operador << para recuperar el numero de 32b.
Si uso el operador bitwise me da un numero negativo que nada tiene que ver con lo que envio.
Pero haciendo un "union" de long y char[4], si asigno los 4 caracteres a las 4 posiciones del array, luego el long del union es el número que he enviado desde php.
Podrías haber usado Serial.parseInt() que te lee un número de 32 bits directamente del buffer.
Si estas usando el objeto Client o parecido para leer los datos del servidor, este objeto hereda la misma clase que la de Serial, así que ambos tienen el método parseInt que heredan de Stream.
Saludos.