1 متر بوف مع تمكين إنترنت الأشياء: 3 خطوات (بالصور)
1 متر بوف مع تمكين إنترنت الأشياء: 3 خطوات (بالصور)
Anonim
Image
Image
1 متر بوف مع تمكين إنترنت الأشياء
1 متر بوف مع تمكين إنترنت الأشياء
1 متر بوف مع تمكين إنترنت الأشياء
1 متر بوف مع تمكين إنترنت الأشياء
1 متر بوف مع تمكين إنترنت الأشياء
1 متر بوف مع تمكين إنترنت الأشياء

قبل البدء في شرح هذا المشروع ، أود أن أعتذر عن جودة الصورة والفيديو منخفضة الجودة ، ولكن بصراحة من الصعب حقًا التقاط صورة حادة وواضحة من تشغيل POV بكاميرا عادية مثل كاميرا الهاتف المحمول الخاصة بي. إنها بحاجة إلى عدسة بصرية غشاء سريعة جدًا لالتقاط الحركة الحقيقية ، لكنني سأحمل الفيديو الأفضل عندما يمكنني أخيرًا شراء كاميرا CANON الخاصة بي

ما هو بوف

يرمز POV إلى "استمرار الرؤية" المرتبط بظاهرة الرؤية البشرية. يستمر منبه الضوء كآثار لاحقة على شبكية العين لمدة 1/10 من الثانية. عندما يتم تسلسل المنبهات الضوئية في تتابع سريع ، فإنها تندمج في صورة واحدة مستمرة. في الواقع هو أساس أجهزة السينما والتلفزيون. تقوم POV بعمل مثل هذا الوهم (خداعنا) وإنشاء الصورة عن طريق تدوير مجموعة مصابيح LED حول نقطة أو محور واحد

ما هو ابتكار المشروع

خارج المسار POV ليست فكرة جديدة وهناك الكثير من المشاريع موجودة بالفعل في Instructables أو في مواقع أخرى ، ولكن هذه المشاريع تستخدم في الغالب معبدًا ثابتًا أو صورة محددة مسبقًا والتي تتم قراءتها في الغالب من ذاكرة MCU أو بطاقة SD ، ولكن في هذا المشروع نستخدم ميزات جميلة من شريحة IOT الممكّنة مثل ESP8266 في هذه المسألة.

مع هذا IOT ميزات نحن

  1. يمكنه بسهولة تحميل صور جديدة إلى الذاكرة لاسلكيًا
  2. قم بإنشاء السيناريو المطلوب لعرض الصور بأي تسلسل أو أي مدة
  3. ليست هناك حاجة لإعادة برمجة الشريحة أو فصل بطاقة الذاكرة وإعادة توصيلها للرسوم المتحركة الجديدة
  4. يسهّل مضيف ويب IOT سهل الاستخدام على كل شخص إدارة POV باستخدام الهاتف المحمول أو الجهاز اللوحي حتى عن بُعد
  5. تنفيذ أجهزة منخفضة التكلفة للغاية بسعة تزيد عن 30 صورة مختلفة

كيف يعمل POV

يعرض POV ، مجموعة خطية (أحادية الأبعاد) من مصابيح LED تدور حول نقطة واحدة ، مثل عجلة الدراجة. من خلال قياس معدل الدوران والتحكم في ومضاتهم بدقة ملي ثانية ، يمكننا إنشاء وهم صورة ثنائية أو ثلاثية الأبعاد باقية في الهواء الرقيق. دعونا نفكر في الإطار الفردي لأي تأثير (صورة ، نص ، …) ، يتكون كل إطار من العديد من البكسل وبالتالي العديد من الخطوط في المستوى أو المنطقة الكروية ، يعرض POV هذه الصورة بسطر واحد من الصورة يتم تغيير موضعه مع دورانه للتعبئة تلك الصورة ، لذا فإن المشكلة تكمن في كيفية التحكم بدقة في لون البكسل LED بطريقة الوقت والمكان حتى تتمكن من إنشاء صورة كاملة يتم تصنيف POV على أساس محور الدوران ، ونوع التأثير الذي يمكن عرضه ومقدار اللون الذي يمكن إنشاؤه.

من خلال محور دوران مختلف ، يمكن أن ينتج عرض POV مستو ، أسطواني وكروي

تستخدم العديد من مشاريع POV LED بسيطًا أحادي اللون أو وحدات بكسل ذكية عالية السرعة مثل WS2812 أو APA104 وفي هذا المشروع نستخدم رقاقة LED السريعة لتجديد المعلومات APA102 مع معدل تحديث يبلغ حوالي 16 ميجا هرتز. تحتوي شريحة LED هذه على خطين للتحكم (أرضي ، بيانات ، ساعة ، + 5 فولت)

الخطوة 1: كيفية بناء POV

كيفية بناء POV
كيفية بناء POV
كيفية بناء POV
كيفية بناء POV
كيفية بناء POV
كيفية بناء POV

في البداية ، أحتاج إلى الهيكل لتركيب محور POV ، مما يجعل الهيكل المعدني أو غير المعدني يعتمد على ما لديك في يديك. يمكنك صنعه بأي مادة متاحة لتثبيته على الحائط أو إضافة أرجل لعمل حامل. يقوم صديقي بعمل الحامل ثلاثي القوائم البسيط ويقوم بتركيب آلية حزام التوقيت لتقليل عدد دورات محرك التيار المستمر في الدقيقة حوالي 500. مرات في الثانية ، نظرًا لأن POV الخاص بي يتكون من شريط LED قطري واحد ، وبالتالي فإن كل إطار مكتمل بنصف أو دوران ، وبكلمة أخرى نحتاج إلى Ideal hub RPM حول 600 ومع RPM ، استغرقت كل ثورة حوالي 100 مللي ثانية. توضح المعادلة التالية أن المفهوم RPM = (fps / Nb) * 60 أي Nb يساوي عدد الفرع ، وفي هذه الحالة لدينا RPM = (20/2) * 60 = 600my POV تدور حول 430 دورة في الدقيقة وبالتالي فإن fps الخاص بي هو حوالي 15 fsp وهو أمر جيد إلى حد ما في هذا الشأن. بناء الجزء الميكانيكي

في الخطوة التالية ، استخدمت قطعة من أسطوانة PVC المطحونة لتثبيت شريط LED. لتوصيل المحور بعمود البكرة ، تم تثبيت مسمار M10 على الجزء الخلفي من جزء PCV ، حلقتان من النحاس مثبتتان على عمود البكرة لنقل 5 فولت تيار مستمر إلى اللوحة وشريط LED ، ثم وفقًا للصور التالية ، تم تثبيت هذا الجزء على بكرة بسيطة نظام نقل الوقت المتصل بمحرك بجهد 12 فولت ، كل جزء به مصدر طاقة خاص به ومرفق بصندوق أبيض متصل بالأرجل

الخطوة 2: تنفيذ البرنامج الجزء 1

جزء تنفيذ البرنامج 1
جزء تنفيذ البرنامج 1

من أجل إظهار الصورة المعينة في شريط LED ، يجب أن يتم تقسيم كل صورة إلى بكسل ثم تحميلها على ذاكرة MCU ثم تغذيتها إلى شريط LED بخط سطري ، للقيام بذلك قمت بعمل برنامج لمنصتين مختلفتين ، أحدهما يعتمد على معالجة وقت تشغيل جافا وغيرها في C ++ لبرنامج MCUProcessing pixelized الذي كتبه هذا البرنامج في تجهيز IDE وهو ببساطة يفتح ملف الصورة ، ثم قم بتدويره في خطوات لاستخراج خطوط منقطة للصورة ، اخترت 200 سطر لعرض أي صورة ، لذلك أقوم بتدوير الصورة (360 /200=1.8 درجة) 200 مرة لاستخراج 200 خط. نظرًا لأن شريط LED الخاص بي يتكون من 144 LED مع شريحة APA102 المضمنة ، فإن الصورة بأكملها بها 200 * 144 = 28800 بكسل. نظرًا لأن كل لون في شاشة شريحة APA102 مع 4 بايت (W ، RGB) ، فإن حجم كل صورة هو بالضبط 200 * 144 * 4 = 115200 أو 112.5 كيلو بايت بعد رمز المعالجة يوضح تسلسل بكسل الصورة ، والنتيجة ستكون ملف امتداد bin الذي يمكن يتم تحميلها على ذاكرة MCU

PImage img ، black_b ، image_load ؛ إخراج PrintWriter ؛ int SQL ؛ تعويم led_t؛ بايت pov_data ؛ int line_num = 200 ؛ سلسلة _OUTPUT = "" ؛

إعدادات باطلة ()

{selectInput ("حدد صورة" ، "imageChosen") ؛ noLoop () ، انتظر()؛ }

الإعداد باطل()

{الإخراج = createWriter (_OUTPUT) ، black_b = createImage (SQL ، SQL ، RGB) ؛ black_b.loadPixels () ؛ لـ (int i = 0 ؛ i = line_num) {noLoop () ؛ output.flush () ؛ output.close () ؛} الخلفية (black_b) ؛ pushMatrix () ؛ imageMode (CENTER) ، ترجمة (SQL / 2 ، SQL / 2) ؛ استدارة (راديان (l * 360 / line_num)) ؛ صورة (img ، 0 ، 0) ؛ popMatrix () ، pushMatrix () ؛ لـ (int i = 0 ؛ i <144 ؛ i ++) {color c = get (int (i * led_t + led_t / 2)، int (SQL / 2)) ؛ output.print ((char) red (c) + "" + (char) green (c) + "" + (char) blue (c)) ؛ // print ((char) red (c) + "" + (char) green (c) + "" + (char) blue (c) + "؛") ؛ ملء (ج) ؛ rect (i * led_t، (SQL / 2) - (led_t / 2)، led_t، led_t) ؛ } // println () ؛ popMatrix () ، // تأخير (500) ؛ ل ++ ؛ }

مفتاح باطل

{output.flush () ، // يكتب البيانات المتبقية إلى ملف الإخراج. // ينهي إخراج الملف () ؛ // يوقف البرنامج}

صورة باطلة مختارة (ملف و)

{if (f == null) {println ("تم إغلاق النافذة أو ضغط المستخدم على إلغاء.")؛ exit ()؛ } else {if (f.exists ()) img = loadImage (f.getAbsolutePath ())؛ String s = f.getAbsolutePath () ، String list = split (s، '\')؛ int n = list.length ؛ String fle = split (list [n-1]، '.')؛ println ("فتح ملف:" + fle [0])؛ _OUTPUT = fle [0] + ". bin" ؛ // img = loadImage ("test.jpg") ؛ int w = img.width ؛ int h = img.height ؛ SQL = max (w، h) ؛ الحجم (SQL ، SQL) ؛ led_t = SQL / 144.0 ؛ println ("h =" + h + "w =" + w + "max =" + SQL + "size led =" + led_t) ؛ }} void mousePressed () {loop ()؛}

بيانات mydata باطلة ()

{بايت 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؛ طباعة (أ + "") ؛ } println () ؛ // طباعة سطر فارغ في النهاية saveBytes ("number.dat" ، ب) ؛ } void wait () {while (img == null) {delay (200)؛ } حلقة()؛ }

الخطوة 3: تنفيذ البرنامج الجزء 2

Image
Image
جزء تنفيذ البرنامج 2
جزء تنفيذ البرنامج 2
جزء تنفيذ البرنامج 2
جزء تنفيذ البرنامج 2

برنامج عرض MCU

تم اختيار شريحة ESP8266 عالية الأداء لسببين ، أولاً ، قامت بتطوير أدوات SDK مفتوحة بشكل جيد للاستفادة من ميزات WiFi جنبًا إلى جنب مع الذاكرة لاستضافة خادم ويب للمستخدم. مع هذه الإمكانيات ، خادم ويب سهل الاستخدام مصمم لتحميل الصورة ذات البكسل إلى ذاكرة MCU وإنشاء سيناريو تعريف المستخدم للعرض. مع سلسلة ESP-12E بسعة 4 ميجا بايت ، يمكننا استخدام 1 ميجا بايت للبرنامج و 3 ميجا بايت للصور التي يبلغ حجمها 112.5 كيلو بايت للصورة ذات البيكسل ، يمكننا تقريبًا تحميل 25 صورة على MCU ويمكننا عمل أي تسلسل أو أي فترة عرض للصورة التي تم تحميلها. تنفيذ قاعدة كود Arduino لإنشاء خادم الويب. يحتوي الكود على ثلاث وظائف رئيسية في حلقته على النحو التالي

حلقة باطلة () {if (! SHOW &&! TEST) server.handleClient ()؛ if (SHOW) {if ((millis () - OpenlastTime)> DURATION [image_index] * 1000) {if (image_index> = IMAGE_NUM) image_index = 0 ؛ _memory_pointer = start_address_of_imagefile [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 *) المصابيح ، NUM_LEDS * 3) ؛ FastLED.show () ، _memory_pointer + = (NUM_LEDS * 3) ؛ Current_imageLine ++ ؛ تأخير (LineIntervalDelay) ؛ } إذا (Current_imageLine> = IMAGES_LINES) {Current_imageLine = 0 ؛ _memory_pointer = start_address_of_imagefile [image_index-1] ؛ }} optimistic_yield (1000) ؛ }

معالج الخادم the server.handleClient () ؛ مسؤول عن معالجة أي طلب عميل على مضيف الويب ، يمكن أن يكون هذا الموقع الإلكتروني تصميمًا تعسفيًا لتحميل البيانات ، وتغيير إعداد العرض لأي تقرير حالة. تتكون مضيف الويب الخاص بي من ثلاث علامات تبويب كما يلي الصور في علامة التبويب الأولى ، يمكننا التحقق من السيناريو الحالي للعرض مع التسلسل والمدة لكل صورة ، وكذلك معلومات الشبكة وكذلك POV rpm المعروضة

في علامة تبويب تحميل الصورة ، يمكننا تحميل صورة منقطة على ذاكرة MCU أو حذف صورة معينة

في علامة تبويب الشبكة ، يمكننا تغيير إعداد الشبكة مثل وضع wifi ، وعنوان IP الثابت ، واسم الشبكة والمرور ،..

تحميل الصورة

يطلب عميل خادم الوظيفة هذا من Ajax تحميل صورة منقطة إلى ذاكرة MCU ، ثم كتابة الملف في الذاكرة بتنسيق خام بحيث تكون قراءة الملف سريعة قدر الإمكان. تخزين موقع بداية ونهاية الذاكرة في الجدول للعرض في شريط LED

وظيفة العرض

لقد استخدمت FastLED lib لإظهار البكسل في شريط LED ، هذه المكتبة هي واحدة من أكثر المكتبات نجاحًا وتطورًا لعرض LED على منصة AVR و ESP. تحتاج فقط إلى إرسال وظيفة FastLED ، موقع بكسل LED المخزن. نقرأ وحدات بكسل سطرًا سطرًا من الذاكرة ونعرضها في شريط LED وننتظر ظهور علامة دوران جديدة. كررنا هذا التسلسل حتى تمت قراءة 200 سطر من كل صورة

الكود بالكامل الموجود في مستودع git الخاص بي هنا

فيما يلي مقطع فيديو POV أثناء العمل والذي تم تسجيله بواسطة كاميرا الهاتف المحمول وكما أوضحت ، فإن جودة الفيديو ليست جيدة بسبب بطء سرعة الحجاب الحاجز للكاميرا غير الاحترافية