Სარჩევი:

ნეოპიქსელის მართვადი ბეჭდის კონტროლი ჟესტური სენსორით: 3 ნაბიჯი (სურათებით)
ნეოპიქსელის მართვადი ბეჭდის კონტროლი ჟესტური სენსორით: 3 ნაბიჯი (სურათებით)

ვიდეო: ნეოპიქსელის მართვადი ბეჭდის კონტროლი ჟესტური სენსორით: 3 ნაბიჯი (სურათებით)

ვიდეო: ნეოპიქსელის მართვადი ბეჭდის კონტროლი ჟესტური სენსორით: 3 ნაბიჯი (სურათებით)
ვიდეო: Fysetc Spider v1.1 - Basics 2024, ნოემბერი
Anonim
Image
Image
შეკრება და ატვირთვა
შეკრება და ატვირთვა

ამ გაკვეთილში ჩვენ ვაპირებთ ვითამაშოთ ჟესტების სენსორით (APDS-9960) და ნეოპიქსელის ბეჭდით, რომ ვისწავლოთ როგორ გავაერთიანოთ ისინი Arduino UNO– ს გამოყენებით.

საბოლოო პროდუქტი უპასუხებს მარცხენა - მარჯვენა ჟესტებს, მოძრაობის გააქტიურებით მარჯვნივ ან მარცხნივ, ხოლო ზემოდან ქვემოთ ჟესტებით, ლამპის ფერის შეცვლით.

მომდევნო ნაბიჯებში, თქვენ მოკლედ მიმოიხილავთ ნაწილების ჩამონათვალს და როგორ დააკავშირებთ კომპონენტებს. შემდეგ კი ჩვენ გადავხედავთ კოდს ეტაპობრივად, რომ გავიგოთ როგორ მუშაობს.

ნაბიჯი 1: კომპონენტები

1. არდუინო გაერო

2. USB კაბელი

3. APDS9960 ჟესტების სენსორი (https://www.sparkfun.com/products/12787)

4. 24 led neopixel led ბეჭედი (https://www.adafruit.com/product/1586)

5. კაცი-ქალი, მამაკაცი-მამაკაცი breadboard კაბელები

6. პურის დაფა

7. 5 V კვების ბლოკი led ბეჭდისთვის (მე ვიყენებ 4 ბატარეის უკანა მხარეს)

8. ნეოპიქსელის რგოლის ჩასამაგრებლად საჭიროა სამი მამრობითი ქინძისთავის მიმაგრება: GND, PWR და საკონტროლო ბუდე. ამისათვის დაგჭირდებათ გამაგრილებელი რკინა და ნაკადი

აქ ძირითადი კომპონენტებია APDS-9960 ჟესტების სენსორი და 24 ნეოპიქსელის ბეჭედი. სურვილისამებრ შეგიძლიათ გადართოთ სხვადასხვა არდუინო, USB კაბელები და კვების ბლოკები.

ნაბიჯი 2: შეკრება და ატვირთვა

შეკრება

სანამ დაიწყებთ, დარწმუნდით, რომ მაგიდაზე გაქვთ ყველა კომპონენტი. ჩვენ გვექნება კარგი ნაბიჯების გადადგმა:). მე ასევე დაურთო Fritzing სქემა, როგორც სურათი და ასევე fritzing ფორმატში.

1. შეაერთეთ 3 მამრობითი ქინძისთავები ნეოპიქსელის რგოლზე (GND, PWR, საკონტროლო პინი)

2. მიამაგრეთ ნეოპიქსელის ბეჭედი პურის დაფაზე

3. მიამაგრეთ APDS9960 სენსორი პურის დაფაზე

4. დააკავშირეთ საფუძველი: ბატარეის პაკეტი, arduino UNO, APDS9960 და ნეოპიქსელი პურის დაფაზე

5. დააკავშირეთ დენი: arduino UNO 3V APDS9960 დენის პინთან, ნეოპიქსელი ბატარეის პაკეტთან

6. დააკავშირეთ ნეოპიქსელის საკონტროლო პინი arduino D6 პინთან

7. დააკავშირეთ APDS9960 SDA და SCL A4 და A5 შესაბამისად

8. შეაერთეთ APDS9960 შეწყვეტის პინი arduino D2- თან

კოდის ატვირთვა

უპირველეს ყოვლისა თქვენ უნდა გადმოწეროთ და დააინსტალიროთ საჭირო arduino ბიბლიოთეკები:

1. ნეოპიქსელის ბეჭდის ბიბლიოთეკა:

2. ჟესტების სენსორების ბიბლიოთეკა:

თუ არ იცით, როგორ დააინსტალიროთ arduino ბიბლიოთეკები, გადახედეთ ამ სახელმძღვანელოს.

მას შემდეგ რაც გადმოწერეთ და დააინსტალირეთ ზემოთ ბიბლიოთეკები, შეგიძლიათ კლონირება ან გადმოწერა ჩემი arduino საცავი, რომელიც მდებარეობს აქ: https://github.com/danionescu0/arduino და ჩვენ გამოვიყენებთ ამ ჩანახატს: https://github.com/danionescu0 /arduino/ხე/სამაგისტრო/პროექტები/neopixel_ring_gestures

მომდევნო ნაწილში მე პირდაპირ ჩავრთავ კოდს ამ გაკვეთილში, ასე რომ, თუ მოგწონთ, შეგიძლიათ დააკოპიროთ და ჩასვათ იქიდან.

საბოლოოდ დაუკავშირეთ arduino კომპიუტერს USB კაბელის გამოყენებით, ჩადეთ 1.5 ვ ბატარეა ბატარეის პაკეტში და ჩადეთ ესკიზი არდუინოში.

ნაბიჯი 3: როგორ მუშაობს?

ამ ბოლო ნაწილში ჩვენ ვისწავლით თუ როგორ არის შერწყმული ეს კომპონენტები, როგორ გამოვიყენო მათი ბიბლიოთეკები და როგორ შევქმენი ჩემი კოდი:

ჯერ მოდით შევხედოთ სენსორს და ნეოპიქსელის ბიბლიოთეკის API მეთოდებს, რომელსაც ჩვენ გამოვიყენებთ

1. ნეოპიქსელის API ადაფრუტიდან

ამ ბიბლიოთეკიდან ჩვენ ვიყენებთ მეთოდებს, რომლებიც აკონტროლებენ ინდივიდუალური led- ის ფერს და გამოვიყენებთ მათ

- მოიცავს ბიბლიოთეკას:

#ჩართეთ

- გამოაცხადე ბიბლიოთეკა

#განსაზღვრეთ NEOPIXED_CONTROL_PIN 6

#განსაზღვრეთ NUM_LEDS 24 Adafruit_NeoPixel ზოლები = Adafruit_NeoPixel (NUM_LEDS, NEOPIXED_CONTROL_PIN, NEO_RBG + NEO_KHZ800);

- ინიციალიზაცია

#ტიპიურად კონფიგურაციის ბლოკში

void setup () {strip.begin (); # იქნებ სხვა რამეა აქ #… }

- აანთეთ ინდივიდუალური პიქსელები, შემდეგ გამოიყენეთ ყველა მოდიფიკაცია ზოლზე (გააკეთეთ იგი ისე)

# დააყენეთ პიქსელი 0 წითელი

strip.setPixelColor (0, ზოლები. ფერი (255, 0, 0)); # დააყენეთ პიქსელი 1 მწვანე ზოლად. setPixelColor (1, ზოლები. ფერი (0, 255, 0)); # დააყენეთ პიქსელი 2 ცისფერი strip.setPixelColor (2, ზოლები. ფერი (0, 0 255)); ზოლები. ჩვენება ();

2. APDS 9960 ჟესტების სენსორი

ამ ბიბლიოთეკიდან ჩვენ ვიყენებთ "ჟესტის წაკითხვის" ფუნქციას. ეს ფუნქცია შეძლებს განასხვავოს მარცხნიდან მარჯვნივ, ზევით ქვემოთ, ახლოდან შორს მდებარე ბრძანებებს. აქ არის ხრიკი, ჩვენ არ ვაპირებთ სენსორს განუწყვეტლივ ვთხოვოთ ბოლო ჟესტის აღქმას. დაფას აქვს უნარი "დაარტყას" ჟესტი ნაპოვნი შეფერხების საშუალებით.

- მოიცავს ბიბლიოთეკას, ნეოპიქსელის მსგავსი

- გამოაცხადე ბიბლიოთეკა შეწყვეტის პინისა და შეწყვეტის დროშის შესახებ

#განსაზღვრეთ APDS9960_INT 2

SparkFun_APDS9960 apds = SparkFun_APDS9960 (); int isr_flag = 0;

- ბიბლიოთეკის ინიციალიზაცია, როგორც წესი, დაყენების ფუნქციის შიგნით

ბათილად დაყენება ()

{ # გამოაცხადეთ შეწყვეტის პინი INPUT და მიამაგრეთ ფუნქცია pinMode (APDS9960_INT, INPUT); attachInterrupt (0, interruptRoutine, FALLING); if (apds.init () && apds.enableGestureSensor (ჭეშმარიტი)) {Serial.println ("APDS-9960 ინიციალიზაცია დასრულებულია"); } else {Serial.println ("რაღაც შეცდა APDS-9960 init!"); } # სხვა საქმეების ინიციალიზაცია ალბათ}

- განსაზღვრეთ შეწყვეტის ფუნქცია, აქ ჩვენ მხოლოდ დროშას დავაყენებთ

void interruptRoutine () {

isr_flag = 1; }

- მარყუჟის ფუნქციის შიგნით პერიოდულად შეამოწმეთ დროშა თუ არა ჟესტი გამოვლენილი

ბათილი მარყუჟი ()

{ # შეამოწმეთ დროშა თუ (isr_flag == 1) { # თუ დროშა დაყენებულია, ამოიღეთ შეწყვეტა, განახორციელეთ საჭირო დამუშავება handleGesture () ფუნქციის # შიგნით და შემდეგ გადატვირთეთ დროშა და კვლავ მიამაგრეთ შეწყვეტის detachInterrupt (0); handleGesture (); isr_flag = 0; attachInterrupt (0, interruptRoutine, FALLING); } # შეიძლება სხვა კოდი აქ}

- განსაზღვრეთ handleGesture () ფუნქცია, სადაც შეგვიძლია ვთხოვოთ ბოლო ჟესტი

void handleGesture () {

# თუ არცერთი ჟესტი არ არის შესაძლებელი დაბრუნება, ეს არის მხოლოდ უსაფრთხო შემოწმება, თუ (! apds.isGestureAvailable ()) {დაბრუნდება; } # კითხულობს ბოლო ჟესტს, ადარებს ცნობილებს და ბეჭდავს შეტყობინების გადამრთველს (apds.readGesture ()) {case DIR_UP: Serial.println ("UP"); შესვენება; საქმე DIR_DOWN: Serial.println ("DOWN"); შესვენება; საქმე DIR_LEFT: Serial.println ("მარცხნივ"); შესვენება; საქმე DIR_RIGHT: Serial.println ("RIGHT"); შესვენება; საქმე DIR_FAR: Serial.println ("FAR"); შესვენება; }}

ახლა ვნახოთ მთელი კოდი მოქმედებაში:

ასე რომ, მე ავუხსენი ჟესტების სენსორისა და ნეოპიქსელის ბეჭდის ძირითადი API, ახლა მოდით ერთად დავალაგოთ ყველაფერი:

ალგორითმი ასე მუშაობს:

- ბიბლიოთეკების ინიციალიზაცია (იხ. კოდი ზემოთ)

- შექმენით led ინტენსივობის მასივი სახელწოდებით "ledStates". ეს მასივი შეიცავს 24 led ინტენსივობას, რომლებიც განლაგებულია კლებადობით 150 -დან 2 -მდე

- მთავარი მარყუჟის შიგნით შეამოწმეთ შეწყვეტის პინი შეცვლილია თუ ასეა დროა შეცვალოთ led ანიმაცია ან ფერი

- "handleGesture ()" ფუნქცია ამოწმებს ბოლო ჟესტს და უწოდებს "toggleColor" ფუნქციას UP -DOWN ჟესტებისთვის, ან გლობალური ცვლადი "ledDirection" მარცხენა - მარჯვენა ჟესტებისთვის.

- "toggleColor ()" ფუნქცია უბრალოდ ცვლის გლობალურ ცვლადს სახელწოდებით "colorSelection" ერთ -ერთი მნიშვნელობით 0, 1, 2

- ასევე მთავარი მარყუჟის ფუნქციის შიგნით სხვა ფუნქცია სახელწოდებით "animateLeds ();" ეწოდება. ეს ფუნქცია ამოწმებს გავიდა თუ არა 100 მილიწამი, და თუ ასეა ის ბრუნავს led- ებს "rotateLeds ()" ფუნქციის გამოყენებით და შემდეგ ხელახლა ხატავს მათ

- "rotateLeds ()" იქნება "rotates" leds წინ ან უკან გამოყენებით სხვა მასივი მოუწოდა "intermediateLedStates".

როტაციის "ეფექტი" ასე გამოიყურება:

# ინიციალიზაციის შემდეგ

{150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; # after rotateLeds () ეწოდება {0, 150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; # after rotateLeds () კვლავ იძახება {0, 0, 150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; # და ასე შემდეგ

ამისათვის პირველად ქმნის ახალ მასივს და ასლებს ძველი led ინტენსივობას ახალ პოზიციებზე (პოზიციის გაზრდა ან შემცირება). ამის შემდეგ იგი გადააწერს "ledStates" მასივს "intermediateLedStates" - ით, ასე რომ პროცესი გაგრძელდება კიდევ 100 მილიწამის შემდეგ.

#მოიცავს "SparkFun_APDS9960.h"

#მოიცავს "Adafruit_NeoPixel.h"

#ჩართეთ "Wire.h" #განსაზღვრეთ NEOPIXED_CONTROL_PIN 6 #განსაზღვრეთ NUM_LEDS 24 #განსაზღვრეთ APDS9960_INT 2 #განსაზღვრეთ LED_SPEED_STEP_INTERVAL 100 Adafruit_NeoPixel ზოლები = Adafruit_NeoPixel (NEO_GROW), NEO SparkFun_APDS9960 apds = SparkFun_APDS9960 (); ხელმოუწერელი long lastLedChangeTime = 0; მოკლე ledDirection = 0; მოკლე ფერი შერჩევა = 0; ბაიტი ledStates = {150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; int isr_flag = 0; void setup () {Serial.begin (9600); Serial.println ("პროგრამა დაიწყო"); ზოლები. დაწყება (); pinMode (APDS9960_INT, INPUT); attachInterrupt (0, interruptRoutine, FALLING); if (apds.init () && apds.enableGestureSensor (ჭეშმარიტი)) {Serial.println ("APDS-9960 ინიციალიზაცია დასრულებულია"); } else {Serial.println ("რაღაც შეცდა APDS-9960 init!"); } lastLedChangeTime = მილი (); Serial.println ("წარმატებით დაიწყე"); } void loop () {if (isr_flag == 1) {detachInterrupt (0); handleGesture (); isr_flag = 0; attachInterrupt (0, interruptRoutine, FALLING); } animateLeds (); } void interruptRoutine () {isr_flag = 1; }); } switch (apds.readGesture ()) {case DIR_UP: Serial.println ("UP"); toggleColor (); შესვენება; საქმე DIR_DOWN: Serial.println ("DOWN"); toggleColor (); შესვენება; საქმე DIR_LEFT: ledDirection = 1; Serial.println ("მარცხნივ"); შესვენება; საქმე DIR_RIGHT: ledDirection = -1; Serial.println ("RIGHT"); შესვენება; საქმე DIR_FAR: ledDirection = 0; Serial.println ("FAR"); შესვენება; }} / ** * მიმდინარე leds ფერის შეცვლა * ყოველ ჯერზე ამ ფუნქციის გამოძახებით შეიცვლება leds მდგომარეობა * / void toggleColor () {if (colorSelection == 0) {colorSelection = 1; } else if (colorSelection == 1) {colorSelection = 2; } else {colorSelection = 0; }} / ** * ანიმაცია გააქტიურდება LED_SPEED_STEP_INTERVAL მილიების შემდეგ * ჯერ იძახება rotateLeds ფუნქცია, შემდეგ კი leds ფერები მითითებულია ზოლის api * / void animateLeds () {if (millis () - lastLedChangeTime <LED_SPEED_STEP_INTERVAL) {დაბრუნება; } rotateLeds (); for (int i = 0; i <NUM_LEDS; i ++) {strip.setPixelColor (i, getColor (ledStates ))); ზოლები. ჩვენება (); } lastLedChangeTime = მილი (); }), 0, 0} და ledDirection არის 1 * შემდეგ ამ ფუნქციის სახელწოდებით "ledStates" მასივი არის {0, 100, 80, 60, 0, 0} როტაციის ეფექტის სიმულატორი */ void rotateLeds () {byte intermediateLedStates [NUM_LEDS]; for (int i = 0; i <NUM_LEDS; i ++) {intermediateLedStates = 0; } for (int i = 0; i <NUM_LEDS; i ++) {if (ledDirection == 1) {if (i == NUM_LEDS -1) {intermediateLedStates [0] = ledStates ; } else {intermediateLedStates [i + 1] = ledStates ; }} სხვა {if (i == 0) {intermediateLedStates [NUM_LEDS - 1] = ledStates ; } else {intermediateLedStates [i - 1] = ledStates ; }}} for (int i = 0; i <NUM_LEDS; i ++) {ledStates = intermediateLedStates ; }} uint32_t getColor (int ინტენსივობა) {switch (colorSelection) {შემთხვევა 0: დაბრუნების ზოლი. ფერი (ინტენსივობა, 0, 0); საქმე 1: დაბრუნების ზოლი. ფერი (0, ინტენსივობა, 0); ნაგულისხმევი: დაბრუნების ზოლი. ფერი (0, 0, ინტენსივობა); }}

ვიმედოვნებ, რომ მოგეწონათ, შეგიძლიათ გამოიყენოთ კომენტარების განყოფილება კითხვების დასმისთვის.

გირჩევთ: