Índice:

Rover controlado por gestos usando um acelerômetro e um par transmissor-receptor de RF: 4 etapas
Rover controlado por gestos usando um acelerômetro e um par transmissor-receptor de RF: 4 etapas

Vídeo: Rover controlado por gestos usando um acelerômetro e um par transmissor-receptor de RF: 4 etapas

Vídeo: Rover controlado por gestos usando um acelerômetro e um par transmissor-receptor de RF: 4 etapas
Vídeo: Hand Gesture Controlled Robot Using RF Transmitter & Receiver 2024, Julho
Anonim
Rover controlado por gestos usando um acelerômetro e um par transmissor-receptor de RF
Rover controlado por gestos usando um acelerômetro e um par transmissor-receptor de RF

Ei, Sempre desejou construir um rover que você pudesse dirigir com simples gestos de mão, mas nunca poderia reunir coragem para se aventurar nas complexidades do processamento de imagem e fazer a interface de uma webcam com seu microcontrolador, sem mencionar a árdua batalha para superar o alcance e a linha de problemas de visão? Bem, não tenha medo … pois há uma saída fácil! Veja, enquanto eu apresento a você o poderoso ACELERÔMETRO! * ba dum tsss *

Um acelerômetro é um dispositivo muito legal que mede a aceleração gravitacional ao longo de um eixo linear. Ele representa isso como um nível de tensão flutuando entre o aterramento e a tensão de alimentação, que nosso microcontrolador lê como um valor analógico. Se aplicarmos um pouco o nosso cérebro (apenas um pouco de matemática e um pouco de física newtoniana), não só podemos usá-lo para medir o movimento linear ao longo de um eixo, mas também para determinar o ângulo de inclinação e sentir as vibrações. Não se preocupe! Não precisaremos de matemática ou física; vamos apenas lidar com valores brutos que o acelerômetro divulga. Na verdade, você realmente não precisa se preocupar muito com os detalhes técnicos de um acelerômetro para este projeto. Vou apenas tocar em alguns detalhes e elaborar apenas o que você precisa para entender o quadro geral. Porém, se você estiver interessado em estudar sua mecânica interna, dê uma olhada aqui.

Você só precisa manter isso em mente por enquanto: um acelerômetro é o dispositivo (geralmente acoplado a um giroscópio) que abre as portas para todos os jogos de sensores de movimento que jogamos em nossos smartphones; um jogo de corrida de carros, por exemplo, em que dirigimos o veículo simplesmente inclinando nossos dispositivos em qualquer direção. E podemos imitar esse mesmo efeito colando um acelerômetro (com alguns auxiliares, é claro) em uma luva. Nós apenas colocamos nossas luvas mágicas e inclinamos nossas mãos para a esquerda ou direita, para frente ou para trás e vemos nossos rovers dançarem conforme nossas melodias. Tudo o que precisamos fazer aqui é traduzir as leituras do acelerômetro em sinais digitais que os motores do rover podem interpretar e conceber um mecanismo para transmitir esses sinais ao rover. Para conseguir isso, convocamos o bom e velho Arduino e seus auxiliares para o experimento de hoje, um par transmissor-receptor de RF operando a 434 MHz, gerando assim um alcance de cerca de 100-150 m em espaço aberto, o que também nos salva da linha de problemas de visão.

Um hack bacana, hein? Vamos mergulhar …

Etapa 1: Reúna seus suprimentos

Reúna seus suprimentos
Reúna seus suprimentos
Reúna seus suprimentos
Reúna seus suprimentos
Reúna seus suprimentos
Reúna seus suprimentos
Reúna seus suprimentos
Reúna seus suprimentos
• Arduino Nano x1
• Acelerômetro (ADXL335) x1
• Motor 5V DC + Rodas x2 cada
• Roda bovina * x1
• Driver do motor L293D + soquete IC de 16 pinos x1 cada
• Transmissor RF 434 MHz x1
• Receptor RF 434 MHz x1
• Codificador IC HT-12E + soquete IC de 18 pinos x1 cada
• IC decodificador HT-12D + soquete IC de 18 pinos x1 cada
• Regulador de tensão LM7805 x1
• Pressionar no interruptor x2
• LED vermelho + resistor 330O x2 cada
• LED amarelo + resistor 330O x1 cada
• LED verde + resistor 330O (opcional) x4 cada
• Resistores 51kO e 1MO x1 cada
• Capacitores radiais de 10µF x2
Baterias, conectores de bateria, cabo USB, fios de jumper, conectores fêmeas, terminais de parafuso de 2 pinos, PCB, chassi e seus acessórios de solda usuais

Se você está se perguntando por que estamos usando uma roda bovina, o fato é que os módulos transmissor e receptor de RF têm apenas 4 pinos de dados, o que significa que podemos acionar apenas 2 motores e, portanto, o uso de uma roda bovina para apoiar a estrutura. No entanto, se você acha que seu rover ficaria um pouco mais legal com quatro rodas, não se preocupe, há uma solução! Nesse caso, apenas risque a roda bovina da lista e adicione outro par de motores 5 V CC, acompanhados de uma roda cada, e procure o hack simples discutido no final da etapa 3.

Finalmente, para os corajosos, há espaço para outra pequena modificação no design, que meio que envolve a engenharia de seu próprio Arduino. Vá para a seção de bônus na próxima etapa e veja por si mesmo. Você também precisará de alguns suprimentos extras: um ATmega328P, um soquete IC de 28 pinos, um oscilador de cristal de 16 MHz, duas tampas de cerâmica 22pF, outro regulador de tensão 7805, mais duas tampas radiais de 10μF e resistores de 10kΩ, 680Ω, 330Ω e sim, menos o Arduino!

Etapa 2: Conecte o transmissor

Conecte o transmissor
Conecte o transmissor
Conecte o transmissor
Conecte o transmissor
Conecte o transmissor
Conecte o transmissor
Conecte o transmissor
Conecte o transmissor

Vamos dividir o projeto em dois componentes: o transmissor e os circuitos do receptor. O transmissor consiste em um acelerômetro, um Arduino e um módulo transmissor de RF acoplado a um codificador IC HT-12E, tudo conectado de acordo com o esquema em anexo.

O acelerômetro, conforme apresentado anteriormente, serve para reconhecer nossos gestos com as mãos. Usaremos um acelerômetro de três eixos (basicamente três acelerômetros de eixo único em um) para atender às nossas necessidades. Ele pode ser usado para medir a aceleração em todas as três dimensões e, como você deve ter adivinhado, não produz um, mas um conjunto de três valores analógicos relativos a seus três eixos (x, y e z). Na verdade, precisamos apenas da aceleração ao longo dos eixos xey, pois só podemos dirigir o rover em quatro direções: para a frente ou para trás (ou seja, ao longo do eixo y) e para a esquerda ou direita (ou seja, ao longo do eixo x). Precisaríamos do eixo z se estivéssemos construindo um drone, de modo que também pudéssemos controlar sua subida ou descida por meio de gestos. Em qualquer caso, esses valores analógicos que o acelerômetro produz devem ser convertidos em sinais digitais para poder acionar os motores. Isso é feito pelo Arduino, que também transmite esses sinais, após a conversão, para o rover por meio do módulo transmissor de RF.

O transmissor RF só tem uma função: transmitir os dados "seriais" disponíveis no pino 3 para fora da antena no pino 1. Isso defende o uso do HT-12E, um codificador de dados paralelo-serial de 12 bits, que coleta até 4 bits de dados paralelos do Arduino nas linhas AD8 a AD11, permitindo assim abrir espaço para até 24 = 16 combinações de E / S diferentes em oposição ao único pino de dados no transmissor RF. Os 8 bits restantes, extraídos das linhas A0 a A7 no codificador, constituem o byte de endereço, o que facilita o emparelhamento do transmissor RF com um receptor RF correspondente. Os 12 bits são então colocados juntos e serializados e passados para o pino de dados do transmissor de RF, que por sua vez, modula os dados em ASK em uma onda portadora de 434 MHz e os dispara através da antena no pino 1.

Conceitualmente, qualquer receptor de RF ouvindo a 434Mhz deve ser capaz de interceptar, demodular e decodificar esses dados. No entanto, as linhas de endereço no HT-12E, e aquelas na contraparte do HT-12D (um decodificador de dados serial-para-paralelo de 12 bits), nos permitem renderizar um par transmissor-receptor de RF único, roteando os dados apenas para o receptor pretendido, limitando assim a comunicação com todos os outros. Tudo o que é exigido de nós é configurar as linhas de endereço de forma idêntica em ambas as frentes. Por exemplo, uma vez que aterramos todas as linhas de endereço do nosso HT-12E, devemos fazer o mesmo para o HT-12D na extremidade receptora ou o rover não será capaz de receber os sinais. Dessa forma, também podemos controlar vários rovers com um único circuito transmissor, configurando de forma idêntica as linhas de endereço nos HT-12Ds em cada um dos receptores. Ou podemos colocar duas luvas, cada uma com um circuito transmissor contendo uma configuração de linha de endereço distinta (digamos, uma com todas as linhas de endereço aterradas e outra com todas erguidas, ou uma com uma linha aterrada enquanto as sete restantes são mantidas alto e o outro com duas linhas aterradas, enquanto as seis restantes sendo mantidas altas, ou qualquer outra combinação das mesmas) e cada um direcionando vários rovers configurados de forma idêntica. Toque o maestro em uma sinfonia android!

Uma coisa importante a ser observada durante a montagem do circuito é o valor de Rosc. O HT-12E possui um circuito oscilador interno entre os pinos 15 e 16, que é habilitado conectando-se um resistor, chamado Rosc, entre esses pinos. O valor selecionado para Rosc realmente determina a frequência do oscilador, que pode variar dependendo da tensão de alimentação. Selecionar um valor apropriado para Rosc é crucial para o funcionamento do HT-12E! Idealmente, a frequência do oscilador do HT-12E deve ser 1/50 vezes maior que a do HT-12D. Portanto, como estamos operando em 5 V, escolhemos resistores de 1MΩ e 51kΩ como Rosc para os circuitos HT-12E e HT-12D, respectivamente. Se você planeja operar os circuitos com uma tensão de alimentação diferente, consulte o gráfico “Frequência do oscilador x tensão de alimentação” na página 11 da ficha técnica do HT-12E anexada para determinar a frequência exata do oscilador e o resistor a serem usados.

Além disso, como uma observação lateral, vamos empregar cabeçalhos fêmeas aqui (servindo a um propósito semelhante aos soquetes IC) para conectar o acelerômetro, o transmissor de RF e o Arduino no circuito em vez de soldá-los diretamente no PCB. A intenção é a acomodação de um pouco de reutilização de componentes. Digamos, já faz um tempo desde que você projetou seu veículo espacial controlado por gestos e ele fica parado ali, meio coberto de poeira, em cima de sua prateleira de troféus e você se depara com outro grande instrutível que alavanca a eficácia de um acelerômetro. Então, o que você faz? Você simplesmente o arranca do rover e o empurra para o novo circuito. Não há necessidade de convocar as “Amazonas” para conseguir uma nova:-p

Bônus: acabe com o Arduino, mas não

Caso você esteja se sentindo um pouco mais aventureiro, e especialmente se você acha que gastar esta maravilha lindamente projetada (o Arduino, é claro) para uma tarefa tão trivial como a nossa é um pouco exagerado, tenha paciência comigo um pouco mais; e se não, fique à vontade para pular para a próxima etapa.

Nosso objetivo aqui é tornar o Arduino (o cérebro do Arduino, na verdade; sim, estou falando sobre o ATmega IC!) Um membro permanente da equipe. O ATmega seria programado para executar apenas um único esboço repetidamente, para que pudesse servir como uma parte perpétua do circuito, assim como o HT-12E - um mero CI, sentado ali, fazendo o que deveria. Não é assim que qualquer sistema embarcado real deve ser?

De qualquer forma, para prosseguir com este upgrade, basta modificar o circuito conforme o segundo esquema em anexo. Aqui, simplesmente substituímos os conectores fêmeas do Arduino por um soquete IC para o ATmega, adicionamos um resistor pull-up de 10K no pino de reinicialização (pino 1) do IC e o bombeamos com um relógio externo entre os pinos 9 e 10 Infelizmente, se acabarmos com o Arduino, também deixaremos de lado seus reguladores de tensão embutidos; logo, devemos replicar o circuito LM7805 que empregamos para o receptor aqui também. Além disso, também usamos um divisor de tensão para extrair os 3,3 V necessários para alimentar o acelerômetro.

Agora, o único outro problema aqui é programar o ATmega para fazer seu trabalho. Você terá que esperar até a etapa 4, no entanto. Então fique ligado…

Etapa 3: E, o receptor

E, o receptor
E, o receptor
E, o receptor
E, o receptor
E, o receptor
E, o receptor
E, o receptor
E, o receptor

O receptor consiste em um módulo receptor RF acoplado a um decodificador IC HT-12D e um par de motores DC operados com a ajuda de um driver de motor L293D, todos conectados conforme o esquema em anexo.

O único trabalho do receptor de RF é demodular a onda portadora (recebida por meio de sua antena no pino 1) e renderizar os dados "seriais" recuperados no pino 7 de onde são coletados pelo HT-12D para desserialização. Agora, supondo que as linhas de endereço (A0 a A7) no HT-12D sejam configuradas de forma idêntica à do HT-12E, os 4 bits paralelos de dados são extraídos e passados adiante, por meio das linhas de dados (D8 a D11) no HT-12D, para o driver do motor, que por sua vez interpreta esses sinais para acionar os motores.

Novamente, preste atenção ao valor de Rosc. O HT-12D também possui um circuito oscilador interno entre os pinos 15 e 16, que é habilitado conectando-se um resistor, chamado Rosc, entre esses pinos. O valor selecionado para Rosc realmente determina a frequência do oscilador, que pode variar dependendo da tensão de alimentação. Selecionar um valor apropriado para Rosc é crucial para o funcionamento do HT-12D! Idealmente, a frequência do oscilador do HT-12D deve ser 50 vezes maior que a do HT-12E. Portanto, como estamos operando em 5 V, escolhemos resistores de 1MΩ e 51kΩ como Rosc para os circuitos HT-12E e HT-12D, respectivamente. Se você planeja operar os circuitos com uma tensão de alimentação diferente, consulte o gráfico “Frequência do oscilador x tensão de alimentação” na página 5 da ficha técnica do HT-12D anexada para determinar a frequência exata do oscilador e o resistor a serem usados.

Além disso, não se esqueça dos cabeçalhos fêmeas para o receptor RF.

Opcionalmente, um LED pode ser conectado por meio de um resistor limitador de corrente de 330Ω a cada um dos 4 pinos de dados do HT-12D, de modo a ajudar a determinar o bit recebido nesse pino. O LED acenderá se o bit recebido for HIGH (1) e diminuirá se o bit recebido for LOW (0). Alternativamente, um único LED poderia ser ligado ao pino VT do HT-12D (novamente, por meio de um resistor limitador de corrente de 330Ω), que acenderia no caso de uma transmissão válida.

Agora, se você está procurando o hack com os motores de que falei na primeira etapa, é muito fácil! Basta conectar os dois motores em cada conjunto em paralelo, conforme mostrado no segundo esquema. Isso funciona da maneira que deveria, porque os motores em cada conjunto (os motores dianteiro e traseiro à esquerda e os motores dianteiro e traseiro à direita) nunca são acionados em direções opostas. Ou seja, para virar o rover para a direita, os motores dianteiro e traseiro à esquerda devem ser movidos para frente e os motores dianteiro e traseiro à direita devem ser movidos para trás. Da mesma forma, para que o rover vire à esquerda, os motores dianteiro e traseiro à esquerda devem ser movidos para trás e os motores dianteiro e traseiro à direita devem ser movidos para frente. Portanto, é seguro alimentar o mesmo par de tensões para ambos os motores em um conjunto. E a maneira de fazer isso é simplesmente conectar os motores em paralelo.

Etapa 4: no Código

Para o Código
Para o Código

Só falta fazer uma coisa para colocar o rover em funcionamento. Sim, você adivinhou certo! (Eu espero que você tenha feito). Ainda temos que traduzir as leituras do acelerômetro em uma forma que o driver do motor possa interpretar para ser capaz de acionar os motores. Se você está pensando que, uma vez que as leituras do acelerômetro são analógicas e o motorista do motor espera sinais digitais, teremos que implementar algum tipo de ADC, bem, não tecnicamente, mas é o que meio que precisamos fazer. E é bastante simples.

Sabemos que um acelerômetro mede a aceleração gravitacional ao longo de um eixo linear e que essa aceleração é representada como um nível de tensão flutuando entre o solo e a tensão de alimentação, que nosso microcontrolador lê como um valor analógico variando entre 0 e 1023. Mas, desde que nós estiver operando o acelerômetro em 3,3 V, é aconselhável definir a referência analógica para o ADC de 10 bits (que vem integrado no ATmeaga a bordo de um Arduino) para 3,3 V. Isso apenas tornará as coisas mais simples de entender; embora, não importe muito para o nosso pequeno experimento, mesmo se não o fizéssemos (só teremos que ajustar um pouco o código). Para fazer isso, no entanto, simplesmente conectamos o pino AREF no Arduino (pino 21 no ATmega) a 3,3 V e denotamos essa mudança no código chamando analogReference (EXTERNAL).

Agora, quando colocamos o acelerômetro na horizontal e analógicoLeia a aceleração ao longo dos eixos xey (lembra? Só precisamos desses dois eixos), obtemos um valor de cerca de 511 (ou seja, a meio caminho entre 0 e 1023), que é apenas um maneira de dizer que há 0 aceleração ao longo desses eixos. Em vez de se aprofundar nos detalhes do fato, apenas imagine isso como os eixos xey em um gráfico, com o valor 511 denotando a origem e 0 e 1023 os pontos finais conforme representado na figura; oriente o acelerômetro de forma que seus pinos apontem para baixo e fiquem mais perto de você ou então você pode inverter / trocar os eixos. Isso significa que, se inclinarmos o acelerômetro para a direita, devemos ler um valor maior que 511 ao longo do eixo x, e se inclinarmos o acelerômetro para a esquerda, devemos obter um valor inferior a 511 ao longo do eixo x. Da mesma forma, se inclinarmos o acelerômetro para frente, devemos ler um valor maior que 511 ao longo do eixo y, e se inclinarmos o acelerômetro para trás, devemos ler um valor inferior a 511 ao longo do eixo y. E é assim que deduzimos, em código, a direção em que o rover deve ser dirigido. Mas isso também significa que devemos manter o acelerômetro realmente estável e alinhado paralelo a uma superfície plana para sermos capazes de ler um 511 ao longo de ambos os eixos para ter o veículo espacial ainda estacionado. Para facilitar um pouco esta tarefa, definimos certos limites formando um limite, como a figura mostra, de modo que o rover permaneça estacionário enquanto as leituras xey estiverem dentro dos limites e sabemos com certeza que o rover deve ser definido em movimento uma vez que o limite é excedido.

Por exemplo, se o eixo y lê 543, sabemos que o acelerômetro está inclinado para a frente, portanto, devemos direcionar o rover para frente. Fazemos isso definindo os pinos D2 e D4 HIGH e os pinos D3 e D5 LOW. Agora, uma vez que esses pinos são conectados diretamente ao HT-12E, os sinais são serializados e disparados pelo transmissor de RF apenas para serem captados pelo receptor de RF sentado no rover, que com a ajuda do HT-12D desserializa os sinais e passa-os para o L293D, que por sua vez interpreta esses sinais e impulsiona os motores para frente

Você pode querer alterar esses limites, no entanto, para calibrar a sensibilidade. Uma maneira fácil de fazer isso é simplesmente conectar seu acelerômetro ao Arduino e executar um esboço que cospe as leituras xey no monitor serial. Agora, mova o acelerômetro um pouco, dê uma olhada nas leituras e decida sobre os limites.

E é isso! Faça upload do código para o seu Arduino e divirta-se !! Ou talvez não tão cedo:-(Se você não pulou a seção de bônus, enviar o código para o seu ATmega significaria um pouco mais de trabalho. Você tem duas opções:

Opção A: Use um dispositivo USB para serial, como a placa de breakout básica FTDI FT232. Simplesmente execute os fios do cabeçalho TTL para os pinos correspondentes no ATmega de acordo com o mapeamento abaixo:

Pinos no Breakout Board Pinos no microcontrolador
DTR / GRN RST / Reset (Pino 1) via tampa de 0,1 µF
Rx Tx (pino 3)
Tx Rx (pino 2)
Vcc Saída de + 5v
CTS (não utilizado)
Gnd Chão

Agora, conecte uma extremidade de um cabo USB na placa de breakout e a outra em seu PC e carregue o código como você faria normalmente: inicie o IDE do Arduino, selecione uma porta serial apropriada, defina o tipo de placa, compile o esboço e clique em upload.

Opção B: use um UNO se houver um em algum lugar. Basta conectar seu ATmega ao UNO, carregar o código como faria normalmente, retirar o IC e colocá-lo de volta no circuito do transmissor. Fácil como uma torta!

Qualquer uma dessas opções deve funcionar, supondo que você seja inteligente o suficiente para queimar o bootloader antes de entregar em seu ATmega, ou, se você fosse ainda mais inteligente para comprar um ATmega com o bootloader já instalado. Caso contrário, siga em frente e siga as etapas descritas aqui.

Eddd, terminamos oficialmente! Eu espero que você tenha gostado deste instrutivo bizarramente longo. Agora, vá em frente, termine de construir seu rover se ainda não o tiver feito, brinque com ele um pouco e volte para inundar a seção de comentários abaixo com perguntas e / ou críticas construtivas.

Obrigado

P. S. O motivo pelo qual não carreguei nenhuma foto do projeto concluído é, bem, porque não o fiz sozinho. No meio da construção, pensei em alguns acréscimos, como controle de velocidade, prevenção de obstáculos e talvez um LCD no rover, o que na verdade não é tão difícil se usarmos um microcontrolador nas extremidades de transmissão e recepção. Mas, por que não fazer da maneira mais difícil ?! Então, atualmente estou trabalhando nessa direção e postarei uma atualização assim que der frutos. No entanto, testei o código e o design com a ajuda de um protótipo rápido que construí usando módulos de um de meus projetos anteriores; você pode dar uma olhada no vídeo aqui.

Recomendado: