Daftar Isi:

Tegangan Analog Super Cepat Dari Arduino: 10 Langkah (dengan Gambar)
Tegangan Analog Super Cepat Dari Arduino: 10 Langkah (dengan Gambar)

Video: Tegangan Analog Super Cepat Dari Arduino: 10 Langkah (dengan Gambar)

Video: Tegangan Analog Super Cepat Dari Arduino: 10 Langkah (dengan Gambar)
Video: Tonton Sampai Habis !!! Belajar Arduino Di Jamin Bisa 2024, Juli
Anonim
Image
Image

Instruksi ini menunjukkan cara menghasilkan perubahan tegangan analog super cepat dari Arduino dan pasangan resistor dan kapasitor sederhana. Salah satu aplikasi di mana ini berguna adalah dalam menghasilkan grafik pada osiloskop. Ada beberapa proyek lain yang telah melakukan ini. Johngineer menunjukkan pohon Natal sederhana menggunakan modulasi lebar pulsa (PWM). Yang lain telah memperbaiki proyek itu dengan menggunakan tangga resistor atau menggunakan chip konverter digital-ke-analog khusus.

Menggunakan PWM menyebabkan banyak kedipan, sementara menggunakan tangga resistor atau konverter digital-ke-analog membutuhkan lebih banyak pin output dan komponen yang mungkin tidak tersedia. Sirkuit yang saya gunakan adalah pasangan resistor dan kapasitor mati sederhana yang sama seperti yang digunakan dalam demo pohon Natal, tetapi beroperasi dengan kedipan yang jauh lebih sedikit.

Pertama, saya akan memandu Anda melalui proses membangun sirkuit. Kemudian saya akan mengajari Anda cara menambahkan gambar Anda sendiri. Akhirnya, saya akan memperkenalkan teori tentang apa yang membuatnya lebih cepat.

Jika Anda menyukai Instruksi ini, silakan pertimbangkan untuk memilihnya!:)

Langkah 1: Membangun Sirkuit

Membangun Sirkuit
Membangun Sirkuit

Untuk membangun sirkuit, Anda membutuhkan yang berikut:

a) Arduino berdasarkan Atmel 16MHz ATmega328P, seperti Arduino Uno atau Arduino Nano.

b) Dua resistor bernilai R paling sedikit 150Ω.

c) Dua buah kapasitor bernilai C sedemikian hingga C = 0,0015/R, contoh:

  • R = 150Ω dan C = 10µ
  • R = 1.5kΩ dan C = 1µ
  • R = 15kΩ dan C = 100nF
  • R = 150kΩ dan C = 10nF

Alasan untuk memilih nilai-nilai ini ada dua. Terutama, kami ingin menjaga arus pada pin Arduino di bawah nilai arus maksimum 40mA. Menggunakan nilai 150Ω membatasi arus hingga 30mA bila digunakan dengan tegangan suplai Arduino 5V. Nilai R yang lebih besar akan menurunkan arus dan oleh karena itu dapat diterima.

Batasan kedua adalah bahwa kita ingin menjaga waktu tetap konstan, yang merupakan produk dari R dan C, sama dengan sekitar 1,5 ms. Perangkat lunak telah secara khusus disetel untuk konstanta waktu ini. Meskipun dimungkinkan untuk menyesuaikan nilai R dan C dalam perangkat lunak, ada kisaran sempit di mana ia akan bekerja, jadi pilihlah komponen sedekat mungkin dengan rasio yang disarankan.

Penjelasan yang lebih menyeluruh tentang mengapa konstanta RC penting akan diberikan di bagian teori, setelah saya menunjukkan kepada Anda cara merakit rangkaian demonstrasi.

Langkah 2: Menyiapkan Osiloskop

Menyiapkan Osiloskop
Menyiapkan Osiloskop

Demonstrasi membutuhkan osiloskop yang disetel ke mode X/Y. Uji lead harus dihubungkan seperti yang ditunjukkan pada skema. Osiloskop Anda akan berbeda dari milik saya, tetapi saya akan membahas langkah-langkah yang diperlukan untuk mengatur mode X/Y pada unit saya:

a) Atur sapuan horizontal untuk dikontrol oleh Saluran B (sumbu X).

b) Atur osiloskop ke mode saluran ganda.

c) Atur volts/div pada kedua saluran sehingga dapat menampilkan tegangan dari 0V hingga 5V. Saya mengatur milik saya ke 0.5V/div.

d) Atur mode kopling ke DC pada kedua saluran.

e) Atur posisi X dan Y agar titik berada di pojok kiri bawah layar saat Arduino dimatikan.

Langkah 3: Unduh dan Jalankan Perangkat Lunak

Image
Image

Unduh perangkat lunak dari repositori Fast Vector Display For Arduino. Perangkat lunak ini dilisensikan di bawah GNU Affero Public License v3 dan dapat digunakan dan dimodifikasi secara bebas di bawah persyaratan lisensi itu.

Buka file "fast-vector-display-arduino.ino" di Arduino IDE dan unggah ke Arduino Anda. Untuk sesaat, Anda akan melihat animasi "Selamat Tahun Baru" di layar osiloskop Anda.

Saya mengembangkan proyek ini sebagai hackaton pribadi dalam minggu-minggu menjelang Natal, jadi ada pesan bertema Natal dan Tahun Baru yang dapat Anda lihat dengan memodifikasi variabel PATTERN dalam kode.

Langkah 4: Buat Gambar Kustom Anda Sendiri

Pahami Mengapa PWM Sangat Lambat
Pahami Mengapa PWM Sangat Lambat

Jika Anda ingin membuat gambar Anda sendiri, Anda dapat menempelkan koordinat titik ke sketsa Arduino pada garis yang mendefinisikan USER_PATTERN.

Saya menemukan bahwa Inkscape adalah alat yang cukup bagus untuk membuat gambar kustom:

  1. Buat teks menggunakan font tebal dan besar seperti Impact.
  2. Pilih objek teks dan pilih "Object to Path" dari menu "Path".
  3. Pilih masing-masing huruf dan tumpang tindih untuk membuat bentuk yang terhubung
  4. Pilih "Union" dari menu "Path" untuk menggabungkannya menjadi satu kurva.
  5. Jika ada lubang pada huruf apa pun, potong takik kecil dengan menggambar persegi panjang dengan alat persegi panjang dan kurangi dari kontur menggunakan alat "Perbedaan".
  6. Klik dua kali path untuk menampilkan node.
  7. Persegi panjang pilih semua simpul dan klik alat "Buat sudut simpul yang dipilih".
  8. Simpan file SVG.

Yang penting adalah bahwa gambar Anda harus memiliki satu jalur tertutup dan tidak ada lubang. Pastikan desain Anda memiliki kurang dari sekitar 130 poin.

Langkah 5: Tempel Koordinat Dari File SVG Ke Arduino IDE

  1. Buka file SVG dan salin koordinatnya. Ini akan disematkan di elemen "jalur". Pasangan koordinat pertama dapat diabaikan; ganti dengan 0, 0.
  2. Tempelkan koordinat ke sketsa Arduino di dalam tanda kurung tepat setelah "#define USER_PATTERN".
  3. Ganti semua spasi dengan koma, jika tidak, Anda akan mendapatkan kesalahan kompilasi. Alat "Ganti & Temukan" mungkin berguna.
  4. Kompilasi dan jalankan!
  5. Jika Anda memiliki masalah, perhatikan konsol serial untuk menemukan kesalahan. Secara khusus, Anda akan melihat pesan jika pola Anda memiliki terlalu banyak poin untuk buffer internal. Dalam kasus seperti itu, gambar akan menunjukkan kedipan yang berlebihan.

Langkah 6: Pahami Mengapa PWM Sangat Lambat

Untuk memulai, mari kita tinjau perilaku kapasitor saat sedang diisi.

Sebuah kapasitor yang dihubungkan ke sumber tegangan Vcc akan menaikkan tegangannya sesuai dengan kurva eksponensial. Kurva ini asimtotik, artinya akan melambat saat mendekati tegangan target. Untuk semua tujuan praktis, tegangan "cukup dekat" setelah 5 detik RC. RC disebut "konstanta waktu". Seperti yang kita lihat sebelumnya, itu adalah produk dari nilai resistor dan kapasitor di sirkuit Anda. Masalahnya 5 RC adalah waktu yang agak lama untuk memperbarui setiap titik dalam tampilan grafis. Hal ini menyebabkan banyak flicker!

Ketika kita menggunakan modulasi lebar pulsa (PWM) untuk mengisi kapasitor, kita tidak lebih baik. Dengan PWM tegangan beralih dengan cepat antara 0V dan 5V. Dalam praktiknya, ini berarti kita dengan cepat berganti-ganti antara mendorong muatan ke dalam kapasitor dan menariknya sedikit keluar lagi -- dorongan dan tarikan ini seperti mencoba lari maraton dengan mengambil langkah besar ke depan dan kemudian sedikit ke belakang. lagi dan lagi.

Ketika Anda rata-rata semuanya, perilaku pengisian kapasitor menggunakan PWM persis sama seperti jika Anda menggunakan tegangan tetap Vpwm untuk mengisi kapasitor. Masih membutuhkan waktu sekitar 5 detik RC bagi kita untuk mendapatkan "cukup dekat" dengan tegangan yang diinginkan.

Langkah 7: Dapatkan Dari a ke B, Sedikit Lebih Cepat

Dapatkan Dari a ke B, Sedikit Lebih Cepat
Dapatkan Dari a ke B, Sedikit Lebih Cepat

Misalkan kita memiliki kapasitor yang sudah diisi hingga Va. Misalkan kita menggunakan analogWrite() untuk menulis nilai baru b. Berapa waktu minimum yang Anda miliki untuk menunggu tegangan Vb tercapai?

Jika Anda menebak 5 detik RC, itu bagus! Dengan menunggu 5 detik RC, kapasitor akan terisi hampir Vb. Tetapi jika kita mau, kita sebenarnya bisa menunggu sedikit lebih sedikit.

Perhatikan kurva muatan. Anda lihat, kapasitor sudah berada di Va saat kita mulai. Artinya kita tidak perlu menunggu waktu t_a. Kita hanya perlu melakukannya jika kita mengisi kapasitor dari nol.

Jadi dengan tidak menunggu waktu itu, kami melihat peningkatan. Waktu t_ab sebenarnya sedikit lebih pendek dari 5 RC.

Tapi tunggu dulu, kita bisa melakukan jauh lebih baik! Lihat semua ruang di atas v_b. Itulah perbedaan antara Vcc, tegangan maksimum yang tersedia untuk kita, dan Vb yang ingin kita capai. Dapatkah Anda melihat bagaimana tegangan ekstra itu dapat membantu kita mencapai tujuan yang kita inginkan lebih cepat?

Langkah 8: Dari a ke B, Dengan Pengisi Daya Turbo

Dapatkan Dari a ke B, Dengan Pengisi Daya Turbo!
Dapatkan Dari a ke B, Dengan Pengisi Daya Turbo!

Betul sekali. Alih-alih menggunakan PWM pada tegangan target V_b, kami menahannya pada Vcc yang stabil untuk jangka waktu yang jauh lebih singkat. Saya menyebutnya metode Turbo Charger dan ini membawa kita ke tempat yang kita inginkan dengan sangat, sangat cepat! Setelah waktu tunda (yang harus kita hitung), kita menginjak rem dengan beralih ke PWM di V_b. Ini menjaga voltase agar tidak melampaui target.

Dengan metode ini, dimungkinkan untuk mengubah tegangan kapasitor dari V_a ke V_b dalam waktu yang lebih singkat daripada hanya menggunakan PWM. Ini adalah bagaimana Anda mendapatkan tempat, sayang!

Langkah 9: Pahami Kode

Pahami Kodenya
Pahami Kodenya

Sebuah gambar bernilai seribu kata, sehingga diagram menunjukkan data dan operasi yang dilakukan dalam kode. Dari kiri ke kanan:

  • Data grafik disimpan dalam PROGMEM (yaitu, memori flash) sebagai daftar poin.
  • Setiap kombinasi dari operasi translasi, penskalaan, dan rotasi digabungkan menjadi matriks transformasi affine. Ini dilakukan sekali pada awal setiap frame animasi.
  • Poin dibaca satu per satu dari data grafik dan masing-masing dikalikan dengan matriks transformasi yang disimpan.
  • Titik-titik yang diubah diumpankan melalui algoritma scissoring yang memotong titik mana pun di luar area yang terlihat.
  • Menggunakan tabel pencarian penundaan RC, titik-titik diubah menjadi tegangan penggerak dan penundaan waktu. Tabel pencarian penundaan RC disimpan di EEPROM dan dapat digunakan kembali untuk menjalankan beberapa kode. Saat memulai, tabel pencarian RC diperiksa keakuratannya dan nilai yang salah akan diperbarui. Penggunaan EEPROM menghemat memori RAM yang berharga.
  • Tegangan mengemudi dan penundaan ditulis ke bingkai tidak aktif di buffer bingkai. Buffer bingkai berisi ruang untuk bingkai aktif dan bingkai tidak aktif. Setelah bingkai lengkap ditulis, bingkai tidak aktif dibuat aktif.
  • Rutinitas layanan interupsi terus-menerus menggambar ulang gambar dengan membaca nilai tegangan dan penundaan dari buffer bingkai aktif. Berdasarkan nilai-nilai itu, ia menyesuaikan siklus tugas pin output. Timer 1 digunakan untuk mengukur waktu tunda hingga presisi beberapa nanodetik, sedangkan timer 2 digunakan untuk mengontrol siklus kerja pin.
  • Pin dengan perubahan tegangan terbesar selalu "diisi turbo" dengan siklus kerja nol atau 100%, memberikan waktu pengisian atau pengosongan tercepat. Pin dengan perubahan tegangan yang lebih rendah digerakkan dengan siklus kerja yang dipilih untuk mencocokkan waktu transisi dari pin pertama - pencocokan waktu ini penting untuk memastikan bahwa garis ditarik lurus pada osiloskop.

Langkah 10: Dengan Kecepatan Besar, Muncul Tanggung Jawab Besar

Karena metode ini jauh lebih cepat daripada PWM, mengapa analogWrite() tidak menggunakannya? Yah, karena menggunakan PWM saja sudah cukup baik untuk sebagian besar program dan jauh lebih memaafkan. Namun, metode "Pengisi Daya Turbo" memerlukan pengkodean yang cermat dan hanya cocok untuk kasus-kasus tertentu:

  1. Hal ini sangat sensitif terhadap waktu. Setelah kita mencapai level tegangan target, pin penggerak harus segera dialihkan ke mode PWM biasa untuk menghindari overshooting tegangan target.
  2. Ini membutuhkan pengetahuan tentang konstanta RC, jadi nilai-nilai ini harus dimasukkan terlebih dahulu. Dengan nilai yang salah, waktu akan salah dan voltase akan salah. Dengan PWM biasa, ada jaminan bahwa Anda akan menetapkan tegangan yang benar setelah beberapa waktu, bahkan jika konstanta RC tidak diketahui.
  3. Menghitung interval waktu yang tepat untuk pengisian kapasitor membutuhkan persamaan logaritmik yang terlalu lambat untuk komputasi real-time pada Arduino. Ini harus dihitung sebelumnya sebelum setiap bingkai animasi dan di-cache di memori di suatu tempat.
  4. Program yang berhubungan dengan metode ini harus menghadapi fakta bahwa penundaan sangat non-linear (mereka, pada kenyataannya, eksponensial). Tegangan target di dekat Vcc atau GND akan membutuhkan banyak urutan besarnya lebih lama untuk dicapai daripada tegangan di dekat titik tengah.

Untuk mengatasi keterbatasan ini, kode grafik vektor saya melakukan hal-hal berikut:

  1. Ini menggunakan Timer 1 pada 16kHz dan rutin layanan interupsi untuk manipulasi dan pengaturan waktu keluaran yang tepat.
  2. Ini membutuhkan nilai tertentu dari konstanta waktu RC untuk digunakan, membatasi pilihan nilai kapasitor dan resistor.
  3. Ini menyimpan waktu tunda untuk semua titik dalam bingkai animasi dalam buffer memori. Ini berarti rutin yang menghitung waktu tunda berjalan pada tingkat yang jauh lebih lambat daripada rutin layanan interupsi yang memperbarui pin output. Setiap bingkai yang diberikan mungkin dicat beberapa lusin kali sebelum satu set penundaan baru untuk bingkai berikutnya siap digunakan.
  4. Penggunaan buffer memori membatasi jumlah titik yang dapat digambar per frame. Saya menggunakan pengkodean yang efisien ruang untuk mendapatkan hasil maksimal dari RAM yang tersedia, tetapi masih terbatas pada sekitar 150 poin. Lebih dari seratus poin atau lebih, layar akan mulai berkedip, jadi ini adalah poin yang bisa diperdebatkan!

Direkomendasikan: