IOT yoqilgan 1 metrli POV: 3 qadam (rasmlar bilan)
IOT yoqilgan 1 metrli POV: 3 qadam (rasmlar bilan)
Anonim
Image
Image
IOT yoqilgan 1 metrli POV
IOT yoqilgan 1 metrli POV
IOT yoqilgan 1 metrli POV
IOT yoqilgan 1 metrli POV
IOT yoqilgan 1 metrli POV
IOT yoqilgan 1 metrli POV

Ushbu loyiha haqida tushuntirishni boshlashdan oldin, past sifatli tasvir va video uchun uzr so'rayman, lekin rostini aytsam, mening mobil kameram kabi oddiy kamera bilan POVni ishga tushirishdan aniq va aniq tasvirni olish juda qiyin. Haqiqiy harakatni olish uchun unga juda tez diafragma optik linzalari kerak, lekin men oxir -oqibat CANON kameramni sotib olsam, yaxshiroq videoni yuklayman.

POV nima

"POV" - "Persistence Of Vision Globe" degan ma'noni anglatadi, bu inson ko'rish hodisasi bilan bog'liq. Yorug'lik to'r pardasiga sekundning 1/10 qismigacha ta'sir qiladi. Yorug'lik stimullari ketma -ket ketma -ketlikda joylashtirilsa, ular uzluksiz bitta tasvirga birlashadi. Aslida, bu kino va televizion qurilmalar uchun asosdir. POV bunday xayolotni yaratadi (bizni aldaydi) va LED chiroqlarini bitta nuqta yoki o'q atrofida aylantirish orqali tasvirni yarating.

Loyiha yangiliklari nima

Albatta, POV - bu yangi g'oya emas va ko'plab loyihalar Instructables -da yoki boshqa saytlarda mavjud, lekin bu loyihada asosan oldindan o'rnatilgan statik ma'bad yoki rasm ishlatiladi, ular asosan MCU xotirasidan yoki SD -kartadan o'qiladi, lekin bu loyihada biz chiroyli xususiyatlardan foydalanamiz. Bu borada ESP8266 kabi IOT yoqilgan chip.

Bu IOT xususiyatlari bilan biz

  1. yangi tasvirlarni xotiraga simsiz yuklashi mumkin
  2. har qanday ketma -ketlik yoki istalgan davomiylik bilan tasvirni ko'rsatishning ssenariysini yaratish
  3. chipni qayta dasturlash yoki xotira kartasini ajratish va yangi animatsiya uchun uni qayta ulashning hojati yo'q
  4. foydalanuvchilarga qulay bo'lgan IOT veb -xosti har bir kishiga POVni mobil yoki planshet yordamida masofadan turib boshqarishni osonlashtiradi
  5. 30 dan ortiq turli xil tasvirlar bilan jihozlangan juda arzon uskunalar

POV qanday ishlaydi

POV displeylari, chiziqli (1 o'lchovli) LED chiroqlari velosiped g'ildiragi kabi bitta nuqta atrofida aylanadi. Ularning aylanish tezligini o'lchab, miltilligini aniqlik bilan miltilligini nazorat qilib, biz havoda 2 yoki 3 o'lchovli tasvirning illyuziyasini yaratishimiz mumkin. Keling, har qanday effektning bitta ramkasini (rasm, matn, …) ko'rib chiqaylik, har bir kvadrat ko'p pikselli va shuning uchun tekislik yoki sferik sohadagi ko'plab chiziqlardan iborat bo'lib, POV bu tasvirni bitta rasmli chiziq bilan ko'rsatadi, uning o'rnini o'zgartirish uchun aylanishi bilan birga o'zgartiriladi. bu tasvir, shuning uchun muammo shundaki, LED piksel rangini vaqt va makonda qanday aniq boshqarish kerak, shunda POV butun tasvirni yaratishi mumkin, aylanish o'qi bo'yicha tasniflanadi, effekt turi ko'rsatilishi va qancha rang yaratilishi mumkin.

Har xil aylanish o'qi bo'yicha tekis, silindrsimon va sferik POV displeyini ishlab chiqarish mumkin

ko'p POV loyihalari WS2812 yoki APA104 kabi oddiy bitta rangli LED yoki yuqori tezlikli aqlli piksellardan foydalanadi va biz ushbu loyihada AP102 LED-chipini yangilash tezligini deyarli 16 MGts atrofida ishlatamiz. bu LED chipida nazorat qilish uchun 2 ta chiziq mavjud (er, ma'lumotlar, soat, +5v)

1 -qadam: POVni qanday yaratish kerak

POVni qanday yaratish kerak
POVni qanday yaratish kerak
POVni qanday yaratish kerak
POVni qanday yaratish kerak
POVni qanday yaratish kerak
POVni qanday yaratish kerak

Avvaliga men POV uyasini o'rnatish uchun strukturaga muhtojman, metall yoki metall bo'lmagan konstruktsiyani yaratish sizning qo'lingizda bo'lgan narsalarga bog'liq. Siz uni devorga o'rnatish uchun har qanday mavjud materialdan yasashingiz yoki stend qilish uchun oyoq qo'shishingiz mumkin. Do'stim oddiy shtativni ishlab chiqaradi va doimiy dvigatelning aylanish tezligini 500 atrofida kamaytirish uchun vaqt kamarining mexanizmini o'rnatadi. Kichik matematika. Aniq va izchil tasvirga ega bo'lish uchun biz 20 kadr / s atrofida kadrni yangilashimiz kerak, biz aniq tasvirga ega bo'lishimiz kerak, biz uni 20 ga yaqin qayta -qayta ko'rsatishimiz kerak. sekundiga bir marta, mening POV 1 diagonalli LED tasmasidan iborat, shuning uchun har bir ramka yarmi yoki aylanishi bilan to'ldirilgan, boshqacha aytganda, biz ideal aylanish tezligiga 600 ga yaqin aylanishimiz kerak va bu aylanish bilan har bir aylanish taxminan 100 msni tashkil etdi. Quyidagi tenglama RPM = (fps/Nb)*60 kontseptsiyasini ko'rsatadi, bu Nb filial soniga teng va bu holda bizda RPM = (20/2)*60 = 600m POV 430 rpm atrofida aylanadi, shuning uchun mening fps 15 fsp atrofida bu masalada juda yaxshi. Mexanik qismni qurish

Keyingi bosqichda men LED chiziqni ushlab turish uchun Milling PVX silindridan foydalanardim. Xubni kasnaq miliga ulash uchun bitta M10 murvat PCV qismining orqa tomoniga mahkamlangan, shkaf miliga o'rnatilgan 5 tupli halqa 5 voltli shaharni taxtaga va LED tasmasini uzatish uchun, keyin quyidagi rasmga ko'ra, bu qism oddiy kasnakka o'rnatilgan. Vaqt uzatish tizimi, 12V doimiy dvigatelga ulangan, har bir qism o'z quvvat manbaiga ega va oyoqlariga biriktirilgan oq qutiga o'ralgan.

2 -qadam: Dasturiy ta'minotni joriy etish 1 -qism

Dasturiy ta'minotni joriy etish 1 -qism
Dasturiy ta'minotni joriy etish 1 -qism

Ushbu tasvirni LED tasmasida ko'rsatish uchun har bir tasvirni piksellarga aylantirish kerak, so'ngra MCU xotirasiga yuklash kerak va keyin chiziqli LED chizig'iga berish kerak, buning uchun men ikki xil platforma uchun dasturiy ta'minotni yaratdim. va boshqa MCU uchun C ++ da, bu dastur "IDE Processing" da yozilgan pikselli dasturni qayta ishlashda yozilgan va u faqat rasm faylini ochadi, keyin tasvirning pikselli chiziqlarini ajratish uchun uni bosqichma -bosqich aylantiring. Har qanday tasvirni ko'rsatish uchun men 200 qatorni tanlayman, shuning uchun tasvirni (360 /200=1.8 daraja) 200 qatorni ajratish uchun 200 marta. Mening LED chizig'im APA102 o'rnatilgan 144 LEDdan iborat bo'lib, butun tasvir 200*144 = 28800 pikselga ega. APA102 chip displeyidagi har bir rang 4 baytli (Vt, RGB), shuning uchun har bir tasvir o'lchami aynan 200*144*4 = 115200 yoki 112.5KB ni tashkil qiladi, ishlov berish kodi tasvirni piksellashtirish ketma -ketligini ko'rsatadi va natijada axlat qutisi kengaytmasi bo'ladi. MCU xotirasiga yuklanadi

PImage img, black_b, image_load; PrintWriter chiqishi; int SQL; float led_t; bayt pov_data; int line_num = 200; String _OUTPUT = "";

bo'sh sozlamalar ()

{selectInput ("Tasvirni tanlang", "imageChosen"); noLoop (); Kutmoq(); }

bo'sh o'rnatish ()

{chiqish = 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 (MARKAZI); tarjima qilish (SQL/2, SQL/2); aylantirish (radianlar (l*360/chiziq_num)); rasm (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) qizil (c)+""+(char) yashil (c)+""+(char) ko'k (c)); // chop etish ((char) qizil (c)+""+(char) yashil (c)+""+(char) ko'k (c)+";"); to'ldirish (c); to'g'ri (i*led_t, (SQL/2)-(led_t/2), led_t, led_t); } // println (); popMatrix (); // kechikish (500); l ++; }

void tugmasi bosildi ()

{chiqish.flush (); // Qolgan ma'lumotlarni output.close () fayliga yozadi; // Exit () faylini tugatadi; // Dasturni to'xtatadi}

void imageChosen (Fayl f)

{if (f == null) {println ("Oyna yopildi yoki foydalanuvchi bekor qilishni bosdi."); exit (); } else {if (f.exists ()) img = loadImage (f.getAbsolutePath ()); Satr s = f.getAbsolutePath (); String list = split (s, '\'); int n = ro'yxat uzunligi. String fle = split (ro'yxat [n-1], '.'); println ("Faylni ochish:"+fle [0]); _OUTPUT = fle [0]+"bin"; // img = loadImage ("test.jpg"); int w = img.width; int h = img balandligi; SQL = maksimal (w, h); hajmi (SQL, SQL); led_t = SQL/144.0; println ("h ="+h+"w ="+w+"max ="+SQL+"size led ="+led_t); }} bo'sh sichqoncha bosildi () {loop ();}

vid mydata ()

{bayt b = loadBytes ("biror narsa.dat"); // Har bir qiymatni (int i = 0; i <b.length; i ++) uchun 0 dan 255 gacha chop eting // Har o'ninchi raqam, agar ((i % 10) == 0) println () bo'lsa, yangi qatorni boshlang.; // baytlar -128 dan 127 gacha, bu 0 dan 255 gacha o'zgaradi int a = b & 0xff; bosib chiqarish (a + ""); } println (); // Oxirida bo'sh qatorni chop qiling saveBytes ("numbers.dat", b); } void wait () {while (img == null) {delay (200); } loop (); }

3 -qadam: Dasturiy ta'minotni joriy etish 2 -qism

Image
Image
Dasturiy ta'minotni joriy etish 2 -qism
Dasturiy ta'minotni joriy etish 2 -qism
Dasturiy ta'minotni joriy etish 2 -qism
Dasturiy ta'minotni joriy etish 2 -qism

MCU ko'rsatish dasturi

yuqori samarali ESP8266 chipi bir necha sabablarga ko'ra tanlangan, avval u foydalanuvchilar uchun veb-serverni saqlash uchun xotira bilan bir qatorda WiFi xususiyatlaridan foydalanish uchun ochiq SDK vositalarini yaxshi ishlab chiqqan. Ushbu imkoniyatlar yordamida foydalanuvchilarga qulay bo'lgan veb-server MCU xotirasiga pikselli tasvirni yuklash va shou uchun foydalanuvchi aniqlaydigan ssenariyni yaratish uchun mo'ljallangan. 4 Mb ESP-12E seriyali bilan biz dastur uchun 1 Mb va tasvirlar uchun 3 Mb dan foydalanishimiz mumkin, uning o'lchami 112,5KB bo'lgan pikselli tasvir uchun biz MCU-ga taxminan 25 ta tasvirni yuklashimiz mumkin va men yuklagan tasvir uchun istalgan ketma-ketlikni yoki istalgan ko'rsatuv muddatini tuzishimiz mumkin. Veb -serverni yaratish uchun Arduino kod bazasini amalga oshirish. kod quyidagi davrada uchta asosiy funktsiyaga ega

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 = tasvir_faylining boshlang'ich manzili [image_index]; Serial.printf ("Fayl raqami =%u nomi:%s manzili:%u davomiyligi:%u / n", image_index, IMAGES [image_index].c_str (), start_address_of_imagefile [image_index], DURATION [image_index]); Current_imageLine = 0; image_index ++; OpenlastTime = millis (); } 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 ++; kechikish (LineIntervalDelay); } if (Current_imageLine> = IMAGES_LINES) {Current_imageLine = 0; _memory_pointer = tasvir_faylining boshlang'ich manzili [image_index-1]; }} optimistik_ hosil (1000); }

Server ishlovchisi server.handleClient (); veb -xostdagi har qanday mijoz so'rovini qayta ishlashga mas'ul, bu veb -sayt ma'lumotlarni yuklash, har qanday davlat hisobotining ko'rgazma sozlamalarini o'zgartirish uchun o'zboshimchalik bilan tuzilgan bo'lishi mumkin. Mening veb -xostim uchta yorliqdan iborat bo'lib, quyidagi rasmlar birinchi tabda, biz har bir tasvirning ketma -ketligi va davomiyligi bilan ko'rsatuvning joriy ssenariysini, shuningdek tarmoq ma'lumotlarini, shuningdek POV aylanish tezligini tekshirishimiz mumkin.

rasm yuklash yorlig'ida biz MCU xotirasiga pikselli tasvirni yuklashimiz yoki ma'lum tasvirni o'chirib tashlashimiz mumkin

tarmoq yorlig'ida biz wifi rejimi, statik ip, tarmoq nomi va o'tish kabi tarmoq sozlamalarini o'zgartirishimiz mumkin edi.

Rasmni yuklovchi

bu serverning mijozi Ajax tomonidan MCU xotirasiga pikselli tasvirni yuklashni so'raydi, keyin faylni xotiraga xom formatda yozadi, shuning uchun faylni iloji boricha tezroq o'qiladi. Xotiraning boshlanish va tugash joyi LED tasmasida ko'rsatish uchun jadvalda saqlanadi

Ko'rsatish funktsiyasi

Men LED tasmasidagi pikselni ko'rsatish uchun FastLED lib -dan foydalandim, bu kutubxona AVR va ESP platformasida LED -shou uchun eng muvaffaqiyatli va yaxshi ishlab chiqilgan. Faqat FastLED funktsiyasini, saqlangan LED pikselining joylashishini yuborish kifoya. biz xotiradan chiziqli piksellarni o'qiymiz va uni LED tasmasida ko'rsatamiz va yangi aylantirish bayrog'i amalga oshishini kutamiz. biz bu ketma -ketlikni har bir tasvirning 200 qatori o'qilmaguncha takrorladik

bu erda mening git omborimda joylashgan butun kod

Quyida mobil kamera tomonidan yozib olingan POV videosi va men tushuntirganimdek, professional bo'lmagan kameraning diafragma tezligi pastligi tufayli video sifati yaxshi emas.