Isi kandungan:

Pelaksanaan Sensor Gerak Isyarat APB9960 Tanpa Sekatan: 5 Langkah
Pelaksanaan Sensor Gerak Isyarat APB9960 Tanpa Sekatan: 5 Langkah

Video: Pelaksanaan Sensor Gerak Isyarat APB9960 Tanpa Sekatan: 5 Langkah

Video: Pelaksanaan Sensor Gerak Isyarat APB9960 Tanpa Sekatan: 5 Langkah
Video: Как использовать датчик приближения в MIT App Inventor 2024, Julai
Anonim
Pelaksanaan Sensor Isyarat APB9960 Tanpa Sekatan
Pelaksanaan Sensor Isyarat APB9960 Tanpa Sekatan
Pelaksanaan Sensor Isyarat APB9960 Tanpa Sekatan
Pelaksanaan Sensor Isyarat APB9960 Tanpa Sekatan
Pelaksanaan Sensor Isyarat APB9960 Tanpa Sekatan
Pelaksanaan Sensor Isyarat APB9960 Tanpa Sekatan

Mukadimah

Instruksional ini memperincikan cara membuat pelaksanaan tanpa sekatan dari Sensor Gerakan APDS9960 menggunakan SparkFun_APDS-9960_Sensor_Arduino_Library.

Pengenalan

Oleh itu, anda mungkin bertanya pada diri sendiri apa yang tidak menyekat? Atau menyekat untuk perkara itu?

Lebih penting lagi mengapa penting untuk tidak menyekat sesuatu yang betul?

Baiklah, jadi apabila mikroprosesor menjalankan program, ia secara berurutan melaksanakan baris kod dan dengan demikian membuat panggilan ke dan kembali dari fungsi mengikut urutan di mana anda menulisnya.

Panggilan sekatan hanyalah panggilan ke segala jenis fungsi yang menyebabkan penghentian pelaksanaan, yang bermaksud panggilan fungsi di mana pemanggil tidak akan meneruskan pelaksanaan sehingga fungsi yang disebut selesai dijalankan.

Jadi mengapa ini penting?

Sekiranya anda telah menulis beberapa kod yang perlu melakukan banyak fungsi secara berkala seperti membaca suhu, membaca butang dan mengemas kini paparan, sekiranya kod untuk mengemas kini paparan menjadi panggilan yang menyekat, sistem anda tidak akan bertindak balas terhadap menekan butang dan perubahan suhu, kerana pemproses akan menghabiskan semua waktunya menunggu paparan diperbaharui dan tidak membaca status butang atau suhu terkini.

Saya ingin membuat MQTT melalui peranti desktop IoT berkemampuan WiFi yang membaca kedua-dua nilai suhu / kelembapan tempatan dan jarak jauh, tahap cahaya ambien, tekanan barometrik, menjejaki masa, memaparkan semua parameter ini pada LCD, log ke uSD kad dalam masa nyata, membaca input butang, menulis ke LED output dan memantau gerak isyarat untuk mengawal perkara dalam infrastruktur IoT saya dan semuanya dikendalikan oleh ESP8266-12.

Malangnya satu-satunya sumber perpustakaan APDS9960 yang saya dapati ialah perpustakaan SparkFun dan AdaFruit, yang keduanya merobek kod aplikasi dari Avago (pengeluar ADPS9960) dan mempunyai panggilan bernama 'readGesture' yang mengandungi beberapa saat (1) {}; gelung yang apabila digunakan dalam projek di atas menyebabkan ESP8266-12E diset semula setiap kali sensor ADPS9960 menjadi tepu (iaitu ketika objek tetap dekat, atau ada sumber IR lain yang menerangi sensor).

Akibatnya untuk menyelesaikan tingkah laku ini, saya memilih untuk memindahkan pemprosesan Gerakan ke pemproses kedua di mana ESP8266-12E menjadi mikrokontroler utama dan sistem ini menjadi hamba, seperti yang digambarkan dalam Gambar 1 & 2 di atas, gambarajah Gambaran Keseluruhan Sistem dan Komposisi Sistem masing-masing.. Pic 3 menunjukkan litar prototaip.

Untuk mengehadkan perubahan yang perlu saya buat pada kod saya yang ada, saya juga menulis kelas / perpustakaan pembungkus yang secara imajinatif bernama 'APDS9960_NonBlocking'.

Yang berikut adalah penjelasan terperinci mengenai penyelesaian tanpa penyekat.

Bahagian apa yang saya perlukan?

Sekiranya anda ingin membina penyelesaian I2C yang berfungsi dengan perpustakaan APDS9960_NonBlocking, anda memerlukan bahagian berikut.

  1. 1 diskaun ATMega328P di sini
  2. 1 diskaun PCF8574P di sini
  3. 6 dari 10K Resistor di sini
  4. 4 diskaun 1K Perintang di sini
  5. 1 diskaun 1N914 Diod di sini
  6. Diskaun 1 PN2222 NPN Transistor di sini
  7. 1 dari 16MHz kristal di sini
  8. 2 dari 0.1uF Kapasitor di sini
  9. 1 dari 1000uF Kapasitor Elektrolitik di sini
  10. 1 diskaun Kapasitor Elektrolitik 10uF di sini
  11. 2 dari 22pF Kapasitor di sini

Sekiranya anda ingin membaca output sensor isyarat melalui antara muka selari maka anda boleh menjatuhkan PCF8574P dan tiga perintang 10K.

Perisian apa yang saya perlukan?

Arduino IDE 1.6.9

Apakah kemahiran yang saya perlukan?

Untuk menyiapkan sistem, gunakan kod sumber (disediakan) dan buat litar yang diperlukan anda memerlukan yang berikut;

  • Pengetahuan elektronik yang minimum,
  • Pengetahuan mengenai Arduino dan IDE,
  • Pemahaman tentang cara memprogram Arduino tertanam (Lihat Instructable 'Programming the ATTiny85, ATTiny84 dan ATMega328P: Arduino As ISP')
  • Beberapa Kesabaran.

Topik yang dibincangkan

  • Gambaran keseluruhan litar ringkas
  • Gambaran keseluruhan perisian secara ringkas
  • Menguji Peranti Sensor Gerakan APDS9960
  • Kesimpulannya
  • Rujukan

Langkah 1: Gambaran Keseluruhan Litar

Gambaran Keseluruhan Litar
Gambaran Keseluruhan Litar

Litar terbahagi kepada dua bahagian;

  • Yang pertama adalah siri I2C ke penukaran selari yang dicapai melalui perintang R8… 10 dan IC1. Di sini R8… R10 menetapkan alamat I2C untuk 8 bit I / O expander chip IC1 dan NXP PCF8574A. Julat alamat yang sah untuk peranti ini masing-masing adalah 0x38… 0x3F. Dalam contoh perisian I2C yang disediakan 'I2C_APDS9960_TEST.ino' '#define GESTURE_SENSOR_I2C_ADDRESS' perlu diubah agar sesuai dengan julat alamat ini.
  • Semua komponen lain membentuk Arduino Uno yang disertakan dengan hamba dan mempunyai fungsi berikut;

    • R1, T1, R2 dan D1 memberikan input reset peranti hamba. Di sini nadi tinggi aktif pada IC1 - P7 akan memaksa U1 untuk menetapkan semula.
    • R3, R4, adalah perintang penghad semasa untuk garis pengaturcaraan peranti TX / RX yang terbenam.
    • C5 dan R7 memungkinkan Arduino IDE memprogram U1 secara automatik melalui denyutan pada garis DTR peranti FTDI yang dilampirkan.
    • R5 dan R6 adalah resistor penarik I2C untuk APDS9960 dengan C6 yang menyediakan penyambungan rel bekalan tempatan.
    • U1, C1, C2 dan Q1 membentuk Arduino Uno yang tertanam dan jam masing-masing.
    • Akhirnya C3 dan C4 menyediakan penyambungan rel bekalan tempatan untuk U1.

Langkah 2: Gambaran Keseluruhan Perisian

Gambaran Keseluruhan Perisian
Gambaran Keseluruhan Perisian
Gambaran Keseluruhan Perisian
Gambaran Keseluruhan Perisian
Gambaran Keseluruhan Perisian
Gambaran Keseluruhan Perisian

Mukadimah

Untuk berjaya menyusun kod sumber ini, anda memerlukan perpustakaan tambahan berikut untuk memprogram Arduino Uno U1 yang tersemat;

SparkFun_APDS9960.h

  • Oleh: Steve Quinn
  • Tujuan: Ini adalah versi bercabang dari SparkFun APDS9960 Sensor yang bercabang dari jonn26 / SparkFun_APDS-9960_Sensor_Arduino_Library. Ia mempunyai beberapa modifikasi untuk membantu melakukan debug dan mempunyai pengesan yang tidak peka untuk mengurangkan pencetus palsu.
  • Dari:

APDS9960_NonBlocking.h

  • Oleh: Steve Quinn
  • Tujuan: Menyediakan antara muka yang bersih untuk memasukkan pelaksanaan Sensor Gerakan APDS9960 tanpa halangan ini ke dalam kod Arduino anda.
  • Dari:

Lihat Petunjuk berikut mengenai cara memprogram mikrokontroler Arduino Uno (ATMega328P) tertanam jika anda tidak mengetahui cara mencapainya;

MENGHASILKAN ATTINY85, ATTINY84 DAN ATMEGA328P: ARDUINO SEBAGAI ISP

Gambaran Keseluruhan Berfungsi

Mikrokontroler hamba tertanam ATMega328P meninjau baris INT dari ADPS9960. Apabila garis ini menjadi rendah, mikrokontroler membaca daftar ADPS9960 dan menentukan sama ada terdapat isyarat yang sah. Sekiranya isyarat yang sah telah dikesan, kod untuk isyarat ini 0x0… 0x6, 0xF diletakkan di Port B dan 'nGestureAvailable' dinyatakan rendah.

Apabila peranti Master melihat 'nGestureAvailable' aktif, ia membaca nilai di Port B kemudian pulsa 'nGestureClear' rendah untuk sementara waktu untuk mengakui penerimaan data.

Peranti hamba kemudian menyahtegaskan 'nGestureAvailable' tinggi dan membersihkan data di Port B. Pic 5 di atas menunjukkan tangkapan skrin yang diambil dari penganalisis logik semasa kitaran mengesan / membaca sepenuhnya.

Gambaran Keseluruhan Kod

Pic 1 di atas memperincikan bagaimana perisian dalam U1 hamba tertanam Arduino Uno berfungsi, bersama dengan Pic 2 bagaimana kedua-dua tugas latar / latar depan berinteraksi. Pic 3 adalah segmen kod yang menguraikan cara menggunakan APDS9960_NonBlockinglibrary. Pic 4 memberikan pemetaan antara Arduino Uno Digital Pin dan pin perkakasan sebenar di ATMega328P.

Setelah menetapkan semula mikrokontroler hamba tertanam memulakan APDS9960 yang membolehkan pengesanan isyarat untuk mencetuskan output INT dan mengkonfigurasikan I / O, melampirkan rutin perkhidmatan gangguan (ISR) 'GESTURE_CLEAR ()' untuk mengganggu vektor INT0 (Pin digital 2, Hardware IC pin 4), mengkonfigurasinya untuk pencetus tepi jatuh. Ini membentuk input nGestureClear dari peranti induk.

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

Garis isyarat 'nGestureAvailable' pada pin Digital 7, Hardware IC pin 13 dikonfigurasikan sebagai output dan ditetapkan tinggi, tidak aktif (dinyahtegaskan).

Akhirnya Port B bit 0… 3 masing-masing dikonfigurasikan sebagai output dan ditetapkan rendah. Ini membentuk getaran data yang mewakili pelbagai jenis isyarat yang dikesan; Tiada = 0x0, Ralat = 0xF, Naik = 0x1, Bawah = 0x2, Kiri = 0x3, Kanan = 0x4, Dekat = 0x5 dan Jauh = 0x6.

Tugas latar belakang 'Loop' dijadualkan yang secara berkala meninjau output Interput APDS9960 INT melalui membaca Pin Digital 4. Apabila output INT dari APDS9960 menjadi aktif rendah menunjukkan sensor telah dicetuskan mikrokontroler cuba menafsirkan sebarang gerak isyarat dengan memanggil 'readGesture () 'sementara itu (1) {}; gelung tanpa henti.

Sekiranya isyarat yang sah telah dikesan, nilai ini ditulis ke Port B, output 'nGestureAvailable' ditegaskan dan semaphore boolean 'bGestureAvailable' ditetapkan, mencegah isyarat selanjutnya dari log.

Setelah master mengesan output 'nGestureAvailable' yang aktif, ia akan membaca nilai baru ini dan nadi 'nGestureClear' aktif rendah. Tepi jatuh ini memicu tugas latar depan 'ISR GESTURE_CLEAR ()' dijadualkan menangguhkan pelaksanaan tugas latar belakang 'Loop', membersihkan Port B, 'bGestureAvailable' semaphore dan output 'nGestureAvailable'.

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

Dengan menggunakan tugas latar depan / latar belakang yang dicetuskan interupsi dengan cara ini, gelung tak terbatas yang berpotensi dalam 'readGesture ()' peranti hamba tidak akan mempengaruhi peranti induk daripada beroperasi dan tidak akan menghalang pelaksanaan peranti hamba. Ini membentuk asas sistem operasi masa nyata (RTOS) yang sangat sederhana.

Catatan: Awalan 'n' bermaksud rendah aktif atau ditegaskan seperti dalam 'nGestureAvailable'

Langkah 3: Menguji Peranti Sensasi Gerak Isyarat APB9960 Tanpa Sekatan

Menguji Peranti Sensasi Gerakan Non-Sekatan APDS9960
Menguji Peranti Sensasi Gerakan Non-Sekatan APDS9960
Menguji Peranti Pengesan Gerak Isyarat APB9960 Tanpa Sekatan
Menguji Peranti Pengesan Gerak Isyarat APB9960 Tanpa Sekatan
Menguji Peranti Pengesan Gerak Isyarat APB9960 Tanpa Sekatan
Menguji Peranti Pengesan Gerak Isyarat APB9960 Tanpa Sekatan
Menguji Peranti Pengesan Gerak Isyarat APB9960 Tanpa Sekatan
Menguji Peranti Pengesan Gerak Isyarat APB9960 Tanpa Sekatan

Mukadimah

Walaupun modul APDS9960 dibekalkan dengan + 5v ia menggunakan pengatur on-board + 3v3 yang bermaksud garis I2C sesuai +3v3 dan tidak + 5v. Inilah sebabnya mengapa saya memilih untuk menggunakan Arduino Due yang mematuhi +3v3 sebagai pengawal mikro ujian, untuk mengatasi keperluan peralihan tahap.

Sekiranya anda ingin menggunakan Arduino Uno yang sebenarnya, anda perlu mengubah baris I2C ke U1. Lihat Petunjuk berikut di mana saya telah melampirkan set slaid berguna (I2C_LCD_With_Arduino) yang memberikan banyak petua praktikal untuk menggunakan I2C.

Ujian Antaramuka I2C

Gambar 1 dan 2 di atas menunjukkan cara mengatur dan memprogram sistem untuk antara muka I2C. Anda perlu memuat turun dan memasang perpustakaan APDS9960_NonBlocking terlebih dahulu. di sini

Ujian Antaramuka Selari

Gambar 3 dan 4 memperincikan perkara yang sama untuk antara muka Parallel

Langkah 4: Kesimpulannya

Kesimpulannya
Kesimpulannya

Am

Kod ini berfungsi dengan baik dan mengesan gerak isyarat secara responsif tanpa positif palsu. Telah berjalan dan berjalan selama beberapa minggu sekarang sebagai peranti hamba dalam projek saya yang seterusnya. Saya telah mencuba banyak cara kegagalan yang berbeza (dan begitu juga moggie Quinn isi rumah yang ingin tahu) yang sebelumnya menghasilkan tetapan semula ESP8266-12, tanpa kesan negatif.

Kemungkinan peningkatan

  • Yang jelas. Tulis semula pustaka Sensor Gerakan APDS9960 agar tidak menyekat.

    Sebenarnya saya memang menghubungi Broadcom yang mengarahkan saya kepada pengedar tempatan yang langsung mengabaikan permintaan sokongan saya, saya cuma bukan SparkFun atau AdaFruit, saya rasa. Jadi ini mungkin perlu menunggu sebentar

  • Port kod ke mikrokontroler hamba yang lebih kecil. Menggunakan ATMega328P untuk satu tugas adalah sedikit berlebihan. Walaupun pada awalnya saya melihat ATTiny84, berhenti menggunakannya kerana saya merasakan ukuran kod yang disusun itu sesuai dengan garis sempadan. Dengan overhead tambahan yang perlu diubah suai perpustakaan APDS9960 untuk bekerja dengan perpustakaan I2C yang berbeza.

Langkah 5: Rujukan

Diperlukan untuk memprogram arduino terbenam (ATMega328P - U1)

SparkFun_APDS9960.h

  • Oleh: Steve Quinn
  • Tujuan: Ini adalah versi bercabang dari SparkFun APDS9960 Sensor yang bercabang dari jonn26 / SparkFun_APDS-9960_Sensor_Arduino_Library. Ia mempunyai beberapa modifikasi untuk membantu melakukan debug dan mempunyai pengesan yang tidak peka untuk mengurangkan pencetus palsu.
  • Dari:

Diperlukan untuk memasukkan fungsi tanpa sekatan ini ke dalam kod arduino anda dan memberikan contoh yang sesuai

APDS9960_NonBlocking.h

  • Oleh: Steve Quinn
  • Tujuan: Menyediakan antara muka yang bersih untuk memasukkan implementasi Sensor Gerakan APDS9960 tanpa halangan ini ke dalam kod Arduino anda.
  • Dari:

Sistem Operasi Masa Nyata

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

Lembaran Data APDS9960

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

Disyorkan: