Mục lục:

Triển khai cảm biến cử chỉ không khóa APDS9960: 5 bước
Triển khai cảm biến cử chỉ không khóa APDS9960: 5 bước

Video: Triển khai cảm biến cử chỉ không khóa APDS9960: 5 bước

Video: Triển khai cảm biến cử chỉ không khóa APDS9960: 5 bước
Video: DU HỌC SCVN | Du học theo mô hình đào tạo STEM 2024, Tháng bảy
Anonim
Triển khai cảm biến cử chỉ không khóa APDS9960
Triển khai cảm biến cử chỉ không khóa APDS9960
Triển khai cảm biến cử chỉ không khóa APDS9960
Triển khai cảm biến cử chỉ không khóa APDS9960
Triển khai cảm biến cử chỉ không khóa APDS9960
Triển khai cảm biến cử chỉ không khóa APDS9960

Mở đầu

Có thể hướng dẫn chi tiết cách tạo triển khai không chặn của Cảm biến cử chỉ APDS9960 bằng SparkFun_APDS-9960_Sensor_Arduino_Library.

Giới thiệu

Vì vậy, bạn có thể đang tự hỏi mình không chặn là gì? Hoặc thậm chí chặn cho vấn đề đó?

Quan trọng hơn tại sao điều quan trọng là phải có bất cứ điều gì không chặn đúng không?

Ok, vì vậy khi một bộ vi xử lý chạy một chương trình, nó sẽ thực thi tuần tự các dòng mã và làm như vậy sẽ thực hiện các lệnh gọi đến và trả về từ các hàm theo thứ tự mà bạn đã viết chúng.

Lệnh gọi chặn chỉ là một lệnh gọi đến bất kỳ loại chức năng nào gây ra việc tạm dừng thực thi, có nghĩa là một lệnh gọi hàm trong đó người gọi sẽ không tiếp tục thực thi cho đến khi thực thi xong hàm được gọi.

Vì vậy, tại sao điều này lại quan trọng?

Trong trường hợp bạn đã viết một số mã cần phải thực hiện thường xuyên nhiều chức năng một cách tuần tự như đọc nhiệt độ, đọc nút và cập nhật màn hình, nếu mã để cập nhật màn hình là lệnh gọi chặn, hệ thống của bạn sẽ không phản hồi nhấn nút và thay đổi nhiệt độ, vì bộ xử lý sẽ dành toàn bộ thời gian để chờ màn hình cập nhật và không đọc trạng thái nút hoặc nhiệt độ mới nhất.

Về phần mình, tôi muốn tạo MQTT qua thiết bị máy tính để bàn IoT có khả năng kết nối WiFi, có thể đọc cả giá trị nhiệt độ / độ ẩm cục bộ và từ xa, mức độ ánh sáng xung quanh, áp suất khí quyển, theo dõi thời gian, hiển thị tất cả các thông số này trên màn hình LCD, đăng nhập vào uSD thẻ trong thời gian thực, đọc đầu vào nút, ghi vào đèn LED đầu ra và theo dõi cử chỉ để điều khiển mọi thứ trong cơ sở hạ tầng IoT của tôi và tất cả đều được điều khiển bởi ESP8266-12.

Thật không may, hai nguồn thư viện APDS9960 duy nhất mà tôi có thể tìm thấy là thư viện SparkFun và AdaFruit, cả hai đều được trích xuất từ mã ứng dụng từ Avago (nhà sản xuất ADPS9960) và có một lệnh gọi có tên là ‘readGesture’ chứa một thời gian (1) {}; vòng lặp mà khi được sử dụng trong dự án ở trên khiến ESP8266-12E đặt lại bất cứ khi nào cảm biến ADPS9960 trở nên bão hòa (tức là khi một đối tượng vẫn ở gần hoặc có một nguồn IR khác chiếu sáng cảm biến).

Do đó, để giải quyết hành vi này, tôi đã chọn di chuyển quá trình xử lý Cử chỉ sang bộ xử lý thứ hai, theo đó ESP8266-12E trở thành bộ vi điều khiển chính và hệ thống này là phụ, như được mô tả trong Hình 1 & 2 ở trên, sơ đồ Tổng quan hệ thống và Thành phần hệ thống tương ứng. Hình 3 cho thấy mạch nguyên mẫu.

Để hạn chế những thay đổi mà tôi cần thực hiện đối với mã hiện có của mình, tôi cũng đã viết một lớp / thư viện trình bao bọc có tên theo hình tượng là ‘APDS9960_NonBlocking’.

Sau đây là phần giải thích chi tiết về giải pháp không chặn.

Tôi cần những bộ phận nào?

Nếu bạn muốn xây dựng giải pháp I2C hoạt động với thư viện APDS9960_NonBlocking, bạn sẽ yêu cầu các phần sau.

  1. Giảm 1 ATMega328P tại đây
  2. 1 giảm PCF8574P tại đây
  3. 6 giảm 10K điện trở ở đây
  4. 4 giảm 1K Điện trở ở đây
  5. 1 off 1N914 Diode đây
  6. 1 tắt PN2222 NPN Transistor tại đây
  7. 1 tinh thể 16MHz tắt ở đây
  8. 2 tắt Tụ điện 0,1uF tại đây
  9. 1 tắt Tụ điện 1000uF tại đây
  10. 1 tắt Tụ điện 10uF tại đây
  11. 2 tắt tụ điện 22pF ở đây

Nếu bạn muốn đọc đầu ra cảm biến cử chỉ qua giao diện song song thì bạn có thể thả PCF8574P và ba điện trở 10K ra.

Tôi cần phần mềm nào?

Arduino IDE 1.6.9

Tôi cần những kỹ năng gì?

Để thiết lập hệ thống, sử dụng mã nguồn (được cung cấp) và tạo mạch điện cần thiết, bạn sẽ cần những thứ sau;

  • Hiểu biết tối thiểu về điện tử,
  • Kiến thức về Arduino và IDE của nó,
  • Hiểu về cách lập trình Arduino nhúng (Xem Hướng dẫn 'Lập trình ATTiny85, ATTiny84 và ATMega328P: Arduino As ISP')
  • Một số kiên nhẫn.

Các chủ đề được đề cập

  • Tổng quan ngắn gọn về mạch
  • Tổng quan ngắn gọn về phần mềm
  • Kiểm tra thiết bị cảm biến cử chỉ APDS9960
  • Phần kết luận
  • Người giới thiệu

Bước 1: Tổng quan về mạch

Tổng quan về mạch
Tổng quan về mạch

Mạch được chia thành hai phần;

  • Đầu tiên là chuyển đổi I2C nối tiếp sang song song được thực hiện thông qua các điện trở R8… 10 và IC1. Ở đây R8… R10 đặt địa chỉ I2C cho chip mở rộng I / O 8 bit IC1 một NXP PCF8574A. Phạm vi địa chỉ hợp lệ cho thiết bị này tương ứng là 0x38… 0x3F. Trong ví dụ về phần mềm I2C được cung cấp 'I2C_APDS9960_TEST.ino' '#define GESTURE_SENSOR_I2C_ADDRESS' sẽ cần được thay đổi để phù hợp với dải địa chỉ này.
  • Tất cả các thành phần khác tạo thành một Arduino Uno nhúng nô lệ và có các chức năng sau;

    • R1, T1, R2 và D1 cung cấp đầu vào thiết lập lại thiết bị phụ. Tại đây một xung cao hoạt động trên IC1 - P7 sẽ buộc U1 phải thiết lập lại.
    • R3, R4, là điện trở giới hạn dòng điện cho các dòng TX / RX lập trình thiết bị nhúng.
    • C5 và R7 cho phép Arduino IDE tự động lập trình U1 thông qua một xung trên đường DTR của thiết bị FTDI kèm theo.
    • R5 và R6 là điện trở kéo lên I2C cho APDS9960 với C6 cung cấp khả năng tách đường ray cung cấp cục bộ.
    • U1, C1, C2 và Q1 tạo thành Arduino Uno được nhúng và đồng hồ của nó tương ứng.
    • Cuối cùng C3 và C4 cung cấp bộ tách đường ray cung cấp cục bộ cho U1.

Bước 2: Tổng quan về phần mềm

Tổng quan về phần mềm
Tổng quan về phần mềm
Tổng quan về phần mềm
Tổng quan về phần mềm
Tổng quan về phần mềm
Tổng quan về phần mềm

Mở đầu

Để biên dịch thành công mã nguồn này, bạn sẽ cần các thư viện bổ sung sau để lập trình Arduino Uno U1 được nhúng;

SparkFun_APDS9960.h

  • Bởi: Steve Quinn
  • Mục đích: Đây là phiên bản phân nhánh của Cảm biến SparkFun APDS9960 được phân tách từ jonn26 / SparkFun_APDS-9960_Sensor_Arduino_Library. Nó có một số sửa đổi để giúp gỡ lỗi và có bộ dò khử nhạy cảm để giảm kích hoạt giả.
  • Từ:

APDS9960_NonBlocking.h

  • Bởi: Steve Quinn
  • Mục đích: Cung cấp giao diện sạch sẽ để nhúng việc triển khai không chặn này của Cảm biến cử chỉ APDS9960 vào mã Arduino của bạn.
  • Từ:

Xem Hướng dẫn sau đây về cách lập trình vi điều khiển Arduino Uno (ATMega328P) nhúng nếu bạn không quen với cách đạt được điều này;

LẬP TRÌNH ATTINY85, ATTINY84 VÀ ATMEGA328P: ARDUINO AS ISP

Tổng quan về chức năng

Bộ vi điều khiển nô lệ nhúng ATMega328P thăm dò dòng INT từ ADPS9960. Khi dòng này xuống thấp, bộ vi điều khiển sẽ đọc các thanh ghi ADPS9960 và xác định xem đã có cử chỉ hợp lệ nào được cảm nhận hay chưa. Nếu một cử chỉ hợp lệ đã được phát hiện, mã cho cử chỉ này 0x0… 0x6, 0xF được đặt trên Cổng B và 'nGestureAvailable' được xác nhận ở mức thấp.

Khi thiết bị Chính thấy 'nGestureAvailable' đang hoạt động, nó sẽ đọc giá trị trên Cổng B sau đó xung 'nGestureClear' tạm thời ở mức thấp để xác nhận đã nhận dữ liệu.

Sau đó, thiết bị phụ trợ sẽ khử xác nhận 'nGestureAvailable' cao và xóa dữ liệu trên Cổng B. Hình 5 ở trên hiển thị một ảnh chụp màn hình được lấy từ một bộ phân tích logic trong một chu kỳ phát hiện / đọc đầy đủ.

Tổng quan về mã

Pic 1 ở trên trình bày chi tiết cách phần mềm trong U1 nô lệ nhúng Arduino Uno hoạt động, cùng với Pic 2 cách hai tác vụ nền / nền trước tương tác. Pic 3 là một đoạn mã phác thảo cách sử dụng APDS9960_NonBlockinglibrary. Pic 4 đưa ra ánh xạ giữa các Chân kỹ thuật số Arduino Uno và các chân phần cứng thực tế trên ATMega328P.

Sau khi đặt lại bộ vi điều khiển nô lệ nhúng sẽ khởi động APDS9960 cho phép phát hiện cử chỉ để kích hoạt đầu ra INT của nó và định cấu hình I / O của nó, gắn quy trình dịch vụ ngắt (ISR) 'GESTURE_CLEAR ()' để ngắt vectơ INT0 (Chân số 2, chân IC phần cứng 4), cấu hình nó cho một trình kích hoạt cạnh giảm. Điều này tạo thành đầu vào nGestureClear từ thiết bị chính.

Chân đầu ra ngắt 'INT' của APDS9960 được kết nối với Chân số 4, Chân số 6 của IC phần cứng, được định cấu hình làm đầu vào cho U1.

Dòng tín hiệu 'nGestureAvailable' trên chân kỹ thuật số 7, chân 13 của IC phần cứng được định cấu hình làm đầu ra và đặt ở mức cao, không hoạt động (không xác nhận).

Cuối cùng, các bit 0… 3 của Cổng B tương ứng được cấu hình làm đầu ra và đặt ở mức thấp. Chúng tạo thành nibble dữ liệu đại diện cho các kiểu cử chỉ được phát hiện khác nhau; Không có = 0x0, Lỗi = 0xF, Lên = 0x1, Xuống = 0x2, Trái = 0x3, Phải = 0x4, Gần = 0x5 và Xa = 0x6.

Tác vụ nền 'Vòng lặp' được lên lịch sẽ liên tục thăm dò đầu ra của APDS9960 Ngắt INT thông qua đọc Chân số 4. Khi đầu ra INT từ APDS9960 hoạt động ở mức thấp cho biết cảm biến đã được kích hoạt, bộ vi điều khiển sẽ cố gắng diễn giải bất kỳ cử chỉ nào bằng cách gọi 'readGesture () 'với nó trong khi (1) {}; vòng lặp vô tận.

Nếu một cử chỉ hợp lệ đã được phát hiện, giá trị này được ghi vào Cổng B, đầu ra 'nGestureAvailable' được xác nhận và boolean semaphore 'bGestureAvailable' được đặt, ngăn không cho bất kỳ cử chỉ nào khác được ghi lại.

Khi trình chủ phát hiện đầu ra 'nGestureAvailable' đang hoạt động, nó sẽ đọc giá trị mới này và xung 'nGestureClear' hoạt động ở mức thấp. Cạnh rơi này kích hoạt tác vụ nền trước 'ISR GESTURE_CLEAR ()' được lên lịch tạm ngừng thực thi tác vụ nền 'Vòng lặp', xóa Cổng B, 'bGestureAvailable' semaphore và đầu ra 'nGestureAvailable'.

Tác vụ nền trước 'GESTURE_CLEAR ()' hiện đã bị tạm ngừng và tác vụ nền 'Vòng lặp' được lên lịch lại. Giờ đây, bạn có thể cảm nhận được các cử chỉ khác từ APDS9960.

Bằng cách sử dụng các tác vụ nền trước / nền được kích hoạt ngắt theo cách này, vòng lặp vô hạn tiềm năng trong 'readGesture ()' của thiết bị phụ sẽ không ảnh hưởng đến thiết bị chủ hoạt động và cũng sẽ không cản trở việc thực thi thiết bị phụ. Điều này tạo thành nền tảng của một hệ điều hành thời gian thực (RTOS) rất đơn giản.

Lưu ý: Tiền tố 'n' có nghĩa là hoạt động thấp hoặc được khẳng định như trong 'nGestureAvailable'

Bước 3: Kiểm tra thiết bị cảm biến cử chỉ không khóa APDS9960

Kiểm tra thiết bị cảm biến cử chỉ không khóa APDS9960
Kiểm tra thiết bị cảm biến cử chỉ không khóa APDS9960
Kiểm tra thiết bị cảm biến cử chỉ APDS9960 không khóa
Kiểm tra thiết bị cảm biến cử chỉ APDS9960 không khóa
Kiểm tra thiết bị cảm biến cử chỉ không khóa APDS9960
Kiểm tra thiết bị cảm biến cử chỉ không khóa APDS9960
Kiểm tra thiết bị cảm biến cử chỉ APDS9960 không khóa
Kiểm tra thiết bị cảm biến cử chỉ APDS9960 không khóa

Mở đầu

Mặc dù mô-đun APDS9960 được cung cấp với + 5v, nó sử dụng bộ điều chỉnh trên bo mạch + 3v3 có nghĩa là các dòng I2C của nó tuân thủ + 3v3 chứ không phải + 5v. Đây là lý do tại sao tôi chọn sử dụng Arduino Due tuân thủ + 3v3 làm bộ điều khiển vi mô thử nghiệm, để loại bỏ nhu cầu về bộ chuyển cấp.

Tuy nhiên, nếu bạn muốn sử dụng Arduino Uno thực tế thì bạn cần phải chuyển mức các dòng I2C thành U1. Xem phần Có thể hướng dẫn sau đây, nơi tôi đã đính kèm một bộ trang trình bày hữu ích (I2C_LCD_With_Arduino) cung cấp nhiều mẹo thực tế về cách sử dụng I2C.

Kiểm tra giao diện I2C

Hình 1 và 2 ở trên trình bày cách thiết lập và lập trình hệ thống cho giao diện I2C. Trước tiên, bạn cần tải xuống và cài đặt thư viện APDS9960_NonBlocking. ở đây

Kiểm tra giao diện song song

Các bức ảnh 3 và 4 có chi tiết giống nhau đối với giao diện Parallel

Bước 4: Kết luận

Phần kết luận
Phần kết luận

Tổng quan

Mã hoạt động tốt và phát hiện các cử chỉ một cách phản ứng mà không có bất kỳ kết quả dương tính giả nào. Nó đã hoạt động được vài tuần nay như một thiết bị nô lệ trong dự án tiếp theo của tôi. Tôi đã thử nhiều chế độ hỏng hóc khác nhau (và cả moggie hộ gia đình Quinn tò mò cũng vậy) mà trước đây dẫn đến việc thiết lập lại ESP8266-12, không có tác dụng tiêu cực.

Những cải tiến có thể có

  • Rõ ràng. Ghi lại thư viện Cảm biến cử chỉ APDS9960 thành không chặn.

    Trên thực tế, tôi đã liên hệ với Broadcom, người đã đưa tôi đến với một nhà phân phối địa phương, người đã nhanh chóng bỏ qua yêu cầu hỗ trợ của tôi, tôi chỉ không phải là SparkFun hay AdaFruit, tôi đoán vậy. Vì vậy, điều này có lẽ sẽ phải đợi một thời gian

  • Chuyển mã sang bộ vi điều khiển phụ nhỏ hơn. Sử dụng ATMega328P cho một nhiệm vụ là một chút quá mức cần thiết. Mặc dù ban đầu tôi đã xem xét ATTiny84, nhưng đã ngừng sử dụng một cái vì tôi cảm thấy kích thước biên dịch của mã là một đường viền vừa vặn. Với chi phí bổ sung là phải sửa đổi thư viện APDS9960 để hoạt động với một thư viện I2C khác.

Bước 5: Tham khảo

Cần thiết để lập trình arduino nhúng (ATMega328P - U1)

SparkFun_APDS9960.h

  • Bởi: Steve Quinn
  • Mục đích: Đây là phiên bản phân nhánh của Cảm biến SparkFun APDS9960 được phân tách từ jonn26 / SparkFun_APDS-9960_Sensor_Arduino_Library. Nó có một số sửa đổi để giúp gỡ lỗi và có bộ dò khử nhạy cảm để giảm kích hoạt giả.
  • Từ:

Bắt buộc phải nhúng chức năng không chặn này vào mã arduino của bạn và đưa ra các ví dụ hoạt động

APDS9960_NonBlocking.h

  • Bởi: Steve Quinn
  • Mục đích: Cung cấp giao diện sạch sẽ để nhúng việc triển khai không chặn này của Cảm biến cử chỉ APDS9960 vào mã Arduino của bạn.
  • Từ:

Hệ điều hành thời gian thực

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

Biểu dữ liệu APDS9960

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

Biểu dữ liệu PCF8574A

Đề xuất: