Alimentador do Dog com Motor de Passo Nema 17, ESP8266 e Drive L298

Olá pessoal,

Vou tentar transcrever neste meu primeiro tutorial como consegui fazer o alimentador para o Costela!


O primeiro alimentador que fiz foi em 2016 com um fuso feito com impressora 3D, um galão de água, arduino, um shield RTC e um display para definir os parametros. O tempo passou, conheci o Home Assistant e agora abriu um universo de possibilidades, os quais irei compartilhar um dos caminhos com vocês nesse tópico.

Para realizar o projeto usei:

  • Dispenser de cereal, encontra no shopee, aliexpress, mercado livre.
  • Um motor de passo bipolar de 4 fios modelo 17HS4401N
  • Um drive L298
  • Um ESP8266
  • Uma fonte 12v 2A (atenção pois se usar uma de menor corrente, o drive pode falhar)
  • Um conector femea para fonte de 12v (reaproveitei de uma caixa de controle IR de fitas de led)
  • 15cm de barra roscada
  • 3 porcas
  • 3 Arruelas
  • 2 Rolamentos 608 2RS
  • Duas polias
  • Uma correia

Não vou detalhar muito a parte mecânica porque isso vai muito do que você tem de recursos em casa.


A ligação está assim:

Quanto ao código utilizei o software Arduino para criar o código para o ESP8266. Sempre usei o Tasmota, mas como agora não achei nada na internet para usa-lo controlando o shield L298, tive que aprender outras formas de fazer.

Você vai precisar instalar o software Arduino no PC e adicionar a placa ESP8266 colocando em Arquivos > Preferências> Urls adicionais para gerenciadores de placas o caminho: http://arduino.esp8266.com/stable/package_esp8266com_index.json


Em seguida vá em Ferramentas > Placas > Gerenciador de placas, escreva ESP na busca e adicione esp8266 by ESP8266 Community
Agora em Ferramentas > Placas irá aparecer abaixo de Arduino a Opção ESP8266, dentro dela escolha NodeMCU 1.0
Configure como a imagem

Copie e cole o código abaixo no seu Arduino:

/* 
 * Este Sketch ensina a usar um motor de passo L298, um ESP 8266 e protocolo MQTT para controlar o motor
 * Baseado no da URL  http://osoyoo.com/2017/05/17/nodemcu-lesson-16-step-motor-mqtt/ by www.osoyoo.com e no projeto http://automation.moebius.site/2019/09/connecting-a-stepper-motor-to-hassio-home-assistant-using-a-nodemcu-via-mqtt/ by Matthew
 * Dicas: Quando estava criando, houve um momento onde o motor tentava rodar e não conseguia, o problema era a fonte, tinha somente 500mA, ao mudar para 2A funcionou perfeitamente.
 */

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <Stepper.h>
const char* ssid = "nome da sua rede wifi";//coloque aqui o nome da sua rede wifi
const char* password = "sua senha do wifi";//coloque a senha do seu wifi aqui
const char* mqtt_server = "192.168.1.1"; // ip do seu home assistant, não precisa apontar a porta 1883 do mqtt
const char* clientId = "DOG_FEEDER";
const char* userName = "usuario mqtt";
const char* passWord = "senha mqtt";

const int stepsPerRevolution = 200;  // calcule com base no motor que você usa, se o motor tem resolução de 1.8º então dividindo 360 por 1.8 você terá 200 passos de resolução
// initialize the stepper library on D1,D2,D5,D6
Stepper myStepper(stepsPerRevolution, D1, D2, D5, D6);
WiFiClient espClient;
PubSubClient client(espClient);

void setup_wifi() {
   delay(100);
  // We start by connecting to a WiFi network
    Serial.print("Connecting to ");
    Serial.println(ssid);
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) 
    {
      delay(500);
      Serial.print(".");
    }
  randomSeed(micros());
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void callback(char* topic, byte* payload, unsigned int length) 
{
  Serial.print("Command from MQTT broker is: [");
  Serial.print(topic);
  int p =(char)payload[0]-'0';
  int stepperLoop = 0;
  // step one revolution  in one direction:
  if(p==1)  // Se o 8266 receber o payload 1, executa essa parte
  {
    myStepper.step(stepsPerRevolution);
    Serial.print("  clockwise]" );
   }
  // step one revolution in the other direction:
  else if(p==2) // Se o 8266 receber o payload 2, executa essa parte
  {
    myStepper.step(-stepsPerRevolution);
    Serial.print("  counterclockwise]" );
  }
  else if(p==3) // Se o 8266 receber o payload 3, executa essa parte
  {
    Serial.print("  clockwise loop: " );
    for (stepperLoop = 0; stepperLoop < 20; stepperLoop++) {
      myStepper.step(+stepsPerRevolution);
      Serial.print(stepperLoop);
      Serial.print(" ");
      delay(50);
    }
    Serial.print("]");
  }
  else if(p==4) // Se o 8266 receber o payload 4, executa essa parte
  {
    Serial.print("  counterclockwise loop: " );
    for (stepperLoop = 0; stepperLoop < 20; stepperLoop++) {
      myStepper.step(-stepsPerRevolution);
      Serial.print(stepperLoop);
      Serial.print(" ");
      delay(50);
    }
    Serial.print("]");
  }
  else if(p==0) // Se o 8266 receber o payload 0, executa essa parte
  {
    digitalWrite (D1,LOW);
    digitalWrite (D2,LOW);
    digitalWrite (D5,LOW);
    digitalWrite (D6,LOW); 
    Serial.print("  off]" );
  }
  Serial.println();
   
}
 
void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) 
  {
    Serial.print("Attempting MQTT connection...");

    // Attempt to connect
    if (client.connect(clientId,userName,passWord))
    {
      Serial.println("connected");
     //once connected to MQTT broker, subscribe command if any
      client.subscribe("dog_feeder"); // nome do tópico que irá receber o payload do script no home assistant
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Espera 6 segundos antes de tentar novamente
      delay(6000);
    }
  }
} //end reconnect()

void setup() {
  Serial.begin(115200);
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
  // define a velocidade:
  myStepper.setSpeed(80);
}

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();

}

E personalize o código colocando nos locais que comentei no código, as informações como SSID da rede, senha, IP do Home Assistant, usuário e senha do MQTT.

Faça o download do código para seu ESP

Na parte do Home Assistant
Vá em configurações > Scripts e crie os scripts a seguir:
Esse script irá publicar para o broker no tópico dog_feeder o payload 0

Payload 1

Payload 2

Payload 3

Payload 4

Todos scripts ficarão assim:

Agora crie o botão no seu dashboard:


Entidade começe a digitar script e irá aparecer os scripts que foram criados

Salve e alimente o cão!

Bons projetos para vocês!

6 curtidas

Que projeto Fod…maneiro!!! Hahahaha!
Estava procurando um exatamente assim para quando o cachorro fizer xixi no lugar correto, ganhar um petisco. Achei a solução perfeita!
Obrigado!!!

1 curtida

100% maravilhoso!!! Que bom ter uma cara como vc no meio da gente!! Gente, que projeto massa!!! Parabéns, mano! Parabéns mesmo!!!

1 curtida

Obrigado irmão, compartilhar o pouco que sei é o mínimo que posso fazer pelo tanto de informação que já consumi da comunidade.
Se precisar de ajuda é só falar! Já fiz muitas mudanças nesse projeto com objetivo de dar robustez e simplicidade, não uso mais o motor de passo, coloquei um motor DC 12v e uma fonte de 4A que comprei na shopee, passei acionar com um relé o motor por 2 segundos para servir 200g.
Para saber se devo colocar ração, as 8:00 e 20:00 eu tiro uma foto da vasilha com uma espcam e envio no telegram a pergunta se é para servir a ração.
Para saber o nível do reservatório coloquei um sensor de ultrassom, quando chega em 30% me avisa para fazer cotações nas casas de ração.
A lógica e integração fica por conta do esphome e no nodered.

2 curtidas

Saberia dizer qual modelo desse motor de 12V e 4 A que vc comprou na shopee?
Ou poderia dizer as especificações técnicas?
Obrigado pela grande ajuda. :sun_with_face:

O item é esse aqui
Alimentador Tratador Automático Profissional parte Mecânica para animais cavalos, gado, cães, ovelha | Shopee Brasil

1 curtida