Mostrar mensagens com a etiqueta Sensores. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta Sensores. Mostrar todas as mensagens

A luta continua... e está para durar eheheh.
Uma breve noção de SPI: SPI é um método de comunicação síncrona que utiliza SDI, SDO, SCK e mais 1 ou 2 pinos que neste caso não interessa.
Configurado tudo isto, chego ao primeiro problema: o PAN3101 utiliza um pino para SDIO e outro para SCK,  mas no meu MCU tenho 2 pinos a fazer o trabalho de 1 (SDI + SDO = SDIO).
Resolvi a questão da seguinte forma: liguei ambos os pinos, SDI + SDO, e como o pino de SDI está sempre configurado como input, posso trabalhar normalmente com o SDO. Quando quiser receber alguma coisa, coloco o SDO também como input, para que não force a comunicação a ir para Low ou para High.
Resolvido isto, tenho apenas um problema, quando estou a fazer a transmissão o registo SSPBUF fica cheio  com o que acabei de transmitir e a flag SSPIF deixa de ter efeito, então faço o clear do registo primeiro.
Como se pode ver na página 4 do datasheet, se eu pedir a leitura do endereço 0x14 (enderesso para teste de comunicação), a resposta deveria ser 0x10, ou 16 em decimal, ou 10000 em binário.
Excerto do código:

PIR1bits.SSPIF=0;
SSPBUF=0x14;
while(!PIR1bits.SSPIF);
SSPBUF=0;
PIR1bits.SSPIF=0;
TRISB2=1; //tri-state
while(!PIR1bits.SSPIF); //espera resposta
A[2]=SSPBUF;
TRISB2=0; //output again
A[2]=16, então a comunicação está a ser bem feita.

O problema até agora é quando peço a leitura do endereço 0x02 ou 0x03, que me deveria dar o deslocamento, o resultado ou é 0 (0b00000000), ou é -1 (0b11111111).

A investigação continua.....

A luta continua...
Não estou a conseguir comunicar com o sensor. Ele "responde" algo, mas não faz muito sentido...
PARTE 1
PARTE 2

Cá estou e para a segunda parte ao hack do sensor PAN3101.
Desta vez não há muito a dizer. Ficou praticamente tudo explicado na primeira parte e, por agora, só ainda tive tempo de o preparar para os testes.
Retirei o sensor da PCB do rato, assim como os componentes essenciais ao seu funcionamento. Cortei uma veroboard na medida certa para alojar a lente e o restante circuito.
Este é um daqueles projectos que estou a achar muito interessante. Este sensor, aparentemente, poderá ter inúmeras aplicações em robótica de pista, como é o caso do micromouse. No entanto os prós e contras só poderão surgir quando alguns testes já estiverem a ser feitos. Por agora o único contra é o da superficie da pista, pois se for demasiado lisa irá provocar imensos erros de leitura.

Este é o primeiro post do meu novo entretenimento: hack, comunicação e estudo de aplicações em robótica do sensor PAN3101.
Estes sensor tem algumas características muito interessantes e úteis, daí este meu interesse:
* permite a detecção em velocidades de até 21inches/s, qualquer coisa como 0.53m/s
* Grande resolução, configurável até 800CPI
* Interface série para transferência de dados e programação

Esta última é o que torna este sensor muito útil, pois ao contrário dos seus primos Chineses (cujas aplicação são inteiramente para ratos ópticos) necessita de um controlador externo, pois este DIP de 8 pinos é APENAS o sensor. Assim com qualquer MCU's podemos efectuar comunicação com o PAN3101 e recolher dele as informações vectoriais do movimento.

Quando solicitado o registo 0x02 e o registo 0x03, a resposta será o quando se deslocou em Y e em X, respectivamente, desde a última solicitação
Se fizermos a leitura do registo 0x02, a resposta será um valor de -128 a +127, que corresponde ao quanto se deslocou, e esse registo é colocado a zero de imediato. O mesmo acontece com o registo 0x03.

No ebay é possível comprar este sensor, sem qualquer "extra". 
Recomendável?
Não! Comprar um rato com este sensor isso já é outra história...
Na compra do rato, além do sensor, vem também a lente que fica por baixo dele e que permite o melhor foco possível para a sua utilização.
Já falei em cima que este sensor possui 2 registos que correspondem ao eixo X e Y do seu movimento.
Mas afinal, os valores recebidos são o quê? Distância, certamente... , mas como relacionar o valor recebido com a distância percorrida?
Isto já teria grande interesse em robótica...

No inicio falei de 800CPI, isto quer dizer 800 counts per inch, ou seja, uma contagem a cada 31.75µm.
Vamos supor que são devolvidos os seguintes valores:
X = +100
Y = +50

De forma a se entender melhor, já se pode fazer a relação e obter:
X = 3.175mm - desde a última leitura
Y = 1.5875mm - desde a última leitura

Por agora é tudo... tenho de guardar algo para as partes seguintes :D

Finalmente consegui arranjar um rato com este sensor e mal possa já vou tentar fazer alguns testes e testar toda esta teoria...