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)
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.
Meu primeiro robô foi esta plataforma de lagarta:
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.
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.
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.
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.
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:
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.
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.
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.
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
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!