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) :

[pastacode lang=”cpp” manual=”%0A%23include%20%3CWire.h%3E%20%2F%2F%20biblioteka%20%0A%0Avoid%20setup()%20%0A%7B%0A%20%20Wire.begin()%3B%20%2F%2F%20do%C5%82%C4%85czamy%20do%20lini%20i2c%2C%20w%20konstruktorze%20mo%C5%BCna%20poda%C4%87%20adres%20je%C5%9Bli%20p%C5%82ytka%20ma%20by%C4%87%20SLAVE%2C%20opcjonalnie%20ustawiony%20jest%20adres%20MASTERA%0A%7D%0A%0A%0Avoid%20loop()%20%0A%7B%0A%20%20Wire.beginTransmission(8)%3B%20%2F%2F%20adres%20urz%C4%85dzenia%20-%20start%20transmisji%0A%20%20Wire.write(%22LearnDuino%20%22)%3B%20%20%20%20%20%20%20%20%2F%2Fnadanie%20wiadomo%C5%9Bc%0A%20%20Wire.endTransmission()%3B%20%20%20%20%2F%2F%20koniec%20transmisji%20%0A%0A%20%20delay(500)%3B%0A%7D” message=”” highlight=”” provider=”manual”/]

Kod odbiorcy (Slave) :

[pastacode lang=”cpp” manual=”%23include%20%3CWire.h%3E%0A%0Avoid%20setup()%20%0A%7B%0A%20%20Wire.begin(8)%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20do%C5%82%C4%85czmy%20do%20lini%20i2c%20jako%20SLAVE%20na%20z%20adresem%208%20%0A%20%20Wire.onReceive(receiveEvent)%3B%20%2F%2F%20oczekujemy%20na%20event%20%0A%20%20Serial.begin(9600)%3B%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20serial%20monitor%20%0A%7D%0A%0Avoid%20loop()%20%0A%7B%0A%20%20delay(100)%3B%0A%7D%0A%0A%2F%2F%20funkcja%20odpowiedzilana%20z%20odbiernai%20danych%2C%20handler%20dla%20naszego%20eventu%20%0Avoid%20receiveEvent(int%20howMany)%20%0A%7B%0A%20%20while%20(Wire.available())%20%2F%2F%20sprawdzamy%20czy%20co%C5%9B%20zosta%C5%82o%20wykryte%20%0A%20%20%7B%0A%20%20%20%20char%20c%20%3D%20Wire.read()%3B%20%2F%2F%20przypisujemy%20odebrane%20dane%20do%20zmiennej%20char%20(istneje%20mo%C5%BCliwo%C5%9B%C4%87%20pprzypisania%20odebarnej%20wartos%C4%87i%20do%20typu%20int%20lub%20innego)%0A%20%20%20%20Serial.print(c)%3B%20%20%20%20%20%20%20%20%20%2F%2F%20wy%C5%9Bwietlamy%20warto%C5%9B%C4%87%20zmienej%20char%0A%20%20%7D%0A%09%0A%09Serial.println()%3B%0A%7D” message=”” highlight=”” provider=”manual”/]

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) :

[pastacode lang=”cpp” manual=”%23include%20%3CWire.h%3E%20%2F%2F%20biblioteka%20%0A%0Avoid%20setup()%20%0A%7B%0A%20%20Wire.begin()%3B%20%20%20%20%20%20%20%20%2F%2F%20do%C5%82%C4%85czmy%20do%20lini%20i2c%20jako%20master%20(dla%20slave%20nale%C5%BCy%20poda%C4%87%20adres)%20%0A%20%20Serial.begin(9600)%3B%20%20%2F%2F%20start%20serial%20monitor%0A%7D%0A%0Avoid%20loop()%20%7B%0A%20%20Wire.requestFrom(8%2C%206)%3B%20%20%20%20%2F%2F%20oczkujemy%20na%206%20bajt%C3%B3w%20od%20slave%20na%20kanale%208%20%0A%0A%20%20while%20(Wire.available())%20%2F%2F%20slave%20mo%C5%BC%C4%99%20nada%C4%87%20mniej%20ni%C5%BC%206%20bajt%C3%B3w%20%0A%20%20%7B%20%0A%20%20%20%20char%20c%20%3D%20Wire.read()%3B%20%2F%2F%20odbi%C3%B3r%20bajt%C3%B3%20i%20zapis%20jako%20char%20(mozliow%C4%87%20zapisu%20do%20typu%20int%20lub%20innego)%20%0A%20%20%20%20Serial.print(c)%3B%20%20%20%20%20%20%20%20%20%2F%2F%20wy%C5%9Bwietlenie%20znaku%20%0A%20%20%7D%0A%0A%20%20delay(500)%3B%0A%7D” message=”” highlight=”” provider=”manual”/]

Kod nadajnika(Slave) :

[pastacode lang=”cpp” manual=”%23include%20%3CWire.h%3E%0A%0Avoid%20setup()%20%0A%7B%0A%20%20Wire.begin(8)%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20do%C5%82%C4%85czmy%20do%20lini%20i2c%20jako%20slave%20z%20adresem%208%0A%20%20Wire.onRequest(requestEvent)%3B%20%2F%2F%20oczekujmy%20na%20event%20%0A%7D%0A%0Avoid%20loop()%20%0A%7B%0A%20%20delay(100)%3B%0A%7D%0A%0A%0Avoid%20requestEvent()%20%0A%7B%0A%20%20Wire.write(%22hello%20%22)%3B%20%2F%2F%20wys%C5%82%C4%85nei%20wiadomos%C4%87i%20o%20wartos%C4%87i%206%20bit%C3%B3w%20%0A%20%20%2F%2F%20tak%20jak%20oczekiwa%C5%82%20Master%0A%7D” message=”” highlight=”” provider=”manual”/]

 

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.

Poprzednia informacja Wprowadzenie do Arduino. Jak zacząć
Kolejna informacja Ożywiamy nasze Arduino

Brak komentarzy

Zostaw odpowiedź

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *