Мазмуну:

Fancy LED Hat: 5 кадам (Сүрөттөр менен)
Fancy LED Hat: 5 кадам (Сүрөттөр менен)

Video: Fancy LED Hat: 5 кадам (Сүрөттөр менен)

Video: Fancy LED Hat: 5 кадам (Сүрөттөр менен)
Video: Титаниктин сыры: кантип алар айсбергди байкабай калышты?! Эң деталдуу окуя! 2024, Ноябрь
Anonim
Image
Image
Fancy LED Hat
Fancy LED Hat

Мен ар дайым Arduino долбоорун кылгым келген, бирок менин үй -бүлөм кооз шляпа кечесине чакырылганга чейин эч кандай сонун идея болгон эмес. Эки жумалык убакытта, мен кыймылга сезгич LED анимациялык шляпаны пландаштырып, аткара аламбы деп кызыгып көрдүм. Мен алат экенмин! Мен, балким, бир аз чектен чыгып кеттим, бирок долбоордун жалпы баасы 80 доллардын тегерегинде. Эксперимент жана кээ бир коддоо менен сиз муну азыраак кыла аласыз.

Шляпа менен максат төмөнкүчө болгон:

  1. Чырактардын топтому шляпанын борбордук алдыңкы бөлүгүнөн арт жагына жылдырылсын, ар тараптан бирден жарык
  2. Калпактын алдыңкы артка эңкейиши менен шартталган жарыктын ылдамдыгын өзгөртүү
  3. Калпак тилкеси ылдый эңкейгенде, жарыктын тескери болушуна уруксат бериңиз (башкача айтканда, гравитациянын жарыкка болгон таасирин туураңыз)
  4. Калпактын солдон оңго кыйшайышына жараша түсүн өзгөртүү
  5. Шок сезимдер жана өзгөчө эффект көрсөтөт
  6. Кийип бараткан кишини сезип, өзгөчө эффект көрсөтүңүз
  7. Толугу менен шляпада камтылган

1 -кадам: Тетиктер керек

Тетиктер керек
Тетиктер керек
Тетиктер керек
Тетиктер керек
Тетиктер керек
Тетиктер керек

Мен төмөнкү негизги компоненттерди колдондум (өнөктөш эмес Amazon шилтемелери камтылган):

  • Teensy LC микроконтроллери - Мен муну кичинекей өлчөмүнө байланыштуу кадимки Arduino компаниясынан тандап алдым жана ал менин светодиоддорумду көзөмөлдөө үчүн атайын туташууга ээ, ошондой эле күчтүү китепкана жана коомчулуктун колдоосу.
  • Bosch BNO055 негизделген позициялык сенсор - чынын айтсам, мен документтерди биринчилерден болуп таптым. Кымбатыраак варианттар бар, бирок сиз Boschту түшүнгөнүңүздөн кийин ал сиз үчүн көп нерсени жасайт, антпесе сиз коддо кылышыңыз керек болот
  • WS2812 даректүү LED тилкеси - Мен метрине 144 LED менен 1 метр узундукту тандадым. Бул тыгыздыктын болушу жарыктын жеке элементтердин ирети менен жарык болушуна эмес, кыймылдап бараткандай көрүнүшүнө жардам берет.

Жана төмөнкү майда компоненттер:

  • Шляпа - калпакчасы бар каалаган баш кийим жасайт. Бул жергиликтүү дүкөндөн 6 долларлык баш кийим. Эгерде анын артында тигиш болсо, анда зымдарды өткөрүү оңой болот. Шляпалар тобу жабыштырылган болсо, көңүл буруңуз, анткени бул дагы кошумча кыйынчылыктарды жаратат. Бул үстү боюнча тигилет, бирок асты оңой тартылат.
  • 4.7K Ом резисторлору
  • 3x AAA батарейка корпусу - 3 ААА батарейкасын колдонуу чыңалууну электроника каалаган диапазондо чыгарат, бул нерселерди жөнөкөйлөтөт. AAA шляпага ААга караганда оңой батат жана дагы эле сонун иштөө убактысына ээ.
  • Чакан өлчөөчү зым - Мен мурунку LED долбоорунан тегеректелген катуу зымды колдондум.
  • Лампочка жана ширетүүчү
  • Калпактын жана жиптин ички түсүнө дал келген кээ бир спандекс

Сунушталат, бирок милдеттүү эмес:

  • Батарея зымдары үчүн тез туташтыргычтар
  • Жардам колу куралы, бул нерселер абдан кичинекей жана ширетүү кыйын

2 -кадам: Калпакты өзгөртүү

Шляпаны өзгөртүү
Шляпаны өзгөртүү
Шляпаны өзгөртүү
Шляпаны өзгөртүү
Шляпаны өзгөртүү
Шляпаны өзгөртүү
Шляпаны өзгөртүү
Шляпаны өзгөртүү

Сизге электрониканы орнотуу үчүн шляпада жана батарея үчүн орун керек болот. Жубайым кийим менен кесипкөй иштейт, ошондуктан мен андан кеңеш жана жардам сурадым. Биз спандекс менен эки чөнтөк түзүп бүттүк. Биринчи кичинекей чөнтөк шляпанын өзүнө окшош, ошондуктан электроника орнотулганда позициялык сенсор жетишерлик жакшы кармалып турат, бирок керек болсо оңой эле алынып салынат. Экинчи чөнтөк арткы бетине батарейканы кармоо болуп саналат.

Чөнтөктөр шляпанын түсүнө дал келген жип менен себилген, баары узун таажы сызыгы. Шляпа жана материалдардын стилине жараша бул техника менен YMMVден жасалат.

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

Акыры биз топу менен жабылган калпактын артындагы тигүүнү ачтык. Биз LED менен келген зымдарды ошол тигиш аркылуу тыкканбыз жана тилкенин биринчи диодун тигишке такап койгонбуз. Биз андан кийин LED ди шляпага ороп, тилкени кесип салдык, ошондо акыркы LED биринчисинин жанында болот. Жарык диодду шляпа менен эле кармаса болот, бирок сиздин диапазонуңузга жана материалыңызга жараша LEDди тигүү же жабыштыруу менен камсыз кылуу керек болушу мүмкүн.

3 -кадам: Wire It Up

Wire It Up
Wire It Up

Teensy тактасы жана светодиод 3.3vдан 5vга чейин каалаган жерде иштейт. Ушул себептен улам мен 3 ААА батарейкасын колдонууну чечтим, 4.5в чыгуучу чыңалуу ошол диапазондо жакшы, жана аларда светодиоддордун иштешин программалоо үчүн көп убакыт бар. Сиз 8 сааттан ашык иштөө мүмкүнчүлүгүнө ээ болушуңуз керек.

Бийликке зым тартуу

Батарея кутусунан жана диоддордон оң жана терс коргошундарды зым менен бириктирип, андан кийин тийиштүү жерлерде өспүрүмдөргө коштум. Батареядан алынган позитив диаграммада Teensyдин жогорку оң казыгына туташтырылышы керек (такта Вин деп белгиленген) жана терс GND деп белгиленген каалаган пинге туташтырылышы мүмкүн. Ыңгайлуу түрдө тактайдын карама -каршы жагында же Вин пининин жанында болот. Тактайдын толук диаграммасын ушул беттин ылдый жагында тапса болот. Ал эми кээ бир учурларда тактайга буйрутма бергенде кагаздын көчүрмөсү кошулат.

Эгерде сиз бир эле учурда бир нече светодиод күйгүзүлгөн кодду иштетүүнү пландап жатсаңыз, 3.3v өндүрүшүн жана GNDди колдонуу менен LEDди Teensy'ден өзүңүз иштете аласыз, бирок эгер сиз өтө эле көп күчтү тартып алууга аракет кылсаңыз тактага зыян келтирүү. Ошентип, өзүңүзгө эң көп варианттарды берүү үчүн, LEDди батарея булагыңызга түз зым менен байлаганыңыз оң.

Светодиоддорду зымга туташтыруу

Мен бул долбоор үчүн Teensy LCди тандадым, анткени анын пини бар, ал даректүү светодиоддорду туташтырууну бир топ жеңилдетет. Тактанын ылдый жагында Pin 17 айнек сол күзгүдөн экинчи, бирок 3.3v да бар. Бул тартылуу деп аталат жана башка такталарда сиз бул чыңалууну камсыз кылуу үчүн резисторго зым тартууга туура келет. Teensy LC учурда, сиз ошол пинден түз эле сиздин LED маалымат зымыңызга өткөрө аласыз.

Позициянын сенсорун туташтыруу

Кээ бир BNO055 такталары чыңалууга караганда бир кыйла катаал жана 3.3v гана келет. Ушундан улам, мен BNO055 тактасындагы Винди Teensyдеги 3.3v арналган чыгармадан өткөрдүм, бул оң жакта 3 -пин. Андан кийин BNO055теги GNDди Teensyдеги каалаган GNDге туташтырсаңыз болот.

BNO055 позиция сенсору Teensy менен сүйлөшүү үчүн I2cти колдонот. I2c тартууну талап кылат, ошондуктан мен Teensyдеги 3.3v чыгарылышынан эки 4.7K ом резисторун 18 жана 19-казыктарга туташтырдым. Мен 19-пинди BNO055 тактасындагы SCL төөнөгүчүнө жана 18 SDA пинине туташтырдым.

Кабелдик кеңештер/амалдар

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

Катуу зым менен иштөө кыйыныраак болушу мүмкүн, анткени ал ийилген бойдон калгысы келет. Бирок бул долбоор үчүн бул артыкчылык болгон. Мен зымдарымды позициялоочу сенсордун багыты ырааттуу болуп тургандай кылып кесип, калыпка келтирип, программалоо үчүн шапкадан электрониканы алып салдым.

4 -кадам: Программалоо

Эми баары чогулган соң сизге Arduino менен шайкеш программалоо куралы керек болот. Мен чыныгы Arduino IDE колдондум (Linux, Mac жана PC менен иштейт). Ошондой эле Teensyduino программасы Teensy тактасы менен иштөө үчүн керек болот. Бул долбоор LEDлердин түсүн жана жайгашуусун программалоо үчүн FastLED китепканасын катуу колдонот.

Калибрленүүдө

Биринчи кылгыңыз келген нерсе - BNO055 үчүн Крис Винердин мыкты GitHub репозиторийине барып, анын BNO_055_Nano_Basic_AHRS_t3.ino эскизин жүктөп алуу. Бул кодду Serial Monitor иштеп турганда орнотуңуз, ал BNO055 тактасы онлайнга туура келип, өзүн -өзү текшерүүдөн өткөнүн айтып берет. Бул ошондой эле сизге BNO055ти калибрлөөдөн өтөт, бул сизге кийинчерээк ырааттуу жыйынтыктарды берет.

Fancy LED эскизин баштоо

Fancy LED шляпасынын коду атайын тиркелет, ошондой эле менин GitHub репозиторийимде. Мен кодго дагы көптөгөн өзгөртүүлөрдү киргизүүнү пландап жатам жана алар GitHub репо -журналына жайгаштырылат. Бул жердеги файл бул Нускама басылып чыккан кездеги кодду чагылдырат. Жүктөө жана эскизди ачкандан кийин, сиз өзгөртө турган бир нече нерсе бар. Өзгөртүү үчүн маанилүү баалуулуктардын көбү #define билдирүүлөрүнүн эң башында турат:

24 -сап: #аныктоо NUM_LEDS 89 - муну сиздин LED тилкесиңиздеги чыныгы LED санына өзгөртүңүз

28 -сап: #define SERIAL_DEBUG false - балким сиз муну чындыкка айландыргыңыз келет, ошондо сиз сериялык монитордо чыгууну көрө аласыз

Позицияны аныктоо коду

Позицияны аныктоо жана сиздин оңдоп -түзөөңүздүн көбү 742 -саптан башталат жана 802 аркылуу өтөт. Биз позиция сенсорунан Pitch, Roll жана Yaw маалыматтарын алабыз жана аны баалуулуктарды коюу үчүн колдонобуз. Электрондук жабдууларыңыздын орнотулушуна жараша буларды өзгөртүү керек болушу мүмкүн. Эгерде сиз позициянын сенсорун чип менен шляпанын чокусуна карай орнотсоңуз жана такта басылган Xтин жанындагы жебе шляпанын маңдайына багытталган болсо, сиз төмөнкүлөрдү көрүшүңүз керек:

  • Пит башыңды ийкеп жатат
  • Ролл сенин башыңды ийип жатат, мис. кулагыңды ийиниңе тийгиз
  • Yaw кайсы багытта. сиз туш болуп жатасыз (Түндүк, Батыш ж. б.).

Эгерде тактаңыз башка багытта орнотулган болсо, анда алар сиз каалагандай жүрүшү үчүн Pitch/Roll/Yaw алмаштырышыңыз керек болот.

Roll орнотууларын тууралоо үчүн төмөнкү #define баалуулуктарды өзгөртө аласыз:

  • ROLLOFFSET: шляпаңыз туруктуу жана мүмкүн болушунча борборлоштурулган, эгер Roll 0 болбосо, муну айырмасы менен өзгөртүңүз. Башкача айтканда эгер сиз шляпаңыз ортолоп калганда -20да Роллду көрүп жатсаңыз, анда муну 20 кылыңыз.
  • ROLLMAX: Roll өлчөө үчүн колдонула турган максималдуу балл. Калпакты кийүү жана оң кулагыңызды оң ийниңизге карай жылдыруу аркылуу табуу эң оңой. Бул үчүн сериялык мониторду колдонуу үчүн узун USB кабели керек болот.
  • РОЛЛМИН: Roll өлчөө үчүн колдонулуучу эң төмөнкү маани, башыңызды солго кыйшайтуу үчүн

Ошо сыяктуу эле, Pitch үчүн:

  • MAXPITCH - сиз издеп жүргөндө эң чоң мааниси
  • MINPITCH - ылдый карап турганда минималдуу мааниси
  • PITCHCENTER - сиз алдыга карай умтулуунун мааниси

Эгерде сиз SERIALDEBUG файлдын жогору жагында true деп койсоңуз, бул баалуулуктарды өзгөртүүгө жардам берүү үчүн сериялык мониторго Roll/Pitch/Yaw чыгаруу үчүн учурдагы маанилерди көрүшүңүз керек.

Башка параметрлерди өзгөрткүңүз келиши мүмкүн

  • MAX_LED_DELAY 35 - LED бөлүкчөсү эң жай кыймылдай алат. Бул миллисекундтарда. Бул сапта бир LEDтен экинчисине өтүүнүн кечигиши.
  • MIN_LED_DELAY 10 - LED бөлүкчөсү кыймылдай ала турган орозо. Жогоруда айтылгандай, миллисекундтарда.

Жыйынтык

Эгерде сиз бул жерге чейин барсаңыз, сизде толук кандуу иштеши керек, жана кызыктуу, LED шляпа! Эгерде сиз муну менен көбүрөөк иш кылгыңыз келсе, кийинки бетте жөндөөлөрдү өзгөртүү жана өзүңүздүн нерселериңиз боюнча кээ бир өркүндөтүлгөн маалыматтар бар. ошондой эле менин кодумдун калган бөлүгүнүн эмне кылып жатканын түшүндүрүп берүү.

5 -кадам: Өркүндөтүлгөн жана кошумча: Кодекстин ичинде

Таасирди жана айланууну аныктоо

Таасирди/айланууну аныктоо BNO055тин жогорку G сенсорунун функцияларын колдонуу менен жүргүзүлөт. Сиз анын сезгичтигин initBNO055 () ичиндеги төмөнкү саптар менен өзгөртө аласыз:

  • Линия #316: BNO055_ACC_HG_DURATION - иш -чара канча убакытка созулушу керек
  • Линия #317: BNO055_ACC_HG_THRESH - таасири канчалык оор болушу керек
  • Линия #319: BNO055_GYR_HR_Z_SET - айлануу ылдамдыгынын босогосу
  • Сап #320: BNO055_GYR_DUR_Z - айлануу канчага чейин созулушу керек

Экөөнүн тең мааниси 8 бит экилик, учурда таасири B11000000 деп коюлган, бул 255тин 192си.

Таасир же айлануу аныкталганда, BNO055 циклдин башында код издей турган маанини коет:

// Ишке киргизилген ар кандай үзгүлтүктөрдү табыңыз, башкача айтканда, G байт intStatus = readByte (BNO055_ADDRESS, BNO055_INT_STATUS); if (intStatus> 8) {Impact (); } else if (intStatus> 0) {spin (); }

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

Жардамчылар

Мен бардык светодиоддорду бир түскө тез орнотуу үчүн жөнөкөй жардамчы функциясын (void setAllLeds ()) түздүм. Алардын баарын өчүрүү үчүн колдонуңуз:

setAllLeds (CRGB:: Кара);

Же FastLED китепканасы тарабынан таанылган каалаган түстү тандай аласыз:

setAllLeds (CRGB:: Кызыл);

Бардык светодиоддорду 25%га өчүрө турган fadeAllLeds () функциясы дагы бар.

Particle классы

Электр өткөргүчтөрүн абдан жөнөкөйлөтүү үчүн, мен бир диоддук диодду колдонгум келди, бирок аларды бир нече жип сыяктуу алып жүрүү. Бул менин биринчи аракетим болгондуктан, мен аны мүмкүн болушунча жөнөкөй кармагым келди, ошондуктан мен бир жипти экиге бөлүп карайм, ал жерде ортоңку LED (лар) бар. Бизде жуп сан же так сан болушу мүмкүн болгондуктан, биз муну эсепке алышыбыз керек. Мен кээ бир глобалдык өзгөрмөлөрдөн баштайм:

/ * * Өзгөрмөлөр жана LED үчүн контейнерлер */ CRGB leds [NUM_LEDS]; статикалык белгисиз int curLedDelay = MAX_LED_DELAY; static int centerLed = NUM_LEDS / 2; static int maxLedPos = NUM_LEDS / 2; static bool oddLeds = 0; статикалык боль бөлүкчөсүDir = 1; static bool speedDir = 1; unsigned long dirCount; кол коюлбаган узун hueCount;

Жана орнотуудагы кээ бир коддор ():

if (NUM_LEDS % 2 == 1) {oddLeds = 1; maxLedPos = NUM_LEDS/2; } else {oddLeds = 0; maxLedPos = NUM_LEDS/2 - 1; }

Эгерде бизде так сандар болсо, анда биз 1/2 чекитти ортодо колдонууну каалайбыз, антпесе биз 1/2 чекитти каалайбыз - 1. Бул 10 же 11 диод менен көрүүгө оңой:

  • 11 светодиоддор: 11/2 бүтүн сандар менен 5ке чейин бааланышы керек, ал эми компьютерлер болсо 0дөн баштап. Ошентип 0 - 4 - жарымы, 6 - 10 экинчи жарымы жана 5 алардын ортосунда. Биз бул учурда #5ке экөөнүн бир бөлүгү сыяктуу мамиле кылабыз, б.а. ал LEDлердин виртуалдык саптары үчүн #1.
  • 10 светодиод: 10/2 - 5. Бирок компьютерлер 0дөн баштап эсептегендиктен, биз бирин алып салышыбыз керек. Андан кийин бизде бир жарымга 0 - 4, экинчисине 5 - 9. Биринчи виртуалдык сап үчүн #1 4 болот, ал эми экинчи виртуалдык сап үчүн #1 #5 болот.

Андан кийин бөлүкчө кодубузда биз жалпы позициябыздан LED сызыгындагы чыныгы позицияларга чейин бир аз саноо керек:

if (oddLeds) {Pos1 = centerLed + CurrPos; Pos2 = centerLed - CurrPos; } else {Pos1 = centerLed + CurrPos; Pos2 = (centerLed -1) - CurrPos; }

Коддо бөлүкчө багытын өзгөртө турган шарттар да бар, ошондуктан биз муну да эске алышыбыз керек:

if (particleDir) {if ((CurrPos == NUM_LEDS/2) && oddLeds) {CurrPos = 0; } else if ((CurrPos == NUM_LEDS/2 - 1) && (! oddLeds)) {CurrPos = 0; } else {CurrPos ++; }} башка {эгер ((CurrPos == 0) && oddLeds) {CurrPos = centerLed; } else if ((CurrPos == 0) && (! oddLeds)) {CurrPos = centerLed - 1; } else {CurrPos--; }}

Ошентип, биз каалаган багытты (particleDir) колдонобуз, андан кийин кайсы LED күйүшү керек экенин эсептейбиз, бирок биз LED сызыгынын чыныгы учуна же борбордук чекитке жеткенибизди да эске алышыбыз керек, ал дагы бир чекиттин ролун аткарат. виртуалдык саптардын ар бири.

Мунун баарын түшүнгөндөн кийин, биз кийинки жарыкты зарылдыгына жараша күйгүзөбүз:

if (particleDir) {if (oddLeds) {Pos1 = centerLed + CurrPos; Pos2 = centerLed - CurrPos; } else {Pos1 = centerLed + CurrPos; Pos2 = (centerLed -1) - CurrPos; }} башка {эгер (oddLeds) {Pos1 = centerLed - CurrPos; Pos2 = centerLed + CurrPos; } else {Pos1 = centerLed - CurrPos; Pos2 = (centerLed -1) + CurrPos; }} leds [Pos1] = CHSV (CurrHue, 255, 255); leds [Pos2] = CHSV (CurrHue, 255, 255); FastLED.show ();}

Эмне үчүн бул таптакыр класс? Кандай болсо, бул абдан жөнөкөй жана класста болуунун кажети жок. Бирок менде келечекте коддорду жаңыртуу пландары бар, алар бир эле учурда бир нече бөлүкчөлөрдүн пайда болушуна мүмкүндүк берет жана кээ бирлери тескерисинче иштешет, ал эми башкалары алдыда. Мен бир нече бөлүкчөлөрдүн жардамы менен айланууну аныктоо үчүн чоң мүмкүнчүлүктөр бар деп ойлойм.

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