Resolvido - Arduino-Comportamento estranho ao iniciar o boot

Caros amigos,

Tenho um projeto, já em perfeito funcionamento, rodando num arduino LEONARDO, que aciona cfe. necessário um shield de 4 relés, e de tempo em tempo, cfe. programação, "lê" o estado de determinada chave on/off (pull up).

Tudo funciona bem depois de "startado".

O que acontece e estranho é que, ao energizar o sistema, o relé 4, sempre ele, é ligado/desligado aparentemente em 60hz em quatro ou cinco momentos de 1 segundo cada. Ressalto que não existe qualquer comando para que isso aconteça no início do sketch.

Após isto, o sketch é executado perfeitamente, linha por linha até o final.

De "diferente" apenas coloquei todo o sketch no loop -void setup()

Anexo vídeo com os primeiros 10 segundos após energizar o circuito onde se percebe o carregamento e o acionamento (indevido e misterioso) e ruído do relé 4. Após alguns segundos é acionado (corretamente) o relé 1 do shield.

Agradeço se alguém tiver alguma idéia do que pode causar isso.

Lauro becker

/*
*/

// the setup function runs once when you press reset or power the board
void setup() {

// initialize digital pins.
pinMode(10, OUTPUT); // Relé 1
pinMode(11, OUTPUT); // Relé 2
pinMode(12, OUTPUT); // Relé 3
pinMode(13, OUTPUT); // Relé 4
pinMode(2, INPUT); // chave on/off -
// Desarma todos os relés
digitalWrite(10, 1);
digitalWrite(11, 1);
digitalWrite(12, 1);
digitalWrite(13, 1);
//*

// Liga Solenoide 1 ------------------------------------- INICIO normal após o "boot", até o fim do sketch
digitalWrite(10, 0); // 
// Aguarda informação chave on/off
while(digitalRead(2) == LOW){ // Aguarda 
}

...........

Exibições: 916

Anexos

Responder esta

Respostas a este tópico

Lauro, boa tarde.

Vou assumir que a chave liga o pino 2 para Gnd qdo fechada, e que ela está aberta ao ligar o seu arduino.

Se assim for, recomendo esrever a linha assim:

                      pinMode(2, INPUT_PULLUP); // chave on/off -

 para que o resitor interno da porta fique ligado, deixando a porta no estado UP,

e evitando que ruídos eletricos externos ao ligar , operem o relé.

Se resolver, de um feedback.

Rui

Caro Rui,

Eu andei pesquisando e analisando esta possibilidade antes, e achei bem interessante pois dispensa o uso no circuito do resistor de 10k que é necessário ao utilizar pinMode(2, INPUT);, mas como não visualizei uma relação direta ao problema ainda não implementei.

Mas vou fazer a modificação e ver o que dá, pois até o momento não tem explicação lógica o que ocorre,

Por enquanto obrigado.

A propósito, ainda não fiz a alteração, mas é oportuno salientar que as vezes a leitura do pino 2 parece errática ainda que totalmente mecânica, fazendo mais sentido tua observações sobre uma possível captura de ruídos espúrios e indesejados.

Lauro,

voce usou "debounce"  para a chave no seu código?

Do jeito que parece, no pedaço do code que postou, vai dar isto mesmo.

Que tal postar o code inteiro?

Rui

Refiz as ligações retirando o resistor de 10k para a nova forma de leitura e alterando a porta de acionamento do rele 4, que passou da 13 para a porta 9.

Ficou perfeito. Só resta saber qual foi das alterações que solucionou.... he he he (ou quem sabe ambas?)

Como está perfeito agora (aparentemente) finalizo e agradeço a sugestão dos amigos

Muito obrigado pela atenção.

Lauro,

Esse comportamento "estranho" é natural.

Durante a inicialização do bootloader do arduino, o pino 13 irá piscar mesmo.

Para resolver o problema você tem duas opções:

1 - Alterar o boot e regravar o chip.

2 - Mudar o relé 4 para outro pino vago.

Sugiro a segunda opção pela simplicidade.

Abraço.

Obrigado. Nesse meio tempo estava fazendo por conta própria as alterações que sugeriste.

Efetivamente, prestando atenção ao "carregamento" do sketch percebe-se que a porta 13 sempre irá apresentar o "defeito", ainda que depois possa ser utilizada normalmente.

Testei e ficou tudo ok agora, veja resposta dada ao amigo Rui.

Muito obrigado.

Muito bem observado Wiechert.

O pino 13 tem comportamento diferente durante o boot.

A excelente sugestão do Rui também deve ser implementada.

Minha contribuição é a de se mover a parte do código conforme abaixo:

retirando o seguinte do setup():

// Aguarda informação chave on/off
while(digitalRead(2) == LOW){ // Aguarda 
}

adicionando o seguinte dentro do loop():

if(digitalRead(2) == LOW) {

  <coloque aqui o código do que quer fazer ao pressionar o botão>

}

Neste caso, entendi que o botão é pressionado apenas uma vez e não terá mais utilidade até desligar o conjunto. Portanto, não preocupa o erro de bounce.

Caso contrário, teremos que entender quais os passos adicionais.

Boa sorte,

  'Eiju

O "problema" foi (aparentemente) bem solucionado. Todas as contribuições foram e serão válidas para o futuro.

Na minha necessidade a leitura do pino 2 ocorrerá mais de uma vez dentro de certas condições. Algo como uma bóia de nível eletrônica. Meu sketch agora parece ok, mas preciso rodar várias vezes para ter certeza de que a leitura do pino 2 seja/esteja realmente confiável.

Muito obrigado Celso.

Neste caso, deverá incluir um capacitor em paralelo com a chave ou fazer um código para o debounce.

O código consistiria em "confirmar" que a chave mudou de estado depois de 10 ou mais milisegundos.

Se precisar de mais detalhes, por favor, nos diga mais sobre o que deve acontecer ao acionar a chave e ao desacionar a chave nas vezes seguintes.

Grande abraço,

  'Eiju

Caro Lauro,

Pelo que vejo não há nada para acrescentar a mais do que os colegas já disseram e seu problema esta solucionado.

Como sempre fazemos, peço que por favor antes do atual titulo do seu tópico, coloque a palavra RESOLVIDO, desta forma estara colaborando para aqueles que tenha duvidas similares no futuro,  encontrarem no seu tópico uma solução.

Desde já obrigado.

Abs.

É normal acontecer esse tipo de oscilação no pino 13 porque o pino 13 é utilizado para a comunicação serial. Evite usar ele no seu projeto.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço