Sunday, June 5, 2011

Controlando o Arduino com .Net

A última versão da ebl-arduino (r52) trás para os usuários do Arduino uma forma fácil de trocar comandos e dados entre PC e Arduino usando .Net, sendo também fácil de ser portado para outras linguagens e transportes (TCP e assim por diante).

English version of this article: Controlling Arduino with .Net.

AdvancedSerial

Uma nova classe que implementa um protocolo serial que torna mais fácil a comunicação entre aplicativos do PC e os programas do Arduino.

Este é um exemplo de programa que recebe comandos do PC para controlar um display LCD:

#include <AdvancedSerial.h>
#include <LiquidCrystal.h>

#define BACKLIGHT_ON_MESSAGE 0
#define BACKLIGHT_OFF_MESSAGE 1
#define TEXT_MESSAGE 2

//pins
#define PIN_BACKLIGHT 7

//configure lcd
LiquidCrystal lcd(13, 12, 11, 10, 9, 8);

void setup() {
  //configure backlight pin
  pinMode(PIN_BACKLIGHT, OUTPUT);
  //configure LCD
  lcd.begin(16, 2);
  //begin serial port with a desirable speed
  Serial.begin(115200);
  //configure receiver callback
  AdvancedSerial.setReceiver(onMessage);
}

void loop() {
  //AdvancedSerial job
  AdvancedSerial.loop();
}

void onMessage(AdvancedSerialMessage* message) {
  switch (message->id) {
    case BACKLIGHT_ON_MESSAGE:
      digitalWrite(PIN_BACKLIGHT, HIGH);
      break;
      
    case BACKLIGHT_OFF_MESSAGE:
      digitalWrite(PIN_BACKLIGHT, LOW);
      break;
      
    case TEXT_MESSAGE:
      lcd.clear();
      for (int i=0; i<message->size; i++) {
        if (i==16) lcd.setCursor(0, 1);
        lcd.write((char)message->payload[i]);
      }
      break;
  }
}

Client API - AdvancedSerialClient

AdvancedSerialClient é o ponto de entrada para comunicação com programas baseados na AdvancedSerial. Ele permite garantir que o dispositivo está conectado, enviar mensagens para ele e receber eventos assíncronos.

Esse pedaço de código C# é responsável por enviar mensagens de controle para o programa LCDWriter do último exemplo:

try
{
    //create object
    AdvancedSerialClient ArduinoClient = new AdvancedSerialClient();
    //connect to device
    ArduinoClient.Open(Arguments[PARAMETER_PORT].ToString(), 115200);

    //command for LED
    if (Arguments.ContainsKey(PARAMETER_BACKLIGHT))
    {
        SerialProtocol.AdvancedSerialMessage BacklightMessage = new SerialProtocol.AdvancedSerialMessage();

        if ((bool)Arguments[PARAMETER_BACKLIGHT])
            BacklightMessage.ID = BACKLIGHT_ON_MESSAGE;
        else
            BacklightMessage.ID = BACKLIGHT_OFF_MESSAGE;

        ArduinoClient.Send(BacklightMessage);
    }

    //command for text
    if (Arguments.ContainsKey(PARAMETER_TEXT))
    {
        SerialProtocol.AdvancedSerialMessage TextMessage = new SerialProtocol.AdvancedSerialMessage();
        TextMessage.ID = TEXT_MESSAGE;
        TextMessage.Payload = new System.Text.ASCIIEncoding().GetBytes(Arguments[PARAMETER_TEXT].ToString());
        TextMessage.Size = (byte)TextMessage.Payload.Length;
        ArduinoClient.Send(TextMessage);
    }
}
catch (Exception ex)
{
    Console.Write("Error: " + ex.Message);
}

O completo, e pronto para usar, código desse exemplo está disponível na árvore de código da biblioteca.

Rodando o exemplo

São necessários para rodar adequadamente esse exemplo:

  • 1 Arduino;
  • 1 Protoboard (não esquecer o jogo de fios para as conexões);
  • 1 Display 1602A (16x2 com luz de fundo);
  • 1 Potenciômetro de 10k.

Os componentes deverão ser montados na protoboard da seguinte forma:



Uma vez que voce tiver gravado o programa LCDWriter dos exemplos da AdvancedSerial (menu da IDE: File/Examples/AdvancedSerial/LCDWriter) para sua placa Arduino o exemplo da API cliente LCDWrite.exe (diretório da IDE: libraries\AdvancedSerial\clientapi\dotnet\Release) será capaz de controlar a luz de fundo e o texto mostrado no display LCD.

Para encerrar, uma pequena demonstração do exemplo funcionando:


Esse projeto possui um repositório com maiores informações sobre as classes, instruções de uso e opções para download. Ele pode ser acessado pela URL http://code.google.com/p/ebl-arduino/.

No comments:

Post a Comment