Mostrando postagens com marcador Robótica. Mostrar todas as postagens
Mostrando postagens com marcador Robótica. Mostrar todas as postagens

terça-feira, 12 de janeiro de 2016

Robótica: Telemetria & Comunicação Wireless

Atuei em um projeto recentemente em que seria utilizada telemetria analógica para realizar medições de veículos de corrida. Para isto, seria necessário a comunicação entre o dispositivo instalado no veículo com uma central de comunicação, ou seja, comunicação a distância sem-fio.

Utilizando o - sempre sutil - Arduino, consegui desempenhar a tarefa com sucesso, por meio de poucos componentes e com baixo custo, como irei explicitar a seguir.

Componentes
Os componentes utilizados para auxiliar no projeto foram:

  • ARDUINO MEGA 2560
    • foi designado para embarcar os sensores, o display e o transceptor;
    • modelo ideal pela quantidade de portas digitais e analógicas, o suficiente para poder embarcar todos os componentes necessários e poder armazenar memória o suficiente;
    • para alimentação, foi utilizada uma bateria comum de 9V;
Arduino Mega 2560

  • ARDUINO UNO
    • se assemelha ao modelo acima, com a diferença de ser menor, contendo menos portas analógicas, digitais e menos memória;
    • atuou como receptor dos dados da telemetria, conectado ao computador receptor dos dados, via cabo USB;
Arduino Uno

  • NRF24L01 WIRELESS TRANSCEIVER
    • o componente mais importante: o módulo de rede sem fio NRF24L01 é um transceptor fabricado pela Nordic e é uma excelente opção de comunicação wireless entre vários dispositivos, como: Arduino, PIC, Raspberry, BeagleBone entre outros;
    • algumas especificações:
      • alcance de 10 metros (ambientes internos) a 50 metros (campo aberto);
      • possui uma antena embutida que opera na frequência de 2,4GHz com velocidade de 2Mbps;
      • modulação GFSK;
      • habilidade de anti-interferência;
      • verificação de erros por CRC;
      • comunicação multi-ponto de 125 canais;
      • controle de fluxo;
      • tensão de alimentação pode variar entre 1,9 e 3,6V;
    • foram utilizados no total dois módulos: 
      • um NRF24L01 comum, acoplado ao Uno, e
      • outro adaptado com PA (amplificador de potência) e LNA (antena externa), acoplado ao Mega, para alcance de longas distâncias: estima-se 1km!
Módulo NRF24L01 e outro adaptado com PA+LNA

  • DISPLAY LCD
    • este componente realizou a apresentação dos dados lidos pelo Arduino;
    • foi utilizado o modelo 16x2 da fabricante Winstar, com backlight ajustável;
    • foi programado para atuar em tempo real, atualizando os dados de acordo com o interpretado pelos sensores e também com a função de alternar as informações mostradas na tela, por meio de um push-button;
Display LCD Winstar

Montagem

ARDUINO MEGA (TRANSMISSOR)
Do projeto e componentes apresentados na imagem acima, há algumas observações pertinentes a se fazer:
  • para o funcionamento correto do módulo wireless NRF24L01, o ideal é que se use um capacitor de 4.7 μF para o 3.3V do Arduino ou um regulador de tensão, se precisar utilizar alimentação de 5V, convertendo a tensão para 3.3V;
  • no caso de problemas com transmissão utilizando wireless com PA+LNA, uma alternativa é baixar a taxa de transmissão (testar a partir de aprox. 2400bps);
  • a montagem neste Arduino não segue o mesmo padrão dos demais, e deve ser realizado um mapeamento para converter a pinagem dos conectores, e ligar corretamente como mostrado no esquemático a seguir e na tabela de pinagens mais à frente;
  • o led ligado ao pino digital 8 é utilizado para informar visualmente que as mensagens estão sendo trnasmitidas: quando enviado um sinal ao outro transceptor, o led irá piscar;
  • o projeto foi desenvolvido utilizando os RFs com funções distintas - apenas como agente transmissor ou receptor, por sua vez; no entanto é possível utilizá-los como transceptores propriamente: realizar envio e recebimento de mensagens simultaneamente, ficando passível apenas de tratamento para o uso correto;
  • este Arduino possui capacidade para embarcamento de mais sensores; no caso do projeto em questão, os pinos analógicos de A0 a A15 ficaram reservados para embarcar o acelerômetro a ser desenvolvido posteriormente;
Montagem no Arduino Mega

ARDUINO UNO (RECEPTOR)
A montagem da ponta receptora da telemetria por sua vez é mais simples, como mostrada na imagem a seguir, contendo apenas a conexão com o transceptor e um led que, assim como no outro Arduino, irá piscar, mas desta vez, quando receber a mensagem.

Uma observação cabível no caso do receptor: neste caso foi utilizado o Arduino pois se desejava realizar as leituras no computador. Mas há alternativas de se utilizar o módulo RF sem Arduino, por meio de adaptardores FTDI USB, tais como o PIC18F2450 e o FT2232.

Montagem no Arduino Uno

TABELA DE PINAGENS
O mapeamento utilizado no projeto foi como o descrito na tabela a seguir:



NRF24L01 vs. Outros
Algumas considerações sobre outros módulos pesquisados e o porquê de ter escolhido o NRF24L01 para desempenhar o papel de comunicador wireless:
  • xBee
    • ótima qualidade porém inviável, tanto pelo preço pela quantidade de componentes necessários para o funcionamento completo no projeto em questão;
  • Apc220
    • posui ótimo alcançe e, em teoria, é simples de ser programado, porém o custo também restringe a viabilidade;
  • Módulos bluetooth
    • baratos e de usabilidade simples, porém curto alcance;
  • Módulos WiFi:
    • CC3000
      • dependência de instalação, configuração e componentes de infra-estrutura WiFi, além do preço ser um pouco salgados;
    • ESP8266
      • o mais barato e simplista na configuração de infra;
      • foi utilizado no projeto mas não funcionou 100%;
      • breve detalhamento a seguir;
  • ESP8266
Não cabe aqui uma descrição técnica aprofundada do módulo, mas ele basicamente se utiliza de redes wireless 802.11 b/g/n, enviando e recebendo dados nos modos AP (Access Point) e STA (Station).

Uma grande vantagem deste módulo é que ele possui um processador poderoso em sua placa, sendo capaz de integração com outros sensores e aplicações específicas, e podendo funcionar sozinho, por meio da configuração do firmware e do uso dos pinos GPIO, além de ser possível montar um webserver para monitoramento do módulo e de que não é necessário mais de um módulo para haver comunicação com o PC.

O módulo comprado apresentou muita instabilidade na montagem, pelo fato do módulo funcionar inteiramente em 3.3V (não apenas a alimentação, como também os demais pinos: RX, TX, CH_PD, RST e GPIO), e o único meio de fazê-lo funcionar foi utilizando o buffer não-inversor CD4050. A vantagem de usar este CI se dá por ser barato, fácil de encontrar, e fácil de utilizar: basta alimentar o circuito com 3.3V, e as entradas de 5V que ele receber serão então transformadas em 3.3V nas suas respectivas saídas. Além disso, usando um único buffer é possível trabalhar com 6 entradas passíveis de serem modificadas de 5V para 3,3V.

Dessa forma sua montagem e configuração foram realizadas com sucesso, porém a leitura das mensagens pelo monitor serial do Arduino não puderam ser ajustadas corretamente - foram testadas praticamente todas as combinações de baud possíveis.

  • NRF24L01
Por fim, este módulo representou a melhor alternativa, chegando a uma configuração estável e realizando a comunicação devidamente. Os testes iniciais se deram na forma de transceptor, utilizando o módulo para receber e transmtir sinais e comandos, simultaneamente. 

Foram testadas funções com push-button, servo motores, leds e acionamento de demais componentes, além da questão de distância: em campo aberto, o maior alcance funcional testado foi de 90m. Para funcionamento do módulo como transceptor, foi usado o conceito de mestre-servo. Para configurar um deles como o mestre, na configuração presente, passa-se um resistor entre um pino configurado no programa como input pull-up e o GND: dessa forma o programa procura por essa conexão para saber qual papel o módulo deve assumir. Não há problema em trocar, durante a execução, qual deles será o mestre, mas se ambos estiverem simultaneamente como mestre ou como servo, a comunicação não será bem-sucedida.

O uso do módulo RF na Nordic pode ser variado, por exemplo para acionamento de relés, automação e controle de sistemas via wireless.

Algumas fotos durante os testes iniciais do módulo em casa:

Testes

Algoritmo
Algumas bibliotecas foram utilizadas, como a do Display LCD (LiquidCrystal), a do Serial (SoftwareSerial) para testes do ESP8266, ambas nativas do Arduino, e a do RF, baixada do site do fabricante.

Basicamente, o algoritmo do módulo consiste da inicialização dos componentes e do loop de comunicação entre ambos. Seria necessário complementação de lógica para realizar cálculo de medições caso o microcontrolador tivesse mais sensores embarcados, apenas uma adaptação e uma iteração a mais no vetor de dados a serem transmitidos.

A seguir, o pseudo-código implementado para cada ponta da telemetria:

RF-EMISSOR
    setup
        radio.inicializa()
        radio.abreCanalTransmissao()
        led.inicializa()
        display.inicializa()
    loop
        se (tempoEnvio > x)
            para (i, 1 a 8)
                rpm[i] ← leAnalogico(i)
            /* medicao rpm */
            msg[0] = codigo
            msg[1] = rpm
            radio.envia(msg)
            led.pisca()
        senao 
            tempoEnvio++
        display.atualiza(rpm)
        delay(100)

RF-RECEPTOR
    setup
        radio.inicializa()
        radio.abreCanalRecepcao()
        radio.comecaOuvir()
        led.inicializa()
    loop
        se (radio.disponivel())
            boolean concluido ← falso
            enquanto (!concluido)
                concluido ← radio.leMensagem(msg)
            codigo ← msg[0]
            rpm ← msg[1]
            comuta
                caso (codigo = x)
                    monitor.imprime(‘rpm’, rpm)
                    led.pisca()
                default
                    monitor.imprime(‘codigo desconhecido’)

Obs: caso queira o código-fonte, favor solicite comentando no post ou enviando um e-mail.

terça-feira, 14 de julho de 2015

Robótica: PID Controller

O controle PID - ou controle proporcional integral derivativo - é uma técnica proveniente da engenharia e pode assumir um papel muito sutil e relevante na robótica. Em suma, seu objetivo é prover uma forma de manutenção de estados com retroalimentação, onde a partir de uma comparação entre o estado esperado na saída com o seu estado real (entrada), o controlador recebe os dados e atua de forma a fazer com que a saída seja alterada para o seu valor esperado, no melhor caso, ou o mais próximo possível, ou seja: realizar ciclos de manutenção de valor aproximado baseado em erro.

É composto por 3 coeficientes: ganho proporcional, ganho integral e ganho derivativo, coeficientes que serão empregados para a obtenção de valores mais satisfatórios. Cada coeficiente atuará em uma forma específica de correção:

  • P :: correção proporcional ao erro – a correção a ser aplicada ao processo deve crescer na proporção que cresce o erro entre o valor real e o desejado.
  • I  :: correção proporcional ao produto erro x tempo – erros pequenos mas que existem há muito tempo requerem correção mais intensa.
  • D :: correção proporcional à taxa de variação do erro – se o erro está variando muito rápido, esta taxa de variação deve ser reduzida para evitar oscilações.

A equação mais usual do PID é a apresentada no esquema a seguir:

Equação PID convencional

Onde KpKi Kd são os ganhos das parcelas P, I e D, e definem a intensidade de cada ação. Vale lembrar que esta equação pode variar dependendo do fabricante ou do caso a ser aplicado.

O gráfico a seguir representa um exemplo canônico da aplicação do controle PID:

Resultado de uma aplicação do CPID

Vale o projeto citado anteriormente como exemplo de aplicação: movimentação de um robô envolvendo sensores e motor. Esta técnica foi essencial na tarefa de fazer o robô andar seguindo linha, aprimorando o controle, suavidade e estabilidade no percurso, especialmente na realização das curvas.

Robótica: Line Follower Robot

Este foi um projeto acadêmico muito interessante em que participei, contemplando a robótica como ponto central, onde tínhamos que desempenhar no robô as tarefas de andar seguindo linha e desviando de objetos. Além destes problemas, havia a questão de sua parte elétrica e mecânica, envolvendo escolha de peças, bateria, fabricação do chassi, entre outros. Além disto, a necessidade de adaptar o robô para, por exemplo, subir rampas e andar por superfícies com anormalidades e interrupções na linha representavam outro nível de problema. Por fim, a forma de locomoção foi o ponto de partida para as decisões por vir, e foi dada preferência para um robô movido por esteiras.

Para desempenhar as tarefas do robô e sua interação com as outras partes, utilizamos os seguintes componentes:


  • Arduino Mega
Placa projetada com microcontrolador e suporte a entrada e saída, digital e analógica, para leitura e manipulação de dados e componentes. Utilizada para gerir e executar a lógica do robô em tempo real. É programada através da interface instalada no computador e trabalha com a linguagem Arduino, baseada em C/C++. Possui suporte a alimentação externa e interface USB, via que fornece comunicação com computador. Este modelo foi escolhido em alternativa ao Arduino Uno por ser maior, contendo suficientemente mais portas (digitais e analógicas) e mais memória.
Arduino Mega

  • Motor Shield
Utilizado juntamente com o Arduino para controlar a velocidade dos motores de corrente contínua. Possui canais de controle e um chip baseado em Ponte H, permitindo uma tensão ser aplicada em qualquer direção para ambos os motores. Suporta uma corrente de saída de 600mA e tensão de 4,5 a 36V.

MotorShield L298N


  • Sensores de Refletância
Sensores analógicos utilizados para detectar linha no percurso. Trabalham com led infravermelho e fototransistor, emitindo luz e detectando seu reflexo no solo, sendo possível assim medir intensidade do sinal captado e interpretá-lo como sendo ou não uma linha.
No projeto foram utilizados 5 sensores, sendo destes 3 sensores posicionados no centro, para ajuste de precisão do percurso reto, e 2 sensores subjacentes (esquerda e direita), para detecção de curva através das bordas na linha.
Modelo TCRT-5000

  • Sensores de Ultrassom
Sensores digitais utilizados para detectar objeto no percurso. São os "olhos" do robô (e parecem mesmo). Trabalham com onda sonora, que será emitida e rebatida pelo objeto mais próximo, retornando ao receptor. O cálculo de distância então irá derivar do tempo de emissão e recebimento do sinal.
No projeto foram utilizados 3 sensores, posicionados nos pontos central e laterais, de forma a trabalhar como uma visão periférica, primeiramente detectando um objeto a frente e posteriormente utilizando os laterais para contorná-lo, a uma distância predefinida. Uma alternativa seria utilizar apenas um deste sensor e direcioná-lo para as laterias utilizando um servo-motor convencional.
Modelo HC-SR04


Como utilizamos componentes que realizam algumas funções complexas, utilizamos algumas bibliotecas próprias, como a QTRSensors, do sensor de linha, e a NewPing, do sensor ultrassônico.

O robô se movimenta pelo acionamento de seus dois motores, comandados e controlados pelo Arduino e pela sua interação com o componente MotorShield, ao qual os motores são conectados. A direção é definida através da diferença da velocidade entre os dois motores. Para a realização de uma curva para a direita, por exemplo, o robô deve aumentar a velocidade do motor da esquerda e diminuir do motor da direita, simultaneamente, a fim de iniciar um movimento de rotação. Também, para girar em torno do próprio eixo, pode-se aplicar uma mesma velocidade aos dois motores, contanto que girem em sentidos opostos. A correção de velocidade dos motores, estratégia para realização de curvas e seguir linha, entre outros, são tarefas realizadas pelo controle PID, que será explicado mais detalhadamente em outro post.

O algoritmo no Arduino é constituído basicamente de 2 etapas: Setup e Loop. O Setup é a etapa de inicialização dos programas, setando as variáveis iniciais e realizando as ações primárias do robô, como por exemplo a calibragem dos sensores, que consiste numa varredura em 180º graus do robô, girando em torno do seu próprio eixo, para realizar a primeira detecção de linha e evoluir sua precisão, de acordo com fatores de ambiente. O Loop é onde definimos toda a ação em tempo real do robô, ou seja: validações, tratamentos e demais ações cíclicas que são realizadas no decorrer do percurso.

Para o desvio de objetos, a cada ciclo emitimos o sinal ultrassônico e lemos a distância até o objeto mais próximos, considerando um limite de distância. Nesta situação de proximidade, a decisão a ser tomada pelo robô primeiramente é parar e olhar os lados (através dos sensores ultrassônicos laterais), a fim de buscar o lado mais livre para percorrer, e tomar esta direção. Para realizar este desvio, o robô realiza um percurso predefinido em torno do objeto, andando primeiramente para o lado mais livre até se distanciar o suficiente do objeto, e assim, dobrar para o lado do objeto até cruzar sua posição e poder contorná-lo com mais uma curva, até que o robô ache a linha de volta.

No caso de haver interrupção na linha, o robô ativa um estado de sonda, anda uma certa distância para frente, procurando pela linha, e, caso não encontre, ele desfaz este caminho e o refaz, de forma sinuosa, até encontrar a linha nas proximidades do caminho.

Obs: fluxogramas, algoritmos, fotos do bicho e demais materiais não serão fornecidos por questões autorais.