Configurando um Microcontrolador ARM7 (32bits)

Bem, neste post, vamos ver como configurar corretamente os recursos de controle da CPU ARM7 da família de microcontroladores ARM LPC21XX.

Para isso, vamos detalhar o funcionamento dos seguintes módulos contidos na arquitetura destes processadores (32bits): PLL; MAM; Divisor VPB;

PLL

O PLL (Phase Locked Loop), trata-se de um multiplicador da frequência do cristal ligado externamente. Em geral, esse cristal externo, ligado ao microcontrolador, é de faixa de 8MHz a 25MHz. E com o PLL, podemos elevar essa frequência a até 60MHz direto no núcleo do processador.

O PLL, possui 4 Registradores especiais para configuração e é com base nessa configuração, feita de maneira correta, que podemos elevar o CCLK (Clock que chega ao núcleo do Processador) a até 60MHz. São eles: PLLCFG; PLLCON; PLLSTAT; PLLFEED;

IO ARM 3

PLLCFG

Basicamente, o PLL é composto por dois CONTROLES: M (que é o multiplicador do PLL) e o P (que é o divisor do PLL). Devemos ajustar valores para estas duas variaveis afim de obtermos o valor final da frequencia de trabalho (limitada em 60MHz).

A relação da fómulas que devemos equacionar para trabalhar os valores de M e P são as seguintes:

1 – CCLK = M x Osc (Osc = frequencia do cristal ligado externamente ao Microcontrolador);

*Ou seja, para Osc = 12MHz e M = 2, temos CCLK = 24MHz;

2 – FCCO = CCLK x 2 x P   (FCCO = Frequency Current-conrolled Oscillator)

*Sendo que:          156MHz <  FCCO  < 320MHZ;

Uma vez definidos os valores de M e P, utilizamos estes valores para formar o Byte do Registrador PLLCFG, da seguinte forma:

IO ARM 4

Onde MSEL representa os possiveis valores de M e PSEL representa os possiveis valores de P. Estes possiveis valores de M e P são dados de acordo com a tabela abaixo:

IO ARM 5

Devemos trabalhar valores para M e P  afim de que estas duas equações citadas acima sejam estabelecidas. Abaixo uma planilha com alguns possíveis valores para M e P como exemplo:

IO ARM 6

 

PLLCON

Esse registrador habilita o modulo PLL

IO ARM 8

 PLLFEED

Após a configuração de todos os registradores citados acima, devemos carregar o Registrados PLLFEED para carregar todas essas configurações no módulo PLL e inicializa-lo.

A sequência deve ser (SEMPRE!):

1 – Carregar o valor 0xAA;

2 – Em seguida carregar o valor 0x55;

Pronto. Todas as configurações definidas para o módulo PLL são carregadas e ativadas.

MAM

MAM (Memory Acceralator Module). Coloca parte da memória Flash em uma área da RAM para acesso rápido ja que o acesso a Flash é um barramento de no máximo 20MHz e o núcleo ARM pode chegar 60MHz.

Divisor VPB

O Divisor VPB atua realizando uma divisão do sinal de Clock após o PLL. Mas não altera a frequência que chega ao núcleo do processador. Só atua sobre a frequência que chega ao barramento VPB (VLSI Peripheral Bus). Dessa forma podemos ter um processador rodando a uma alta frequência mas com periféricos que podem rodar a uma baixa frequência caso seja solicitado. A divisão pode ser feita por 1, 2 ou 4.

Costumo utilizar a função abaixo para a configuração inicial de Micrcontroladores ARM.

IO ARM 7

junto com as seguintes definições:

#define FOSC 12000000
#define Fcclk (FOSC * 5)
#define Fpclk (Fcclk / 4) * 1
#define PLL_M 5 //
#define MSEL (PLL_M-1)
#define PSEL0 5
#define PSEL1 6

#define PLLE 0
#define PLLC 1

#define PLOCK 10

#define PLL_FEED1 0xAA
#define PLL_FEED2 0x55
/*MAM(Memory Accelerator Module) – Definição: MAM fully enabled = MAM-Mode 2
MAMCR – 00 = MAM esta desabilitado (Default)
01 = Funcionamento parcial do MAM
10 = Ativa todas as funções do MAM
11 =- System-Clock cclk=24MHz -> 2 CCLKs are proposed as fetch timing
MAMTIM – Numero de cicles para acesso a memória flash
*/

#define MAM_MODE 2
#define MAM_FETCH 2

/*VPB (V… Pheriphal Bus) – Definição: VPB será definido para mesma frequncia do nucleo -> devider VPBDIV=1
=> pclk = cclk = 24MHz
*/
#define VPBDIV_VAL 1

Esse código bem como os demais que irei publicar sobre configuração de programação em C para ARM7, podem ser testados utilizando a PCI Titan desenvolvida pela Eng-House.

 

IMG_20140928_101526_543

Até a proxima!

 

 

Configuração e Acionamento de IO para ARM7 (32 bits) em C

Para acionamento de IO dos microcontroladores da Familia LPC21XX, temos o GPIO (General Purpose Input Output). Este periférico é responsável pelas definições de entradas e saídas a serem definidas para cada IO.

Veja abaixo a disposição do Mapa de perfirécos presentes nesta plataforma ARM7 ( Exemplo: LPC2142)

 

IO ARM 2

O GPIO é composto por 4 registradores específicos. Cada qual com uma função de controle ou varredura. São os registradores: IODIR;  IOPIN; IOSET; IOCLR; Cada registrados possui seu endereçamento em 32 bits para representação de todos os IO´s do PORT

Na tabela abaixo, segue um resumo da definição e respectiva função de cada um:

IO ARM 1

 

Como demonstração para este estudo, irei utilizar um Kit ARM 7 desenvolvido pela empresa Eng-House. O mesmo pode ser adquirido por este LINK DIRETO. Este Kit pode ser usado para este estudo bem como para os demais que estarei demonstrando. Exemplos de programas e periféricos da família ARM7 LPC21XX.

IMG_20140928_101526_543

Como de costume, esta disponibilizado o Download completo do programa no final do Post para servir de referencia de estudo.

A seguir, irei descrever alguns pontos relevantes deste estudo. Lembrando que o programa foi desenvolvido com a utilização da IDE KEIL 4 da uVision. é disponibilizado uma versão gratuita para estudantes com limitação em 32kB de código no link abaixo:

KEIL 4 uVision

um exemplo de utilização em linguagem C.

#define OUT1 (1 << 7) //P0.7_PWM2
#define OUT2 (1 << 8) //P0.8_PWM4
#define OUT3 (1 << 21) //P1.21_PWM5
#define OUT4 (1 << 9) //P1.9_PWM6

IOSET0 |= OUT1; //coloco a saída P0.7 do microcontrolador em nível ALTO
delay(50000); /* Delay 50000us */
IOCLR0|= OUT1; //coloco a saída P0.7 do microcontrolador em nível BAIXO

IOSET0 |= OUT2; //coloco a saída P0.8 do microcontrolador em nível ALTO
delay(50000); /* Delay 50000us */
IOCLR0|= OUT2; //coloco a saída P0.8 do microcontrolador em nível BAIXO

IOSET1 |= OUT3; //coloco a saída P1.21 do microcontrolador em nível ALTO
delay(50000); /* Delay 50000us */
IOCLR1|= OUT3; //coloco a saída P1.21 do microcontrolador em nível BAIXO

IOSET1 |= OUT4; //coloco a saída P1.9 do microcontrolador em nível ALTO
delay(50000); /* Delay 50000us */
IOCLR1|= OUT4; //coloco a saída P1.9 do microcontrolador em nível BAIXO

Notem que eu não preciso seguir sequencialmente os bits do PORT. Eu realizo o acionamento dos mesmo conforme desejo e necessidade. Aleatoriamente.

Muitos podem achar curioso a utilização da expressão:

IOSET0 |= OUT4;

O “|=” é uma abreviação da operação bit a bit: IOSET0 = IOSET0|OUT4;

Dessa forma realizamos o “SET” para nivel ALTo do bit P1.9 sem afetar o estado anterior dos demais bits (IO´s) deste PORT.

Abaixo o exemplo completo deste programa que acompanha o Kit TITAN/LPc2142 da Eng-House;

Download

Um exemplo de utilização do Keil uVision4 para criar um arquivo de projeto – ARM Keil

1. Introdução

Neste post, vamos falar sobre o procedimento para criar um programa usando linguagem C. A IDE utilizada para isso é o Keil.

O Keil uvision, possui seu próprio editor de texto incorporado à IDE o que facilita o processo de criação do projeto.  A principio, vou me atentar somente à criação do projeto que deve seguir alguns passos importantes antes de iniciar a programação propriamente dita.

2. Criando um novo projeto no Keil

2.1. Abra o programa Keil uVision4. Sua IDE básica possui a configuração abaixo:

figura 1

2.2. Vamos agora iniciar as configurações padrões do Keil . Clique em Projetct→ New uVsion Project

figura 2

2.3. Em seguida, escolha o diretório onde será salvo seu projeto e o nome dele. Após esta etapa, selecionamos o Microcontrolador ARM no qual nosso projeto será baseado. Para o meu caso, estarei sempre trabalhando com a plataforma LPC2129/01.

figura 3

figura 4

figura 5

2.4. Agora será oferecido um arquivo de startup de configuração do microcontrolador escolhido. Clique em OK.

NOTA: Depois de configurar o Microcontrolador para o projeto, nesta etapa, programa vai esperar para que o usuário confirmar a aceitação de uma cópia do arquivo de inicialização do Keil. O arquivo Startup.s . Este arquivo de inicialização vem com a configura  default de operação para o Microcontrolador escolhido. Caso este arquivo não seja aceito neste momento, todas as diretivas contidas nele devem passara a fazer parte do programa desenvolvido pelo próprio usuário.

O arquivo Startup.s do Keil-ARM é um arquivo Assembly onde são  configurado os conjunto de valores de operação do Keil .

figura 6

Neste momento, nossa IDE já começa a tomar “corpo”. Já podemos notar no canto esquerdo superior os componentes atuais de nosso projeto bem como sua hierarquia e extensões de cada arquivo.

figura 7

2.5. Devemos agora selecionar Project → Components, Enviroment, Books … e, em seguida, clique em Folders/Extensions, selecionar o valor padrão para o compilador o título.

figura 9 figura 11

2.6. Certifique-se que as  seleções das caixas de configuração estão como na imagem abaixo:

figura 11

2.7. Existem algumas opções de configuração a serem efetuadas diretamente na IDE do Keil. Elas são importantes para o caso de você utilizar o Debug do simulador do Keil. Um recurso bastante interessante que será citado em particular a frente.

2.8. Clique em  Project → Options for Target …

2.9. Configurar o X-TAL. No meu caso especifico estarei colocando 12 MHz e verifique se a configuração da memória esta de acordo com o Mapa de memória do seu Microcontrolador. Você pode obter esta informação através do Datasheet  do seu microcontrolador escolhido.

figura 12 figura 13

2.10. Output: Seleciona o check box para criação do arquivo .Hex. Finalizar em OK como na imagem abaixo.

Nota: O procedimento acima é importante ser realizado independente da utilização do simulador ou PCI Didática. Pois só a partir deste momento o Keil passará a gerar o arquivo .hex que será descarregado no Microcontrolador. Ou seja, o Keil pode compilar o programa sem erros e não gerar o arquivo .hex? A resposta é SIM caso este check Box não esteja “flagado”.

figura 14

3. Escrevendo o Programa

Agora iremos começar a escrever nosso arquivo de projeto em C. Clique em File→ New … ou podemos utilizar o atalho colocado no menu principal:

figura 16

E vamos começar …

3.1. Após finalizarmos nosso programa, devemos salva -lo colocando como extensão .c. File→Save as..

figura 17figura 18

Notem que, após nomear o arquivo como “Main.c”, podemos ver que a cor de alguns caracteres no programa são alteradas pelas funções que a mesma representa no programa como comentário, variável e de comando, diretivas, etc. Essa é uma vantagem do Keil de exibir caracteres pelas suas funções, faz com que o utilizador (Programador) tenha uma compreensão melhor e mais intuitiva do programa como na imagem abaixo.

3.2. Para adicionar arquivos em um de projeto, clique em Project → Components, Enviroment, Books … selecione a aba Components, e clique em Add Files..

figura 19

Neste primeiro momento, devemos selecionar arquivos do tipo “Arquivos fonte (*. C)”.

figura 20

figura 22

E a partir do quadro a esquerda, podemos observar toda a hierarquia criada para nosso projeto.

figura 23

3.3. Agora com o projeto organizado, podemos compilar o mesmo e criar os links entre as funções caso existam.

3.4. Podemos executar a compilação clicando no bota abaixo:

figura 24

Agora é compilar e compilar até não haver mais erros….Mas ai já é outro post. Abraço e até a próximo.

Arduino WebServer – Controle de saídas por interface Web

Bem, este é meu primeiro trabalho relacionado à plataforma Arduino que publico e nele pretendo apresentar uma interface bastante utilizada atualmente, rede Ethernet.

Neste meu projeto estou utilizando uma plataforma Arduino Mega 2560, o código fonte que estou disponibilizando ao final do projeto foi compilado na versão 1.0.5 da IDE do Arduino.

Estou utilizando também o Arduino Ethernet Shield W5100, para realizar a interface Ethernet do Arduino. Também estou utilizando uma placa com expansão para 8 reles.

IMG_20130528_141341_284

A ideia de utilizar o Arduino como WebServer atua da seguinte maneira: Transformamos o Arduino em um “Servidor Web”, dando a ele um endereço IP dentro da rede que estaremos trabalhando. Importante! Devemos atribuir um endereço IP aleátório ao Arduino desde que este endereço não entre em conflito com nenhum dispositivo que ja esteja ativo na rede! no meu exemplo utilizo o endereço 192.168.1.177.

Logo, se temos no Arduino um “servidor Web”, podemos, a partir de qualquer Browser, acessar seu conteúdo para visualização. è neste ponto que temos a grande sacada de associar funcionalidades de acesso a I/O, acionamento de rele, verificação de entrada, etc, a um estado de monitoramento que podemos colocar a disposição neste interface Web.

Para isso dentro do próprio código do Arduino, “construirmos” esta pagina que queremos ter para a visualização de modificações internas do hardware do microcontrolador. Detalhe, podemos ter desde simples monitoramento como também interação.

Cada saída foi associada a um link. O próprio Arduino gera estes links a partir do código PHP que o Arduino envia ao Browser para gerar o servidor web.

Neste exemplo, além de fazer a leitura de STATUS de 4 saídas ligadas ao shield Arduino RELE, posso através do Browser, modificar esta saídas.

arduino webserver1

Assim, tendo este conjunto de PCI conectados à rede Intranet (local) posso a partir de qualquer browser web(notebook, smartphones, tablets, etc) ter a visualização de acionamentos de lampadas, portões automáticos, sistemas de alarme, enfim, praticamente todo tipo de automação residencial. E no caso de uma industria também com o acionamento de máquina, bombas, etc.

Espero que este projeto seja uma boa base…

Vídeo do projeto

Programa Arduino

 

Download 1

 

Download 2

 

Abaixo, segue uma contribuição de um dos usuários deste blog, Majela Luz. O Majela fez uma alteração no código acima para permitir que o acesso web das portas do Arduino pudesse ser feito fora de uma rede local.

Majela:

“Conforme prometi, estou enviando seu codigo modificado pra funcionar na web.

Apenas modifiquei, as linhas que estavam com ip invalido, para um IP Válido.

Mudancas tambem tiveram que ser feita no roteador para direcionamento de portas..”

 

O código ainda apresenta um problema de não funcionar quando configurado para utilizar mais de 5 reles. Estou verificando este bug. Mas segue em avançado este upgrade feito pelo Majela! E Majela, mais uma vez, muito obrigado pela contribuição!

Download Versão Internet

 

Tutorial de Configuração Padrão para Módulo Transmissores e Receptores Protocolo Zigbee e Comunicação PIC16F877A

Olá pessoal, estou de volta com este novo assunto que estou utilizando bastante atualmente, comunicação RF. Mais precisamente, com a utilização do protocolo de comunicação ZIGBEE que estabele um conjunto de comandos e bandas de frequência já pré definidas para o uso. Segue abaixo as principais caracteristicas de um módulo ZigBee da Maxtream para conhecimento de seus recursos. Tendo sua variante entre as versões XBee e XBee PRO, sendo está ultima diferenciada pelo maior alcance de transmissão do enlace.

Estou utilizando uma base para acoplamento da pinagem do módulo Xbee comercializada pelo site http://www.rogercom.com.

Existem um material muito bom realacionado à comunicação Xbee lá. Logo, neste meu artigo irei focar mais na parte prática, ficando a cargo do leitor um aprofundamento maior no protocolo de comunicação.

A pinagem de cada módulo XBee segue a descrição abaixo:

Toda a configuração é feita a partir do software X – CTU distribuido pela  Digi International  através do link: http://www.digi.com/support/productdetail?pid=3352&osvid=0&type=cabling.

A comunicação com os módulos é feita através de comunicação serial RS232. Para isso deve – se confecionar um cabo para comunicação do módulo com o PC de acordo com o diagrama abaixo:

A partir da porta COM1 temos a comunicação padrão RS232, sendo os paramentros configurados a partir da tela PC Settings, como mostra a figura abaixo.

Uma vez devidamente conectado o módulo ao PC, pode ser feito um teste de comunicação do mesmo a clincando no botão Test/Query.

Abrindo a aba “ Modem Configuration” temos todas as configurações de cada módulo.

Obs.: Nesta etapa as possibilidades de configuração podem variar de acordo com cada PartNumber do módulo e sua respectiva versão de firmware.

Clincando em Read o X-CTU, faz a leitura do Firmware, versão e configuração pré-estabelecida do módulo.

Configuração Modulo Receptor – BASE

A primeira configuração a ser feita diz respeito diretamentamente à topologia de rede que será adotada pois, realizaremos agora definição de todos os pontos que serão “endereçáveis” dentro da rede e, respectivamente, todos os pontos que serão “enxergados” dentro da rede bem como seus pacotes de dados.

As principais topologias de rede que podem ser aboradadas são: Ring – Ponto a Ponto; Mesh; Star – Estrela; Full Conected (Broadcast) – Ponto Multiponto.

Para nosso prjeto, a topologia ideal é a Star, ou Estrela. Dessa forma, configuramos o campo DL – Destination Address Low com o valor Hexa de FFFF. Assim a base reconhecerá todos os módulos que se referenciarem a ela.

No campo MY – 16 Bit Source Address, nomeamos, em Hexa, o endereço da base. Guardem esse valor pois cada módulo remoto será destinado a ele.

No camo NI –Node Identifier, podemos escrever uma string para melhor representar a funcionalidade do módulo em questão. Este campo é somente para um melhor entendimento, o endereçamento de Hardware é definido pelos campos DL e MY.

Agora configuramos como os I/Os do módulo de recepção. Neste caso, módulo de recepção será configurado como saída e os modulos remotos serão configurados como entradas, recebendo, dessa forma, os sinais dos sensores.

Outro campo a ser configurado deve ser o de IA-Input Address que libera o reconhecimento de I/O de todos os módulos presentes na rede. Neste caso configuramos como FFFF. Idem ao configurado no DL – Destination Low.

Após realizar todas as configurações acima, Click em WRITE para gravar as novas configurações no módulo.

Configuração Modulo Transmissor – REMOTO

No campo DL do módulo REMOTO, configuramos com o mesmo valor HEXA atribuído para o campo MY do modulo remoto desta forma será estabelecido o enlace entre os mesmos.

Configuramos agora o campo MY do modulo REMOTO, sendo colocado para primeiro elemento remoto da rede 40, o valor 41.

Também é conveniente criar uma string de reconhecimento do módulo perante a rede.

Iniciamos agora a configuração do direcionamento de I/O do modulo REMOTO. Sendo este responsável somente pela captação de sinais, teremos somente 2 entradas digitais.

O IC (Alterar Detect) e IR (Taxa de amostragem) são parâmetros que podem ser configurados para manter a
saída definida para a sua saída ativa se o sistema precisa de mais tempo do que os temporizadores podem lidar

O IC ( Detecção de Alteração) e o IR ( Taxa de Amostragem) são parametros que podem ser configurados para manter a saída definida ativa se o sistema precisa de mais tempo do que os temporizadores podem lidar. Para isso, a taxa de trasferência de dados aumenta siginificativamente. Proporcionalmente a esse aumento de transmissão, temos o aumento do consumo de energia fato este que para uma aplicação embarcada desse ser levado em consideração.

Configurar o campo DIO Change Detect

Nota: Quando “Change DIO Detect” está habilitada (usando o comando IC), as linhas 0-7 de DIO (Digital I/O) são monitoradas.
Quando for detectada uma alteração em uma linha de DIO, ocorrerá o seguinte: Um pacote de RF é enviado com os níveis actualizados DIO.

NOTA: detectar mudança apenas é suportada quando o Dx de parâmetros (dióxido de configuração) é igual a 3,4 ou 5
Taxa de amostragem (intervalo)
A Taxa de amostragem recurso (Intervalo) habilitado Permite pinos ADC e DIO para ser lido periodicamente sobre
módulos que não estão configurados para operar no modo Sleep. Quando um dos modo de suspensão é
ativado eo IR parâmetro (Taxa de amostragem) é definido, o módulo vai ficar acordado até de TI (Samples
antes TX) amostras foram coletadas.
Uma vez que um pin especial é ativado, a taxa de amostragem apropriado deve ser escolhido. A amostra máxima
que pode ser alcançado enquanto estiver usando uma taxa de linha A / D é de 1 amostra / ms ou 1 KHz (Note que o
modem não será capaz de acompanhar a transmissão ao IR & IT são iguais a “1” e que a configuração
o modem a amostra em taxas maiores do que uma vez a cada 20ms não é recomendado).
Comandos aplicáveis​​: IR (Taxa de Amostragem), IT (amostras antes TX), SM (Sleep Mode)
Primeiro Um pacote de RF é enviado com os níveis de pin actualizado DIO. Este pacote não contém nenhum ADC
amostras.
Segundo A colheita de amostras na fila são transmitidos antes da mudança detectar dados. Isso pode resultar em
receber um pacote com menos de IT (amostras antes TX) amostras.

Sample Rate

Taxa de amostragem, é um recurso que permite, aos pinos habilitados  (ADC e DIO), serem lidos periodicamente em módulos que não estão configurados para operar no modo Sleep. Quando um dos modos é ativado e o IR, parâmetro da taxa de amostragem, é definido, o módulo vai ficar acordado até que  IT (Samples
antes TX) amostras foram coletadas.
Uma vez que um pin especial é ativado, a taxa de amostragem apropriado deve ser escolhido. A amostra máxima
taxa que pode ser alcançado enquanto estiver usando uma linha A / D é de 1 amostra / ms ou 1 KHz (Note que o
modem não será capaz de acompanhar a transmissão ao IR & IT são iguais a “1” e que a configuração
do modem para taxas de amostragens maiores do que uma vez a cada 20ms não é recomendado).
Comandos aplicáveis​​: IR (Taxa de Amostragem), IT (amostras antes TX), SM (Sleep Mode)

I/O Line Passing

Trilhas virtuais podem ser estabelecidas entre XBee ® / XBee-PRO ® Módulos. Quando um pacote de dados RF é
recebidos que contém dados de I/O, o módulo de recepção pode ser configurado para atualizar quaisquer saídas habilitadas (PWM e DIO) com base nos dados que recebe.
Note que as linhas de I/O são mapeadas em pares. Por exemplo: AD0 só pode atualizar PWM0 e DI5 pode
apenas atualizar somente o DO5. A configuração padrão é para saídas a não ser atualizados, o que resulta em dados de E / S
sendo enviado para fora do UART (consulte  IU (Ativar saídas I/O).

IA – Input Address

Para habilitar as saídas para serem atualizadas, o parâmetro IA (I/O Input Address) deve ser configurado com o endereço do módulo que tem as entradas apropriadas habilitado. Isso efetivamente liga as saídas de um módulo de recepção para um determinado módulo de entrada.

Isso não afeta a capacidade do módulo para receber dados na  linha I/O a partir de outros módulos – Rede – apenas a sua capacidade de atualização das saídas habilitadas. O parâmetro IA também pode ser configurado para aceitar I/O de dados para mudanças de saída a partir de qualquer módulo, definindo o parâmetro IA como  0xFFFF – no caso de uma rede.

Quando as saídas são mudadas de seu estado não-ativo para ativo, o módulo pode ser configurado para retornar o nível de saída. Os temporizadores são definidos usando a Tn (Dn Temporizador de saída) e PT (PWM
Saída Timeout) comandos. Os temporizadores são repostos sempre que um pacote de I/O válido é recebido.
O IC (Alterar Detect) e IR (Taxa de amostragem) são parâmetros que podem ser configurados para manter a
saída definida para a sua saída ativa se o sistema precisa de mais tempo do que os temporizadores podem lidar.

Após realizar todas as configurações acima, Click em WRITE para gravar as novas configurações no módulo.

Abaixo segue o esquema elétrico necesário para ligação do Xbee ao PIC:

Segue o link para download do projeto completo do PIC.

https://mega.co.nz/#!iQJRSBpT!R00BTVMSW4fYPi2-Zt06qMiZH1hlLsXjKjabsDWu45I

Utilizando um Acelerômetro 3D MMA7361L

Olá pessoal, neste novo tópico pretendo abordar um novo periférico que vem sendo utilizado com bastante frequencia em novos smartphones, gamers e robótica em geral, trata -se do Acerelometro.
A idéia básica de um acerelometro: Um sensor de posicionamento no espaço. Mais precisamente podemos dizer que o acerelometro é capaz de nos informar a partir de saídas analógicas qual a inclinação do sensor e/ou do objeto no qual estiver posicionado, em relação a uma determinada referência cartesiaca.
Existem acerelometros de 2 eixos, ou seja, podemos obter referencial de posição em ‘X’ e em ‘Y’. E acerelometros de 3 eixos coma variações em ‘X’, ‘Y’, ‘Z’.
Para o projeto que irei descrever como exemplo de aplicação, um acerelometro MMA7361L Low Power, acelerômetro de condicionamento de sinal de 1 pólo com um filtro passa-baixa, compensação de temperatura, auto-teste, 0g-Detecção linear que detecta queda livre e g-Select, que permite a selecção entre duas sensibilidades.
Zero-g offset e sensibilidade são configurados de fábrica e não necessitam de dispositivos externos.

Data Sheet MMA7361L
O MMA7361L inclui um Modo de Espera que o torna ideal para a bateria portátil quando estivermos trabalhando com dispositivos embarcados, esta caracteristica será muito importante para uma maior vida útil da bateria.
Principais características do nosso acerelometro :
• 3 mm x 5mm x 1,0 milímetros pacote LGA-14
• Baixo consumo de corrente: 400 mA
• Modo Sleep: 3 mA
• Operação de Baixa Tensão: 2,2 V – 3,6 V
• Alta Sensibilidade (800 mV / g@1.5g)
• Sensibilidade selecionável (± 1,5 g, ± 6g)
• Ligue Rápido On Time (0,5 ms Tempo de Resposta Ativar)
• Auto teste Freefall Diagnóstico Detecção
• 0g-Detecção de Proteção Freefall
• Condicionamento de sinal com filtro passa-baixa
• Design robusto, Sobrevivência Choques alta
• Baixo Custo
Aplicações típicas
• Jogos em 3D: Sensoriamento Tilt e Movimento, Registro de Eventos
• PC portátil: Detecção Freefall, Anti-Theft
• Telefone Celular: a estabilidade da imagem, rolar texto, Discagem Motion, E-Compass
• Pedômetro: sensor de movimento
• Navegação e Dead Reckoning: E-Compass Compensação de Inclinação
• Robótica: sensor de movimento

O dispositivo consiste de: uma superfície microusinada capacitiva célula de detecção (g-célula) e um sinal de condicionamento contidos numa única embalagem. O elemento sensor é selado hermeticamente ao nível da bolacha usando um volume microusinado.
O g-célula é uma estrutura mecânica formada a partir de materiais semicondutores (polissilício) utilizando semicondutores. Ele pode ser modelado como um conjunto de vigas ligados a uma massa móvel central, que se movem entre os feixes fixos. As vigas móveis pode ser deflectido a partir da sua posição de repouso, sujeitando o sistema a uma aceleração (Figura 1).
Como os feixes estão ligados ao movimento da massa central, a distância a partir deles para as vigas fixas de um lado irá aumentar na mesma proporção que a distância para o fixo, do outro lado, diminui. A mudança na distância é uma medida da aceleração.
As vigas g de células formam dois back-to-back capacitores (Figura 1). À medida que o feixe se move com aceleração no centro, a distância entre as vigas e as alterações de cada condensador de valor mudará, (C = Aε / D). Onde A é a área da viga, ε é a constante dieléctrica, e D é a distância entre as vigas.

figura 1


RECURSOS ESPECIAIS
0g-Detecção
O sensor oferece um recurso de 0g-Detect que fornece uma sinal lógico, quando todos os três eixos estão em 0g.
Self Test
O sensor fornece um recurso de auto-teste que permite que a verificação da integridade mecânica e elétrica do acelerómetro, em qualquer momento antes ou depois da instalação. Nós podemos usar o auto-teste para verificar a soldabilidade para confirmar que a peça foi montado na PCB corretamente. Para usar este recurso para verificar a função 0g-Detect, o acelerômetro deve estar de cabeça para baixo.
g-Select
O recurso de g-Select permite a seleção entre duas sensibilidades. Dependendo da lógica de entrada colocada no pino 10, o ganho interno do dispositivo será alterado permitindo que funcione com uma sensibilidade de 1,5 g ou 6 g (Tabela 3). Este recurso é ideal quando um produto tem aplicações que requerem duas diferentes sensibilidades para um ótimo desempenho. A sensibilidade pode ser alterada a qualquer momento durante o funcionamento do modulo. O g-Select pino pode ser desligado para aplicações de apenas uma sensibilidade de 1,5 g como o dispositivo tem um pull-down interno para mantê-lo na sensibilidade 800mV / g.
Sleep Mode
O acelerômetro de 3 eixos proporciona um Modo de Espera que é ideal para dispositivos que utilizam bateria. Quando o modo de sleep está ativo, as saídas do dispositivo estarão desligadas, proporcionando significativa redução da corrente de funcionamento. Um sinal de entrada baixo no pino 7 (Sleep Mode) irá colocar o dispositivo neste modo e reduzir a corrente a 3 mA. Para menor consumo de energia, é recomendado definir g-Select no modo 1,5 g. Ao colocar um sinal alto na entrada do pino 7, o dispositivo retoma o modo normal de operação.
Filtragem
O acelerômetro de 3 eixos contém um bordo de um pólo ligado a filtro capacitor, não há nenhuma exigência para componentes passivos externos (resistores e capacitores) para definir a freqüência de corte.
Ratiometricity
Ratiometricity significa simplesmente que a tensão de saída de offset e sensibilidade aumentará linearmente com a tensão de alimentação aplicada. que é, como tensão de alimentação é aumentada, a sensibilidade e desvio aumentam linearmente, como uma diminuição da tensão de alimentação, deslocamento e sensibilidade diminua de forma linear. Esta é uma característica fundamental quando a interface para um microcontrolador ou um conversor A / D.
Para demonstrar um exemplo prático da utilização do acelerômetro em um circuito de aquisição A/D.
Sendo que para visualização da variação das coodenadas ( x e y) utilizarei um display LCD para apresentação das mesmas.
Abaixo, seguem um video demonstrando a aplicação e logo depois, o projeto completo para Download.

 

Abaixo, segue link do projeto.

https://mega.co.nz/#!mZgWUC4D!uuj7f3sKACV0FO8_VZmALZWvHbsVoptWS8mj1-zG0C8

 

 

Controle de Multiplos Servo Motores via SERIAL – PIC18F4550

Olá pessoal, estou escrevendo este novo tópico mostrando desta vez uma junção de 2 tópicos já abordados: Comunicação SERIAL com o PIC e Controle de Servo Motores.

A partir destes elementos, temos o nosso novo projeto que trata –se do Controle de Servo Motores a partir da porta SERIAL (COM1).

Diferentemente do último tópico que trabalhamos com servo motores em que para isso utilizamos somente um canal de controle. Para diferenciar um pouco neste novo projeto, vou apresentar uma das… maneiras que podemos utilizar para o controle de múltiplos servos, podendo este possuírem movimentos independente ou também, sincronizados,

Basicamente não existe nenhum novo conceito sendo abordado diferente do que já foi mencionado em cada respectivo tópico.

Segue abaixo o circuito necessário para a construção deste projeto:

blog_engleandroalves_PIC_SERIAL/USB_Servo

Veja o resultado esperado.

E aqui temos o nosso projeto completo para Download, para que vocês posam utilizar de base no desenvolvimento desta aplicação ou customização do projeto de vocês.

Download Projeto Completo Exemplo 1

https://mega.co.nz/#!CdQQhCBK!mVjTl1oZXSOVMMsmHUP7mQ8NdtMVyI27QQYIctWONZY

Download Projeto Completo Exemplo 2

https://mega.co.nz/#!SJ5zWZyL!2IodxY1fAYpBsIT6V6-8HJBb9ADTATdghk8mejfkGFQ

 

Apostila de Programação em C para PIC

Pessoal, a quem interessar segue uma apostila de programação em C para PIC.

Creio que irá ajudar aos que estão buscando material para estudo.

Ela não é de minha autoria mas eu recomendo.

https://mega.co.nz/#!7RxA3JBZ!iV6LYCNmFgeB3ZhMeVlBoqi5q1nb8bKikdyUFulkJyw

Controlando Servo Motores com PIC16F877A

Olá pessoal, estou de volta com um novo tópico mostrando como controlar um Servo Motor utilizando um PIC16F877A.

Para os projetos de mecatrônica que necessitam da utilização de atuadores com precisão de movimento, os servo motores são sempre uma boa alternativa por serem baratos, fáceis de encontrar e já possuírem um circuito de controle padronizado para os movimentos do mesmo.Também são bastante utilizados no controle remoto de aeromodelos, automodelos, e outros veículos radiocontrolados.

Em geral, todos os Servo Motores são nada mais do que motores de passo com um circuito dedicado para o controle efetivo dos seus movimentos, conferidos através de um potenciômetro ou taco gerador.

Dessa forma, para termos o controle efetivo do Servo Motor, basta utilizarmos este protocolo já desenvolvido.

O protocolo é o seguinte: Todo Servo Motor sempre possuirá uma amplitude e rotação de 180°, dessa forma teremos o controle dos extremos dessa amplitude dados pela duração do sinal de controle. Isto mesmo, o controle dos Servo Motores funcionam baseados na duração dos pulsos de controle que são inseridos no mesmo sendo a janela destes pulsos variando entre 1ms e 2ms num período constante de 20ms.

Esta é a razão pela qual, todo Servo Motor possui somente 3 fios para ligação:

Existem várias maneiras de chegarmos nesse nível de precisão de controle utilizando um Microcontrolador, PIC, 8051, ARM, etc. Para nosso exemplo utilizando o PIC16F877A farei um controle baseado no TIMER0 do mesmo. Dessa forma teremos um controle com precisão independente de qualquer outra rotina de tratamento do Microcontrolador.

Geralmente as pessoas fazem este controle utilizando as saídas PWM dos microcontroladores. Eu prefiro não fazer desta forma, pois em geral os Microcontroladores possuem poucas saídas PWM, 2 em média. Dessa forma vamos utilizar uma alternativa que uma vez utilizando o Timer do PIC, podemos trabalhar com qualquer I/O.

A ideia básica consiste em gerar uma interrupção de acordo com o intervalo do periodo que deejamos para a saída. Utilizaremos para isso a função de delay_us(). Este ainda não é o melhor método pois o programa ficará “esperando” para seguir a rotina, mas será bem eficaz para entender o processo de controle do Servo. Mais adiante iremos melhorar ainda mais este artificio.

Com este tipo de controle temos também a vantagem de controlar o Servo motor sob toda a sua amplitude de atuação, 0° – 180°.

Segue um vídeo do projeto em funcionamento e ,como de costume, o projeto completo para DOWNLOAD.

Lembrando que o projeto nada mais é do que uma simples referência para a criação de seu projetos e próprias aplicações.

Falou e até a próxima!!!!

https://mega.co.nz/#!SJ5zWZyL!2IodxY1fAYpBsIT6V6-8HJBb9ADTATdghk8mejfkGFQ

Utilizando Módulo PWM – CCP – PIC16F877A

Olá pessoal, estou de volta neste novo tópico para apresentar a utilização da técnica PWM (Pulse Width Modulation – Modulação por largura de Pulso) que é também mais um recurso/periférico disponível em alguns Microcontorladores da familia PIC.

Porém antes de tudo, vamos entender um pouco mais sobre o que vem a ser a Modulação por Largura de Pulso.

A modulação PWM é bastante utilizada na eletrônica de potência mas também pode ser aplicada em qualquer outro sistema que venha a necessitar de uma precisão de controle de nível DC.

Na modulação PWM, mantemos a amplitude do sinal sempre igual sendo a variação executada na largura do pulso. Dessa forma, variando a largura do pulso, já préviamente configurada de acordo com a frequência. Nota! Uma vez definida a frequência de atuação,  temos o período de nossa forma de onda sempre constante. Temos a variação do nível médio de tensão do sinal de saída.

Para este projeto irei utilizar o PIC16F877A novamente pois o mesmo possui o módulo PWM embutido e teremos uma compatibilidade total com os demais tópicos já apresentados no site ficando a cargo de vocês uma mescla da utilização de todos os periféricos já abordados.

O PIC16F877A possui a opção de configuração de duas portas de saída utilizando o modo PWM. Através dos Port´s onde estão o CCP1 e o CCP2 respectivamente nos pinos 16 e 17.

Para este PIC, sua alimentação é data por 5VDC, assim sendo, 5VDC será nosso valor de fundo de escala do modulador PWM. Tanto o CCP1 quanto o CCP2, possuem resolução de trabalho de 10 bits. Logo nossa variação na saída de cada modulo PWM possuirá uma resolução mínima de 4,88mV. Ou seja, podemos incrementar nosso modulo PWM em intervalos de tensão de 4,88mV até chegarmos ao nosso fundo de escala de 5V.

segue um video exemplo da aplicação.

Segue abaixo, o projeto completo.

https://mega.co.nz/#!yZowlSza!7QPgGWtdlb1DoCMmLMGinWPEOXmZNTs74VrTEb62Qk0