LusoRobótica - Robótica em Português

Electrónica => Electrónica Geral => Tópico iniciado por: helderjsd em 14 de Março de 2013, 12:43

Título: PWR na Attiny85
Enviado por: helderjsd em 14 de Março de 2013, 12:43
Boas,
Tenho alguns projectos "simples" e basicos em arduino, mas por questoes de espaço e dinheiro, estou a passa-los par aattiny.
Com isto, libertei uma serie de arduinos que tinha espalhados em casa, por soluções mais economicas (dinheiro e electricidade) em como em termos de espaço.
No entanto, tenho 2 pequenos projectos, em que utilizo 3 portas PWR.
Basicamente, estas portas estao ligadas a leds, para fazer efeitos de "fade".
A minha questao é, tendo o attiny85 apenas duas portas de PWR, como posso controlar 3 leds com fade? É certo que podia ocmprar led's RGB e tinha o problema resolvido, mas nao o tenho, e queria evitar comprar.

Pensei em ligar 2 attiny, em que a saida de 1 liga a entrada do outro. Quando este envia HIGH, o segundo attiny faz os fades correspondentes em mais duas portas.
Mas nao me parece uma solução pratica :(
Alguem tem outra sugestao/solução?
Título: Re: PWR na Attiny85
Enviado por: Marvin em 14 de Março de 2013, 14:37
PWR ou PWM?

Se for pulse with modulation (PWM) podes fazer isso programaticamente.

http://hackaday.com/2009/09/17/software-pulse-width-modulation/ (http://hackaday.com/2009/09/17/software-pulse-width-modulation/)

Espero que ajude.

Título: Re: PWR na Attiny85
Enviado por: helderjsd em 14 de Março de 2013, 15:03
PWR ou PWM?

Se for pulse with modulation (PWM) podes fazer isso programaticamente.

http://hackaday.com/2009/09/17/software-pulse-width-modulation/ (http://hackaday.com/2009/09/17/software-pulse-width-modulation/)

Espero que ajude.
Que lapso o meu :)
Sim, é PWM.
Ou seja, em vez de digitalwrite HIGH ou LOW, faço um analogwrite entre 0 e 255, onde vou incrementando ou diminuindo para criar o fade.
O problema é que quero fazer fade a 3 ou 4 leds, mas o attiny85 só tem 2 portas que são PWM
Assim, como o contorno???
Título: Re: PWR na Attiny85
Enviado por: senso em 14 de Março de 2013, 16:32
Fazes pwm por software, com um timer e um bocadinho de código, ou com delays como podes ver nestes exemplos:
http://www.instructables.com/id/ATtiny85-Mini-RGB-Mood-Light/?ALLSTEPS (http://www.instructables.com/id/ATtiny85-Mini-RGB-Mood-Light/?ALLSTEPS)
http://arduino.cc/forum/index.php/topic,75334.0.html (http://arduino.cc/forum/index.php/topic,75334.0.html)
http://www.kobakant.at/DIY/?p=3393 (http://www.kobakant.at/DIY/?p=3393)
Título: Re: PWR na Attiny85
Enviado por: helderjsd em 14 de Março de 2013, 17:12
Fazes pwm por software, com um timer e um bocadinho de código, ou com delays como podes ver nestes exemplos:
http://www.instructables.com/id/ATtiny85-Mini-RGB-Mood-Light/?ALLSTEPS (http://www.instructables.com/id/ATtiny85-Mini-RGB-Mood-Light/?ALLSTEPS)
http://arduino.cc/forum/index.php/topic,75334.0.html (http://arduino.cc/forum/index.php/topic,75334.0.html)
http://www.kobakant.at/DIY/?p=3393 (http://www.kobakant.at/DIY/?p=3393)
Basicamente é isto que tenho, mas ele funciona com fade na porta e 1, mas na 2 so acende e apaga.
Fazer fade, esta quieto.. :(
Título: Re: PWR na Attiny85
Enviado por: senso em 14 de Março de 2013, 17:35
É porque tens delays muito grandes..
Título: Re: PWR na Attiny85
Enviado por: helderjsd em 14 de Março de 2013, 17:39
É porque tens delays muito grandes..
os delays são iguais.
Ate estao definidos como uma variavel, ao inicio do sketch, e uso-a para todos...
Logo vou experimentar de novo, mas tenho a certeza que o codigo estava bem :(

Título: Re: PWR na Attiny85
Enviado por: senso em 14 de Março de 2013, 17:41
Mostra ai então.
Título: Re: PWM na Attiny85
Enviado por: helderjsd em 14 de Março de 2013, 21:36
Código: [Seleccione]
int red = 0;
int blue = 1;
int yellow = 2;
int white=4;
int delay1=100;
int delay2=5000;

void setup() {               
  pinMode(red, OUTPUT);
  pinMode(blue, OUTPUT);
  pinMode(yellow, OUTPUT);
  pinMode(white, OUTPUT);
}

void loop() {
  //acender azul
  int fadedown=0;
  for(int fadeup=0;fadeup<=255;fadeup+=5){
    fadedown=255-fadeup;
    analogWrite(blue,fadeup);
    delay(delay1);   
  }
  delay(delay2);
 
  //acender amarelo e apagar azul
  for(int fadeup=0;fadeup<=255;fadeup+=5){
    fadedown=255-fadeup;
    analogWrite(yellow,fadeup);
    analogWrite(blue,fadedown);
    delay(delay1);   
  }
  delay(delay2);

  //acender vermelho e apagar amarelo
  for(int fadeup=0;fadeup<=255;fadeup+=5){
    fadedown=255-fadeup;
    analogWrite(red,fadeup);
    analogWrite(yellow,fadedown);
    delay(delay1);   
  }
  delay(delay2);

  //acender branco e apagar vermelho
  for(int fadeup=0;fadeup<=255;fadeup+=5){
    fadedown=255-fadeup;
    analogWrite(white,fadeup);
    analogWrite(red,fadedown);
    delay(delay1);   
  }
  delay(delay2);

//apagar branco
  for(int fadeup=0;fadeup<=255;fadeup+=5){
    fadedown=255-fadeup;
    analogWrite(white,fadedown);
    delay(delay1);   
  }

  //acender todos
  for(int fadeup=0;fadeup<=255;fadeup+=5){
    fadedown=255-fadeup;
    analogWrite(white,fadeup);
    analogWrite(red,fadeup);
    analogWrite(blue,fadeup);
    analogWrite(yellow,fadeup);
    delay(delay1);   
  }
  delay(delay2);
 
//apagar todos
  for(int fadeup=0;fadeup<=255;fadeup+=5){
    fadedown=255-fadeup;
    analogWrite(white,fadedown);
    analogWrite(red,fadedown);
    analogWrite(blue,fadedown);
    analogWrite(yellow,fadedown);
    delay(delay1);   
  }
 
 
}
Título: Re: PWR na Attiny85
Enviado por: senso em 14 de Março de 2013, 21:53
Esses delays de 5000ms matão o esquema, e deves usas delays de micro-segundos e não de mili segundos.
Título: Re: PWR na Attiny85
Enviado por: helderjsd em 14 de Março de 2013, 22:09
Esses delays de 5000ms matão o esquema, e deves usas delays de micro-segundos e não de mili segundos.
Ola senso,
Obrigado pela tua resposta :)
Não percebi porque dizes que matam o esquema todo. Porque??
Pretendoque depois do fade, as luzes fiquem acesas antes de fazer o fade down.
E como faço delays em micro segundos em vez de ser milis?

De notar que no arduino funciona em pleno, no attiny, é que as portas PWM é funcionam. As outras nao fazem fade
Título: Re: PWR na Attiny85
Enviado por: senso em 14 de Março de 2013, 22:52
Primeiro, aconselho-te a veres o programa de exemplo Blink Without Delay
http://arduino.cc/en/Tutorial/BlinkWithoutDelay (http://arduino.cc/en/Tutorial/BlinkWithoutDelay)

Porque tem de gera a onda pwm é os delays, se tens um delays de 3 dias no loop dás cabo disso.
O link que te dei do forum Arduino usa timers para gerar o pwm por software, tem lá tudo o que precisas, vai ver o tópico e ler o código, está lá tudo!!
Título: Re: PWR na Attiny85
Enviado por: helderjsd em 14 de Março de 2013, 23:04
Primeiro, aconselho-te a veres o programa de exemplo Blink Without Delay
http://arduino.cc/en/Tutorial/BlinkWithoutDelay (http://arduino.cc/en/Tutorial/BlinkWithoutDelay)

Porque tem de gera a onda pwm é os delays, se tens um delays de 3 dias no loop dás cabo disso.
O link que te dei do forum Arduino usa timers para gerar o pwm por software, tem lá tudo o que precisas, vai ver o tópico e ler o código, está lá tudo!!

3 dias???? So tem 5 segundos.
loooooooool

Mas percebi a logica..
Título: Re: PWR na Attiny85
Enviado por: senso em 14 de Março de 2013, 23:08
A tua onda quadrada é gerada pelos digitalWrite HIGH e LOW dentro do loop, uma onda quadrada em que estás a HIGH ou a LOW durante 5 segundos é algo que se torna perfeitamente visivel ao olho.
Título: Re: PWR na Attiny85
Enviado por: helderjsd em 14 de Março de 2013, 23:19
Caro senso,
estas a ver mal o codigo
dentro do loop, so tenho delays de 30 micro segundos, entre valores do analogwrite implementados de 5 em 5 (de 0 a 255)
è completamente imperceptivel a olho nu
Quanto ao delay de 5 segundos, ele aguenta um dos led ON (analogwrite 255), antes de comrçar o de-fade
Título: Re: PWR na Attiny85
Enviado por: helderjsd em 14 de Março de 2013, 23:19
Mas aconselhas que tire o delay e use millis()?
Título: Re: PWR na Attiny85
Enviado por: pmj_pedro em 15 de Março de 2013, 14:58
Mas aconselhas que tire o delay e use millis()?

pelo o que percebi, ele estava te a aconselhar em usar o timer e interrupcoes