Misalnya, jika Anda memiliki Arduino dengan 4 pin IO digital, bagaimana Anda bisa menyalakan> 4 LED secara mandiri, atau membaca status> 4 tombol?
Misalnya, jika Anda memiliki Arduino dengan 4 pin IO digital, bagaimana Anda bisa menyalakan> 4 LED secara mandiri, atau membaca status> 4 tombol?
Jawaban:
Register geser seperti 74595 akan memungkinkan Anda untuk memiliki banyak output dengan hanya 2 koneksi: pin data dan pin jam. Anda mengatur pin data ke nilai berikutnya yang ingin Anda pindahkan ke register, dan kemudian pulsa pin jam.
Bruno memberikan jawaban yang baik, tetapi saya ingin membuat beberapa catatan.
The 70 mA yang terkenal
The 74HC595 sering digunakan sebagai I / O diperpanjang, dan seperti yang sering digunakan untuk mengontrol serangkaian LED. Apa yang sering diabaikan adalah bahwa Anda dapat mengoperasikannya dengan cara ini. Datasheet mengatakan bahwa total pasokan saat ini tidak boleh lebih dari 70 mA, Absolute Maximum Ratings (AMR), jadi Anda lebih baik menjauh dari itu dengan beberapa margin. Oleh karena itu 8 LED pada 10 mA terlalu banyak, dan pada 20 mA Anda akan melebihi AMR tidak kurang dari 130%! Batas tersebut mungkin disebabkan oleh kapasitas saat ini dari kabel ikatan, dan kemudian arus yang terlalu tinggi mungkin tidak hanya menurunkan kinerja bagian, tetapi secara permanen membuatnya rusak jika kawat itu akan putus.
Tapi tadi malam aku bangun karena aku punya ide . Batas 70 mA berlaku untuk ICC dan arus ground, lalu mengapa tidak membagi total atau 80 mA dan biarkan Icc memiliki separuhnya dan arus ground separuh lainnya? Yang harus Anda lakukan adalah referensi 4 LED ke tanah (aktif tinggi), dan 4 lainnya ke Vcc (aktif rendah). Kemudian arus yang pertama berasal dari Icc, arus yang lain pergi ke tanah. Anda dapat menggunakan LED 15 mA dengan cara ini. (Sangat sederhana sehingga saya merasa seperti orang idiot untuk tidak memikirkannya lebih awal.)
Jam gabungan yang
kupikir Bruno menyelamatkan pin I / O tambahan dengan menggabungkan jam register geser dengan kaitnya. Sepertinya saya salah menafsirkan jawabannya. Saya masih ingin memperluas opsi ini.
Lalu apa yang terjadi? Tabel di halaman 5 dari lembar data mengatakan:
isi daftar geser bergeser; isi sebelumnya dari register geser ditransfer ke register penyimpanan dan tahap output paralel
(disoroti oleh saya)
Jadi bukan data baru tapi sebelumnya yang terkunci. Bukan masalah nyata, pastikan untuk menggeser bit dummy ekstra untuk mengunci data terakhir, atau semuanya akan salah pin.
Menggabungkan jam juga berarti bahwa output akan beralih sepanjang waktu saat Anda memindahkan data baru. Fungsi latch sebenarnya untuk menghindari itu. Dalam banyak kasus ini tidak akan menjadi masalah, jika Anda dapat melakukannya dengan cepat, tetapi dalam situasi terburuk Anda mungkin mendapatkan efek yang tidak diinginkan. Kasus terburuk bisa menggunakan 74HC595 untuk mengalikan tampilan pada frekuensi pemindaian yang sangat tinggi + memiliki rantai register geser yang sangat panjang + memiliki semua angka 1 kecuali satu 0, LED yang mati + ruangan gelap. Karena LED itu melihat semua angka 1 lewat begitu sering di ruangan yang gelap, lampu itu bisa menyala sangat redup.
Atau jika Anda menggabungkan multiplexing frekuensi tinggi dengan output kontrol relai. Semua nol dan kemudian 1 untuk relai dapat berarti bahwa output relai tidak cukup tinggi untuk menarik.
Memang, itu adalah kasus yang ekstrem, tapi saya akan menjaga jam seri dan latch terpisah bila mungkin jika Anda ingin multiplex, atau memiliki tingkat pembaruan yang tinggi.
Saya setuju dengan Ignacio tentang penggunaan 74XX595, serial paralel keluar register geser untuk ekspansi output, tetapi sebenarnya Anda akan memerlukan 3 koneksi, satu untuk data , satu untuk jam dan satu kait memungkinkan yang akan mentransfer data dari register geser internal ke kait keluaran.
Untuk perluasan input Anda bisa menggunakan 74XX165, paralel dalam register geser keluar seri, ini akan memungkinkan untuk memiliki hingga 8 tombol per 74XX165.
Hal yang baik tentang pendekatan ini adalah Anda dapat membuat daisy chain beberapa register geser yang memungkinkan peningkatan jumlah input atau output, dan lebih baik, Anda dapat mencampur 74XX595 dan 74XX165 memungkinkan dan Anda memiliki sejumlah input atau output.
Selain itu, Anda dapat membagikan sinyal jam dan kait yang mengurangi jumlah koneksi yang dibutuhkan dan sangat menyederhanakan perangkat lunak. Dengan cara ini Anda hanya perlu 4 koneksi untuk sejumlah register shift ini:
Ketika saya sedang mencari diagram yang saya temukan di situs web ini cara yang sangat cerdas untuk mengurangi hingga 3 jumlah koneksi yang diperlukan. Terdiri dari menggunakan pin yang sama untuk input dan output data.
Perangkat lunak akan melakukan hal seperti ini untuk setiap jam pulsa:
Nick menyebutkan I / O ekspander, dan mereka layak untuk dilihat. Digikey mencantumkan lebih dari seribu di antaranya, saya akan memilih satu dengan antarmuka I2C sebagai contoh, karena itu membutuhkan paling sedikit pin I / O; minimal dua.
NXP PCA9505 memiliki 40 pin I / O yang dapat dikonfigurasi, setara dengan lima 74HC595s. Ini adalah solusi yang sedikit lebih mahal tetapi Anda mendapatkan lebih banyak fungsi untuk itu:
Bacaan lebih lanjut eksponen
GPIO , brosur NXP
lembar data PCA9505
Untuk solusi tanpa IC tambahan, Anda dapat menggunakan teknik seperti Multiplexing dan Charliplexing :
Multiplexing (tidak ada resistor pembatas arus ditampilkan):
Cara multiplexing bekerja cukup sederhana - dalam contoh di atas, jika kita ingin menyalakan LED1, kita menetapkan pin C1 ke output tinggi dan PIN R1 ke output rendah, semua pin lainnya bisa tinggi atau Hi-Z (set ke input, tinggi impedansi yang membuat mereka terlihat "terputus")
Jika kita ingin menyalakan LED5, kita mengatur pin C2 ke output tinggi dan R2 ke output rendah.
Jumlah pin yang diperlukan untuk menggerakkan x LED dapat dikerjakan dengan 2n pin untuk LED ², jadi misal untuk 16 LED kita perlu (√16) * 2 = 8 pin.
Charlieplexing:
Tata letak skematis alternatif (lebih rapi) (disarankan oleh Supercat):
Ini sedikit lebih rumit, tetapi menggunakan lebih sedikit pin untuk mendorong jumlah LED yang lebih tinggi. Sebagai contoh, kita dapat menggunakan hanya 5 pin untuk menggerakkan 20 LED seperti pada contoh di atas (dibandingkan dengan setidaknya 10 pin dengan multiplexing matriks "normal" (jangan bingung dengan menggunakan IC dalam hal ini jumlah pin yang dibutuhkan adalah log2 (nLED).
Untuk solusi eksternal, Anda dapat menggunakan hal-hal seperti Shift Register atau Multiplexer seperti 74HC595 dan 74HC151.
Sebuah register geser mengambil aliran input serial jam dari data dan output paralel (Serial In Parallel Out SIPO) atau sebaliknya (PISO)
Mereka umumnya memiliki 8 output (atau input) tetapi Anda dapat rantai sebanyak yang Anda inginkan bersama untuk memperpanjang sesuatu. Sisi buruknya adalah kecepatan yang dapat Anda perbarui dibagi dengan jumlah output per input (misalnya untuk satu register dari 8 output, jika Anda memiliki clock input 8MHz Anda dapat memperbarui pada 1MHz, untuk 16 output 500kHz, dll)
Teknik-teknik ini dapat bekerja secara terbalik untuk input juga.