collapse

* Links de Robótica

* Posts Recentes

Medir Agua que está no Poço por jm_araujo
[Hoje às 00:36]


URGENTE - display de 7 segmentos com backpack por helderjsd
[Ontem às 12:30]


Preços e fabricantes de pcb por Sérgio_Sena
[19 de Setembro de 2017, 10:20]


Palavras Cruzadas por Njay
[19 de Setembro de 2017, 02:24]


Isaac Asimov - I, Robot por senso
[18 de Setembro de 2017, 03:41]


Apresentação por TigPT
[17 de Setembro de 2017, 07:31]


ic SL440 da Plessey? por senso
[16 de Setembro de 2017, 13:11]


Compra Colectiva RS-Amidata por brunus
[15 de Setembro de 2017, 22:31]


Ideias para construir um quadrúpede simples por zordlyon
[15 de Setembro de 2017, 10:18]


Preparar bancada de testes por jm_araujo
[14 de Setembro de 2017, 10:24]

Autor Tópico: Controlo de PC com comando IR e Arduino  (Lida 3917 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline tgferreira

  • Mini Robot
  • *
  • Mensagens: 148
Controlo de PC com comando IR e Arduino
« em: 13 de Novembro de 2013, 23:42 »
Boas malta,
Nos ultimos dias decidi montar aproveitar um computador velho para MediaCenter que está agora a funcionar. No entanto é tudo controlado por teclado que ainda por cima tem cabo. Então, surgiu a ideia de comprar um comando...

O problema é que custa dinheiro e nunca vou encontrar algo tão bom como desejo (a preços acessíveis). Nesta sequência de pensamentos lembrei-me que isto não devia ser muito difícil de ser feito com um arduino e um receptor IR e, através de uma pesquisa rápida encontrei algumas dezenas de projectos. No entanto, todos os projectos que encontrei são para controlar o Arduino e não nenhum computador, tendo assim bloqueado nesta parte, sem saber como utilizar o arduino apenas como interface.

Já recebo os comandos pela consola serial (embora não no formato que pretendo mas isso é uma questão de protocolos). O ideal seria arranjar um programa simples onde colocasse os códigos de cada tecla do comando e associar a cada código uma acção no computador (um pressionar de uma tecla, a abertura de um atalho, etc).

Já tentei o WinLIRC mas sem sucesso: não consigo configurar o comando de modo nenhum. Alguém já fez isto ou sabe de alguma solução?
Se entretanto encontrar resposta, venho deixar aqui no fórum. Não era má ideia arranjar um tutorial deste mesmo (quando completar, faço um).

Cumprimentos,
Tiago.

Offline dio123

  • Mini Robot
  • *
  • Mensagens: 927
Re: Controlo de PC com comando IR e Arduino
« Responder #1 em: 14 de Novembro de 2013, 10:16 »
Bem isso é facil.  Já fiz isso com um teclado.

Crias um programa em vb.net,  crias uma ligação serial com o arduino e depois no programa do vb associas cada codigo a uma funcão do arduino.
Resumidamente tens de fazer um Serial Monitor do arduino, mas em vb.net depois é so ler os dados do serial monitor.
No google e youtube tens montanhas de informação sobre isso.
No entanto os novos arduinos que usam atmega  para o usb ,  dá para interagir directamente com o computador. Só sei assim por alto.

Offline tgferreira

  • Mini Robot
  • *
  • Mensagens: 148
Re: Controlo de PC com comando IR e Arduino
« Responder #2 em: 15 de Novembro de 2013, 11:20 »
Boas,

Boa ideia Dio123! Entretanto tive uma outra que estou a explorar agora mas que, talvez encontre alguns erros. Passo a explicar:

Nas pesquisas que fiz, encontrei algo que dizia que dá para emular um teclado USB com o arduino (estou a usar o mega 2560). A ideia seria armazenar todos os códigos do comando no arduino e a cada código atribuir um conjunto de teclas ou dadas teclas do teclado. Infelizmente, era perfeito que pudesse utilizar a biblioteca de funções keyboard, mas só existem para arduino leonardo e due (se não estou em erro). Mas, há uma outra alternativa que passa por instalar no atmel o .hex de um teclado. Já tive a testar com um código simples (repetir a letra a de segundo a segundo) e funciona. Depois de ter sucesso nisto, voltei-me novamente para o comando IR, onde encontrei um pequeno problema (no código) e que não estou a perceber porque está a acontecer. Ando enferrujado...

Passo a explicar: ligo o receptor IR e identifico os códigos. O comando que quero usar é um philips e usa RC5 como protocolo, com o toggle bit. Por outras palavras: cada tecla tem dois códigos diferentes (pelo que entendi). Então, abro o serial monitor e vejo os dois códigos de dois botões: power e eject. O plano, num outro código é: o botão power liga o LED e o eject desliga o mesmo. Os códigos estão correctos e mais que confirmados mas só consigo ligar o led. Depois de o ligar, não consigo desligar de modo nenhum.

Aqui está o código:

Código: [Seleccione]
#include <IRremote.h>

int IRpin = 11;  // pino DATA receptop IR
int LED = 13;    // LED 
IRrecv irrecv(IRpin);
decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn();
  pinMode(LED, OUTPUT);
}

void loop()
{
   
  if (irrecv.decode(&results))
    {
     
      irrecv.resume(); 
    }
 
   if (results.value == 3810528694 || results.value == 3152645320)  // os dois códigos do botão POWER
     { 
           digitalWrite(LED, HIGH);
           irrecv.resume();
          }
         
        if(results.value == 615372988 || results.value == 905935834) // os dois códigos do botão EJECT
          {
           
            digitalWrite(LED, LOW);
            irrecv.resume();
           
          }
         
     }


Não estou a entender porquê: quando liga o LED (isto é, quando executa a função associada ao código/botão recebido) deveria voltar a receber ordens de outro botão...

Outro problema que acho que pode surgir para a frente (mas cada coisa a seu tempo) é que, pelo que entendi, os comandos de teclado são emitidos a partir da consola serial e os códigos do comando são recebidos na porta serial. Não sei até que ponto é que isto pode ser conflituoso. A ver vamos, depois de resolver os problemas mais básicos! :)

Cumprimentos,
Tiago.

EDIT: já agora, decidi testar com um código simples (botão power faz com que o arduino escreva a letra "a") para ver se dava. Até ver sim, embora repita o "a" sem parar. Deve ser algo que tenho de mudar, simples. No entanto, fica aqui o código, caso alguém queira ver ou brincar um pouco com isto. Estou próximo do objectivo! :D

Código: [Seleccione]
uint8_t keyNone[8] = { 0, 0, 0, 0, 0, 0, 0 };
uint8_t keyA[8] = { 0, 0, 4, 0, 0, 0, 0 };

#include <IRremote.h>

int IRpin = 11;  // pino DATA receptop IR
int LED = 13;    // LED 
IRrecv irrecv(IRpin);
decode_results results;


void setup()
{
Serial.begin(9600);
 irrecv.enableIRIn();
  pinMode(LED, OUTPUT);

}

void loop()
{
uint8_t ledStatus;
 if (irrecv.decode(&results))
    {
     
      irrecv.resume(); 
    }
 
   if (results.value == 3810528694 || results.value == 3152645320)  // os dois códigos do botão POWER
     { 
           digitalWrite(LED, HIGH);
           Serial.write(keyA, 8);
           ledStatus = Serial.read();
           Serial.write(keyNone, 8);
           irrecv.resume();
          }
}
« Última modificação: 15 de Novembro de 2013, 11:57 por tgferreira »

Online jm_araujo

  • Mini Robot
  • *
  • Mensagens: 2.123
  • NERD!
Re: Controlo de PC com comando IR e Arduino
« Responder #3 em: 15 de Novembro de 2013, 11:55 »
Arduino parece-me overkill, e um nivel de complexide extra dispensável.

Eu insistia no winLIRC antes de ir por esse caminho.

Offline tgferreira

  • Mini Robot
  • *
  • Mensagens: 148
Re: Controlo de PC com comando IR e Arduino
« Responder #4 em: 15 de Novembro de 2013, 12:06 »
Olá jm_araujo!

Sim, tens toda a razão: é. Mas de momento está mais ou menos parado (os outros projectos que tinha para o mesmo estão suspendos por alguns meses). E para coisas mais pequenas tenho um duemilanove parado também, que posso usar. Para já vou com esta solução e depois, com mais tempo, hei-de fazer um receptor IR para o PC e winLIRC.

Estou a pegar em Arduino porque tenho o bichinho de por isto a dar rapidamente e não tenho os materiais para construir um receptor em casa (julgo eu). :)

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.390
  • Helpdesk do sitio
Re: Controlo de PC com comando IR e Arduino
« Responder #5 em: 15 de Novembro de 2013, 12:42 »
Um receptor?
Suponho que estás a usar um TSOP3817 ou parecido que trata de desmodular o sinal IR e dá-te só o sinal em si, sem a portadora de 38Khz(ou por ai perto)..

USB a sério e não via o conversor usb-serial é possivel com um atmega328p(o que é usado no arduino duemilanove), mas é usb bit-banged, ou seja, emulado, é feito usando a biblioteca V-USB, é possivel que existam bibliotecas portadas para c++ para se usar no ide do arduino, mas se não for oficial, tinha duvidas da qualidade delas...
Usando V-USB sim, podes emular praticamente qualquer dispositivo HID(teclado, rato, joystick, etc), o que referes é nos atmegas mais recentes que usam um atmega8u2 que tem USB em hardware, e ai sim, precisas primeiro de programar o atmega8u2 para se apresentar como um dispositivo HID em vez de uma porta com(que é a classe CDC do USB), e depois o atmega328p do arduino fala em serial para esse atmega8u2 que converte os comandos serial para comandos HID, ou podes usar um Teensy2, que é basicamente um breakout board para o atmega32u4 e que foi onde essas bibliotecas bonitas todas para fazer HID nasceram.

Espero que isto esclareça algumas das tuas duvidas.
Avr fanboy

Offline dio123

  • Mini Robot
  • *
  • Mensagens: 927
Re: Controlo de PC com comando IR e Arduino
« Responder #6 em: 15 de Novembro de 2013, 14:06 »
Consegues evitar facilmente o uso da biblioteca Irremote.  Há aqui no forum um tutorial de RC5 no arduino simples sem biblioteca.


Offline tgferreira

  • Mini Robot
  • *
  • Mensagens: 148
Re: Controlo de PC com comando IR e Arduino
« Responder #7 em: 18 de Novembro de 2013, 20:16 »
Boas malta!

Senso: esclareceu, obrigado! Já consegui por o Arduino Mega a ser identificado como se fosse um teclado, como viste acima. Até ver, a biblioteca funciona bem e só vejo dizerem bem da mesma pelas internetes fora.

Dio123: já estive a ver mas um pouco por alto e tenho que a admitir que engracei mais com o que estou a utilizar. No entanto, obrigado na mesma!

Agora, só voltei a pegar nisto hoje... Decidi, para resolver os problemas, pegar num código que o que faz é acender e apagar um LED, com recurso ao comando IR. Mudei os códigos e pus um case para cada código do meu comando (o meu comando, por cada botão, emite dois códigos diferentes). Funcionou. Entretanto, peguei no código que está nesta página ( http://mitchtech.net/arduino-usb-hid-keyboard/ ) e combinei com o código para acender e apagar o LED... Como estou apenas a testar, o que o programa é suposto fazer é subir o volume do PC quando carrego no botão do power. Está aqui o código:

Código: [Seleccione]
#include <IRremote.h>
uint8_t buf[8] = { 0 }; /* Keyboard report buffer */
 
#define PIN_VOLUME_UP 11
 
int state = 1;
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;
 
void setup()
{
  Serial.begin(9600);
  pinMode(PIN_VOLUME_UP, INPUT);
  irrecv.enableIRIn();
  delay(200);
}
 
void loop() {
if (irrecv.decode(&results)) {
   
  long int decCode = results.value;
    Serial.println(decCode);
    switch (results.value) {
 
 case 3810528694:
    buf[2] = 128;   // Volume up key
    Serial.write(buf, 8); // Send keypress
    releaseKey();
  break;
 
   case 3152645320:
    buf[2] = 128;   // Volume down key
    Serial.write(buf, 8); // Send keypress
    releaseKey();
    break;
  }
 
   irrecv.resume();
}

}

 
void releaseKey()
{
  buf[0] = 0;
  buf[2] = 0;
  Serial.write(buf, 8); // Release key 
}


Infelizmente... não está a dar... O PC reconhece o arduino como teclado USB mas só recebe comandos às vezes e não recebe o pretendido (subir o volume). Às vezes abre o menu iniciar, outras vezes escreve travessões, pontos finais, etc... Confesso que não sei onde estou a falhar mas só testei de modo muito rápido. Vou ver se procuro algo na página para ver se encontro a resolução do problema. Se for algo simples que me esteja a escapar e entretanto encontrei, digam-me por favor :)

Offline tgferreira

  • Mini Robot
  • *
  • Mensagens: 148
Re: Controlo de PC com comando IR e Arduino
« Responder #8 em: 19 de Novembro de 2013, 12:59 »
Beeeem... Isto está mau. Mas AINDA não vou desistir deste método! :p

Estive a ler um pouco mais e, na secção de comentários do site que produziu o firmware que estou a utilizar para o Arduino, pelo que percebi, se o Arduino estiver a receber mais informação pela serial console (e está: os códigos do comando), isso pode dar asneira. Estou ainda a experimentar uma biblioteca que alguém fez, também disponível nos comentários, que julguei que me ia resolver o problema. Infelizmente, ainda não é desta. Será que há alguma hipótese de receber os códigos do sensor sem ter que recorrer à serial console?


Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.390
  • Helpdesk do sitio
Re: Controlo de PC com comando IR e Arduino
« Responder #9 em: 19 de Novembro de 2013, 13:50 »
Mas que arduino é que tu tens?
Continuo sem perceber realmente como é que estás a usar a biblioteca V-usb e o serial, vai para ai uma misturada de coisas..
Avr fanboy

Offline tgferreira

  • Mini Robot
  • *
  • Mensagens: 148
Re: Controlo de PC com comando IR e Arduino
« Responder #10 em: 19 de Novembro de 2013, 19:43 »
Olá Senso!

Desculpa pela confusão. Vou tentar explicar:

Tenho um Arduino Mega2560 e ligado ao mesmo está um receptor de IR que fui buscar a um emissor de mp3 para fm dos chinocas. Não sei nada sobre o receptor, apenas que funciona a 3.3V.

No fundo, meto no Arduino o código que tenho estado a por pelo tópico. Depois de o ter lá, com a ferramenta para flashar(?) o firmware da Atmel, flasho o .hex, que faz com que o Arduino seja identificado como um teclado USB. Sempre que quero trocar o código que tenho no arduino, tenho que voltar a flasha-lo com o .HEX apropriado, para ser detectado como um Arduino.

O meu problema agora é que tenho duas coisas a transmitir dados através da consola serial: os códigos que o comando manda para o Arduino (que os imprime em serial) e o firmware do teclado, que recebe as teclas a carregar através de lá também. Isto faz com que o computador receba comandos e teclas aleatórias. Funcionaria bem se não estivesse a receber nada por serial (se por exemplo os códigos do comando chegassem através de qualquer outro método).

Agora, o que estou a tentar resolver é ver se há alguma maneira em que possa manter os dois a trabalhar na consola serial mas sem causar erros ou se posso receber os códigos do comando de qualquer outro método. Esta é a parte na qual não estou a ter sucesso.

Caso não consiga encontrar nada, vou seguir a sugestão do dio123: criar um programa em vb.net que receba os códigos que o comando emite para a consola serial (no fundo, só tenho de por no arduino um código simples e que funciona) e no próprio programa, atribuir a cada código o que quero que o computador faça. Ainda não peguei nisto porque não percebo grande coisa de vb.net.

Se ainda assim não tiver esclarecido algo, digam. Tenho este problema: não me expresso muito bem e embrulho demasiado as coisas, criando confusões :)


Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.390
  • Helpdesk do sitio
Re: Controlo de PC com comando IR e Arduino
« Responder #11 em: 19 de Novembro de 2013, 19:56 »
E porque raio estás tu a usar serial, se queres é usar o comando IR?
É claro que se o arduino só tem um interface usb-serial, que não faça de usb-serial e de dispositivo hid ao mesmo tempo..
Mas já agora, o teu arduino tem um atmega8u2 a fazer o interface usb, ou é dos mais antigos com o ftdi?

Mesmo assim, era muito mais facil tirares uma foto ao que estás a fazer(arduino e afins).
Avr fanboy

Offline tgferreira

  • Mini Robot
  • *
  • Mensagens: 148
Re: Controlo de PC com comando IR e Arduino
« Responder #12 em: 20 de Novembro de 2013, 10:34 »
Estou a utilizar serial porque não estou a ver outra maneira de conseguir obter os códigos do comando IR no Arduino (não sei se é possível fazer de outro modo). Há outra maneira?

A tua segunda frase deixou-me a pensar: o Arduino Mega2560 tem várias portas serial, certo? Então, será que é possível por o receptor a enviar os dados que recebe para uma das portas e deixar outra porta para a comunicação como se fosse um teclado? Vou experimentar...

O meu arduino tem o atmega8u2 a fazer a interface USB. De qualquer das formas, deixo aqui uma foto. Alguma coisa que esteja a explicar mal, digam e eu tento explicar de outro modo. É normal que esteja a trocar conceitos, causando confusão.

EDIT:

Sim, acho que consegui! :)
Então o que fiz: na foto, passei o cabo de DATA para a porta 19 (rx1). No código fiz uma alteração simples: iniciei a Serial1 e fiz com que os códigos que o comando emite vão para o Serial1. Até ver, está a funcionar. Vou agora programar o comando todo e depois deixo aqui o código. Senso, se não tivesses dito o que disseste, não tinha chegado lá! Muito obrigado!

Agora vamos é ver se isto está mesmo a dar ou se foi impressão minha :P

« Última modificação: 20 de Novembro de 2013, 10:41 por tgferreira »

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.390
  • Helpdesk do sitio
Re: Controlo de PC com comando IR e Arduino
« Responder #13 em: 20 de Novembro de 2013, 11:25 »
Isso é um simples conjunto de pulsos que sai do sensor, não é serial...
Avr fanboy