DAMI-M1 v1.2.0

O DAMI-M1 teve algumas alterações no hardware e começou a ter o esqueleto do software que vai controlar os movimentos do robot.

Hardware

As alterações ao hardware, em parte já estavam presentes. O servo e o sensor de distancia já lá estavam montados à algum tempo. Mas o suporte do sensor ainda estava feito numa calha plástica e os fios de ambos ainda não estavam ligados.

O suporte para um segundo Nano também estava presente. Faltava apenas encaixar o Arduino no sítio.

A outra alteração foi o desenvolvimento de uns novos suportes para os motores dc com o encoder sj01.

A aplicação dos motores com os suportes antigos, já impressos em 3D, não estava adequada.

Como o encoder exige um espaço entre o motor e a base da aplicação, esse espaço não estava bem preenchido com a solução de recurso (um apoio extra impresso a pressa e mal dimensionado) o motor oscilava, e por outro lado começou a fazer um barulho estranho. Por outro lado, estava demasiado grosso e a cabeça do parafuso tocava na roda.

Por isso imprimi em 3D um novo tipo de suporte para aplicar do lado de fora, e que depois de aplicado se revelou a medida e também , talvez devido ao melhor aperto , eliminou o ruído. O parafuso continua perigosamente perto da roda mas pelos vistos já não toca. Em ultima instância pode-se limar a cabeça do parafuso.

Como preparação para dar ao DAMI-M1 uma forma para saber a que distancia se encontra das coisas, instalei um servo SG90 e um sensor de distancia laser VL53L0X da pololu. Para aplicar sensor VL53L0X no SG90 imprimi  em 3D o suporte para o fixar.

Neste momento, o servo e o sensor de distancia estão apenas a fazer figura. Antes de integrar os novos componentes na programação irei fazer uma análise dos metodos de controlo, do seu comportamento e dos métodos disponiveis para contornar ou minimizar os seus problemas.

Primeiras observações registadas

Quando liquei o arduino A (o que já existia) por USB ao computador, sem ter a alimentação do robot ligada, o segundo arduino entra em reset consecutivos. Parece que a alimentação do arduino A, sai pelo vin e entra no circuito de alimentação.

Provavelmente deveria por um diodo na entrada do vin de cada arduino para impedir o fluxo de corrente do arduino para o circuito, ou colocar jumpers para ligar e desligar a alimentação do arduino.

Não sei se nao será melhor colocar uma especie de pala superior e eventualmente lateral que evite a poeira.

O cabo da alimentação da BARD está demasiado grande.

Software

O esqueleto do software que vai controlar os movimentos do robot começou a ser construido com base na que considerei a melhor solução na avaliação de abordagens ao controlo de motores DC em robots 2WD de propulsão diferencial, na qual o controlo de direção e da velocidade são ajustadas por PID, e cujo comportamento pode ser observado no video abaixo.

Para o efeito, desenvolvi um programa que permite sequenciar uma serie de movimentos básicos (translações e rotações), introduzindo pelo caminho algumas carateristicas novas, em particular:

  • Coeficientes especiais (adaptativos) do PID aplicados ao ajuste da direcção durante a fase do arranque.
  • Possibilidade de acelerar e desacelerar pelo controlo do setPoint do PID da velocidade (numero de pulsos por speedPidTimeSample)
  • Aceleração inicial com base num maximo de N passos (definivel), com  incrementos de 1 pulso por passo, e com N computações por passo
  • Retardamento da aceleração inicial de modo a que exista tempo para o ajuste da direcção durante a fase de arranque
  • Desaceleração automática por calculo da distancia adequada (relativamente ao destino) face a velocidade actual e desaceleração prevista, usando a equação de torricelli (também deve dar para calcular um limite maximo de velocidade face a distancia total a precorrer)

No que se refere a capacidade de execução de uma sequência de movimentos o programa utiliza o seguinte esquema de armazenamento e códigos de comandos (movimentos).

Estão implementados os movimentos de rotação e translação simples com os seguintes códigos:

  • Rotação à esquerda – 31
  • Rotação à direita – 32
  • Translação em frente – 41
  • Translação à retaguarda – 42

A programação é armazenada num array com bodyMoveCmdSequenceMax de elementos com a seguinte estrutura:

typedef struct {
unsigned int cmd;
unsigned long distance; // distance in mm/cm (depends on resolution), angles on degrees
byte setPointStart; // pulses per pidSampleTime
byte setPointTarget; // 5=2,10=4,15=6,20=8,25=10,40=16,60=24,80=32 cm/s
} bodyMoveCmdType;

bodyMoveCmdSequence[] = {{41, 2000, 0, 60}, {31, 180, 10, 10}, {41, 2000, 0, 0}, {32, 180, 0, 0}};

Os comandos são executados sequencialmente um após outro, sem interrupção.

Executando várias vezes o programa sequenciador no robot (sem estar ligado ao PC) para avaliar a qualidade do movimento,  notei pela simples observação do movimento do robot que o movimento não era suficientemente retilino. Aparentava curvar ligeiramente para a direita (o que significava a roda esquerda andar mais).

Para obter dados necessários para validar a percepção, liguei de novo o robot ao pc, executei o programa que move o robot para a frente 2M e copiei os dados do monitor serie para o excel para fazer o seguinte grafico.

 

Suportes impressos em 3D

Suporte para motores dc 120:1 com encoder SJ01

Suporte do VL53L0X pololu para SG90