- ส่วนประกอบที่จำเป็น
- ข้อมูลเบื้องต้นเกี่ยวกับ APDS-9960 Digital Proximity RGB & Gesture Sensor
- แผนภูมิวงจรรวม
- การเขียนโปรแกรม Arduino สำหรับท่าทางสัมผัสและการตรวจจับสี
ปัจจุบันโทรศัพท์ส่วนใหญ่มาพร้อมกับคุณสมบัติการควบคุมท่าทางเพื่อเปิดหรือปิดแอพใด ๆ เริ่มเพลงเข้าร่วมการโทร ฯลฯ นี่เป็นคุณสมบัติที่มีประโยชน์มากในการประหยัดเวลาและยังดูดีในการควบคุมอุปกรณ์ด้วยท่าทางสัมผัส ก่อนหน้านี้เราใช้ accelerometer เพื่อสร้างหุ่นยนต์ควบคุมด้วยท่าทางและเมาส์ Air ที่ควบคุมด้วยท่าทาง แต่วันนี้เราเรียนรู้ที่จะอินเตอร์เฟซ APDS9960 เซ็นเซอร์ท่าทางกับ Arduino เซ็นเซอร์นี้ยังมีเซ็นเซอร์ RGBเพื่อตรวจจับสีซึ่งจะใช้ในบทช่วยสอนนี้ด้วย ดังนั้นคุณจึงไม่จำเป็นต้องใช้เซ็นเซอร์แยกต่างหากสำหรับการตรวจจับท่าทางและสีแม้ว่าจะมีเซ็นเซอร์เฉพาะสำหรับการตรวจจับสี - เซ็นเซอร์สี TCS3200ซึ่งเราได้ใช้กับ Arduino เพื่อสร้างเครื่องคัดแยกสีแล้ว
ส่วนประกอบที่จำเป็น
- Arduino UNO
- APDS9960 RGB และเซ็นเซอร์ท่าทางสัมผัส
- 16x2 LCD
- DPDT สวิทช์
- หม้อ 100K และตัวต้านทาน 10K
- สายจัมเปอร์
ข้อมูลเบื้องต้นเกี่ยวกับ APDS-9960 Digital Proximity RGB & Gesture Sensor
APDS9960 เป็นเซ็นเซอร์มัลติฟังก์ชั่น สามารถตรวจจับท่าทางแสงโดยรอบและค่า RGB ในแสง เซ็นเซอร์นี้ยังสามารถใช้เป็นพร็อกซิมิตีเซ็นเซอร์ได้และส่วนใหญ่จะใช้ในสมาร์ทโฟนเพื่อปิดการใช้งานหน้าจอสัมผัสขณะรับสาย
เซ็นเซอร์นี้ประกอบด้วยโฟโตไดโอดสี่ตัว โฟโตไดโอดเหล่านี้ตรวจจับพลังงาน IR ที่สะท้อนซึ่งส่งโดย LED ออนบอร์ด ดังนั้นเมื่อใดก็ตามที่ทำท่าทางใด ๆ พลังงาน IR นี้จะถูกขัดขวางและสะท้อนกลับไปที่เซ็นเซอร์ตอนนี้เซ็นเซอร์จะตรวจจับข้อมูล (ทิศทางความเร็ว) เกี่ยวกับท่าทางและแปลงเป็นข้อมูลดิจิทัล เซ็นเซอร์นี้สามารถใช้เพื่อวัดระยะห่างของสิ่งกีดขวางได้โดยการตรวจจับแสง IR ที่สะท้อน มีฟิลเตอร์ปิดกั้น UV และ IR สำหรับตรวจจับสี RGB และให้ข้อมูล 16 บิตสำหรับแต่ละสี
ขาออกของเซ็นเซอร์ APDS-9960 แสดงอยู่ด้านล่าง เซ็นเซอร์นี้ทำงานบนโปรโตคอลการสื่อสารI 2 C ใช้กระแสไฟฟ้า 1µA และใช้พลังงาน 3.3V ดังนั้นโปรดใช้ความระมัดระวังและอย่าเชื่อมต่อกับขา 5V INT พินที่นี่คือพินอินเทอร์รัปต์ซึ่งใช้ในการขับเคลื่อนการสื่อสารI 2 C และพิน VL เป็นพินเพาเวอร์เสริมสำหรับ LED ออนบอร์ดหากไม่ได้เชื่อมต่อจัมเปอร์ PS หากจัมเปอร์ PS ปิดอยู่คุณจะต้องจ่ายไฟให้กับพิน VCC เท่านั้นมันจะจ่ายไฟให้กับทั้งโมดูลและ LED IR
แผนภูมิวงจรรวม
การเชื่อมต่อAPDS960 กับ Arduinoนั้นง่ายมาก เราจะใช้ปุ่ม DPDT เพื่อสลับระหว่างสองโหมด RGB Sensing และ Gesture Sensing ประการแรกหมุดสื่อสาร I2C SDA และ SCL ของ APDS9960 เชื่อมต่อกับ Arduino พิน A4 และ A5 ตามลำดับ ตามที่ระบุไว้ก่อนหน้านี้แรงดันไฟฟ้าที่ใช้งานสำหรับเซ็นเซอร์คือ 3.3v ดังนั้น VCC และ GND ของ APDS9960 จึงเชื่อมต่อกับ 3.3V และ GND ของ Arduino อินเตอร์รัปต์พิน (INT) ของ APDS9960 เชื่อมต่อกับ D2 พินของ Arduino
สำหรับLCDพินข้อมูล (D4-D7) เชื่อมต่อกับพินดิจิทัล D6-D3 ของ Arduino และ RS และพิน EN เชื่อมต่อกับ D6 และ D7 ของ Arduino V0 ของ LCD เชื่อมต่อกับหม้อและใช้หม้อ 100K เพื่อควบคุมความสว่างของ LCD สำหรับปุ่ม DPDT เราใช้เพียง 3 พิน พินที่สองเชื่อมต่อกับพิน D7 ของ Arduino สำหรับอินพุตและอีกสองตัวเชื่อมต่อกับ GND และ VCC ตามด้วยตัวต้านทาน 10K
การเขียนโปรแกรม Arduino สำหรับท่าทางสัมผัสและการตรวจจับสี
ส่วนการเขียนโปรแกรมนั้นง่ายและสะดวกและโปรแกรมที่สมบูรณ์พร้อมวิดีโอสาธิตจะได้รับในตอนท้ายของบทช่วยสอนนี้
ก่อนอื่นเราต้องติดตั้งไลบรารีที่สร้างโดย Sparkfun ในการติดตั้งไลบรารีนี้ให้ไปที่ Sketch-> Include Library-> Manage Libraries
ตอนนี้ในแถบค้นหาพิมพ์ "Sparkfun APDS9960" และคลิกที่ปุ่มติดตั้งเมื่อคุณเห็นไลบรารี
และเราพร้อมที่จะไป มาเริ่มกันเลย.
ก่อนอื่นเราต้องรวมไฟล์ส่วนหัวที่จำเป็นทั้งหมด ไฟล์ส่วนหัวแรก LiquidCrystal.h ใช้สำหรับฟังก์ชัน LCD ไฟล์ส่วนหัวที่สอง Wire.h ใช้สำหรับการสื่อสารI 2 C และไฟล์สุดท้าย SparkFun_APDS996.h ใช้สำหรับเซ็นเซอร์ APDS9960
# รวม
ในบรรทัดถัดไปเราได้กำหนดพินสำหรับปุ่มและ LCD
const int buttonPin = 7; const int rs = 12, th = 11, d4 = 6, d5 = 5, d6 = 4, d7 = 3; LiquidCrystal LCD (rs, en, d4, d5, d6, d7);
ในส่วนถัดไปเราได้กำหนดมาโครสำหรับพินขัดจังหวะซึ่งเชื่อมต่อกับพินดิจิทัล 2 และ ปุ่ม ตัวแปรหนึ่ง ปุ่ม สำหรับสถานะปัจจุบันของปุ่มและ isr_flag สำหรับรูทีนบริการขัดจังหวะ
# กำหนด APDS9960_INT 2 int buttonState; int isr_flag = 0;
ถัดไปวัตถุจะถูกสร้างขึ้นสำหรับ SparkFun_APDS9960 เพื่อให้เราสามารถเข้าถึงการเคลื่อนไหวของท่าทางและดึงค่า RGB
SparkFun_APDS9960 apds = SparkFun_APDS9960 (); uint16_t ambient_light = 0; uint16_t red_light = 0; uint16_t green_light = 0; uint16_t blue_light = 0;
ในฟังก์ชัน การตั้งค่า บรรทัดแรกคือการดึงค่าจากปุ่ม (ต่ำ / สูง) และบรรทัดที่สองและสามกำหนดอินเทอร์รัปต์และพินปุ่มเป็นอินพุต apds.init () เริ่มต้นเซ็นเซอร์ APDS9960 และ lcd.begin (16,2) เริ่มต้น LCD
การตั้งค่าเป็นโมฆะ () { buttonState = digitalRead (buttonPin); pinMode (APDS9960_INT, อินพุต); pinMode (buttonPin, อินพุต); apds.init (); lcd.begin (16, 2); }
ในฟังก์ชัน ลูป บรรทัดแรกรับค่าจากปุ่มและเก็บไว้ในตัวแปร buttonState ที่ กำหนดไว้ก่อนหน้านี้ ตอนนี้ในบรรทัดถัดไปเรากำลังตรวจสอบค่าจากปุ่มหากสูงเราจะเปิดใช้งานเซ็นเซอร์แสงและหากต่ำให้เริ่มต้นเซ็นเซอร์ท่าทาง
attachInterrupt () เป็นฟังก์ชั่นที่ใช้สำหรับการขัดจังหวะภายนอกซึ่งในกรณีนี้คือการขัดจังหวะของเซนเซอร์ อาร์กิวเมนต์แรกในฟังก์ชันนี้คือหมายเลขขัดจังหวะ ใน Arduino UNO มีพินดิจิตอลอินเทอร์รัปต์พินสองพิน - 2 และ 3 แสดงด้วย INT.0 และ INT.1 และเราเชื่อมต่อกับพิน 2 เราจึงเขียน 0 ตรงนั้น อาร์กิวเมนต์ที่สองเรียกใช้ฟังก์ชัน interruptRoutine () ซึ่งกำหนดไว้ในภายหลัง อาร์กิวเมนต์สุดท้ายคือ FALLING เพื่อที่จะทำให้เกิดการขัดจังหวะเมื่อพินเปลี่ยนจากสูงไปต่ำ เรียนรู้เพิ่มเติมเกี่ยวกับ Arduino Interrupts ที่นี่
โมฆะ loop () { buttonState = digitalRead (buttonPin); ถ้า (buttonState == สูง) { apds.enableLightSensor (จริง); }
ในส่วนถัดไปเราจะตรวจสอบหมุดปุ่ม ถ้ามันอยู่ในระดับสูงแล้วเริ่มกระบวนการสำหรับเซ็นเซอร์ RGBจากนั้นตรวจสอบว่าเซ็นเซอร์วัดแสงอ่านค่าหรือไม่ หากไม่สามารถอ่านค่าได้ในกรณีนั้นให้พิมพ์ว่า " Error reading light values" และถ้าสามารถอ่านค่าได้ให้เปรียบเทียบค่าของทั้งสามสีและค่าใดสูงที่สุดให้พิมพ์สีนั้นลงใน LCD
if (buttonState == HIGH) { if (! apds.readAmbientLight (ambient_light) - ! apds.readRedLight (red_light) - ! apds.readGreenLight (green_light) - ! apds.readBlueLight (blue_light)) { lcd.print ("ข้อผิดพลาดในการอ่านค่าแสง"); } else { if (red_light> green_light) { if (red_light> blue_light) { lcd.print ("Red"); ล่าช้า (1,000); lcd.clear (); } ……. ………..
ในบรรทัดถัดไปอีกครั้งตรวจสอบปุ่มขาและถ้ามันเป็นต่ำกระบวนการเซ็นเซอร์ท่าทางสัมผัสจากนั้นตรวจสอบ isr_flag และถ้าเป็น 1 ฟังก์ชัน detachInterrupt () จะถูกเรียกใช้ ฟังก์ชันนี้ใช้เพื่อปิดการขัดจังหวะ บรรทัดถัดไปเรียก handleGesture () ซึ่งกำหนดฟังก์ชันในภายหลัง ในบรรทัดถัดไปกำหนด isr_flag เป็นศูนย์และแนบ อินเทอร์รั ปต์
อื่นถ้า (buttonState == LOW) { if (isr_flag == 1) { detachInterrupt (0); handleGesture (); isr_flag = 0; attachInterrupt (0, interruptRoutine, FALLING); } }
ต่อไปคือฟังก์ชัน interruptRoutine () ฟังก์ชันนี้ใช้เพื่อเปิดตัวแปร isr_flag 1 เพื่อให้สามารถเตรียมใช้งาน อินเตอร์รัป ต์
เป็นโมฆะ interruptRoutine () { isr_flag = 1; }
handleGesture () ฟังก์ชั่นที่กำหนดไว้ในส่วนถัดไป ฟังก์ชันนี้จะตรวจสอบความพร้อมใช้งานของเซ็นเซอร์ท่าทางก่อน หากพร้อมใช้งานระบบจะอ่านค่าท่าทางสัมผัสและตรวจสอบว่าท่าทางนั้นเป็นท่าทางใด (ขึ้น, ลง, ขวา, ซ้าย, ไกล, ใกล้) และพิมพ์ค่าที่เกี่ยวข้องไปยัง LCD
โมฆะ handleGesture () { if (apds.isGestureAvailable ()) { สวิตช์ (apds.readGesture ()) { case DIR_UP: lcd.print ("UP"); ล่าช้า (1,000); lcd.clear (); หยุดพัก; กรณี DIR_DOWN: lcd.print ("DOWN"); ล่าช้า (1,000); lcd.clear (); หยุดพัก; กรณี DIR_LEFT: lcd.print ("LEFT"); ล่าช้า (1,000); lcd.clear (); หยุดพัก; กรณี DIR_RIGHT: lcd.print ("RIGHT"); ล่าช้า (1,000); lcd.clear (); หยุดพัก; กรณี DIR_NEAR: lcd.print ("NEAR"); ล่าช้า (1,000); lcd.clear (); หยุดพัก; กรณี DIR_FAR: lcd.print ("FAR"); ล่าช้า (1,000); lcd.clear (); หยุดพัก; ค่าเริ่มต้น: lcd.print ("ไม่มี"); ล่าช้า (1,000); lcd.clear (); } } }
สุดท้ายอัปโหลดรหัสไปยัง Arduino และรอให้เซ็นเซอร์เริ่มทำงาน ตอนนี้ขณะที่กดปุ่มปิดหมายถึงมันอยู่ในโหมดการแสดงท่าทางลองขยับมือไปทางซ้ายขวาขึ้นลง สำหรับท่าทางที่ ไกล ให้วางมือไว้ในระยะ 2-4 นิ้วจากเซ็นเซอร์ประมาณ 2-3 วินาทีแล้วถอดออก และสำหรับท่าทาง ใกล้ ๆ ให้มือของคุณห่างไกลจากเซ็นเซอร์จากนั้นนำไปใกล้และถอดออก
ตอนนี้เปิดปุ่มเพื่อให้เข้าสู่โหมดตรวจจับสีและนำวัตถุสีแดงสีน้ำเงินและสีเขียวทีละชิ้นใกล้กับเซ็นเซอร์ มันจะพิมพ์สีของวัตถุ