sexta-feira, 3 de maio de 2013

Ubuntu 2 monitores

    Após muito tempo tentando configurar o Ubuntu para expandir o  Desktop para 2 monitores consegui realizar a configuração correta utilizando este tutorial para configurar a função Xinerama de placas Nvidia.

    O truque que observei foi de seguir o exemplo dado e aplicar a sua configuração atual. No meu caso, observando o arquivo xorg.conf (localizado em /etc/X11/xorg.conf) estava com a função TwinView estava ativada e funcionando e o que tive que fazer foi adaptar á Configuração do Xinerama da seguinte forma:

   - Dupliquei a seção Monitor e Device, identificando cada um diferentemente. (estas configurações foram tiradas da configuração padrão criada pelo driver da Nvidia quando selecionado "separate X screens");

   - Criei 2 seções Screen com a propriedade "Modes" da subsessão Display com as resoluções desejadas de cada monitor, que no caso eram iguais a "1680x1050" e "1024x768";

   - Para mostrar qual era a disposição das telas, mesclei a seção ServerLayout de modo que os InputDevices eram os que eu já tinha na minha configuração anterior.

   Finalmente, saí do modo gráfico ( ctrl + F5 por exemplo) e reiniciei  a interface gráfica com sudo service lighdm restart.

   Felizmente, agora tudo funciona como deveria.

*Edit: Importante acrescentar as linhas seguintes a cada device acidionado:

     Option          "RenderAccel"   "true"
     Option          "UseEdidFreqs"  "true"


 E remover (no meu caso) a seguinte linha gerada automaticamente:

    Option         "nvidiaXineramaInfoOrder" "CRT-1"


sexta-feira, 26 de abril de 2013

Blender + pyserial

Algumas considerações sobre utilizar o Blender + pyserial : 

    Utilizando um arduino UNO a porta serial  utilizada no Ubunto está em /dev/ttyACM0, e para se poder escrever nesta porta temos que executar o seguinte comando:

        
     sudo adduser user dialout

    Este comando adiciona o usuário "user" ao grupo dialout, para se poder escrever na serial.
   
    Em seguida deve-se reiniciar a sessão para a alteração ter efeito.

    O script de comunicação serial a linha deve ficar assim:


           G.SerialPort = serial.Serial('/dev/ttyACM0',9600)

sexta-feira, 12 de abril de 2013

Engine selecionada : Blender


    Apesar do Blender não ter sido um dos programas que inicialmente planejei testar acabei por usar ele pois descobri que seu engine é muito eficiente nos aspectos que desejo implementar, além de ser também muito intuitivo.

 
    Digo que o Blender Game Engine é eficiente não somente pelo fato de incorporar elementos que outras engines possuem, mas por incorporar o python com linguagem de scripting ele amplia as possibilidades de aplicação com o uso de módulos incluídos no python.

Tudo isso foi conseguido com uma instalação muito fácil, e com uma interface muito user-friendly. (Instalei a versão 2.66)
 
    Do post anterior, eu gostaria de uma engine que:

    1. Tivesse possibilidade de tocar video
    2. Possibilitasse uma layer com animaçao (game) sobre o uma layer com um video
    3. Colher posição atual do video
    4. Conseguir enviar comandos para porta serial


    Todos esses requisitos foram alcançados pelo Blender, que juntamente com o python, facilitou a o desenvolvimento do teste que descreverei a seguir.

   A técnica para tocar video é criar uma textura a partir do vídeo desejado que é dinamicamente atualizada a cada frame pelo blender. Desta forma o video é executado, porém sem som.

   O som deve ser tocado em paralelo, sincronizado com o video. Abaixo estão algumas imagens do projeto e o código-fonte está anexo e os controles relacionados para se tocar o video.

   Neste projeto também existe um mini-game que roda em cima(literalmente) do video. Para este teste, segui o tutorial deste video do youtube.
 
O código para o video foi adaptado do código neste site, cujos créditos (aparentemente) vão para Dalai Felinto.

Sensores e controladores do minigame


Sensores e controladores do video e envio de sinais
 
    Um ponto crucial deste teste foia  integração com um hardware externo, comunicando-se por uma porta serial.
    Para isso utilizei o módulo pyserial, que permite uma comunicação descomplicada com a porta serial.

    Inicialmente tive problemas para a instalação deste módulo, uma vez que apesar de ele funcionar com o python 3.3 (python que vem com o Blender 2.66) ele é escrito para um python anterior.

    Para contornar esse problema, instalei o pip para windows deste link e segui o tutorial de instalação do pyserial para o pip, e deu tudo certo.

    Só como observação: você deve ter a versão do python 3.3 instalada no seu sistema para poder gerar o pacote do pyscript que você depois colocará na pasta do python para ser utilizada dentro do  Blender.

    Finalmente, utilizei um arduino mega para poder fazer os testes com a comunicação serial. O código para o arduino pode ser baixado aqui. O arquino em teste foi testado com uma shield com leds e reles.
 

Baixe aqui o arquivo .blend para testar o projeto.