Mostrar mensagens com a etiqueta L298N. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta L298N. Mostrar todas as mensagens

sexta-feira, 14 de julho de 2017

Robôs low cost#6 - finalizando o projeto

Depois de o Jorge e a Alexandra terem:
...chegou a hora de integrar todos os componentes no projeto.

A arquitetura final está esquematizada na figura seguinte:


As ligações de cada um dos componentes estão descritas nos posts anteriores e indicadas na seguinte tabela:

Tendo todos os componentes a funcionar, a intenção era apenas juntar os códigos realizados nas etapas anteriores do trabalho. Os alunos depararam-se então com a questão das temporizações - o intervalo de tempo usado para recolher os valores da humidade e temperatura (1 segundo) tornava a verificação da existência de obstáculos demasiado lenta.

A pesquisa levou-os ao conceito de Thread, a capacidade de realizar múltiplas tarefas em paralelo. Na verdade, o arduino não tem esta capacidade. Existem, no entanto, livrarias que permitem "agendar" tarefas para determinados intervalos de tempo. Neste caso, foi usada a livraria Thread.h.

Quanto à programação, houve que conciliar os programas realizados anteriormente com a utilização da livraria Thread.h, o que implicou a inclusão desta livraria e a criação de objetos associados - um objeto moveThread associado ao movimento do robô (incluindo a sua locomoção e a capacidade de se desviar de obstáculos) e um segundo objeto, sensorThread, associado à medida da humidade e temperatura e envio desses dados através de bluetooth para o computador: 


Na função setup() foram incluídas as chamadas das funções moveCar e sensorRead em intervalos de tempo 0s (i.e., a correr ininterruptamente) e 1s, respetivamente (o movimento do robô, sendo contínuo, não necessitaria de ser incluído numa thread - tal foi feito apenas para tornar o programa mais percetível.):

 A função loop() passa a ser apenas a execução de cada uma das duas funções a realizar:

É na função moveCar() que é incluído o código que controla o movimento do robô:


A função sensorRead() inclui o código relacionado com a medida de valores e envio para a porta série:

Os testes realizados revelaram que o movimento do robô apresenta uma ligeira perturbação de segundo a segundo, quase impercetível, fruto da execução da função sensorRead().

A pergunta que se impõe - o robô foi mesmo low cost? Pessoalmente, a minha experiência é que depende do local de compra dos componentes. Como a minha intenção é criar trabalhos que possam ser replicados em ambientes sem muitos recursos, a contenção de custos é uma preocupação. Sempre que posso, recorro ao Aliexpress para adquirir componentes. Consigo valores muito inferiores relativamente às lojas locais a que tenho acesso. Estou a falar de diferenças de mais de 5 vezes o valor do componente no Aliexpress, por exemplo. Com o Aliexpress perde-se, evidentemente, a oportunidade de pedir apoio técnico, sugestões, e, muito importante, faturas em ordem - e há situações em que essas mais valias são de facto fundamentais. Para além disso, recorrendo ao Aliexpress há que contar com 3 a 4 semanas para entrega dos produtos - nunca me aconteceu não ter recebido os componentes em bom estado.

Portanto, mandando vir os componentes pelo Aliexpress, este pequeno robô fica-nos em:
Total = 24,03€. Este valor, que não inclui as pilhas para alimentação do arduino e motores, parece-me razoável para um número significativo de contextos. É certamente muito mais baixo que a maioria das soluções encontradas no mercado para robôs didáticos e tem a enorme vantagem de, sendo um projeto modular, poder crescer com os alunos, com a inclusão de novos componentes e a novas ideias.

E ficou giro? Eu acho que sim, mas sou suspeita...







terça-feira, 4 de julho de 2017

Robôs low cost#3 - detetando e contornando obstáculos

Para que o robô consiga ter um comportamento "inteligente", detetando e contornando obstáculos, há que dar-lhe a capacidade de "ver" o que o rodeia. São várias as formas de o conseguir - com detetores de infravermelhos, câmaras, sensores de toque...como o nosso kit low cost vinha equipado com um sensor de ultrassons SR04, foi esse o que o alunos usaram.

O SR04 é dos sensores de ultrassons mais comuns para pequenos projetos. Permite a medida de distâncias entre 2 cm e 4 m com um ângulo de sensibilidade de 15º.

Apresenta 4 pinos, dois para a alimentação (Vcc e GND), um para o trigger (o "disparo" de um sinal) e o restante para receber o som refletido (o eco):


As ligações realizadas foram as seguintes:


Assim, ao robô montado na sessão anterior, acrescentámos o sensor de ultrassons de acordo com o seguinte esquema:

Já aqui no blog tínhamos explorado o sensor de ultrassons no âmbito da programação gráfica. Os conceitos associados a este sensor encontram-se neste post, e por isso não nos alongaremos com mais considerações quanto ao princípio de funcionamento de um sensor deste tipo.

A programação deste sensor em C é facilitada com uma série de livrarias disponíveis que evitam a preocupação de enviar, detetar e analisar sinais, disponibilizando uma série de comandos que incluem todos esses passos. Usámos a Ultrasonic.h, e explorámo-la através dos exemplos dados.

De forma a testar o funcionamento do sensor, usámos o programa seguinte que escreve na porta série a distância (em cm) a que um obstáculo é detetado pelo sensor:

Com o sensor a funcionar, houve que adaptar a marcha do robô de acordo com a distância lida pelo sensor. O objetivo era manter o robô a andar em frente caso o obstáculo estivesse a mais de 20 cm e alterar a sua trajetória caso o obstáculo estivesse mais perto que essa distância.

Nesta fase, os primeiros testes revelaram que o controlo da velocidade através das saídas PWM não é suficiente para as baixas velocidades pretendidas. Na verdade, para valores mais baixos registados nas saídas PWM, os motores não tinham força para se moverem. A opção passou por criar períodos de ponto morto de forma a diminuir a velocidade do robô.


Como ilustração, deixamos o aspeto do robô nesta fase...


...e um vídeo com o robô em funcionamento (quando o vídeo foi feito, o robô ainda só parava na presença do obstáculo. Com o programa proposto, perante o obstáculo o robô anda para trás, gira e retoma a marcha):

domingo, 26 de fevereiro de 2017

Robôs low cost#2 - controlo da velocidade

É possível controlar a velocidade do pequeno carrinho que montámos através do driver L298N que controla os motores. Para isso, há que recorrer aos pinos Ativa MA e Ativa MB ligando-os a uma saída PWM do arduino.

A Alexandra e o Jorge tinham já trabalhado com saídas PWM em S4A, pelo que o conceito não era novo para os alunos. Uma semana antes, enviei-lhes por email um post do blog Vida de Silício que descreve de forma clara o controlo de velocidade através do L298N e que deviam estudar em casa.

Ao fazer os primeiros testes com o carrinho, sem controlo de velocidade, foram mantidos os jumpers nos pinos Ativa MA e Ativa MB:

http://blog.vidadesilicio.com.br/arduino/ponte-h-l298n-controle-velocidade-motor/
Com os jumpers conectados, os pinos Ativa MA e Ativa MB estarão a 5V e o carrinho estará, de acordo com a programação, ou parado, ou em andamento com velocidade máxima. Ao ligar esses pinos a uma saída PWM do arduino, o intervalo de tempo em que a saída estará a 5V dependerá do valor indicado na programação através do comando analogWrite().
A sintaxe desse comando é analogWrite(pin, value), sendo pin o número da saída digital PWM do arduino (os indicados com um ~, saídas digitais 3, 5, 6, 9, 10 e 11, para um arduino UNO) e value um valor entre 255 (sempre a 5V) e 0 (sempre a 0V) - valores intermédios correspondem a ondas quadradas cujo tempo em que permanecem a 5V está entre 0% e 100% do período da onda:
https://www.arduino.cc/en/Tutorial/PWM

Embora o arduino não tenha saídas analógicas, as saídas PWM permitem realizar essa função, uma vez que o valor médio da tensão de uma onda quadrada depende do valor do duty cycle.
Na sessão anterior, as experiências foram feitas com a alimentação do arduino feita ainda por cabo, ligando-o ao computador. Para libertar o carrinho do computador, os motores continuaram ligados a uma pilha de 9V e foi reciclada uma bateria de um brinquedo velho para alimentar o arduino:

Durante a sessão do clube, o Jorge e a Alexandra modificaram as ligações realizadas anteriormente e assim: 
 - IN1, IN2, IN3 e IN4 ligadas respetivamente às saídas digitais 2, 4, 6, 7
 - ENA e ENB ligadas respetivamente às saídas PWM: 3, 5

O esquema do circuito é agora o seguinte:

O aspeto atual do carrinho é este:


Um possível programa de teste para controlo da velocidade dos motores...


...e um vídeo de demonstração do carrinho em movimento.



Termino referindo que este post foi concebido já depois da Alexandra e do Jorge terem feito a sua exploração do controlo de velocidade através do driver dos motores. A estratégia foi enviar uma semana antes o link sobre o controlo da velocidade dos motores e deixar os alunos a trabalhar de forma autónoma durante 90 minutos. O meu trabalho foi mesmo só fazer o pequeno vídeo no final da sessão. Muito bem, meninos!