A Useless Box Arduino, também conhecida como Caixa Inútil devido á sua tradução para o português, é um projeto desenvolvido com o intuito de entreter as pessoas através de sua “personalidade” e suas reações parcialmente espontâneas à estímulos externos.
Normalmente a Useless Box Arduino está associada a projetos makers que tem como objetivo apresentar a eletrônica de uma maneira mais divertida, inspirando o gosto e a curiosidade de uma maneira diferenciada.
Bastante utilizada em instituições de ensino para conquistar adeptos da eletrônica, este projeto apresenta um grau de complexidade suficiente para ser utilizado também como instrumento de desenvolvimento técnico através de exercícios de programação, por exemplo.
A ideia de funcionamento é simples, ao instigar as pessoas à liga-la, a Useless Box recusa-se a ficar ligada e de maneira autônoma se desliga novamente, cada vez que é ativado o interruptor ela apresenta um padrão comportamental diferente, mas sempre desligando-se ao final.
Vídeo Prático Useless Box Arduino
Caixa MDF para a Useless Box Arduino
Quem já tentou desenvolver este projeto ou até mesmo já o tenha executado, sabe que a maior dificuldade está no desenvolvimento mecânico do mesmo, uma vez que a Useless Box necessita de conexões específicas e articulações definidas para cada uma das suas ações.
Tendo isto em vista, a Usinainfo desenvolveu uma carcaça em MDF capaz de executar o movimento de até três servos motores, visando um projeto completo e com um exclusivo diferencial, a caixa inútil desenvolvida pela empresa conta com um terceiro servo além do responsável por erguer a tampa e o responsável por desativar o interruptor.
Este terceiro motor possui a finalidade de proporcionar uma “pegadinha”, vinculado a uma bandeira o mesmo dá indícios de que a Useless Box se entregou, que desistiu de insistir em desliga-se, podendo ser utilizado como desfecho para suas ações ou como uma pegadinha, se desligando normalmente ao final de suas ações.
Outro diferencial desta versão da Useless Box é a preocupação que se teve com os detalhes que envolviam este projeto, além de terem desenvolvido um equipamento sem necessidade de porcas e parafusos, possibilitando sua montagem através de encaixes firmes e seguros, também se preocuparam com o design do mesmo.
Um sinal da preocupação que se teve com o design de suas peças está na pequena mãozinha desenvolvida para fixação no sistema de desligamento automático e que pode ser observada através da imagem abaixo:
Os fatores mencionados acima e todos os demais que envolvem o desenvolvimento da Useless Box Arduino mostram que temos em mãos um produto que nos possibilitará uma excelente experiência de uso, tendo a possibilidade de adquirir a caixa inútil através do site da Usinainfo, só nos basta desenvolver o esquema elétrico e o código, então vamos lá!
Produtos Utilizados na Useless Box Arduino
Abaixo seguem todos produtos utilizados no desenvolvimento do projeto, os quais pode ser adquiridos de forma avulsa conforma listagem. Se você quiser, pode adquirir a versão do Useless Box Arduino Completo, o qual já possui todas as peças necessárias para montagem.
– Case Useless Box Arduino – Caixa Inútil;
– Micro Servo 9g Tower Pro MG90S 180° com Engrenagens Metálicas;
– 2 Micro Servo Motor 9g SG90 180°;
– Protoboard 170 Pontos para Montagem de Projetos;
– Jumper Premium para Protoboard Macho-Macho 20 cm;
– Chave Alavanca MTS-102 3T 2 Posições;
– Jack P4 Plástico (2,1×5,5mm) para Paineis e Chassis;
– Fonte de Alimentação Chaveada 6VDC 2A;
– Parafusos e Espaçadores (Arduino UNO e Servos).
Optamos pela utilização de um servo motor metálico tendo em vista a maior força que o mesmo aplica para a função de desligar o interruptor, agregando maior qualidade ao projeto e evitando que eventualmente o projeto não consiga desenvolver tal função.
Esquema de Ligação da Caixa Inútil Arduino
Tentaremos replicar o mesmo esquema de ligação utilizado no desenvolvimento do projeto, com a protoboard e como distribuímos as ligações entre motores, Arduino e demais elementos. Segue esquema de ligação da Useless Box / Caixa Inútil:
Assim como o esquema de ligação, disponibilizamos também o esquema elétrico do referente projeto, verifique através da imagem abaixo:
Como pudemos ver, o esquema de ligação é bastante simples, o que se torna parcialmente complicado é o posicionamento dos produtos dentro da Useless Box Arduino uma vez que o espaço para distribuição é relativamente pequeno e a quantia de fios relativamente grande.
Para a conexão da fonte de alimentação, utilizamos um Jack P4, com furações já inclusas no corpo da Caixa Inútil e que possibilita a entrada dos 6V necessários para o funcionamento dos motores, uma vez que a corrente de funcionamento dos mesmos excede os limites da placa Arduino.
Código de Funcionamento da Useless Box Arduino
O código de funcionamento da Caixa Inútil é parcialmente extenso, porém possui cada uma das reações da sua “personalidade” programadas passo por passo. Um total de sete funções foram programadas para expressar as ações da mãozinha que age para desligar o interruptor quando o mesmo é ligado.
Iniciamos o código utilizando a biblioteca Servo.h, porém a mesmo não possibilitava um ajuste tão preciso do movimento e acabava trepidando bastante a tampa em relação ao dispositivo que à levantava. Tendo isto em vista, a biblioteca Servo.h foi substituída pela biblioteca VarSpeedServo.h, o que possibilitou um controle de velocidade e melhorou o funcionamento da Useless Box Arduino.
Biblioteca VarSpeedServo.h: DOWNLOAD AQUI.
Segue código completo de funcionamento da Caixa Inútil:
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 |
// Código de funcioanmento da Useless Box Arduino // Código com 7 reações diferentes de desligar #include <VarSpeedServo.h> // Inclui a biblioteca VarSpeedServo VarSpeedServo mao; // Declara a variável mao VarSpeedServo tampa; // Declara a variável tampa VarSpeedServo bandeira; // Declara a variável abndeira int alavanca = 8 ; // Determina o pino 8 como alavanca int reacao = 1; // Declara o valor da variável reacao int angulo = 0; // Declara o angulo padrão de ação void setup() { pinMode(alavanca, INPUT); // Define o pino da alavanca como entrada mao.attach(3); // Define o pino 3 (PWM) como mao tampa.attach(5); // Define o pino 5 (PWM) como tampa bandeira.attach(6); // Define o pino 6 (PWM) como bandeira mao.write(180); // Ângulo inicial da mao em 180 tampa.write(90); // Ângulo inicial da tampa em 90 bandeira.write(180); // Ângulo inicial da bandeira em 180 } void loop() { // Declara o número de reações da máquina e as nomeia if (digitalRead(alavanca) == LOW) { if (reacao > 7) { reacao = 1; } if (reacao == 1) { reacao1(); } else if (reacao == 2) { reacao2(); } else if (reacao == 3) { reacao3(); } else if (reacao == 4) { reacao4(); } else if (reacao == 5) { reacao5(); } else if (reacao == 6) { reacao6(); } else if (reacao == 7) { reacao7(); } reacao += 1; } } // Configura as ações da reação 1 void reacao1() { tampa.write(45, 50, true); delay(1000); mao.write(80); delay(500); mao.write(180); delay(1000); tampa.write(90, 50, true); delay(1000); } // Configura as ações da reação 2 void reacao2() { tampa.write(45, 30, true); delay(1000); mao.write(80); delay(250); mao.write(180); delay(100); tampa.write(90); } // Configura as ações da reação 3 void reacao3() { tampa.write(30, 60, true); mao.write(80); delay(250); mao.write(180); delay(100); tampa.write(90); } // Configura as ações da reação 4 void reacao4() { delay(250); tampa.write(20, 60, true); delay(100); mao.write(80); delay(2500); for (angulo = 80; angulo > 180; angulo -= 1) { mao.write(angulo); delay(50); } mao.write(180, 30, true); delay(500); tampa.write(90); } // Configura as ações da reação 5 void reacao5() { tampa.write(50, 60, true); delay(500); tampa.write(90, 80, true); delay(1000); tampa.write(50, 60, true); delay(500); tampa.write(90, 80, true); delay(1000); tampa.write(50, 60, true); delay(500); tampa.write(90, 80, true); delay(2500); tampa.write(30, 60, true); delay(100); mao.write(80); delay(250); mao.write(180); delay(100); tampa.write(90); } // Configura as ações da reação 6 void reacao6() { tampa.write(25, 60, true); delay(100); mao.write(110); delay(250); mao.write(180); delay(100); tampa.write(90, 80, true); delay(250); tampa.write(25, 60, true); delay(100); mao.write(110); delay(250); mao.write(180, 30, true); delay(100); tampa.write(90, 80, true); delay(250); tampa.write(25, 60, true); delay(100); mao.write(110, 30, true); delay(250); mao.write(180); delay(100); tampa.write(90, 80, true); delay(250); tampa.write(25, 60, true); delay(100); mao.write(80); delay(250); mao.write(180); delay(100); tampa.write(90); } // Configura as ações da reação 7 void reacao7() { tampa.write(20, 60, true); delay(500); bandeira.write(0, 30, true); bandeira.write(45, 30, true); bandeira.write(0, 30, true); bandeira.write(30, 30, true); bandeira.write(0, 30, true); bandeira.write(45, 30, true); bandeira.write(0, 30, true); bandeira.write(30, 30, true); bandeira.write(0, 30, true); bandeira.write(45, 30, true); bandeira.write(0, 30, true); delay(2000); bandeira.write(180); delay(2000); tampa.write(35, 30, true); mao.write(80); delay(250); mao.write(180); delay(500); tampa.write(90); } |
Dentre os elementos utilizados no código, um dos que mais pode causar dúvidas é o que segue:
1 |
bandeira.write(45, 30, true); |
O seu funcionamento é bastante simples, baseado na biblioteca VarSpeedServo.h esta função determina que o servo nomeado bandeira execute um movimento até o ângulo de 45º com uma velocidade de 30 e só execute a próxima função quando tiver chegado ao seu objetivo, ou seja:
1 |
servo.write(ângulo, velocidade, true); |
As principais funções do código estão todas explicadas com as respectivas observações e comentários necessários para sua compreensão, porém vale ressaltar um item bastante importante quanto ao código, o ato de copiá-lo e colá-lo não significa que irá funcionar em seu projeto sem nenhum tipo de adaptação / alteração, isto ocorre uma vez que os servos podem ser instalados de maneiras diferentes, o que iria alterar os ângulos de funcionamento do projeto.
Calibração dos Servos Motores da Useless Box Arduino
O principal fator de funcionamento do projeto está no trabalho executado pelos servos motores, afinal de contas, eles executam todo o trabalho que a Useless Box desenvolve. Tendo isto em vista, é necessária a calibração de posição dos mesmos de acordo com o intervalo de movimento possível para execução de todas as suas funções.
Para entendermos melhor, vamos utilizar o servo motor conectado a mão que desliga o interruptor como exemplo, veja abaixo o código utilizado para deslocamento do braço de sua posição final até sua posição inicial assim como uma imagem que ilustra este procedimento:
1 2 3 4 |
mao.write(80); delay(500); mao.write(180); delay(1000); |
Para realizar esta calibração, foi utilizado o código de funcionamento do servo motor disponível no Blog da Usinainfo, com ele é delimitado o ângulo de funcionamento do servo e através de um método de tentativa e erro vamos ajustando o ângulo padrão de nossos equipamentos.
Normalmente, quando trabalhamos com os servos SG90 o ângulo inicial será aproximadamente 180º ou aproximadamente 0º, porém apenas testando o servo quando já instalado na Useless Box Arduino para termos ideia destes valores.
O principal cuidado que precisamos ter é quanto ao ângulo final que deve ser o menor possível, evitando pressões excessivas com a alavanca, por exemplo, para que não ocorra danos ao servo e seja necessária possível troca posteriormente.
O artigo utilizado como base para o teste dos servos é o que segue:
Conclusão
Inicialmente, o projeto parece ser extremamente fácil, porém o desenvolvimento geral dele mostrou-se um pouco desafiador, uma vez que existe a necessidade de calibração, vale lembrar que se os ângulos iniciais e finais forem alterados, devem-se alterar todos os demais ângulos do devido servo no código para movimentos compatíveis.
Os demais detalhes de funcionamento são extremamente condicentes com a visão inicial de surpresa e entretenimento, uma vez que para quem tem o primeiro contato com a Useless Box Arduino se surpreende com a reação da mesma.
Em um contexto geral, como o próprio nome já representa, a Caixa Inútil não possui grandes funcionalidades, porém é bastante útil para quem deseja aprimorar os seus conhecimentos e desafiar-se no mundo da programação e desenvolvimento de projetos.
Não deixe de comentar sobre o que achou e quais as experiências que teve ao desenvolver a sua Useless Box Arduino, compartilhe suas dificuldades e ajude os demais que também desejam realizar o seu projeto a encontrar o êxito.
Extremamente didático, esse codigo esta feito de uma maneira que a gente pode aprender de forma bem dinamica, Obg.!
Ao compilar o programa, aparece a seguinte mensagem de erro:
sketch_jan06a:65:16: error: a function-definition is not allowed here before ‘{‘ token
void reacao1() {
^
sketch_jan06a:77:16: error: a function-definition is not allowed here before ‘{‘ token
void reacao2() {
^
sketch_jan06a:88:16: error: a function-definition is not allowed here before ‘{‘ token
void reacao3() {
^
sketch_jan06a:98:16: error: a function-definition is not allowed here before ‘{‘ token
void reacao4() {
^
sketch_jan06a:114:16: error: a function-definition is not allowed here before ‘{‘ token
void reacao5() {
^
sketch_jan06a:137:16: error: a function-definition is not allowed here before ‘{‘ token
void reacao6() {
^
sketch_jan06a:172:16: error: a function-definition is not allowed here before ‘{‘ token
void reacao7() {
^
sketch_jan06a:195:1: error: expected ‘}’ at end of input
}
^
Foram encontradas múltiplas bibliotecas para “VarSpeedServo.h”
Usado: C:\Users\Marcio\Documents\Arduino\libraries\VarSpeedServo
Não usado: C:\Users\Marcio\Documents\Arduino\libraries\VarSpeedServo-master
Usando biblioteca VarSpeedServo na pasta: C:\Users\Marcio\Documents\Arduino\libraries\VarSpeedServo (legacy)
exit status 1
a function-definition is not allowed here before ‘{‘ token
Boa Tarde Marcio! Ao que pude observar na mensagem de erro, o seu software está encontrando algum problema de compatibilidade entre as bibliotecas instaladas. Verifique as bibliotecas da pasta do software Arduino e também as instaladas na pasta de usuário do disco local C, pode estar ocorrendo algum tipo de conflito entre estas.
Boa tarde. Tenho uma pergunta qual tipo de bateria haveria a possibilidade de alimenta-la sem a necessidade de fonte.
Boa tarde Alex, tudo bem?
Você pode utilizar um power bank 5V.
Uma bateria de 3,7 volts por 2A com carregador TP4056, conseguiria funcionar?
Boa tarde… Após realizar algumas mudanças para calibrar os servos… Tudo está funcionando perfeitamente… Gostaria de puder me explicar como faço para colocar esta rotina abaixo dentro do seu projeto… Gostaria de ter um led com efeito fader dentro da caixa. Abaixo o código… Pode me ajudar?
//Constante que representa o pino onde o positivo do
//led será ligado.
const int led = 10;
//Controladores do efeito de fader
int brilho = 0;
int fader = 5;
boolean acende = true;
boolean apaga = false;
//Método setup, executado uma vez ao ligar o Arduino.
void setup() {
//Definindo o pino led como de saída.
pinMode(led,OUTPUT);
}
//Método loop, executado enquanto o Arduino estiver ligado.
void loop() {
analogWrite(led,brilho);
//Processo de acendimento do led usando o efeito fader.
if (acende == true) {
if (brilho 0) {
brilho = brilho – fader; // diminuindo o brilho do led.
} else {
acende = true;
apaga = false;
}
}
delay(20);
}
Faltou o passo a passo da montagem da caixa.
Boa Tarde Felipe! Caso esteja com problema na montagem do seu equipamento, entre em contato com a Usinainfo através do e-mail contato@usinainfo.com.br que eles farão o possível para lhe auxiliar.
Seria legal incluir um “aleatorio entre” com os 7 codigos, ou os quantos mais forem sendo criados..
Bom Dia Juan! Realmente seria uma função bem legal de incluir, traria um ar de surpresa já que assim teoricamente sempre sabemos o próximo movimento.