niedziela, 18 października 2015

[16] Arduino - I2C, obsługa czujnika temperatury TC74

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