Daftar Isi:

Implementasi Sensor Gerakan APDS9960 NonBlocking: 5 Langkah
Implementasi Sensor Gerakan APDS9960 NonBlocking: 5 Langkah

Video: Implementasi Sensor Gerakan APDS9960 NonBlocking: 5 Langkah

Video: Implementasi Sensor Gerakan APDS9960 NonBlocking: 5 Langkah
Video: Fan Speed Control Using Gesture Sensor APDS9960 / Kendali Kipas Menggunakan Sensor Gerakan Tangan 2024, Juli
Anonim
Implementasi Sensor Gerakan APDS9960 NonBlocking
Implementasi Sensor Gerakan APDS9960 NonBlocking
Implementasi Sensor Gerakan APDS9960 NonBlocking
Implementasi Sensor Gerakan APDS9960 NonBlocking
Implementasi Sensor Gerakan APDS9960 NonBlocking
Implementasi Sensor Gerakan APDS9960 NonBlocking

Pembukaan

Instruksi ini merinci cara membuat implementasi Sensor Gerakan APDS9960 tanpa pemblokiran menggunakan SparkFun_APDS-9960_Sensor_Arduino_Library.

pengantar

Jadi Anda mungkin bertanya pada diri sendiri apa itu non-blocking? Atau bahkan memblokir dalam hal ini?

Lebih penting lagi mengapa penting untuk memiliki sesuatu yang non-blocking kan?

Oke, jadi ketika mikroprosesor menjalankan program, ia secara berurutan mengeksekusi baris kode dan dengan melakukan itu membuat panggilan ke dan kembali dari fungsi sesuai dengan urutan penulisannya.

Panggilan pemblokiran hanyalah panggilan ke fungsi apa pun yang menyebabkan penghentian eksekusi, yang berarti panggilan fungsi di mana pemanggil tidak akan melanjutkan eksekusi sampai fungsi yang dipanggil selesai dieksekusi.

Jadi mengapa ini penting?

Dalam kasus di mana Anda telah menulis beberapa kode yang perlu secara teratur menjalankan banyak fungsi secara berurutan seperti membaca suhu, membaca tombol dan memperbarui tampilan, jika kode untuk memperbarui tampilan menjadi panggilan pemblokiran, sistem Anda tidak akan merespons penekanan tombol dan perubahan suhu, karena prosesor akan menghabiskan seluruh waktunya menunggu tampilan diperbarui dan tidak membaca status tombol atau suhu terbaru.

Untuk bagian saya, saya ingin membuat perangkat desktop IoT berkemampuan MQTT melalui WiFi yang membaca nilai suhu/kelembaban lokal dan jarak jauh, tingkat cahaya sekitar, tekanan udara, melacak waktu, menampilkan semua parameter ini pada LCD, masuk ke uSD kartu secara real time, membaca input tombol, menulis ke LED output, dan memantau gerakan untuk mengontrol berbagai hal di infrastruktur IoT saya dan semuanya dikendalikan oleh ESP8266-12.

Sayangnya, satu-satunya dua sumber pustaka APDS9960 yang bisa saya temukan adalah pustaka SparkFun dan AdaFruit, keduanya diambil dari kode aplikasi dari Avago (produsen ADPS9960) dan memiliki panggilan bernama 'readGesture' yang berisi while(1){}; loop yang bila digunakan dalam proyek di atas menyebabkan ESP8266-12E menyetel ulang setiap kali sensor ADPS9960 menjadi jenuh (yaitu ketika sebuah objek tetap berada dalam jarak dekat, atau ada sumber IR lain yang menerangi sensor).

Akibatnya untuk mengatasi perilaku ini, saya memilih untuk memindahkan pemrosesan Gerakan ke prosesor kedua di mana ESP8266-12E menjadi mikrokontroler utama dan sistem ini sebagai budak, seperti yang digambarkan pada Gambar 1 & 2 di atas, Gambaran Umum Sistem dan diagram Komposisi Sistem masing-masing. Gambar 3 menunjukkan rangkaian prototipe.

Untuk membatasi perubahan yang perlu saya lakukan pada kode yang ada, saya juga menulis kelas pembungkus/pustaka yang secara imajinatif bernama 'APDS9960_NonBlocking'.

Berikut ini adalah penjelasan rinci tentang solusi non-blocking.

Bagian Apa yang Saya Butuhkan?

Jika Anda ingin membuat solusi I2C yang bekerja dengan pustaka APDS9960_NonBlocking, Anda memerlukan bagian berikut.

  1. Diskon 1 ATMega328P di sini
  2. 1 dari PCF8574P di sini
  3. 6 dari 10K Resistor di sini
  4. 4 off 1K Resistor di sini
  5. 1 off Dioda 1N914 di sini
  6. 1 dari PN2222 NPN Transistor di sini
  7. 1 dari kristal 16MHz di sini
  8. 2 off 0.1uF Kapasitor di sini
  9. 1 off 1000uF Kapasitor Elektrolit di sini
  10. 1 dari 10uF Kapasitor Elektrolit di sini
  11. 2 off 22pF Kapasitor di sini

Jika Anda ingin membaca output sensor gerakan melalui antarmuka paralel maka Anda dapat menjatuhkan PCF8574P dan tiga resistor 10K.

Perangkat lunak apa yang saya butuhkan?

Arduino IDE 1.6.9

Keterampilan apa yang saya butuhkan?

Untuk mengatur sistem, gunakan kode sumber (disediakan) dan buat sirkuit yang diperlukan yang Anda perlukan sebagai berikut;

  • Menguasai elektronik minimal,
  • Pengetahuan tentang Arduino dan IDE-nya,
  • Pemahaman tentang cara memprogram Arduino tertanam (Lihat Instruksi 'Memrogram ATTiny85, ATTiny84 dan ATMega328P: Arduino Sebagai ISP')
  • Beberapa Kesabaran.

Topik yang dibahas

  • Ikhtisar singkat dari sirkuit
  • Ikhtisar singkat dari perangkat lunak
  • Menguji Perangkat Penginderaan Isyarat APDS9960
  • Kesimpulan
  • Referensi

Langkah 1: Ikhtisar Sirkuit

Ikhtisar Sirkuit
Ikhtisar Sirkuit

Sirkuit ini dibagi menjadi dua bagian;

  • Yang pertama adalah konversi serial I2C ke paralel yang dilakukan melalui resistor R8…10 dan IC1. Di sini R8…R10 mengatur alamat I2C untuk chip expander I/O 8 bit IC1 dan NXP PCF8574A. Rentang alamat yang valid untuk perangkat ini masing-masing adalah 0x38 … 0x3F. Dalam contoh perangkat lunak I2C yang disediakan 'I2C_APDS9960_TEST.ino' '#define GESTURE_SENSOR_I2C_ADDRESS' perlu diubah agar sesuai dengan rentang alamat ini.
  • Semua komponen lain membentuk slave tertanam Arduino Uno dan memiliki fungsi sebagai berikut;

    • R1, T1, R2 dan D1 menyediakan input reset perangkat budak. Di sini pulsa tinggi aktif pada IC1 - P7 akan memaksa U1 untuk mengatur ulang.
    • R3, R4, adalah resistor pembatas arus untuk perangkat tertanam yang memprogram jalur TX/RX.
    • C5 dan R7 memungkinkan Arduino IDE untuk secara otomatis memprogram U1 melalui pulsa pada saluran DTR dari perangkat FTDI yang terpasang.
    • R5 dan R6 adalah resistor pull up I2C untuk APDS9960 dengan C6 menyediakan decoupling rel suplai lokal.
    • U1, C1, C2 dan Q1 membentuk Arduino Uno dan jamnya masing-masing.
    • Akhirnya C3 dan C4 menyediakan decoupling rel suplai lokal untuk U1.

Langkah 2: Ikhtisar Perangkat Lunak

Ikhtisar Perangkat Lunak
Ikhtisar Perangkat Lunak
Ikhtisar Perangkat Lunak
Ikhtisar Perangkat Lunak
Ikhtisar Perangkat Lunak
Ikhtisar Perangkat Lunak

Pembukaan

Agar berhasil mengkompilasi kode sumber ini, Anda memerlukan pustaka tambahan berikut untuk memprogram Arduino Uno U1 yang disematkan;

SparkFun_APDS9960.h

  • Oleh: Steve Quinn
  • Tujuan: Ini adalah versi bercabang dari Sensor SparkFun APDS9960 yang bercabang dari jonn26/SparkFun_APDS-9960_Sensor_Arduino_Library. Ini memiliki beberapa modifikasi untuk membantu debug dan memiliki detektor yang tidak peka untuk mengurangi pemicu palsu.
  • Dari:

APDS9960_NonBlocking.h

  • Oleh: Steve Quinn
  • Tujuan: Menyediakan antarmuka yang bersih untuk menyematkan implementasi non-blocking dari Sensor Gerakan APDS9960 ini ke dalam kode Arduino Anda.
  • Dari:

Lihat Instruksi berikut tentang cara memprogram mikrokontroler Arduino Uno (ATMega328P) tertanam jika Anda tidak terbiasa dengan cara mencapainya;

PEMROGRAMAN ATTINY85, ATTINY84 DAN ATMEGA328P: ARDUINO SEBAGAI ISP

Ikhtisar Fungsional

Mikrokontroler slave tertanam ATMega328P mengumpulkan garis INT dari ADPS9960. Ketika baris ini menjadi rendah, mikrokontroler membaca register ADPS9960 dan menentukan apakah ada isyarat yang valid yang dirasakan. Jika isyarat yang valid telah terdeteksi, kode untuk isyarat ini 0x0…0x6, 0xF ditempatkan pada Port B dan 'nGestureAvailable' dinyatakan rendah.

Ketika perangkat Master melihat 'nGestureAvailable' aktif, ia membaca nilai pada Port B kemudian meng-pulsekan 'nGestureClear' rendah sementara untuk mengakui penerimaan data.

Perangkat slave kemudian menonaktifkan 'nGestureAvailable' tinggi dan menghapus data pada Port B. Gambar 5 di atas menunjukkan tangkapan layar yang diambil dari penganalisis logika selama siklus deteksi/baca penuh.

Ikhtisar Kode

Gambar 1 di atas merinci bagaimana perangkat lunak di U1 fungsi Arduino Uno slave tertanam, bersama dengan Gambar 2 bagaimana dua tugas latar belakang / latar depan berinteraksi. Pic 3 adalah segmen kode yang menguraikan cara menggunakan perpustakaan APDS9960_NonBlocking. Gambar 4 memberikan pemetaan antara Pin Digital Arduino Uno dan pin perangkat keras aktual pada ATMega328P.

Setelah reset, mikrokontroler slave tertanam menginisialisasi APDS9960 yang memungkinkan deteksi gerakan untuk memicu output INT-nya dan mengkonfigurasi I/O-nya, melampirkan rutin layanan interupsi (ISR) 'GESTURE_CLEAR()' untuk menginterupsi vektor INT0 (pin Digital 2, Pin IC Perangkat Keras 4), mengonfigurasinya untuk pemicu tepi jatuh. Ini membentuk input nGestureClear dari perangkat master.

Pin output Interrupt 'INT' dari APDS9960 terhubung ke Digital Pin 4, Hardware IC Pin 6 yang dikonfigurasi sebagai input ke U1.

Garis sinyal 'nGestureAvailable' pada pin Digital 7, Pin IC Perangkat Keras 13 dikonfigurasi sebagai output dan disetel tinggi, tidak aktif (tidak ditegaskan).

Akhirnya Port B bit 0…3 masing-masing dikonfigurasi sebagai output dan disetel rendah. Ini membentuk gigitan data yang mewakili berbagai jenis gerakan yang terdeteksi; Tidak ada = 0x0, Error = 0xF, Atas = 0x1, Bawah = 0x2, Kiri = 0x3, Kanan = 0x4, Dekat = 0x5 dan Jauh = 0x6.

Tugas latar belakang 'Loop' dijadwalkan yang secara terus-menerus melakukan polling pada APDS9960 Menginterupsi output INT melalui pembacaan Digital Pin 4. Ketika output INT dari APDS9960 menjadi aktif rendah yang menunjukkan bahwa sensor telah dipicu, mikrokontroler mencoba menafsirkan gerakan apa pun dengan memanggil 'readGesture()' dengan while (1) {}; lingkaran tak berujung.

Jika isyarat yang valid telah terdeteksi, nilai ini ditulis ke Port B, keluaran 'nGestureAvailable' dinyatakan dan semaphore boolean 'bGestureAvailable' disetel, mencegah isyarat lebih lanjut agar tidak dicatat.

Setelah master mendeteksi output 'nGestureAvailable' yang aktif, ia membaca nilai baru ini dan memberi sinyal 'nGestureClear' aktif rendah. Tepi jatuh ini memicu tugas latar depan 'ISR GESTURE_CLEAR()' untuk dijadwalkan menangguhkan eksekusi tugas latar belakang 'Loop', membersihkan Port B, semaphore 'bGestureAvailable' dan output 'nGestureAvailable'.

Tugas latar depan 'GESTURE_CLEAR()' sekarang ditangguhkan dan tugas latar belakang 'Loop' dijadwalkan ulang. Gerakan lebih lanjut dari APDS9960 sekarang dapat dirasakan.

Dengan menggunakan tugas latar depan/latar belakang yang dipicu interupsi dengan cara ini, loop tak terbatas potensial di 'readGesture()' perangkat slave tidak akan memengaruhi pengoperasian perangkat master dan juga tidak akan menghalangi eksekusi perangkat slave. Ini membentuk dasar dari sistem operasi waktu nyata (RTOS) yang sangat sederhana.

Catatan: Awalan 'n' berarti aktif rendah atau dinyatakan seperti dalam 'nGestureAvailable'

Langkah 3: Menguji Perangkat Penginderaan Gestur APDS9960 NonBlocking

Menguji Perangkat Penginderaan Gestur APDS9960 Tanpa Pemblokiran
Menguji Perangkat Penginderaan Gestur APDS9960 Tanpa Pemblokiran
Menguji Perangkat Sensor Gesture APDS9960 NonBlocking
Menguji Perangkat Sensor Gesture APDS9960 NonBlocking
Menguji Perangkat Penginderaan Gestur APDS9960 Tanpa Pemblokiran
Menguji Perangkat Penginderaan Gestur APDS9960 Tanpa Pemblokiran
Menguji Perangkat Penginderaan Gestur APDS9960 Tanpa Pemblokiran
Menguji Perangkat Penginderaan Gestur APDS9960 Tanpa Pemblokiran

Pembukaan

Meskipun modul APDS9960 dilengkapi dengan +5v, modul ini menggunakan regulator +3v3 on-board yang berarti bahwa jalur I2C sesuai dengan +3v3 dan bukan +5v. Inilah mengapa saya memilih untuk menggunakan Arduino Due yang sesuai dengan +3v3 sebagai pengontrol mikro uji, untuk meniadakan kebutuhan akan pemindah level.

Namun, jika Anda ingin menggunakan Arduino Uno yang sebenarnya maka Anda perlu menggeser garis I2C ke U1. Lihat Instruksi berikut di mana saya telah melampirkan set slide yang berguna (I2C_LCD_With_Arduino) yang memberikan banyak tip praktis dalam menggunakan I2C.

Pengujian Antarmuka I2C

Gambar 1 dan 2 di atas menunjukkan cara mengatur dan memprogram sistem untuk antarmuka I2C. Anda harus mengunduh dan menginstal pustaka APDS9960_NonBlocking terlebih dahulu. di sini

Pengujian Antarmuka Paralel

Gambar 3 dan 4 detail sama untuk antarmuka Paralel

Langkah 4: Kesimpulan

Kesimpulan
Kesimpulan

Umum

Kode berfungsi dengan baik dan mendeteksi gerakan secara responsif tanpa kesalahan positif. Sudah berdiri dan berjalan selama beberapa minggu sekarang sebagai perangkat budak di proyek saya berikutnya. Saya telah mencoba banyak mode kegagalan yang berbeda (dan juga moggie rumah tangga Quinn yang ingin tahu) yang sebelumnya menghasilkan reset ESP8266-12, tanpa efek negatif.

Kemungkinan peningkatan

  • Yang jelas. Tulis ulang pustaka Sensor Gerakan APDS9960 agar tidak memblokir.

    Sebenarnya saya menghubungi Broadcom yang menempatkan saya ke distributor lokal yang segera mengabaikan permintaan saya untuk dukungan, saya hanya bukan SparkFun atau AdaFruit, saya kira. Jadi ini mungkin harus menunggu beberapa saat

  • Port kode ke mikrokontroler budak yang lebih kecil. Menggunakan ATMega328P untuk satu tugas sedikit berlebihan. Meskipun awalnya saya melihat ATTiny84, berhenti menggunakannya karena saya merasa ukuran kode yang dikompilasi sesuai dengan garis batas. Dengan tambahan overhead karena harus memodifikasi perpustakaan APDS9960 untuk bekerja dengan perpustakaan I2C yang berbeda.

Langkah 5: Referensi

Diperlukan untuk memprogram arduino tertanam (ATMega328P - U1)

SparkFun_APDS9960.h

  • Oleh: Steve Quinn
  • Tujuan: Ini adalah versi bercabang dari Sensor SparkFun APDS9960 yang bercabang dari jonn26/SparkFun_APDS-9960_Sensor_Arduino_Library. Ini memiliki beberapa modifikasi untuk membantu debug dan memiliki detektor yang tidak peka untuk mengurangi pemicu palsu.
  • Dari:

Diperlukan untuk menyematkan fungsi non-pemblokiran ini ke dalam kode arduino Anda dan memberikan contoh yang berhasil

APDS9960_NonBlocking.h

  • Oleh: Steve Quinn
  • Tujuan: Menyediakan antarmuka yang bersih untuk menyematkan implementasi non-blocking dari Sensor Gerakan APDS9960 ini ke dalam kode Arduino Anda.
  • Dari:

Sistem Operasi Waktu Nyata

https://en.wikipedia.org/wiki/Real-time_operating_system

Lembar Data APDS9960

https://cdn.sparkfun.com/assets/learn_tutorials/3/2/1/Avago-APDS-9960-datasheet.pdf

Direkomendasikan: