Мазмуну:

IOT иштетилген 1 метр POV: 3 кадам (сүрөттөр менен)
IOT иштетилген 1 метр POV: 3 кадам (сүрөттөр менен)

Video: IOT иштетилген 1 метр POV: 3 кадам (сүрөттөр менен)

Video: IOT иштетилген 1 метр POV: 3 кадам (сүрөттөр менен)
Video: GEELY MONJARO СОСТОЯНИЕ ЧЕРЕЗ 7000км ПРОБЕГА / КАЧЕСТВО КИТАЙСКОЙ СБОРКИ И ОСНОВНЫЕ МОМЕНТЫ ИЗНОСА 2024, Ноябрь
Anonim
Image
Image
IOT иштетилген 1 метр POV
IOT иштетилген 1 метр POV
IOT иштетилген 1 метр POV
IOT иштетилген 1 метр POV
IOT иштетилген 1 метр POV
IOT иштетилген 1 метр POV

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

POV деген эмне

POV страны Persistence Of Vision Globe, ал адамдын көрүнүш кубулушуна байланыштуу. Жарык стимулу торчого кийинки эффект катары секундасынын 1/10 бөлүгүнө созулат. Жарык стимулдары бат -баттан тизмектелгенде, алар үзгүлтүксүз бир сүрөттөлүшкө биригишет. Чынында, бул кино жана телекөрсөтүү үчүн негиз,. POV мындай иллюзия жасайт (бизди алдайт) жана бир чекиттин же огунун тегерегиндеги LED чырактарын айлантуу менен сүрөттү түзүңүз

Долбоордун инновациясы деген эмне

Албетте POV жаңы идея эмес жана көптөгөн долбоорлор Instructables же башка сайттарда мурунтан эле бар, бирок бул долбоор негизинен MCU эсинен же SD картадан окулган статикалык ийбадаткананы же сүрөттү колдонот, бирок бул долбоордо биз кооз функцияларды колдонобуз. Бул маселеде ESP8266 сыяктуу IOT иштетилген чип.

Бул IOT өзгөчөлүктөрү менен биз

  1. жаңы сүрөттөрдү зымсыз эс тутумга оңой жүктөй алат
  2. каалаган сюжетти каалаган ырааттуулукта же каалаган убакытта түзүү
  3. чипти кайра программалоонун же эстутум картасын ажыратып, жаңы анимация үчүн кайра туташтыруунун кажети жок
  4. колдонуучуга ыңгайлуу IOT webhost ар бир адамга POVду мобилдик же планшет менен алыстан башкарууну жеңилдетет
  5. 30дан ашык ар кандай сүрөттөрдүн сыйымдуулугу менен өтө арзан баада аппараттык камсыздоо

POV кантип иштейт

POV дисплейлери, сызыктуу (1 өлчөмдүү) LED чырактары велосипед дөңгөлөгү сыяктуу бир чекиттин айланасында айланат. Алардын айлануу ылдамдыгын өлчөө жана жаркылдоолорун миллисекунддук тактык менен көзөмөлдөө менен биз 2 же 3 өлчөмдүү сүрөттөлүштүн абада калышын элестете алабыз. Келгиле, кандайдыр бир эффектин бир гана кадрын (сүрөт, текст, …) карап көрөлү, ар бир кадр көптөгөн пикселден турат, демек тегиздикте же тоголок аймакта көптөгөн сызыктардан турат, POV бул сүрөттү сүрөттүн бир сызыгы менен көрсөтөт, анын орду толтуруу үчүн айлануусу менен бирге өзгөрөт. бул сүрөт, ошондуктан көйгөй LED пикселинин түсүн убакыт жана мейкиндикте кантип так көзөмөлдөө керек, ошондо ал бүт сүрөттү POV түзө алат, айлануу огуна, эффект түрү көрсөтүлө алат жана канча түстү түзө алат.

Айналыштын ар кандай огу боюнча тегиз, цилиндрдик жана тоголок POV дисплейди чыгара алат

көптөгөн POV долбоорлору жөнөкөй бир түстүү LED же WS2812 же APA104 сыяктуу жогорку ылдамдыктагы акылдуу пикселдерди колдонушат жана бул долбоордо биз тез LED чип жаңыртуучу APA102ди дээрлик 16 МГц жаңыртуу ылдамдыгы менен колдонобуз. Бул LED чипинде көзөмөлдөө үчүн 2 линия бар (Жер, Маалымат, Саат, +5v)

1 -кадам: POV кантип түзүү керек

POV кантип курулат
POV кантип курулат
POV кантип курулат
POV кантип курулат
POV кантип курулат
POV кантип курулат

Башында мага POV хабын орнотуу үчүн структура керек, металл же металл эместигин жасоо колуңуздагы нерсеге жараша болот. Сиз муну дубалга орнотуу үчүн каалаган материал менен жасай аласыз же стенд жасоо үчүн бутун кошо аласыз. Менин досум жөнөкөй штативди жасап, 500 мн айланасындагы DC моторунун айлануусун азайтуу үчүн убакыт белдем механизмин орнотот. Кичинекей математика Так жана шайкеш сүрөткө ээ болуу үчүн, биз 20 кадрдын тегерегинде кадр сергитүүгө муктажбыз, бул так сүрөттүн болушун билдирет секундасына бир жолу, менин POV 1 диагоналдуу LED тилкесинен тургандыктан, ар бир кадр жарымы же айлануусу менен бүткөн, башкача айтканда, биз 600 айланасында идеалдуу хаб RPMге муктажбыз жана бул айлануу менен ар бир революция болжол менен 100 мс талап кылган. төмөнкү теңдеме RPM = (fps/Nb)*60 деген түшүнүктү көрсөтүп турат, бул Nb бутактын санына барабар, жана бул учурда бизде RPM = (20/2)*60 = 600мий POV 430 айлануу айланасында айланат, ошондо менин fps 15 fsp тегерегинде бул маселе боюнча абдан жакшы. Механикалык бөлүктү куруу

Кийинки кадамда мен LED тилкесин кармап туруу үчүн тегирменден жасалган PVC цилиндрин колдондум. Хабды чыгырык шахтасы менен туташтыруу үчүн, PCV бөлүгүнүн артына бир M10 болту болт менен бекитилген, эки вольт шакеги шкафтын валына орнотулган, 5 вольтту DC тактага жана LED тилкесине өткөрүп берүү үчүн, андан кийин төмөнкү сүрөттөр боюнча бул бөлүк жөнөкөй чыгырыкка орнотулган 12v DC моторуна туташкан убакыт берүү системасы, ар бир бөлүктүн өзүнүн электр энергиясы бар жана бутуна бекитилген ак кутуга салынган

2 -кадам: Программаны ишке ашыруу 1 -бөлүк

Программаны ишке ашыруу 1 -бөлүк
Программаны ишке ашыруу 1 -бөлүк

Берилген сүрөттү LED тилкесинде көрсөтүү үчүн, ар бир сүрөттү пикселдештирүү керек, андан кийин MCU эстутумуна жүктөлүп, андан кийин сызык боюнча LED тилкесине берилиши керек, бул үчүн мен эки башка платформа үчүн программалык камсыздоону түздүм, бири java иштөө убактысын иштетүүгө негизделген. жана башка C ++ тилинде MCUProcessing pixelized программасы бул программа Processing IDEде жазылган жана ал жөн гана сүрөт файлын ачат, андан кийин сүрөттүн пикселдүү сызыктарын чыгаруу үчүн аны этап менен айландырыңыз. Мен каалаган сүрөттү көрсөтүү үчүн 200 линияны тандап алам, ошондуктан мен сүрөттү артка бурам (360 /200=1.8 даража) 200 жолу чыгаруу үчүн 200 жолу. Менин LED тилкесим APA102 чипи бар 144 LEDден тургандыктан, бүтүндөй сүрөт 200*144 = 28800 пикселге ээ. APA102 чип дисплейиндеги ар бир түс 4 байт (W, RGB) менен болгондуктан, ар бир сүрөттүн өлчөмү так 200*144*4 = 115200 же 112.5KB Кийинки иштетүү коду сүрөттү пикселдештирүү ырааттуулугун көрсөтөт жана натыйжада кутуча кеңейтүүчү файл болот MCU эстутумуна жүктөлөт

PImage img, black_b, image_load; PrintWriter чыгаруу; int SQL; float led_t; байт pov_data; int line_num = 200; String _OUTPUT = "";

жараксыз орнотуулар ()

{selectInput ("Сүрөттү тандоо", "imageChosen"); noLoop (); күтүү (); }

жараксыз орнотуу ()

{чыгаруу = createWriter (_OUTPUT); black_b = createImage (SQL, SQL, RGB); black_b.loadPixels (); for (int i = 0; i = line_num) {noLoop (); output.flush (); output.close ();} background (black_b); pushMatrix (); imageMode (ЦЕНТР); которуу (SQL/2, SQL/2); айландыруу (радиандар (l*360/line_num)); сүрөт (img, 0, 0); popMatrix (); pushMatrix (); for (int i = 0; i <144; i ++) {color c = get (int (i*led_t+led_t/2), int (SQL/2)); output.print ((char) кызыл (c)+""+(char) жашыл (c)+""+(char) көк (c)); // басып чыгаруу ((char) кызыл (c)+""+(char) жашыл (c)+""+(char) көк (c)+";"); толтуруу (с); түз (i*led_t, (SQL/2)-(led_t/2), led_t, led_t); } // println (); popMatrix (); // кечиктирүү (500); l ++; }

void keyPressed ()

{output.flush (); // Калган маалыматтарды output.close () файлына жазат; // Файлды бүтүрөт чыгуу (); // Программаны токтотот}

void imageChosen (File f)

{if (f == null) {println ("Терезе жабылды же колдонуучу жокко чыгарылды."); exit (); } башка {эгер (f.exists ()) img = loadImage (f.getAbsolutePath ()); Сап s = f.getAbsolutePath (); String list = split (s, '\'); int n = list.length; String fle = split (тизме [n-1], '.'); println ("Файлды ач:"+fle [0]); _OUTPUT = fle [0]+". Bin"; // img = loadImage ("test.jpg"); int w = img.width; int h = img.height; SQL = макс (w, h); өлчөмү (SQL, SQL); led_t = SQL/144.0; println ("h ="+h+"w ="+w+"max ="+SQL+"size led ="+led_t); }} void mousePressed () {loop ();}

жараксыз маалымат ()

{байт b = loadBytes ("something.dat"); // Ар бир маанини 0ден 255ке чейин басып чыгарыңыз (int i = 0; i <b.length; i ++) {// Ар бир онунчу сан, эгер ((i % 10) == 0) println () жаңы сапты баштаса; // байттар -128ден 127ге чейин, бул 0дон 255ке которулат int a = b & 0xff; басып чыгаруу (a + ""); } println (); // аягында бош сапты басып жазыңыз saveBytes ("numbers.dat", b); } void wait () {while (img == null) {delay (200); } loop (); }

3 -кадам: Программаны ишке ашыруу 2 -бөлүк

Image
Image
Программаны ишке ашыруу 2 -бөлүк
Программаны ишке ашыруу 2 -бөлүк
Программаны ишке ашыруу 2 -бөлүк
Программаны ишке ашыруу 2 -бөлүк

MCU дисплей программасы

жогорку өндүрүмдүү ESP8266 чипи бир нече себептерден улам тандалып алынган, адегенде WiFi мүмкүнчүлүктөрүн колдонуу үчүн ачык SDK куралдарын жакшы иштеп чыгып, эс тутуму менен бирге колдонуучу үчүн веб-серверди жайгаштырат. Бул мүмкүнчүлүктөрү менен MCU эстутумуна пикселденген сүрөттү жүктөө жана көрсөтүү үчүн колдонуучу аныктоочу сценарийди түзүү үчүн иштелип чыккан колдонуучуга ыңгайлуу веб-сервер. 4 Mb ESP-12E сериясы менен биз программа үчүн 1 Мб жана сүрөттөр үчүн 3 Мб колдоно алабыз, анын өлчөмү 112.5KB болгон пикселдүү сүрөт үчүн биз MCUга 25 сүрөттү жүктөп алдык жана мен жүктөгөн сүрөт үчүн каалаган ырааттуулукту же каалаган мезгилди түзө алдык. Веб -серверди түзүү үчүн Arduino кодунун базасы. коддун циклинде төмөнкүдөй үч негизги функция бар

void loop () {if (! SHOW &&! TEST) server.handleClient (); if (SHOW) {if ((millis ()- OpenlastTime)> DURATION [image_index]*1000) {if (image_index> = IMAGE_NUM) image_index = 0; _memory_pointer = image_файлдын баштоо_адресси [image_index]; Serial.printf ("Файлдын номери =%u аты:%s дареги:%u узактыгы:%u / n", image_index, IMAGES [image_index].c_str (), start_address_of_imagefile [image_index], DURATION [image_index]); Current_imageLine = 0; image_index ++; OpenlastTime = миллис (); } if ((micros ()-lastLineShow)> lineInterval) {lastLineShow = micros (); ESP.flashRead (_memory_pointer, (uint32_t *) leds, NUM_LEDS *3); FastLED.show (); _memory_pointer+= (NUM_LEDS*3); Current_imageLine ++; кечигүү (LineIntervalDelay); } if (Current_imageLine> = IMAGES_LINES) {Current_imageLine = 0; _memory_pointer = start_address_of_imagefile [image_index-1]; }} optimistic_yield (1000); }

Server Handler server.handleClient (); webhost боюнча ар кандай кардарлардын суроо -талаптарын иштеп чыгууга жооптуу, бул веб -сайт маалыматтарды жүктөө үчүн каалагандай болушу мүмкүн, кандайдыр бир мамлекеттик отчеттун шоу орнотууларын өзгөртүү. Менин веб -хостум үч өтмөктөн турат, биринчи өтмөктө төмөнкү сүрөттөр бар, биз учурдагы сценарийди ар бир сүрөттүн ырааттуулугу жана узактыгы менен текшере алабыз, ошондой эле тармак маалыматы, ошондой эле POV rpm көрсөтүлгөн

жүктөө сүрөтү өтмөгүндө биз MCU эстутумуна пикселдүү сүрөттү жүктөп же белгилүү бир сүрөттү өчүрө алабыз

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

Сүрөттү жүктөөчү

Бул функция сервердин кардарынан Ajax тарабынан MCU эстутумуна пикселденген сүрөттү жүктөө, андан кийин файлды чийки форматта жазуу үчүн файлды мүмкүн болушунча тезирээк окуу. Эстутумдун башталышы жана аяктоо жайгашкан жери LED тилкесинде көрсөтүү үчүн столдо

Көрсөтүү функциясы

Мен FastLED libди LED тилкесинде пикселди көрсөтүү үчүн колдондум, бул китепкана AVR жана ESP платформасында LED шоу үчүн эң ийгиликтүү жана жакшы иштелип чыккан китептердин бири. Бул FastLED функциясын, сакталган LED пикселинин жайгашкан жерин жөн гана жөнөтүү керек. Биз саптан сапка чейин пикселди жатка окуп, аны LED тилкесинде көрсөтөбүз жана жаңы айлануу желегинин аткарылышын күтөбүз. бул ырааттуулукту ар бир сүрөттүн 200 сабы окулганга чейин кайталадык

бүт код бул жерде менин git репозиторийимде

Төмөндө мобилдик камера менен жазылган POV аракети видеосу жана мен түшүндүргөндөй, видеонун сапаты профессионалдуу эмес камеранын диафрагма ылдамдыгынан жакшы эмес

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