Een kartonnen televisor (met arduino en LEDs) (11 / 14 stap)

Stap 11: Afbeeldingen omzetten in geluid!



Om te spelen iets op de televisor, een afbeelding (de film bestaat uit afzonderlijke beelden) moeten worden gedifferentieerd naar een verschillende lichtsterkte van de LED's binnen de televisor.

Zoals iedere hole het venster doorkruist, bepaalt de wisselende intensiteit van de LED's de intensiteit van die specifieke locatie waar een gat op dit moment ligt. Dus wordt het beeld gevormd door de regel.

Ik heb al gezegd dat de intensiteit van de LED's als een audioapparaat zal worden gecontroleerd.  Dit is gewoon audio coming out van een hoofdtelefoonaansluiting van mijn laptop in een versterker op de LED. (meer daarover later)
Dus, het programma moet de witheid van de lijnen omzetten in een spanning in de audio-uitgang van mijn laptop.
Principe een geluidsbestand moet worden gecreëerd en gespeeld, het is zo simpel.

Om dit te doen, is een beeld genomen en onderverdeeld in 24 kolommen (elke één vertegenwoordigt een gat overschrijding van het venster).  Elke regel wordt vervolgens omgezet in een afbeelding met grijstinten .
De witheid of intensiteit wordt berekend als volgt:

Elke pixel heeft een waarde van rood, groen en blauw, samen vormen ze de specifieke kleur die u ziet. Als u wilt converteren van deze rode, waargenomen groene en blauwe waarden in de algemene intensiteit van het oog, volgende formule wordt gebruikt:

intensiteit = 0,29 * rood + 0.71 * groen + 0,08 * blauw.

Dit is omdat de gevoeligheid van het oog voor verschillende kleuren verschilt. (Ook, merk op dat in het wikipedia-artikel vindt u 2 formules, maar sindsdien kwam ik op naar de tweede men het meest, thats degene die ik gebruik. En dus het meest geschikt is voor gebruik in televisies werd vastgesteld (maar het maakt niet uit welke van de twee wordt gebruikt, is er niet veel verschil)
Opmerking dat ik onmiddellijk de intensiteit opslaan in een array van 'short' Dit is omdat een korte 2 bytes of 16 bits lang is de resolutie die ik gebruik voor mijn wav-bestand.

Er zijn nu 24 arrays van intensiteiten die moeten worden in een WAV-bestand. Afhankelijk van de snelheid van de steekproef, zijn deze arrays weggegooid.
Bijvoorbeeld om te bouwen mijn WAV-bestand, ik wil om het te spelen met een sample snelheid van 44100 Hz, die de meest voorkomende samplefrequentie is.  En de schijf duurt 1/12 seconden te draaien.  En iedere hole doorkruist het venster tijdens de periode dat de schijf moet draaien 14.8 graden, dus een 14,8/360 deel van een rotatie.  Dus, gewoon volgende formule wordt gebruikt:

amount_bins = SPS * (Rotationperiod) * (deel van de rotatie een gat is zichtbaar)

Dit komt neer op 151 (afgeronde) opslaglocaties in mijn geval.
Dus, in eenvoudige termen, het beeld is nu verdeeld in 151 rijen en kolommen van de 24.  En alle onderdelen zijn intern gemiddeld zodat je met een afbeelding met grijstinten van 24 door 151 pixels eindigen.

Vanuit deze omgezette afbeelding die de 24 rijen (elk een een matrix van 151 getallen) vervolgens samen na elkaar afgegeven aan formulier gestikt zijn een array van 24 * 151 = 3624 nummers of monsters.  Wanneer deze gegevens wordt gebracht in het WAV-bestand, zal het het geluid dat nodig is voor het produceren van een afbeelding.

MAAR, een revolutie van de schijf duurt 1/12e van een seconde en met een sample rate van 44100 Hz dit gebruikersaccounts aan 3675 monsters. Dus, ziet u dat er 51 nummers niet gebruikt.  En dit is helemaal fijn, want dat is gewoon dat kleine stukje van ongebruikte ruimte op de schijf, als je kijkt naar de sjabloon van de posities van de gat in een van de eerste stappen.

Dit is principe al belangrijk materiaal.
Nu is de gegevens simpel gezegd in een WAV-bestand.  Ik verwijs naar deze pagina op het formaat van WAV-geluiden tot in detail weten de regelingen van de bytes.  U herkent alles van die pagina in de makeWav() functie (en de printInfo() fuction) duidelijk in het bestand 'wavreader.cpp'.  Ik gewoon binaire afdrukken alle van de dingen die ze zeggen.

Wat je eindigen met is een audio-bestand.  Als de disc uit de televisor wordt gesponnen tot de juiste snelheid en het geluidsbestand dat wordt afgespeeld (doorlopend 1000 keer voor het gemak) dan het beeld kan men duidelijk zien afromen over het scherm.

Zo, eerst en vooral voor het programma zelf gebruik ik Magick ++ omdat ImageMagick ongelooflijk krachtig en makkelijk te gebruiken is. Ik was erg blij dat het ook een beeldbewerking bibliotheek voor C++ genaamd Magick ++ geboden.
Alle de lezing en het schrijven van pixels werd gedaan met deze bibliotheek.  Er is een heleboel uitleg over hoe te installeren en gebruiken op hun belangrijkste pagina, voor linux, mac en windows.

Ten tweede ik een oud stukje van de kabeljauw die ik een lange tijd geleden heb geschreven.  Ik wilde de gegevens lezen uit een WAV-bestand, dus ik schreef een wavreader. Pas op dat er wat vuil code (Vergeet niet de waarschuwingen).  Het is een mix van C en C++, werkt prima maar het is niet juist.
Het probleem was (en is) dat ik niet weet hoe ik een FileAid als lid van een klasse kan hebben. Of iets gemakkelijk die permanent onthoudt wat plaatst u het op in een bestand. Dus ik ging van de C-stijl en een eenvoudige bestands pointer gebruikt.

Dus, ik gebruik Linux, en dit is de compile-commando dat werkt:

  g++ -O3 -o image main.cpp wavreader.cpp `Magick++-config --cppflags --cxxflags --ldflags --libs` 

(als je het probeert, u zal zien 3 waarschuwingen dat sommige retourwaarden zijn genegeerd, het is niet dat slecht, ze gewoon op te lossen wat (voor mij) nutteloze dingen aan toevoegt sommige echt kleine functies).  (en de - O3 is een beetje voor snelheid, maar het maakt niet uit want ik heb niet geprobeerd dit programma met grote batches van foto's)

Natuurlijk kunt u uw favoriete GUI alleen oppassen dat het niet een normale vlag. Ik heb nog nooit gezien dit eerder, maar Magick ++-config is iets dat automatisch de vlaggen vandaar drukt het ' ' symbolen.
En in qtCreator bijvoorbeeld heb je deze regel toevoegen aan het pro-bestand:
QMAKE_CXXFLAGS += $$ systeem (Magic ++-config--cxxflags--cppflags)
(dat is raar, dat is de reden waarom ik het gemaakt in Codeblocks waar u enkel de litteraly spullen toevoegen kon zoals deze wordt weergegeven in de compile-opdracht)

Eigenlijk het programma te gebruiken die u enkel typen:

 ./image Saturn.jpg 

(dat is in mijn geval de



van wikipedia) Na een kwart van een seconde of zo, wordt de afbeelding boven deze pagina teruggezonden samen met het audio-bestand (zie hieronder).
Kijk naar de foto van het audio-bestand in de audio, herkent u duidelijk de linker kant van de ring in de dubbele pieken! (Saturn.wav)

Als je twee beelden als argument geven, het programma steken ze elkaar automatisch: (namen en de .wav als het eerste argument)
BV

 ./image Saturn.jpg face.jpg 

(het gezicht was die van René van ' Allo ' Allo!)
Dit geeft dan na wav-bestand: (opnieuw genoemd Saturn.wav)

Maar om aan te tonen van de functionaliteit van dit kleine programma laat onderzoeken dit gif: (gekregen van hier)
U kunt dan krijgen met Imagemagick alle afzonderlijke frames. Als u ze in een map plaatsen en het programma van het beeld op hen ontketenen krijg je een heleboel geconverteerde afbeeldingen waaruit kunt u een nieuwe gif:

(Ik heb al de geconverteerde afbeeldingen weer bij elkaar in een gif, dit gebeurt niet automatisch omgezet)
Maar belangrijker is het programma ook weer de gehele wav-bestand waaruit u een fragment hieronder kunt zien. U kunt gemakkelijk herkennen de afzonderlijke frames. (het is ingezoomd)

Iets raar dat ik niet meteen uitleggen is dat het niet werkt met afbeeldingen die al in grayscales.
Ook als grote gebieden van volledig zwart of volledig witte pixels aanwezig zijn, werkt het niet Eiteren.

Update: Als al het bovenstaande is een beetje te technisch, of hebt u problemen bij het compileren of het installeren van de Bibliotheken, ik heb het uitvoerbare bestand in een zip hieronder toegevoegd.  (dus, unzip en stormloop op als u vertrouwt me)
Ik heb echter gemerkt dat het niet op windows werkt, wie zit vervelend. Het is niet zo onbelangrijk als ik dacht dat het zou.

Gerelateerde Artikelen

Maken van een kartonnen ghettoblaster met fancy knipperende LEDs

Maken van een kartonnen ghettoblaster met fancy knipperende LEDs

maakte ik een ghettoblaster kartonnen doos voor een 80s thema gekostumeerd partij. Ik dacht dat ik zou delen hoe ik heb gemaakt hier.Wat ik gebruikt/wat u nodig zult hebben:Kartonnen doosDiverse verfMasking tape20 LEDs40 draden ongeveer 10 inches lan
Het gebruik van een P10-Module met arduino

Het gebruik van een P10-Module met arduino

Hallo iedereen, in dit project, we gaan om te leren hoe met een P10-module met arduino nano. U moet kopen een P10-module en een voeding. Er zijn wat goede informatie over de freetronics.Stap 1: P10 Module Kenmerken:32 x 16 hoge helderheid rode LEDs (
Hacken van een RC auto met Arduino en Android

Hacken van een RC auto met Arduino en Android

(Als je dit Instructable, vergeet dan niet te stemmen (boven: rechts hoek vlag). het is concurreren op ROBOTICA en sensoren wedstrijden. Heel hartelijk bedankt! ;-)Telkens wanneer ik wandelen in een speelgoedwinkel en afstandsbediening auto's in het
De LED Strip kwallen kostuum met Arduino & LPD8806 Led Strips

De LED Strip kwallen kostuum met Arduino & LPD8806 Led Strips

het begon allemaal toen ik zag een documentaire van de BBC in 2002 over de diepe wateren van de Oceaan. Er was een biolimunescent kwal in de documentaire, waarschijnlijk van de soort "ribkwallen" die greep mijn aandacht dus heb ik in de latere j
DIY een fiets achterlicht met Arduino

DIY een fiets achterlicht met Arduino

Ik ben een liefhebber van fietsen.Jaren geleden, toen ik een knappe jongeman ben, in mijn tweede jaar aan het College, had ik de rit van Sichuan naar Tibet, de beroemde G318 in China afgerond. Het is bekend als's werelds mooiste en meest gevaarlijke
Aan de slag met Arduino - RGB LED

Aan de slag met Arduino - RGB LED

In deze tutorial zullen we kijken naar hoe draad van een rood/groen/blauw (RGB) licht emitterende Diode (LED) tot en met een Arduino en besturing van het via de seriële poort. U kunt een RGB LED basisonderdeel (dat wil zeggen een kunststof koepel met
Beheersing van een DC-Motor met Arduino

Beheersing van een DC-Motor met Arduino

De laatste tijd heb ik gewerkt aan een draadloze afstandsbediening voor een robotachtig wapen. De meeste van alles wat uit is gepland, maar ik heb niet alle onderdelen en schilden nog, dus heb ik besloten om te beginnen van prototyping met een intern
Controle van een OWI robotarm met Arduino

Controle van een OWI robotarm met Arduino

de OWI rand robotarm is een goedkope en geweldig 5-mate-van-vrijheid robotic arm dat alleen kost $37. Het is een grote kit met een kind op te bouwen en meer dan een paar uur tot finish zal niet duren. Uit de doos, kan het alleen worden gecontroleerd
Controle van een DC-motor met Arduino en Visual Basic

Controle van een DC-motor met Arduino en Visual Basic

Hallo vrienden dit is mijn eerste post in instructables.com waar ik zal proberen om meer nieuwheid des vaak.Thema is vandaag met Arduino en Visual Basic.Het project dat we nu zien is een dc-motor controller met Arduino en Visual Basic.Om te controler
Open uw deur met een speciale klop met Arduino, Android telefoon- en 1Sheeld

Open uw deur met een speciale klop met Arduino, Android telefoon- en 1Sheeld

Nu u niet meer, de sleutel gebruiken met dit eenvoudige project die u en ieder lid van uw gezin kunnen openen uw deur zonder sleutel en ook u zal niet elke keer naar de deur te openen, kunt u het openen vanaf elke plek, alles wat je wilt is uw Androi
Het creëren van een digitale thermometer met Arduino

Het creëren van een digitale thermometer met Arduino

heb je ooit voorstellen maken hun eigen digitale thermometer? Met de ontwikkeling van steeds geavanceerdere technologie is wat niets onmogelijk.Ditmaal het project is het creëren van uw eigen digitale thermometer met Arduino. Dat moet worden geleerd
Een Steampunk lamp met muliti kleur LED's

Een Steampunk lamp met muliti kleur LED's

als het oplichten lijkt het alsof een fee is zoemen rond de bol :-)It´s een oude 200 Watt gekleurd lamp waar ik de binnenste delen verwijderd.I vervangen de binnenste delen door 10 RGB LEDs met automatische kleur wijzigen.Yo kan een dergelijke lamp m
Maak een zelfbalancerende Robot met Arduino UNO

Maak een zelfbalancerende Robot met Arduino UNO

Self balancing Robot is zeer interessant. Veel vrienden om ons heen wilden maken een, maar ze encounted alot van chanllenges met inbegrip van het ontbreken van de gemakkelijk-aan-de vergadering van structuren, de geschikte elektronische schakelingen
Aan de slag met Arduino - knipperende LED

Aan de slag met Arduino - knipperende LED

In deze tutorial lopen we u stapsgewijs door het proces in uw eerste arduino project krijgen up and running.Stap 1: Bouw uw circuit Voor dit project moet u één Light Emitting Diode (LED)Sommige LED's kunnen worden gebruikt op hun eigen, anderen verei