Innehållsförteckning:

1 meter POV med IOT aktiverad: 3 steg (med bilder)
1 meter POV med IOT aktiverad: 3 steg (med bilder)

Video: 1 meter POV med IOT aktiverad: 3 steg (med bilder)

Video: 1 meter POV med IOT aktiverad: 3 steg (med bilder)
Video: Olivia Rodrigo - 1 step forward, 3 steps back (Lyric Video) 2024, Juli
Anonim
Image
Image
1 meter POV med IOT aktiverad
1 meter POV med IOT aktiverad
1 meter POV med IOT aktiverad
1 meter POV med IOT aktiverad
1 meter POV med IOT aktiverad
1 meter POV med IOT aktiverad

Innan jag börjar förklara om detta projekt vill jag be om ursäkt för låg kvalitet på bild och video, men ärligt talat är det verkligen svårt att ta en skarp och tydlig bild från att köra POV med vanlig kamera som min mobilkamera. Det behöver mycket snabbt membranoptiskt objektiv för att fånga verklig rörelse, men jag kommer att ladda upp den bättre videon när jag äntligen kunde köpa min CANON -kamera

Vad är POV

POV står för Persistence Of Vision Globe som är relaterat till fenomenet människosyn. Ljusstimulering kvarstår som en efterverkan på näthinnan i ungefär 1/10 sekund. När ljusstimuler sekvenseras i snabb följd smälter de samman till en kontinuerlig bild. Faktum är att det är grunden för film- och tv -enheter,. POV gör en sådan illusion (lura oss) och skapar bilden genom att rotera arrayen med LED -lampor runt en enda punkt eller axel

Vad är projektinnovation

Självklart är POV ingen ny idé och massor av projekt finns redan i Instructables eller på andra webbplatser, men dessa projekt använder mestadels förinställd statisk tempel eller bild som mest läses från MCU -minne eller SD -kort, men i det här projektet använder vi vackra funktioner av IOT -aktiverat chip som ESP8266 i denna fråga.

Med denna IOT -funktioner vi

  1. kan enkelt ladda upp nya bilder trådlöst till minnet
  2. skapa önskat scenario med bildvisning med valfri sekvens eller längd
  3. det finns ingen anledning att omprogrammera chipet eller koppla ur minneskortet och anslut det igen för ny animering
  4. användarvänligt IOT -webbhotell gör det enkelt för var och en att skaffa POV med mobil eller surfplatta även på distans
  5. mycket billig hårdvaruimplementering med kapacitet på mer än 30 olika bilder

Hur POV fungerar

POV-skärmar, en linjär (1-dimensionell) uppsättning LED-lampor roterar runt en enda punkt, som ett cykelhjul. Genom att mäta deras rotationshastighet och kontrollera deras blixtar med millisekunds precision kan vi skapa illusionen av en 2 eller 3-dimensionell bild som hänger kvar i tunn luft. Låt oss betrakta den enstaka ramen för vilken effekt som helst (bild, text, …), varje bildruta består av många pixlar och därmed många rader i plan eller sfäriskt område, POV visar denna bild med en enda bildrad som ändras i position tillsammans med dess rotation för att fylla den bilden, så problemet är hur man exakt styr LED -pixelfärg på sätt och tid så att det kan skapa en hel bild POV kategoriseras baserat på rotationsaxeln, typen av effekt kan visas och hur mycket färg kan skapa.

Genom olika rotationsaxlar kan producera plan, cylindrisk och sfärisk POV -display

många POV-projekt använder enkla enfärgade LED- eller höghastighets smarta pixlar som WS2812 eller APA104 och i detta projekt använder vi den snabba LED-chipuppfräscharen APA102 med praktiskt taget cirka 16 MHz uppdateringsfrekvens. detta LED -chip har 2 linjer att styra (Ground, Data, Clock, +5v)

Steg 1: Hur man bygger POV

Hur man bygger POV
Hur man bygger POV
Hur man bygger POV
Hur man bygger POV
Hur man bygger POV
Hur man bygger POV

Först behöver jag strukturen för att montera POV -nav, vilket gör att metall- eller icke -metallstrukturen beror på vad du har i händerna. Du kan göra det med valfritt material för att installera det på en vägg eller lägga till ben för att göra stativ. Min vän gör det enkla stativet och monterar kuggremsmekanismen för att minska DC -motorns varvtal runt 500. Liten matematik För att ha en tydlig och sammanhängande bild behöver vi bilduppfräschning runt 20 fps, det är elakt att ha en klar bild vi behöver upprepade gånger visa den ca 20 gånger per sekund, Eftersom min POV består av 1 diagonal LED -remsa, därav varje ram färdigställd med halv eller rotation, med ett annat ord behöver vi Ideal nav -varvtalet runt 600 och med denna varvtal tog varje varv cirka 100 ms. följande ekvation visar att konceptet RPM = (fps/Nb)*60 som Nb är lika med antalet grenar, och i det här fallet har vi RPM = (20/2)*60 = 600my POV rotera runt 430 rpm så min fps är runt 15 fsp vilket är ganska bra i denna fråga. Bygga den mekaniska delen

I nästa steg använde jag en bit PVC -cylinder fräst för att hålla LED -stången. För att ansluta navet med remskivaxeln har en M10 -bult bultats fast på baksidan av PCV -delen Två kopparring installerad på remskivans axel till transmissionen 5 volt DC till brädan och LED -remsan, sedan enligt följande bilder, monterades denna del på den enkla remskivan tidöverföringssystem som är anslutet till 12v likströmsmotor, varje del har sin egen strömförsörjning och innesluten i en vit låda fäst på benen

Steg 2: Programvaruimplementering Del 1

Programvaruimplementering Del 1
Programvaruimplementering Del 1

För att visa den givna bilden i LED -remsor, bör varje bild pixeliseras och sedan laddas upp till MCU -minne och sedan matas till LED -remsa rad för rad, för att göra det jag gjorde till programvara för två olika plattformar, en är baserad på java runtime Processing och andra i C ++ för MCUProcessing pixelized program skrev detta program i Processing IDE och det öppnade helt enkelt bildfilen, rotera den sedan i steg för att extrahera pixeliserade bildlinjer. Jag väljer 200 rad för att visa vilken bild som helst, så jag roterar bilden mot (360 /200=1,8 grad) 200 gånger för att extrahera 200 linje. Eftersom min LED -remsa består av 144 LED med inbäddat APA102 -chip, så har en hel bild 200*144 = 28800 pixlar. Eftersom varje färg i APA102 -chipdisplayen med 4 byte (W, RGB) är varje bildstorlek exakt 200*144*4 = 115200 eller 112,5 KB efter bearbetningskoden visar sekvensen för bildpixelisering, och resultatet blir en bin -förlängningsfil som kan laddas upp till MCU -minne

PImage img, black_b, image_load; PrintWriter -utmatning; int SQL; float led_t; byte pov_data; int line_num = 200; Sträng _OUTPUT = "";

ogiltiga inställningar ()

{selectInput ("Välj en bild", "imageChosen"); noLoop (); vänta(); }

void setup ()

{output = createWriter (_OUTPUT); black_b = createImage (SQL, SQL, RGB); black_b.loadPixels (); för (int i = 0; i = line_num) {noLoop (); output.flush (); output.close ();} bakgrund (black_b); pushMatrix (); imageMode (CENTER); translate (SQL/2, SQL/2); rotera (radianer (l*360/line_num)); bild (img, 0, 0); popMatrix (); pushMatrix (); för (int i = 0; i <144; i ++) {color c = get (int (i*led_t+led_t/2), int (SQL/2)); output.print ((char) röd (c)+""+(char) grön (c)+""+(char) blå (c)); // print ((char) röd (c)+""+(char) green (c)+""+(char) blue (c)+";"); fyll (c); rect (i*led_t, (SQL/2)-(led_t/2), led_t, led_t); } // println (); popMatrix (); // fördröjning (500); l ++; }

void keyPressed ()

{output.flush (); // Skriver återstående data till filen output.close (); // Avslutar filavslutningen (); // Stoppar programmet}

ogiltig bildVald (fil f)

{if (f == null) {println ("Fönstret stängdes eller användaren träffade avbryt."); exit (); } annat {if (f.exists ()) img = loadImage (f.getAbsolutePath ()); Sträng s = f.getAbsolutePath (); String list = split (s, '\'); int n = list.length; String fle = split (lista [n-1], '.'); println ("Öppna fil:"+fle [0]); _OUTPUT = fle [0]+". Bin"; // img = loadImage ("test.jpg"); int w = img.width; int h = img.höjd; SQL = max (w, h); storlek (SQL, SQL); led_t = SQL/144.0; println ("h ="+h+"w ="+w+"max ="+SQL+"storlek led ="+led_t); }} void mousePressed () {loop ();}

ogiltiga mydata ()

{byte b = loadBytes ("something.dat"); // Skriv ut varje värde, från 0 till 255 för (int i = 0; i <b.length; i ++) {// Var tionde siffra, starta en ny rad om ((i % 10) == 0) println (); // byte är från -128 till 127, detta konverteras till 0 till 255 int a = b & 0xff; print (a + ""); } println (); // Skriv ut en tom rad i slutet saveBytes ("numbers.dat", b); } void wait () {while (img == null) {delay (200); } loop (); }

Steg 3: Programvaruimplementering Del 2

Image
Image
Programvaruimplementering Del 2
Programvaruimplementering Del 2
Programvaruimplementering Del 2
Programvaruimplementering Del 2

MCU -visningsprogram

högpresterande ESP8266-chip har valts av två anledningar, först har det väl utvecklat öppna SDK-verktyg för att dra nytta av WiFi-funktioner vid sidan av minnet för att vara värd för en webbserver för användare. Med denna funktion, användarvänlig webbserver utformad för att ladda upp den pixeliserade bilden till MCU-minnet och skapa användardefinierat scenario för show. Med 4 Mb ESP-12E-serien kan vi använda 1 Mb för program och 3 Mb för bilder som med storleken 112,5 KB för pixeliserad bild skulle kunna grovt 25 bilder laddas upp på MCU och kan göra valfri sekvens eller visningsperiod för uppladdad bild som jag använder Arduino kodbasimplementering för att göra webbservern. kod har tre huvudfunktioner i slingan enligt följande

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 ("Filnummer =%u namn:%s adress:%u varaktighet:%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 ++; delay (LineIntervalDelay); } if (Current_imageLine> = IMAGES_LINES) {Current_imageLine = 0; _memory_pointer = start_address_of_imagefile [image_index-1]; }} optimistisk_utbyte (1000); }

Serverhanteraren server.handleClient (); ansvarig för att behandla alla klientförfrågningar på webbhotell, den här webbplatsen kan vara utformad godtycklig för att ladda upp data, ändra visningsinställningen för någon statlig rapport. Min webbhotell består av tre flikar som följande bilder på den första fliken, vi kan kontrollera det aktuella scenariot med show med sekvens och varaktighet för varje bild, även nätverksinformation samt POV -varvtal visas

på fliken uppladdningsbild kan vi ladda upp en pixeliserad bild till MCU -minnet eller ta bort specifik bild

på fliken nätverk kan vi ändra nätverksinställningar som wifi -läge, statisk ip, nätverksnamn och pass,..

Bilduppladdare

denna funktionsserverklientförfrågan från Ajax om att ladda upp pixeliserad bild till MCU -minnet, skriv sedan filen i minnet i råformat så att du kan läsa filen så snabbt som möjligt. Lagringsplats för minnesstart och slut i tabellen för visning i LED -remsa

Displayfunktion

Jag använde FastLED lib för att visa pixlar i LED -remsor, detta bibliotek är ett av de mest framgångsrika och välutvecklade för LED -showen på AVR- och ESP -plattformen. Det är bara att skicka FastLED -funktionen, platsen för lagrad LED -pixel. vi läser rad för rad pixlar från minnet och visar det i LED -remsa och väntar på att ny rotationsflagga ska gå i uppfyllelse. vi upprepade denna sekvens tills 200 rader av varje bild har lästs

hela koden som finns i mitt git -arkiv här

följande är videon av POV i aktion som spelas in med mobilkamera och som jag förklarade är videokvaliteten inte bra på grund av långsam membranhastighet för oprofessionell kamera

Rekommenderad: