Dissertação de Mestrado

Durante a minha dissertação de mestrado trabalhei com a temática dos veículos eléctricos e autónomos.

dissertacao

Esta dissertação teve como objectivo o desenvolvimento de um controlador para o sistema de direcção de um veículo autónomo.

Várias pessoas trabalharam neste projecto, tais como:

Marco Silva (PhD Student), Fernando Moita (PhD Student), Professor  Doutor Urbano Nunes, Cristiano Premebida (PhD), Luís Garrote (PhD Student), Pedro Reis, Hugo Faria entre outros.

CAD para Gcode

De forma a poder maquinar uma peça utilizando uma CNC é necessário converter o desenho 3D em algo que o controlador da CNC entenda. As CNCs têm a sua própria linguagem conhecida como “Código G” (G Code em inglês), assim, é necessário algo que converta o desenho em código G.

cad2gcode

Como o esquema anterior demonstra, o workflow de cortar uma peça utilizando a CNC começa com o desenho da mesma num software CAD como o Autocad, Freecad, Solidworks, CamBam (limitado), entre outros.

De seguida o desenho passa por um software CAM como o Mastercam, Sprutcam ou o CamBam onde são escolhidas as opções de maquinagem como o tipo de passagens, o tipo fresa  e informações como diâmetro, velocidade de corte e número de passagens e altura de segurança. É também o software CAM que vai gerar o ficheiro com o código G.

Por fim o ficheiro contendo código G é importado pelo controlador da CNC como o MACH3, o EMC2 Linux, ou um controlador físico como Fanuc ou Heidenhain responsável por controlar a máquina.

Muitas das peças são apenas um contorno 2D com uma profundidade. Este tipo de peças é conhecido como 2.5D e é sobre elas que este tutorial incide usando o CamBam (versão gratuita) http://www.brusselsprout.org/cambam/download.htm

Assumindo que desejamos maquinar uma peça 2.5D (definida por um contorno 2D e por uma altura, regra geral a do próprio material) em PVC expandido de 10mm de espessura como a seguinte :

peca

Por convenção, o topo da peça tem cota (eixo dos Zs)  igual a zero, esta será negativa quando a fresa está a cortar (encontra-se dentro do material) e positiva quando está a viajar entre pontos sem cortar (altura de segurança).

Usando o desenho CAD (por exemplo com o SolidWorks) devemos guardar uma versão com a extensão “DXF” e vamos abri-la no CAMBAM usando a opção “File->Open”:

cambam

Convém verificar se as unidades no CamBam são coincidentes com as usadas no controlador. Na imagem anterior é possível ver o contorno da peça.

Para este exemplo vamos usar PVC expandido de 10mm de espessura e uma fresa de 3mm de diâmetro com duas laminas em hélice.

fresapvc

Clicando em qualquer dos contornos este ficará realçado a vermelho e usando o “control (ctrl)” podemos seleccionar mais que um contorno.

cambam25d

Com estes contornos seleccionados iremos agora escolher o tipo de operação a efectuar sobre eles e seguidamente o diâmetro da fresa, se queremos cortar por dentro ou por fora do contorno, a profundidade de corte, o numero de passagens, a velocidade de avanço e a altura de segurança.

Dos menus iremos escolher “CAM->2.5D Profile” e o CamBam abrirá um menu do lado esquerdo com diversas opções como se encontra na figura seguinte:

cambamopcoes

As opções mais importantes são:

Nome do campo Descrição do Campo Valor para o exemplo
DepthIncrement É este valor que define quanto é que a fresa vai penetrar no material a cada passagem que faz. 3 [mm]
FinalDepthIncrement Define qual o incremento de penetração da fresa a fazer na ultima passagem. Utiliza-se este campo no caso em que o “DepthIncrement” escolhido não dê número de passagens certo, por exemplo se for escolhido um valor de “DepthIncrement” de 3mm e a espessura a cortar seja de 10mm. Neste iriam ser feitas três passagens com incremento de 3mm e utilizando o “FinalDepthIncrement” igual a 1mm para completar os 10mm. No caso em que o numero de passagens dê certo este campo pode ser igual a zero. 1 [mm]
StockSurface Este valor determina a altura da peça. Por convenção é igual a zero. 0 [mm]
TargetDepth Define qual a profundidade pretendida a ser atingida pela fresa. Por convenção fresa corta quando a cota é Zero. Assim sendo este valor aparece negativo, no nosso exemplo será = a -10mm (espessura do PVC) -10 [mm]
CutFeedrate Define a velocidade de avanço (em mm/min) enquanto a fresa está a cortar. Este valor depende do tipo de material, da fresa e CNC usada, é necessária alguma experiência/testes para descobrir qual o que se adequa melhor. 300 [mm/min]
PlungeFeedrate Define a velocidade de penetração (em mm/min) da fresa no material. 250 [mm/min]
ClearancePlane Define qual a altura a que a fresa pode movimentar-se em segurança de um sitio para o outro sem embater na peça a maquinar. 5 [mm]
InsideOutside Define se desejamos que a fresa corte por dentro ou por fora do contorno. Inside
ToolDiameter Define o diametro da fresa que vai ser utilizada para cortar. 3 [mm]
ToolNumber Define qual o numero que desejamos atribuir a uma determinada fresa. Caso durante o trabalho apenas se use uma fresa não é necessário usar este campo e pode-se usar o valor default de zero. 0

De seguida selecciona-se o contorno exterior e volta-se a repetir o procedimento mostrado acima tendo atenção que no campo “InsideOutside” deve-se alterar para “Outside”.

cambamopcoes2

Terminadas as operações pode-se verificar se tudo está conforme desejado clicando com o botão do lado direito do rato em cima de “Machining” e escolher a oção “cambamgentool

Os caminhos onde a fresa passará aparecem agora junto com a peça. Utilizando a tecla “Alt” juntamente com o botão esquerdo do rato pode-se visualizar a peça e os percursos da fresa a 3D.cambam3D

Usando a tecla “Alt” e fazendo duplo clic em cima da peça faz o reset para a vista normal de visualização.

Para terminar resta gerar o código G, para isso basta clicar com o botão direito em cima de “Machining” e escolher a opção “Create GCode File” e salvar normalmente o arquivo onde se desejar como noutras aplicações.

Os ficheiros neste exemplo podem ser descarregados aqui.

MySQL com IronPython

Brevemente!

Identificação do modelo de um motor DC

De forma a controlar os motores de tracção presentes na base osTWDR, decidi usar um controlador PID para manter a velocidade dos mesmos num valor desejado.

Ainda que este tipo de controlador não exija o conhecimento do modelo matemático do sistema, tentei identifica-lo para que houvesse um ponto de partida para a sintonização dos ganhos Proporcional, Integral e Derivativo.

A estratégia utilizada foi aplicar uma entrada em degrau (com o motor parado aplicar-lhe tensão) e observar a evolução do sistema ao longo do tempo. Esses dados foram guardados e posteriormente processados para obter o modelo matemático do sistema.

Os motores usados no osTWDR são servos RC alterados para poderem rodar 360º e em que toda a electrónica original foi removida e substituída por um microcontrolador dsPIC33FJ32MC302 e por uma ponte H SN754410. Para obter feedback da velocidade de rotação, foi adicionado aos servos um encoder magnético de 64 pulsos por rotação usando o integrado da  Austria microsystems AS5035.

O dsPIC usado nesta aplicação possui um módulo QEI (Quadrature Encoder Interface) e permite o interface directo com encoders com saida em quadratura. Foi escrito um programa que após iniciar a execução aplica ao motor um sinal de PWM com duty cycle de 100% e lê o número de pulsos com uma frequência de 10Hz. Estes dados são enviados por porta série para um programa terminal como o “terminal by br@y++” que fará o registo (log) dos mesmos.

Importando os dados utilizando o Matlab:


data=[];
posicao=[];

fid=fopen('log_servo_10Hz_pps_asc.txt');

C=textscan(fid, '%f,%f');

fclose(fid);

data=C{1,1};
posicao=C{1,2};

As variáveis “data” e “posicao” guardam informação do número de pulsos por segundo e instante respectivamente. Fazendo o plot das mesmas pode-se visualizar o comportamento que aparenta ter uma resposta semelhante a um sistema de segunda ordem. Infelizmente a mecânica dos servos é de má qualidade o que só por si introduz muito ruído no sistema daí não estabilizar e haver tanta oscilação.

O Matlab possui uma toolbox que auxilia a identificação do sistema. Essa ferramenta chama-se “System identification tool” e pode ser chamada escrevendo na shell do Matlab “ident” seguido de um “enter”.

Para dar inicio à identificação do sistema escolhe-se a opção “time domain data” do menu dropdown “import data”:

deverá aparecer a seguinte janela:

São poucas as informações que temos de fornecer sendo que:

Output – resposta do sistema, neste caso vamos escrever o nome da variável “data” que deve estar no “workspace”.

Input – Valor do comando fornecido ao motor, nesta situação particular é um vector com dimensões iguais às de “data” com todos os elementos iguais a 400.

comando=ones(size(data,1),1)*400;

Chega-se ao valor 400 pelo facto de ser o valor necessário carregar nos registos do módulo de PWM do dsPIC para gerar um duty cycle de 100%. Deverá ser escrito o nome da variável “comando”.

Starting Time – tempo inicial, colocar a 0.

Sampling Interval – tempo de amostragem, neste caso a frequência de amostragem é de 10Hz o que implica um tempo de amostragem de 0,1s.

No fim deverá ter este aspecto:

É agora necessário carregar na opção “Import”, que fará com que a janela do “system identification tool” mostre que já temos os dados do nosso sistema inseridos:


Do menu dropdown “Estimate–>” escolher a opção “Process Models…” irá abrir uma janela que para um sistema de segunda ordem sem atraso de resposta poderá ser preenchida da seguinte forma:

Para terminar falta escolher a opção “Estimate”, isto irá dar inicio ao processo de identificar qual o modelo matemático para os motores.

A janela do “system identification tool” terá agora o seguinte aspecto:

escolhendo a opção “Model Output” irá aparecer uma janela com os dados fornecidos e uma resposta com os dados estimados, neste caso:

Apesar das oscilações presentes nos dados originais (e provocadas por uma má mecânica) o sistema estimado consegue ter uma resposta adequada e representativa do sistema real.

Para finalizar basta apenas conhecer o modelo matemático do sistema. Para tal basta clicar no “system identification tool” com o botão do lado direito do rato em cima de onde diz “P2”.

Desta forma consegue-se verificar que a função de transferência do motor é:

G(s)= \frac{0.30138}{(1+2.3079s)(1+0.052916s)}

Sendo que uma função de transferência genérica de segunda ordem pode ter a seguinte forma:

G(s)= \frac{b_0}{s^2+a_1s+a_0}

E que a dinâmica pretendida em malha fechada pode ser escolhida através de:

\zeta w_n s^2 + 2 \zeta w_n s + w_n^2 = 0

então:

K_p= \frac{2 p \zeta w_n + w_n ^2 - a_0}{b_0}

K_i= \frac{2 \zeta w_n + p + a_1}{b_0}

K_d= \frac{p w_n ^2 }{b_0}

Onde “p” é um pólo extra inserido pelo controlador. Deve-se escolher este pólo de forma a que seja pelo menos 10 vezes maior que o pólo mais lento de forma a não interferir na dinâmica desejada.

rfSTICK

A possibilidade de comunicar à distância sem a utilização de fios é de grande vantagem num enorme número de situações, desde telemetria até ao controlo de actuadores remotos.

Assim sendo andava já há algum tempo para desenvolver uns módulos que permitissem comunicar sem fios para diversas aplicações, como segurança, monitorização de temperaturas e controlo de motores remotos.

Os módulos rfSTICK são baseados no transceiver da Nordic NRF24l01+ e num microcontrolador PIC18LF2620 alimentado por um conversor DC/DC MCP1640 que eleva a tensão de duas pilhas AA recarregaveis (NiMH) de 2.4 para 3.3V.

A placa possui ainda um sensor de temperatura TC77, dois leds para indicação de actividade (ou outras funções) e conectores para comunicação série (TTL), um conector com GPIOS e entradas analógicas,  para programação (pickit) e por fim um conector que permite ligar ou desligar o módulo por intermédio de um jumper ou removendo-o, ligar o carregador para o carregamento das pilhas.

O módulo de comunicações é facilmente encontrado no ebay a preços acessiveis. Testes realizados revelaram um alcance de 80 metros em linha de vista (LOF).

Características:

  • NRF24L01+
  • PIC18LF2620
  • DC/DC (MCP1640)
  • Socket para duas pilhas recarregáveis AA
  • Sensor de temperatura (TC77 – 3.3V)
  • 2 x Leds de utilizador
  • Comunicação Serie (TTL)
  • Conector GPIO
  • Conector de Programação
  • Conector de power

Este projecto deu por fim origem a outro. Numa tentativa de possibilitar a mais pessoas o uso de módulos RF de baixo custo foi desenvolvido com o meu colega Pedro Reis os módulos rfDUINO. Este usam o mesmo módulo RF mas são baseados na famosa plataforma de desenvolvimento Arduino podendo ser programados usando o seu IDE e bilbiotecas.