pregunta mantener informacion en falla de energia????

hola buen dia tengan todos, bueno tengo una pregunta:

¿Como puedo mantener en memoria una cierta informacion en mi arduino si se llegara a perder la energia en algun momento??

Estoy trabajando con motores a pasos y servomotores pero me ha surgido esa pequeña duda, si el arduino se encuentra en pleno proceso y se llegara a perder el suministro de energia por alguna razon, ¿¿¿sse puede mantener la posicion de los motores hasta q se reestableciera de nuevo la energia??? y si es asi, ¿¿¿como se logra????

hola en caso de que quieras conservar un dato aun cuando no haya energía debes de guardar esa información en la memoria eeprom, cuando la energía se re establezca lo primero que harias en el arduino seria leer los datos de la eeprom en la misma página de arduino estan las instrucciones para hacer eso http://www.arduino.cc/es/Reference/EEPROM , desconosco si hay un metodo para mantener los motores en la misma posicion sin energia

hola israel_332, muchas gracias por responder tan pronto

ya he checado la informacion q me proporcionaste pero aun no se como me puede servir ... mejor dicho como debo utilizar esta libreria, ¿podrias orientarme un poco mas?

gracias

Haber si lo entiendes un poco mejor con este ejemplo.

#include <EEPROM.h>

void setup()
{

Serial.begin(9600);

//Grabar en posicion 1 de la memoria el valor 3.
    EEPROM.write(1, 3);


void setup()
{
  
}

void loop()
{
  valor = EEPROM.read(1);
  Serial.print(a); //Imprime el valor de la direccion 1, un 3
  
  delay(500);
}

ok gracias por la paciencia pero emm bueno es q soy todo un novato en esto la verdad, dejame explicarme un poco mejor :slight_smile:

digamos q mi arduino esta corriendo y tengo muchas lineas en el programa y en ese momento se va la energia, ¿como puedo al volver la energia dirigirme directo a la linea donde se quedo???

¿¿puedo por ejemplo numerar mis lineas e ir guardando el numero de linea en la eeprom? para al inicio del programa hacer una lectura de esta y ver si contiene un numero de linea especifica???

y muchas gracias de verdad por contestar tan pronto

Grabar en la eeprom del micro continuamente lo puede dañar, tendrías que usar una memoria externa como una 24L08, luego en cada paso que quieres poder recuperar en caso de corte vas incrementando una variable y grabas su valor en la eeprom externa

Amigo sustirijiyo.

Lo que he leído de tu segundo post, me dice que lo que quieres hacer es del todo imposible (que me rectifiquen los más entendidos), puesto que cuando se reinicia un microcontrolador... A ver como te pongo un ejemplo.

Si, cuando uno se levanta por la mañana, lo primero que hace, es darse por despierto, toma el control de su estado de ánimo y procede con lo que se le antoje.

En tu Arduino, como es el caso, lo primero que hace cuando recibe la tensión es, darse un repaso a su memoria (la que le dice que es esclavo de Arduino) y ejecutar la rutina que tiene guardada en su memoria la que tu le has guardado con tu programa actual (nada que ver con la de 'Arduino').

Se deduce que no hay forma de interceptar este proceder, debido a que es lo que hay en el sistema. Lo que tu quieres, es poco menos que imposible, ya que tendrías que (como ya te ha dicho Flico) guardar cada instante de la rutina de TU programa, que no el sistema de Arduino (al que tu no puedes acceder).

En definitiva, explícate mejor sobre lo que quieres y tal vez te puedan ayudar.

Un saludo.

Yo coincido que si no imposible, lo mas parecido.

Pero te puedo dar una idea que valdria:

Añadele una memoria eeprom, añadele un sistema de energia extra (puede ser un megacondensador o una pequeña bateria que no necesita mucho tiempo de aguante) y cuando detectes que se va la tension el arduino lo sabe por medio de una interrupcion que habras programado, detiene el programa y vuelca en una eprom pequeñita, no hace falta mucha capacidad, los datos de donde se encontraba o las variables de tu invento.

Cuando luego vuelva la tension, el programa de cabecera lee si hay datos en esa eprom y si es asi y ve que no ha teminado la faena, salta a los parametros en que se quedo antes de quedarse sin energia y si no existe porque concluyo la faena pues no salta a ningun lado, continua procedimiento normal.

Con esto lo tiene solucionado si o si.

Un saludo.

PD: Si la luz NO se va cada 2 x 3 puedes emplear la propia eprom del arduino, pues los casos seran contados... si esto pasa a menudo pues emplea una externa:

Hola BUenos Dias a todos.

vamos por partes... emm primero muchas gracias a todos por tomarse el tiempo de contestar

bueno ya estaba pensando gracias a Flico en usar una eeprom externa, y bueno tampoco tenia idea de como hacerlo, aunq debo decir q yaestaba pensando en algo como lo q menciona Heke:

habia pensado en etiquetar cada una de las lineas con un numero,
crear una variable q fuera incrementandose linea a linea
y esta variable irla guardando en la eeprom
al momento de q se fuera la energia quedaria guardada la informacion y al momento de reestablecerse el sistema, al inicio del loop mandar leer la eeprom, esto regresaria un valor entero
y con este valor entero enviaria directo a la linea con la etiqueta correspondiente a ese entero.

bueno, esa es mi idea actual, pero espero q me ayuden un poco mas y me digan si es posible hacerlo asi o si fuera posible de otra manera tal ves me podrian orientar un poco mas.

gracias de nuevo y saludos.

No sé que tipo de programa tienes en mente, pero una idea puede ser hacerte una máquina de estados, ya que te resultaría relativamente sencillo volver donde estabas. Tendrías que ir guardando también todas las variables que quieras reponer al inicio.

Ejemplo: Estado 1 => Led off y Estado 2=>Led On y la transición entre ellos es el estado de un pulsador. Tengo una variable llamada estado (byte) que indica en cual de los dos estados que estoy. Cada vez que cambio de estado, guardo en memoria no volátil dicha variable. Al inicio del programa, lo que haces es leer de memoria no volátil dicha variable, y ese será tu estado de inicio. El programa ejecuta las acciones que toque en cada estado, por lo que al iniciar irá al último estado guardado y seguirá su flujo normal.

Incluso podrías tener un camino diferente si se ha ido la corriente, y hacer ciertas cosas que te interesen (ejemplo arranque suave de motores, etc). Esto ya es dependiendo de lo que estes haciendo....

Bueno, explicado rápidamente y algo sencillo. Eso si, necesitas tener un mecánismo que ante un corte, te de tiempo de guardar todos tus registros de control en memoria.

http://arduino.cc/forum/index.php/topic,75826.0.html

Saludos

Igor R.

Heke:
Añadele una memoria eeprom, añadele un sistema de energia extra (puede ser un megacondensador o una pequeña bateria que no necesita mucho tiempo de aguante) y cuando detectes que se va la tension el arduino lo sabe por medio de una interrupcion que habras programado, detiene el programa y vuelca en una eprom pequeñita, no hace falta mucha capacidad, los datos de donde se encontraba o las variables de tu invento.

Cuando luego vuelva la tension, el programa de cabecera lee si hay datos en esa eprom y si es asi y ve que no ha teminado la faena, salta a los parametros en que se quedo antes de quedarse sin energia y si no existe porque concluyo la faena pues no salta a ningun lado, continua procedimiento normal.

Un saludo.

Me sumo en un todo con eso!( sumando escribir un comando de "0" en la eeeprom, por las dudas para que en el setup del arduino controle, si el valor es 0 es una tarea nueva, sino, es una anterior que hay que resumir)

Otro mecanismo de seguridad para evitar errores de posición, es que al iniciar el código luego de una interrupción de energía, mueva los ejes hasta un tope para ver si los pasos del paso a paso coinciden con el ultimo valor del programa...

espero haber expresado algo que se entienda y sirva de algo (¿?) :smiley:

Saludos,

Charlie

amigo guarda los datos que necesitas en un un archivo de texto, pero para eso tendrías que tener el modulo shield de Internet que tiene el componente micro sd! estoy experimentado en mi programa con hacer eso ya que guardo unos datos mínimos de configuracion

Hola

Creo que antes de nada conviene hacer algunas puntualizaciones:

  • La memoria EEPROM de tu Arduino tiene una vida minima, estimada por el fabricante, de CIEN MIL ciclos de borrado-escritura, por lo que no parece muy necesario complicarse la vida con memorias externas.
  • El tiempo aproximado de escritura en esta memoria es de 3.3 milisegundos por cada byte, o dicho de otro modo en 1 segundo podrias escribir unos 300 bytes
  • Cualquier otro sistema de guardar datos de forma no volatil (tarjetas SD u otros dispositivos externos) es muchisimo mas lenta, lo que provocaria que un corte de energia impidiese salvar datos en estos soportes.
  • Las interrupciones, son un mecanismo muy eficiente de reaccionar ante los cambios externos.

Por todo esto quizas un método realista seria habilitar una interrupcion externa (por ejemplo la del pin 2) que, con la electrónica adecuada, nos diria cuando hay un corte o microcorte de tension, lo que nos llevaria a la ejecución de la rutina encargada de salvar el estado de tu máquina en la EEPROM, así como un indicador de fallo de tension.

Al reiniciarse de nuevo el Arduino la primera accion seria leer el indicador para saber si se reinicia tras un fallo de alimentacion o no, y realizar las acciones necesarias según el caso.

Para completar todo el sistema tendriamos que asegurar que desde que detectamos el fallo de tension hasta que realmente el Arduino deja de funcionar hay tiempo suficiente para guardar la informacion (3.3 mseg * numero de bytes a guardar), equipando algun condensador electrolítico que nos mantenga la tension durante ese tiempo. Por ejemplo uno de 4700 uF nos daria una autonomía de unos 120 mseg. es decir tiempo para salvar 120/3.3 = 36 bytes.

No sé si la idea te puede ser útil.

Saludos

El hilo es del 2012. No hay necesidad de responder nada.
De todos modos con la respuesta de Alfaville considero que esta mas que respondido el hilo y lo cierro para que no continúen personas que desconocen las normas, desobedicendo las advertencias .