Tutorial ini saya berikan di Konferensi Linux Tertanam mencoba untuk menjawab pertanyaan, memberikan tautan ke deskripsi yang lebih rinci dari topik yang dibahas dan menggunakan contoh praktis mengendarai drone 4WD, di mana Arduino Mini Pro bertindak sebagai budak dan mengendalikan 4 roda independen . Dokumen asli dapat ditemukan di sini .
Catatan: Jawaban ini saat ini sedang berlangsung, karena saya mengadaptasi highlight dari tautan.
Aplikasi Khas dari bus I2C
- Berinteraksi dengan periferal yang relatif lambat. Mis: sensor, aktuator mekanik.
Mengontrol periferal "cepat", yang menggunakan saluran lain untuk bertukar data. Contoh: codec.
Di PC, Sistem Operasi biasanya berinteraksi melalui I2C dengan:
- meter suhu dan tegangan baterai;
- pengendali kecepatan kipas;
- codec audio.
Dalam hal beberapa pengendali bus tersedia, periferal dikelompokkan berdasarkan kecepatan, sehingga yang cepat tidak dihukum oleh yang lebih lambat.
Pengantar cepat untuk fitur kunci bus I2C
- Serial bus.
- Hanya 2 baris: Serial CLock dan Serial DAta (plus ground).
- 4 kecepatan: 100kHz, 400kHz, 1MHz, 3.2MHz.
- Biasanya, 1 perangkat master dan 1 atau lebih budak.
- Komunikasi selalu diprakarsai oleh perangkat master.
- Beberapa master dapat hidup berdampingan di bus yang sama (multi-master).
- Open-Drain: SDA dan SCL membutuhkan resistor pull-up.
- "Peregangan Jam"
- Master mengontrol SCL, tetapi seorang budak dapat menahannya (karena drain terbuka), jika perlu menyesuaikan kecepatannya.
- Master harus memeriksa skenario ini.
- Seorang budak bisa macet dan macet bus: perlu untuk mengatur ulang garis dari master ke budak.
- Biasanya pengalamatan 7-bit, tetapi juga 10 bit didukung.
- Protokol logis: level tegangan aktual tidak ditentukan dan tergantung pada implementasi individual. Mis: 1.8V / 3.3V / 5.0V
URL referensi:
Contoh Konfigurasi Bus
Karakteristik Protokol (disederhanakan)
- 2 jenis pesan: baca dan tulis
- Start / Stop bit - direpresentasikan sebagai "[" dan "]" di sisa jawaban
- Alamat: 7 atau 10 bit
- R / W bit: R = 1 / W = 0 Digunakan untuk membedakan jenis pesan yang dikirim.
- Data di bus: (Alamat << 1 | R / W)
- Mendaftar sebagai penangan informasi, dalam perangkat yang dipilih.
Contoh lalu lintas Bus
Budak Kustom
Mengapa membuat budak I2C khusus?
- Sensor / aktuator yang diinginkan tidak tersedia dengan antarmuka I2C.
- Lebih sedikit alamat unik yang tersedia daripada yang dibutuhkan budak.
- Fungsi kustom yang diinginkan pada slave:
- Reaksi semi-otonom terhadap rangsangan.
- Memfilter / preprocessing data input.
- Optimalisasi daya: “hub sensor” kustom berfungsi baik saat prosesor utama idle.
- Respons waktu-nyata terhadap input.
- [imajinasimu disini]
Bagaimana cara merancang budak I2C kustom?
- Tetapkan persyaratan (lihat slide sebelumnya).
- Pilih mikrokontroler atau mikroprosesor.
- Pilih Penjadwal atau Sistem Operasi (jika ada).
- Tentukan sub-protokol komunikasi:
- Tentukan parameter dan perintah yang akan ditukar.
- Atur mereka menjadi "register" dan pilih alamat gratis.
Desain Master I2C
Kriteria desain utama:
- Berat / Dimensi.
- Diperlukan daya komputasi dan latensi rata-rata.
- Perangkat seperti PC
- Perangkat tertanam, biasanya tanpa kepala.
- Bahasa pemrograman yang disukai: ditafsirkan vs dikompilasi.
- Ketersediaan bus / gpios untuk mengendarai budak:
- Hanya GPIO: bitbang protokol
- I2C: aplikasi ruang pengguna vs driver kernel.
- Tidak ada antarmuka GPIO / I2C yang tersedia: adaptor USB ke I2C.
Debugging: Membagi dan Taklukkan
Kendalikan langsung bus dengan perangkat ad-hoc. Contoh:
Bajak Laut BUS
- Terutama untuk tujuan pengembangan.
- Keduanya bisa mengendus bus dan mengendarainya.
- Port antarmuka antar serial (ttyACM) konsol, termasuk makro, atau akses terprogram untuk beberapa bahasa pemrograman.
- Resistor pullup bawaan dan sumber tegangan (5V / 3.3V)
- Mendukung banyak protokol lain.
- Referensi: Wikipedia , halaman utama
USB ke I2C Adapter
- Jejak kaki kecil.
- Cocok untuk instalasi permanen.
- Tidak perlu koneksi khusus pada host: itu dapat digunakan untuk antarmuka dengan PC biasa.
- Tersedia varian yang juga mampu SPI.
- Tidak ada antarmuka konsol, hanya protokol biner seri.
- Membutuhkan pembungkus protokol .
- Referensi: protokol
sigrok dan pulseview
logo sigrok (komponen bakend)
contoh pulseview (visualizer)
Contoh dari low end logic Analyzer
- Standar de-facto untuk pengukuran berbasis PC di linux (tetapi juga tersedia di OS lain).
- Dukungan untuk berbagai macam analisa logika, ruang lingkup dan meter.
- Berbagai protokol decoder, termasuk I2C.
- Berguna untuk memvisualisasikan sinyal logis dan kesalahan protokol debugging.
- Bahkan sangat rendah, HW yang murah dapat memberikan dimensi baru untuk debugging.
- Referensi: sigrok , pulseview , perangkat keras yang didukung
Contoh: menyetir drone 4WD
Prototipe dibangun menggunakan 2 Arduino Mini Pro.
Apa yang dilakukan budak dalam contoh?
Budak I2C:
- Mengontrol jumlah torsi yang diterapkan pada setiap roda.
- Mengontrol arah setiap roda berputar.
- Mengukur kecepatan rotasi setiap roda melalui encoder optik (Odometer).
- Mengekspos parameter di atas ke Master I2C.
Diagram blok tingkat tinggi dari I2C Slave.
- Pin / fungsi yang cukup untuk menyediakan untuk setiap roda:
- 1 output PWM dengan konfigurasi independen dari siklus tugas.
- 1 GPIO untuk mendaftarkan input odometer sebagai IRQ.
- 2 GPIO untuk memilih:
- Meneruskan
- Membalikkan
- Diam
- Mengunci
- Blok I2C HW untuk pertukaran i2c yang digerakkan oleh interrupt.
- Pin khusus untuk pemrograman berbasis SPI.
- Jejak kaki kecil.
- Biaya rendah.
- Tata letak papan klon yang diwakili dalam gambar dioptimalkan untuk pemasangan pada soket DIL.
- RTOS: preemption, task, semaphores, tic sistem dinamis, dll.
- Jejak kecil: tautan hanya menggunakan kode / data.
- Perbedaan antara RTOS dan BSP melalui HAL.
- GPLv3 untuk penggunaan non-komersial.
- Dikembangkan secara aktif, tetapi sudah matang.
- Mendukung AVR 8bit.
Namun itu memiliki dukungan BSP terbatas untuk AVR, kurangnya: - menginterupsi driver untuk AVR GPIOs (ditambahkan). - Dukungan I2C untuk mode slave AVR (khusus). Yang harus dikembangkan secara terpisah sebagai bagian dari Drone SW untuk AVR .
Mendefinisikan Parameter Komunikasi
Untuk setiap roda:
Duty Cycle dari sinyal PWM yang digunakan untuk mengendarainya - 1 byte. 0xFF = torsi maksimum / 0x00 = tidak ada torsi.
Arah rotasi - 1 byte.
- 0x00 = idle
- 0x01 = mundur
- 0x02 = maju
- 0x03 = terkunci
Periode rata-rata di antara slot enkode optik - 2 byte.
- Menulis apa pun akan mengatur ulang pengukuran.
Indeks Parameter - 1 menggigit:
- 0 = Siklus Tugas
- 1 = Arah
- 2 = Periode Rata-Rata
Indeks roda - 1 gigitan:
- 0 = Kiri Belakang
- 1 = Kanan Belakang
- 2 = Kanan Depan
- 3 = Kiri Depan
- 4 = Semua
Sub Protokol: Menentukan Register
Format register: 0xαβ
- α = Indeks Parameter - β = Indeks Roda
Alamat (dipilih secara sewenang-wenang): 0x10
Format Pirate Bus:
- [= bit awal -] = bit akhir - r = byte baca - alamat kali 2 (shift kiri 1), untuk bit R / W
Contoh - dalam Format Bajak Laut Bus
[i2c_addr reg_addr = (parm, wheel) reg_value]
[0x20 0x20 0x02] Left Rear Forward
[0x20 0x21 0x01] Right Rear Backward
[0x20 0x22 0x01] Right Front Backward
[0x20 0x23 0x02] Left Front Forward
[0x20 0x14 0xFF] Wheels set to max torque
Mobil berputar searah jarum jam.