No interface computorizado pretendíamos controlar o movimento do cursor do rato através do movimento feito com a cabeça, movimento este medido pelo acelerómetro.
Os dados enviados do PIC são encapsulados com uma flag inicial, o byte “00101010”, seguido de outro byte “01101111”, assim sabemos que temos o início de um quadro, depois seguem-se 2 bytes por eixo, x, y e z, por essa ordem.
Após a recepção dos valores dos eixos, vindos via comunicação serial, cada byte e transformado num número inteiro, visto que é visto como uma string.
Como os dados dos eixos são de 16bits, temos manipular os valores lidos por eixo de modo a ter à chegada o valor enviado.
Tal como referido nos estudos anteriores, multiplicando a aceleração pelo tempo de mostragem sabemos a diferença entre velocidades, se multiplicarmos novamente pelo tempo de amostragem temos a deslocação nesse dado momento do rato.
while(a!=49 and b!=62): #procura da flag de início de recepção a = ord(ser.read(1)) if(a==49): b = ord(ser.read(1)) val.append(ord(ser.read(1))) #cast para int val.append(ord(ser.read(1))) val.append(ord(ser.read(1))) val.append(ord(ser.read(1))) val.append(ord(ser.read(1))) val.append(ord(ser.read(1))) val.append(ord(ser.read(1))) ax = val.pop(0) ax = (val.pop(0)<<8)+ax #concatenação dos valores ay = val.pop(0) ay = (val.pop(0)<<8)+ay az = val.pop(0) az = (val.pop(0)<<8)+az c = val.pop(0) medx.append(ax) medy.append(ay) |
Este pedaço de código serve para o computador se certificar que apanha um byte de início de quadro, se não encontrar descarta esse valor. Este processo decorre enquanto não forem encontradas os 2 bytes de flag. Após os encontrar, são guardados os 2 bytes seguintes que serão passados para inteiros e concatenados pela ordem correcta, o que é feito para os restantes eixos. Os valores de ax e ay, são depois juntos a um vector para ser usado mais tarde.
if(i<k): refx=refx + medx.pop(0) refy=refy + medy.pop(0) if(i==k-1): refx = refx / k refy = refy / k |
Nos primeiros ‘k’ ciclos os valores de cada eixo são somados, calculamos assim fazer a média destes valores de modo a tirar um valor de referência, que será considerado o zero. K é uma variável inicializada no topo do programa em que definimos o número de amostras que queremos para calcular a média dos valores.
if(i>k): if(ax-refx>m or ax-refx<-m): #filtra alterações inferiores a ‘m’ ax=ax-refx else: ax=0 if(ay-refy>m or ay-refy<-m): #filtra alterações inferiores a ‘m’ ay=ay-refy else: ay=0 pos=int(xs+ax),int(ys+ay) win32api.SetCursorPos(pos) |
A partir do momento em que temos uma referência do 0 dos valores esta referência é retirada ao valor recebido, valor este que será subtraído ao valor actual do cursor de modo a calcular o próximo, é de seguida actualizada a posição do mesmo.
Home |
Introdução | Desenvolvimento | Conclusão
| Organização |
Participantes |
Agradecimentos |
Contactos |
Hiperligações