Promotic
WikipediaLinkedInYoutubeTwitterFacebook

Komunikacja z mikrokontrolerem Arduino

Arduino to otwarta platforma oparta na mikrokontrolerach ATMega od firmy Atmel. Patrz https://www.arduino.cc.
 
Mikrokontroler Arduino posiada wiele możliwości komunikacyjnych z komputerem lub z innymi mikrokontrolerami.
 

Protokół Modbus

Do komunikacji aplikacji PROMOTIC z Arduino najodpowiedniejszym wydaje się zastosowanie protokołu Modbus.

W zależności od możliwości mikrokontrolera można zastosować warstwę komunikacyjną łącza szeregowego (Modbus RTU) lub Ethernet (Modbus TCP).

 
Opis dla Arduino:

- Ze strony "http://code.google.com/p/arduino-modbus-slave/" pobież bibliotekę "arduino-modbus-slave". W tej bibliotece znajduje się również przykład korzystania z niej.
- Zaistaluj środowisko deweloperskie dla Arduino ze strony "https://www.arduino.cc".
- Uruchom oprogramowanie.
- Ustaw port komunikacyjny do komunikacji z PC (w menu "Tools / Port").
- Dodaj pobraną bibliotekę (w menu "Projekt / Include Library / Add .ZIP Library").
- Na podstawie przykładu w bibliotece wytwórz projekt dla Arduino.

 
Opis dla PROMOTIC:

Do tej komunikacji w systemie PROMOTIC można zastosować: PmModbusMr - Driver do komunikacji protokołem Modbus Master.

Dla łatwego dodania tego drivera do aplikacji jest dogodne zastosować:

Komunikacja poprzez protokół zdefiniowany przez użytkownika

Do komunikacji aplikacji PROMOTIC z Arduinem można również stworzyć własny protokół (zdefiniowany przez użytkownika). W większości przypadków będzie too bardzo prosty protokół np. typu:
- Aplikacja PROMOTIC wyśle tekst "ai2" (pyta o wartość wejścia analogowego nr 2)
- Arduino odpowie tekstem "24.3"

Taki protokół można zaprogramować do Arduina (będzie Slave) oraz do aplikacji PROMOTIC (będzie Master).

 
Opis dla PROMOTIC:

Do tej komunikacji w systemie PROMOTIC można zastosować: PmChar - Driver do komunikacji przy pomocy ASCII/BIN protokołu zdefiniowanego przez użytkownika.

Dla łatwego dodania tego drivera do aplikacji jest dogodne zastosować:

Programowanie Arduina

Arduino można programować w składni języka C oraz C++. Nie wymaga praktycznej wiedzy tych języków programowania.
 
Jedną z głównych części każdego programu jest funkcja void setup() {}. W nawiasie złożonym tej funkcji trzeba wpisać kod, który zostanie wykonany tylko raz na początku programu. To znaczy, że lub po podłączeniu do zasilania, po naciśnięciu przycisku restart lub wgraniu kodu do Arduina.
 
Drugą ważną funkcją dla działania programu jest funkcja void loop() {}. W nawiasie złożonym tej funkcji trzeba wpisać kod, który będzie wykonywany na okrągło, aż do odłaczenia zasilania.
 
Cyfrowe wejścia oraz wyjścia:

Ponieważ Arduino jest przeznaczone do dalszego rozszerzania, zawiera wejścia oraz wyjścia nazywane pinami. Do tych pinów można przewodnikiem podłączyć obwody, czipy, przekaźniki, pamięci itd. Do pracy z pinami Arduino posiada proste funkcje.

- Funkcję pinMode(p1, p2) należy wołać w celu określenia, czy z danym pinem należy pracować jako z wejściem lub wyjściem. Parametr p1 to numer pinu, parametr p2 określa, czy chodzi o wejście lub wyjście.
- Funkcja digitalWrite(p1, p2) służy do zarządzania wyjściem. Parametr p1 to numer pinu, parametr p2 określa, czy do pinu ma płynąć prąd (HIGH = płynie, LOW = nie płynie).
- Funkcja value = digitalRead(p1) służy do odczytu, czy do wejścia płynie prąd. Parametr p1 to numer pinu. Funkcja zwraca wartość: HIGH = płynie, LOW = nie płynie.
 
Analogowe wejścia i wyjścia:

Programowanie wejściowych oraz wyjściowych wartości analogowych jest nieco bardziej skomlikowane aniżeli programowanie wartości cyfrowych. Nazwa wartości "Analogowej" nie jest w tym przypadku tak całkiem dokłedna, ponieważ nie chodzi o wartości analogowe. Jeżeli jest konieczne zastosować wartość analogową w zakresie na przykład 0-5V, wtedy należałoby zastosować zawnętrzny konwerter D/A. Funkcja ta generuje na wybranych pinach sygnał PWM, który jest jakoby cyfrowy "odpowiednik" sygnału analogowego. W rzeczywistości to działa w taki sposób, że szybko zmienia 0 na 5V.

- Funkcja value = analogWrite() służy do ustawienia wartości analogowej. Funkcję tą można zastosować tylko na wybranych pinach zaznaczonych PWM.
- Funkcja analogRead() jest przeznaczona do odczytu wartości analogowych na pinach wejściowych, zaznaczonych A.

Podstawowe oprogramowanie Arduino dla łącza szeregowego oraz protokół 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();
}

Podstawowe oprogramowanie Arduino dla łącza szeregowego oraz użytkownikiem konfigurowalny protokół

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);
    }
  }
}

Historia:
Pm8.03.11: Wytworzono
© MICROSYS, spol. s r. o.Tavičská 845/21 703 00 Ostrava-Vítkovice