PCF8574 GPIO Extender - Dengan Arduino dan NodeMCU

Dalam tutorial terakhir saya, saya bercakap mengenai MUX TCA9548A yang boleh digunakan untuk menambah maksimum 64 I2C atau I²C sensor ke Arduino / ESP8266 / ESP32 anda.

Dalam tutorial ini, saya akan bercakap tentang PCR8574 8-bit Port Extender GPIO. Ia adalah salah satu daripada extenders GPIO yang terdapat di pasaran.

Papan kecil ini menjadi penjimat hidup Apabila anda kehabisan pin pada Arduino anda. Ini "GPIO (Input Output Tujuan Umum) pin extender" menyediakan tambahan 8 pin (P0 ~ P7) yang boleh digunakan untuk 'mengeluarkan isyarat' atau 'membaca isyarat sebagai input'.

Modul-modul ini berjalan di atas bas I2C, dan jika daisy-chained anda boleh menyambung sehingga 8 peranti ini dalam projek. Setiap peranti akan memberi kita tambahan 8-bit GPIO yang membolehkan 64 GPIOs secara total.

IC ini sangat murah dan boleh dibeli dengan mudah dari eBay atau AliExpress. Jika anda tidak mahu bimbang tentang pendawaian dan hanya ingin memastikan projek anda benar-benar "mudah", maka anda boleh membeli papan pelayaran yang dipasang sepenuhnya ini. Anda hanya perlu menghubungkan mereka ke bas I2C dan anda semua bersedia untuk pergi.

Langkah 1: Keperluan Perkakasan

Untuk tutorial ini kita perlukan:

  • Breadboard
  • PCF8574 GPIO Extender IC
  • Lembaga Pelarian PCF8574 GPIO Extender
  • Arduino UNO / Nano apa sahaja yang berguna
  • NodeMCU
  • Beberapa LED dan jumlah yang sama 220 Ohms perintang menghadang
  • 2 x 10K Resistor
  • Kabel Pelompat, dan
  • Kabel USB untuk memuat naik kod

Langkah 2: Topik yang Dilindungi

  • Gambaran Keseluruhan Teknologi I2C
  • Lebih dekat melihat PCF8574 GPIO Extender IC dan Breakout Board
  • Pengalamatan GPIO
  • Perpustakaan Digunakan
  • Menyambungkan PCF8574 ke Arduino dan NodeMCU
  • Mencari alamat menggunakan Pengimbas I2C
  • Bagaimana untuk memprogram dan menggunakan PCF8574 dalam projek anda
  • Cara menggunakan Pin Interrupt
  • Bidang Aplikasi

Langkah 3: Teknologi I2C

Litar antara-bersepadu adalah I-squared-C (I²C) atau I2C adalah 'jarak pendek', 'dua teknologi bas dawai' (dengan betul sebenarnya 4 kabel kerana anda juga memerlukan VCC dan Ground) antara pelbagai pemproses dan sensor.

Sekiranya anda ingin mengetahui lebih lanjut mengenai teknologi I2C sila lihat 'Tutorial Number 09'. Buat masa ini kita akan hanya menampung asas-asas I2C dan kita akan melompat ke topik utama kami. Kedua-dua wayar adalah:

  • SDA - Data Serial (baris data) dan
  • SCL - Jam siri (jam)

Kedua-dua garisan ini terbuka, dan ditarik dengan perintang. Biasanya terdapat satu tuan dan satu atau berbilang hamba di atas talian, namun boleh ada beberapa tuan juga. Kedua-dua tuan dan budak boleh menghantar atau menerima data.

PCF8574 GPIO Extender berjalan di bas I2C, memanjangkan 'IO Pins' yang boleh dikawal oleh bas tunggal I2C bus. Julat Alamat PCF8574 adalah dari 0x20 hingga 0x27 (mod alamat 7 bit). pada maks 8 peranti ini boleh dihubungkan dalam projek ke bas I2C.

Langkah 4: Cari / Pengecutan yang lebih dekat

IC: (5 keping untuk AUD $ 2.30)

****************************

Membolehkan checkout pertama pin-out PCF8574 IC:

  1. PIN 16 IC ini adalah VCC yang boleh beroperasi pada 2.5V hingga 6V
  2. Pin 8 adalah GND
  3. Pins 4 ~ 7 dan 9 ~ 12 adalah P0 hingga P7 8-Selari (yang bermaksud anda boleh menggunakan semua 8 pin sekaligus) I / O pin. Setiap pin I / O ini boleh digunakan sebagai input atau output tanpa menggunakan isyarat kawalan arah-data. Pada kuasa, semua pin I / O ini berada pada keadaan HIGH.
  4. Pin 15 adalah untuk input atau output data bersiri I2C (Sambungkan ke VCC melalui perintang pull-up) dan
  5. Pin 14 adalah untuk input jam I2C (Sambungkan ke VCC melalui perintang pull-up)
  6. Pins 1, 2, dan 3 atau A0, A1 dan A2 membenarkan kami menentukan alamat yang PCF8574 muncul seperti pada bas I2C dengan menjadikannya TINGGI. Alamat lalai adalah 0x20. Secara lalai semua pin ini didasarkan atau LOW. Resistor pull-up tidak diperlukan untuk pin ini.
  7. Pin 13 adalah untuk Output Interrupt. Sambungkannya ke VCC menggunakan perintang pull-up.
  • IC ini mempunyai sangat "Rendah Sedia-Semasa" Penggunaan hanya 10μA.
  • SDA, SLC dan pin Interrupt semuanya perlu ditarik menggunakan perintang pull-up
  • Ada varian kedua dari IC ini yang terdapat di pasaran yang dipanggil PCF8574A. Perbezaan utama ialah skema pengalamatan. Empat bit pertama alamat 7-bit PCF8574 adalah 0100, dan bagi PCF8574A adalah 0111. Tiga bit yang lebih rendah adalah tetapan pada pin peranti A2, A1, dan A0.
  • PCF8574 dan PCF8574A mempunyai arus tenggelam maksimum 25mA. Dalam aplikasi yang memerlukan pemacu tambahan, dua pin pelabuhan mungkin dihubungkan bersama untuk menenggelamkan arus 50mA.

Langkah 5:

Modul: (1 Lembaga untuk AUD $ 1.34)

*******************************

  • Sekarang mari lihat PCF8574 Break-outboard:
  • Melihat dari kiri ke kanan kita dapat melihat bahawa modul mempunyai 4 pin: VCC, GND, SDA dan SCL
  • Kemudian kita mempunyai dua 10kΩ SMD pull-up resistor untuk bas SDA dan SCL.
  • Seterusnya kami mempunyai PCF8574 SMD IC diikuti oleh 3 jumper untuk A0, A1 dan A2 dengan kedudukan tinggi dan rendah. Kemudian kami mempunyai pelabuhan-pelabuhan ini yang boleh digunakan untuk memancing salah satu papan ini.
  • Kemudian kami mempunyai pin 8 I / O ditambah satu PIN Interrupt. Jika kita melihat bahagian belakang papan, pin semua dilabelkan bermula dari P0 hingga P7 dan kemudian berakhir dengan pin INTUL.

Apabila anda menggunakan pelbagai ini, anda boleh menukar alamat dengan melaraskan bar jumperAddress ini.

Langkah 6: Menangani

Dengan menyambungkan tiga bit alamat A0, A1 dan A2 ke VIN atau TINGGI, anda boleh mendapatkan kombinasi alamat yang berbeza.

Ini adalah bagaimana alamat byte PCF8574 kelihatan seperti. Pertama 7-bit bergabung untuk membentuk alamat hamba. Alamat terakhir alamat hamba menentukan operasi (membaca atau menulis) untuk dilakukan. Apabila tinggi (1), bacaan dipilih, manakala rendah (0) memilih operasi tulis.

Langkah 7: Perpustakaan Digunakan

'Wire Library' yang disertakan membolehkan komunikasi melalui bas Aruhino I2C / TWI, tetapi jika anda mahu, anda juga boleh memuat turun dan menggunakan 'PCF8574_library' daripada github: //github.com/xreef/PCF8574_library

Pautan adalah di huraian di bawah. Klik butang MUAT TURUN di sudut kanan atas halaman, sekali dimuat turun menamakan semula folder yang tidak dimampatkan ke PCF8574.

Pastikan folder PCF8574 mengandungi PCF8574.cpp dan PCF8574.h.

Letakkan folder perpustakaan PCF8574 di Arduino / pustaka / folder anda.

Anda mungkin perlu membuat sub-folder perpustakaan jika ini adalah perpustakaan pertama anda. Mulakan semula IDE dan kemudian anda harus dapat menggunakan perpustakaan dalam kod anda. Perpustakaan ini juga dilengkapi dengan contoh yang sangat baik yang akan membantu anda dalam mendapatkan tangan anda pada Expo IO.

#include "Arduino.h"

#include "PCF8574.h"

Lampiran

  • PCF8574_library-master.zip Muat turun

Langkah 8: Bagaimana Menyambung kepada Arduino / NodeMCU

Mari mulakan dengan menyambung IC ke Arduino. Sambungkan:

VCC hingga 3.3v

GND ke GND

Kami juga perlu menyambungkan tiga pin pemilihan alamat A0, A1 dan A2 ke GND untuk menggunakan alamat lalai 0x20 Kemudian hubungkan pin SCL ke A5 Arduino dan

SDA hingga A4

Akhirnya, kita perlu menarik kedua-dua SCL dan SDA bus dengan 10K resistor masing-masing.

Untuk NodeMCU sambungkan:

VCC hingga 3.3v

GND ke GND

Pins A0, A1 dan A2 ke GND

SCL ke D1

SDA kepada D2

Dan akhirnya menarik kedua-dua bas SDA dan SCL menggunakan 10K resistor masing-masing

Sebaik sahaja IC disambungkan kepada pengawal mikro, anda hanya perlu menyambungkan sensor ke Pins 4 ~ 7/9 ~ 12 atau dengan kata lain kepada pin P0 hingga P7 dari IC.

Langkah 9: Pengimbas I2C

Seperti yang kita tahu, dengan menghubungkan tiga bit alamat A0, A1 dan A2 ke VIN atau HIGH kita boleh mendapatkan kombinasi alamat yang berbeza. Oleh itu, kadang-kadang menjadi sukar untuk mengetahui apa alamat yang diperuntukkan kepada pengembang. Lebih-lebih lagi, jika ada dua atau lebih peranti pada bas I2C, itulah idea yang baik untuk memeriksa sama ada salah satu daripada mereka bercanggah dengan yang lain.

Dengan menjalankan 'Pengimbas I2C' ini, anda boleh mencari alamat hex peranti anda dengan mudah. Apabila dimuatkan kepada Arduino, lakaran itu mengimbas rangkaian I2C, yang menunjukkan alamat yang bertindak balas.

Lampiran

  • Muat turun I2CScanner.zip

Langkah 10: Kod

Sebaik sahaja anda mengetahui alamat IO Expander anda boleh menggunakannya dalam kod anda.

Pertama anda perlu memasukkan pustaka "PCF8574.h" ke kod anda.

Kemudian anda perlu lulus alamat IO Expander kepada pembina:

PCF8574 (alamat uint8_t);

untuk esp8266 jika anda mahu nyatakan pin SDA dan SCL gunakan ini:

PCF8574 (alamat uint8_t, uint8_t sda, uint8_t scl);

Kemudian anda perlu menentukan mod pin IO:

pcf8574.pinMode (P0, OUTPUT);

pcf8574.pinMode (P1, INPUT);

dan akhirnya "mulakan" penghantaran sebelum melelong melalui seluruh kod.

Langkah 11: Tulis Nilai

Sekarang, untuk menulis nilai, anda hanya perlu memanggil fungsi "digitalWrite" dan lulus nombor pin yang diikuti dengan mod:

PCF8574.digitalWrite (P1, TINGGI);

atau:

PCF8574.digitalWrite (P1, LOW);

Baiklah, jadi mari muat naik kod ke Arduino. Selaras dengan kod LED yang dilampirkan kepada P0 dan P1 expander itu perlu bergantian dan berkedip, dan itulah apa yang berlaku di sini, bingo.

Lampiran

  • Muat turun WriteValue.zip

Langkah 12: Baca Nilai

Sekarang, untuk membaca nilai-nilai dari pengembang kita akan menggunakan salah satu daripada dua fungsi "digitalReadAll ()" atau "digitalRead (Pin_Number)".

fungsi digitalReadAll () membaca 'semua input pin' dalam satu penghantaran:

PCF8574 :: DigitalInput di = PCF8574.digitalReadAll ();

Serial.print (di.p0); Serial.print ("-");

Serial.print (di.p1); Serial.print ("-");

Serial.print (di.p2); Serial.print ("-");

Serial.println (di.p3);

Jika anda mahu membaca input tunggal, anda boleh menggunakan fungsi "digitalRead (Pin_Number)":

int p1 = PCF8574.digitalRead (P1); // baca pin P1

Sekarang, mari muatkan kod ini ke Arduino. Kod ini sangat mudah dan ia hanya membaca nilai pin P1 dalam gelung. Jika nilai TINGGI, ia akan menghidupkan LED disambungkan ke pin P0. Saya menggunakan butang tekan ini untuk menukar keadaan pin P1. Apabila butang ditekan, nilai P1 menjadi TINGGI dan lampu LED menyala, dan apabila butang dikeluarkan, LED akan mati, itu mudah.

Lampiran

  • Muat turun ReadValue.zip

Langkah 13: Pin Interrupt

Dalam sistem kompleks, terbenam, pengkomputeran dan komunikasi data hari ini, interupsi digunakan secara meluas untuk peranti periferal servis. Walau bagaimanapun, kerana had pin nombor pada pakej, kebanyakan mikropemproses mempunyai hanya satu atau dua garisan mengganggu.

Akibatnya, beberapa peranti biasanya dihubungkan ke barisan gangguan yang sama. Kelemahan untuk konfigurasi ini adalah bahawa masa pemprosesan overhead untuk mengenal pasti peranti yang meminta perkhidmatan gangguan mungkin terlalu lama (mengikut susunan mikrosecond).

Pengimbas I / O terpencil boleh memaklumkan kepada mikropemproses jika terdapat data masuk pada port atau jika terdapat pertukaran data port, tanpa perlu berkomunikasi melalui bas I2C.

PCF8574 menyediakan keluaran open-drain interrupt (INT) yang boleh diberi input kepada mikropemproses yang sepadan. Untuk mengetahui lebih lanjut tentang gangguan, sila baca lembaran data yang dilampirkan.

Untuk menggunakan gangguan, anda mesti memulakan pin dan fungsi untuk memanggil apabila PCF8574 menimbulkan gangguan, sekali dilakukan anda boleh menggunakan rutin mengganggu dalam program anda.

// Fungsi mengganggu

void keyPressedOnPCF8574 ();

// Set alamat HEX i2c

PCF8574 pcf8574 (0x20, ARDUINO_UNO_INTERRUPT_PIN, keyPressedOnPCF8574);

Lampiran

  • KeyPressed_withInterrupt.zip Muat turun
  • Muat turun DataSheet.zip

Langkah 14: Bidang Aplikasi

PCF8574 GPIO Extenders digunakan dalam:

  1. Pemproses dengan PIN GPIO Terhad
  2. Anda boleh membuat pad kekunci berasaskan I2C menggunakannya
  3. Mereka boleh digunakan apabila bekerja dengan Multiple Relays
  4. Mereka boleh digunakan untuk membuat Litar Chaser LED
  5. IC ini juga digunakan untuk memacu LCD Shields dan banyak lagi ...

Saya sebenarnya merancang lembaga pelarian dengan 8 daripada IC ini yang dipasang di atasnya untuk memperluaskan pin GPIO Arduino saya. Dalam usaha lain, saya akan menggabungkan IC ini dengan TCA9548A I2C MUX untuk melihat sama ada saya boleh mendapatkan pin GP 512 secara keseluruhan. Breakout TCA9548A membolehkan komunikasi dengan pelbagai peranti I2C yang mempunyai alamat yang sama menjadikannya mudah untuk bersambung dengan mereka. Jelas sekali, NANO akan menangis mengawal banyak pin tetapi mungkin MEGA akan mampu mengendalikannya. Walau bagaimanapun, saya belum lagi mencubanya.

Maksimum 8 MUX boleh ditambah kepada Arduino masing-masing menyediakan tambahan 8 port I2C. Jadi:

8 x 8 = 64 I2C Ports

Sekarang, jika kita menyambungkan 64 pendorong IO ini, kita akan dapat:

64 x 8 = 512 IO Pins

Jadi, apa yang anda tunggu? Teruskan menggunakan imajinasi anda dan lampirkan 64 sensor ke Arduino anda untuk membuat projek automasi hebat untuk memukau rakan anda.

Lampiran

  • Muat turun Schematic.zip

Langkah 15: Pautan Muat Turun

  • Perpustakaan: //github.com/xreef/PCF8574_library
  • Kod:
  • Pengimbas I2C:
  • Helaian data :
  • Skematik:

Terima kasih lagi untuk membaca tutorial. Saya harap ia membantu anda.

Jika anda mahu menyokong saya, anda boleh melanggan saluran saya dan menonton video saya yang lain. Terima kasih lagi dalam video seterusnya, selamat tinggal sekarang.

Artikel Berkaitan