1 meter POV met IOT ingeschakeld - Ajarnpa
1 meter POV met IOT ingeschakeld - Ajarnpa
Anonim
Image
Image
1 meter POV met IOT ingeschakeld
1 meter POV met IOT ingeschakeld
1 meter POV met IOT ingeschakeld
1 meter POV met IOT ingeschakeld
1 meter POV met IOT ingeschakeld
1 meter POV met IOT ingeschakeld

Voordat ik met de uitleg over dit project begin, wil ik mijn excuses aanbieden voor beeld en video van lage kwaliteit, maar eerlijk gezegd is het echt moeilijk om een scherp en duidelijk beeld te maken van het draaien van POV met een normale camera zoals mijn mobiele camera. Het heeft een zeer snelle optische lens met diafragma nodig om echte beweging vast te leggen, maar ik zal de betere video uploaden wanneer ik eindelijk mijn CANON-camera kan kopen

Wat is de POV

POV staat voor Persistence Of Vision Globe, wat gerelateerd is aan het fenomeen van het menselijk zicht. Lichtstimulus blijft ongeveer 1/10 van een seconde als een nawerking op het netvlies hangen. Wanneer lichtstimuli snel achter elkaar worden gesequenced, versmelten ze tot één doorlopend beeld. In feite is het de basis voor film- en televisietoestellen,. POV maakt zo'n illusie (bedrieg ons) en creëer het beeld door de reeks LED-lampjes rond een enkel punt of as te draaien

Wat is projectinnovatie?

Natuurlijk is POV geen nieuw idee en er bestaan al veel projecten in Instructables of op andere sites, maar die projecten gebruiken meestal een vooraf ingestelde statische tempel of afbeelding die meestal wordt gelezen uit MCU-geheugen of SD-kaart, maar in dit project gebruiken we prachtige functies implementeren van IOT-enabled chip zoals ESP8266 in deze kwestie.

Met deze IOT-functies hebben we

  1. kan gemakkelijk nieuwe afbeeldingen draadloos naar het geheugen uploaden
  2. creëer het gewenste scenario van beeldshow met elke volgorde of elke duur
  3. het is niet nodig om de chip opnieuw te programmeren of de geheugenkaart los te koppelen en opnieuw aan te sluiten voor een nieuwe animatie
  4. gebruiksvriendelijke IOT-webhost maakt het voor iedereen gemakkelijk om POV te beheren met mobiel of tablet, zelfs op afstand
  5. zeer goedkope hardware-implementatie met een capaciteit van meer dan 30 verschillende afbeeldingen

Hoe POV werkt

POV-displays, een lineaire (1-dimensionale) reeks LED-lampjes roteert rond een enkel punt, zoals een fietswiel. Door hun rotatiesnelheid te meten en hun flitsen met millisecondenprecisie te regelen, kunnen we de illusie wekken van een twee- of driedimensionaal beeld dat in de lucht blijft hangen. Laten we eens kijken naar het enkele frame van elk effect (afbeelding, tekst, …), elk frame bestaat uit veel pixels en dus veel lijnen in een vlak of bolvormig gebied, POV geeft dit beeld weer met een enkele afbeeldingslijn die van positie is veranderd samen met zijn rotatie om te vullen dat beeld, dus het probleem is hoe de LED-pixelkleur nauwkeurig kan worden geregeld in tijd en ruimte, zodat het een volledig beeld kan creëren. POV wordt gecategoriseerd op basis van de rotatie-as, het type effect dat kan worden weergegeven en hoeveel kleur kan worden gecreëerd.

Door verschillende rotatie-assen kan een vlakke, cilindrische en bolvormige POV-weergave worden geproduceerd

veel POV-projecten gebruiken eenvoudige eenkleurige LED of snelle slimme pixels zoals WS2812 of APA104 en in dit project gebruiken we de snelle LED-chipverfrisser APA102 met een verversingssnelheid van praktisch ongeveer 16 MHz. deze LED-chip heeft 2 lijnen om te bedienen (aarde, data, klok, +5v)

Stap 1: Hoe POV te bouwen

Hoe POV te bouwen
Hoe POV te bouwen
Hoe POV te bouwen
Hoe POV te bouwen
Hoe POV te bouwen
Hoe POV te bouwen

In eerste instantie heb ik de structuur nodig om de POV-hub te monteren, het maken van de metalen of niet-metalen structuur is afhankelijk van wat je in handen hebt. Je kunt het maken met elk beschikbaar materiaal om het aan een muur te installeren of poten toevoegen om het te laten staan. Mijn vriend maakt het eenvoudige statief en monteert het distributieriemmechanisme om het toerental van de DC-motor rond 500 te verminderen. Kleine wiskunde Voor een duidelijk en coherent beeld hebben we frameverversing rond 20 fps nodig, het is gemeen om een duidelijk beeld te hebben, we moeten het herhaaldelijk ongeveer 20 weergeven keer per seconde, aangezien mijn POV uit 1 diagonale LED-strip bestaat, vandaar dat elk frame wordt aangevuld met een halve of rotatie, met andere woorden, we hebben de ideale hub RPM rond de 600 nodig en met deze RPM duurde elke omwenteling ongeveer 100 ms. volgende vergelijking demonstreert dat concept RPM=(fps/Nb)*60 waarbij Nb gelijk is aan Aantal vertakkingen, en in dit geval hebben we RPM=(20/2)*60=600mijn POV roteert rond 430 rpm, dus mijn fps is ongeveer 15 fsp wat op dit punt redelijk goed is. Het mechanische gedeelte bouwen

In de volgende stap heb ik een stukje PVC-cilinder Milled gebruikt om de LED-balk vast te houden. Om de naaf met de poelie-as te verbinden, is een M10-bout vastgeschroefd aan de achterkant van PCV-onderdeel Twee koperen ring geïnstalleerd op de poelie-as om 5 volt DC naar het bord en de led-strip over te brengen, en volgens de volgende afbeeldingen is dit onderdeel op de eenvoudige poelie gemonteerd tijdtransmissiesysteem dat is aangesloten op een 12v DC-motor, elk onderdeel heeft zijn eigen voeding en is ingesloten in een witte doos die aan de poten is bevestigd

Stap 2: Software-implementatie deel 1

Software-implementatie deel 1
Software-implementatie deel 1

Om de gegeven afbeelding in LED-strip te demonstreren, moet elke afbeelding worden gepixeld en vervolgens worden geüpload naar het MCU-geheugen en vervolgens regel voor regel naar de LED-strip worden gevoerd, om dat te doen heb ik software gemaakt voor twee verschillende platforms, één is gebaseerd op Java runtime Processing en andere in C++ voor MCUProcessing gepixeld programma dit programma schreef in Processing IDE en het opent eenvoudig het afbeeldingsbestand en roteert het vervolgens in stappen om gepixelde afbeeldingslijnen te extraheren. Ik kies 200 lijnen voor het weergeven van een afbeelding, dus ik roteer de afbeelding tegen (360 /200=1,8 graden) 200 keer om 200 regels te extraheren. Omdat mijn LED-strip bestaat uit 144 LED's met ingebouwde APA102-chip, heeft een hele afbeelding dus 200 * 144 = 28800 pixels. Omdat elke kleur in de APA102-chipweergave met 4 byte (W, RGB) is, is elke afbeeldingsgrootte precies 200 * 144 * 4 = 115200 of 112,5 KB volgende Verwerkingscode laat de volgorde van afbeeldingspixels zien, en het resultaat is een bin-extensiebestand dat kan worden geüpload naar MCU-geheugen

PImage img, black_b, image_load;PrintWriter-uitvoer; int-SQL; float led_t; byte pov_data; int line_num=200; Tekenreeks _OUTPUT="";

ongeldige instellingen()

{ selectInput("Selecteer een afbeelding", "imageChosen"); noLoop(); wacht(); }

ongeldige 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(CENTER); vertalen(SQL/2, SQL/2); roteren (radialen (l*360/line_num)); afbeelding (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)+";"); vul (c); rect(i*led_t, (SQL/2)-(led_t/2), led_t, led_t); } // println(); popMatrix(); // vertraging (500); l++; }

void-toets ingedrukt()

{ uitvoer.flush(); // Schrijft de resterende gegevens naar het bestand output.close(); // Voltooit het bestand exit(); // Stopt het programma}

void imageChosen (Bestand f)

{ if (f == null) { println("Venster is gesloten of de gebruiker heeft op annuleren gedrukt.");exit(); } else { if(f.exists()) img = loadImage(f.getAbsolutePath()); Tekenreeks s=f.getAbsolutePath(); String lijst = split(s, '\'); int n=lijst.lengte; String fle=split(lijst[n-1], '.'); println("Bestand openen:"+fle[0]); _OUTPUT=fle[0]+".bin"; // img = loadImage ("test.jpg"); int w = img.breedte; int h = afb.hoogte; SQL=max(b, h); grootte (SQL, SQL); led_t=SQL/144.0; println("h="+h+" w="+w+" max="+SQL+" size led="+led_t); } } void mousePressed(){ loop();}

ongeldig mijndata()

{ byte b = loadBytes("iets.dat"); // Druk elke waarde af, van 0 tot 255 voor (int i = 0; i <b.length; i++) { // Begin elk tiende getal een nieuwe regel if ((i % 10) == 0) println(); // bytes zijn van -128 tot 127, dit wordt geconverteerd naar 0 tot 255 int a = b & 0xff; afdrukken (een + " "); } println(); // Druk een lege regel af aan het einde saveBytes("numbers.dat", b); } void wait() { while (img == null) { delay(200); } lus(); }

Stap 3: Software-implementatie deel 2

Image
Image
Software-implementatie deel 2
Software-implementatie deel 2
Software-implementatie deel 2
Software-implementatie deel 2

MCU-weergaveprogramma

high-performance ESP8266-chip is om een aantal redenen geselecteerd, ten eerste heeft het goed ontwikkelde open SDK-tools om te profiteren van WiFi-functies naast geheugen om een webserver voor de gebruiker te hosten. Met deze mogelijkheden is een gebruiksvriendelijke webserver ontworpen om de gepixelde afbeelding naar het MCU-geheugen te uploaden en een door de gebruiker gedefinieerd scenario voor de show te creëren. Met 4 Mb ESP-12E-serie kunnen we 1 Mb gebruiken voor programma en 3 Mb voor afbeeldingen die met een grootte van 112,5 KB voor pixelafbeeldingen we ongeveer 25 afbeeldingen kunnen uploaden op MCU en elke reeks of weergaveperiode kunnen maken voor geüploade afbeelding die ik gebruik Arduino code base implementatie voor het maken van de webserver. code heeft drie hoofdfuncties in zijn lus volgens het volgende:

void loop() { if(!SHOW && !TEST) server.handleClient(); if(SHOW) { if((millis()- OpenlastTime) >DUUR [image_index]*1000) { if(image_index>=IMAGE_NUM) image_index=0; _memory_pointer=start_address_of_imagefile[image_index]; Serial.printf("Bestandsnummer=%u naam:%s adres:%u duur:%u\n", image_index, IMAGES[image_index].c_str(), start_address_of_imagefile[image_index], DURATION[image_index]); Current_imageLine=0; afbeelding_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++; vertraging (LineIntervalDelay); } if(Current_imageLine>=IMAGES_LINES) { Current_imageLine=0; _memory_pointer=start_address_of_imagefile[image_index-1]; } } optimistisch_rendement(1000); }

Serverhandler de server.handleClient(); verantwoordelijk voor het verwerken van elk verzoek van een klant op de webhost, deze website kan willekeurig zijn ontworpen om gegevens te uploaden, de weergave-instelling van een staatsrapport te wijzigen. Mijn webhost bestaat uit drie tabbladen met de volgende afbeeldingen op het eerste tabblad kunnen we het huidige scenario van de show met volgorde en duur voor elke afbeelding controleren, ook netwerkinformatie en POV-rpm getoond

op het tabblad afbeelding uploaden kunnen we een gepixelde afbeelding uploaden naar het MCU-geheugen of een specifieke afbeelding verwijderen

op het tabblad netwerk kunnen we de netwerkinstellingen wijzigen, zoals wifi-modus, statische ip, netwerknaam & pas,..

Afbeelding uploaden

deze functie server client verzoek van Ajax om gepixelde afbeelding naar het MCU-geheugen te uploaden, en vervolgens het bestand in het geheugen in onbewerkte indeling te schrijven, zodat het lezen van het bestand zo snel mogelijk is. Geheugen start- en eindlocatie opslaan in tabel voor weergave in LED-strip

Weergavefunctie:

Ik heb de FastLED-lib gebruikt om pixel in LED-strip weer te geven, deze bibliotheek is een van de meest succesvolle en goed ontwikkelde voor LED-show op AVR- en ESP-platform. Het is alleen nodig om de FastLED-functie te verzenden, de locatie van de opgeslagen LED-pixel. we lezen regel voor regel pixels uit het geheugen en tonen deze in LED-strip en wachten tot de nieuwe rotatievlag uitkomt. we herhaalden deze reeks totdat 200 regels van elke afbeelding waren gelezen

de hele code bevindt zich hier in mijn git-repository

hierna volgt de video van POV in actie die is opgenomen met een mobiele camera en zoals ik heb uitgelegd, is de videokwaliteit niet goed vanwege de lage diafragmasnelheid van de onprofessionele camera

Aanbevolen: