Dispenser com Arduino usando bomba peristáltica

Podemos fazer um dispenser de chopp, dispenser de álcool 70 ou dispenser de álcool gel; dispenser para azeite e vinagre em copinho de café, para ser levado à mesa para temperar a salada mais à vontade, em self-service. Será que conseguimos fazer um dispenser para, por exemplo, gotejar um remédio como Metamizol (Dipirona)? Seja como for, veremos nesse artigo como montar um dispenser com Arduino que possa de alguma forma virar um produto, e vamos calcular as frações mínimas que conseguimos dispensar (os valores máximos já estão descritos no artigo de apresentação da bomba peristáltica).

Antes de começar, gostaria de anunciar o nosso revisor de artigos, Ricardo Amaral de Andrade, que além de acompanhar todos os artigos e comentar alguns deles, sempre apontou typos, ausência de alguma informação e até erros ortográficos. Como escrevo enquanto penso e quase nunca reviso, acaba passando algumas falhas – não mais (ou, “bem menos” agora).

Periféricos da bomba peristáltica

Precisamos controlar o motor DC, que opera idealmente entre 12V e 24V. No caso, separei todo o hardware que achei adequado para o projeto.

A bomba peristáltica para dosagem você encontra na Robocore, por um ótimo preço e o melhor; produto nacional, criado por eles!

Recomendo a fonte colméia, da Magir Fast Shop. Essa é 12V@15A, compacta e com bastante corrente.

Podemos ligar o motor da bomba peristáltica de diversas maneiras, interrompendo-a com solenoide, por exemplo. Também poderia ser através de transistor, mas para fazer um controle mais preciso, podemos utilizar uma ponte H que comporte a tensão necessária para o motor. No caso, recomendo a ponte H L298N da CurtoCircuito.

Podemos usar um sensor de nível para saber quando o conteúdo do recipiente está próximo do fim. Basta colocar o sensor de nível bem próximo da base. No caso, estou usando esse sensor de nível da Saravati.

Bomba peristáltica para fazer dispenser com Arduino

Sobre a bomba peristáltica, escrevi uma apresentação nesse artigo. Agora vamos escrever código de controle para ela, disposto mais adiante.

Fonte de alimentação

A fonte de alimentação escolhida garantirá tanto a bomba quanto a MCU. No caso, para usar a alimentação advinda da fonte para a MCU, utilizei esse micro regulador da MASUGUX. Mas dá pra fazer sem, como explicado em seguida. Já esclareço que utilizei esse método para alimentar a MCU porque já tinha a placa de protótipo montada.

Ponte H L298N

A ponte H que achei mais adequada (relação custo/benefício) foi a L298N nesse módulo. Não tem segredo, mas deve-se dar atenção aos detalhes:

ponte H l298n - Dispenser com Arduino

Os pinos de controle (agrupados no número 5) são os sinais para o acionamento do motor esquerdo e/ou direito Como o motor está conectado em MOTOR 1, deve-se utilizar os jumpers no primeiro e segundo pino. O jumper 4 e 6 fecham o circuito para ativar os motores da esquerda e da direita, respectivamente. Mais uma vez: como o motor está conectado em MOTOR 1, apenas o jumper (na imagem acima) identificado como 4 é necessário, mas não há problema algum em manter o jumper identificado como 6.

O jumper 7 fecha o circuito para a saída 5V, que poderá ser usada por outro periférico. Sendo o GND comum, temos o borne com os conectores 1, 2 e 3 sendo Vin, GND e 5Vout, respectivamente. Presumo que já esteja claro, mas se deixei sobrar essa dúvida: do lado esquerdo teremos um motor ligado aos dois pontos do borne, enquanto à direita temos um borne para um segundo motor. A direção do motor dependerá de fato da ordem em que os fios forem conectados, sendo que a inversão dos fios o fará girar em direção oposta ao citado na tabela CONTROLE da imagem acima. A mesma coisa para os jumpers de controle; se invertidos, o motor girará em direção oposta. A solução para evitar qualquer problema é simples; faça a ligação e, empiricamente, determine o controle.

Podemos usar PWM nos pinos de controle,  caso desejado, assim como exemplificado nos artigos com L293D para DC e também para motor de passo. Se por alguma razão resolver usar PWM, determine também o limítrofe de sinal para que o motor comece a girar. Garanta que esse limítrofe é estável, testando principalmente com o fluido que passará pela mangueira, pois deve-se considerar a viscosidade.

Montagem

A montagem é simples, sem dúvidas. O código rodará em Arduino, mas optei por usar um ESP32 para posteriormente incrementar o projeto. Utilizei os pinos de GPIO 21 e 22, assim como “puxei” um GND para a ponte H, de modo a ter um GND comum.

A ligação na fonte dispensa explicações. Tem V+V- para VDCpara VAC. Se não errar nisso, nada deve explodir.

Calibragem do dispenser com Arduino

Como já citado, diversas são as aplicações possíveis. Se a intenção for utilizá-lo como dispenser de álcool (líquido ou gel), dimensione para 2ml por ejeção, conforme as recomendações do Hospital Sírio Libanês, que pode ser visto nesse link.

O tempo de execução da bomba peristáltica é o fator principal em qualquer caso. O tempo de bombeamento varia conforme a viscosidade do material, e para cada aplicação será necessário repetir o processo de “calibragem”.

Se mantiver a mangueira vazia, deverá incluir o tempo da carga até a saída junto à sua medição. Se for possível mantê-la carregada, a medição poderá ser feita diretamente.

Outro projeto interessante seria um misturador de cores, mas precisarei de mais quatro bombas peristálticas e um módulo relé. Módulos relé tenho vários, vamos ver se faço esse misturador para um próximo artigo!

Nesse último momento decidi fazer tudo pela serial para o artigo, já que teria que calibrar. Agora vamos à calibragem.

Peguei uns utensílios de cozinha da minha esposa, cujos itens contêm as unidades de medida em ml. Usei uma de 120ml como base e comecei com 20 segundos, então fui esvaziando o recipiente e repetindo o processo acrescendo tempo ao intervalo de ação da bomba. Em dado momento cheguei a 88 segundos para 120ml. Depois repeti o processo para ver se não haveria variação, mas foi bastante preciso. Para isso, usei esse código de teste:

#include <Arduino.h>

String sec = "0";

void setup() {
  // put your setup code here, to run once:
  pinMode(22,OUTPUT);
  pinMode(21,OUTPUT);
  digitalWrite(21,LOW);
  digitalWrite(22,LOW);

  Serial.begin(9600);
}

void loop() {
  while (Serial.available()){
    sec = Serial.readString();
  }

  if (sec.toInt() != 0 ){
    Serial.println(sec.toInt());
    digitalWrite(21,HIGH);
    Serial.print("sleeping: ");
    Serial.println(sec.toInt());
    sleep(sec.toInt());
    digitalWrite(21,LOW);
  }
  sec = "0";
}

Tendo os valores em mãos, já é possível calcular ml/s:

ml/s = 120/88 = 1,364

Com isso posso convencionar que para a estrutura improvisada que montei para teste consigo tirar 81,84ml/min. Bem próximo de 82 e, como não se trata de um gotejador de morfina, posso tranquilamente arredondar para 82ml/min. Lembre-se que podemos trabalhar com frações de segundo, caso seja possível considerar essa fração sem histerese, mas não vou testar por preguiça.

Agora que temos uma constante, podemos modificar o código para escolher quantos ml queremos. Primeiro, só teste:

#include <Arduino.h>

String sec = "0";
float one_ml = 1.364;

void setup() {
  // put your setup code here, to run once:
  pinMode(22,OUTPUT);
  pinMode(21,OUTPUT);
  digitalWrite(21,LOW);
  digitalWrite(22,LOW);

  Serial.begin(9600);
}

float toSleep(int ml){
    float secondsFor = ml/one_ml;
    return secondsFor;
}

void loop() {
  while (Serial.available()){
    sec = Serial.readString();
  }

  if (sec.toInt() != 0 ){
    Serial.println(sec.toInt());
    //digitalWrite(21,HIGH);
    Serial.print("sleeping: ");
    Serial.println(sec.toInt());
    //sleep(toSleep(sec.toInt()));
    //digitalWrite(21,LOW);
    Serial.println(toSleep(sec.toInt()));
    
  }
  sec = "0";
}

Depois digitei 120 na serial, daí o resultado foi:

Dispenser com Arduino - escolha por ml

Depois o código válido e funcional:

#include <Arduino.h>

String sec = "0";
float one_ml = 1.364;

void setup() {
  // put your setup code here, to run once:
  pinMode(22,OUTPUT);
  pinMode(21,OUTPUT);
  digitalWrite(21,LOW);
  digitalWrite(22,LOW);

  Serial.begin(9600);
}

float toSleep(int ml){
    float secondsFor = ml/one_ml;
    return secondsFor;
}

void loop() {
  while (Serial.available()){
    sec = Serial.readString();
  }

  if (sec.toInt() != 0 ){
    Serial.println(sec.toInt());
    digitalWrite(21,HIGH);
    Serial.print("sleeping: ");
    Serial.println(toSleep(sec.toInt()));
    sleep(toSleep(sec.toInt()));
    digitalWrite(21,LOW);
    Serial.println(toSleep(sec.toInt()));
    
  }
  sec = "0";
}

Foi com esse código anterior que tirei os 120ml. Troquei o recipiente de 120ml por um de 60ml para testar se haveria variação ao longo do tempo e o resultado foi impressionante:

Precisão do Dispenser com Arduino

Depois de ter um resultado satisfatório, posso determinar agora quantos ml cabem em um tubete (o da imagem de destaque). O volume do tubete é de 50ml (ele está fora do padrão 13cm x 2cm). Ah, que satisfação!

Onde comprar bomba peristáltica para Arduino (ou ESP etc)?

Essa bomba peristáltica que serve para fazer um ótimo dispenser com Arduino é produto exclusivo Robocore. O lote anterior “evaporou” no mesmo dia que escrevi a respeito e até esperei para soltar outro artigo relacionado para não haver frustração. Mas não perca tempo, pegue a sua e comece a diversão!

Vídeo do dispenser com Arduino

Já estou editando um vídeo do artigo do parafuso de Arquimedes, vou editar na sequência o vídeo da bomba peristáltica e em breve coloco em nosso canal DobitaobyteBrasil no Youtube. Se não é inscrito, inscreva-se e clique no sininho para receber notificações.

 

Revisão: Ricardo Amaral de Andrade

Djames Suhanko

Djames Suhanko é Perito Forense Digital. Já atuou com deployer em sistemas de missão critica em diversos países pelo mundão. Programador Shell, Python, C, C++ e Qt, tendo contato com embarcados ( ora profissionalmente, ora por lazer ) desde 2009.