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.
Brak komentarzy