Promotic

Komunikace s mikrokontrolerem Arduino

Arduino je otevřená platforma založená na mikrokontrolerech ATMega od firmy Atmel. Viz https://www.arduino.cc.

Mikrokontroler Arduino má mnoho možností komunikace s počítačem nebo s jinými mikrokontrolery.

Protokol Modbus

Pro komunikaci aplikace PROMOTIC s Arduinem se jeví jako nejvhodnější použít protokol Modbus.
Jako komunikační rozhraní lze použít (podle možností mikrokontroleru) sériová linka (MODBUS RTU) nebo Ethernet (MODBUS TCP).

Postup pro Arduino:
- Ze stránek "http://code.google.com/p/arduino-modbus-slave" stáhněte knihovnu "arduino-modbus-slave". V této knihovně je i příklad, který pomůže při používání této knihovny.
- Nainstalujte vývojový software pro Arduino ze stránek "https://www.arduino.cc".
- Spusťte software.
- Nastavte komunikační port pro komunikaci s PC (v menu "Nástroje / Port").
- Přidat stáhnutou knihovnu (v menu "Projekt / Include Library / Add .ZIP Library").
- Podle příkladu v knihovně vytvořte projekt pro Arduino.


Postup pro PROMOTIC:
Pro tuto komunikaci v systému PROMOTIC lze použít:

Komunikace uživatelsky konfigurovaným protokolem

Pro komunikaci aplikace PROMOTIC s Arduinem lze také vytvořit vlastní (uživatelsky definovaný) protokol. Obvykle se bude asi jednat o velmi jednoduchý protokol např. typu:
- Aplikace PROMOTIC zašle text "ai2" (žádá hodnotu analogového vstupu číslo 2)
- Arduino odpoví textem "24.3"

Takový protokol lze naprogramovat do Arduina (bude Slave) i do PROMOTIC aplikace (bude Master).

Postup pro PROMOTIC:
Pro tuto komunikaci v systému PROMOTIC lze použít:

Programování Arduina

Arduino lze programovat v jazyce C a C++. Nevyžaduje však praktické znalosti těchto programovacích jazyků.

Jednou z hlavních částí každého programu je funkce void setup() {}. Mezi složené závorky této funkce se píše kód, který se provede jen jednou na začátku programu. To znamená, že buď po připojení napájení, po stisknutí tlačítka "restart", nebo nahrání kódu do Arduina.

Druhou důležitou funkcí pro chod programu je funkce void loop() {}. Mezi složené závorky se zapisuje kód, který se bude opakovat neustále dokola, až do odpojení napájení.

Digitální vstupy a výstupy:
Protože Arduino je určeno k dalšímu rozšiřování, obsahuje vstupy a výstupy nazývané piny. K těmto pinů se dá vodičem připojit další obvody, čipy, relé, paměti atd. K práci s těmito piny má Arduino k dispozici jednoduché funkce.
- Funkce pinMode(p1, p2) je nutno volat pro určení zda se má s pinem pracovat jako se vstupem nebo výstupem. Parametr p1 je číslo pinu, parametr p2 určuje, zda se jedná o vstup nebo výstup.
- Funkce digitalWrite(p1, p2) slouží k ovládání výstupu. Parametr p1 je číslo pinu, parametr p2 určuje, zda má do pinu téct proud (HIGH = teče, LOW = neteče).
- Funkce value = digitalRead(p1) slouží pro čtení, zda proud do vstupu teče. Parametr p1 je číslo pinu. Funkce vrací hodnotu: HIGH = teče, LOW = neteče.


Analogové vstupy a výstupy:
Programování analogových vstupních a výstupních hodnot je trochu komplikovanější a složitější než programování digitálních hodnot. Název "Analogové" hodnoty není totiž v tom případě zcela přesný, protože se o žádné analogové hodnoty nejedná. Pokud je nutno použít analogovou hodnotu v rozsahu například 0-5V, pak by se musel použít externí D/A převodník. Tato funkce totiž na vybraných pinech generuje PWM signál, což je jakási digitální "náhražka" analogového signálu. Ta v praxi funguje tak, že rychle střídá 0 a 5V.
- Funkce value = analogWrite() slouží pro nastavení analogové hodnoty. Tuto funkci lze použít pouze na vybraných pinech označených PWM.
- Funkce analogRead() slouží pro čtení analogových hodnot na vstupních pinech, označených A.

Elementární Arduino program pro sériovou linku a protokol Modbus

#include <modbus.h>
#include <modbusDevice.h>
#include <modbusRegBank.h>
#include <modbusSlave.h>
modbusDevice regBank; // Setup the brewtrollers register bank. All of the data accumulated will be stored here
modbusSlave slave; // Create the modbus slave protocol handler
void setup()
{
  pinMode(2, INPUT); // Declare DI2
  pinMode(13, OUTPUT); // Declare LED as output
  regBank.setId(1); // Assign the MODBUS device ID
  regBank.add(10002); // Add Digital Input register
  regBank.add(13); // Add Digital Output register
  regBank.add(30001); // Add Analog Input register
  slave._device = &regBank; // Assign the modbus device object to the protocol handler
  slave.setBaud(9600); // Initialize the serial port for coms at 9600 baud
}
void loop()
{
  byte DI2 = digitalRead(2); // Digital Input
  if(DI2 >= 1)regBank.set(10002,1);
  if(DI2 <= 0)regBank.set(10002,0);
  int DO13 = regBank.get(13); // Digital output
  if(DO13 <= 0 && digitalRead(13) == HIGH) digitalWrite(13,LOW);
  if(DO13 >= 1 && digitalRead(13) == LOW) digitalWrite(13,HIGH);
  float valueAI0 = analogRead(0); // Analog Input
  regBank.set(30001, (word)valueAI0);
  slave.run();
}

Elementární Arduino program pro sériovou linku a uživatelsky konfigurovatelný protokol

float val;
char received;
void setup()
{
  pinMode(2,INPUT); // Declare DI2
  Serial.begin(9600); // Begin serial communication
}
void loop()
{
  while(Serial.available() > 0)
  {
    received = Serial.read();
    if(received == 'a')
    {
      val = analogRead(0);
      val = val*(5.0/1024.0);
      Serial.println(val);
    }
    else if(received == 'd')
    {
      val = digitalRead(2);
      Serial.println(val);
    }
  }
}
© MICROSYS, spol. s r.o.