Агуулгын хүснэгт:

Неопикселийн LED цагиргийг дохио мэдрэгчээр удирдах: 3 алхам (зурагтай)
Неопикселийн LED цагиргийг дохио мэдрэгчээр удирдах: 3 алхам (зурагтай)

Видео: Неопикселийн LED цагиргийг дохио мэдрэгчээр удирдах: 3 алхам (зурагтай)

Видео: Неопикселийн LED цагиргийг дохио мэдрэгчээр удирдах: 3 алхам (зурагтай)
Видео: Электросамокат, который выигрывает все на трассе Nami BURN E 3 MAX. 2024, Арваннэгдүгээр
Anonim
Image
Image
Угсрах, байршуулах
Угсрах, байршуулах

Энэхүү гарын авлагад бид дохио мэдрэгч (APDS-9960) болон неопиксел бөгжтэй тоглох бөгөөд Arduino UNO ашиглан хоёуланг нь хэрхэн хослуулах талаар сурах болно.

Эцсийн бүтээгдэхүүн нь зүүн ба баруун дохио зангаагаар чиглүүлж, баруун эсвэл зүүн тийш чиглүүлж, арын гэрлийн дохиог өөрчлөх замаар дохио өгөх болно.

Дараагийн алхамд та хэсгүүдийн жагсаалт, бүрэлдэхүүн хэсгүүдийг хэрхэн холбох талаар товч тоймлон харах болно. Дараа нь бид кодыг хэрхэн яаж ажилладагийг мэдэхийн тулд алхам алхмаар хянаж үзэх болно.

Алхам 1: бүрэлдэхүүн хэсгүүд

1. Arduino UNO

2. USB кабель

3. APDS9960 дохио зангаа мэдрэгч (https://www.sparkfun.com/products/12787)

4. 24 LED неопикселийн бөгж (https://www.adafruit.com/product/1586)

5. эрэгтэй-эмэгтэй, эрэгтэй-эрэгтэй талхны кабель

6. талхны самбар

7. Удирдлагын бөгжний 5 В -ийн тэжээлийн хангамж (би 4 батерей ашиглаж байна)

8. Неопикселийн бөгжийг талхны тавцан дээр бэхлэхийн тулд GND, PWR, хяналтын зүү гэсэн гурван эрэгтэй тээглүүрийг гагнах хэрэгтэй. Үүний тулд танд гагнуурын төмөр ба урсгал хэрэгтэй болно

Энд байгаа үндсэн бүрэлдэхүүн хэсгүүд нь APDS-9960 дохионы мэдрэгч ба 24 неопиксел бөгж юм. Та өөр өөр ардуино, USB кабелийн тэжээлийн хангамж, талхны самбарыг хүссэнээрээ сольж болно.

Алхам 2: Угсрах, байршуулах

Чуулган

Эхлэхээсээ өмнө ширээн дээр бүх бүрэлдэхүүн хэсгүүд байгаа эсэхийг шалгаарай. Бидэнд дагах хэдэн сайхан алхамууд байх болно:). Би мөн Fritzing схемийг зураг хэлбэрээр хавсаргасан болно.

1. Неопикселийн цагираг руу 3 эрэгтэй тээглүүр гагнах (GND, PWR, хяналтын зүү)

2. неопикселийн бөгжийг талхны самбарт хавсаргана

3. APDS9960 мэдрэгчийг талхны самбар дээр хавсаргана уу

4. суурийг холбоно уу: батерейны багц, arduino UNO, APDS9960 болон неопиксел

5. хүчийг холбоно уу: arduino UNO 3V -аас APDS9960 тэжээлийн зүү, неопикселээс зайны багтаамж

6. неопикселийн хяналтын зүүг arduino D6 зүүтэй холбоно уу

7. APDS9960 -ийн SDA ба SCL -ийг А4 ба А5 -т тус тус холбоно уу

8. APDS9960 таслах зүүг arduino D2 -тэй холбоно уу

Код байршуулах

Юуны өмнө та шаардлагатай arduino номын санг татаж аваад суулгах хэрэгтэй болно.

1. Neopixel бөгжний номын сан:

2. Зангаа мэдрэгчийн номын сан:

Хэрэв та arduino номын санг хэрхэн суулгахаа мэдэхгүй байгаа бол энэ хичээлийг үзээрэй.

Дээрх номын санг татаж аваад суулгасны дараа та энд байрлах миний arduino репозиторыг хуулбарлах эсвэл татаж авах боломжтой: https://github.com/danionescu0/arduino, бид энэ ноорогийг ашиглах болно: https://github.com/danionescu0 /arduino/tree/master/projects/neopixel_ring_gestures

Дараагийн хэсэгт би кодыг энэ зааварт шууд оруулах болно, хэрэв та хүсвэл үүнийг тэндээс хуулж буулгаж болно.

Эцэст нь компьютерийг USB кабель ашиглан холбож, 1.5 вольтын батерейг батерейны хайрцагт хийж, ноорог зургийг arduino -д оруулна уу.

Алхам 3: Энэ нь хэрхэн ажилладаг вэ?

Энэ сүүлийн хэсэгт бид эдгээр бүрэлдэхүүн хэсгүүдийг хэрхэн нэгтгэж, номын сангаа хэрхэн ашиглах, кодоо хэрхэн яаж зохион бүтээсэн талаар олж мэдэх болно.

Эхлээд мэдрэгч болон ашиглах неопикселийн номын сангийн API аргуудыг хурдан харцгаая

1. Adafruit -аас Neopixel API

Энэхүү номын сангаас бид тус тусдаа ледийн өнгийг хянаж, тэдгээрийг хэрэглэх аргуудыг ашиглах болно

- номын сан орно:

#оруулах

- номын санг зарлах

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 -ийг цэнхэр зурвасаар тохируулах.setPixelColor (2, зурвас Өнгө (0, 0 255)); strip.show ();

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 эхлүүлэх явцад алдаа гарлаа!"); } # өөр зүйлийг эхлүүлж магадгүй}

- тасалдлын функцийг тодорхойл, энд бид зөвхөн тугийг тохируулна

void interruptRoutine () {

isr_flag = 1; }

- давталтын функц дотор дохиог илрүүлсэн эсэхийг тугийг үе үе шалгаж байгаарай

хоосон давталт ()

{ # хэрэв туг тохируулсан бол тугийг шалга handleGesture (); isr_flag = 0; attachInterrupt (0, interruptRoutine, FALLING); } Энд өөр # код байж магадгүй

- Сүүлийн дохио зангаа асуух боломжтой handleGesture () функцийг тодорхойл

void handleGesture () {

# хэрэв ямар ч дохио өгөх боломжгүй бол энэ нь зөвхөн аюулгүй шалгах явдал юм (! apds.isGestureAvailable ()) {return; } # сүүлчийн дохиог уншиж, мэдэгдэж буй хүмүүстэй харьцуулж, зурвас солих (apds.readGesture ()) {тохиолдолд DIR_UP: Serial.println ("UP"); завсарлага; тохиолдолд DIR_DOWN: Serial.println ("ДОО"); завсарлага; тохиолдолд DIR_LEFT: Serial.println ("Зүүн"); завсарлага; тохиолдолд DIR_RIGHT: Serial.println ("ЗӨВ"); завсарлага; тохиолдол DIR_FAR: Serial.println ("FAR"); завсарлага; }}

Одоо кодыг бүхэлд нь авч үзье

Тиймээс би дохио мэдрэгч ба неопиксел бөгжний үндсэн API -ийг тайлбарлав, одоо бүх зүйлийг нэгтгэе.

Алгоритм дараах байдлаар ажилладаг.

- номын санг эхлүүлэх (дээрх кодыг үзнэ үү)

- "ledStates" гэж нэрлэгддэг эрчим хүчний массив үүсгэх. Энэ массив нь 150 -аас 2 хүртэл буурах байдлаар байрлуулсан 24 хүчдэлийг агуулна

- Үндсэн давталтын дотор таслалтын зүү өөрчлөгдсөн эсэхийг шалгаарай, ингэснээр LED -ийн хөдөлгөөнт дүрс эсвэл өнгийг өөрчлөх цаг болжээ

- "handleGesture ()" функц нь сүүлчийн дохиог шалгаж, "toggleColor" функцийг UP -DOWN дохио зангаа гэж нэрлэдэг эсвэл LEFT - RIGHT дохио "ledDirection" гэсэн хувьсагчийг тохируулдаг.

- "toggleColor ()" функц нь "colorSelection" нэртэй дэлхийн хувьсагчийг 0, 1, 2 утгуудын аль нэгээр нь өөрчилдөг.

- мөн үндсэн давталтын функц дотор "animateLeds ();" нэртэй өөр нэг функц байдаг. гэж нэрлэдэг. Энэ функц нь 100 миллисекунд өнгөрч байгаа эсэхийг шалгадаг бөгөөд хэрэв тийм бол "rotateLeds ()" функцийг ашиглан LED -ийг эргүүлж, дараа нь дахин зурдаг.

- "rotateLeds ()" нь "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}; # 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}; # дараа 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}; # гэх мэт

Үүний тулд эхлээд шинэ массив үүсгэж, хуучин удирдамжийн эрч хүчийг шинэ байрлалд хуулна (байрлалыг нэмэгдүүлэх эсвэл багасгах). Үүний дараа "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_NeOPE_NEOPE_NEOPE_ 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 ("Хөтөлбөр эхэлсэн"); strip.begin (); pinMode (APDS9960_INT, INPUT); attachInterrupt (0, interruptRoutine, FALLING); if (apds.init () && apds.enableGestureSensor (үнэн)) {Serial.println ("APDS-9960 эхлүүлэх ажил дууссан"); } else {Serial.println ("APDS-9960 эхлүүлэх явцад алдаа гарлаа!"); } lastLedChangeTime = millis (); 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 ("ДОО"); toggleColor (); завсарлага; тохиолдолд DIR_LEFT: ledDirection = 1; Serial.println ("Зүүн"); завсарлага; тохиолдолд DIR_RIGHT: ledDirection = -1; Serial.println ("ЗӨВ"); завсарлага; тохиолдолд DIR_FAR: ledDirection = 0; Serial.println ("FAR"); завсарлага; }} / ** * Одоогийн leds өнгийг өөрчлөх * Энэ функцийг дуудах бүрт leds төлөв өөрчлөгдөх болно * / void toggleColor () {if (colorSelection == 0) {colorSelection = 1; } if if (colorSelection == 1) {colorSelection = 2; } өөр {colorSelection = 0; }} / ** * Хөдөлгөөнт дүрс нь LED_SPEED_STEP_INTERVAL миллисийн дараа ажиллах болно * Эхлээд rotateLeds функцийг дуудаж, дараа нь LED өнгийг api * / void animateLeds () {if (millis () - lastLedChangeTime <LED_SPEED_STEP_INTERVAL) {буцах функцийг дуудна.; } rotateLeds (); for (int i = 0; i <NUM_LEDS; i ++) {strip.setPixelColor (i, getColor (ledStates ))); strip.show (); } lastLedChangeTime = millis (); } /** * Хоёрдогч "intermediateLedStates" массивыг ашиглан leds -ийн эрч хүчийг хөдөлгөдөг * Эхлээд "ledStates" -ээс авсан утгыг "intermediateLedStates" дээр хуулж авдаг. Тиймээс "ledStates" массивыг {100, 80, 60, 0 гэж үзье., 0, 0} ба ledDirection нь 1 * бөгөөд дараа нь энэ функцийг "ledStates" гэж нэрлэсний дараа эргэлтийн эффектийг дуурайсан массив нь {0, 100, 80, 60, 0, 0} юм/ void rotateLeds () {байт 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 ; } өөр {intermediateLedStates [i + 1] = ledStates ; }} өөр {if (i == 0) {intermediateLedStates [NUM_LEDS - 1] = ledStates ; } өөр {intermediateLedStates [i - 1] = ledStates ; }}} for (int i = 0; i <NUM_LEDS; i ++) {ledStates = intermediateLedStates ; }} uint32_t getColor (int intensivite) {шилжүүлэгч (colorSelection) {тохиолдол 0: буцах зурвас. Color (эрчим, 0, 0); тохиолдол 1: буцах зурвас Өнгө (0, эрчим, 0); анхдагч: буцах зурвас Өнгө (0, 0, эрч хүч); }}

Энэ нь танд таалагдсан гэж найдаж байна, та сэтгэгдлүүдийн хэсгийг ашиглан асуулт асууж болно.

Зөвлөмж болгож буй: