paint-brush
Construindo um drone Raspberry Pi + ESP32: meus primeiros passos na robóticapor@tohntobshi
9,453 leituras
9,453 leituras

Construindo um drone Raspberry Pi + ESP32: meus primeiros passos na robótica

por Anton D2022/04/26
Read on Terminal Reader
Read this story w/o Javascript

Muito longo; Para ler

Anton escreveu sobre seus primeiros passos na robótica e particularmente sobre seu drone Raspberry Pi + ESP32. Anton projetou peças no Blender e depois as imprimiu em 3D em uma impressora 3D barata. O drone é controlado por um aplicativo, onde os usuários podem monitorar e monitorar o drone com um aplicativo do tipo analógico. Anton também fez um vídeo sobre isso e anexou no final do artigo ao artigo.

Companies Mentioned

Mention Thumbnail
Mention Thumbnail
featured image - Construindo um drone Raspberry Pi + ESP32: meus primeiros passos na robótica
Anton D HackerNoon profile picture

Olá pessoal! Meu nome é Anton. E quero compartilhar a história dos meus primeiros passos na robótica e particularmente sobre meu drone Raspberry Pi + ESP32. (Também fiz um vídeo sobre isso e anexei no final do artigo)

Prefácio

No início da história eu trabalhava como desenvolvedor web (React, Typescript, etc), tinha algum conhecimento de C++, quanto a eletrônica — eu podia soldar fios de fones de ouvido rasgados. O problema é que, sendo um desenvolvedor web, comecei a me sentir insatisfeito porque o que faço não afeta o mundo físico de maneira significativa. Claro, existem muitos projetos apenas de software que impactam o mundo real, mas decidi adotar a abordagem mais direta e mergulhar na robótica.


Então li alguns livros sobre o assunto, assisti alguns vídeos no youtube, li alguns artigos e comprei equipamentos de solda e uma impressora 3D, pois as impressoras 3D são baratas e disponíveis hoje em dia e podem me poupar a dor de cabeça de fazer peças de embalagens de alimentos e lixo semelhante.

o primeiro robô

Meu primeiro robô foi esta plataforma de lagarta:


meu primeiro robô


Desenhei as peças no Blender e depois as imprimi. Usei o Raspberry Pi como cérebro e um banco de energia como fonte. Soldei o controlador do motor com relés e transistores. No processo de fabricação dessa coisa, encontrei um problema: quando montei tudo, os motores mal se moviam. Acontece que misturei o coletor e o emissor dos transistores e, depois de ressoldá-los, tudo começou a funcionar. É difícil chamar essa coisa de robô porque ela não faz nada sozinha e só é controlada remotamente. De qualquer forma, me senti muito bem em fazê-lo, acreditei em mim e decidi fazer a mesma coisa, mas voadora.

o segundo robô

Depois de algumas pesquisas, decidi usar algumas peças convencionais do quadricóptero, como motores brushless, controladores eletrônicos de velocidade e uma bateria lipo capaz de fornecer alta corrente aos motores. Como cérebro, ainda usei o mesmo Raspberry Pi. Depois que descobri como fazer a interface do Raspberry Pi com os ESCs, comecei a projetar uma estrutura para conter todas as partes. Eu estava fazendo isso confiando apenas na intuição, na esperança de que os requisitos para um quadro não fossem muito rígidos, porque vi drones de formas tão estranhas que ainda eram capazes de voar.


Também comprei uma placa que incorpora um giroscópio, acelerômetro, barômetro e magnetômetro no barramento i2c. Antes mesmo de aprender o que é um controlador PID, minha primeira abordagem intuitiva foi semelhante à maneira como seu componente P funciona - apenas aumente ou diminua a velocidade do motor proporcionalmente ao ângulo em que o drone diverge do plano horizontal.


No começo, pensei que não seria uma tarefa muito difícil, mas depois de todas as tentativas frustradas, não fazia ideia de como fazer isso da maneira certa, porque há tantas coisas que podem não funcionar corretamente. E ao contrário de fazer algo apenas para software, cada execução pode acabar com danos físicos e a próxima tentativa só será possível depois que as peças danificadas forem substituídas. Além disso, não é tão fácil testar isso em um pequeno apartamento alugado. Se eu tivesse uma grande garagem, galpão ou algo assim, poderia ter feito uma construção que restringisse o movimento do drone.


movimento vertical é restringido por cadarços


Em vez disso, tive que improvisar e usar cadarços e minhas próprias mãos, o que às vezes causava ferimentos leves, mas desagradáveis.


Em algum momento, pensei que não era conveniente controlar o drone com mouse e teclado e decidi fazer um aplicativo controlador, onde posso alterar parâmetros, monitorar as leituras dos sensores e controlar gradualmente o drone com uma interface do tipo analógica.


captura de tela do aplicativo móvel

outra captura de tela


Inicialmente, por algum motivo, concentrei-me no controle de nivelamento horizontal apenas para perceber que não posso testá-lo com segurança e que precisava mais do controle automático de altura. Meu primeiro pensamento foi usar as leituras do barômetro, mas elas não eram precisas o suficiente para controlar a altura em ambientes fechados (ou talvez eu apenas as tenha usado da maneira errada), então comprei um sensor ultrassônico em uma loja local de componentes eletrônicos. Na verdade, ele tinha uma interface esquisita que gira um dos pinos para cima durante a medição e você tem que contar o tempo para deduzir a distância. Quando o Raspberry Pi estava relativamente ocioso, ele funcionou bem, mas sob carga computacional, apenas perdeu os tempos e as leituras foram um lixo. Portanto, tive que adicionar um controlador AVR adicional ao projeto apenas para medir esses tempos e gerar resultados em formato digital conveniente na interface SPI.


Também comprei dois cabos de freio de bicicleta e guias impressas para o drone restringir seu movimento para cima e para baixo para que eu pudesse focar no controle de altura sem pensar em controlar outros graus de liberdade.

o movimento horizontal é restringido pelo cabo do freio


E meio que funcionou, exceto no caso em que as hélices estavam funcionando, criando turbulência que interferia nas leituras do sensor ultrassônico em alturas acima de 40 cm. Quando finalmente descobri, tive que substituir o sensor ultrassônico por um a laser.


A essa altura, eu já tinha controle de altura, mas ainda não conseguia um nivelamento horizontal estável, embora tivesse implementado o controle PID para isso. Eu adivinhei várias razões para isso e não tenho certeza de qual delas contribuiu mais para o problema. Mas aqui estão eles:


  • Para o primeiro e provavelmente o mais significativo, usei hélices baratas (e até tentei imprimi-las) e negligenciei a necessidade de equilibrá-las, o que sobrecarrega os sensores IMU com ruído que reduz sua precisão. Quando finalmente decidi resolver esse problema, adicionei um recurso ao meu aplicativo para obter as últimas 100 leituras do giroscópio e a faixa de saída entre o maior e o menor valor. Quanto maior o alcance quando a hélice está funcionando, mais desequilibrada ela fica. Colei fita adesiva aleatoriamente nas pás das hélices, depois passei para verificar o valor, se aumentou — provavelmente um lugar ruim para colar ali, se o barulho diminuir — estou no caminho certo, então tentei colar mais ou mais perto do centro e verifique novamente, assim reduzi o ruído em cada hélice.
  • O segundo problema possível é que o Raspberry Pi tem apenas dois canais PWM, mas há quatro ESCs controlados com ele, e o software PWM pode não ser preciso o suficiente e também desperdiça ciclos de CPU. Então decidi usar o ESP32 para esta tarefa porque eles são baratos, facilmente disponíveis e possuem muitas interfaces que faltam no Raspberry Pi. Comecei controlando ESCs através do ESP32 conectado com Raspberry Pi sobre SPI e acabei passando toda a lógica do controlador de voo para o ESP32.
  • A terceira edição provavelmente não era uma moldura rígida o suficiente, que redesenhei e imprimi várias vezes.
  • Outra questão são os coeficientes abaixo do ideal para o filtro complementar que usei para estimar o ângulo de inclinação. O ideal é 0,999 para o ângulo estimado pelas leituras do giroscópio integrado e 0,001 para o ângulo medido pelo acelerômetro.
  • Não considerei que o pitch se transforma em roll e vice-versa se o drone inclinado for girado em torno de seu eixo z local.
  • As oscilações muito lentas do ângulo de inclinação podem ser corrigidas aumentando o coeficiente P várias vezes, em vez de diminuí-lo, como sugerem algumas fontes.



Em algum momento do processo de desenvolvimento, fiquei frustrado com o número de fios entre os módulos e a maneira como foram colocados. Então decidi investir algum tempo na habilidade de fazer PCBs personalizados. Pensei nisso por muito tempo, mas desanimei com a necessidade de comprar ferramentas caras e lidar com produtos químicos.


Na verdade, ficou mais fácil do que eu pensava, assisti alguns tutoriais do KiCAD para criar o desenho da minha placa de circuito impresso. Comprei uma impressora a laser de segunda mão por 40$, comprei também um ferro comum sem furos por 5$, e a ferramenta mais cara foi uma furadeira por 75$. Os produtos químicos acabaram não sendo tão perigosos, eles não dissolvem sua pele se você tocá-los.


desenho em KiCAD

depois de gravar e aplicar máscara de solda


Então eu fiz este PCB na quarta tentativa. A parte mais difícil foi aplicar a máscara de solda. O que este PCB faz é interconectar sensores, ESP32 e Raspberry Pi e fornecer a voltagem apropriada para diferentes partes.


Os gráficos sofisticados que mostram as leituras atuais do sensor no aplicativo acabaram sendo difíceis de analisar ao tentar evitar que o drone caísse. Então, adicionei a capacidade de gravar os dados do sensor e escrevi um script python para analisá-los quadro a quadro com o registro de vídeo do voo.

script do analisador de voo


Se eu tivesse feito isso antes, teria gasto muito menos tempo investigando problemas causados pelo sensor ultrassônico defeituoso que mencionei anteriormente.


Em algum momento, alcancei altura, direção e controle de nivelamento horizontal relativamente estáveis, mas ainda não consegui evitar o desvio horizontal. E se alguém souber se é possível se livrar da deriva horizontal usando apenas sensores IMU, por favor, deixe-me saber nos comentários.


Fiz algumas pesquisas e descobri que alguns drones usam GPS para manter a posição e tentei implementar a mesma técnica. Mas o problema é que só funciona fora, mas mesmo fora não consegui resultados satisfatórios. O tempo estava péssimo naquela estação com vento, chuva e neve, então não fiz muitas tentativas, recuperei o GPS e tentei uma abordagem de visão computacional.


esboço de um script que rastreia a marca azul


Coloquei uma câmera na parte inferior do drone e tentei segurar essa marca azul no chão usando a biblioteca OpenCV. Depois de várias tentativas e ajustes aqui está o resultado:


https://www.youtube.com/watch?v=poqQmvoBlP8

Agora ele pode pairar em um ponto sem controle manual e sem cordas. Este era meu objetivo intermediário que finalmente alcancei, então decidi documentar e compartilhar meu progresso.



Também adicionei a transferência de um fluxo de vídeo do drone para o aplicativo, então agora posso experimentar a visão computacional para tentar diferentes abordagens para manter a posição geral sem marcas especiais no chão e fazer outros recursos.




Na configuração atual, o drone é feito assim: o ESP32 é responsável pelo controle de altura, direção e nivelamento. Leva dados de sensores IMU e um sensor de distância a laser na parte inferior. Ele dá comandos aos controladores do motor e também recebe comandos do raspberry pi, que é responsável pela comunicação com o aplicativo e controle de posição usando dados da câmera.


Se alguém estiver interessado em ver o código

parte ESP32

Parte Raspberry Pi

aplicativo android cliente


O código não está muito limpo, pois alterei a implementação com frequência tentando fazê-lo funcionar corretamente. Talvez eu limpe isso no futuro :)


Além disso, fiz um vídeo sobre isso:

https://www.youtube.com/watch?v=3mAFEW0YOJ0


Agradecimentos para sua atenção! Felicidades!