Мазмуну:

Жаңсоо сенсору менен Neopixel Led Ring башкаруу: 3 кадам (Сүрөттөр менен)
Жаңсоо сенсору менен Neopixel Led Ring башкаруу: 3 кадам (Сүрөттөр менен)

Video: Жаңсоо сенсору менен Neopixel Led Ring башкаруу: 3 кадам (Сүрөттөр менен)

Video: Жаңсоо сенсору менен Neopixel Led Ring башкаруу: 3 кадам (Сүрөттөр менен)
Video: 😱🤔сумдық/ Мынандай әйелге қандай жаза беру керек? Жаза кетіңіздер Коремиз ток шоу / Көреміз 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. neopixel шакегин нан тактасына бекитүү

3. APDS9960 сенсорун нан тактасына тиркеңиз

4. негиздерди туташтыруу: батарейка пакети, arduino UNO, APDS9960 жана неопиксел

5. кубаттуулукту туташтыруу: arduino UNO 3V APDS9960 кубатына, батарейка кубатына неопиксел

6. neopixel башкаруу пинин 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/дарак/мастер/долбоорлор/neopixel_ring_gestures

Кийинки бөлүмдө мен кодду түздөн -түз ушул үйрөткүчкө киргизем, андыктан кааласаңыз, аны ошол жерден көчүрүп, чаптаңыз.

Акырында, USB кабелин колдонуп, ардуинону компьютерге туташтырыңыз, 1,5 в батареяны батареяга салып, эскизин arduinoго жүктөңүз.

3 -кадам: Бул кантип иштейт?

Бул акыркы бөлүктө биз бул компоненттердин кантип бириктирилгенин, китепканаларын кантип колдонууну жана кодумду кантип түзгөнүмдү үйрөнөбүз:

Адегенде сенсор жана неопиксел китепканасынын API ыкмаларын колдонуп көрөлү

1. Adafruitтен Neopixel API

Бул китепканадан биз жеке LEDдин түсүн көзөмөлдөгөн жана колдонгон ыкмаларды колдонобуз

- китепкана кирет:

#кошуу

- китепкананы жарыялоо

#аныктоо NEOPIXED_CONTROL_PIN 6

#define NUM_LEDS 24 Adafruit_NeoPixel strip = 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, strip. Color (0, 255, 0)); # пиксел 2ди көк тилке кылып коюңуз.setPixelColor (2, strip. Color (0, 0 255)); strip.show ();

2. APDS 9960 жаңсоо сенсору

Бул китепканадан биз "жаңсоону окуу" функциясын колдонобуз. Бул функция сол-оң, өйдө-ылдый, жакын-алыс командаларды айырмалай алат. Бул жерде бир амал бар, биз сенсордон кабыл алынган акыркы жаңсоону үзгүлтүксүз сурабайбыз. Такта жаңсоо табылган үзгүлтүк аркылуу "пинг" жөндөмүнө ээ.

- неопикселге окшош китепкананы камтыйт

- китепкананын үзүлүү пинин жана үзгүлтүк туусун жарыялоо

#Define 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 () функциясы # ичинде керектүү иштетүүнү жасаңыз, андан кийин желекти баштапкы абалга келтирип, үзгүлтүккө бөлүүчү detachInterrupt (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 ("ТӨМӨН"); тыныгуу; case DIR_LEFT: Serial.println ("LEFT"); тыныгуу; учурда DIR_RIGHT: Serial.println ("ОҢ"); тыныгуу; Case DIR_FAR: Serial.println ("FAR"); тыныгуу; }}

Эми бүт кодду иш жүзүндө көрөлү:

Ошентип, мен жаңсоо сенсорунун жана неопикселдик шакектин негизги APIлерин түшүндүрдүм, эми келгиле, нерселерди чогулталы:

Алгоритм мындай иштейт:

- китепканаларды инициализациялоо (жогорудагы кодду караңыз)

- "ledStates" деп аталган интенсивдүүлүк массивин түзүңүз. Бул массивде 150дөн 2ге чейин төмөндөө иретинде жайгаштырылган 24 интенсивдүүлүк камтылган

- негизги циклдин ичинде үзүлүү пини өзгөртүлгөнүн текшериңиз, андыктан анимацияны же түсүн өзгөртүүгө убакыт келди

- "handleGesture ()" функциясы акыркы жаңсоону текшерет жана "toggleColor" функциясын UP -DOWN жаңсоолору үчүн чакырат же "ledDirection" глобалдык өзгөрмөсүн LEFT - RIGHT жаңсоолоруна коет

- "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}; # кийин 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 #define APDS9960_INT 2 #define LED_SPEED_STEP_INTERVAL 100 Adafruit_NeoPixel strip = Adafruit_NeOPE_NEOPE_NEOPE_N_ SparkFun_APDS9960 apds = SparkFun_APDS9960 (); белгисиз узак lastLedChangeTime = 0; кыска ledDirection = 0; short colorSelection = 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; } switch (apds.readGesture ()) {case DIR_UP: Serial.println ("UP"); toggleColor (); тыныгуу; учурда DIR_DOWN: Serial.println ("ТӨМӨН"); toggleColor (); тыныгуу; case DIR_LEFT: ledDirection = 1; Serial.println ("СОЛГО"); тыныгуу; case DIR_RIGHT: ledDirection = -1; Serial.println ("ОҢ"); тыныгуу; учурда DIR_FAR: ledDirection = 0; Serial.println ("FAR"); тыныгуу; }} / ** * Учурдагы LED түсүн өзгөртүү * Бул функция чакырылган сайын leds абалын өзгөртөт * / void toggleColor () {if (colorSelection == 0) {colorSelection = 1; } else if (colorSelection == 1) {colorSelection = 2; } else {colorSelection = 0; }} / ** * Анимация LED_SPEED_STEP_INTERVAL миллисинен кийин иштейт * Алгач rotateLeds функциясы чакырылат, андан кийин LED түсү api * / void animateLeds () {if (millis () - lastLedChangeTime <LED_SPEED_STEP_INTERVAL) {кайтаруу аркылуу чакырылат; } rotateLeds (); үчүн (int i = 0; i <NUM_LEDS; i ++) {strip.setPixelColor (i, getColor (ledStates ))); strip.show (); } lastLedChangeTime = миллис (); } /** * "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) {case 0: return strip. Color (интенсивдүүлүк, 0, 0); Case 1: return strip. Color (0, интенсивдүүлүк, 0); демейки: return strip. Color (0, 0, интенсивдүүлүк); }}

Бул сизге жакты деп үмүттөнөм, сиз мага суроолорду берүү үчүн комментарийлер бөлүмүн колдоно аласыз.

Сунушталууда: