Estou com um arduino uno, ele e energizado via fonte externa e possui conexão com um computador, porem sempre que desconecto o cabo usb ele reinicia, exemplo:

Alguns reles ligados e o  arduino recebendo dados de sensores, se desconectar o cabo usb do computador ele para de operar, os reles desligam.

Não achei muita coisa nas pesquisas pela internet, seria isso algum defeito na placa? Ou elas fazem mesmo este processo? A algum método para contornar esse problema. Aguardo!

Ideia seria que, o programa rodando no computador receba dados e execute acoes no arduino, porem, se a conexão se perder por alguns instantes, queria que os reles continuassem ligados e quando a conexão fosse restabelecida  o programa verifica o que esta em high ou não e executa as tarefas pré-determinadas.

Exibições: 791

Responder esta

Respostas a este tópico

Poste seu codigo, pode ser problema com a programação.

Pode ser uma pequena sobrecarga dos componentes sobre a placa, isso pode causar o reinício ou bugs, tente usar um capacitor, resolveu um problema que tive. Abraços!!

Obrigado pela intenção de ajuda. o codigo esta ae. Bem simples.

https://pastebin.com/guvE8wzG

Acontece que a placa nao esta mais reiniciando, ela energizada externamente agora não reinicia quando desconecta o cabo usb. Porem quando retorno a conectar o cabo usb ele reinicia. Isso e comum? Se não, ha alguma maneira de contornar ?

Outra coisa que vou aproveitar pra tirar a duvida: Na comunicação serial, a porta necessita abrir e apos fechar a cada envio ou recebimento de dados. Com isso preciso de dois loops dentro do arduino, que verifica constantemente valores de sensores. No app java tera uma interface na qual mostra esses valores. Porem esses loops nao poderiam ficar rodando constatemente ja que outros dados tambem seriam enviados e tambem outros loops. Como faço pra resolver esse problema? Deveria criar uma variavel de interrupção do loop assim que o arduino ou o java necessitasse se comunicar?

O Arduino original:

https://www.arduino.cc/en/uploads/Main/Arduino_Uno_Rev3-schematic.pdf

Possui uma ligação entre o microcontrolador que auxilia na gravaçao e o reset do arduino.

Suponho que o chines (todos) também.

O mais popular hj em dia é o:

https://i.stack.imgur.com/Rm50J.jpg

Veja que o pino DTR da serial está ligado ao reset.

O DTR é pulsado durante o boot. Faz parte do protocolo de identificação de perifericos (Plug&Pray).

Por isso sempre que vc der um boot no micro vai dar boot no seu dispositivo.

Se vc não quer isso, desligue o reset do dtr. Só que não mais poderá gravar o microcontrolador, só "conversar". 

Obs: Plug&Play foi escrito de forma errada intencionalmente.

Todas as vezes que a conexão serial for aberta, o DTR pulsa e reinicia o MCU.

Mesmo sem o DTR é possível gravar o microcontrolador, mas é necessário saber o momento certo para apertar o botão de reset ou ficar segurando até o momento que for feito o upload e depois soltar.
Obrigado pelo contato Eduardo, quando eu tiver certeza do código totalmente pronto e testado para não necessitar mais alterações eu faca o procedimento, agora sobre a conexão serial tem alguma dica? A comunicação e entre java e Arduíno, e necessito deixar alguns loops rodando verificando constantemente alguns sensores. Porem esses loops ocupam a serial e não poderia deixar a seria ocupada só com um loop, o que posso fazer?

Bom dia amigo tudo bem.
Para resolver esse problema na placa uno, crie uma serial virtual e ligue um conversor ttl/usb(tipo ftdi por exemplo). Isso resolve o problema de reinicialização ao abrir serial. Fisicamente ligado na placa uno, como nosso amigo FH disse, o DTR reinicia o uC.
Caso você for montar um arduino stand alone, o ftdi pode ser ligado diretamente no pino 0 e 1 sem problemas, desde que você não ligue o DTR.
Espero ter ajudado.

Bom Dia obrigado pelo contato! Dei uma pesquisada e vi como funciona. Tenho aqui um ftdi que usava num automatuon board, segundo o que vi por alto numas pesquisas que fiz e só conectar o RX e o TX do ftdi em qualquer uma das saídas digitais do uno, e usando da biblioteca softserial

Tem varios caminhos para a questão da serial. Cito 3:
1) criar uma rotina de tratamento. Algo que começa com o if() de se veio caracter e se veio trata, se não veio finaliza.
Aih em todos os pequenos loops e momentos de espera espalhados pelo programa vc roda essa rotina.
Costumo fazer um "leserial()" por ex. aih sempre fico chamando. Chamo por ex de dentro de uma rotina de escrita no LCD, etc. Assim o tempo todo vc verifica sem ficar preso a um loop.

Se fizer um delay(100) troca por
for(int x=0;x!=90;x++) {delay(1); leserial();}


2) usando interrupções. O ideal seria usar a interrupção da serial.
https://www.arduino.cc/en/Tutorial/SerialEvent
Não sei pq em outros microcontroladores é muito comum o uso de interrupção para a serial, no Arduino não. Acho que já é hora de começar a aproveitar esses recursos.



3) criando mais de um main(). Sim isso é possivel. Veja isso:
https://www.arduino.cc/en/Tutorial/MultipleBlinks
Mais um recurso que não vejo ninguém usar. Uma turbina na roda...
Nunca usei...hehehe. Com não me acostumei a ter me viro sem mesmo.

Eduardo, procurei me informar sobre os três métodos mas acho que, se intendo bem não me ajudaram, vou te explicar melhor a situação. O projeto em questão e um computador de bordo. Já tenho sensores para a marcha, rmp, freio de mao, temperaturas e voltagens. Os sensores no Arduíno fica constantemente vendo esses valores sem interrupção e enviam pela serial ate um programa java. Essa conexão, tem que ficar aberta todo o tempo de execução do aplicativo para que as informacoes na interface gráfica sejam visualizadas em tempo real, pois não faria sentido ver o rpm do carro três segundos apos a a leitura. Com isso, esses loops aberto, se eu tentar fazer outra tarefa, como ligar o som, a potencia(que também esta ligada na placa) da erro, pois outra conexão serial já esta aberta. Pelas minhas pesquisas o único modo seria uma conexão serial extra, no caso usando a biblioteca softwareserial que cria uma conexão serial a mais utilizando dois pinos do Arduíno. Ainda não experimentei porque estou sem o cabo ttl, mas acho que funciona sim, mas por esta solução, não me cairia bem, porque para cada loop deveria ter uma conexão serial extra, porque uma deveria estar sempre livre, no caso, rmp, troca de marcha, voltagem, temperaturas , esses sensores iriam que ter uma conexão serial própria o que me gastaria muitos cabos, fios e portas seriais. O que acha? Estou complicando um problema relativamente facil? Ha outro modo mais simples de obter essas informacoes? E possível por exemplo ter mais de uma porta serial para uma única conexão?

Então eu que não tinha entendido a duvida e continuo não entendendo.

A conexão serial é ponto a ponto. Vc abre no inicio da aplicação e fecha quando sai da aplicação. Não se fica abrindo e fechando o tempo todo.

Vc tem 1 microcontrolador e 1 PC, precisa de uma interface serial... ?

Se tem outro dispositivo serial, por ex um sensor que é serial e precisa também ser ligado ao microcontrolador vc precisa de uma segunda serial. Se não tem em hardware (como no Mega) vc pode usar uma em software (softserial).

Bom dia Eduardo!

Sobre a conexão serial, se eu deixa-la sempre aberta, no programa java da erro, porque usando o método i/o serial ha um buffer que guarda o que foi escrito ou lido, e só se perde quando fecha a conexão, ou seja, se eu tentar ler ou enviar um dado, em seguida do outro sem antes fechar a porta da erro. De toda maneira, não poderia deixar a porta aberta porque, exemplo, sensor de rpm enviando valores para o java ao mesmo tempo que os sensores de temperatura, e ,de repente troco de marcha. Nessa situacao como o alguem receberia as informações com atrazos ate valores alterados.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço