domingo, 10 de fevereiro de 2013

Blog Movido, melhorado e atualizado!



Olá Caros leitores!

Venho informar, que este blog foi renomeado e movido para www.tendadigital.net

A razão disso, é melhorar a cara, funcionalidade e remover o nome "Lego", já que os projetos evoluiram, e não são mais "só" Lego, como muitas coisas legais.

Espero que gostem do novo layout, e do novo nome também! Tenda Digital

Abraços, e vejo vocês por lá!

Ivan Seidel Gomes

domingo, 19 de agosto de 2012

While(1) Circuitos impressos para garagistas




Olá pessoal, fiquei ausente do blog durante 1 mês e pouco, justamente porque estive trabalhando em um projeto diferente (vários projetos para falar a verdade, mas focado neste "novo").

Desde que comecei a mexer com eletrônica, percebi que uma das coisas que mais faltam aqui no Brasil, é criação de circuitos impressos de qualidade e de fácil acesso para garagistas. Isso já me fez gastar muitas horas fazendo e refazendo em casa circuitos simples, e que não duram nem 1 mês se deixados em cima da mesa por corrosão, oxidação...

Conheci alguns fornecedores fora do Brasil, que fazem esse tipo de serviço, mas precisaria de várias pessoas, para que se tornasse "acessível" para nós.

Foi no mês passado que resolvi montar com meu primo, uma empresa de importação de placas de circuito impresso, voltada totalmente à garagistas como eu, e você que esta lendo este post.



Demos o nome de While(1), e deixamos o site o mais simples possível e sem barreiras de burocracia para enviar os arquivos do circuito, tanto que o orçamento é feito na hora, on-line. Você pode enviar, visualizar e comprar com alguns passos apenas.



Vale a pena conferir: www.while1.com.br

Temos também uma página no Facebook, curtam e compartilhem a vontade: http://www.facebook.com/while1br

Um abraço, e espero que ajude o máximo de garagistas! (já esta me ajudando, e muito!)

terça-feira, 10 de julho de 2012

Melhor robô do mundo no Rescue B!

Escrevi (bastante aqui, aqui e aqui) sobre o tal robô para o RescueB no méxico, mas este post é especial pois conquistamos o primeiro prêmio na apresentação do projeto e construção do robô usado na categoria Resgate B da RoboCup Junior 2012, realizada de 18 a 24 de junho na Cidade do México!

Fiz um vídeo com algumas fotos e filmes do robô em ação. Espero que gostem!


No total, 19 equipes de diversos países (como Japão, Alemanha, Itália, Suécia, Irã, entre outros) participaram desta mesma categoria. Além do prêmio de melhor robô do mundo, a Emerotecos também obteve o quarto lugar na competição individual de equipes do Resgate B e o terceiro lugar na competição de supertimes na mesma categoria, competindo junto com a equipe da Eslovênia. Na prova de supertimes, duas equipes se unem (escolhidas por sorteio) para programarem seus robôs realizarem a tarefa de resgate de forma cooperativa.

Nossa equipe com a da Eslovênia recebendo o troféu de terceiro lugar na competição de supertimes.
A Equipe Emerotecos é uma formada pelos alunos do IFES André Oliveira, Gabriel Guimarães, Ivan Seidel (eu) e Matheus Canejo da Cunha, todos alunos do ensino médio integrado a cursos técnicos do Campus Vitória (dois são do curso de Mecânica e dois são de Eletrotécnica). A equipe está vinculada ao NERA - Núcleo de Estudos em Robótica e Automação, e é orientada pelos professores Hudson Cassio Oliveira (da coord. de Mecânica do Campus Vitória) e Felipe Nascimento Martins (coord. de Engenharia de Controle e Automação do Campus Serra).

Após a competição, os participamos do Workshop de Robótica Educacional, parte do Simpósio da Robocup, onde apresentaram o trabalho Design and Implementation of an Android-Based Omnidirectional Robot for the RoboCup Junior Rescue B Competition, que trata do desenvolvimento de seu robô (veja aqui o programa do simpósio). Felipe nosso técnico, também teve a oportunidade de apresentar um trabalho no mesmo simpósio, falando sobre as atividades de robótica educacional desenvolvidas pelo NERA.



Gostariamos de agradecer às instituições e às pessoas que proporcionaram nossa viagem para participar da RoboCup 2012! Em especial, agradecemos às empresas Nova Didacta, Use Móveis, Proesi, Copy Express, Productiva-Hailtools, InTechno e Qualidata. Agradecimentos especiais aos professores Ricardo Paiva e Tadeu Pissinati, do IFES, por seu esforço em sempre ajudar a equipe, e à professora Carmen Faria, da UFES, por sempre nos incentivar e motivar. Também agradecemos aos demais professores do IFES e a todos os amigos e companheiros de competição pelo apoio, companhia e amizade!

Mais informações estão disponíveis aqui:

segunda-feira, 25 de junho de 2012

Longa viagem, grandes avanços


Neste sábado iniciamos nossa “jornada” rumo ao México, para participar do campeonato mundial de robótica junto com várias outras equipes do mundo na RoboCup 2012.

Postei anteriormente sobre a mecânica do robô, e seguido de uma explicação sobre a eletrônica. Agora entra a parte da programação, que não escrevi ainda pois não tinhamos muitas coisas concretas.

A viagem

De Vitória - ES para o Rio, para Lima (Peru) e finalmente, México! No total darão 26h de viagem, e foram as horas em que mais trabalhamos!

O evento começará terça feira e terminará domingo, dando um tempo a mais para aparar as pontas do robô (e dar muitos nós também!)

O Programa


Viramos a noite no Rio, programando a parte lógica e até mesmo mecanica do robô, mas focamos bastante no software, que irá rodar no Android.

Como já expliquei aqui, escolhemos o uso do android pois é leve, hiper rápido, possui uma tela com resolução maior que minha TV, e é touch screen. Fazer logs, visualizar sensores, modificar configurações, é tudo mais rapido quando se pode acessar qualquer configuração com 2 toques! (e haja configuração...)

O código do android é feito em Java, e até agora, temos 32 Classes criadas, totalizando 13 mil linhas de código. Sim, tudo escrito do zero...

Os Algoritmos

De forma geral vou tentar explicar para vocês oque fizemos na parte de programação no robô. Qualquer duvida ou dicas são sempre bem vindas!

Alinhamentos

Se manter no meio do labirinto parece fácil... Mas não é bem assim!

Se manter, no meio do labirinto é uma questão de pequenos ajustes na direção do robo, e na posição ao longo do percurso. Imagine você girando de olhos fechados 30 vezes, depois como saberá onde estava a “frente”?

Justamente por isso, a mecanica do robô permite que ele faça varias medidas de distâncias mesmo estando parado, graças a “cabeça giratória”, que suporta nossos sensores de infravermelho de distância, podemos efetuar qualquer medida com precisão de 1 grau em torno do robô.

Imagine, depois, você transformar isso de cordenadas polares (angulos e distancias), para pontos em um plano cartesiano? Fica exatamente assim:


Quando chegamos em qualquer “célula” (quadrado do labirinto), temos que ajeitar o robô nele, para que esse “errinho” não se integre, e fique absurdo no futuro.

Se ajeitar na posição x, y, e o angulo do robô é o ideal, e por isso desenvolvemos um algoritmo que ache o erro angular do robô com apenas 2 medidas de cada possivel parede ao seu lado!

O que vou falar para vocês, foi o resultado de vários testes de algoritmos, dentre eles: achar a menor distância; calcular a tendencia do angulo da linha; e o que escolhemos: transformar de cordenadas Polares, para coordenadas cartesianas, e descobrir o angulo da linha baseado no deltaX e deltaY.

Ele transforma 2 medidas, com angulos de 20, e -20 graus, em uma “linha” no plano cartesiano, e descobre seu angulo em relação à 90 graus. Isso explica um pouco do como funciona:


De acordo com o “erro” angular do robô, essa linha tende para um lado ou para o outro do robô. A “ajeitadinha”, ocorre até duas vezes dependendo do quanto errado o robô está, já que pode haver falhas na leitura do sensor.

Depois que achado o angulo perpendicular a parede, é facil se acertar nos eixos X e Y. Sabemos que cada modulo do labirindo mede 30cm. os sensores medem de 0 até 80cm. Se subtrairmos os sensores opostos, e vermos o resto da divisão por 30, teremos exatamente o erro naquele eixo. Explicando melhor:

Olhe para sua esquerda, e meça a distancia até a parede. Olhe para sua direita e meça a distancia até a parede. Subtraia as duas distâncias e você achará o quanto esta “fora” do meio... Ver o resto da divisão, é apenas para se não houver uma parece ao lado e sim 30 cm depois, oque atrapalharia se não colocassemos o resto.

Mapeamento



Depois que se achamos o nosso erro e se ajeitamos, é hora de mapear!

O mapeamento do robô consegue se preciso o suficiente para ler um quadrado de 3x3 estando no centro dele.

Descobrir se existe uma parede no labirinto parece facil, mas na verdade são series de calculos de angulos (para mirar na parede certa), e probabilidades...

Probabilidades? Sim! Nenhuma parede nós guardamos como um valor Verdadeiro ou falso...

Usamos probabilidades, pois não é 100% de certeza, que o oque o robô esta vendo, é realmente o que esta lá... Por pequenos erros de imprecisão, ele pode muito bem mirar em outra parede, ou até mesmo fazer uma leitura errada do sensor de distância.

Usando probabilidade podemos dar “pesos” para as medidas que fazemos. As paredes mais próximas tem pesos maiores que as mais distântes, e por isso, ver uma parede de perto, importa mais que ve-la de longe!

Cada parede possui uma probabilidade de existencia. Todas iniciam em 0.5 (0% de certeza se existe ou não), 1.0 significa que temopos 100% de certeza de existencia, e 0.0 significa 100% de certeza de sua inexistencia. Assim, levamos em consideração também, a leitura de não haver parede, aumentando a probabilidade dela não existir.

Funcionou perfeitamente! fizemos vários testes, e se mostrou muito mais eficaz que usar um simples verdadeiro/falso.

Trajetos

Cada vez que o robô se ajeita, ele calcula usando um algoritmo de pesquisa por largura, para todas as celulas não visitadas, qual a célula em que ele consegue chegar em menos movimentos.

Executa o primeiro movimento desta “lista” de movimentos e em seguida volta a se ajeitar, e repetir o mesmo processo.

Isso resulta em algo muito legal: Ele muda a próxima célula, e o mapa cada vez que anda! Então não conseguimos saber exatamente oque ele irá fazer na proxima vez!

Vitmas

De fato, “achar” vitmas no labirinto é o que realmente vale pontos, mas é  a parte mais “facil”. Achar vitmas basta verificar se existe algo quente com os sensores infravermelhos de temperatura ao redor do robo em cada bloco que anda. Se sim, pisque um Led... Simples assim.

O que falta para terminar?

Muita coisa! Ainda não terminamos o robô, e como disse, noites foram, e serão viradas por isso.

Mesmo assim, com os resultados que vimos até agora, estamos confiantes de que dê certo! O robô esta bem inovador e bem robusto. Provavelmente com algumas modificações, será o robô do RescueB.

Soldar o sensor de luz, fazer os cabos do sensor de temperatura, concertar o PID dos motores, implementar a identificação da vitma e da rampa, adicionar algumas redundâncias e testar são coisas que ainda faltam fazer...

domingo, 13 de maio de 2012

Rescue B: Mecânica e Hardware

Postei anteriormente sobre o robô que estamos montando para participar do campeonato RescueB no México agora em Junho.

Daquele momento até agora ocorreram pequenas mudanças, e grandes avanços. Já estamos com todas as peças do robô em mãos, só falta literalmente colocar a mão na massa!

Mecânica
Cortamos a primeira "Versão" do robô em acrílico para ver todos os detalhes que passaram no projeto, e poder acertar tudo para uma segunda versão quase perfeita. Ainda semana que vêm cortaremos o robô novamente e teremos ele finalmente finalizado!


Tivemos que esperar um pouco mais para esta segunda verção pois tínhamos esquecido de um detalhe muito importante no robô: Como existem áreas pintadas de preto no labirinto que indicam "Não passe", precisaríamos de um sensor de luz abaixo do robô para fazer essa leitura, e até aquele momento, não sabíamos nem qual sensor usar, se seria um sensor infra vermelho, LDR ou uma câmera. Optamos pelo LDR pois funciona muito bem para distancias maiores que 5mm, já que a rampa poderia encostar no sensor na hora da chegada no topo.

Eletrônica
No post passado não expliquei muito detalhadamente como funciona a varredura dos sensores, nem onde esta cada sensor no robô, então vou aproveitar para passar o máximo que puder de nossas idéias que estão presentes no robô.


Como já falei, removemos o NXT por ser grande e muito pesado. No lugar colocamos um celular Android 2.4Ghz, com tela de toque, facilitando configurações, visualização de sensores, e até mesmo registro de informações (Log) de erros e ações para debugar.

É no Android, que instalamos um Aplicativo desenvolvido especialmente para o campeonato, e que terá toda lógica do robô, desde leitura de sensores, até locomoção através do labirinto. Por ser rápido (2.4Ghz) nos permite usar algoritmos mais sofisticados como SLAM, e aumentar a precisão de todos os sensores com filtros de Kalman rodando quase que na velocidade da Luz.

O celular Android comunica-se por USB com uma Placa de Interface, que não tem lógica nenhuma de programação, e só serve para fazer o "intercâmbio" de dados entre os sensores, e o Android. Bem como enviar as ações para a outra placa que faz o controle da velocidade dos motores. Os sensores plugados na Interface são vários, como: Temperatura, Distância, Luz, Botão de Stop. Além de um servo motor que falarei no final.

A placa "motora", é conectada na Interface por I2C, e faz todo o trabalho braçal de manter a velocidade em cada um dos quatro motores constante, mesmo em situações extremas, como descida da rampa, ou subida. Ela utiliza algoritmo PID separadamente em cada um dos 4 motores.

Sensores e Motores


Um dos grandes desafios de ter um robô autônomo, que precisa estimar sua posição e "montar" um mundo virtual do que esta captando com seus sensores, é que não funciona com apenas uma leitura de distancia. Robôs de competições mais avançadas, utilizam sensores de varredura laser para fazer isso, mas como não temos 15 mil reais sobrando (se vocês tiverem, aceitamos doações), tivemos que desenvolver nosso próprio  "varredor" a infra vermelho...

Basicamente, colocamos todos os sensores em cima de um servo motor, que consegue girar até 180 graus sem problemas. Nesta base giratória de sensores que fica em cima do servo, estão: 4 sensores de infra vermelho de distância, dois sensores infra vermelho de temperatura e o botão que usaremos para dar início e pausa ao programa, sem atrapalhar a leitura dos sensores. A lógica é a seguinte: gire o servo, e terá até quantas leituras quiser dos sensores, para ângulos diferentes relativo ao robô, sem ter que realmente "girar" o robô no próprio eixo, podendo derrapar, travar...

Da vez passada tivemos muitos problemas com os sensores de ultra som, já que só conseguem medir corretamente em superfícies quase perpendiculares a eles. Desta vez, usaremos sensores de Infra vermelho para medir distâncias, por funcionarem até em chuva de meteórios.

Próximos passos
Precisamos finalizar o robô e soldar as placas eletrônicas para dar fim à parte "mecânica" da coisa.
Feito isso terminaremos a programação de base do robô, com funções básicas de leitura, varredura, locomoção. Tendo a "base" feita em programação, é só alegria para implementar a lógica!

Até a próxima pessoal! Me digam se estão gostando dos posts, se quiserem saber mais sobre qualquer detalhe que não mencionei podem perguntar!

FLL World Festival e Open Florida

Mês passado tive a oportunidade de viajar com duas equipes de robótica da First Lego League, que conquistaram o prêmio de 1o e 3o lugar no Brasileiro à dois campeonatos que aconteceram em St Louis e na Flórida.

O campeonato durou 3 dias no primeiro, e 4 dias no segundo, foi uma oportunidade muito boa para conhecer equipes do mundo todo, como pessoas muito importantes: Dean Kamen, criador do Segway, e fundador da FIRST que organiza a FLL. Presidentes e diretores da Google, Boeing...


O campeonato envolve não só a construção e programação de um robô autônomo, mas também contam pontos uma pesquisa (que precisa ser inovadora) sobre o tema proposto no ano. O tema deste ano foi "Food Factor", que envolve a contaminação de alimentos no transporte até você.

Meu primeiro contato com robótica foi com este campeonato até 2010, onde nossa equipe (Emerotecos) participou do World Festival em 2009. Desta vez fui como apoio às equipes Rio Preto Robotic Team e Tecnobody, que ganharam os prêmios de 3o e 2o lugar em programação. Parabéns!

sábado, 7 de abril de 2012

Rumo ao México 2012: Rescue B


No mês de Junho nossa equipe Emerotecos irá para o México participar do campeonato mundial de robótica da RoboCup Rescue B.

Vou falar um pouco sobre esse "robô" que estamos fazendo, mas antes um pouco de como funciona o campeonato.


O campeonato

Exemplo de arena da competição

A competição em teoria, é a simulação de um resgate de vítimas em um prédio. O objetivo principal, é "resgatar" essas vítimas colocadas no "prédio".

A arena (foto) é composta por 2 andares, conectados por uma rampa. Em cada andar, são colocadas paredes verticais criando um labirinto. As vítimas que são aquecidas eletricamente são colocadas nas paredes desse labirinto, em qualquer lugar da arena, e em qualquer andar.

O robô começa em um lugar qualquer que o juiz queira, e o robô deve seguir autonomamente procurando as vítimas presentes, e quando achadas, deve "avisar" com alguma luz, que achou uma vítma.

A pontuação e detalhes da competição podem ser vistos aqui em ingles: http://goo.gl/PqrN9

O problema

Um dos maiores problema que lidamos, é achar TODAS as vítimas de forma mais rápida possível. O objetivo principal não é chegar na saída, e sim percorrer todas as paredes do labirinto para achar todas as vítimas possíveis. O número de vitimas não é divulgado, até que o robô entre na arena, bem como a "forma" do labirinto, só é sabido na hora do round.

Além de tudo, podem existir obstáculos irregulares no labirinto, oque dificulta locomover o robô no meio de tudo. E por fim, o robô não pode ficar por mais de 5 segundos em "dead-ends", que seriam rotas sem voltas, mostrados em cinza escuro na imagem.


O robô: mecânica


Este ano, estamos removendo inteiramente a necessidade do NXT. Eu amo esta plataforma, e acho ela muito boa de se trabalhar, mas para este caso, não teríamos espaço para usar os motores da lego, e o NXT com 6 pilhas ficaria pesado.

Optamos por criar do zero, um robô feito para o Rescue B (foto). Ele é feito por 2 camadas de acrílico 5mm, e vigas em baixo para sustentar o motor, e a eletrônica.

As rodas Mecanum, parecidas com o sistema omni-direcional, funciona do mesmo modo, mas pode ser montado de forma paralela (4 rodas), dando total liberdade de movimentação e giro para o robô, sem a necessidade de coloca-las em ângulos de 120 ou 90 graus.

O servo motor que fica no centro da segunda camada, suporta todos os sensores, dando a eles uma maior liberdade de "visão", e mais facilidade na hora de fazer as leituras.

O tamanho do robô é de 20x20cm, e sua largura máxima é 24cm (o espaçamento das paredes são de 30cm) permitindo ele girar no próprio eixo, sem tocar em nenhuma das paredes.

Preferimos utilizar Acrílico 5mm, pois já fizemos testes e constatamos que é resistente para este tamanho de peça, e super fácil de se fabricar (cortamos a Laser na CopyExpress), e possui precisão de centésimos de milimetro.

Todos os desenhos das peças foram feitos no SolidWorks, estas fotos são as renderizações feitas, e não o robô real, ainda!


O robô: Eletrônica


Sim, este é um celular! Como estamos pensando em usar algoritmos bem pesados este ano, e não queremos ter barreiras de processamento, resolvemos colocar um celular Android para processar tudo isso em tempo real. Android, pois podemos programar em Java sem problema algum, e ainda contamos com uma tela LCD, câmera, e claro, um painel de toque, perfeito para fazer configuradões iniciais e visualizar em tempo real oque ele "pensa".

Como o celular não consegue acionar os motores, ler os sensores de luz, temperatura, e controlar a posição dos encoders (leitura dos graus do motor), subdividimos em 3 placas basicamente.

Para alimentar todo o robô, incluindo sensores, motores e placas, colocamos uma bateria de lipo, 11.1v que consegue suportar até 65A de corrente, e é bem leve comparada a 6 pilhas (usadas no NXT).

Interface

Responsável por interligar o Android via USB com a placa IOIO, que por sua vez, comunicará com as outras duas placas responsáveis por Locomoção, e Sensoreamento.

Locomoção

Contamos com 4 motores, um para cada roda, já que o sistema omni-direcional Mecanum, necessita de um controle independente para cada roda. Cada motor possui uma força de 6kg, e consegue ler 3592 passos do encoder por volta do eixo final (redução de 75:1).

Para processar todos esses "passos" de motores, sem perda de nenhum deles devido a falta de processamento, colocamos uma placa MBED que possui um ARM Cortex M3, rodando a 100Mhz.

Esta placa seria também responsável por controlar a velocidade dos motores.
O protocolo que iremos utilizar, para ler os encoders da Interface, e setar as velocidades sera I2C Fast, visto que ambas suportam o modo "Fast".

A placa MBED, possui contador de encoder interno para somente 3 motores, logo precisaremos fazer para 1 motor a contagem via software (Se a NXP ler isso, poderiam colocar 4 da próxima vez!).

Sensoreamento

O algoritmo que vamos utilizar, necessita de varias medidas de distancia ao redor do robô, para isso colocamos nessa placa, um Arduíno, que ira controlar um servo motor, que movimenta todos os sensores do topo do robô. Rotacionando 90º, teremos 360º de medidas já que utilizamos 4 sensores de infra vermelho de distância, e 180º de leituras de temperatura (mais que o necessário).

Esta placa seria responsável por fazer as medidas, filtrar, e enviar para a Interface via I2C. Estamos pensando em talvez usar Serial comum.

IMU

Além de todos esses sensores, ainda temos uma "carta na manga".

Temos uma IMU (Inertial Measurement Unit) de 9 eixos. É basicamente uma unidade que possui: giroscópio de 3 eixos, acelerômetro de 3 eixos e magnetômetro de 3 eixos, dando ao robô um completo modo de saber com muita precisão, sua posição, e angulo em relação a todos os eixos.


O robô: Software


Ainda não temos nada concreto, de qual algoritmo vamos usar, sabemos que temos todas as ferramentas necessárias (Mecânica e hardware) para fazer oque precisarmos, mas não decidimos "como" vamos utilizar isso tudo, para conseguir se locomover e achar todas as vítimas no menor tempo possível.

Normalmente, escrevemos todo código em C, desta vez, utilizaremos o C para a placa de sensoreamento (Arduino Nano), C++ para a MBED, e Java (e C++) para o Android.


A viagem

Viajaremos de 16 à 27 de junho, temos já 2 passagens  doadas pela NovaDidacta, Cortes a Laser oferecidos pela CopyExpress e componentes eletrônicos da Proesi.

Precisamos de 30 mil para que isso tudo consiga chegar até o México, junto com:
Felipe Nascimento (nosso técnico), Hudson Cássio (nosso mentor), André Seidel, Ivan Seidel, Gabriel Lima e Matheus Canejo.