Etapas do Projeto BeachCleaner
Fases de desenvolvimento do projeto BeachCleaner
Introdução
Um grande problema para a sociedade moderna está no processo de coleta e tratamento dos lixos, vivemos em um cenário no qual a presença de lixo nas ruas, calçadas, praias, parques, entre outros lugares, se tornou comum para os olhares humanos. Para Maria Christina B. de Araújo e Mônica Ferreira da Costa, os dejetos nos oceanos são depositados por pessoas há muito tempo, pois, infelizmente uma parte da sociedade vive em uma utopia no qual acreditam que esse vasto recurso é inesgotável e consegue manter sua integridade mesmo com a imensa quantidade de materiais depositado pelo homem. Por mais que exista uma certa conscientização por parte da população, sempre existem os OutLiers (termo usado em inteligência computacional para representar pontos que se destacam por não seguirem um padrão em uma representação geométrica), a criação de um agente capaz de limpar as ruas de forma inteligente e segura se torna cada vez mais possível diante a evolução da tecnologia.
Este projeto está sendo efetuado no centro universitário FIAP (Faculdade de Informática e Administração Paulista) pela gerente de projetos Giulia Bussmann que atua também na parte mecânica do projeto juntamente com Arthur Madureira, Guilherme Cunha, liderando a parte eletrônica do projeto, Gustavo Maedo, trabalhando na parte de programação em geral e Gustavo Yamashita e Henrique Evangelista atuando na parte de Inteligência Artifical/Computacional com Visão Computacional.
Resumo da história do projeto
O projeto do Beach Cleaner começou no ano de 2019, por cinco integrantes da turma
da manhã do primeiro ano da engenharia mecatrônica, todos do centro universitário FIAP. O objetivo desse projeto foi criar um
robô que coletasse lixo nas praias, logo, nesse primeiro protótipo, desenvolveu-se um maquinário capaz de coletar certos tipos de dejetos por meio de uma esteira coletora. O lixo percorria a esteira e caía para
dentro de um triturador – onde era então triturado - e depois guardado dentro de um compartimento localizado de baixo desse mecanismo. Tudo isso, controlado manualmente via
bluetooth por um aplicativo em um celular Android.
O grupo sofreu uma mudança de integrantes de 2019 para 2020, mas a ideia desse
ano foi de continuar com o projeto Beach Cleaner – o que chamamos agora de “Beach Cleaner
2.0” – e dar um upgrade nele, melhorando o sistema de coleta, a estrutura e o design, além de deixa-lo autônomo, tanto a parte da identificação do lixo e ativação do sistema de
coleta quanto a parte da movimentação. Dividimos então o grupo em três pilares, sendo um
a movimentação, outro a identificação do lixo e a terceira, a estrutura, portanto, cada pilar
teve as suas etapas de desenvolvimento.
Objetivo
O projeto consiste na produção de um robô autônomo, com visão computacional, capaz de detectar objetos em tempo real, o desenvolvimento conta com um sistema de mapeamento da movimentação do robô, para uma locomoção automata e autônoma. Esta proposta foca em um projeto capaz de melhorar o ambiente no qual vivemos, aplicando uma tecnologia que pode ser utilizada para um mundo mais ecológico. A equipe preza a avaliação dessa iniciação para poder apresentar a proposta no evento NEXT (evento de tecnologia) da FIAP, como também a criação de um artigo científico ministrado por algum(a) professor(a) doutor(a).
Ferramentas utilizadas
Para o desenvolvimento do projeto as seguintes ferramentes foram utilizadas:
- Programação na linguagem PYTHON, C ARDUINO, SHELL SCRIPT e FLUTTER.
- IDEs (ambiente de desenvolvimento) PyCharm, Anaconda, Arduino e Flutter.
- Bibliotecas utilizadas, OpenCV (tratamento de imagens e visão computacional), Dlib (visão computacional), TensorFlow (visão coputacional) e APIs Google (Inteligência Artificial/Computacional), Kit Firebase (para Machine Learning/Aprendizado de Máquina).
- Placa Arduino Mega (para eletrônica, sensors, motores, ect) e placa RaspBerry Pi 3 (para desenvolvimento da visão computacional).
- Notebook com suporte para visão computacional e inteligência Artificial/Computacional.
- Uma WebCam (para visão computacional), cabos de conexão para a eletrônica (conhecidos como Jumpers), sensores para detecção de distância (podendo ser infravermelhos, ultrassônicos ou a lasers), Shields (placas para motores), motores (podendo ser DCs ou de passos), um Micro SD (memória do raspberry).
- O corpo do robô utiliza partes produzidas em impressoras 3D (disponibilizadas pela FIAP).
- Ferramenta de geometria e matemátiva GeoGebra.
- Modelagem 3D utilizando SolidWorks.
- Conexão estável com internet e energia (baterias ou tomadas).
Fase da movimentação
Inicialmente a programação foi feita utilizando um algoritmo que não preza a autonomia do robô, efetivando então uma movimentação pré-programada para fins de pesquisa. A ideia se baseava em utilizar motores de passo, para quantificar a possível movimentação do robô, conseguimos montar um código, com uma rota pré-programada. Tendo isso feito
e funcionando, implementaríamos sensores (podendo ser infravermelhos, ultrassônicos ou a laser) e adicionaríamos no
código a detecção de objetos e uma reação de desviar deles e voltar à rota principal. Com
esse passo dado, acrescentaríamos um módulo gps para ele começar a se localizar e a partir
dai, trabalharíamos para transformar a pré-programação em algo mais autônomo de fato.
Para começar com esse processo então, usamos 4 motores de passo 28BYJ-48 com o
driver ULN2003. O nosso primeiro passo, com eles em mãos, foi fazer os quatro andarem para
frente e para trás – para entendermos bem como eles funcionavam. Porém, logo enfrentamos
três empecilhos: uma, na alimentação dos quatro motores, a outra, em fazer os quatro
motores girarem em sincronia e a terceira, na velocidade deles – eles eram extremamente
lentos, por terem um torque maior. Decidimos então, mudar o tipo de motor da
movimentação, substituindo o motor de passo por um motor DC com Encoder, a fim de
continuar sabendo quantos giros que o motor daria. Adaptamos o código que tínhamos feito
para os motores de passo para ele funcionar nesse motor novo. Mas, para comprar o modelo
de motor certo, precisávamos saber o peso máximo do robô, desta forma, a etapa de Estrutura do robô se demonstra de alta importância.
Código para os motores de passo
O seguinte código foi programado em C arduino, talvez sua representação fique bagunçada devido a problemas de formatação do site (código realizado por Gustavo Yamashita).
//Posicao dos motores!!!/*Motor1-----------Motor2 *| N | *| | *| O L | *| | *| S | *motor3-----------Motor4 */ //Codigo nao autonomo do robo /*Precisa definir quantos passos o motor deve dar para andar para frente, * por exemplo: o motor deve andar x metros para chegar ao seu destino, mas * quantos passos equivale a x metros? Para isso, iremos imaginar a distancia * que ele precisa percorrer como "D", logo, quantos X ele precisa andar? e * quantos passos equivale a X? */ //Definindo X para passos para frenteint xpassos = 0; //Definindo Y para passos para trasint ypassos= 0; //Definindo angulo de giroint anguloDeGiro = 0; //Definindo Passos que devem ser dado para frenteint frentesNecessarias = 0; //Definindo Passos que devem ser dado para trasint resNecessarias = 0; //Definindo movimento total necessariosint movimentosNecessarios = 0; //Criando lista para movimentosint listaMovimentos[999]; //Variavel movimentoint movimentoUnidade = 0, movimentoDezena = 0, movimentoCentena =0; //Char do comandochar comando; //Definindo as portas//Portas do motor 1#define motor1p1 2 #define motor1p2 3 #define motor1p3 4 #define motor1p4 5 //Portas do motor 2#define motor2p1 6 #define motor2p2 7 #define motor2p3 8 #define motor2p4 9 //Portas do motor 3#define motor3p1 10 #define motor3p2 11 #define motor3p3 12 #define motor3p4 13 //Portas do motor 4#define motor4p1 14 #define motor4p2 15 #define motor4p3 16 #define motor4p4 17 #include <Stepper.h>//Definindo const int como citypedef const int ci; //Valor de passos por volta, !DEVE SE VERIFICAR!ci passosPorVolta = 2050; //Variavel velocidade dos motoresint motor1v = 0, motor2v = 0, motor3v = 0, motor4v = 0; //Instanciando o motor de passo e configurando pinosStepper motor1(passosPorVolta, motor1p1, motor1p2, motor1p3, motor1p4); Stepper motor2(passosPorVolta, motor2p1, motor2p2, motor2p3, motor2p4); Stepper motor3(passosPorVolta, motor3p1, motor3p2, motor3p3, motor3p4); Stepper motor4(passosPorVolta, motor4p1, motor4p2, motor4p3, motor4p4); void setup() { motor1.setSpeed(motor1v); motor2.setSpeed(motor2v); motor3.setSpeed(motor3v); motor4.setSpeed(motor4v); Serial.begin(9600); }//Fim setup void loop() { int i = 0; Serial.println("Bem Vindo ao controle manual do robo"); Serial.println("Inicializando sistemas..."); Serial.println("Quantos movimentos sao necessarios? 0 a 999"); //valor da centena while(Serial.available()==0); movimentoCentena=Serial.read(); movimentoCentena=(movimentoCentena-48)*100; //valor da dezena while(Serial.available()==0); movimentoDezena=Serial.read(); movimentoDezena=(movimentoDezena-48)*10; //Valor da unidade while(Serial.available()==0); movimentoUnidade=Serial.read(); movimentoUnidade=movimentoUnidade-48; movimentosNecessarios= movimentoCentena + movimentoDezena + movimentoUnidade; //Inprimindo quantidade de movimentos for(i = 0; i <= movimentosNecessarios; i ++){ Serial.print("movimento "); Serial.println(i); } //Definindo movimentos for(i = 0; i <= movimentosNecessarios; i++){ Serial.print("Qual o movimento "); Serial.print(i); Serial.println("?"); while(Serial.available()==0); comando = Serial.read(); listaMovimentos[i] = comando; } for(i = 0; i <= movimentosNecessarios; i++){ Serial.println(listaMovimentos[i]); switch (comando) { case 102: andarParaFrente(); case 116: andarParaTras(); case 100: andarParaDireita(); case 101: andarParaEsquerda(); } } }//Fim loop void andarParaFrente(){ int i = 0; //Quantidade de vezes que o motor deve fazer esses passos for(i=0 ;i <= frentesNecessarias;i++){ motor1.step(xpassos); motor2.step(xpassos); motor3.step(xpassos); motor4.step(xpassos); }} void andarParaTras(){ int i = 0; //Quantidade de vezes que o motor deve fazer esses passos for(i=0; i <= resNecessarias; i++){ ypassos = ypassos * (-1); motor1.step(ypassos); motor2.step(ypassos); motor3.step(ypassos); motor4.step(ypassos); }} void andarParaDireita(){ int i = 0; for(i=0; i = anguloDeGiro; i++){ ypassos = ypassos * (-1); motor1.step(xpassos); motor2.step(ypassos); motor3.step(xpassos); motor4.step(ypassos); }} void andarParaEsquerda(){ //instrucoes para andar para esquerda int i = 0; for(i=0; i = anguloDeGiro; i++){ ypassos = ypassos * (-1); motor1.step(ypassos); motor2.step(xpassos); motor3.step(ypassos); motor4.step(xpassos); }} void angulo_direcao(){ //instrucoes do angulo de giro} void passosMotor(){ //Nada a declarar ainda}
Imagens do protótipo com os motores de passo
![]() |
Imagem própria do autor, montagem feita por Guilherme Cunha |
![]() |
Imagem própria do autor, montagem feita por Guilherme Cunha |
Fase da estrutura
Diante projetos anteriores, ficou evidente a necessidade de um planejamento e desta maneira, o pilar da Estrutura está sendo analisado e pensado utilizando ferramentas como GeoGebra, matemática estrutural e programas para testes em 3D da estrutura.
Os objetivos desse pilar são:
- Criar um mecanismo de coleta;
- Garantir que a movimentação será feita de forma eficiente, pensando nos tipos de rodas e seus posicionamentos ideais no robô;
- Ter um design bonito e limpo;
- Minimizar o peso e material usado;
- Ter um design prático para a manutenção das partes mecânicas e eletrônicas;
- Ter uma estrutura firme e ter uma proteção das partes eletrônicas do ambiente externo,
Imagem própria do Autor, desenho feito por Giulia Bussmann |
Imagem do autor, Desenho feito por Giulia Busmann |
O design foi primordialmente inspirado no formato de uma tartaruga (já que tais criaturas possuem uma fisiologia para a movimentação em ambiantes arenosos), mas com o tempo, ocorreram adaptações para o desenho da figura acima. O coletor foi pensado de
uma forma para garantir que o lixo seria capturado de uma forma simples – uma vassoura
giratória na frente, movimentando no sentido horário, jogando o lixo diretamente para dentro de
uma caixa que serviria como um “reservatório”. Para isso, a face da caixa que encosta
na vassoura seria móvel, abrindo somente para dentro, garantindo
que o lixo entrasse, mas não saísse. Além disso, os componentes eletrônicos
ficariam localizados na parte superior do robô, pensando na praticidade para a manutenção
deles, sendo cobertos por uma tampa que completaria o visual exterior – sendo “camuflada” com a carcaça do robô. Os motores de movimentação seriam fixados na parte
inferior do chassi, para garantir também a facilidade de manutenção e garantir o
alinhamento de todos. O chassi, por sua vez, na parte da frente, teria uma placa inclinada que
serviria de apoio para o lixo coletado pela vassoura. Finalmente, a webcam ficaria localizada na parte externa do robô, em um apoio, em cima da vassoura giratória.
Tendo claramente em mente como que seria o design desse robô e onde cada
estrutura ficaria, fomos para a etapa seguinte, na qual definimos as dimensões certas de cada
parte, pensando em seus encaixes. Para isso, cada parte que compõe a estrutura, separado
por cor na figura acima, foi pensado separadamente. O intuito dessa etapa, além de definir
as dimensões, era de também calcular o peso máximo do robô, e para isso, após ter as
dimensões definidas, foi calculado a área de cada face. Sabendo a espessura de cada uma, foi
possível então, calcular os seus volumes. E tendo a densidade do material que seria usado,
conseguimos calcular a massa do robô e assim, seu peso. Nessa etapa, por terem algumas
faces curvas, para calcular a área foi utilizado técnicas de cálculo integral. Tendo isso feito, o próximo passo seria passar esses desenhos para o Solidworks,
garantir que está tudo certo por meio da montagem desse software e finalmente, imprimir
em 3D, cortar as peças em mdf para fazer a montagem de verdade da estrutura.
Fase Identificação do Lixo
Diante pesquisas realizadas com visão computacional para a detecção de objetos (Link da pesquisa, feita por Gustavo Yamashita), obtivemos sucesso neste processo, porém o desafio de fato está em utilizar esses algoritmos em um sistema embarcado, que possui de certa forma um poder de processamento bem inferior ao equipamento que foi utilizado nos testes anteriores. Outro detalhe importante está por meio de uma inteligência artificial aprimorar os processos de detecção e reconhecimento dos objetos.
Duas abordagens foram pensadas para esta etapa do projeto, uma proposta por Gustavo Yamashita e outra proposta por Henrique Evangelista.
Acessando o Link apresentado anteriormente, é possível entender como a identificação de objetos (ou lixos) foi realizada utilizando uma Webcam, linguagem Python e a biblioteca OpenCV.
Duas abordagens foram pensadas para esta etapa do projeto, uma proposta por Gustavo Yamashita e outra proposta por Henrique Evangelista.
Acessando o Link apresentado anteriormente, é possível entender como a identificação de objetos (ou lixos) foi realizada utilizando uma Webcam, linguagem Python e a biblioteca OpenCV.
Visão Computacional
Para a identificação de objetos, utilizamos uma técnica de Machine Learning (Aprendizado de Máquina), o algoritmo utilizado se baseia na criação de um vetor que separa "Classes" (Algortimo SVM), esse algoritmo possui grande eficácia, mas necessita de um equipamento com um grande poder de processamento para que a detecção seja feita de forma precisa e sem travamentos.
Diante outras pesquisas, foi observado um outro algoritmo para a detecção de objetos, que pode posteriormente ser utilizado pela equipe, já que o mesmo necessita de um poder de processamento bem inferior (trata-se do algorimo haarcascade). Esse algoritmo ainda está em fase de testes pela equipe, mas possui um grande potencial para substituir o SVM (Máquinas de Vetores de Suporte).
Diante outras pesquisas, foi observado um outro algoritmo para a detecção de objetos, que pode posteriormente ser utilizado pela equipe, já que o mesmo necessita de um poder de processamento bem inferior (trata-se do algorimo haarcascade). Esse algoritmo ainda está em fase de testes pela equipe, mas possui um grande potencial para substituir o SVM (Máquinas de Vetores de Suporte).
Exemplo do código utilizado:
![]() |
Código de visão computacional criado por Gustavo Yamashita |
Resultado do Algoritmo, com detecção em tempo real:
Segue um vídeo com a detecção da marca Dolly.
Um outro possível aprimoramento para o projeto está na coleta de dados enquanto o robô ronda alguma determinada região, por exemplo, medição de temperatura, velocidade do vento, luminosidade, densidade do solo, detecção de pessoas e objetos. Com essa coleta de dados, seu uso pode ser interessante para futuras pesquisas ou projetos.
Segue um vídeo com a detecção da marca Dolly.
A segunda abordagem estudada por Henrique Evangelista resume-se nos seguintes pontos:
⦁ O treinamento do(s) modelos de machine learning necessários devem ser feitos em nuvem
⦁ A captura das imagens por meio de video e o seu posterior processamento devem ser feitas por um celular
⦁ O periférico responsável pelo gerenciamento dos dados pré processados de imagens será uma Raspberry PI.
Para essa abordagem, os seguintes equipamentos e ferramentas foram utilizadas.
1 – Celular: responsável por capturar as imagens em vídeo e localizar os objetos classificados como “lixo”, mandando para o Raspberry PI os seus dados pertinentes (localização por exemplo).
2 – Raspberry PI: Responsável por receber os dados dos objetos localizados pelo celular e enviá-los para os demais dispositivos presentes no projeto.
3 – Google Cloud: Recebe dados pertinentes da Raspberry PI e os armazena (status dos motores, quantidade de objetos localizados, localização de cada objeto etc...) em um banco de dados para uso posterior.
4- Website: Site/Dashboard online responsável por exibir de forma inteligível os dados coletados pelo robô Beach Cleaner.
5 – Motores: Motores que serão usados no robô. Receberão e enviarão dados para a Raspberry PI.
6 – Sensores: Sensores que serão usados no robô. Receberão e enviarão dados para a Raspberry PI
1 PARTE – Contrução do app responsável por localizar os objetos através da câmera do celular.
Foi criado então um protótipo de app em Flutter que avalia as chances (em %) de um objeto capturado por uma câmera ser um copo descartável ou uma latinha (tipo latinha de refrigerante).
![]() |
Resultado obtido por Henrique Evangelista |
Possíveis aprimoramentos no projeto e próximos passos
Essa fase segue apenas como algumas sugestões de melhorias e aplicações do projeto, caso as fases anteriores tenham sido atendidas no decorrer desse ano.
Detecção Facial
Uma possível atualização na visão computacional para a detecção de faces humanas pode ser feita para aumentar a segurança das pessoas com o robô (se o robô detectar um rosto humano, suas tarefas devem ser paradas para não prejudicar algum humano), o Algoritmo de detecção já está sendo utilizado e testado, segue alguns exemplos dos testes:
Testes realizado por Gustavo Yamashita:
![]() |
Imagem do Autor - detecção facial |
Coleta de Dados
Um outro possível aprimoramento para o projeto está na coleta de dados enquanto o robô ronda alguma determinada região, por exemplo, medição de temperatura, velocidade do vento, luminosidade, densidade do solo, detecção de pessoas e objetos. Com essa coleta de dados, seu uso pode ser interessante para futuras pesquisas ou projetos.
Inteligência Artificial
Atualmente, o uso de sistemas mais inteligentes está sendo aplicado de forma agressiva por diversas empresas, para Kai Fu Lee, o avanço das aplicações da Inteligência Artificial vão mostra ao Mundo que tal tecnologia vai dominar todos os setores do planeta, seja de uma rede de transporte compartilhado (Uber por exemplo) até uma empresa de carros autônomos (Exemplo a Tesla).
Análises estão sendo feitas para uma possível aplicação de IA (Inteligência Artificial) no projeto, em fase inicial apenas, mas, que pode gerar um grande avanço nas tarefas do robô.
LinkdIn dos envolvidos
- Gustavo Yoshimi Yamashita: https://www.linkedin.com/in/gustavo-yamashita/
- Giulia Bussmann: https://www.linkedin.com/in/giulia-bussmann-688b17179/
- Henrique Evangelista: https://www.linkedin.com/in/henriqueevangelista/
- Guilherme Cunha: https://www.linkedin.com/in/guilherme-cunha-25a4a0149/
- Gustavo Maedo: https://www.linkedin.com/in/gustavomaedo/
- Arthur Madureira: https://www.linkedin.com/in/arthur-madureira-barboza/
Referências Bibliográficas
CRAIG, John J. Robótica. Tradução de Alfonso Vidal Romero Elizondo. 3.ed. Person Education, México, 2006.
LEE, Kai Fu. Inteligência Artifical. Tradução de Marcelo Barbão 1.ed. Globo S.A, Rio de Janeiro, 2019.
Mônica Ferreira da Costa e Maria Christina B. de Araújo. Lixo no ambiente marinho. http://www.globalgarbage.org/lixo_no_ambiente_marinho.pdf.
Comentários
Postar um comentário