O Projeto Contador de Fio Eletrônico com Arduino tem como objetivo desenvolver um sistema automatizado capaz de medir a quantidade de fita, fio ou outros materiais que um motor é capaz de enrolar, substituindo a contagem manual desses materiais. A solução criada utilizará um Teclado Matricial para que o usuário possa definir a quantidade de material que deseja que o motor enrole, um Display para apresentação dos dados, uma Relé para acionamento do motor e um Sensor de Contagem – Chave Óptica para Encoder 5mm e um Encoder para controle do motor.
Através do uso desses componentes, o sistema será capaz de detectar o movimento do motor e calcular a quantidade de produto processado de forma precisa e confiável, simplificando e otimizando processos que anteriormente dependiam da contagem manual desses materiais. Além disso, o projeto faz uso de habilidades cada vez mais valorizadas, como o pensamento computacional.
Com essa solução automatizada, espera-se proporcionar uma alternativa mais eficiente e precisa para a medição de materiais enrolados pelo motor, podendo ser aplicada em diversos processos industriais.
Pensamento Computacional
O pensamento computacional é um conjunto de habilidades cognitivas que permite a resolução de problemas complexos de forma sistemática e estruturada, inspirada na forma como os computadores processam informações. Algumas das habilidades que o pensamento computacional engloba incluem a capacidade de decompor problemas, identificar padrões, criar algoritmos, testar hipóteses, abstrair informações e analisar dados.
O projeto Contador Métrico foi desenvolvido pensando da seguinte forma:
- Cada volta do disco do encoder representa uma determinada quantidade de material movida pelo motor a cada volta do encoder; pode ser representada por uma variável “X” em centímetro. Esse valor é armazenado na variável “Cm_por_voltas”.
- A variável “Quantidade_Desejada”, também em centímetros, representa a quantidade de material que o usuário deseja que o motor enrole/puxe.
- A variável “Voltas_Totais” é a variável que armazena a quantidade de voltas que um motor terá que dar para atingir a quantidade de material desejada pelo usuário.
Pensando desta forma é possível calcular a quantidade de voltas necessárias para atingir a quantidade desejada do material, utilizando uma fórmula.
Essa quantidade pode ser calculada utilizando a seguinte fórmula: Voltas_Totais = Quantidade_Desejada / Cm_por_voltas
Dessa forma, será possível contabilizar de forma precisa e eficiente a quantidade de material enrolada ou puxada pelo motor.
Alimentação do Contador de Fio Eletrônico com Arduino
Quando desenvolvemos um projeto do zero, a alimentação é um aspecto crítico a ser considerado. Temos diversas opções de fontes de energia, como pilhas, baterias ou alimentação elétrica direta de uma tomada, que podem ser usadas dependendo das necessidades específicas do projeto.
Dentre os materiais utilizados no projeto, devemos alimentar o Arduino (com 6 a 9V) que será responsável por alimentar todos os outros componentes do projeto e o motor com a tensão na qual o motor trabalha
ATENÇÃO!
Não é recomendado alimentar um motor diretamente através do VCC do Arduino, pois a capacidade de corrente do VCC é limitada, a tensão fornecida pode ser inadequada e o ruído elétrico do motor pode interferir no funcionamento do microcontrolador. Para evitar problemas, é necessário utilizar uma fonte de alimentação separada e um driver de motor adequado para proteger o microcontrolador e controlar o motor com precisão.
Funcionalidade dos Botões
Inserir Valores:
Para inserir valores, utilize o teclado numérico para digitar os caracteres desejados.
Obs1: O sistema não iniciará se o valor inserido pelo usuário for 0 ou nulo.
Obs2: Insira no máximo 5 caracteres ou o valor 100000 (100 metros ou 100.000 Centímetros).
Limpar:
Para limpar os valores inseridos, faça o seguinte:
- Se o sistema não estiver realizando a medição de algo, pressione uma vez o botão “limpar” ( * ) no teclado numérico para limpar os valores inseridos pelo usuário.
- Se o sistema estiver realizando a medição de algo, pause o sistema pressionando uma vez o botão “pausar”, e em seguida pressione uma vez o botão “limpar” ( * ) no teclado numérico para limpar os valores inseridos pelo usuário.
Iniciar:
Após a inserção do valor pelo usuário, para iniciar o sistema basta pressionar o botão “iniciar”. Caso o sistema seja pausado de alguma maneira, basta apertar o botão “iniciar” novamente para retomar a contagem.
Pausar:
Para pausar o sistema, basta apertar o botão “pausar” uma vez.
Resetar:
Para resetar as variáveis, faça o seguinte:
- Se o sistema não estiver realizando a medição de algo, pressione uma vez o botão “resetar” ( # ) no teclado numérico para resetar as variáveis.
- Se o sistema estiver realizando a medição de algo, pause o sistema pressionando uma vez o botão “pausar”, e em seguida pressione uma vez o botão “resetar” ( # ) no teclado numérico para resetar as variáveis.
☆ Se você pressionou o botão “resetar” por engano enquanto o sistema estava realizando a medição, basta pressionar o botão “iniciar” para despausar o sistema e continuar de onde parou.
Produtos Utilizados no Projeto Contador de Fio Eletrônico com Arduino
Segue abaixo, lista de todos os produtos utilizados para o desenvolvimento do projeto:
- 1 x Arduino Uno;
- 1 x Teclado Matricial 3×4 de 12 teclas rígido;
- 1 x Display LCD 16×2 com comunicação I2C;
- 1 x Módulo Relé de 5V e 10A com 1 canal;
- 1 x Sensor de Contagem – Chave Óptica para Encoder de 5mm;
- 1 x Disco Encoder 5mm;
- 1 x Motor Dc;
- 2 x Push Button;
- 2 x Resistores de 1kΩ.
Esquema de Ligação do Contador de Fio Métrico
O esquema de ligação é um diagrama que representa como um circuito elétrico é conectado, mostrando a relação entre os diversos componentes do circuito. O esquema de ligação deste projeto é simples, mas vale frisar novamente que a alimentação do projeto deve receber uma atenção especial para que não haja problemas com o mesmo.
Neste esquema de ligação a alimentação do arduino não está mencionada, porém, o arduino deve ser alimentado com uma tensão de 6 a 9 volts.
Código de Funcionamento
Este é um código em C++ que utiliza as bibliotecas Keypad, Wire e LiquidCrystal_I2C para criar o sistema de controle desejado para o projeto. O código também inclui funcionalidades de monitoramento de status e de controle de relé para ligar e desligar o motor.
Bibliotecas usadas: Keypad.h / Wire.h / LiquidCrystal_I2C.h
Download Bibliotecas e Código de Programação.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 |
—--------------------------------------------------------------- #include <Keypad.h> // Biblioteca do Teclado #include <Wire.h> // Biblioteca LCD #include <LiquidCrystal_I2C.h> // Biblioteca LCD # define rele 13 // Relé conectada ao pino 13 do arduino LiquidCrystal_I2C lcd(0x27, 16, 2); // lcd(Endereço I2C, Colunas, Linhas) // Variáveis // Definindo pinos de linhas e colunas conectadas no arduino byte pinosLinhas[ ] = {4,5,6,7}; byte pinosColunas[ ] = {10,9,8}; // Matriz responsavel pela impressão no lcd char teclas[4][3] = {{'1','2','3'}, {'4','5','6'}, {'7','8','9'}, {'*','0','#'}}; Keypad teclado1 = Keypad( makeKeymap(teclas), pinosLinhas, pinosColunas, 4, 3); // Sensor de Contagem volatile int cont = 0; // Contagem de furos do disco encoder // Botão Liga const int botaoLiga = 11; // Botão conectado ao pino 11 do arduino int statusDoBotaoLiga = 0; // Botão Pausa const int botaoPausa = 12; // Botão conectado ao pino 12 do arduino int statusDoBotaoPausa = 0; // Variáveis gerais int valorPedido = 0; // Armazena o valor informado pelo usuário float centimetrosPorCont = 0.5; // Alterar para o valor em centímetros que seu motor faz por volta *********** int qtdEncoder = 0; // Armazena a quantidade de voltas que o motor terá que dar para satisfazer o pedido do usuário int valorAtual = 0; // Monitora a distância já percorrida static String valorConfigurado = ""; int contAux = 0; // Variáveis de controle para o Monitor serial int i = 0; int p = 0; void setup(){ pinMode(rele, OUTPUT); pinMode(3, INPUT); pinMode(botaoLiga, INPUT); pinMode(botaoPausa, INPUT); attachInterrupt(digitalPinToInterrupt(3), interrupcao, CHANGE); lcd.init(); // Inicializa o lcd lcd.backlight(); // Liga a Luz de Fundo lcd.print("Tamanho: Cm"); lcd.setCursor(0, 1); lcd.print("Medicao: Cm"); Serial.begin(9600); // Inicia a Serial Serial.println("Sistema iniciado"); Serial.println(); } void loop(){ statusDoBotaoLiga = digitalRead(botaoLiga); if(statusDoBotaoLiga == HIGH){ // Se o botão iniciar for apertado Serial.println("Botão iniciar pressionado"); if(valorPedido != 0){ cont = contAux; for(cont; cont <= qtdEncoder;){ statusDoBotaoPausa = digitalRead(botaoPausa); char tecla_pressionada = teclado1.getKey(); if(tecla_pressionada == '#'){ Serial.println("Botão resetar pressionado, para resetar pressione novamente"); Serial.println("Caso queira continuar aperte em iniciar"); Serial.println("- Relé desligada"); Serial.println(); return; } if(statusDoBotaoPausa == HIGH){ // Se o botão pausar for pressionado Serial.println("Botão pause pressionado"); Serial.println("- Relé desligada"); Serial.println(); return; } digitalWrite(rele, HIGH); // Liga relé valorAtual = cont * centimetrosPorCont; // Inicia/atualiza a variável de controle lcd.setCursor(9, 1); lcd.print(valorAtual); // Mostra no Lcd for(i; i < 1; i++){ // Imprime apenas uma vez na Serial Serial.println("Relé iniciada"); Serial.println(); } contAux = cont; } digitalWrite(rele, LOW); // Desliga relé lcd.clear(); lcd.print("Finalizado"); delay(2000); completo(); // Reinicia parcialmente o sistema, não reseta as variáveis de controle dos valores informados pelo usuário Serial.println("- Relé desligada"); Serial.println("Finalizado"); Serial.println(); Serial.println(); } } else{ digitalWrite(rele, LOW); // Caso o botão iniciar não seja apertado a relé permanece desligada } char tecla_pressionada = teclado1.getKey(); // Localiza a tecla pressionada e adiciona em uma variável if(tecla_pressionada){ if(tecla_pressionada != '*' && tecla_pressionada != '#'){ // Coleta os valores informados pelo Usuário if(valorConfigurado.length() < 5){ valorConfigurado += tecla_pressionada; } lcd.setCursor(9, 0); lcd.print(valorConfigurado); valorPedido = valorConfigurado.toInt(); qtdEncoder = valorPedido / centimetrosPorCont; // Inicia variáveis de controle } for(p; p < 1; p++){ // Imprime apenas uma vez na Serial Serial.println("O usuário indicou um valor"); } if(tecla_pressionada == '*'){ // Limpa o valor informado pelo Usuário Serial.println("Valor indicado pelo usuário resetado"); Serial.println(); p = 0; // reseta a variável responsável pelo controle de uma informação no serial monitor valorConfigurado = ""; valorPedido = 0; qtdEncoder = 0; lcd.setCursor(0, 0); lcd.print("Tamanho: Cm"); } if(tecla_pressionada == '#'){ Serial.println("Sistema resetado"); cont = qtdEncoder + 1; digitalWrite(rele, LOW); resetar(); completo(); } } } void interrupcao (){ // Função responsável pelo controle do motor usando o encoder e o Sensor de Contagem cont++; } void resetar(){ // Função responsável por resetar as variáveis de contrle do sistema valorConfigurado = ""; valorPedido = 0; qtdEncoder = 0; lcd.clear(); lcd.print("Resetado"); delay(1000); cont = 0; } void completo(){ // Função responsável por reiniciar parcialmente o sistema, não reseta as variáveis de controle dos valores informados pelo usuário i = 0; p = 0; cont = 0; contAux = 0; valorAtual = 0; delay(1000); lcd.clear(); lcd.print("Tamanho: Cm"); lcd.setCursor(0, 1); lcd.print("Medicao: Cm"); lcd.setCursor(9,0); lcd.print(valorConfigurado); } —----------------------------------------------------------------------- |
O código possui um ponto importante que merece destaque, por isso atente-se a dica abaixo:
Linha 35
“float centimetrosPorCont = 0.5; // Alterar para o valor em centímetros que seu motor faz por volta”
Neste trecho a variável em questão armazena a quantidade de material que é contabilizado por furo do disco encoder. O valor indicado no código é referente ao disco encoder de 5mm com 20 furos; altere este valor para a quantidade (em cm) que passa de material por furo do seu disco encoder. Atenção! Este valor pode variar dependendo do encoder utilizado.
O item destacado acima é de suma importância e caso não seja indicado um valor correto referente ao disco encoder pode resultar em medições incorretas.
Conclusão
O projeto Contador Métrico busca proporcionar uma solução eficiente e automatizada para a medição de materiais enrolados pelo motor, que pode ser aplicada em diversos processos. Para atingir esse objetivo, o projeto utiliza um conjunto de habilidades cognitivas que permitem a resolução de problemas complexos de forma sistemática e estruturada, conhecida como pensamento computacional.
Este projeto teve muita dedicação na sua criação, sendo desde a estruturação da ideia, criação do código do zero até os incontáveis testes até que chegasse ao nível atual.
Resultado do projeto
Com o passar do tempo, aprimoramos este projeto para uso interno, aonde conta com motor de passo possibilitando um controle mais preciso, display e botões para configuração da metragem e quantas vezes repetir, servo motor para controle do cortador de fios e algumas peças de impressora 3D, que guiava o filamento, agora guia nossos cabos.
Acompanhe nossos vídeos nas redes sociais @usinainfo.
Ver essa foto no Instagram
Você gostou deste projeto e/ou de como foi criado e estruturado? Este projeto me trouxe diversos aprendizados e esperamos que estes aprendizados sejam transmitidos a você por meio deste artigo.
Deixe seu comentário abaixo e compartilhe comigo as suas experiências. Até a Próxima!
Boa tarde! Onde eu consigo o projeto da estrutura?
Olá, Boa Tarde,
Vamos adicionar ao artigo o arquivo da estrutura para download.
Boa noite
Baixei a programação e ao passar para o Arduino esta dando erro na linha 79, alguma sugestão?
Onde consigo o projeto da estrutura?
Bom dia Leonardo!
Não temos este projeto disponível, ele passou por várias modificações e apenas temos para uso interno por enquanto.
Poderia colocar as medidas da estrutura e as modificações .
Bom dia Luiz!
Este projeto foi apenas documentado sua fase inicial, demonstrando a possibilidade da criação de um contador automático.
Hoje ele está bastante diferente e utilizamos internamente. Conta com motor de passo, display, servo para realizar o corte automático, conta também com algumas peças de impressora 3D para guiar o cabo, ao invés de um filamento.
Porém não é um projeto que estamos focados criar conteúdo, ficando apenas internamente.
Caso queira dar uma olhada na nossa versão atual temos um pequeno vídeo no instagram, que pode dar ideias para você criar o seu próprio modelo.
https://www.instagram.com/reel/C53lihBKUdg/