Go Down

Topic: Arduino Uno não mantém a programação após desenergizado (Read 4323 times) previous topic - next topic

tmpaula

Olá,
 
Estou tendo um problema com minha placa Arduino Uno, pois quando realizo o upload de um programa através do cabo USB tudo funciona normalmente, mas quando o cabo é retirado e o Arduino alimentado por uma bateria (9V) ou o cabo conectado novamente ou outro tipo de alimentação o programa não funciona mais. Testei na placa Arduino de um amigo e o mesmo aconteceu, e sempre acontece com programas envolvendo comunicação serial, entretanto não parece haver problemas nos códigos.  Também ocorreu o mesmo problema em um programa com a função de armazenamento de dados (sem comunicação serial) que upei em minha placa.
Quando a placa é desenergizada e depois conectada ao cabo USB novamente basta reiniciar o computador e os programas com comunicação serial voltam a funcionar (ao contrário do programa de armazenamento de dados que não volta a funcionar), mas quando desenergizada e depois energizada novamente por bateria ou alimentação externa não voltam a funcionar.
 
Gostaria de saber se alguém tem alguma sugestão para que os programas sejam mantidos quando o Arduino Uno for desenergizado e depois alimentado por fonte externa, já que para os projetos que está sendo utilizado é necessário que a placa seja alimentada por baterias.
 
Agradeço.

bubulindo

A primeira sugestao que te podemos dar e meteres aqui o programa...

A outra e dizeres-nos onde e como ligas a alimentacao.

This... is a hobby.

luisilva

Isso é impossível! Sendo assim o problema é outro. Como o bubulindo sugere deve colar aqui o programa para que se possa ver o que se pode estar a passar. O mais provável é que o programa fique bloqueado de alguma forma, mas o programa continua gravado na flash, basicamente como é dito aqui:
Quote
Quando a placa é desenergizada e depois conectada ao cabo USB novamente basta reiniciar o computador e os programas com comunicação serial voltam a funcionar (...)
Só por curiosidade experimentou carregar no botão de reset do Arduino?

bubulindo

Ou esta a usar o Watchdog... as versoes chinesas acho que ainda usam a versao antiga do bootloader...

Nao que nao seja possivel de evitar esse problema... mas e preciso saber dele.
This... is a hobby.

tmpaula

Já tentei o botão de reset, mas não funcionou.

Seguem os programas:

*nesse primeiro, alimento o arduino apenas pelo cabo USB conectado ao computador e ao próprio conector da placa, mas ao retirar o cabo e depois conectá-lo novamente o programa não volta a funcionar direto, somente ao reiniciar o computador

const int xpin = A0;       
const int ypin = A1;       
const int zpin = A2;
       
void setup()
{

  Serial.begin(9600);
 
  analogReference(EXTERNAL);
 
  pinMode(xpin, INPUT);
  pinMode(ypin, INPUT);
  pinMode(zpin, INPUT);
 
}

void loop()
{
 
  Serial.print("z");
  delay(10);
  Serial.print(analogRead(xpin));

  Serial.print("x");
  delay(10);
  Serial.print(analogRead(ypin));

  Serial.print("y");
  delay(10);
  Serial.print(analogRead(zpin));

}

*o próximo programa testei com o arduino alimentado pela bateria, como nessa imagem: http://mlb-s2-p.mlstatic.com/cabo-adaptador-alimentaco-arduino-bateria-9v-3839-MLB4864657802_082013-O.jpg com um adaptador ligado à bateria de 9V e ao conector da placa. Quando upo o programa somente com a alimentação do cabo USB como no programa acima, funciona normalmente, mas quando retiro o cabo USB e alimento com a bateria, a programação não funciona.

#include <EEPROM.h>       

const int xpin = A0;       
const int ypin = A1;       
const int zpin = A2;       

int addr = 0;             

void setup()
{
 
 analogReference(EXTERNAL);
 
  pinMode(xpin, INPUT);
  pinMode(ypin, INPUT);
  pinMode(zpin, INPUT);
 
}

void loop()

   
  int x = analogRead(xpin)/4;
  EEPROM.write (addr,x);
  delay(100);
 
  int y = analogRead(ypin)/4;
  addr = addr + 1;
  EEPROM.write (addr,y);
  delay(100);
   
  int z = analogRead(zpin)/4;
  addr = addr + 1;
  EEPROM.write (addr,z);
  delay(100);
 
   addr = addr + 1;
 
  if (addr == 512)
    addr = 0;
   
   delay(1000);
   
}

Em ambos os programas tento enviar ou gravar informações de três eixos de um sensor, respectivamente, os quais liguei aos pinos A0, A1 e A2 do Arduino e a alimentação do sensor liguei ao pino 3.3V do arduino.



hugo007

Sabes que a eeprom tem numero de escritas finito? Da maneira que tens isso vais esgotar o numero máximo de escritas num ápice.Devias apenas preservar isso na eeprom quando ficasses sem energia!Monitorizas a linha de alimentação e caso detetes que ela falhou paras o programa e gravas os valores dessas variáveis na eeprom.Para que isso aconteça podes usar um conjunto de condensadores na linha de alimentação do micro que te vão dar uns segundos ate ficarem sem energia, mas suficiente para gravares os dados.
No momento de arranque do micro verificas se tiveste uma falha de energia (1 bit na eeprom como flag) e podes inclusive recuperar as leituras anteriores ...

Quote
mas quando retiro o cabo USB e alimento com a bateria, a programação não funciona.
Como sabes que não esta a funcionar?
Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B

luisilva

Assim já estou a perceber um pouco melhor. Devia definir melhor o que significa "não funciona".
Penso que no 1º caso, o problema é do PC e não do próprio programa. Está a escrever tão rápido que o PC não tem tempo de mostrar a informação no "Serial Monitor". Nesse caso, o driver ou ou programa (Serial Monitor) devem ficar "malucos" e a unica solução é reiniciar o PC. Tente dar mais espaçamento entre as leituras e tente de novo. Outra solução é armazenar as leituras de forma temporária num array e enviar quando o array estiver cheio (em que enquanto estiver a escrever no array não está a enviar).
No 2º caso, não compreendo porque é diz que não funciona. Não estou a ver uma forma que lhe permita avaliar isso. Coloque o led do Arduino a piscar durante a execução do loop() e dessa forma já consegue ver se o programa funciona ou não.
 Qualquer coisa assim:
Code: [Select]
#include <EEPROM.h>       

const int xpin = A0;       
const int ypin = A1;       
const int zpin = A2;       

const int pinoLed = 13;

int addr = 0;             
int estadoLed = LOW;

void setup()
{
 
 analogReference(EXTERNAL);
 
  pinMode(xpin, INPUT);
  pinMode(ypin, INPUT);
  pinMode(zpin, INPUT);
 
  pinMode(pinoLed, OUTPUT);
}

void loop()
{
   
  int x = analogRead(xpin)/4;
  EEPROM.write (addr,x);
  delay(100);
 
  int y = analogRead(ypin)/4;
  addr = addr + 1;
  EEPROM.write (addr,y);
  delay(100);
   
  int z = analogRead(zpin)/4;
  addr = addr + 1;
  EEPROM.write (addr,z);
  delay(100);
 
   addr = addr + 1;
 
  if (addr == 512)
    addr = 0;

   estadoLed = !estadoLed;
   digitalWrite(pinoLed, estadoLed);

   delay(1000);
   
}


Outra coisa que me chama a atenção é a linha:
Code: [Select]
analogReference(EXTERNAL);

Sabe o que isto faz? Isto não está a causar problemas?

tmpaula

Desculpe, o que quis dizer com o programa não funcionar é que percebi que o micro realiza as funções de armazenamento ou envio de dados presentes no programa normalmente quando a programação é upada, ou seja, recebo os dados que quero do sensor no computador, mas ao trocar a fonte de alimentação do cabo para a bateria, já não recebo os dados do sensor no computador, é como se o programa gravado no microcontrolador não estivesse rodando mais. Eu chequei no segundo caso, armazenando os dados e depois utilizando uma nova programação para a leitura da memória EEPROM, e quando não retirei a alimentação e escrevi na memória e logo após li os dados, funcionou perfeitamente, mas quando tentei armazenar os dados com a placa alimentada pela bateria e depois utilizei o programa de leitura, não havia nada novo armazenado.

E sobre analogReference(EXTERNAL), eu adicionei para a alimentação do sensor na verdade, e liguei o pino de 3.3 V ao AREF, pois ao usar os tipos de referência interna no mesmo comando a resolução do ADC não correspondia à correta leitura do sensor por usar a tensão de referência sempre como 5V ao invés dos 3.3V.

Também não pretendia usar a memória EEPROM por causa das escritas serem finitas, mas é que para o projeto necessito armazenar os dados do sensor em algum lugar por alguns minutos para depois passar para o computador e não vi outra alternativa de armazenamento já que entre armazenar os dados e passá-los pro computador tenho que desenergizar o micro (retirar a bateria e conectar o cabo USB). Outra possibilidade seria utilizar um módulo bluetooth para passar os dados em tempo real para o computador, mas como estou tendo esse problema do programação não rodar ao alimentar a placa na bateria não consegui realizar os testes com o bluetooth.

De qualquer forma, agradeço à todos pelas dicas, irei incorporá-las ao meu projeto para tentar resolver meu problema. Obrigada!

hugo007

Quote
mas ao trocar a fonte de alimentação do cabo para a bateria, já não recebo os dados do sensor no computador
No codigo que colocas-te apenas verifico que lês o sensor e armazenas na eeprom.Justificaste o uso da eeprom porque vais desligar o micro para o ler no pc, ok mas quando depois dizes que nao recebes os dados no computador como fazes essa leitura?
Estou a perguntar isto porque cada vez que o micro for alimentado vais perder os valores antigos armazenados porque os iras rescrever (o teu loop ira ser executado novamente e lembra-te que o teu loop esta cheio de EEPROM.write (addr,x); ) assim sendo nao vejo sentido do que esperas ler nele
Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B

Go Up