No Parque, 5/8/12, leitor de código de barras com o Arduino


Dia desses o Rafael Galeanu, de Suzano entrou em contato comigo querendo ajuda num projeto que consistia basicamente em comandar um leitor de código de barras pelo Arduino. Ele já tinha o leitor, um modelo handheld da Bematech , o BR310, e também já tinha comprado um shield de USB, necessário para fazer o Arduino conversar com o leitor.

Sugeri a ele que comparecesse ao Arduino no Parque, mas ele está trabalhando no fim de semana, então mandou o William Silva, que trouxe os “equipamentos”.

Sábado foi um pouco complicado, tive que sair no meio da diversão para uma reunião de início de semestre na Anhanguera. Só depois do meio dia me encontrei com o William, só que havia outras pessoas por ali esperando, então tive que deixar ele apanham sozinho por um tempo. Ainda por cima tinha um aniversário de criança pelas 16h, então meu alvará arduínico nesse sábado iria somente até às 15h30min.

Esse é o leitor BR310. O modelo que usamos é mais antigo, portanto mais feinho.
Quanto tive como colocar a mão na massa, vi que o orifício era bem inferior ao que tinha pensado. Prá começar a plaquinha USB que ele tinha era da SparkFun. Quando fui pesquisar o software, drivers etc no site, o dito tinha um link para uma outra placa, como se o driver da outra placa servisse na deles. Achei esquisito, baixei, rodei e..., não funcionou, o único sinal devida que o shield deu foi acender o LED. 

Plaquinha da SparkFun. Link:  https://www.sparkfun.com/products/9947

Pesquisa dali e daqui, vi que a plaquinha da SparkFun tinha uma diferença da placa do cara, que era que o pino D7 do shield deveria ser conectado ao pino de reset, e na plaquinha da SparkFun isso não acontecia. Ao conectar um no outro, o shield já entrou no ar.

Ligo então o BR310 na plaquinha e... nada, de novo. Nem acendeu. Ligo no PC e acende, então deve ser algo com o Arduino e/ou o shield. Google de novo, e surge a dica: o Arduino, qdo alimentado pelo PC, muitas vezes não disponibiliza ao shield USB energia suficiente para acionamento dos equipamentos a ele (shield) conectados. Desmonta-se o multímetro, pega-se a bateria de 9V e... leitor aceso! Sinal que havia terminado a parte fácil...


Plaquinha com o jumper conectando o pino 7 digital ao reset. O ideal é depois fazer isso com solda, por baixo da placa, prá não ficar essa alça voando sobre o shield.


Conjunto acoplado ao leitor, com o cartão de testes.

Agora vinha destrinchar a comunicação entre o Arduino e o Bematech. Acontece que o protocolo USB é o ó do boró. Isso não quer dizer que ele seja ruim, longe disso, aliás eu acho que ele é a interface mais chique que apareceu nos últimos anos. É rápido, confiável e flexível e por isso a indústria embarcou nele com força. Acontece que... ele é complicado, do ponto de vista da implementação. Tanto assim que o povo do Arduino preferiu transformar, através de driver, a porta USB dos nossos micros em uma porta serial, protocolo esse muito mais limitado e consequentemente muito mais simples de se lidar. O driver que o Arduino usa cuida de toda a complexidade do USB para nós. No nosso caso, isso não era uma opção...

Uma vez que o hardware funcionou (ou pareceu funcionar), agora é o software. Baixei do site http://www.circuitsathome.com, o tal que a SparkFun indica, uma lib para lidar com a parte "baixo nível". Em seguida, estudamos a respeito de como interagir com os dispositivos conectados à USB. Um rolo total. Tenta dali e daqui, desconfiei que o leitor poderia simular um teclado, que é um device hoje USB. Cheguei então na interface USB tipo HID (Human Interface Device), que é a dos teclados.

Carreguei o programa no Arduino, apontei o leitor para um cartão com um código e atirei (apertei o gatilho do bicho). Olha que belezinha:


A saída são os códigos lidos do cartão em diversos formatos. Ou seja... mais um leão morto!

Eu não vou postar o código aqui, contrariando a regra de ouro desse site, porque de fato eu não escrevi nem uma linha, ou seja, o programa e as libs são do sujeito do Circuits@Home. É "só" fazer o download, instalar e adivinhar o resto...

Dessa vez não tem filminho no YouTube, porque o alvará acabou antes, tive que me mandar para a festa da Rafaela. Mas o William e o Rafael prometeram trazer a tralha de novo dia desses prá gente terminar o projeto, aí eu filmo.




Comentários

  1. Sensacional o artigo!

    Dia complicado esse em...

    Mas aos 44 do segundo tempo, depois de ter driblado vários mistérios chegamos a um ótimo resultado.

    Vamos continuar o projeto, agora a missão será integrar o shield Ethernet ao sistema, vamo que vamo!

    ResponderExcluir
    Respostas
    1. William,

      Corrido e divertido, complicado nada ... ;)
      Sim, boralá divertir com o shield Ethernet!

      Abracadabraço!

      Mauro

      Excluir
  2. Este comentário foi removido pelo autor.

    ResponderExcluir
  3. cara estou precisando muito do codigo do programa para trabalho academico, tem possiblidade de postar ou enviar por e-mail

    ResponderExcluir
  4. O código do link http://www.circuitsathome.com/mcu/usb-host-shield-library-version-2-0-released
    não te ajudou?

    ResponderExcluir
  5. Por favor vejam se podem me ajudar:

    Comprei a placa USB da sparkfun pela robocore: http://www.robocore.net/modules.php?name=GR_LojaVirtual&prod=167#comentarios

    Estou tentando coletar o código de barras deste dispositivo:
    http://www.automatizando.com.br/sistema/listaprodutos.asp?IDLoja=4351&IDProduto=1456765&q=leitor-de-codigo-de-barras-laser-fixo-honeywell-metrologic-solaris-mk-7820

    Já fiz testes usando a lib 1.0 e 2.0 do Oleg, inclusive fazendo o jumpeamento do pino d7 ao reset ao usar a lib 1.0.

    Meu arduino é o Mega e estou usando uma fonte externa 9v (e não a energia do USB).

    Mesmo assim, não consigo fazer funcionar, alguém pode me ajduar?
    Abs,
    Rafael

    ResponderExcluir
    Respostas
    1. Huummm... a porta USB é meio enjoada mesmo, acho que só com o equipamento na mão para testar.
      Consultando a especificação, lá fala em "múltiplas interfaces", sem dizer quais. Talvez vc devesse tentar uma outra porta, serial, ou PS/2.
      Eu fiz um post ontem nesse blog falando sobre outro tipo de interface, vc viu?

      Excluir
  6. Vi sim, achei muito interessante a solução, mas o nosso só veio com USB mesmo. Você menciona que algumas pessoas o contratam para alguns trabalhos, gostaria de ter seus contatos para esta possibilidade pode ser?
    Grato,
    Rafael (www.cricketdesign.com.br)

    ResponderExcluir
    Respostas
    1. Na verdade ele possui também uma porta AUX e uma EAS mas sem cabos. Acho que eles te enviam o cabo de acordo com o que você solicita na hora da compra ( eu escolhi USB achando que seria mais fácil =])
      Segue o manual se for ajudar a entender o problema: http://www.kalischgmbh.de/doku/ms7820guide.pdf

      Mais uma vez obrigado pela ajuda!

      Excluir
    2. Rafael, vc pode me escrever no assismauro_AT_hotmail.com.

      Excluir
    3. Obrigado pelo contato! Eu descobri o pq não funcionava a plaquinha comigo, aparentemente ela não funciona com o Mega, usamos um arduino UNO e também não funcionou, aí testamos com um arduino UNO original e funcionou =]
      Obrigado pela ajuda, e como temos diversos projeto malucos aqui, entrarei em contato em breve para conversarmos.
      Grato,
      Rafael

      Excluir
    4. Putz, que pena, funcionou... :)

      Essa plaquinha USB é enjoada mesmo. Tudo bem não funcionar com o Mega até a gente desculpa, mas esse troço de Uno e Uno original...

      Estou às ordens, aqui. Aliás, muito legal o trabalho da Cricket!

      Excluir
  7. olá tenho um leitor bematech e estou usando arduino mega e Arduino shield host coloquei a biblioteca HID mais nao quer funcionar não, o leitor acende a luz mais quando passa um codigo de barras ele nao bipa... estranho no pc funciona normal quando ligava na porta serial sem o usb host ele funcionava bipava mais dava aquela string gigande com um monte de espaço e travava td... comprei ai o usb host "shield" so que estoucom esse probleminha alguem pod me dar um help ?

    ResponderExcluir
  8. Olá amigo, estou desenvolvendo um trabalho acadêmico com leitor de código de barras no arduino. Consegui chegar na mesma situação aonde você chegou acima, gostaria de saber como faço para interpretar o código que o leitor captou e jogou para a seria? Obg.
    se puder me ajudar agradeço muito. Email:
    premail2010-cd@yahoo.com.br

    ResponderExcluir
  9. Ola, tentei usar esse mesmo leitor Bemattech BR310, mas nao obtive sucesso. Quando eh feito uma leitura de um codigo o leitor fica num estado morto e em seguida volta a operar novamente. Você poderia informar a saida do seu USB_Desc? Gostaria de ver como ficou seu Usage Page do seu leitor.

    Abs

    ResponderExcluir

Postar um comentário

Postagens mais visitadas deste blog

Controle PID de Potência em Corrente Alternada - Arduino e TRIAC - Parte III

Controle PID de Potência em Corrente Alternada - Arduino e TRIAC - Parte I

Dividindo um programa (sketch) do Arduino em mais de um arquivo