terça-feira, 7 de julho de 2015

Como conectar um cooler (ou outro motor) e controlar sua velocidade com base na temperatura do Raspberry Pi

Raspberry Pi e cooler

Atualização: Conheça também nossa primeira placa de expansão para Raspberry Pi que faz exatamente o que é explicado nesse post além de incluir um sensor IR.

Já apresentei aqui no passado como ligar um motor ao Raspberry Pi utilizando a ponte H L298N. Há casos em que não há necessidade de uma ponte H e um simples transistor em conjunto de outros componentes pode ajudar em nosso projeto.

Os esquemas abaixo servem tanto para conexão de motores DC comuns como também coolers (chamados também de fan) sem escova (com entrada DC) desde que sigam a especificação do transistor e o limite de corrente que o Raspberry Pi é capaz de fornecer.

Veja esse outro post caso queira ligar um sensor de temperatura no Raspberry Pi.

Iremos utilizar 3 componentes básicos: transistor NPN, resistor e diodo. Uma fonte externa poderá ser necessária dependendo da tensão e consumo da carga.

Os componentes podem ser reutilizados de sucata, entretanto é bom verificar se estão em boas condições. Caso necessário você pode encontrar pacotes com vários modelos comuns de transistors, resistors ou diodos.

Apesar do Raspberry Pi da capa ser o 2 Modelo B, os testes foram feitos no antigo Modelo B rev 2.0, entretanto todos os modelos funcionam com o mesmo esquema.

Atenção: Jamais tente controlar diretamente um motor nos GPIOs (não estou falando do pino de 5V) do Raspberry Pi, pois o limite de corrente é baixo.


Como ligar um cooler ou motor dc ao Raspberry Pi


A conexão elétrica de um cooler sem escovas ou motor DC comum será feita e controlada utilizando um transistor NPN. Dessa forma será possível controlar tanto os estados ligado e desligado quanto a sua velocidade.

Utilizei o transistor NPN PN2222, entretanto é possível utilizar outros modelos NPN desde que se verifique em sua especificação (datasheet) a ordem de seus terminais e sua corrente máxima de operação. Caso tiver com dificuldades, informe o modelo nos comentários que tentarei ajudar.

O NPN PN2222 (invólucro TO-92) suporta uma corrente de até 600mA em seu coletor. Sua carga não poderá ultrapassar essa especificação.

O resistor de 1k Ohm que será ligado ao GPIO18 do Raspberry Pi fará o papel de limitador de corrente (3,3mA), deixando passar o mínimo necessário (mas com folga) para fazer o chaveamento do transistor.

Atualização: Utilize um resistor de 470 Ohm no caso do PN2222.

O diodo não precisa ser um valor específico desde que seja um diodo comum com tensão reversa bem acima da utilizada no circuito. Ele é colocado de forma contrária à condução do circuito. Seu objetivo é atuar como proteção quando há o efeito de tensão reversa causado em cargas indutivas quando a energia é cortada. O modelo que estou utilizando é o FR103 retirado de sucata.

O esquema de conexão abaixo utiliza como fonte de energia o próprio Raspberry Pi.

Além das limitações dos componentes utilizados é necessário ficar atento na limitação de corrente que o próprio Raspberry Pi pode fornecer. É bom lembrar que existe um polyfuse de 2A na entrada da placa, portanto de nada adiantará você colocar uma fonte de 10A pois não conseguirá consumir tudo isso e mesmo se pudesse haveria provavelmente a limitação nas trilhas. Portanto evite colocar cargas com picos maiores que 1.2A no pino de 5V. Sua fonte terá que fornecer energia suficiente. Caso esteja já no pico de consumo dos 1.2A nas USBs não recomendo ligar o motor/cooler diretamente no pino de 5V.

Caso seu motor/cooler use 5V (se for 12V até poderá funcionar, mas de forma reduzida), consuma energia dentro das especificações do Raspberry Pi (e sua fonte ligada nele), utilize o seguinte esquema:

esquema raspberry pi e controle de cooler
Esquema elétrico

esquema protoboard raspberry pi e cooler
Esquema na protoboard

Fique atento aos pinos e à polarização das conexões para não danificar nada. No caso do cooler de PC geralmente há os fios vermelho(positivo) e preto(negativo). O fio branco caso exista é referente ao sensor de RPM que não iremos utilizar.


Como ligar um cooler ou motor dc ao Raspberry Pi utilizando uma fonte externa


Para conexão de coolers ou motores com escovas de tensão maior do que os 5V que o Raspberry Pi pode suprir é necessário cuidado redobrado.

As conexões que permanecerão na placa serão somente as do GPIO18 e GND. Utilizando uma fonte externa, seu polo positivo será conectado no positivo (VCC) do motor e o negativo no GND do emissor.

Apesar da fonte utilizada no esquema abaixo ser de 12v, qualquer fonte DC  pode ser usada desde que não ultrapasse a tensão mínima e máxima suportada pelos componentes (incluindo aí o cooler/motor) do circuito. Verifique também se sua fonte externa supre a corrente necessária para seu cooler/motor dc.

esquema fonte externa raspberry pi e cooler
Esquema elétrico com fonte externa

esquema protoboard fonte externa raspberry pi e cooler
Esquema na protoboard com fonte externa


Como controlar manualmente a velocidade do cooler ou motor via PWM


Uma das formas mais básicas de controlar a velocidade via PWM é utilizando a ferramenta "gpio" da biblioteca wiringPi.

Faça o download da biblioteca utilizando o GIT com o seguinte comando no terminal:

$ git clone git://git.drogon.net/wiringPi

Caso não tenha o git instalado execute:  

$ sudo apt-get install git-core

Entre no diretório da wiringPi e execute:

$ sudo ./build

Esse comando irá compilar e instalar automaticamente a biblioteca e a ferramenta.

Anteriormente foi descrito a utilização do GPIO18 para o controle do cooler/motor porque é esse GPIO que fornece o sinal PWM(PWM0) por hardware que iremos ativar. É possível utilizar no GPIO12 do Raspberry Pi B+,A+,2B o mesmo canal PWM e outro canal do PWM(PWM1) no GPIO13 caso o áudio não for utilizado.

A utilização do comando é simples, primeiro colocamos o GPIO18 (referenciado na wiringPi como 1) em modo PWM.

$ gpio mode 1 pwm

Após isso basta fornecer o valor do PWM que vai de 0 (desligado) a 1023 (velocidade máxima):

$ gpio pwm 1 1023

Caso não funcione revise as conexões elétricas.


Como controlar o cooler com base na temperatura do Raspberry Pi


Finalmente a cereja do bolo, se você leu até aqui e esse era seu objetivo final ele será contemplado.

Apesar de geralmente o Raspberry Pi não precisar de refrigeração (o SoC tem temperatura máxima de 85° e a memória opera até 80 graus) há algumas situações em que sua utilização pode ser necessária, como em locais extremamente quentes ou pessoas que fazem um bom overclock com overvolt. Mesmo que não seja seu caso e mesmo assim use ou queira usar um cooler é possível diminuir o barulho que alguns fazem (algo que já vi alguns reclamarem) controlando sua velocidade de forma como os desktops, notebooks e outros aparelhos fazem a anos. E levando em conta a temperatura do chip.

Programei um daemon que fará todo trabalho sujo. Primeiramente ele irá ler a temperatura da CPU via sysfs em "/sys/class/thermal/thermal_zone0/temp". Posteriormente ele irá compensar a velocidade do cooler de acordo com os parâmetros que foram passados pelos argumentos.

Será necessário a instalação da biblioteca wiringPi. Caso ainda não tenha instalado volte ao tópico anterior.

Baixe o fan_pi utilizando o GIT:

$ git clone https://github.com/everpi/fan_pi.git

Entre no diretório, compile e instale:

$ cd fan_pi
$ make
$ sudo make install

A partir desse momento já será possível testar o aplicativo, será necessário ou utilizar sudo ou rodar como root. O programa tem dois parâmetros fundamentais e um opcional.

$ sudo fan_pi

  Fan Controller by blog.everpi.net

    Usage: [TEMP_MIN] [TEMP_RANGE] [option]
             -d    daemon


O primeiro argumento (TEMP_MIN) é a temperatura mínima que irá fazer com que seu cooler comece a girar. O segundo argumento (TEMP_RANGE) é o intervalo em graus a partir do primeiro argumento em que a velocidade do cooler irá variar.

Por exemplo, se escolho os parâmetros 30 e 10:

$ sudo fan_pi 30 10

Até os 29 graus o cooler permanecerá desligado, quando e se chegar os 30° ele ligará, caso volte aos 29 ele desligará novamente. Caso a temperatura continue a subir, a velocidade será cada vez maior até chegar em 40 graus onde estará na velocidade máxima.

Para executar o programa em modo daemon basta executar com o terceiro parâmetro "-d".

$ sudo fan_pi 30 10 -d

Veja o vídeo abaixo de demonstração (aumente o volume quando o cooler iniciar para ouvir a aceleração):



Caso seu cooler não inicie com a temperatura mínima declarada no primeiro parâmetro é possível alterar o valor padrão do PWM para inicialização na seguinte linha do código:

#define PWM_MIN 500

Você pode testar com facilidade usando a ferramenta "gpio" o valor em que seu cooler inicia.

Quem irá utilizar esse esquema de modo contínuo pode querer colocar o programa para iniciar com o sistema, para isso basta abrir o arquivo "/etc/rc.local" (no sistema Raspbian) e colocar "/usr/local/bin/fan_pi 30 10 -d" uma linha antes de "exit 0". Substituindo os parâmetros pelos desejados é claro.


Conclusão e observações finais


Foi possível verificar no vídeo de demonstração a estabilização da temperatura entre 34 e 35 graus onde a velocidade do cooler aumentava e diminuia de acordo o aumento de temperatura.

Existe a possibilidade de utilizar outros pinos para o que foi feito emulando por software o PWM utilizando uma API interna da wiringPi.

Caso queira controlar o cooler para refrigerar outro dispositivo com base em sua temperatura, você pode ligar um sensor de temperatura externo digital ou analógico utilizando um adc.

Qualquer dúvida poste nos comentários.

28 comentários:

  1. Muito bom! Principalmente pra quem costuma não ter pena de compilar direto no rpi. O meu só foi até 69 graus, mas sem overclock.

    ResponderExcluir
  2. Olá,

    Estou usando um sensor de temperatura DHT11.

    Gostaria de saber como faço para acionar o ventilador a partir de uma determinada temperatura. Tem como fazer isso?

    Obrigado!

    ResponderExcluir
    Respostas
    1. Olá cassio, tem como sim, só que seria necessário alterar o código para ler do DHT11.

      Excluir
  3. Cara, parabéns pela iniciativa, é muito difícil encontrar material sobre esses sistemas (em português) e quando enconta é pago. Até procurei alguns livros em pdf mas sem êxito. Comprei uma placa, porém é a orange pi que segue o mesmo raciocínio. Daí eu pergunto, tu tens algum material digital o qual possa me disponibilizar para estudo ?

    ResponderExcluir
    Respostas
    1. Olá Tairony, infelizmente material digital para download (se for o caso) eu não possuo.

      Excluir
    2. Mas quando à esse procedimento, posso realizar no orange? Já que eles são praticamente idênticos.

      Excluir
    3. Mas quando à esse procedimento, posso realizar no orange? Já que eles são praticamente idênticos.

      Excluir
    4. Olá Tairony, não posso garantir que irá funcionar adequadamente na orange e na realidade as placas estão longe de ser idênticas. Questões como corrente máxima dos pinos podem ser diferentes, não encontrei muita informação infelizmente a cerca disso e não tenho uma orange para testar. Além disso, o software é para Raspberry Pi e apesar de ler sobre ports da lib wiringpi para outras placas ao mesmo tempo ouvi falar de problemas em relação ao port.

      Excluir
  4. Cara, parabéns pela iniciativa, é muito difícil encontrar material sobre esses sistemas (em português) e quando enconta é pago. Até procurei alguns livros em pdf mas sem êxito. Comprei uma placa, porém é a orange pi que segue o mesmo raciocínio. Daí eu pergunto, tu tens algum material digital o qual possa me disponibilizar para estudo ?

    ResponderExcluir
  5. Opa beleza?
    Eu gostaria de uma ajuda, quero saber se há alguma maneira de emitir uma saida analógica do rapberry pi, ou ate mesmo um PWM, para controle de um inversor de frequencia.
    Obrigado, tem muito conteudo bom nesse site, parabéns

    ResponderExcluir
    Respostas
    1. PWM o Raspberry Pi já tem 2. Analógico só usando um DAC externo ou fazendo algum bom filtro pro PWM. Entretanto, pelo que vi o controle dos inversores (se estiver falando dos AC) usam 10v. Possível é, entretanto nunca mexi com inversores. Sei que já existem expansões com interfaces já pensadas nisso, um exemplo é a Monarco HAT, embora não seja muito barata.

      Excluir
  6. Amigo boa tarde. Estou utilizando o Raspberry Pi3 Model B, Login: root / Senha: Recalboxroot, como editor estou utilizando o Putty. Infelizmente estas linhas de comando não funcionaram... É necessário entrar como superusuário? Qual login e senha?

    ResponderExcluir
    Respostas
    1. Olá, todos nossos tutoriais são baseados no sistema oficial Raspbian. Pode ser que o recalbox não tenha o comando GIT. Quanto ao usuário, no Raspbian da pra fazer tudo com sudo, não sei se está ativo no recalbox, verifique isso. Qual comando está dando erro?

      Excluir
  7. Excelente tutorial! Fiz conforme está no procedimento e funcionou perfeitamente com o Retropie V4.2. Muito obrigado!!!!

    ResponderExcluir
  8. Cara, muito bacana esse projeto. Eu fiz o controle da ventoinha sem usar o diodo e o resistor. Estou usando só o transistor. Mas, após ler o seu artigo, vou alterar as minhas ligações. A ventoinha que estou usando é de 5V, ligada na 5V da placa. Vê se você pode me ajudar. Eu to usando um Transistor S8050(suporta 700mA). Tenho disponivel dois resistores de 470ohm e de 330ohm. Usando o BC337, qual seria o resistor ideal? Tenho aqui um diodo FR104, posso usar ele também?

    ResponderExcluir
  9. Boa tarde.

    O procedimento funciona muito bem no retropie 4.2 porém quando se entra em algum emulador, o cooler fica em velocidade baixa, sendo necessário dar um novo boot novamente.
    Acredita ser possivel alterar este comportamento

    ResponderExcluir
  10. Comprei um carregador de celular para usar no meu Raspberry Pi 3, Ele é 5V com 4.1A, posso usar ele de boa ou se eu conectar na placa ela pode ´´torrar```??? por favor, quero essa info. urgente!

    ResponderExcluir
  11. Muito bom seu projeto, é possível utilizar transistor BC547? Estou aproveitando componentes de sucata. Obrigado!

    ResponderExcluir
  12. Este comentário foi removido pelo autor.

    ResponderExcluir
  13. Olá amigo, no meu caso não pretendo "controlar manualmente a velocidade", nesse caso é só montar o esquema e fazer as ligações conforme o diagrama ou também é preciso entrar com as linhas de comando?

    ResponderExcluir
  14. Olá, comprei esse cooler (https://produto.mercadolivre.com.br/MLB-1119981395-cooler-fan-raspberry-pi3-pi-3-b-e-b-dissipadores-calor-_JM) e na foto só mostra que é pra ligar direto no 5V, procede isso ou tem que ser dessa forma? A placa seria uma Rpi 3 B+

    ResponderExcluir
    Respostas
    1. Você pode ligar direto no 5v e gnd da Raspberry porém ele ficará ligado o tempo todo. O medito apresentado acima e para ele ser controlado quando será ligado (temperatura) e qual rotação e por quanto tempo

      Excluir
  15. ei tem como usar esse programa aí com a ponte h l298n?????????

    ResponderExcluir
  16. Este comentário foi removido pelo autor.

    ResponderExcluir
  17. Olá, Funciona com o orange pi 4 lts?

    ResponderExcluir