POV 1 mét khi bật IOT: 3 bước (có hình ảnh)
POV 1 mét khi bật IOT: 3 bước (có hình ảnh)
Anonim
Image
Image
POV 1 mét với IOT được bật
POV 1 mét với IOT được bật
POV 1 mét với IOT được bật
POV 1 mét với IOT được bật
POV 1 mét với IOT được bật
POV 1 mét với IOT được bật

Trước khi bắt đầu giải thích về dự án này, tôi muốn xin lỗi vì chất lượng hình ảnh và video thấp, nhưng thành thật mà nói, thật sự rất khó để có được hình ảnh sắc nét và rõ ràng khi chạy POV bằng máy ảnh bình thường như máy ảnh di động của tôi. Nó cần ống kính quang học có màng ngăn rất nhanh để ghi lại chuyển động chân thực, nhưng tôi sẽ tải lên video hay hơn khi cuối cùng tôi có thể mua máy ảnh CANON của mình

POV là gì

POV là viết tắt của Persistence Of Vision Globe có liên quan đến hiện tượng thị giác của con người. Kích thích ánh sáng tồn tại như một hậu quả trên võng mạc trong khoảng 1/10 giây. Khi các kích thích ánh sáng được sắp xếp liên tiếp nhanh chóng, chúng hợp nhất thành một hình ảnh liên tục. Trên thực tế, nó là cơ sở cho các thiết bị phim và truyền hình,. POV tạo ra ảo giác như vậy (đánh lừa chúng ta) và tạo ra hình ảnh bằng cách xoay dãy đèn LED xung quanh một điểm hoặc trục duy nhất

Đổi mới dự án là gì

Tất nhiên POV không phải là ý tưởng mới và rất nhiều dự án đã tồn tại trong Huấn luyện viên hoặc trong các trang web khác, tuy nhiên những dự án đó chủ yếu sử dụng đền hoặc hình ảnh tĩnh được cài đặt trước chủ yếu được đọc từ bộ nhớ MCU hoặc thẻ SD, nhưng trong dự án này, chúng tôi sử dụng triển khai các tính năng tuyệt đẹp của chip hỗ trợ IOT như ESP8266 trong vấn đề này.

Với các tính năng IOT này, chúng tôi

  1. có thể dễ dàng tải hình ảnh mới lên bộ nhớ không dây
  2. tạo kịch bản hiển thị hình ảnh mong muốn với bất kỳ trình tự hoặc bất kỳ thời lượng nào
  3. không cần lập trình lại chip hoặc rút thẻ nhớ và cắm lại để có hình ảnh động mới
  4. Máy chủ web IOT thân thiện với người dùng giúp mọi người dễ dàng quản lý POV bằng thiết bị di động hoặc máy tính bảng thậm chí từ xa
  5. thực hiện phần cứng chi phí rất thấp với dung lượng hơn 30 hình ảnh khác nhau

Cách POV hoạt động

Màn hình POV, một dãy đèn LED tuyến tính (1 chiều) quay xung quanh một điểm duy nhất, giống như bánh xe đạp. Bằng cách đo tốc độ quay của chúng và điều khiển sự nhấp nháy của chúng với độ chính xác đến từng mili giây, chúng ta có thể tạo ra ảo ảnh về một hình ảnh 2 hoặc 3 chiều nằm trong không khí mỏng. Hãy xem xét một khung hình duy nhất của bất kỳ hiệu ứng nào (hình ảnh, văn bản,…), mỗi khung hình bao gồm nhiều pixel và do đó nhiều dòng trong khu vực mặt phẳng hoặc hình cầu, POV hiển thị hình ảnh này với một dòng hình ảnh được thay đổi vị trí cùng với sự xoay của nó để lấp đầy hình ảnh đó, vì vậy vấn đề là làm thế nào để điều khiển chính xác màu pixel LED theo thời gian và không gian để nó có thể tạo ra toàn bộ hình ảnh POV được phân loại dựa trên trục quay, loại hiệu ứng có thể hiển thị và lượng màu có thể tạo ra.

Bằng các trục quay khác nhau, có thể tạo ra màn hình POV phẳng, hình trụ và hình cầu

nhiều dự án POV sử dụng đèn LED đơn màu đơn giản hoặc pixel thông minh tốc độ cao như WS2812 hoặc APA104 và trong dự án này, chúng tôi sử dụng bộ làm mới chip LED nhanh APA102 với tốc độ làm mới thực tế khoảng 16 MHz. chip LED này có 2 dòng để điều khiển (Ground, Data, Clock, + 5v)

Bước 1: Cách tạo POV

Cách xây dựng POV
Cách xây dựng POV
Cách xây dựng POV
Cách xây dựng POV
Cách xây dựng POV
Cách xây dựng POV

Lúc đầu, tôi cần cấu trúc để gắn trung tâm POV, việc tạo cấu trúc kim loại hay phi kim loại là tùy thuộc vào những gì bạn có trong tay. Bạn có thể làm bằng bất kỳ vật liệu nào có sẵn để lắp vào tường hoặc thêm chân để làm giá đỡ. Bạn tôi làm chân máy đơn giản và gắn cơ cấu đai định thời để giảm RPM của động cơ DC xuống khoảng 500. số lần mỗi giây, Vì POV của tôi bao gồm 1 dải LED chéo, do đó mỗi khung hình được hoàn thành với một nửa hoặc vòng quay, nói cách khác, chúng tôi cần RPM của trung tâm lý tưởng khoảng 600 và với RPM này, mỗi vòng quay mất khoảng 100 mili giây. phương trình sau đây chứng minh rằng khái niệm RPM = (fps / Nb) * 60 mà Nb bằng Số nhánh và trong trường hợp này chúng ta có RPM = (20/2) * 60 = 600 POV của tôi xoay quanh 430 vòng / phút do đó fps của tôi là khoảng 15 fsp khá tốt về vấn đề này. Xây dựng phần cơ khí

Trong bước tiếp theo, tôi sử dụng miếng trụ PVC được phay để giữ thanh đèn LED. Để kết nối trung tâm với trục ròng rọc, một bu lông M10 đã được bắt chặt vào mặt sau của phần PCV Hai vòng Cupper được lắp trên trục ròng rọc để truyền 5 volt DC tới bảng và dải đèn LED, sau đó theo hình ảnh sau, bộ phận này được gắn trên ròng rọc đơn giản Hệ thống truyền dẫn thời gian được kết nối với động cơ DC 12v mỗi bộ phận có nguồn điện riêng và được bao bọc trong hộp màu trắng gắn với chân

Bước 2: Triển khai phần mềm Phần 1

Triển khai phần mềm Phần 1
Triển khai phần mềm Phần 1

Để chứng minh hình ảnh đã cho trong dải LED, mỗi hình ảnh phải được tạo pixel sau đó tải lên bộ nhớ MCU và sau đó được đưa vào dải LED theo từng dòng, để làm điều đó tôi đã thực hiện với phần mềm cho hai nền tảng khác nhau, một là dựa trên xử lý thời gian chạy java và chương trình khác trong C ++ cho MCUPXử lý chương trình pixelized chương trình này đã viết trong IDE Xử lý và nó chỉ cần mở tệp hình ảnh, sau đó xoay nó theo các bước để trích xuất các dòng hình ảnh được pixel hóa. Tôi chọn 200 dòng để hiển thị một hình ảnh bất kỳ, vì vậy tôi xoay abut hình ảnh (360 /200=1.8 độ) 200 lần để giải nén dòng 200. Vì dải LED của tôi bao gồm 144 LED với chip APA102 nhúng, do đó toàn bộ hình ảnh có 200 * 144 = 28800 pixel. Vì mỗi màu trong chip APA102 hiển thị với 4 byte (W, RGB) do đó kích thước mỗi hình ảnh chính xác là 200 * 144 * 4 = 115200 hoặc 112,5KB sau Mã xử lý chứng minh chuỗi pixel hóa hình ảnh và kết quả sẽ là tệp mở rộng bin có thể được tải lên bộ nhớ MCU

PImage img, black_b, image_load; đầu ra PrintWriter; int SQL; float led_t; byte pov_data; int line_num = 200; Chuỗi _OUTPUT = "";

void settings ()

{selectInput ("Chọn một hình ảnh", "imageChosen"); noLoop (); đợi đã(); }

void setup ()

{output = 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 (TRUNG TÂM); dịch (SQL / 2, SQL / 2); xoay (radian (l * 360 / line_num)); hình ảnh (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) red (c) + "" + (char) green (c) + "" + (char) blue (c)); // print ((char) red (c) + "" + (char) green (c) + "" + (char) blue (c) + ";"); điền (c); trực tràng (i * led_t, (SQL / 2) - (led_t / 2), led_t, led_t); } // println (); popMatrix (); // delay (500); l ++; }

void keyPressed ()

{output.flush (); // Ghi dữ liệu còn lại vào tệp output.close (); // Kết thúc tập tin exit (); // Dừng chương trình}

void imageChosen (Tệp f)

{if (f == null) {println ("Cửa sổ bị đóng hoặc người dùng nhấn hủy."); exit (); } else {if (f.exists ()) img = loadImage (f.getAbsolutePath ()); Chuỗi s = f.getAbsolutePath (); String list = split (s, '\'); int n = list.length; String fle = split (list [n-1], '.'); println ("Mở tệp:" + fle [0]); _OUTPUT = fle [0] + ". Bin"; // img = loadImage ("test.jpg"); int w = img.width; int h = img.height; SQL = max (w, h); kích thước (SQL, SQL); led_t = SQL / 144.0; println ("h =" + h + "w =" + w + "max =" + SQL + "size led =" + led_t); }} void mousePressed () {loop ();}

void mydata ()

{byte b = loadBytes ("something.dat"); // In từng giá trị, từ 0 đến 255 for (int i = 0; i <b.length; i ++) {// Mỗi số thứ mười, bắt đầu một dòng mới if ((i% 10) == 0) println (); // byte có giá trị từ -128 đến 127, điều này chuyển đổi thành 0 thành 255 int a = b & 0xff; print (a + ""); } println (); // In ra một dòng trống ở cuối saveBytes ("number.dat", b); } void wait () {while (img == null) {delay (200); } vòng(); }

Bước 3: Triển khai phần mềm Phần 2

Image
Image
Triển khai phần mềm Phần 2
Triển khai phần mềm Phần 2
Triển khai phần mềm Phần 2
Triển khai phần mềm Phần 2

Chương trình hiển thị MCU

chip ESP8266 hiệu suất cao đã được chọn vì một số lý do, đầu tiên là nó đã phát triển tốt các công cụ SDK mở để tận dụng các tính năng WiFi cùng với bộ nhớ để lưu trữ một máy chủ web cho người dùng. Với khả năng này, máy chủ web thân thiện với người dùng được thiết kế để tải hình ảnh đã pixel hóa lên bộ nhớ MCU và tạo kịch bản do người dùng xác định cho chương trình. Với dòng 4 Mb ESP-12E, chúng tôi có thể sử dụng 1 Mb cho chương trình và 3 Mb cho hình ảnh có kích thước 112,5KB cho hình ảnh pixel, chúng tôi có thể tải lên khoảng 25 hình ảnh trên MCU và có thể tạo bất kỳ chuỗi hoặc bất kỳ khoảng thời gian hiển thị nào cho hình ảnh tải lên mà tôi sử dụng Triển khai cơ sở mã Arduino để tạo máy chủ web. mã có ba chức năng chính trong vòng lặp của nó như sau

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 = start_address_of_imagefile [image_index]; Serial.printf ("Số tệp =% u tên:% s địa chỉ:% u thời lượng:% 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 ++; trì hoãn (LineIntervalDelay); } if (Current_imageLine> = IMAGES_LINES) {Current_imageLine = 0; _memory_pointer = start_address_of_imagefile [image_index-1]; }} positive_yield (1000); }

Máy chủ Xử lý server.handleClient (); Chịu trách nhiệm xử lý bất kỳ yêu cầu nào của khách hàng trên webhost, trang web này có thể được thiết kế tùy ý để tải dữ liệu lên, thay đổi cài đặt hiển thị của bất kỳ báo cáo trạng thái nào. Máy chủ web của tôi bao gồm ba tab như hình ảnh sau đây trong tab đầu tiên, chúng tôi có thể kiểm tra kịch bản hiện tại của chương trình với trình tự và thời lượng cho mỗi hình ảnh, thông tin mạng cũng như vòng / phút POV được hiển thị

trong tab tải lên hình ảnh, chúng tôi có thể tải lên hình ảnh được pixel hóa vào bộ nhớ MCU hoặc xóa hình ảnh cụ thể

trong tab mạng, chúng ta có thể thay đổi cài đặt mạng như chế độ wifi, ip tĩnh, tên và mật khẩu mạng,..

Trình tải lên hình ảnh

máy khách chức năng này yêu cầu Ajax tải hình ảnh đã pixel lên bộ nhớ MCU, sau đó ghi tệp vào bộ nhớ ở định dạng thô để việc đọc tệp nhanh nhất có thể. Bộ nhớ bắt đầu và kết thúc vị trí lưu trữ trong bảng để hiển thị trong dải LED

Chức năng hiển thị

Tôi đã sử dụng FastLED lib để hiển thị pixel trong dải LED, thư viện này là một trong những thư viện thành công nhất và được phát triển tốt nhất cho hiển thị LED trên nền tảng AVR và ESP. Nó chỉ cần gửi chức năng FastLED, vị trí của pixel LED được lưu trữ. chúng tôi đọc pixel từng dòng từ bộ nhớ và hiển thị nó trong dải LED và chờ cờ xoay mới thành hiện thực. chúng tôi lặp lại trình tự này cho đến khi đọc được 200 dòng của mỗi hình ảnh

toàn bộ mã nằm trong kho lưu trữ git của tôi ở đây

sau đây là video POV đang hoạt động được ghi lại bằng máy ảnh di động và như tôi đã giải thích, chất lượng video không tốt do tốc độ màng chắn chậm của máy ảnh không chuyên nghiệp