Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Bagaimana Komunikasi I2C Bekerja? Tutorial Arduino dan I2C

Dalam tutorial ini kita akan mempelajari cara kerja protokol komunikasi I2C dan juga kita akan membuat contoh praktisnya dengan Arduino Board dan sensor yang menggunakan protokol ini. Anda dapat menonton video berikut atau membaca tutorial tertulis di bawah ini.

Ringkasan

Bus komunikasi I2C sangat populer dan digunakan secara luas oleh banyak perangkat elektronik karena dapat dengan mudah diimplementasikan dalam banyak desain elektronik yang memerlukan komunikasi antara perangkat master dan beberapa slave atau bahkan beberapa perangkat master. Implementasi yang mudah dilengkapi dengan fakta bahwa hanya dua kabel yang diperlukan untuk komunikasi antara hingga hampir 128 (112) perangkat saat menggunakan pengalamatan 7 bit dan hingga hampir 1024 (1008) perangkat saat menggunakan pengalamatan 10 bit.

Cara Kerja I2C

Bagaimana mungkin, komunikasi antara begitu banyak perangkat hanya dengan kabel? Nah, setiap perangkat memiliki ID prasetel atau alamat perangkat unik sehingga master dapat memilih dengan perangkat mana yang akan berkomunikasi.

Dua kabel, atau garis disebut Serial Clock (atau SCL) dan Serial Data (atau SDA). Garis SCL adalah sinyal clock yang menyinkronkan transfer data antara perangkat di bus I2C dan itu dihasilkan oleh perangkat master. Jalur lainnya adalah jalur SDA yang membawa data.

Kedua jalur tersebut adalah “open-drain” yang berarti resistor pull-up harus dipasang pada keduanya sehingga jalur menjadi tinggi karena perangkat pada bus I2C aktif rendah. Nilai resistor yang umum digunakan adalah dari 2K untuk kecepatan yang lebih tinggi pada sekitar 400 kbps, hingga 10K untuk kecepatan yang lebih rendah pada sekitar 100 kbps.

Protokol I2C

Sinyal data ditransfer dalam urutan 8 bit. Jadi setelah kondisi start khusus terjadi, muncullah urutan 8 bit pertama yang menunjukkan alamat dari slave yang menjadi tujuan pengiriman data. Setelah setiap urutan 8 bit mengikuti bit yang disebut Acknowledge. Setelah bit Acknowledge pertama dalam banyak kasus muncul urutan pengalamatan lain tetapi kali ini untuk register internal perangkat slave. Tepat setelah urutan pengalamatan mengikuti urutan data sebanyak-banyaknya sampai data benar-benar terkirim dan diakhiri dengan kondisi stop khusus.

Mari kita lihat lebih dekat peristiwa-peristiwa ini. Kondisi awal terjadi ketika jalur data turun rendah sementara jalur jam masih tinggi. Setelah ini, jam dimulai dan setiap bit data ditransfer selama setiap pulsa jam.

Urutan pengalamatan perangkat diawali dengan bit paling signifikan (MSB) terlebih dahulu dan diakhiri dengan bit paling tidak signifikan (LSB) dan sebenarnya terdiri dari 7 bit karena ke-8 th bit digunakan untuk menunjukkan apakah master akan menulis ke slave (logika rendah) atau membaca darinya (logika tinggi).

Bit berikutnya AKC/NACK digunakan oleh perangkat slave untuk menunjukkan apakah ia telah berhasil menerima urutan bit sebelumnya. Jadi pada saat ini perangkat master menyerahkan kendali jalur SDA ke perangkat slave dan jika perangkat slave telah berhasil menerima urutan sebelumnya maka akan menarik jalur SDA ke bawah ke kondisi yang disebut Acknowledge. Jika slave tidak menarik garis SDA ke bawah, kondisi ini disebut Not Acknowledge, artinya tidak berhasil menerima urutan sebelumnya yang dapat disebabkan oleh beberapa hal. Misalnya, budak mungkin sibuk, mungkin tidak memahami data atau perintah yang diterima, tidak dapat menerima data lagi dan sebagainya. Dalam kasus seperti itu, perangkat master memutuskan bagaimana ia akan melanjutkan.

Berikutnya adalah pengalamatan register internal. Register internal adalah lokasi dalam memori slave yang berisi berbagai informasi atau data. Misalnya Accelerometer ADX345 memiliki alamat perangkat yang unik dan tambahan alamat register internal untuk sumbu X, Y dan Z. Jadi jika kita ingin membaca data sumbu X, pertama-tama kita perlu mengirim alamat perangkat dan kemudian alamat register internal khusus untuk sumbu X. Alamat ini dapat ditemukan dari lembar data sensor.

Setelah pengalamatan, urutan transfer data dimulai baik dari master atau slave tergantung dari mode yang dipilih pada bit R/W. Setelah data terkirim secara lengkap, transfer akan berakhir dengan kondisi stop yang terjadi ketika jalur SDA bergerak dari low ke high sedangkan jalur SCL high.

Contoh

Sebagai contoh saya akan menggunakan breakout board GY-80 yang terdiri dari 5 sensor berbeda dan breakout board GY-521 yang terdiri dari 3 sensor berbeda. Jadi kita bisa mendapatkan data dari 8 sensor berbeda hanya dengan dua kabel dengan bus I2C.

Anda bisa mendapatkan komponen ini dari salah satu situs di bawah:

  • ADXL345 3-Sumbu Akselerator………………………………………………………
  • 2 in 1:Giroskop &Akselerometer 6 Sumbu MPU6050 …………………
  • 3 in 1:GY-80 9-Axis Magnetic Field Acceleration Giroskop……… Amazon 
  • 3 in 1: GY-86 10DOF MS5611 HMC5883L MPU6050 Module……… Banggood  / AliExpress

Inilah cara kami akan menghubungkan papan. Pin Serial Clock dari Arduino Board akan terhubung ke pin Serial Clock dari dua breakout board, hal yang sama berlaku untuk pin Serial Data dan kami akan memberi daya pada board dengan pin Gnd dan 5V dari Arduino Board. Perhatikan di sini kami tidak menggunakan resistor pull-up karena papan breakout sudah ada.

Sekarang untuk berkomunikasi dengan chip atau sensor ini, kita perlu mengetahui alamat uniknya. Kami dapat menemukannya dari lembar data sensor. Untuk papan breakout GY-80 kami memiliki 4 alamat berikut:0x53 heksadesimal untuk sensor 3 Axis Accelerometer, 0x69 heksadesimal untuk 3 Axis Gyro, 0x1E heksadesimal untuk Magnetometer 3 Sumbu dan 0x77 heksadesimal untuk Barometer dan Termometer sensor.

Untuk papan breakout GY-521, kami hanya memiliki satu alamat dan itu adalah 0x68 heksadesimal. Kita juga bisa mendapatkan atau memeriksa alamat menggunakan sketsa Pemindai Arduino I2C yang dapat ditemukan dari situs web resmi Arduino. Jadi di sini jika kita mengunggah dan menjalankan sketsa itu, kita akan mendapatkan alamat perangkat yang terhubung di bus I2C.


Sensor                                             Nomor Bagian                                   Alamat I2C

3 Akselerometer Sumbu                   Perangkat Analog ADXL345                   0x53                  Lembar data

3 Sumbu GyroST                                Mikroelektronika L3G4200D              0x69                  Lembar data

Magnetometer Sumbu 3                  Honeywell MC5883L                           0x1E                  Lembar data

Barometer + Termometer        Bosch BMP085                                     0x77                  Lembar data


Setelah kami menemukan alamat perangkat, kami juga perlu menemukan alamat register internal mereka untuk membaca data dari mereka. Misalnya jika kita ingin membaca data untuk sumbu X dari sensor 3 Axis Accelerometer dari papan breakout GY-80, kita perlu mencari alamat register internal tempat data sumbu X disimpan. Dari datasheet sensor, kita dapat melihat bahwa data untuk sumbu X sebenarnya disimpan dalam dua register, DATAX0 dengan alamat heksadesimal 0x32 dan DATAX1 dengan alamat heksadesimal 0x33.

Kode I2C Arduino

Sekarang mari kita buat kode yang akan mendapatkan data untuk sumbu X. Jadi kita akan menggunakan Perpustakaan Kawat Arduino yang harus disertakan dalam sketsa. Di sini pertama-tama kita harus menentukan alamat sensor dan dua alamat register internal yang sebelumnya kita temukan. Wire.begin() fungsi akan memulai perpustakaan Wire dan juga kita perlu memulai komunikasi serial karena kita akan menggunakan Serial Monitor untuk menampilkan data dari sensor.

Di loop() kita akan mulai dengan Wire.beginTransmission() fungsi yang akan memulai transmisi ke sensor tertentu, 3 Axis Accelerometer dalam kasus kami. Kemudian dengan Wire.write() fungsi kami akan meminta data tertentu dari dua register sumbu X. Wire.endTransmission() akan mengakhiri transmisi dan mengirimkan data dari register. Sekarang dengan Wire.requestFrom() fungsi kami akan meminta data yang dikirimkan atau dua byte dari dua register.

Wire.available() fungsi akan mengembalikan jumlah byte yang tersedia untuk pengambilan dan jika jumlah itu cocok dengan byte yang kami minta, dalam kasus kami 2 byte, menggunakan Wire.read() fungsi kita akan membaca byte dari dua register sumbu X. Pada akhirnya kami akan mencetak data ke monitor serial. Inilah data itu tetapi perlu diingat bahwa ini adalah data mentah dan beberapa matematika perlu dilakukan untuk mendapatkan nilai sumbu X yang tepat. Anda dapat menemukan detail lebih lanjut untuk itu di tutorial saya berikutnya untuk menggunakan akselerometer dengan Arduino Board karena saya tidak ingin membebani tutorial ini karena tujuan utamanya adalah untuk menjelaskan cara kerja komunikasi Arduino I2C.

/*  
 *  How I2C Communication Protocol Works - Arduino I2C Tutorial
 *  
 *   by Dejan, www.HowToMechatronics.com 
 *   
 */

#include <Wire.h>

int ADXLAddress = 0x53; // Device address in which is also included the 8th bit for selecting the mode, read in this case.

#define X_Axis_Register_DATAX0 0x32 // Hexadecima address for the DATAX0 internal register.
#define X_Axis_Register_DATAX1 0x33 // Hexadecima address for the DATAX1 internal register.
#define Power_Register 0x2D // Power Control Register

int X0,X1,X_out;

void setup() {
  Wire.begin(); // Initiate the Wire library
  Serial.begin(9600);
  delay(100);
  // Enable measurement
  Wire.beginTransmission(ADXLAddress);
  Wire.write(Power_Register);
  // Bit D3 High for measuring enable (0000 1000)
  Wire.write(8);  
  Wire.endTransmission();
}

void loop() {
  Wire.beginTransmission(ADXLAddress); // Begin transmission to the Sensor 
  //Ask the particular registers for data
  Wire.write(X_Axis_Register_DATAX0);
  Wire.write(X_Axis_Register_DATAX1);
  
  Wire.endTransmission(); // Ends the transmission and transmits the data from the two registers
  
  Wire.requestFrom(ADXLAddress,2); // Request the transmitted two bytes from the two registers
  
  if(Wire.available()<=2) {  // 
    X0 = Wire.read(); // Reads the data from the register
    X1 = Wire.read();   
  }
  
  Serial.print("X0= ");
  Serial.print(X0);
  Serial.print("   X1= ");
  Serial.println(X1);
}Code language: Arduino (arduino)

Proses manufaktur

  1. Komunikasi Arduino I2C dengan Raspi 2 WIOT
  2. Cara Membuat Monitor Energi Arduino dan Data Logger
  3. Pencatat Data Suhu dan Kelembaban
  4. Python3 dan Komunikasi Arduino
  5. Cara Menggunakan NMEA-0183 dengan Arduino
  6. Tutorial Arduino:JARVIS v1 | Cara membuat Otomasi Rumah
  7. Cara Multithread pada Arduino (Tutorial Protothreading)
  8. nRF24L01 – Cara Kerja, Antarmuka Arduino, Sirkuit, Kode
  9. Tutorial Akselerometer dan Giroskop Arduino dan MPU6050
  10. Cara Melacak Orientasi dengan Akselerometer Arduino dan ADXL345