Controlo do cursor

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