. Viz
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:
- 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 = ®Bank; // 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();
}