Mundarija:

Bloklanmagan APDS9960 ishorali sensori: 5 qadam
Bloklanmagan APDS9960 ishorali sensori: 5 qadam

Video: Bloklanmagan APDS9960 ishorali sensori: 5 qadam

Video: Bloklanmagan APDS9960 ishorali sensori: 5 qadam
Video: Bloklangan Telegram nomerni Blokdan ochish 2024, Iyul
Anonim
Bloklanmagan APDS9960 ishorali sensori
Bloklanmagan APDS9960 ishorali sensori
Bloklanmagan APDS9960 ishorali sensori
Bloklanmagan APDS9960 ishorali sensori
Bloklanmagan APDS9960 ishorali sensori
Bloklanmagan APDS9960 ishorali sensori

Muqaddima

Bu yo'riqnomada SparkFun_APDS-9960_Sensor_Arduino_Library yordamida APDS9960 imo-ishorali sensorni blokirovka qilmaydigan dasturini qanday yaratish haqida batafsil ma'lumot berilgan.

Kirish

Demak, siz o'zingizga blokirovka qilmaydigan nima deb so'rayapsiz? Yoki bu uchun blokirovka qilyapsizmi?

Eng muhimi, nima uchun blokirovka qilmaslik kerak?

OK, shuning uchun mikroprotsessor dasturni ishga tushirganda, u ketma -ket kod satrlarini bajaradi va bunda siz yozgan tartib bo'yicha funktsiyalarga qo'ng'iroqlar qiladi va qaytadi.

Blokirovka qilish - bu bajarilishning to'xtatilishiga olib keladigan har qanday funktsiyaga qo'ng'iroq, ya'ni qo'ng'iroq qiluvchining chaqirilgan funksiya bajarilmaguncha bajarilishi davom etmaydi.

Xo'sh, nima uchun bu muhim?

Agar siz haroratni o'qish, tugmani o'qish va displeyni yangilash kabi ko'p funktsiyalarni muntazam ravishda bajarishi kerak bo'lgan kod yozgan bo'lsangiz, displeyni yangilash kodi qo'ng'iroqni blokirovka qilsa, sizning tizimingiz javob bermaydi. tugma bosilganda va harorat o'zgaradi, chunki protsessor butun vaqtini displey yangilanishini kutadi va tugma holati yoki oxirgi haroratni o'qimaydi.

O'z navbatida, MQTTni WiFi orqali ishlaydigan IoT ish stoli qurilmasini yaratmoqchiman, u mahalliy va masofadan turib harorat/namlik ko'rsatkichlarini, atrofdagi yorug'lik darajasini, barometrik bosimni o'qiydi, vaqtni kuzatib boradi, bu parametrlarning barchasini LCD displeyda ko'rsatadi, uSD -ga kirishni xohlaydi. real vaqt rejimida karta, tugma kirishini o'qish, chiqish LED-lariga yozish va IoT infratuzilmasidagi narsalarni boshqarish uchun imo-ishoralarni kuzatish va ularning hammasini ESP8266-12 boshqarishi.

Afsuski, men topa oladigan APDS9960 kutubxonasining ikkita manbasi - bu SparkFun va AdaFruit kutubxonalari edi, ularning ikkalasi ham Avago (ADPS9960 ishlab chiqaruvchisi) dastur kodidan olingan va "readGesture" nomli qo'ng'iroqni o'z ichiga oladi (1) {}; Yuqoridagi loyihada ishlatilganda, ADPS9960 sensori to'yinganida (ya'ni, ob'ekt yaqin joyda qolganda yoki sensorni yorituvchi boshqa IQ manbai bo'lganida) ESP8266-12E qayta o'rnatiladi.

Shunday qilib, bu xatti-harakatni hal qilish uchun men imo-ishoralarni qayta ishlashni ikkinchi protsessorga o'tkazishni tanladim, bunda ESP8266-12E asosiy mikrokontrollerga aylandi va bu tizim, yuqoridagi 1 va 2-rasmlarda tasvirlanganidek, tizimga umumiy nuqtai nazar va tizim tuzilishi diagrammalariga mos keladi.. 3 -rasmda prototip sxemasi ko'rsatilgan.

Mavjud kodimga o'zgartirishlar kiritishni cheklash uchun men "APDS9960_NonBlocking" deb nomlangan o'rash sinfini/kutubxonasini ham yozdim.

Quyida blokirovka qilinmaydigan yechim haqida batafsil tushuntirish berilgan.

Menga qanday qismlar kerak?

Agar siz APDS9960_NonBlocking kutubxonasi bilan ishlaydigan I2C yechimini qurmoqchi bo'lsangiz, sizga quyidagi qismlar kerak bo'ladi.

  1. Bu erda ATMega328P 1 ta chegirmali
  2. Bu erda PCF8574P uchun 1 chegirma
  3. Bu erda 6 ta 10K rezistorlar
  4. Bu erda 4 ta 1K rezistorlar
  5. Bu erda 1N914 diodasi o'chirilgan
  6. Bu erda PN2222 NPN tranzistoridan 1 ta chegirma
  7. Bu erda 16 MGts chastotali 1 ta kristal
  8. Bu erda 0,1uF kondansatkichlari 2 ta
  9. Bu erda 1 ta 1000uF elektrolitik kondansatkich
  10. Bu erda 1 off 10uF elektrolitik kondansatkich
  11. Bu erda 2 ta 22pF kondansatkichlari

Agar siz ishora sensori chiqishini parallel interfeys orqali o'qishni xohlasangiz, PCF8574P va uchta o'chirilgan 10K rezistorni tashlab qo'yishingiz mumkin.

Menga qanday dastur kerak?

Arduino IDE 1.6.9

Menga qanday ko'nikmalar kerak?

Tizimni sozlash uchun manba kodidan foydalaning (taqdim etilgan) va kerakli sxemani yaratish uchun sizga quyidagilar kerak bo'ladi;

  • Elektronikani minimal tushunish,
  • Arduino va uning IDE haqidagi bilimlari,
  • O'rnatilgan Arduino -ni qanday dasturlash haqida tushuncha (Qarang: ATTiny85, ATTiny84 va ATMega328P dasturlash: Arduino ISP sifatida).
  • Bir oz Sabr.

Mavzular qamrab olingan

  • O'chirish davri haqida qisqacha ma'lumot
  • Dasturiy ta'minot haqida qisqacha ma'lumot
  • APDS9960 ishorali sezish moslamasini sinovdan o'tkazish
  • Xulosa
  • Manbalar

1 -qadam: O'chirish sxemasi

O'chirish haqida umumiy ma'lumot
O'chirish haqida umumiy ma'lumot

O'chirish ikki qismga bo'linadi;

  • Birinchisi, R8… 10 va IC1 rezistorlari orqali amalga oshiriladigan parallel konvertatsiyaga ketma -ket I2C. Bu erda R8… R10 8 bitli IC1 va NXP PCF8574A kirish -chiqish kengaytirgichi uchun I2C manzilini o'rnatdi. Bu qurilma uchun tegishli manzil diapazoni mos ravishda 0x38… 0x3F. "I2C_APDS9960_TEST.ino" taqdim etilgan I2C dasturiy ta'minot misolida #define GESTURE_SENSOR_I2C_ADDRESS 'manzilini shu diapazonga mos ravishda o'zgartirish kerak bo'ladi.
  • Boshqa barcha komponentlar Arduino Uno o'rnatilgan qulni tashkil qiladi va quyidagi funktsiyalarni bajaradi;

    • R1, T1, R2 va D1 qul qurilmani tiklash sozlamalarini beradi. Bu erda IC1 - P7 faol yuqori impuls U1ni qayta o'rnatishga majbur qiladi.
    • R3, R4 - TX/RX liniyalarini dasturlash uchun o'rnatilgan qurilmalar uchun joriy cheklovli rezistorlar.
    • C5 va R7 Arduino IDE -ga ulangan FTDI qurilmasining DTR chizig'idagi puls orqali avtomatik ravishda U1 ni dasturlash imkonini beradi.
    • R5 va R6 - APDS9960 uchun C6 bilan I2C tortishish rezistorlari bo'lib, ular mahalliy etkazib beriladigan temir yo'lni ajratishni ta'minlaydi.
    • U1, C1, C2 va Q1 mos ravishda Arduino Uno -ni tashkil qiladi va uning soati mos ravishda.
    • Nihoyat, C3 va C4 U1 uchun mahalliy etkazib beriladigan temir yo'lni ajratishni ta'minlaydi.

2 -qadam: dasturiy ta'minotga umumiy nuqtai

Dasturiy ta'minot haqida umumiy ma'lumot
Dasturiy ta'minot haqida umumiy ma'lumot
Dasturiy ta'minot haqida umumiy ma'lumot
Dasturiy ta'minot haqida umumiy ma'lumot
Dasturiy ta'minot haqida umumiy ma'lumot
Dasturiy ta'minot haqida umumiy ma'lumot

Muqaddima

Ushbu manba kodini muvaffaqiyatli kompilyatsiya qilish uchun sizga Arduino Uno U1 o'rnatilgan dasturlash uchun quyidagi qo'shimcha kutubxonalar kerak bo'ladi;

SparkFun_APDS9960.h

  • Muallif: Stiv Quinn
  • Maqsad: Bu jonn26/SparkFun_APDS-9960_Sensor_Arduino_Library-dan ajratilgan SparkFun APDS9960 Sensorining vilkalar versiyasi. Nosozliklarni tuzatishga yordam beradigan bir nechta o'zgartirishlar mavjud va soxta ishga tushirishni kamaytirish uchun sezgir bo'lmagan detektor mavjud.
  • Manba:

APDS9960_NonBlocking.h

  • Muallif: Stiv Quinn
  • Maqsad: APDS9960 Gesture Sensor-ning blokirovka qilinmagan ilovasini Arduino kodingizga kiritish uchun toza interfeysni taqdim etadi.
  • Manba:

Agar siz bunga qanday erishishni bilmasangiz, o'rnatilgan Arduino Uno (ATMega328P) mikrokontrollerini dasturlash bo'yicha quyidagi ko'rsatmaga qarang;

ATTINY85, ATTINY84 va ATMEGA328P: ARDUINO ISP sifatida

Funktsional nuqtai nazar

ATMega328P o'rnatilgan qul mikrokontroli ADPS9960 dan INT liniyasini so'roq qiladi. Bu chiziq pastga tushganda, mikrokontroller ADPS9960 registrlarini o'qiydi va to'g'ri ishoraning sezilganligini aniqlaydi. Agar yaroqli imo -ishora aniqlangan bo'lsa, bu ishoraning kodi 0x0… 0x6, 0xF B portiga qo'yiladi va "nGestureAvailable" past bo'ladi.

Asosiy qurilma "nGestureAvailable" faolligini ko'rganda, u B portidagi qiymatni o'qiydi, so'ngra ma'lumotlarning qabul qilinganligini tasdiqlash uchun "nGestureClear" past vaqtga past bosadi.

Keyin qul qurilmasi "nGestureAvailable" balandligini tasdiqlaydi va B portidagi ma'lumotlarni o'chiradi. Yuqoridagi 5-rasmda mantiq analizatoridan to'liq aniqlash/o'qish tsikli davomida olingan ekran tasviri ko'rsatilgan.

Kodni ko'rib chiqish

Yuqoridagi 1 -rasmda U1 dagi o'rnatilgan dasturiy ta'minot Arduino Uno, 2 -rasm bilan birga, ikkita fon/oldingi vazifalar qanday o'zaro ta'sir qilishi haqida batafsil ma'lumot berilgan. 3 -rasm - bu APDS9960_NonBlockinglibrary -dan qanday foydalanishni ko'rsatadigan kod segmenti. 4 -rasm Arduino Uno Digital Pins va ATMega328P -dagi haqiqiy apparat pinlari o'rtasidagi xaritani ko'rsatadi.

Qayta o'rnatilgandan so'ng, o'rnatilgan mikrokontroller APDS9960 -ni ishga tushiradi, bu esa INT -chiqishini ishga tushirishga imkon beradi va uning kirish -chiqish konfiguratsiyasini o'rnatadi, INT0 vektorini uzish uchun GESTURE_CLEAR () uzluksiz xizmat ko'rsatish tartibini (ISR) biriktiradi (Raqamli pin 2, Uskuna IC pin 4)., uni tushayotgan chekka tetiği uchun sozlash. Bu asosiy qurilmadan nGestureClear kirishini hosil qiladi.

APDS9960 -dan "INT" uzilish chiqish pimi U1 -ga kirish sifatida sozlangan Digital Pin 4, IC IC 6 -sonli ulanadi.

Digital pin 7, Hard IC IC pin 13-dagi "nGestureAvailable" signal chizig'i chiqish sifatida konfiguratsiya qilingan va yuqori, faol bo'lmagan (tasdiqlanmagan).

Nihoyat, Port B 0… 3 bitlari mos ravishda chiqish sifatida konfiguratsiya qilinadi va past darajaga o'rnatiladi. Bular har xil aniqlangan imo -ishoralar turlarini ifodalovchi ma'lumot to'pini hosil qiladi; Yo'q = 0x0, Xato = 0xF, Yuqoriga = 0x1, Pastga = 0x2, Chap = 0x3, O'ng = 0x4, Yaqin = 0x5 va Far = 0x6.

Raqamli pin 4 o'qish orqali APDS9960 Interrupt chiqish INTni doimiy ravishda so'roq qiladigan "Loop" fon vazifasi rejalashtirilgan. APDS9960 dan INT faolligi past bo'lganda, sensor ishga tushganligini bildiradi, mikrokontroller "readGesture () 'with while while (1) {}; cheksiz tsikl.

Agar yaroqli imo -ishora aniqlansa, bu qiymat B portiga yoziladi, "nGestureAvailable" chiqishi tasdiqlanadi va "bGestureAvailable" mantiqiy semafori o'rnatiladi, bu esa boshqa imo -ishoralarni qayd qilinishiga to'sqinlik qiladi.

Magistr faol "nGestureAvailable" chiqishini aniqlagandan so'ng, u bu yangi qiymatni o'qiydi va "nGestureClear" faol pastini uradi. Bu pasayish "ISR GESTURE_CLEAR ()" oldingi vazifasini "Loop" fon vazifasini bajarilishini to'xtatishni, B portini, "bGestureAvailable" semaforini va "nGestureAvailable" chiqishini to'xtatishni rejalashtiradi.

"GESTURE_CLEAR ()" oldingi vazifasi to'xtatildi va "Loop" fon vazifasi qayta rejalashtirildi. APDS9960 -dan boshqa imo -ishoralarni endi sezish mumkin.

To'xtatilgan ishga tushirilgan old/orqa vazifalarni shu tarzda ishlatganda, qul qurilmasining "readGesture ()" potentsial cheksiz aylanishi asosiy qurilmaning ishlashiga ta'sir qilmaydi va qo'shimcha qurilmaning ishlashiga to'sqinlik qilmaydi. Bu juda oddiy real vaqtda operatsion tizimning (RTOS) asosini tashkil qiladi.

Eslatma: "n" prefiksi "nGestureAvailable" da bo'lgani kabi faol past yoki tasdiqlangan degan ma'noni anglatadi.

3 -qadam: Bloklanmaydigan APDS9960 imo -ishorali qurilmasini sinovdan o'tkazish

Bloklanmaydigan APDS9960 imo -ishorali qurilmasini sinovdan o'tkazish
Bloklanmaydigan APDS9960 imo -ishorali qurilmasini sinovdan o'tkazish
Bloklanmaydigan APDS9960 imo -ishorali qurilmasini sinovdan o'tkazish
Bloklanmaydigan APDS9960 imo -ishorali qurilmasini sinovdan o'tkazish
Bloklanmaydigan APDS9960 imo -ishorali qurilmasini sinovdan o'tkazish
Bloklanmaydigan APDS9960 imo -ishorali qurilmasini sinovdan o'tkazish
Bloklanmaydigan APDS9960 imo -ishorali qurilmasini sinovdan o'tkazish
Bloklanmaydigan APDS9960 imo -ishorali qurilmasini sinovdan o'tkazish

Muqaddima

APDS9960 moduli +5v bilan ta'minlangan bo'lsa ham, u bortda +3v3 regulyatorini ishlatadi, ya'ni I2C liniyalari +3v3 mos keladi va +5v emas. Shuning uchun men daraja almashtirgichlarga bo'lgan ehtiyojni bartaraf qilish uchun +3v3 mos keladigan Arduino Due -ni mikrokontroller sifatida ishlatishni tanladim.

Agar siz haqiqiy Arduino Uno -dan foydalanishni xohlasangiz, I2C liniyalarini U1 darajasiga o'tkazishingiz kerak bo'ladi. I2C -dan foydalanish bo'yicha ko'plab amaliy maslahatlar beradigan foydali slaydlar to'plamini (I2C_LCD_With_Arduino) biriktirgan quyidagi ko'rsatmaga qarang.

I2C interfeysini sinab ko'rish

Yuqoridagi 1 va 2 -rasmlarda I2C interfeysi uchun tizimni qanday sozlash va dasturlash ko'rsatilgan. Avval APDS9960_NonBlocking kutubxonasini yuklab olishingiz va o'rnatishingiz kerak bo'ladi. Bu yerga

Parallel interfeyslarni sinab ko'rish

3 va 4 -rasmlar parallel interfeys uchun bir xil

4 -qadam: Xulosa

Xulosa
Xulosa

Umumiy

Kod yaxshi ishlaydi va imo -ishoralarni hech qanday yolg'on pozitsiyalarsiz aniqlaydi. Bu mening keyingi loyihamda qul qurilmasi sifatida bir necha haftadan buyon ishlamoqda. Men turli xil muvaffaqiyatsiz rejimlarni sinab ko'rdim (va Quinnning uy xo'jaliklari moggie ham shunday), natijada ESP8266-12 ni asl holatiga qaytarish natijasida hech qanday salbiy ta'sir ko'rsatilmagan.

Mumkin bo'lgan yaxshilanishlar

  • Aniq. APDS9960 Gesture Sensor kutubxonasini blokirovka qilmaslik uchun qayta yozing.

    Aslida men Broadcom bilan bog'landim, u meni mahalliy distribyutor bilan bog'ladi, u mening qo'llab -quvvatlash so'rovimni darhol e'tiborsiz qoldirdi, menimcha, men SparkFun yoki AdaFruit emasman. Shunday qilib, ehtimol bu biroz kutishga to'g'ri keladi

  • Kodni kichikroq mikrokontrollerga ulang. Bitta vazifa uchun ATMega328P -dan foydalanish biroz ortiqcha. Men dastlab ATTiny84 -ga qaragan bo'lsam -da, uni ishlatishdan to'xtadim, chunki kodning tuzilgan o'lchami chegara chizig'iga mos kelishini sezdim. Boshqa I2C kutubxonasi bilan ishlash uchun APDS9960 kutubxonasini o'zgartirish kerak bo'lgan qo'shimcha xarajatlar bilan.

5 -qadam: Adabiyotlar

O'rnatilgan arduino (ATMega328P - U1) ni dasturlash uchun zarur

SparkFun_APDS9960.h

  • Muallif: Stiv Quinn
  • Maqsad: Bu jonn26/SparkFun_APDS-9960_Sensor_Arduino_Library-dan ajratilgan SparkFun APDS9960 Sensorining vilkalar versiyasi. Nosozliklarni tuzatishga yordam beradigan bir nechta o'zgartirishlar mavjud va soxta ishga tushirishni kamaytirish uchun sezgir bo'lmagan detektor mavjud.
  • Manba:

Bu blokirovka qilmaydigan funksiyani arduino kodingizga kiritish va ishlangan misollar keltirish talab qilinadi

APDS9960_NonBlocking.h

  • Muallif: Stiv Quinn
  • Maqsad: APDS9960 Gesture Sensor-ning blokirovka qilinmagan ilovasini Arduino kodingizga kiritish uchun toza interfeysni taqdim etadi.
  • Manba:

Haqiqiy vaqtda operatsion tizim

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

APDS9960 ma'lumotlar jadvali

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

PCF8574A ma'lumotlar jadvali

Tavsiya: