Menggunakan GPIO tambahan sebagai I / O digital?

11

semoga pertanyaan ini agak sederhana tetapi googling cepat saya tidak menemukan jawabannya.

Saya tahu bahwa RPi memiliki beberapa GPIO yang dapat saya gunakan serta GPIO khusus (SPI, I2C, UART, dll). Dalam proyek saya, saya benar-benar kehabisan GPIO biasa dan ingin menggunakan SPI, I2C, dan GPIO lainnya sebagai GPIO "biasa" juga. Saya tahu ini bisa dilakukan, tapi saya rasa saya tidak yakin bagaimana saya bisa mengaturnya agar tidak berjalan dalam mode SPI / I2C / etc dan hanya dijalankan sebagai GPIO biasa.

Apakah saya perlu melakukan sesuatu untuk mengaturnya dengan benar untuk ini?

Andrew Corsini
sumber

Jawaban:

10

Jawaban singkatnya

Tidak, kamu (hampir) tidak. Sebenarnya sebaliknya - Anda harus mengatur mereka bukan untuk GPIO tetapi untuk melayani tujuan khusus mereka. Satu-satunya pengecualian adalah pin UART. Juga dan pin I²C entah bagaimana istimewa.

Pin UART

Pin UART digunakan oleh kernel untuk konsol. Anda harus mengkonfigurasi sistem untuk tidak menggunakannya jika Anda ingin mereka tersedia untuk penggunaan Anda:

  • sunting /boot/cmdline.txtdan hapus console=ttyAMA0,115200dan kgdboc=ttyAMA0,115200parameter
  • edit /etc/inittabdan beri komentar (letakkan #karakter di depannya) baris:

    T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
    
  • reboot RaspberryPi Anda

Sekarang pin tidak boleh digunakan oleh sistem dan Anda dapat menggunakannya

I²C pin

Pin I²C memiliki resistor pull-up 1,8k terpasang. Mereka tidak dapat dinonaktifkan. Ini membatasi penggunaan pin tersebut dalam beberapa situasi (tetapi bisa berguna dalam situasi lain).

Solusi tambahan

Jika kehabisan pin GPIO, Anda kadang-kadang dapat dengan mudah menambah jumlahnya dengan menggunakan beberapa perangkat keras tambahan (tapi sederhana). Untuk output misalnya, Anda dapat menggunakan shift registersatau I²C I/O expanders(juga disebut `I²C bus ekspander), keduanya mudah dibeli dan digunakan. Anda dapat menemukan contoh penggunaannya di sini .

PFC8574(atau serupa dari keluarga ini) sangat populer sehingga ada modul kernel siap pakai yang menangani semua komunikasi untuk Anda ( tidak diaktifkan di kernel RaspberryPi resmi, Anda perlu mengkompilasi kernel Anda sendiri untuk menggunakannya ). Modul ini dipanggil gpio_pcf857x, asalkan Anda memuatnya modprobe(bersama dengan driver I²C) dan bahwa Anda memiliki chip yang terhubung ke I²Cbus, Anda dapat mengaktifkannya seperti ini:

echo pcf8574 0x27 > /sys/class/i2c-adapter/i2c-0/new_device

di mana pcf8574nama chip Anda yang sebenarnya (modul ini dapat menangani beberapa chip yang berbeda seperti pca967xdan max732x) dan 0x27merupakan alamatnya I²C(Anda dapat mengonfigurasi alamat chip saat memasang kabel).

Ini akan membuat entri dalam /sys/class/gpio/direktori yang akan memungkinkan Anda untuk menggunakannya dengan cara yang sama seperti port GPIO lain di RaspberryPi, asalkan Anda menggunakan sysantarmuka (misalnya wiringPiSetupSys()di wiringPi). Sayangnya, RPi.GPIOmodul Python tidak mendukung mode ini sehingga tidak akan dapat menggunakan pin ini dengan perpustakaan ini. Pin akan memiliki angka tinggi seperti 248-255 atau serupa.

Catatan: PCF8574 adalah sinking current- ia dapat memberikan drive sink (terima dalam kondisi rendah) sebanyak 20mA tetapi hanya dapat sumber 0,1mA dalam kondisi tinggi. Ini berarti bahwa Anda biasanya akan menggunakannya dalam logika terbalik, yaitu +3.3V -> LED -> RESISTOR -> PCF8574_PIN.

Krzysztof Adamski
sumber