Arduino – komunikacja przewodowa

Interesując się tematem mikrokontrolerów często trafiamy na temat komunikacji. Od niedawana popularny jest bardzo temat IoT – internet rzeczy czyli połączenie bezprzewodowe pomiędzy dwoma lub więcej układami. Logiczne jest więc że jeśli istnieje komunikacja przewodowa istnieje również komunikacja bez przewodowa. W tym przypadku również istnieje wiele możliwości połączenia – jedną z nich jest I2C i to właśnie jej zastosowanie przedstawię w tym wpisie.

Teoria

Potrzebny sprzęt:
– Arduino x 2
(w moim przypadku arduino UNO oraz arduino pro mini 5v + programator)
– kilka kabli
– dobry kable USB aby uniknąć problemów z komunikacją.

Połączenie:


Komunikujemy się za pomocą I2C korzystamy więc z 3 połączeń:
SDA (serial data, pin A4) łączymy razem, linia zielona
SCL (serial clock, pin A5) łączymy razem, linia niebieska
GND (masa) łączymy razem, linia czarna

Master Writer/Slave Receiver*

Master jako  nadawca wiadomości, oraz Slave jako odbiorca. Master nadaje wiadomość która  zostanie odebrana przez Slave. Master jako jednostka sterująca która wysyła dane do Slave (czujnika).

Kod nadawcy (Mastera) :


#include <Wire.h> // biblioteka 

void setup() 
{
  Wire.begin(); // dołączamy do lini i2c, w konstruktorze można podać adres jeśli płytka ma być SLAVE, opcjonalnie ustawiony jest adres MASTERA
}


void loop() 
{
  Wire.beginTransmission(8); // adres urządzenia - start transmisji
  Wire.write("LearnDuino ");        //nadanie wiadomośc
  Wire.endTransmission();    // koniec transmisji 

  delay(500);
}

Kod odbiorcy (Slave) :

#include <Wire.h>

void setup() 
{
  Wire.begin(8);                // dołączmy do lini i2c jako SLAVE na z adresem 8 
  Wire.onReceive(receiveEvent); // oczekujemy na event 
  Serial.begin(9600);           // serial monitor 
}

void loop() 
{
  delay(100);
}

// funkcja odpowiedzilana z odbiernai danych, handler dla naszego eventu 
void receiveEvent(int howMany) 
{
  while (Wire.available()) // sprawdzamy czy coś zostało wykryte 
  {
    char c = Wire.read(); // przypisujemy odebrane dane do zmiennej char (istneje możliwość pprzypisania odebarnej wartosći do typu int lub innego)
    Serial.print(c);         // wyświetlamy wartość zmienej char
  }
	
	Serial.println();
}

Master Reader/Slave Sender*

Master jako odbiorca wiadomości która zostanie nadana przez Slave. Slave wysyła dane które wykrywa Master i wyświetla na ekranie. Slave jako czujnik może zebrać dane i wysłać je do mastera ale ilość tych danych musi zostać ustalona.

Kod odbiornika (Master) :

#include <Wire.h> // biblioteka 

void setup() 
{
  Wire.begin();        // dołączmy do lini i2c jako master (dla slave należy podać adres) 
  Serial.begin(9600);  // start serial monitor
}

void loop() {
  Wire.requestFrom(8, 6);    // oczkujemy na 6 bajtów od slave na kanale 8 

  while (Wire.available()) // slave możę nadać mniej niż 6 bajtów 
  { 
    char c = Wire.read(); // odbiór bajtó i zapis jako char (mozliowć zapisu do typu int lub innego) 
    Serial.print(c);         // wyświetlenie znaku 
  }

  delay(500);
}

Kod nadajnika(Slave) :

#include <Wire.h>

void setup() 
{
  Wire.begin(8);                // dołączmy do lini i2c jako slave z adresem 8
  Wire.onRequest(requestEvent); // oczekujmy na event 
}

void loop() 
{
  delay(100);
}


void requestEvent() 
{
  Wire.write("hello "); // wysłąnei wiadomosći o wartosći 6 bitów 
  // tak jak oczekiwał Master
}

 

Od autora:
– Od teraz analiza kodu będzie w formie komentarzy, zajmuje to znacznie mniej czasu a jest moim zdaniem bardziej czytelne.
* W sumie nie wiem jak to poprawnie przetłumaczyć, więc zostawiłem tak jak jest tzn angielskie nazwy.
Jeśli ktoś ma jakieś propozycję, czekam na komentarze wówczas dokonam edycji wpisu.

Udanego weekendu – Team Learnduino.

Maciej Szostak

Create Account



Log In Your Account