24 de dez. de 2011

Macros no mikroC PRO

Algumas vezes nos deparamos com a necessidade de trabalharmos diretamente com apenas um bit do registrador, muitos compiladores nos trazem ferramentas específicas para este fim, mas o mikroC na sua versão PRO não aborda diretamente este problema, tornando um pouco desgastante o processo de testar ou alterar um único bit.

Para contornar esta situação, eu resolvi desenvolver algumas macros (bloco de instruções que executam uma determinada função) para tornar o processo de programação mais confortável, para tanto tomei como base o livro TÉCNICAS DE PROJETOS ELETRÔNICOS COM OS MICROCONTROLADORES AVR , do autor Charles Borges de Lima, que por sinal é uma literatura indispensável para desenvolvedores de sistemas embarcados independentemente da plataforma que trabalham, e adaptei as idéias dele para o compilador mikroC PRO com alguns exemplos de uso.




Foram desenvolvidas quatro macros com as funções de setar (colocar o bit em 1), limpar (colocar o bit em 0), testar o estado do bit se é falso ou verdadeiro, 0 ou 1 e por fim a última macro que tem a função de complementar o bit, ou seja, inverte o estado do mesmo, vejamos como funciona:

__________________________________________________________________________________
 
#define Seta_bit(Variavel,bit)  (Variavel |= (1<<bit))

Esta macro chamada de Seta_bit usa como parâmetros o registrador do qual queremos trabalhar e o bit de interesse,  e quando chamada efetua uma lógica OR entre o registrador e o número 00000001 rotacionado a esquerda a quantidade de vezes necessária para setar apenas o bit de interesse. 

Exemplo:

Imaginemos que o PORTB esteja com o seguinte valor -> PORTB = 0b00010010 

Chamamos a macro abaixo para setar o bit 2 do PORTB.


Seta_bit(PORTB,2);

O compilador irá fazer o seguinte processo:

PORTB -> 0b00010010
    OU  -> 0b00000100    <- Valor 0b00000001 rotacionado 2 vezes a esquerda!
            -----------------
PORTB =  0b00010110    <- Pode se observar que apenas o bit de destino foi alterado.

__________________________________________________________________________________
 
#define Limpa_bit(Variavel,bit) (Variavel &=~(1<<bit))

Esta macro tem a função inversa da anterior e serve para limpar o bit, ou seja, quando chamada coloca o bit passado como parâmetro em false, zero, nível baixo enfim dizemos que limpa o estado do bit, para isto efetua a lógica AND entre o registrador passado como parâmetro e o byte 11111110 (que nada mais é do que o byte 00000001 negado), vejamos como isto funciona:

Limpa_bit(PORTB,4);

O compilador irá fazer o seguinte processo:

PORTB -> 0b00010010
  AND   -> 0b11101111    <- Valor 0b00000001 negado e rotacionado 4 vezes a esquerda!
            -----------------
PORTB =  0b00000010    <- Pode se observar que apenas o bit de destino foi alterado.

__________________________________________________________________________________
 
#define Testa_bit(Variavel,bit) (Variavel &  (1<<bit))

A macro chamada Testa_bit tem por finalidade nos informar o estado do bit em questão, e para tanto efetua a lógica AND entre a variável e o byte 00000001 rotacionado à esquerda a quantidade de bits necessários, vejamos:

Testa_bit(PORTB,1);

O compilador irá fazer o seguinte processo:

PORTB -> 0b00010010
  AND   -> 0b00000010    <- Valor 0b00000001 rotacionado 1 vez a esquerda!
            -----------------
PORTB =  0b00000010    

Neste exemplo temos que analisar que quando aplicamos a "máscara" temos o espelho apenas do bit passado no parâmetro, portanto se ele estiver em zero, o resultado desta macro é zero, mais se ele tiver  estiver ativo o resultado será diferente de zero, onde então podemos efetuar o teste.
__________________________________________________________________________________
 
#define Comp_bit(Variavel,bit)  (Variavel ^= (1<<bit))

A macro Comp_bit executa o complemento do bit passado como parâmetro, e faz isto através da lógica EXCLUSIVE OR entre o registrador passado como parâmetro e 00000001 rotacionado a esquerda a quantidade de bits necessários, vejamos:

Comp_bit(PORTB,7);

O compilador irá fazer o seguinte processo:

PORTB -> 0b00010010
  XOR   -> 0b10000000    <- Valor 0b00000001 rotacionado 7 vezes a esquerda!
            -----------------
PORTB =  0b10010010    <- Pode se observar que apenas o bit de destino foi alterado.


__________________________________________________________________________________

Abaixo um vídeo demonstrando o uso das macros na placa PK2Lab




Bom pessoal por hoje é isto, desejamos a todos um Feliz Natal com muita paz, alegria, saúde e um ano novo repleto de realizações, que venha 2012!!! 



PK2Lab Team
www.esquemas.org
JL Audio Manutenção Eletrônica

 
                                                                      @
                                                                    @ @
                                                                  @ @ @
                                                                @ @ @ @
                                                             @ @ @ @ @
                                                          @ @ @  @  @ @
                                                       @ @ @  @  @  @ @ 
                                                   @ @ @ @  @  @ @ @ @
                                                                      # # 
                                                                     # # #



 

10 de dez. de 2011

Alteração de Servomotor

Novas funcionalidades para seu servo!!!

Que tal efetuar algumas pequenas modificações no seu servo de modelismo e transformá-lo em um poderoso motor com giro contínuo para uso em um robô móvel, ou braço robótico?

Vou demonstrar como efetuar esta modificação de forma simples, em um servo da marca Tower Pro, modelo SG90, que é o servo mais fácil de ser encontrado hoje nas lojas de modelismo e tem a vantagem do seu custo ser muito baixo.





O primeiro passo é efetuar a retirada dos quatro parafusos de fixação na parte traseira do servo motor e retirar a tampa superior que da acesso as engrenagens do sistema de redução.




O próximo passo é retirar a engrenagem central do servo para que seja possível efetuar  a retirada da trava que delimita o curso do potenciômetro de posicionamento de eixo.





Agora é necessário "enganar" o circuito de controle de correção do servo, para tanto vamos eliminar o potenciômetro e em seu lugar iremos colocar dois resistores de 2200 ohms, simulando a posição central, ou seja, o circuito do servo sempre vai achar que o mesmo encontra-se exatamente a meio curso, não efetuando correção alguma.




Dois resistores de 2K2 substituem o potenciômetro de 4K7.




O último passo é remontar o servo com muito cuidado para que os terminais dos resistores não encostem nas partes metálicas do motor, colocando-se os quatro parafusos que irão prender todo o conjunto a alteração estará concluida, seu servo agora estará apto a efetuar giros completos de 360°.




Controle

O controle do servo motor alterado se dá da mesma maneira com que se efetua o controle de um servo original, sendo que a única diferença é que um tem limitação de giro e compensação de posicionamento e outro não. Para que fique bem claro este controle, eu postei um vídeo onde utilizo a ferramenta Superprobe gerando os pulsos de controle. No display pode se observar o valor atual da largura de pulso.




Em breve projeto de braço robótico com servomotores controlados através da placa PK2Lab.
Por hoje é isto, bons projetos!

 

4 de dez. de 2011

Controle Remoto RC5

Olá pessoal, hoje iremos abordar um periférico bem bacana que é o Sensor IR encontrado na placa PK2Lab. Este sensor nos trás a possibilidade de controlarmos a placa a distância utilizando controles remotos convencionais de televisores e outros produtos de consumo a que temos acesso diariamente e que muitas vezes acabamos descartando por falta de uso. 


Funcionamento:

O sensor IR baseia se na iluminação infra vermelha que é uma luz não visível ao ser humano, pois seu comprimento de onda é muito longo para ser detectado pelo nosso sistema de visão e que é muito utilizado em comunicações sem fio entre diversos dispositivos como controles remotos, celulares e instrumentos de teste e medição.



Embora não seja vísivel, este tipo de luz é muito mais comum do que imaginamos, o sol é uma fonte inesgotável de luz infra vermelha, outra fonte de luz infra vermelha são as lampadas florescentes encontradas em muitos lares hoje em dia, mas como pode então um controle remoto de um televisor funcionar tão bem em um ambiente em que temos a presença de luz solar ou outra iluminação que gere interferência na comunicação?
Para que tenhamos uma comunicação realmente confiável, faz se o uso de uma modulação em frequência, na forma de um trem de pulsos quadrados na frequência de 36KHz, que é denominada portadora.  Cada bit 0, é composto de 889us de pulsos a frequência da portadora, seguido de 889us em nível baixo, enquanto um bit 1 é formado de 889us em nível baixo, seguido de 889us de pulsos a frequência da portadora.


                               

Protocolo RC5

O protocolo RC5 foi desenvolvido pela Philips em 1980 para ser utilizado em seus equipamentos de consumo e consiste em uma palavra de 14 bits, sendo que, os 2 primeiros bits são StartBits, servem para o receptor regular o AGC(Controle de ganho automático), o bit seguinte é chamado de Toogle, e serve como um indicador de Status informando ao receptor se a tecla está sendo continuamente pressionada ou se simplesmente foi pressionada apenas uma vez, os 5 bits seguintes são bits de endereçamento e os 6 bits restantes referem se ao comando transmitido. Neste código todos os bits têm a mesma duração de 1778us e usam a codificação Manchester, onde uma transição descendente corresponde ao bit 0 e uma transição ascendente corresponde ao bit  1. A duração de cada mensagem é de 24,889ms e a distância mínima entre mensagens é de 88,889ms, ou seja, 50x a duração de bit.


A Philips implementou um sistema completo, com endereços e comandos padronizados para cada tipo de equipamento, abaixo podemos visualizar estas informações:



Para o nosso exemplo, vamos utilizar um controle remoto de televisor Philips cujo código de endereço é zero (controle da foto abaixo), porém foram testados vários outros controles que usam o mesmo protocolo RC5 e todos eles efetuaram o controle da placa corretamente. Apenas temos que levar em consideração o fato de que nem todos os controles da Philips realmente usam a norma RC5, os mais novos já utilizam o protocolo RC6, que é a evolução do protocolo em análise.





Programa do microcontrolador:

Para decodificar este protocolo, é necessário esperar que o sensor TSOP4838 que está conectado ao pino RB0 do microcontrolador, detecte o primeiro StartBit da mensagem para ler os 13 bits restantes. Para isto, dois delays foram implementados , sendo que o primeiro de 4867us é chamado após a detecção do StartBit para aguardar o período de AGC mais o Toogle (não utilizado neste exemplo), assim quando retornar do delay, o programa  estará exatamente no ponto de efetuar a analise do primeiro bit referente ao endereço, posteriormente é chamado o delay de 1770us e é feito novamente a análise do bit, e este procedimento se repete até que obtenhamos  os próximos bits referentes à informação de endereço e por fim comando.




Usei a função de analisador lógico da placa PK2Lab para capturar dois frames do protocolo RC5. Nestes frames podemos observar que apenas houve alteração no ultimo bit da mensagem que passou de 0 para 1. Esta função de análizador é uma ferramenta muito útil na análise de protocolos pois nos permite efetuar as medições de tempo entre transições, para isto após a captura basta clicar com o botão esquerdo do mouse em cima do inicio da transição e depois clicar com o botão direito do mouse no final da transição que se deseja analizar, o tempo e a frequência serão mostrados na tela do software. 


Frame tecla 0

Frame tecla 1


O programa foi desenvolvido em duas versões, uma em assembly, desenvolvida por Marcos Guilherme Cunha e outra em C desenvolvida por Jean Carlos da Silva. As duas versões seguem a mesma idéia, porém, vale ressaltar que o programa escrito em assembly teve uma complexidade muito maior no que diz respeito aos delays.

Vídeo demonstrando o funcionamento do programa na placa PK2Lab.



 Arquivos para download:


Código fonte do programa C (MikroC)
Código fonte do programa Assembly (MPLAB) 

Agradecimento especial ao colaborador Marcos Guilherme Cunha que gentilmente desenvolveu a versão em assembly para este post.




27 de nov. de 2011

Controle de Fader Behringer

Olá galera! após algumas provas da faculdade me sobrou um tempinho e aqui estou para mostrar para vocês mais um projeto utilizando a placa PK2Lab.

Antes de continuar, temos que nos familiarizar com o termo técnico "fader" que é a forma que os operadores de áudio usam ao se referirem ao potenciômetro deslizante, estes faders podem ser motorizados ou não, e são um dos ajustes mais recorridos nas mesas de audio e iluminação.


Fader motorizado Behringer




No mundo do áudio profissional, é comum nos depararmos com mesas de som digitais, onde todo o processamento de som é feito em poderosos DSP's e o posicionamento dos faders se faz com o uso de motores CC e correias, com isto podemos ter em 16 faders o controle de 64, cada conjunto de 16 faders em uma página de controle, ao se alterar entre páginas, os eixos dos faders também se alteram, conforme a memória da página que estiver selecionada.

 

Como eu estava com um destes faders em mãos, resolvi brincar um pouco e desenvolvi um pequeno código para demonstrar o funcionamento do mesmo, o código é muito simples e consiste em ler o valor correspondente do fader que está conectado ao PORTA1 e comparar com os dados enviados via USB, então o programa fica o tempo todo mantendo a posição do eixo, ou seja, no caso de alguma força externa mover o cursor, o programa tentará corrigí-lo imediatamente, claro que há outras maneiras muito mais elegântes de efetuar este controle, como por exemplo utilizando um controle PID, porém o foco do post é dar uma idéia de como é que funcionam estas mesas e não este tipo de implementação.
Para efetuar o controle do motor CC conectado ao fader, utilizamos CI driver TA7291S fabricado pela empresa Toshiba que consiste em uma ponte H completa de 1A. Para acionar o motor, precisamos apenas de dois sinais TTL onde temos as funções de girar a esquerda, girar a direita, freiar e liberar o motor.



Este driver possui ainda circuito de proteção térmica e de sobrecorrente, alem de um pino Vref onde é possivel controlar a corrente que flui pela ponte. 
Um pequeno Proto Board foi utilizado para interligar o driver à placa PK2Lab, onde os pinos Vcc(2), Vref(8) e Vs(6) estão conectados a alimentação de 5V, os pinos de controle IN1 e IN2 estão conectados ao PORTD0 e PORTD1. O motor deste fader como característica a tensão de trabalho de 8V, porém anos testes o sistema se comportou muito bem trabalhando a 5V.


 
Para este projeto também criei um pequeno supervisório em C# para que se possa controlar e ter um feedback da posição do eixo do fader, os dados são lidos e escritos diretamente no buffer da USB que está configurado no modo HID (Human Interface Device) que é a mesma categoria em que se encontram teclados e mouses USB. 

 

Um detalhe interessante deste software, é que ele nós dá a informação real da posição do eixo do fader e isto é um recurso poderosíssimo pois desta forma temos certeza de que o comando enviado ao fader foi corretamente interpretado e o ajuste foi executado.


 Abaixo um vídeo demonstrando o funcionamento do projeto. 




Para que vocês possam ter idéia de como são rápidos estes ajustes nas mesas digitais, posto o vídeo de uma mesa de som YAMAHA 01V96 chamado "Dancing Faders" em que os faders aparecem "dançando", claro que não passa de uma brincadeira do tecnico de som, mais nos dá a ideia exata do poder e da precisão deste controle.




Arquivos para download:

 Por hoje é isto, boms projetos!

6 de nov. de 2011

PK2Lab e Flowcode 4


Hoje apresento a vocês um software muito interessante desenvolvido pela empresa Matrix Multimedia e que é considerado uma das linguagens de programação mais avançadas para microcontroladores disponível na atualidade, chama-se Flowcode. 


A grande vantagem do Flowcode é que permite aos utilizadores com pouca experiência criar circuitos eletrônicos e sistemas robóticos complexos de forma simples e intuitiva. O Flowcode é uma linguagem de programação poderosa que recorre a macros para facilitar o controle de dispositivos complexos, como displays de 7-segmentos, controladores para motores e displays LCD. A utilização de macros permite ao utilizador controlar dispositivos eletrônicos extremamente complexos de uma maneira mais transparente. 



Além de gerar o código binário para gravação do microcontrolador, esta ferramenta permite a simulação de uma ampla gama de periféricos na própria tela e de forma muito eficiente, mostrando no painel de controle, muitas informações referentes aos componentes adicionados ao projeto, podemos citar como exemplo o componente PWM, que mostra a forma de onda gerada com as informações de período e ciclo ativo (Duty Cycle).

Outra vantagem é que este software é completamente compatível com a placa PK2Lab, não sendo necessário abrir o código em outro aplicativo para efetuar a gravação, apenas execute a compilação que o programa é automaticamente gravado na placa, tudo através de um cabo USB. 

Para demonstrar o funcionamento do software, criei dois tutoriais em vídeo, que mostra a criação de um simples programa que alterna os led's conectados ao PORTD da placa PK2Lab e o processo de configuração da placa PK2Lab junto ao software Flowcode.






Ao instalar o software, é necessário selecionar o programador PicKit2 para que o software reconheça a placa PK2Lab como destino do projeto. O Software possui ainda uma versão gratuita de avaliação que pode ser baixada diretamente do site do desenvolvedor.

Acesse os links abaixo para obter maiores informações.

Manual em Inglês

Página do desenvolvedor

Vídeos de treinamento (Inglês)
 


Bom, espero que tenham gostado, boms projetos! 

******************************************************************************************************************