Bom, como muitos andaram perguntando sobre as formas de controlar o arduino apartir do PC, decidi fazer um post com um exemplo. Como acredito que para criar um tutorial deve-se dominar o assunto, optei por fazer um exemplo que possa ser compartilhado para não correr o risco de fazer um tutorial falando coisas que não sei.

O exemplo:

   O exemplo é de um programa que controla o valor de saída dos pinos digitais do arduino - tanto os HIGH & LOW, quanto os PWM - e receba valores para mostrar no PC. A comunicação é feita por serial (usei a USB padrão do arduino) com dados compostos por 3bytes.

   No modelo criado, o programa recebe 3 tipos de dados para mostrar, que são: Temperatura, sensor LDR e potenciômetro.

A comunicação:

   A comunicação é feita usando 3bytes, onde o primeiro byte é para informações de controle e os outros dois são para o valor. No primeiro byte, os dois bits mais significativos são usados para definir o tipo do dado e os outros 6bits são usados para determinar a porta de origem/destino.

   !!! Importante !!!

       Como são enviados 3bytes e cada um deles tem um motivo, pode ocorrer do arduino mandar um dado e ele chegar corrompido ou mandar algo não compatível com a comunicação esperada. Para tratar isto, o programa busca validar os dados de acordo com o tamanho do buffer da entrada no serial, no entanto pode ocorrer a perda de dados ou, ainda assim, recebimento de um dado errado. Para tentar evitar que isto ocorra, deve-se aumentar o delay entre as transmissões e a taxa de transferência.

A linguagem:
   O programa foi desenvolvido em C# na IDE Visual Studio 2012, que possue versão "free". Esta escolha foi tomada devido à semelhança entre esta linguagem e outras mais básicas e comuns, logo deve ser mais fácil para entender. Além disto... faz tempo que eu não programo assim, então fica mais fácil, também.

Os sensores:
    Para o exemplo usei sensores de luz, temperatura e um potenciomêtro.

    O potenciômetro e o LDR(sensor de luz) foram usados de forma semelhante à encontrada no site do arduino.

    O sensor de temperatura foi usado da mesma maneira que no post "Tutorial: Mostrar a Temperatura Ambiente com o Arduino em um displa...", apenas alterando o valor 1023 por 1024.

Os dados:

     O primeiro byte( o byte[0] ) determina o tipo do valor e o destino/origem.

     Os dois primeiros bits, os mais significativos, determinam o tipo do dado. Para validá-los, foram usadas máscaras do tipo "byte[0] & B11000000" ou com o decimal equivalente.

     Quando é uma entrada no PC:

  •      "00" = boolean - 0 ou 1
  •      "01" = inteiro -  0 ~ 65.535
  •      "10" = float - este tem precisão de 1 casa. 0 ~ 4095,9
  •      "11" = não foi definido

      Quando for uma saída para o arduino:

  •       "00" = HIGH & LOW - 0 ou 1
  •       "01" = PWM - 0 ~ 255  
  •       "10" e "11" = não foram definidos

      Os outros 6 bits do primeiro byte determinam a qual porta o dado refere-se. Neste caso, pode-se usar desde a porta 0 até a 63, quando disponível. No exemplo, estão acessíveis as portas 2 até 42, sendo as portas 3, 5, 6, 9 e 10 configuradas como PWM.

      Os outros dois bytes são definidos com o valor que deseja-se transmitir.

  • Quando é um booleano, verifica-se se o valor dos bits é 0 ou 1. Como é verificado apenas pelo último bit, se for posto um valor diferente de 0 e 1, o resultado vai variar de acordo com o ultimo bit. Quando for par o ultimo bit vai ser 0, se for ímpar vai ser 1.
  • Quando for um valor inteiro, os dois bits são usados completamente para o valor
  • Quando for "float" o segundo byte é usado junto com a primeira metade do terceiro para definir a parte inteira do valor. A segunda metade é usada para a parte fracionária do valor.

          !!! Importante !!!

             Como são reservados 4 bits para a parte fracionária, esta "pode" receber valores de 0 até 15, logo deve-se                 tratar para que mande apenas um dígito decimal.

Fluxo do programa(PC):

-Receber dados:

    Ao receber o dado, aciona a função de tratamento que, de acordo com o dado, atualiza um campo na janela do programa. Caso o dado não possua o formato esperado, o programa lê todos os dados para limpar o buffer, mas não os utiliza.

-Conectar/Desconectar:
    Ao selecionar o campo para escolher a porta, o programa atualiza a lista de portas permitidas e mostra as opções ao usuário. Ao selecionar a porta, a taxa de transmissão e clicar no botão conectar, o programa tenta abrir uma conexão com as opções, inativa as opções de configuração da conexão e abre as opções para transferência.

    Se já estiver conectado e apertar o botão que passou a ter escrito "desconectar", o programa volta a trancar os campos de dados, fecha a conexão, inativa as opções para transferência de dados e ativa as opções para conexão.

-Enviar dados - PWM:

   Ao clicar em atualizar, ao lado dos campos PWM, o programa verifica quais dados foram modificados desde a última atualização das portas, envia estes dados e atualiza o valor da última atualização para o valor da atual.

-Enviar dados - HIGH & LOW:

   Ao marcar ou desmarcar o campo de dados referente a uma porta HIGH & LOW, o novo valor vai ser automaticamente transferido.

Fluxo do programa(arduino):

-Setup:

   Inicializa a comunicação serial e os pinos HIGH & LOW que serão usados.

-Loop:

   Lê o primeiro sensor, gera um buffer de 3 bytes com valores referentes a codificação do dado, envia o buffer e cria um pequeno delay. Ao termino do delay, faz a mesma coisa com os demais sensores.

   Ao terminar de atualizar os sensores, entra em loop com pequenos delay's e com verificação do buffer de entrada de dados. Caso o buffer tenha dados, chama a função referente.

-Receber dados:

    Verifica se os dados no buffer têem tamanho compatível com os tipos de dados esperados. Caso tenham, seleciona os três primeiros bytes do buffer e realiza o tratamento de acordo com dado recebido. Caso contrário, lê todos os dados do buffer sem utiliza-los, para limpar o mesmo.

    O programa foi feito para o Laboratório de Garagem, para ajudar na troca de conhecimento dos seus membros. Logo peço que se quiserem divulgar, divulguem o LdG, e não apenas os arquivos.

   O programa foi feito em pouco tempo e sem uma planejamento, logo é certo, provavel possível que tenha bug's. Caso encontre alguns bug's ou tenha idéias para alterar o programa, para ajudar os membros do LdG, fique à vontade para alterar o programa e compartilhar aqui.

   Bom, espero que tenha ajudado. Lembrando que é apenas um exemplo de apenas uma opção de comunicação. Aqui no LdG mesmo vocês podem encontrar várias outras!

   Caso tenham dúvidas, perguntem aqui.

   Abraço!

Serial - Arduino

Serial-LdG.exe

Serial-LdG - código

Exibições: 7661

Comentar

Você precisa ser um membro de Laboratorio de Garagem (arduino, eletrônica, robotica, hacking) para adicionar comentários!

Entrar em Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)

Comentário de André Arino em 20 fevereiro 2015 às 7:36
Bom dia Gustavo,
Nao consegui baixar o codigo do C# no link informado.
Poderia enviar atraves do google drive ou email ?
Obrigado
Comentário de T|-|1@g0 em 13 outubro 2012 às 10:40

Sim utilizei o visual studio para compilar mas a minha versão e a 2008. vou mudar a versão. Obrigado

Comentário de Gustavo Frainer em 13 outubro 2012 às 3:21

Oi Thiago.

Tu usastes o visual studio para compilar? O projeto foi feito no visual studio 2012, creio que fique mais facil se abrires nele.
Quanto ao PortSerial_DaraReceived é um evento disparado quando a porta serial recebe um dado. Isto faz com que ele seja chamado a qualquer momento em que receber um dado.. é como se ele ficasse esperando por isso para executar o determinado.
Fiz esse código baseado em vários artigos que lí, mas nenhum fazia da forma que fiz. Acho que se procurares por "arduino visual c#" conseguirás algo que te ajude.

Comentário de T|-|1@g0 em 13 outubro 2012 às 3:01

Olá Gustavo.

Eu baixei o código mas, não esta compilando da erro, gostaria de saber como funciona, PortSerial_DataReceived com ele eu consigo constantemente ler dados da serial?, se vc tem ou conhece algum tutorial que possa me ajudar.

 

 

 

Comentário de Gustavo Frainer em 9 outubro 2012 às 1:46

Tive que upar no 4shered da minha namorada, depois vou tentar att o post.

Comentário de Gustavo Frainer em 9 outubro 2012 às 1:45
Comentário de Fredman Carlos de Moraes em 9 outubro 2012 às 0:51

Gustavo Frainer manda por email para mim: fredmantec@yahoo.com.br

Grato...a dispor.

Comentário de Gustavo Frainer em 8 outubro 2012 às 16:13

O brigado por avisar, Fredman.

Estranho que quando fiz a prévia dele estava tudo ok... De qualquer forma, mandei uma msg pro Marcelo pra ver se ele consegue alterar isto.

Comentário de Fredman Carlos de Moraes em 7 outubro 2012 às 12:55

Nao to conseguindo baixar os arquivos....acesso nao autorizado.

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço