Мазмұны:

Қимыл сенсорымен неопиксельді сақинаны басқару: 3 қадам (суреттермен)
Қимыл сенсорымен неопиксельді сақинаны басқару: 3 қадам (суреттермен)

Бейне: Қимыл сенсорымен неопиксельді сақинаны басқару: 3 қадам (суреттермен)

Бейне: Қимыл сенсорымен неопиксельді сақинаны басқару: 3 қадам (суреттермен)
Бейне: How to use TM1637 4 digits seven segment display with Arduino 2024, Қараша
Anonim
Image
Image
Жинау және жүктеу
Жинау және жүктеу

Бұл оқулықта біз Arduino UNO көмегімен екеуін біріктіруді үйрену үшін қимыл сенсорымен (APDS-9960) және неопикселді сақинамен ойнаймыз.

Соңғы өнім оңға немесе солға бағытталған қозғалысты жандандыру арқылы солға - оңға, ал жарықтың түсін өзгерту арқылы жоғары - төмен қимылдарға жауап береді.

Келесі қадамдарда сіз бөлшектер тізімін және компоненттерді қалай қосу керектігін қысқаша қарастырасыз. Содан кейін біз оның қалай жұмыс істейтінін білу үшін кодты біртіндеп қарастырамыз.

1 -қадам: компоненттер

1. Arduino UNO

2. USB кабелі

3. APDS9960 қимыл сенсоры (https://www.sparkfun.com/products/12787)

4. 24 жарықдиодты неопиксельді сақина (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 сәйкесінше A4 және A5 қосылады

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

Келесі бөлімде мен кодты тікелей осы оқулыққа енгіземін, сондықтан егер қаласаңыз, оны сол жерден көшіріп, қоюға болады.

Соңында arduino компьютерін 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, strip. Color (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 (true)) {Serial.println («APDS-9960 инициализациясы аяқталды»); } else {Serial.println («APDS-9960 init кезінде бірдеңе дұрыс болмады!»); } # басқа заттарды инициализациялау мүмкін}

- үзіліс функциясын анықтаңыз, мұнда біз тек жалаушаны орнатамыз

void interruptRoutine () {

isr_flag = 1; }

- цикл функциясының ішінде белгі анықталғанын анықтау үшін жалаушаны мезгіл -мезгіл тексеріңіз

бос цикл ()

{ # егер жалаушаны тексеріңіз, егер (isr_flag == 1) { # егер жалау орнатылса, үзілісті алып тастаңыз, handleGesture () функциясының # ішінде қажетті өңдеуді жасаңыз, содан кейін жалаушаны қалпына келтіріңіз және үзіліс бөлігін қайта бекітіңізInterrupt (0); handleGesture (); isr_flag = 0; attachInterrupt (0, interruptRoutine, FALLING); } мұнда басқа # код болуы мүмкін}

- соңғы қимылды сұрай алатын handleGesture () функциясын анықтаңыз

void handleGesture () {

# егер ешқандай қимыл жоқ болса, бұл қауіпсіз тексеру, егер (! apds.isGestureAvailable ()) {return; } # соңғы қимылды оқиды, белгілі белгілермен салыстырады және хабар қосқышын басып шығарады (apds.readGesture ()) {case DIR_UP: Serial.println («UP»); үзіліс; жағдай DIR_DOWN: Serial.println («ТӨМЕН»); үзіліс; жағдай DIR_LEFT: Serial.println («LEFT»); үзіліс; жағдай DIR_RIGHT: Serial.println («ОҢ»); үзіліс; жағдай DIR_FAR: Serial.println («FAR»); үзіліс; }}

Енді бүкіл кодты әрекетте көрейік:

Мен қимыл сенсоры мен неопиксель сақинасының негізгі API -ін түсіндірдім, енді бәрін біріктірейік:

Алгоритм келесідей орындалады:

- кітапханаларды инициализациялау (жоғарыдағы кодты қараңыз)

- «ledStates» деп аталатын қарқынды жарық диапазонын құру. Бұл массивте 150 -ден 2 -ге дейін кему ретімен реттелген 24 жарық күші болады

- негізгі цикл ішінде үзіліс түйреуішінің өзгертілгенін тексеріңіз, егер жарық диодты анимациясын немесе түсін өзгерту уақыты келді

- «handleGesture ()» функциясы соңғы қимылды тексереді және «toggleColor» функциясын UP -DOWN қимылдары үшін шақырады немесе LEFT - RIGHT қимылдары үшін «ledDirection» жаһандық айнымалы мәнін орнатады.

- «toggleColor ()» функциясы «colorSelection» деп аталатын жаһандық айнымалы мәнді 0, 1, 2 мәндерінің бірімен өзгертеді.

- сонымен қатар негізгі цикл функциясының ішінде «animateLeds ();» деп аталатын басқа функция. аталады. Бұл функция 100 миллисекунд өткенін тексереді, егер солай болса, «rotateLeds ()» функциясын қолдана отырып, шамдарды бұрады, содан кейін оларды қайта сызады.

- «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}; # 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}; # және тағы басқа

Бұл үшін алдымен жаңа массив жасалады және жаңа позицияларға ескі светодиодты көшіреді (орынды жоғарылату немесе азайту). Осыдан кейін ол «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_N_ SparkFun_APDS9960 apds = SparkFun_APDS9960 (); белгісіз ұзақ lastLedChangeTime = 0; қысқа ledDirection = 0; қысқа түсSelection = 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 (true)) {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; } / ** * Бұл APDS9960 сенсорының қимылдарын өңдейді * Жоғары және төмен қимылдары toggleColor функциясына қоңырау шалады * Сол және оң қимылдар жетекші анимацияны өзгертеді * / void handleGesture () {if (! Apds.isGestureAvailable ()) {return; } қосқыш (apds.readGesture ()) {жағдай DIR_UP: Serial.println («ЖОҒАРЫ»); 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 күйін өзгертеді * / void toggleColor () {if (colorSelection == 0) {colorSelection = 1; } else 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» қосалқы массивін қолдана отырып, жарық қарқындылығы анимацияланады * Алдымен «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; } үшін (int i = 0; i <NUM_LEDS; i ++) {if (ledDirection == 1) {if (i == NUM_LEDS -1) {intermediateLedStates [0] = ledStates ; } else {intermediateLedStates [i + 1] = ledStates ; }} else {if (i == 0) {intermediateLedStates [NUM_LEDS - 1] = ledStates ; } else {intermediateLedStates [i - 1] = ledStates ; }}} үшін (int i = 0; i <NUM_LEDS; i ++) {ledStates = intermediateLedStates ; }} uint32_t getColor (int intensity) {switch (colorSelection) {0 жағдай: қайтару жолағы. Color (қарқындылығы, 0, 0); 1 -жағдай: қайтару жолағы. Түс (0, қарқындылық, 0); әдепкі: қайтару жолағы. Color (0, 0, қарқындылығы); }}

Сізге бұл ұнады деп үміттенемін, сіз маған сұрақтар қою үшін түсініктеме бөлімін пайдалана аласыз.

Ұсынылған: