Índice:

O Robô Manteiga: o Robô Arduino com Crise Existencial: 6 Passos (com Imagens)
O Robô Manteiga: o Robô Arduino com Crise Existencial: 6 Passos (com Imagens)

Vídeo: O Robô Manteiga: o Robô Arduino com Crise Existencial: 6 Passos (com Imagens)

Vídeo: O Robô Manteiga: o Robô Arduino com Crise Existencial: 6 Passos (com Imagens)
Vídeo: Rick and Morty - You pass Butter 2024, Julho
Anonim
Image
Image

Este projeto é baseado na série animada "Rick e Morty". Em um dos episódios, Rick faz um robô cujo único objetivo é trazer manteiga. Como alunos da Bruface (Faculdade de Engenharia de Bruxelas), temos uma tarefa para o projeto de mecatrônica que consiste em construir um robô com base em um tópico sugerido. A tarefa para este projeto é: Fazer um robô que só sirva manteiga. Pode haver uma crise existencial. Claro que o robô do episódio de Rick e Morty é um robô bastante complexo e algumas simplificações precisam ser feitas:

Como seu único objetivo é trazer manteiga, existem alternativas mais simples. Em vez de fazer o robô olhar e pegar a manteiga, antes que ela a leve para a pessoa certa, o robô pode estar carregando a manteiga o tempo todo. A ideia principal é então fazer um carrinho que leve a manteiga até onde ela precisa estar.

Além de transportar a manteiga, o robô precisa saber para onde leva a manteiga. No episódio, Rick usa sua voz para chamar e comandar o robô. Isso requer um sistema de reconhecimento de voz caro e seria muito complicado. Em vez disso, todos na mesa recebem um botão: uma vez que esse botão é ativado, o robô pode localizar esse botão e mover-se em direção a ele.

Para recapitular, o robô precisa cumprir os seguintes requisitos:

  • Precisa ser seguro: deve evitar obstáculos e evitar que caia da mesa;
  • O robô precisa ser pequeno: o espaço na mesa é limitado e ninguém gostaria de um robô que sirva manteiga, mas tenha metade do tamanho da própria mesa;
  • O funcionamento do robô não pode depender do tamanho ou formato da mesa, podendo ser utilizado em diferentes mesas;
  • É preciso levar a manteiga à pessoa certa à mesa.

Etapa 1: conceito principal

Os requisitos mencionados anteriormente podem ser atendidos por meio de diferentes técnicas. As decisões sobre o design principal que foram feitas são explicadas nesta etapa. Detalhes sobre como essas ideias são implementadas podem ser encontrados nas etapas a seguir.

Para cumprir seu dever, o robô precisa se mover até que o destino seja alcançado. Considerando a aplicação do robô, é claro que usar rodas em vez de um movimento de "caminhada" é melhor para fazê-lo se mover. Como a mesa é uma superfície plana e o robô não atingirá velocidades muito altas, duas rodas acionadas e uma esfera de rodízio são a solução mais simples e fácil de controlar. As rodas acionadas precisam ser movidas por dois motores. Os motores precisam ter um grande torque, mas não precisam atingir uma alta velocidade, por isso servo motores contínuos serão usados. Outra vantagem dos servo motores é a simplicidade de uso com um Arduino.

A detecção de obstáculos pode ser feita por meio de um sensor ultrassônico que mede a distância, acoplado a um servo motor para escolher a direção da medição. As bordas podem ser detectadas usando sensores LDR. O uso de sensores LDR exigirá a construção de um dispositivo que contenha uma luz LED e um sensor LDR. Um sensor LDR mede a luz refletida e pode ser visto como uma espécie de sensor de distância. O mesmo princípio existe com luz infravermelha. Existem alguns sensores de proximidade infravermelhos que possuem uma saída digital: fechar ou não fechar. Isso é exatamente o que o robô precisa para detectar as arestas. Ao combinar 2 sensores de borda colocados como duas antenas de inseto e um sensor ultrassônico atuado, o robô deve ser capaz de evitar obstáculos e bordas.

A detecção do botão também pode ser realizada usando sensores IR e leds. A vantagem do IR é que é invisível, o que torna o seu uso não perturbador para as pessoas à mesa. Lasers também poderiam ser usados, mas a luz seria visível e também perigosa quando alguém apontasse o laser para o olho de outra pessoa. Além disso, o usuário precisaria direcionar os sensores do robô apenas com um feixe de laser fino, o que seria muito irritante. Ao equipar o robô com dois sensores IR e construir o botão com um LED IR, o robô sabe em que direção ele precisa ir seguindo a intensidade da luz IR. Quando não há botão, o robô pode girar até que um dos leds capture o sinal de um dos botões.

A manteiga é colocada em um compartimento na parte superior do robô. Este compartimento pode consistir em uma caixa e uma tampa acionada para abrir a caixa. Para abrir a tampa e movimentar o sensor ultrassônico para escanear e detectar os obstáculos são necessários dois motores e, para isso, servo motores não contínuos são mais adaptados, pois os motores precisam ir a uma determinada posição e manter essa posição.

Uma característica extra do projeto foi interagir com o ambiente externo por meio de uma voz de robô. Uma campainha é simples e adaptada para este propósito, mas não pode ser usada em nenhum momento porque a atração atual é alta.

As principais dificuldades do projeto estão na codificação, já que a parte mecânica é bastante direta. Muitos casos precisam ser levados em consideração para evitar que o robô fique preso ou fazendo algo indesejado. Os principais problemas que precisamos resolver são perder o sinal de infravermelho por causa de um obstáculo e parar quando ele chegar ao botão!

Etapa 2: Materiais

Partes mecânicas

  • Impressora 3D e máquina de corte a laser

    • PLA será usado para impressão 3D, mas você também pode usar ABS
    • Uma placa de madeira compensada de bétula de 3 mm será usada para corte a laser, pois dá a possibilidade de fazer modificações mais tarde facilmente. Plexiglass também pode ser usado, mas é mais difícil modificá-lo uma vez que é cortado a laser sem destruí-lo
  • Parafusos, porcas, arruelas

    A maioria dos componentes são mantidos juntos usando parafusos de cabeça redonda M3, arruelas e porcas, mas alguns deles requerem o conjunto de parafusos M2 ou M4. O comprimento dos parafusos está na faixa de 8-12 mm

  • Espaçadores de PCB, 25 mm e 15 mm
  • 2 servo motores com rodas compatíveis
  • Algum fio de metal grosso com cerca de 1-2 mm de diâmetro

Partes eletrônicas

  • Microcontrolador

    1 placa arduino UNO

  • Servo Motors

    • 2 servo motores grandes: Feetech 6Kg 360 graus contínuos
    • 2 micro servo motores: Feetech FS90
  • Sensores

    • 1 sensor ultrassônico
    • 2 sensores de proximidade IR
    • 2 fotodiodos IR
  • Baterias

    • 1 suporte de bateria de 9V + bateria
    • 1 suporte de bateria 4AA + baterias
    • 1 caixa de bateria de 9V + bateria
  • Componentes adicionais

    • Alguns fios de salto, fios e placas de solda
    • Alguns resistores
    • 1 LED IV
    • 3 interruptores
    • 1 campainha
    • 1 botão
    • 1 Arduino para conector de bateria de 9V

Etapa 3: Testando os eletrônicos

Testando a Eletrônica
Testando a Eletrônica
Testando a Eletrônica
Testando a Eletrônica

Criação do botão:

O botão é feito simplesmente por um switch, um LED infravermelho e um resistor de 220 Ohm em série, alimentado por uma bateria de 9V. Isso é colocado em uma bateria de 9 V para um design compacto e limpo.

Criação dos módulos receptores infravermelhos:

Esses módulos são feitos com placas de solda por furo passante, que posteriormente serão fixadas com parafusos no robô. Os circuitos para esses módulos são descritos nos esquemas gerais. O princípio é medir a intensidade da luz infravermelha. Para melhorar as medições, colimadores (feitos com tubos retráteis) podem ser usados para focar em uma determinada direção de interesse.

Diferentes requisitos do projeto precisam ser atendidos por meio de dispositivos eletrônicos. O número de dispositivos deve ser limitado para manter uma relativa baixa complexidade. Esta etapa contém os esquemas de fiação e cada código para testar todas as peças separadamente:

  • Servo motores contínuos;
  • Sensor ultrasônico;
  • Servo motores não contínuos;
  • Buzzer;
  • Detecção de direção do botão IR;
  • Detecção de bordas por sensores de proximidade;

Esses códigos podem ajudar a entender os componentes no início, mas também são muito úteis para depuração em estágios posteriores. Se ocorrer um certo problema, o bug pode ser detectado mais facilmente testando todos os componentes separadamente.

Etapa 4: Projeto das peças impressas e cortadas a laser em 3D

Projeto de peças impressas e cortadas a laser em 3D
Projeto de peças impressas e cortadas a laser em 3D
Projeto de peças impressas e cortadas a laser em 3D
Projeto de peças impressas e cortadas a laser em 3D
Projeto de peças impressas e cortadas a laser em 3D
Projeto de peças impressas e cortadas a laser em 3D

Peças cortadas a laser

O conjunto é feito de três placas horizontais principais mantidas juntas por espaçadores de PCB para obter um design aberto que fornece fácil acesso aos componentes eletrônicos, se necessário.

Essas placas precisam ter os furos necessários para aparafusar os espaçadores e outros componentes para a montagem final. Principalmente, todas as três placas têm orifícios no mesmo local para os espaçadores e orifícios específicos para os componentes eletrônicos fixados respectivamente em cada placa. Observe que a placa do meio tem um orifício para a passagem de fios no meio.

Peças menores são cortadas nas dimensões do servo grande para fixá-las ao conjunto.

Peças impressas em 3D

Além do corte a laser, algumas peças precisarão ser impressas em 3D:

  • O suporte para o sensor ultrassônico, que o liga a um braço do micro servo motor
  • O suporte para a roda giratória e os dois sensores de borda IR. O design específico das extremidades em forma de caixa da peça para os sensores IR atuam como uma tela para evitar interferências entre o botão que emite o sinal IR e os sensores IR que precisam se concentrar apenas no que está acontecendo no solo
  • O suporte para o micro servo motor abrindo a tampa
  • E por último a própria tampa, feita de duas peças para ter um maior ângulo de operação evitando colisão com o micro servo motor abrindo a tampa:

    • O inferior que será fixado na placa superior
    • E o topo que está ligado ao fundo por uma dobradiça, e acionado pelo servo por meio de um grosso fio de metal. Decidimos adicionar um pouco de personalidade ao robô, dando-lhe uma cabeça.

Uma vez que todas as peças foram desenhadas e os arquivos exportados no formato correto para as máquinas utilizadas, as peças podem realmente ser feitas. Esteja ciente de que a impressão 3D leva muito tempo, especialmente com as dimensões da parte superior da tampa. Você pode precisar de um ou dois dias para imprimir todas as peças. O corte a laser, entretanto, é apenas uma questão de minutos.

Todos os arquivos do SOLIDWORKS podem ser encontrados na pasta compactada.

Etapa 5: Montagem e fiação

Image
Image
Montagem e fiação
Montagem e fiação
Montagem e fiação
Montagem e fiação
Montagem e fiação
Montagem e fiação

A montagem será uma mistura de fiação e aparafusamento dos componentes, começando de baixo para cima.

Placa inferior

A placa inferior é montada com o pacote de bateria 4AA, os servo motores, a parte impressa (fixando o rodízio embaixo da placa), os dois sensores de borda e 6 espaçadores macho-fêmea.

Prato do meio

Em seguida, a placa do meio pode ser montada, comprimindo os servo motores entre as duas placas. Esta placa pode então ser fixada colocando outro conjunto de espaçadores em cima dela. Alguns cabos podem ser passados pelo orifício central.

O módulo ultrassônico pode ser conectado a um servo não contínuo, que é fixado na placa do meio com o Arduino, a bateria de 9V (alimentando o arduino) e os dois módulos receptores infravermelhos na frente do robô. Esses módulos são feitos com placas de solda através de orifícios e fixados com parafusos na placa. Os circuitos para esses módulos são descritos nos esquemas gerais.

Placa superior

Nesta parte da montagem, os interruptores não são fixos mas o robô já pode fazer tudo menos ações que requeiram a tampa, assim nos permite fazer alguns testes para corrigir o limiar, adaptar o código do movimento e ter uma acesso às portas do arduino.

Quando tudo isso for alcançado, a placa superior pode ser fixada com espaçadores. Os últimos componentes que são os dois interruptores, o botão, o servo, a campainha e o sistema de tampa podem ser finalmente fixados na placa superior para finalizar a montagem.

A última coisa a testar e corrigir é o ângulo do servo para abrir a tampa corretamente.

O limite dos sensores de borda deve ser adaptado com o potenciômetro incluído (usando uma chave de fenda plana) para diferentes superfícies de mesa. Uma mesa branca deve ter um limite inferior do que uma mesa marrom, por exemplo. Além disso, a altura dos sensores influenciará o limite necessário.

No final desta etapa, a montagem é concluída e a última parte restante são os códigos que faltam.

Etapa 6: Codificação: Juntando tudo

Todo o código necessário para fazer o robô funcionar está no arquivo compactado que pode ser baixado. O mais importante é o código "principal" que inclui a configuração e o loop funcional do robô. A maioria das outras funções são gravadas em subarquivos (também na pasta compactada). Esses subarquivos devem ser salvos na mesma pasta (que é chamada de "principal") que o script principal antes de enviá-lo para o Arduino

Primeiro, a velocidade geral do robô é definida em conjunto com a variável "lembrar". Este "lembrar" é um valor que lembra em qual direção o robô estava virando. Se "lembrar = 1", o robô estava / está virando à esquerda, se "lembrar = 2", o robô estava / está virando à direita.

velocidade interna = 9; // Velocidade geral do robô

lembrete int = 1; // direção inicial

Na configuração do robô, os diferentes subarquivos do programa são inicializados. Nestes subarquivos estão escritas as funções básicas de controle dos motores, sensores, …. Ao inicializá-los na configuração, as funções descritas em cada um desses arquivos podem ser usadas no loop principal. Ao ativar a função r2D2 (), o robô fará um ruído como o robô R2D2 da franquia de filmes Star Wars quando ele inicia. Aqui, a função r2D2 () é desabilitada para evitar que a campainha extraia muita corrente.

// Setup @ reset // ----------------

void setup () {initialize_IR_sensors (); initialize_obstacles_and_edges (); initialize_movement (); initialize_lid (); initialize_buzzer (); // r2D2 (); lembrete int = 1; // direção inicial Starter (lembrar); }

A função Starter (lembrar) é chamada pela primeira vez na configuração. Esta função faz com que o robô gire e procure o sinal IR de um dos botões. Assim que encontrar o botão, o programa sairá da função Starter mudando a variável 'cond' para falsa. Durante a rotação do robô, ele precisa estar atento ao seu ambiente: ele deve detectar bordas e obstáculos. Isso é verificado todas as vezes antes de continuar a girar. Assim que o robô detecta um obstáculo ou borda, o protocolo para evitar esses obstáculos ou bordas será executado. Esses protocolos serão explicados posteriormente nesta etapa. A função Starter tem uma variável que é a variável lembrar que foi discutida antes. Ao atribuir o valor lembrar à função Starter, o robô sabe em que direção ele precisa virar para procurar o botão.

// Starter Loop: Vire e pesquise o botão // ------------------------------------ ----------------

void Starter (int remete) {if (isedgeleft () || isedgeright ()) {// Detecta as arestas edgeDetected (remete); } else {bool cond = true; while (cond == true) {if (buttonleft () == false && buttonright () == false && isButtonDetected () == true) {cond = false; } else {if (remember == 1) {// Estávamos virando à esquerda if (isobstacleleft ()) {stopspeed (); evitar_obstáculo (lembrar); } else if (isedgeleft () || isedgeright ()) {// Detectar as bordas edgeDetected (lembre); } else {turnleft (velocidade); }} else if (lembre == 2) {if (isobstacleright ()) {stopspeed (); evitar_obstáculo (lembrar); } else if (isedgeleft () || isedgeright ()) {// Detectar as bordas edgeDetected (lembre); } else {turnright (velocidade); }}}}}}

Se o robô encontrar o botão, o primeiro loop inicial é encerrado e o loop principal funcional do robô é iniciado. Este loop principal é bastante complexo, pois a cada vez, o robô precisa detectar se existe ou não um obstáculo ou uma borda à sua frente. A ideia principal é que o robô siga o botão encontrando-o e perdendo-o a cada vez. Usando dois sensores IR, podemos distinguir três situações:

  • a diferença entre a luz infravermelha detectada pelo sensor esquerdo e direito é maior do que um certo limite e há um botão.
  • a diferença na luz IV é menor do que o limite e há um botão na frente do robô.
  • a diferença na luz IV é menor do que o limite e NÃO há botão na frente do robô.

A forma como a rotina de rastreamento funciona é a seguinte: quando o botão é detectado, o robô se move em direção ao botão girando na mesma direção em que estava girando (usando a variável lembrar) e ao mesmo tempo avança um pouco. Se o robô girar muito, o botão se perderá novamente e, neste ponto, o robô se lembrará de que precisa virar na outra direção. Isso também é feito enquanto avança um pouco. Ao fazer isso, o robô está constantemente virando para a esquerda e para a direita, mas, nesse meio tempo, ainda avança em direção ao botão. Cada vez que o robô encontra o botão, ele continua girando até perdê-lo, caso em que começa a se mover na outra direção. Observe a diferença nas funções que são usadas no loop inicial e no loop principal: o loop inicial usa "turnleft ()" ou "turnright ()", enquanto o loop principal usa "moveleft ()" e "moveright ()". As funções moveleft / right não apenas fazem o robô girar, mas também o fazem avançar ao mesmo tempo.

/ * Loop funcional ---------------------------- Aqui, há apenas a rotina de trilha * /

perda interna = 0; // Se perdido = 0 o botão é encontrado, se perdido = 1 o botão é perdido void loop () {if (isedgeleft () || isedgeright ()) {

if (! isobstacle ()) {

mover para a frente (velocidade); atraso (5); } else {Avoid_obstacle (lembrar); } else {if (remember == 1 && lost == 1) {// Estávamos virando à esquerda stopspeed (); if (! isobstacleright ()) {moveright (velocidade); // Vire-se para encontrar o botão} else {Avoid_obstacle (lembre); } lembrar = 2; } else if (lembrar == 2 && lost == 1) {stopspeed (); if (! isobstacleleft ()) {moveleft (speed); // Estávamos virando à direita} else {Avoid_obstacle (lembre); } lembrar = 1; } else if (lost == 0) {if (lembre == 1) {// Estávamos virando à esquerda if (! isobstacleleft ()) {moveleft (speed); // Estávamos virando à direita} else {stopspeed (); evitar_obstáculo (lembrar); } //} else if (lembrar == 2) {if (! isobstacleright ()) {moveright (velocidade); // Vire para encontrar o botão} else {stopspeed (); evitar_obstáculo (lembrar); }}} atraso (10); perdido = 0; }} //}}

Agora, uma pequena explicação das duas rotinas mais complexas é dada:

Evite bordas

O protocolo para evitar bordas é definido em uma função chamada "edgeDetection ()" que está escrita no subarquivo "movimento". Esse protocolo se baseia no fato de que o robô só deve encontrar uma aresta quando chegar ao seu destino: o botão. Uma vez que o robô detecta uma borda, a primeira coisa que ele faz é recuar um pouco para estar a uma distância segura da borda. Feito isso, o robô espera 2 segundos. Se alguém apertar o botão na frente do robô nesses dois segundos, o robô sabe que alcançou a pessoa que quer a manteiga e abre o compartimento da manteiga e apresenta a manteiga. Nesse ponto, alguém pode tirar manteiga do robô. Depois de alguns segundos, o robô se cansará de esperar e fechará a tampa da manteiga. Assim que a tampa for fechada, o robô executará o loop inicial para procurar outro botão. Se acontecer de o robô encontrar uma aresta antes de chegar ao seu destino e o botão na frente do robô não for pressionado, o robô não abrirá a tampa da manteiga e executará imediatamente o loop inicial.

Evite obstáculos

A função Avoid_obstacle () também está situada no sub-arquivo "movimento". A parte difícil de evitar obstáculos é o fato de que o robô tem um ponto cego bem grande. O sensor ultrassônico é colocado na frente do robô, o que significa que ele pode detectar obstáculos, mas não sabe quando é ultrapassado. Para resolver isso, o seguinte princípio é usado: Uma vez que o robô encontra um obstáculo, ele usa a variável reming para virar na outra direção. Desta forma, o robô evita bater no obstáculo. O robô continua girando até que o sensor ultrassônico não detecte mais o obstáculo. Durante o tempo em que o robô está girando, um contador é aumentado até que o obstáculo não seja mais detectado. Este contador dá então uma aproximação do comprimento do obstáculo. Movendo-se então para frente e ao mesmo tempo diminuindo o contador, o obstáculo pode ser evitado. Uma vez que o contador atinge 0, a função Starter pode ser usada novamente para realocar o botão. É claro que o robô executa a função de partida girando na direção em que se lembrava que estava indo antes de encontrar o obstáculo (novamente usando a variável lembrar).

Agora que você entende totalmente o código, pode começar a usá-lo!

Certifique-se de adaptar os limites ao seu ambiente (a reflexão de IV é maior em mesas brancas, por exemplo) e de adaptar os diferentes parâmetros às suas necessidades. Além disso, grande atenção deve ser dada à alimentação dos diferentes módulos. É de suma importância que os servo motores não sejam alimentados pela porta Arduino 5V, pois eles consomem muita corrente (isso pode danificar o microcontrolador). Se a mesma fonte de alimentação for usada para os sensores que alimenta os servos, alguns problemas de medição podem ser encontrados.

Recomendado: