1 מטר POV עם IOT מופעל: 3 שלבים (עם תמונות)
1 מטר POV עם IOT מופעל: 3 שלבים (עם תמונות)
Anonim
Image
Image
1 מטר POV עם IOT מופעל
1 מטר POV עם IOT מופעל
1 מטר POV עם IOT מופעל
1 מטר POV עם IOT מופעל
1 מטר POV עם IOT מופעל
1 מטר POV עם IOT מופעל

לפני תחילת ההסבר על הפרויקט הזה אני רוצה להתנצל על תמונה ווידאו באיכות נמוכה, אבל האמת שזה ממש קשה לצלם תמונה חדה וברורה מהפעלת POV עם מצלמה רגילה כמו המצלמה הניידת שלי. היא זקוקה לעדשה אופטית דיאפרגמה מהירה מאוד כדי ללכוד תנועה אמיתית, אבל אני אעלה את הסרטון הטוב יותר כשאני סוף סוף אוכל לקנות את מצלמת CANON שלי

מהו ה- POV

POV מייצגים את Persistence Of Vision Globe הקשור לתופעה של ראייה אנושית. גירוי קל מתמשך כתוצאה מאוחרת על הרשתית במשך כ -1/10 שנייה. כאשר גירויי האור מתרצפים ברצף מהיר, הם מתמזגים לתמונה אחת רציפה. למעשה זה הבסיס למכשירי קולנוע וטלוויזיה,. POV יוצר אשליה כזו (שולל אותנו) ויוצר את התמונה על ידי סיבוב מערך נורות הלד סביב נקודה או ציר בודד

מהו חדשנות פרויקטים

כמובן ש- POV אינו רעיון חדש והרבה פרויקטים קיימים כבר במדריכים או באתרים אחרים, אולם הפרויקטים האלה משתמשים בעיקר במקדש סטטי או בתמונה סטטית שנקראת בעיקר מזיכרון 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 זה יש 2 קווי שליטה (קרקע, נתונים, שעון, +5 וולט)

שלב 1: כיצד לבנות POV

כיצד לבנות POV
כיצד לבנות POV
כיצד לבנות POV
כיצד לבנות POV
כיצד לבנות POV
כיצד לבנות POV

בהתחלה אני צריך את המבנה כדי להתקין רכזת POV, מה שהופך את מבנה המתכת או הלא מתכתי תלוי במה שיש לך בידיים. אתה יכול להכין אותו עם כל חומר זמין כדי להתקין אותו על קיר או להוסיף רגליים לייצור מעמד. החבר שלי עושה את החצובה הפשוטה ומרכיב את מנגנון חגורת התזמון כדי להפחית את סל"ד המנוע DC בסביבות 500. מתמטיקה קטנה. לקבלת תמונה ברורה וקוהרנטית, אנו זקוקים לריענון מסגרות בסביבות 20 fps, זה אומר שיהיה לנו תמונה ברורה שאנחנו צריכים להציג אותה שוב ושוב כ -20 פעמים בשנייה, מכיוון שה POV שלי מורכב מרצועת LED אלכסונית אחת, ומכאן שכל מסגרת הושלמה בחצי או בסיבוב, במילה אחרת אנו צריכים את סל"ד הרכז האידיאלי בסביבות 600 ועם סל"ד זה כל מהפכה ארכה כ -100 אלפיות השנייה. המשוואה הבאה מדגימה כי מושג RPM = (fps/Nb)*60 אשר Nb שווה למספר הענף, ובמקרה זה יש לנו RPM = (20/2)*60 = 600 POV שלי מסתובב סביב 430 סל"ד ולכן ה- fps שלי הוא סביב 15 fsp וזה די טוב בנושא הזה. בניית החלק המכני

בשלב הבא השתמשתי בחתיכת גליל PVC טחון כדי להחזיק את מוט ה- LED. כדי לחבר את הרכזת עם פיר גלגלת, בורג אחד M10 הוברק בחלק האחורי של החלק PCV שני טבעת נחושת המותקנת על גלגלת ההילוכים לשידור 5 וולט DC ללוח ורצועת LED, ואז לפי התמונות הבאות, חלק זה מותקן על הגלגלת הפשוטה מערכת העברת זמן המחוברת למנוע 12V DC לכל חלק יש ספק כוח משלו ומוקף בקופסה לבנה המחוברת לרגליים

שלב 2: יישום תוכנה חלק 1

יישום תוכנה חלק 1
יישום תוכנה חלק 1

על מנת להדגים את התמונה הנתונה ברצועת LED, יש לפקסס כל תמונה ולאחר מכן להעלות לזיכרון MCU ולאחר מכן להאכיל אותה לרצועת LED שורה אחר שורה, לשם כך עשיתי לתוכנה לשתי פלטפורמות שונות, אחת מבוססת על עיבוד זמן ריצה של java ואחרים ב- C ++ לתוכנית MCP עיבוד פיקסלים בתוכנית זו כתבה בעיבוד IDE והיא פשוט פותחת קובץ תמונה ואז מסובבת אותו בשלבים לחילוץ שורות תמונה מפוקסלות. אני בוחר 200 קו להצגת תמונה כלשהי, כך שאני מסובב את התמונה סמוך (360 /200=1.8 תואר) 200 פעמים לחלץ 200 קו. מכיוון שרצועת ה- LED שלי מורכבת מ- 144 LED עם שבב APA102 מוטבע ולכן לתמונה שלמה יש 200*144 = 28800 פיקסלים. מכיוון שכל צבע בתצוגת שבב APA102 עם 4 בתים (W, RGB) מכאן שכל גודל תמונה הוא בדיוק 200*144*4 = 115200 או 112.5KB בעקבות קוד העיבוד מדגים את רצף פיקסליזציית התמונה, והתוצאה תהיה קובץ סיומת סל שיכול להעלות לזיכרון MCU

PImage img, black_b, image_load; פלט PrintWriter; int SQL; לצוף led_t; בייט pov_data; int line_num = 200; מחרוזת _OUTPUT = "";

הגדרות בטל ()

{selectInput ("בחר תמונה", "imageChosen"); noLoop (); לַחֲכוֹת(); }

הגדרת חלל ()

{output = 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) אדום (c)+""+(char) ירוק (c)+""+(char) כחול (c)); // print ((char) אדום (c)+""+(char) ירוק (c)+""+(char) כחול (c)+";"); מילוי (ג); rect (i*led_t, (SQL/2)-(led_t/2), led_t, led_t); } // println (); popMatrix (); // עיכוב (500); l ++; }

void keyPressed ()

{output.flush (); // כותב את הנתונים הנותרים לקובץ output.close (); // מסיים את יציאת הקובץ (); // מפסיק את התוכנית}

תמונה חללה נבחרה (קובץ f)

{if (f == null) {println ("החלון נסגר או שהמשתמש ביטל ביטול."); יציאה (); } אחר {if (f.exists ()) img = loadImage (f.getAbsolutePath ()); מחרוזת s = f.getAbsolutePath (); מחרוזת list = פיצול (ים, '\'); int n = list.length; מחרוזת fle = פיצול (רשימה [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 () {לולאה ();}

בטל נתונים שלי ()

{בייט 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); } לולאה (); }

שלב 3: יישום תוכנה חלק 2

Image
Image
יישום תוכנה חלק 2
יישום תוכנה חלק 2
יישום תוכנה חלק 2
יישום תוכנה חלק 2

תוכנית תצוגה של MCU

שבב ESP8266 בעל ביצועים גבוהים נבחר משתי סיבות, ראשית הוא פיתח היטב כלי SDK פתוחים כדי לנצל את תכונות ה- WiFi לצידו הזיכרון לאירוח שרת אינטרנט למשתמש. עם יכולות אלה, שרת אינטרנט ידידותי למשתמש המיועד להעלות את התמונה המפוקסלת לזיכרון MCU וליצור תרחיש הגדרת משתמש להצגה. עם 4 Mb סדרות ESP-12E נוכל להשתמש ב- 1 Mb לתוכנית וב -3 Mb לתמונות אשר בגודל 112.5KB לתמונה מפוקסלת נוכל להעלות בערך 25 תמונות ב- MCU ויכולים לבצע כל רצף או כל תקופת תצוגה של תמונה שהועלתה בה אני משתמש יישום בסיס קוד Arduino ליצירת שרת האינטרנט. לקוד יש שלוש פונקציות עיקריות בלולאה שלו בהתאם להלן

לולאת void () {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 = 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 ++; עיכוב (LineIntervalDelay); } אם (Current_imageLine> = IMAGES_LINES) {Current_imageLine = 0; _memory_pointer = start_address_of_imagefile [image_index-1]; }} אופטימיסטי_מסגרת (1000); }

מטפל שרתים server.handleClient (); אחראי לעבד כל בקשת לקוח ב- webhost, אתר זה עשוי להיות עיצוב שרירותי להעלאת נתונים, שינוי הגדרת ההצגה של כל דוח מדינה. מארח האתרים שלי מורכב משלוש כרטיסיות כתמונות הבאות בכרטיסייה הראשונה שנוכל לבדוק את התרחיש הנוכחי של ההצגה עם רצף ומשך לכל תמונה, גם מידע על רשת כמו גם עלות POV המוצגת

בכרטיסיית תמונת העלאה נוכל להעלות תמונה מפוקסלת לזיכרון MCU או למחוק תמונה ספציפית

בכרטיסיה רשת נוכל לשנות את הגדרת הרשת כגון מצב wifi, IP סטטי, שם רשת וכרטיס,..

מטען מעלה תמונה

בקשת לקוח שרת פונקציה זו של Ajax להעלות תמונה מפוקסלת לזיכרון MCU, ולאחר מכן לכתוב את הקובץ בזיכרון בפורמט גלם כך שקריאת הקובץ תהיה מהירה ככל האפשר. אחסון מיקום התחלה וסיום של זיכרון בטבלה להצגה ברצועת LED

פונקציית תצוגה

השתמשתי ב- lib של FastLED כדי להציג פיקסל ברצועת LED, ספרייה זו היא אחת המוצלחות והמצויחות ביותר להצגת LED בפלטפורמת AVR ו- ESP. זה רק צריך לשלוח את הפונקציה FastLED, המיקום של פיקסל LED המאוחסן. אנו קוראים פיקסלים שורה אחר שורה מהזיכרון ומראים אותו ברצועת LED ומחכים לדגל סיבוב חדש שיתגשם. חזרנו על רצף זה עד שנקראו 200 שורות מכל תמונה

כל הקוד הממוקם במאגר git שלי כאן

להלן סרטון ה- POV בפעולה אשר מוקלט במצלמה ניידת וכפי שהסברתי, איכות הווידאו אינה טובה בשל מהירות דיאפרגמה איטית של מצלמה לא מקצועית