LusoRobótica - Robótica em Português

Sistemas específicos => Arduino / AVR => Tópico iniciado por: dio123 em 07 de Junho de 2013, 00:19

Título: modo sleep arduino
Enviado por: dio123 em 07 de Junho de 2013, 00:19
Boa noite,
Hoje decidi exprimentar no meu arduino os modo sleep. A primeira ronda consegui por o atmega8 a consumir  3.4ma.
Depois fui ligar o  lcd 16x2 em shift register e aqui  encontrei um problema. Mesmo sem o lcd ligado está consumir 40ma onde deveria estar nos 3.4ma. se tirar #include <ShiftLCD.h> já vai para o 3.4.

Alguem me poder uma dica do que se está a passar?
Acho que codigo nao tem  erro, ou pelo menos nao dectacta erro.

Desde ja agradeço
Título: Re: modo sleep arduino
Enviado por: Njay em 07 de Junho de 2013, 00:29
Tens algo mal nas ligações, circuitos digitais não têm esse tipo de consumo.
Título: Re: modo sleep arduino
Enviado por: dio123 em 07 de Junho de 2013, 15:54
bem o problema estava na biblioteca voltei a por os pinos originais e já funciona.Agora vai 8.5ma se tirar 7805 vai para 3.4ma.

Agora estou com o seguinte problema.  Liguei o keypad e defeni a tecla 3 para por o arduino em sleep e outro botao ligado ao pino 2 para acordar.

Marco os numeros aparece no lcd, clico no 3 o arduino entra em sleep.  Depois quando acordo clico no keypad mas nao aparece nada do ecra.
Terei de defenir novamente alguma coisa no wakeUpNow() ?

codigo está no  primeiro post actualizado.
Título: Re: modo sleep arduino
Enviado por: dio123 em 08 de Junho de 2013, 19:56
Já tenho tudo a funcionar como planeado e projectado.

No entanto vi que posso usar o teclado para acordar o arduino. Assim evito assim ter um botão própio.
Pelo os esquemas que estão na net segui este http://www.crossroadsfencing.com/Diode_AND_interrupt.jpg (http://www.crossroadsfencing.com/Diode_AND_interrupt.jpg)

Coloquei o diodo 1n4007. Depois coloco o arduino em sleep mas nao consigo acordar com o keypad.

O que está mal.
Título: Re: modo sleep arduino
Enviado por: andre_f_carvalho em 08 de Junho de 2013, 21:08
consegues ter sinal no pino que esta ligado ao ard?
Título: Re: modo sleep arduino
Enviado por: dio123 em 08 de Junho de 2013, 21:37
no pino sem nada ligado tem 0.22v. Depois com o esquema da imagem com os diodos a mesma coisa 0.22v.

Pelo o que percebi o pino sem voltagem faz acordar o arduino do sleep. Com voltagem já não.
Título: Re: modo sleep arduino
Enviado por: andre_f_carvalho em 08 de Junho de 2013, 22:09
no pino sem nada ligado tem 0.22v. Depois com o esquema da imagem com os diodos a mesma coisa 0.22v.

Pelo o que percebi o pino sem voltagem faz acordar o arduino do sleep. Com voltagem já não.


entao ness caso mete uma resistência em serie para baixar ate 0v, nao sei a forma certa de como isso trabalha, mas no meu ver faz mais sentido ligar com sinal positivo, a nao ser que seja tipo switch
Título: Re: modo sleep arduino
Enviado por: senso em 08 de Junho de 2013, 22:22
Depende de como configuram as interrupções, tenho ideia que o atmega acorda tanto com rising edge como com falling edge, leiam a datasheet..
Título: Re: modo sleep arduino
Enviado por: dio123 em 08 de Junho de 2013, 23:40
resolvido, tenho de limpar o codigo.

O problema deve-se ao facto de nao ter defenido os pinos do teclado no OUTPUT antes de entrar em modo sleep.
Quando acorda define como  INPUT.
 
Título: Re: modo sleep arduino
Enviado por: dio123 em 10 de Junho de 2013, 00:55
alguem me pode confirmar o seguinte.
O multimetro na escala 2ma  .675 quer dizer 675 microamperes.

O atmega328 alimentado 3 pilhas normais, 675 microamperes. Muito bom mesmo.

Título: Re: modo sleep arduino
Enviado por: dio123 em 29 de Junho de 2013, 00:33
Boa noite,
Estou aqui com um quebra cabeças e nao sei o que está mal.
Então o sensor acorda o arduino. o arduino envia sinal rf e dorme. Isto funciona bem no atmega328 sem problemas.

O mesmo codigo no atmega8 não funciona e testei ainda noutro atmega.  Porque?

Codigo em anexo.
Citar
#include <avr/sleep.h>
#include <VirtualWire.h> // lib para RF

long tempofinal =0;
long prev = 0;   

int led = 13;
 int estado =0;



void setup()
{
pinMode(2, INPUT);
 pinMode(led, OUTPUT); 
 vw_set_tx_pin(9); // porta que vamos usar
 vw_setup(2000); // bits para comunicação
}

void loop(){
  enterSleep();
estado = digitalRead(2);
while( estado == HIGH){
  tempofinal =  millis() - prev ;
  estado = digitalRead(2);
  if (estado == LOW){
break;
 }
 if (tempofinal > 5000){
      prev = millis();
      pin2Interrupt();
}
}
  }
void pin2Interrupt(){
detachInterrupt(0); 
digitalWrite(led,HIGH);
for(float i=0;i<10000;i++){}
const char *msg = "3";
vw_send((uint8_t *)msg, strlen(msg));
digitalWrite(led,LOW);
}

void enterSleep()
{
  attachInterrupt(0, pin2Interrupt,RISING);
  delay(100);
  set_sleep_mode(SLEEP_MODE_PWR_DOWN); 
  sleep_enable();                 
  ADCSRA &= ~(1 << ADEN);
 sleep_mode();   
 
 sleep_disable();
}