Tym razem zaprezentuje sposób programowania czujnika temperatury TC74, działającego poprzez magistralę I2C.
Wstęp
I2C jest to magistrala dwukierunkowa, szeregowa, która służy do przesyłania danych.
Do transmisji wykorzystywane są dwie linie: linia danych SDA (ang. Serial Data Line) oraz linie zegara SCL (ang. Serial Clock Line). Obie te linie muszą być podciągnięte do zasilania poprzez rezystory (ang. pull-up). Magistrala wykorzystuje tzw. logikę dodatnią. Oznacza to, że stan 0 odpowiada stanowi niskiemu, natomiast 1 to stan wysoki.
Nadajniki są ustawione jako otwarty kolektor (wyprowadzenie kolektora tranzystora na końcówkę układu) lub otwarty dren ( kiedy stosowany jest tranzystor MOSFET ). Dzięki temu możliwe jest wykrywanie kolizji, ponieważ występujący stan 1 jest recesywny, natomiast 0 jest dominujące. Urządzenie nadające stan wysoki sprawcza, czy wystąpił na magistrali stan wysoki. Jeśli wystąpił wtedy można przesyłać informację, jeśli nie to inne urządzenie wysyła dane w tym samym czasie.
Występujące urządzenia w tej magistrali dzielą się na master oraz slave. Master inicjalizuje transmisję, natomiast slave odbiera wysłane dane. Jak wspomniałem wcześniej zastosowano w tej magistrali mechanizm detekcji kolozji. Dzięki temu możliwe jest zastosowanie trybu pracy multi-master.
Dane wysyłane są od najbardziej znaczącego bitu do najmniej znaczącego. Bity grupowane są po 8. Po przesłaniu wszystkich 8 bitów wysyłany jest jeszcze jeden bit potwierdzający odebranie danych (ACK lub NACK). Przesyłany jest on w kierunku przeciwnym do wysłanych danych.
Pierwszym nadawanym bajtem jest adres urządzenia slave. Składa sie on z 7 bitów adresu oraz jednego bitu określającego kierunek transmisji. Jeśli ten bit ma wartość 1 wtedy następuje odczyt danych od slave'a do mastera, natomiast wartość 0 oznacza zapis danych w kierunku od mastera do slave'a. Po wysłaniu tego bajtu następuje przesłanie danych.
I2C nie oferuje wysokiej prędkości transmisji. Natomiast bardzo dobrze sprawdzi się w przypadku gdy potrzebna jest łatwa konstrukcjom, oraz co najważniejsze niski koszt wdrożenia.
Czujnik temperatury TC74
TC74 jest to cyfrowy czujnik temperatury wyprodukowany przez firmę Microchip. Czujnik posiada dwa rejestry jeden z nich przechowuje wartość temperatury w Celsjuszach, natomiast drugi natomiast zawiera informacje dotyczące konfiguracji urządzenia.
Parametry TC74 są następujące:
- Obudowa SOT-23-5 lub TO-220,
- Temperatura przesyłana w formie 8 bitowej,
- Komunikacja poprzez I2C,
- Dokładność: od +25˚C do + 85˚C dokładność wynosi ± 2˚C, od 0˚C do 125˚C dokładność oscyluje w okolicach ± 3˚C,
- Zasilanie: od 2,7 V do 5,5 V,
- Pobór prądu: 200 µA w czasie pracy, 5 µA w trybie czuwania (ang. StandBy Mode).
Rys. 1.1. TC74 [1]
Na poniższym rysunku wklejam informacje odnośnie tych rejestrów zaczerpnięty z dokumentacji TC74.
Rys. 1.2. Informacje odnośnie konfiguracji rejetrów [1]
Rys. 1.3. Reprezentacje temperatury [1]
Adres urządzenia można odczytać z dokumentacji. Poniżej stosowana tabelka.
Rys. 1.4. Adresy czujników
Czujnik podłącza się następująco: SDA - A4, SCL - A5. Te linie należy podłączyć poprzez rezystory o wartości w okolicach 5 kOhm (np. 4,7kOhm lub 5,1kOhm). No i oczywiście odpowiednio GND i zasilanie.
Programowanie
W celu zaprogramowania czujnika za pomocą Arduino wykorzystuje się bibliotekę wire.h. Programowanie rozpoczyna się od ustawienia urządzenia w trybie zapisu oraz wysłania adresu czujnika. Następnie wpisuje się wartość 0, która informuje, że będziemy pobierać dane. Kolejnym krokiem jest ponowne wysłanie adresu w trybie odczytu i żądanie podania 8 bitów czyli jednego bajtu z czujnika. Na końcu należy poczekać na otrzymanie informacji zwrotnej.
#include <Wire.h> //Adres urządzenia zapisany w w formie dziesiątkowej //w binarnej jest to 1001000 int adres = 72; void setup() { Serial.begin(9600); //Stworzenie obiektu Wire.begin(); } void loop() { int temp = 0; //Rozpoczęcie transmisji Wire.beginTransmission(adres); //Wysłanie bitu 0, dla rejestru danych Wire.write(0); //Zakończenie transmisji Wire.endTransmission(); //Żądanie jednego bajtu, z czujnika o podanym adresie Wire.requestFrom(adres, 1); //Czekanie na odpowiedź while(Wire.available() == 0); //Wpisanie odebranej wartości do zmiennej temp = Wire.read(); //Wypisanie otrzymanej wartości poprzez port szeregowy Serial.print(temp); Serial.println(" C;"); delay(1000); }
Bibliografia
[1] TC74 Datasheet