Archive for the ‘ Sistemas Embebidos ’ Category

Led Display

Há já algum tempo que tinha planeada a construção de um Display de Leds. 

Estes displays encontram-se com frequência e constituem um projecto interessante e com utilidade.

Hardware

Neste projecto foram usadas 10 matrizes da Kingbright que contêm 7 linhas e 5 colunas no total de 35 leds por matriz perfazendo 350 leds em todo o painel.
Foram usados 7 shift registers (74HC164) para activar uma linha completa e 7 transístores pnp (visto que o painel é de ânodo comum) para ir comutando entre as diferentes linhas. O controlo do painel está a cargo de um PIC18F2680.

led_controller_schematic

O layout da board de controlo e da board que contém as matrizes foi feito no EAGLE.

led_display

Board que contem as 10 matrizes é um “shield” da placa de controlo.

led_controller_3D

Placa de controlo com os 7 shift registers e as resistências para os leds.

led_controller_assembly

Algoritmo

O firmware foi desenvolvido utilizando o C18 segundo o seguinte algoritmo.

algoritmo

Suporte

Foi desenhado um suporte para o Led Display utilizando o SolidWorks e posteriormente maquinado na CNC em PVC expandido de 5mm de espessura.

5423388810_50ec31f1cc_b

Imagem CAD do suporte.

5418795618_a68eee9de4_b

Suporte depois de maquinado e montado.

Resultado Final

5418199443_37f0851863_b

VFDclock

Displays VFD (Vacuum Fluorescent Display) são um tipo de display muito usado em electrónica de consumo capazes de mostrar símbolos, texto e números com alto brilho e contraste. São constituídos por um filamento, grelhas de controlo e dígitos revestidos com fósforo.

Com o pretexto de usar um destes displays e tendo recentemente adquirido um tubo IV18 decidi fazer um relógio.

O IV18 e seus constituintes podem ser vistos na imagem seguinte:

vfdgrelha

Existem muitos projectos que usam este tubo em diversas configurações como por exemplo:

confs

A configuração que mais gostei foi a ultima que se encontra na imagem anterior, assim usando um programa CAD desenhei o meu futuro relógio a ser construído em PVC expandido:vfdclockprojecto

Dentro do PVC expandido foi deixado espaço para alojar toda a electrónica necessária ao funcionamento do relógio como se pode ver no seguinte corte do desenho 3D:

vfdclockcorte

As peças são de PVC expandido de 1cm de espessura e foram cortadas na CNC. Os dois lados são ligados através de 4 varões de Inox e parafusos:
Foto0088

A placa de circuito impresso desenvolvida terá de encaixar no espaço reservado e conter os drivers para o tubo, o conversor DC-DC o microcontrolador e o RTC (Real Time Clock). Para este projecto foi usado o PIC18F4620, o RTC MCP79410 e o driver MAX6921.

pcbvfdclock

O layout da PCB foi feito no EAGLE e mede 5x5cm:

pcb

Uma representação 3D pode ser criada usando o EAGLE UP:

pcb2

Na imagem seguinte pode-se ver a PCB já feita e o primeiro teste para verificar as dimensões:

Foto0007_001

PCB montada e componentes mecânicos. Foi necessário usar duas peças intermédias em vez de uma originalmente prevista:

Foto0018_001

Relógio praticamente montado, faltando apenas os varões a unir as duas metades:

Foto0015_002

Primeiros testes ao firmware nomeadamente ao Led RGB montado na base do tubo:

Foto0013_002

Por fim o relógio já completamente montado e a funcionar:

Foto0035_001

Vídeo em funcionamento:

Under construction sign

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.