Como otimizar o Arduino para design de baixo consumo de energia

O consumo de energia do controlador incorporado é a principal preocupação em projetos de baixo consumo de energia. As placas Arduino são frequentemente usadas em dispositivos que dependem de bateria ou carregamento solar. Esses dispositivos geralmente são implantados longe da linha de energia para a substituição periódica da bateria ou são dispositivos móveis projetados para ciclos de carregamento periódicos. Nesse caso, otimizar o Arduino para baixo consumo de energia é essencial. A otimização do Arduino também permite garantir que todo o circuito seja utilizado de forma mais eficiente. Várias medidas podem ser aplicadas para reduzir o consumo geral de energia do controlador. Contudo, o consumo líquido de energia pelo dispositivo ainda depende de outros componentes interligados com o controlador.

Existem vários hacks e truques que os designers usam para reduzir o consumo de energia da placa Arduino. Quando o projeto de baixo consumo de energia é a prioridade, os projetistas primeiro escolhem uma placa Arduino com tensão operacional mais baixa. A seleção de uma placa Arduino não pode ser baseada apenas na tensão operacional ou no consumo de energia. Freqüentemente, um Arduino de baixo consumo de energia pode não se adequar bem a uma aplicação específica. Normalmente, as variantes de baixo consumo de energia têm menos recursos de hardware ou menos GPIO. Nessas situações, a aplicação pode não ser viável ou pode ficar comprometida com o uso de um Arduino de baixa potência. Independentemente da placa Arduino selecionada para uma determinada aplicação, os projetistas quase sempre usam modos de suspensão ou modos de economia de energia do Arduino para otimizar o consumo de energia.

Além de selecionar um Arduino de baixo consumo de energia e usar modos de economia de energia, alguns hacks de software e hardware podem ser usados ​​para reduzir o consumo de energia. Os hacks de software incluem redução da velocidade do clock, redução da tensão de operação e otimização do código do software para baixo consumo de energia. Deve-se tomar cuidado para que hacks de software não comprometam o desempenho pretendido do aplicativo. O hack de hardware inclui a remoção de hardware extra da placa Arduino que pode não ser utilizado após a implantação do aplicativo/dispositivo. Vamos discutir todas essas medidas de economia de energia para o Arduino.

Selecionando o Arduino certo
Primeiro, a menor placa Arduino adequada deve ser selecionada para um projeto de baixo consumo de energia. Se uma aplicação não tiver muitos componentes externos, deve-se usar Arduino nano ou Arduino Pro Mini em vez de Arduino UNO ou MEGA. Normalmente, o Arduino Nano tem um consumo de energia de 20-30 mA quando alimentado por uma bateria de 9V. Na mesma aplicação, o Arduino Pro Mini pode ter um consumo de energia de 15 a 20 mA. O Arduino Pro Mini 3V3 tem um consumo de energia inferior a 10mA. Se uma aplicação exigir mais GPIO ou muitos recursos de microcontrolador, apenas Arduino UNO ou MEGA deverá ser selecionado.

Curiosamente, o Arduino MEGA possui mais GPIO e periféricos integrados; seu consumo de energia é um terço menor em comparação com o Arduino UNO. A pegada de energia do Arduino UNO normalmente vai de 100 a 120 mA, enquanto o MEGA pode consumir apenas entre 70 a 80 mA para a mesma aplicação. Observe que a pegada energética de um Nano é um quinto de um Arduino e um quarto de um Mega. O uso do 3V3 Pro Mini pode reduzir ainda mais o consumo de energia em 50%.

Modos de baixo consumo de energia do Arduino
A melhor maneira de reduzir o consumo de energia de um aplicativo alimentado por bateria é usar modos de economia de energia. Cada microcontrolador possui modos de suspensão ou modos de economia de energia. A maioria das placas Arduino é baseada no controlador ATmega328P, que oferece seis modos de economia de energia. Eles também são chamados de modos de suspensão ou modos de espera. Esses modos podem ser ativados com a ajuda da biblioteca LowPower.h. As bibliotecas power.h ou sleep.h também podem gerenciar os modos de suspensão do Arduino. Os seis modos de economia de energia no Arduino são os seguintes.

  1. Modo inativo
  2. Modo de redução de ruído ADC
  3. Modo de desligamento
  4. Modo de economia de energia
  5. Modo de espera
  6. Modo de espera estendido

Para ativar qualquer um dos modos de suspensão acima, o bit Sleep Enable (SE) no Sleep Mode Control Register (SMCR) deve ser definido como 1. Um modo de suspensão específico pode ser selecionado definindo os bits de seleção do modo de suspensão (SMCR.SM(2 :0)). Uma vez ativado o modo sleep e um dos modos selecionado, o modo sleep pode ser executado chamando a instrução SLEEP. Para despertar o Arduino do modo de suspensão, um botão de reset pode ser pressionado ou uma interrupção do Arduino pode ser programada. Durante os modos de suspensão, o consumo de energia das placas Arduino é reduzido para alguns microamperes em comparação com o consumo de energia de vários miliamperes no estado ativo.

Modo inativo do Arduino
O modo inativo é ativado escrevendo '000' nos bits de seleção do modo Sleep (SMCR.SM(2:0)). No modo inativo, o sinal de clock da CPU e do flash é desativado enquanto o sinal de clock de outros periféricos é mantido ativo. Portanto, a CPU é desligada enquanto USART, SPI, TWI, temporizador/contador, comparador analógico, temporizador watchdog e interrupções permanecem operacionais. Software ou interrupção externa podem ser usados ​​para despertar o Arduino do modo de suspensão ocioso. A interrupção do software pode ser timer overflow ou USART. Um botão ou sensor pode gerar a interrupção externa. O Arduino também pode ser despertado do modo inativo usando um atraso de tempo.

LowPower.h deve ser importado para o esboço do Arduino para ativar o modo inativo. A biblioteca pode ser encontrada no seguinte link. A biblioteca precisa ser baixada como um arquivo ZIP e incluída nas bibliotecas do Arduino navegando em Sketch->Incluir Biblioteca -> Adicionar Biblioteca .Zip no IDE do Arduino. A biblioteca pode ser importada no esboço do Arduino usando a seguinte instrução.
#incluir “LowPower.h”

Para ativar o modo inativo no Arduino baseado em ATmega328P/ATmega168, adicione a seguinte instrução à função loop .
LowPower.idle(SLEEP_8S, ADC_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF, SPI_OFF, USART0_OFF, TWI_OFF);

A instrução acima ativa o modo inativo por 8 segundos. O modo Idle pode ser ativado por 15ms, 30ms, 60ms, 120ms, 250ms, 500ms, 1 segundo, 2 segundos, 4 segundos, 8 segundos ou para sempre passando SLEEP_15MS, SLEEP_30MS, SLEEP_60MS, SLEEP_120MS, SLEEP_250MS, SLEEP_500MS, , DORMIR_2S, SLEEP_4S, SLEEP_8S ou SLEEP_FOREVER como argumento respectivamente. A instrução acima também desativa o comparador analógico, temporizador 0, temporizador 1, temporizador 2, USART, TWI e SPI.

Para ativar o modo inativo no Arduino baseado em ATmega32U4, adicione a seguinte instrução à função loop .
LowPower.idle(SLEEP_8S, ADC_OFF, TIMER4_OFF, TIMER3_OFF, TIMER1_OFF, TIMER0_OFF, SPI_OFF, USART1_OFF, TWI_OFF, USB_OFF);

Para ativar o modo inativo no Arduino baseado em ATmega2560, adicione a seguinte instrução à função loop .
LowPower.idle(SLEEP_8S, ADC_OFF, TIMER5_OFF, TIMER4_OFF, TIMER3_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF, SPI_OFF, USART3_OFF, USART2_OFF, USART1_OFF, USART0_OFF, TWI_OFF);

Para ativar o modo inativo no Arduino baseado em ATmega256RFR2, adicione a seguinte instrução à função loop .
LowPower.idle(SLEEP_8S, ADC_OFF, TIMER5_OFF, TIMER4_OFF, TIMER3_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF, SPI_OFF, USART1_OFF, USART0_OFF, TWI_OFF);

O comparador analógico pode ser desligado ou mantido ligado usando ADC_OFF ou ADC_ON como argumento, respectivamente. O temporizador 0 pode ser desligado ou mantido ligado usando TIMER0_OFF ou TIMER0_ON como argumento, respectivamente.

Da mesma forma, Timer 1, Timer 2, Timer 3, Timer 4 e Timer 5 são desligados/ligados usando TIMER1_OFF/TIMER1_ON, TIMER2_OFF/TIMER2_ON, TIMER3_OFF/TIMER3_ON, TIMER4_OFF/TIMER4_ON e TIMER5_OFF/TIMER5_ON como argumento, respectivamente. USART 0, USART 1, USART 2 e USART 3 podem ser desligados ou mantidos ligados usando USART0_OFF/USART0_ON, USART1_OFF/USART1_ON, USART2_OFF/USART2_ON e USART3_OFF/USART3_ON como argumento respectivamente.

O TWI pode ser desligado ou mantido ligado usando TWI_OFF ou TWI_ON como argumento, respectivamente. O SPI pode ser desligado ou mantido ligado usando SPI_OFF ou SPI_ON como argumento, respectivamente. A porta USB pode ser desligada ou mantida ligada usando USB_OFF ou USB_ON como argumento.

O Arduino baseado em ATmega328P, como Nano, Pro Mini e UNO, possui um detector de brown-out (BOD) para monitorar a tensão da fonte de alimentação durante os modos de suspensão. O BOD pode ser desligado ou mantido ligado usando BOD_OFF ou BOD_ON como argumento, respectivamente. A duração máxima predefinida para o modo de espera inativa é de 8 segundos. A duração pode ser aumentada chamando LowPower.idle dentro de um loop. Por exemplo, a instrução a seguir coloca o Arduino em suspensão ociosa de 40 segundos.
para(int i = 0; i<= 4; i++)
{
LowPower.idle(SLEEP_8S, ADC_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF,SPI_OFF, USART0_OFF, TWI_OFF);

}

Usar o loop for para aumentar a duração do sono é bastante útil. Por exemplo, o Arduino pode ser colocado em suspensão por vários minutos e depois acordado por alguns segundos para fazer leituras de sensores ou realizar outras tarefas de aplicativo.

Modo de redução de ruído Arduino ADC
O modo de suspensão de redução de ruído ADC é ativado configurando '001' para os bits de seleção do modo de suspensão (SMCR.SM(2:0)). Neste modo, o sinal de clock para CPU, flash e entrada/saída são interrompidos enquanto o sinal de clock para outros periféricos permanece ativo. O comparador analógico, temporizador/contador, temporizador watchdog, TWI e interrupções externas permanecem ativos no modo de redução de ruído ADC.

O Arduino pode ser ativado usando um reset externo, uma interrupção de nível externo no INT, interrupção de mudança de pino, interrupção de temporizador, interrupção pronta para SPM/EEPROM, reset de brown-out, interrupção de watchdog, reset de sistema de watchdog ou correspondência de endereço TWI.

Novamente, LowPower.h pode ser usado para ativar o modo de redução de ruído ADC. Adicione a seguinte linha para ativar este modo de suspensão na função loop .
LowPower.adcNoiseReduction(SLEEP_8S, ADC_OFF, TIMER2_OFF)

Observe que LowPower.h permite desligar explicitamente o comparador analógico e o temporizador dois para o modo de redução de ruído ADC. O modo de suspensão pode ser ativado por 15ms, 30ms, 60ms, 120ms, 250ms, 500ms, 1 segundo, 2 segundos, 4 segundos, 8 segundos ou para sempre.

Modo de desligamento do Arduino
O modo de desligamento pode ser ativado escrevendo '010' nos bits de seleção do modo de suspensão (SMCR.SM(2:0)). Todos os relógios gerados são parados neste modo enquanto os módulos assíncronos permanecem ativos. Portanto, apenas interrupções externas, correspondência de endereço TWI e temporizador de watchdog permanecem operacionais.

O Arduino pode despertar do modo de desligamento usando reinicialização externa, interrupção externa no pino INT, interrupção de mudança de pino, interrupção de watchdog, reinicialização do sistema de watchdog, correspondência de endereço TWI ou reinicialização de Brow-out.

Novamente, LowPower.h pode ser usado para ativar o modo de desligamento. Adicione a seguinte instrução para ativar este modo de suspensão na função loop .
LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);

Observe que o BOD e o comparador analógico podem ser explicitamente desligados ou mantidos ligados no modo desligado. O modo de suspensão pode ser ativado por 15ms, 30ms, 60ms, 120ms, 250ms, 500ms, 1 segundo, 2 segundos, 4 segundos, 8 segundos ou para sempre.

A seguir está um exemplo válido de como ativar o Arduino do modo desligado usando uma interrupção externa.
#incluir “LowPower.h”
const int wakeUpPin = 2;
void wakeUp {#interrupt_handler}
void setup { pinMode(wakeUpPin, INPUT);}
loop vazio
{
anexarInterrupt(0, wakeUp, LOW);
LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
desanexarInterrupt(0);
}

A seguir está um exemplo válido de como ativar o Arduino periodicamente do modo desligado.
#incluir “LowPower.h”
configuração nula {}
loop vazio
{
LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
}

Modo de economia de energia do Arduino
O modo de economia de energia é ativado escrevendo '011' nos bits de seleção do modo de suspensão (SMCR.SM(2:0)). Este modo é igual ao modo de desligamento, exceto que o Timer 2 está ativado. Portanto, eventos de estouro de temporizador e comparação de saída podem ser usados ​​para ativar o Arduino.

Novamente, LowPower.h pode ser usado para ativar o modo de economia de energia. Adicione a seguinte instrução para ativar este modo de suspensão na função loop .
LowPower.powerSave(SLEEP_8S, ADC_OFF, BOD_OFF, TIMER2_OFF)

Observe que LowPower.h permite ligar / desligar explicitamente o comparador analógico, o detector de brown-out e o temporizador 2. O modo de suspensão pode ser ativado por 15ms, 30ms, 60ms, 120ms, 250ms, 500ms, 1 segundo, 2 segundos, 4 segundos , 8 segundos ou para sempre.

Modo de espera do Arduino
O modo standby é ativado escrevendo '110' nos bits de seleção do modo Sleep (SMCR.SM(2:0)). Este modo é igual ao modo de desligamento, exceto que o oscilador externo continua funcionando neste modo.

Novamente, LowPower.h pode ser usado para ativar o modo de espera. Adicione a seguinte instrução para ativar este modo de suspensão na função loop .
LowPower.powerStandby(SLEEP_8S, ADC_OFF, BOD_OFF)

Observe que LowPower.h permite desligar o comparador analógico e o detector de queda de energia explicitamente para este modo. O modo de suspensão pode ser ativado por 15ms, 30ms, 60ms, 120ms, 250ms, 500ms, 1 segundo, 2 segundos, 4 segundos, 8 segundos ou para sempre. Observe que LowPower.h oferece apenas modos de suspensão inativos e de espera para placas Arduino baseadas em SAMD21G18A.

Modo de espera estendido do Arduino
O modo de espera estendido é ativado escrevendo '111' nos bits de seleção do modo de suspensão (SMCR.SM(2:0)). Este modo é igual ao modo de economia de energia, exceto que o oscilador externo continua funcionando neste modo.

Novamente, LowPower.h pode ser usado para ativar o modo de espera estendido. Adicione a seguinte instrução para ativar este modo de suspensão na função loop .
LowPower.powerExtStandby(SLEEP_8S, ADC_OFF, BOD_OFF, TIMER2_OFF)

Observe que LowPower.h permite desligar o comparador analógico, o detector de queda de energia e o temporizador 2 explicitamente para este modo. O modo de suspensão pode ser ativado por 15ms, 30ms, 60ms, 120ms, 250ms, 500ms, 1 segundo, 2 segundos, 4 segundos, 8 segundos ou para sempre. O modo de espera estendido leva cinco ciclos de relógio para ativar.

Reduzindo a velocidade do clock
Se o tempo não for importante em um aplicativo incorporado ou se o aplicativo não exigir a execução de muitas instruções, a velocidade do clock poderá ser reduzida para economizar bateria. Ele pode triplicar a vida útil da bateria reduzindo a velocidade do clock pela metade. A velocidade do clock determina o número de instruções que o Arduino pode executar por segundo. Se a frequência do clock for 16 MHz, o Arduino pode executar 16 milhões de instruções por segundo. A tabela a seguir lista a frequência de clock padrão para diferentes placas Arduino.

Observe que reduzir a frequência do clock também aumenta o tempo de execução do esboço do Arduino. Por exemplo, se um esboço do Arduino leva cinco segundos para ser executado com uma frequência de 16 MHz, levará dez segundos para ser executado com uma frequência de clock de 8 MHz. Isso pode reduzir o tempo real de suspensão do Arduino. A redução da frequência do clock também afeta a operação de periféricos síncronos como ADC, flash e entrada/saída.

Para reduzir a velocidade do clock, um Prescaler de clock do sistema é usado. O clock Prescaler é controlado pelo Clock Prescale Register (CLKPR) do Arduino. O registrador possui o seguinte diagrama de bits.

Primeiro, o pré-escalador de clock deve ser ativado configurando o bit CLKPCE como 1. Em seguida, o divisor de clock pode ser selecionado configurando os bits CLKPS3, CLKPS2, CLKPS1 e CLKPS0 de acordo com a tabela a seguir.

Para reduzir a velocidade do clock pela metade, adicione as seguintes linhas na função setup .
CLKPR = 0x80; //Ativa a pré-escala do relógio
CLKPR = 0x01; //Utiliza o fator de divisão do clock 2

O consumo de energia pode ser reduzido reduzindo a velocidade do clock de 20% para 60%. Cada placa Arduino tem uma resposta diferente para reduzir a frequência do clock.

Reduzindo a tensão de operação
Ao diminuir a tensão de alimentação, o consumo de energia pode ser reduzido em mais da metade. No entanto, a redução da tensão de alimentação deve acompanhar a redução da velocidade do clock, pois o Arduino pode se comportar de maneira estranha se for sincronizado na frequência padrão enquanto a tensão operacional é reduzida. As placas Arduino também podem ter uma certa frequência máxima de clock para tensões mais baixas. Por exemplo, se o Arduino baseado em ATmega328P for operado em 3,3V, ou seja, sua tensão operacional mínima, a velocidade máxima do clock deverá ser de 13 MHz em contraste com o padrão de 16 MHz. A tensão de operação e a velocidade do clock estão relacionadas de acordo com o gráfico a seguir no ATmega328.

A tensão de operação e a velocidade do clock estão relacionadas de acordo com o gráfico a seguir no ATmega2560.

A tabela a seguir lista a tensão de alimentação mínima possível com velocidades de clock reduzidas para diferentes placas Arduino.

A redução da tensão de operação pode economizar o consumo de energia em 15 a 20 por cento. A redução da tensão de operação também prolonga o tempo em que a bateria atinge a tensão mínima de alimentação do Arduino. Dessa forma, a substituição da bateria pode ser necessária por um período mais longo do que o Arduino operando na tensão típica de operação.

Otimizando o esboço do Arduino
Para reduzir ainda mais o consumo de energia do Arduino, os periféricos integrados podem ser explicitamente desligados no esboço. Os periféricos integrados, como temporizador/contador, temporizador de vigilância, detector de queda de energia e comparador analógico, continuam consumindo energia, independentemente de serem utilizados ou não pelo programa Arduino. Ao implementar modos de suspensão usando a biblioteca LowPower.h, os periféricos integrados apropriados podem ser explicitamente desligados passando seus respectivos argumentos. Se for necessário um periférico integrado como ADC ou temporizador/contador, ele pode ser ativado escrevendo seus registros correspondentes e, em seguida, desativado novamente. Este é um bom truque para otimizar o consumo de energia com a ajuda do software Arduino.

Removendo componentes não utilizados
Em uma placa Arduino, não apenas no SoC, outros componentes da PCB também consomem corrente que contribui para o consumo líquido de energia da bateria. Somente a ponte USB nas placas Arduino consome cerca de 10mA. Depois de carregar o esboço final do Arduino, a ponte USB pode ser removida do PCB do Arduino para reduzir algum consumo de energia. No entanto, isso só pode ser feito se a placa Arduino não precisar ser reprogramada em nenhum momento.

Da mesma forma, o regulador de tensão integrado também desperdiça muita energia da bateria, pois a energia é drenada devido à diferença entre a tensão consumida pelo ATmega328 e a tensão real fornecida pela bateria. O regulador de tensão integrado pode ser removido e o Arduino pode ser alimentado por um SMPS. O regulador linear integrado tem uma eficiência energética de cerca de 70%, o que é muito menor do que a eficiência típica de 90% do SMPS. Adicionar SMPS adicionará algum custo adicional ao dispositivo incorporado.

Conclusão
O design de baixo consumo de energia é uma preocupação significativa em dispositivos embarcados alimentados por bateria. O Arduino pode ser otimizado para aplicações de baixo consumo de energia escolhendo um Arduino de baixo consumo de energia, usando modos de economia de energia, reduzindo a velocidade do clock, diminuindo a tensão de operação, desativando periféricos usados ​​no esboço do Arduino e removendo componentes extras do PCB do Arduino.

contenido relacionado

Regresar al blog

Deja un comentario

Ten en cuenta que los comentarios deben aprobarse antes de que se publiquen.