DIY Disco verlichting voor beginners door een beginner

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • WouterT13
  • Registratie: Juli 2012
  • Laatst online: 09-09 20:01
Kort geleden heb ik examen gedaan en ben gelukkig ruim geslaagd. Nu heb ik tijd om me weer te focussen op andere dingen. Vandaar dat ik aan een project ben begonnen. Wat ik wilde bereiken was simpel: leren om te gaan met de arduino (ik heb nog nooit geprogrammeerd). Ik heb dit gedaan door middel van een leuk project. Namelijk het laten bewegen en kleuren van licht op basis van muziek. Uiteindelijk is het gelukt (hoewel er misschien nog wat verbeterpuntjes mogelijk zijn). Daarom wil ik het project graag hier delen, zodat andere mensen er eventueel ook mee aan de slag kunnen. Ik ga proberen dit zo te schrijven dat dit voor totale beginners totaal te volgen is. Op het moment is het nog niet volledig. Ik ga proberen het zo snel mogelijk af te maken. Hier in elk geval vast een begin.
een filmpje (sorry voor de slechte geluidskwaliteit)




Wat heb je nodig?

Er zijn een aantal dingen nodig om aan dit project te beginnen:
- Een arduino
- Een RGB-ledstrip
- Een adapter van een 3,5mm-audioplug naar drie draadjes.
Afbeeldingslocatie: http://s11.postimg.org/jyinajhbz/3_5mm.jpg
- 3x MOSFET (die stroom doorlaten bij 5V en geen stroom doorlaten bij 0V en die de stroomsterkte van de ledstrip aankunnen)
- 2x 12V-voeding
- 2x 270 Ohm weerstand
- 1x 330 Ohm weerstand
- 4x 100 kOhm weerstand
- 1x 500 Ohm potmeter
- 1x 5532 OP AMP
- 1x 0,33uF Condensator
- 1x 1uF Condensator
- 2x 10uF Condensator
- 1x 70 kOhm weerstand
- 1x 50 kOhm weerstand
- Draadjes om alles aan te sluiten.

Wat nu?

Om dit project werkend te krijgen, moeten we natuurlijk op een bepaalde manier de audio uitlezen, die uit de audiobron komt. Audio bestaat in de vorm van een sinusfunctie. In tegenstelling tot normale stroom, die een constant voltage heeft, zal het voltage van audio dus verschillen. De afbeelding geeft een duidelijk beeld hiervan.

Afbeeldingslocatie: http://s15.postimg.org/kp0e6ytg7/currents.jpg

“Alternating Current” is vergelijkbaar met audio (audio heeft dus soms ook negatief voltage). Direct Current is een constant voltage. In het echt zal het echter niet zo zijn dat uit een audio-bron een perfect sinus-vormig signaal komt, omdat voor muziek meerdere verschillende sinus-functies worden gecombineerd van verschillende frequenties en amplitudes. Deze voltages zorgen voor een stroom door de boxen, waardoor een elektromagneet ontstaat, waardoor beweging ontstaat in de boxen. Deze beweging zorgt ervoor dat de lucht bewogen wordt, waardoor je geluid hoort. Hier ga ik verder niet op in in deze tutorial.

Wij lezen het voltage dat naar de boxen wordt gestuurd af met een arduino. Voor we het geluid echter (met een zo hoog mogelijke resolutie) kunnen aflezen, moeten we het audio-signaal als het ware klaarmaken voor de arduino. Er zijn een paar dingen waarmee we rekening moeten houden, als we dat gaan doen:
De arduino kan op zijn “analog-in” voltage lezen van 0V tot 5V. Een negatief voltage op deze aansluitingen is, volgens sommige bronnen op internet, slecht voor de levensduur van de arduino. We willen dus dat het inkomende audio-signaal tussen de 0v en 5V blijft. Hiervoor verhogen we de evenwichtsstand van het audiosignaal naar 2,5V, waardoor het negatieve voltage nu niet meer negatief is, maar onder de 2,5V komt. Als eerder het voltage bijvoorbeeld -1V was, is het nu (2,5 -1 =) 1,5V.

De arduino leest zijn analog-in af met een resolutie van 4,9mV. Een normaal volume audio-signaal is ongeveer een amplitude van 300mV. Dat betekent dat er 60 meetstapjes zijn. (namelijk 300mV/4,9mV = ongeveer 60). Om dit te verbeteren versterken we het signaal tot een amplitude van 2,5V. Je vraagt je nu misschien af waarom we het verhogen naar 2,5V en niet naar 5V (de arduino kan immers lezen van 0V tot 5V. Het is echter zo dat de evenwichtsstand van het (versterkte) audiosignaal al 2,5V is, waardoor bij een amplitude van 2,5V het maximale voltage (2,5 + 2,5 =) 5V is. Het minimale voltage is dan (2,5 – 2,5 =) 0V. Dat valt binnen de eisen die we hadden gesteld (0V – 5V) met een zo hoog mogelijke resolutie, namelijk (2500mV/4,9mV = ongeveer) 500. Zie de afbeelding voor een illustratie.

Afbeeldingslocatie: http://s2.postimg.org/m0jwt6r51/DCoffseteffect.jpg

Nu we weten wat ons doel is, gaan we kijken hoe we dit kunnen bereiken. We beginnen met de versterking. De versterking is relatief simpel. We gebruiken voor de versterking een OP AMP in de vorm van een IC (integrated circuit). In dit geval gebruiken we de 5532 OP AMP.
We maken daarmee een “non-inverting amplifier”. Dat ziet er in schema eenvoudig uit. Het ziet er namelijk zo uit:

Afbeeldingslocatie: http://s16.postimg.org/5k856q87l/versterker.jpg

Hierbij is Vin het audio-signaal dat nog niet versterkt is en is Vout het audio-signaal dat al wel versterkt is. De weerstanden R1 en R2 bepalen de mate van versterking van Vin. Die versterking wordt bepaald door de volgende formule:

Afbeeldingslocatie: http://s22.postimg.org/6niz9x5b1/formula.jpg

Wij Hebben een Vout nodig van max 2,5V. Het probleem is dat we een variabele Vin hebben. Het is namelijk natuurlijk zo dat niet elke audiobron een even sterk signaal afgeeft. Daarom maken wij R1 variabel, waardoor de versterking van Vin aangepast kan worden. R1 wordt een potmeter van 500 Ohm. Dat betekent eigenlijk dat het een weerstand is die gevarieerd kan worden van 0 Ohm tot 500 Ohm. Daarnaast nemen we een R2 van 330 Ohm. We hebben dan een maximale versterking van (1 + (330/0) =) bijna oneindig (in elektrotechniek is er nooit een weerstand van absoluut 0, aangezien de draden en dergelijke ook een weerstand hebben.). De minimale versterking is dan (1 + 330/500 =) 1,7. Minder dan 1,7 zal je nooit nodig hebben, aangezien een audiobron nooit een voltage van hoger dan 1V zal geven.

Afbeeldingslocatie: http://s3.postimg.org/zdr58n1fj/schema1.jpg

Er zijn nog een paar dingen aan dit schema niet uitgelegd. Ten eerste de Vin van de amplifier. De Vin is het audiosignaal van de bron. Dit komt uit een audio-jack. Het is simpel om dit aan te sluiten. Uit een audiojack komen drie aansluitingen. 1 plus-aansluiting van het rechterkanaal en 1 plus-aansluiting van het linkerkanaal en 1 ground aansluiting. In de afbeelding zijn dat respectievelijk groen, rood en oranje. Nu moet een van de plus-aansluitingen (maakt niet uit welke) aangesloten worden bij de +in van de OP AMP. De ground aansluiting moet aangesloten worden aan de ground van de arduino, waar ook (indirect) de –in van de OP AMP aan aangesloten wordt.

Afbeeldingslocatie: http://s11.postimg.org/jyinajhbz/3_5mm.jpg

Ten tweede is de stroomvoorziening van de OP AMP nog niet uitgelegd. De 5532 OP AMP heeft twee aansluiting voor de stroomvoorziening. V+ en V-. Op V+ moet een voltage van +12V staan en op V- een voltage van -12V. Dit doen we door twee voltagebronnen van 12V in serie aan te sluiten en de verbinding tussen de +kant van de ene bron en de –kant van de andere bron aan te sluiten aan ground van de arduino. Vervolgens sluiten we de +kant, die nog niet gebruikt wordt, aan aan de V+ van de 5532 OP AMP. Daarnaast sluiten we de –kant, die nog niet gebruikt wordt, aan aan de V- van de 5532 OP AMP.
Uiteindelijk ziet de aansluiting er dan zo ongeveer uit (Sorry voor mijn slechte computer-tekenkunsten :P):

Afbeeldingslocatie: http://s18.postimg.org/60wfm5hx1/schemabreadboard.jpg

Het eerste deel is nu af. Het is makkelijker dan het lijkt. Je kunt de versterking regelen met de potmeter.

DC offset

Nu we het geluid kunnen versterken met gewenste sterkte (afhankelijk van de stand van de potmeter), moeten we het signaal nog continu positief maken. Dat is nu nog niet het geval, zoals blijkt uit het plaatje van “alternating current”.

Afbeeldingslocatie: http://s21.postimg.org/xqq0z2slf/alternatingcurrent.jpg

Om dit te bereiken maken we een zogenoemde “DC-offset”. Het enige w at een DC-offset doet, is de evenwichtsstand van de sinusfunctie van geluid naar een ander voltage brengen. In ons geval is dat 2,5V.
Dit voltage van 2,5V bereiken we door twee even grote weerstanden in serie te zetten met een bron van 5V (Ik vertel later hoe je deze kan verkrijgen uit een 12V bron). Het voltage van de bron verdeelt zich dan over de twee weerstanden. De weerstanden zijn gelijk, dus over beide staat 2,5V. Dat ziet er dan als volgt uit in een schema:

Over de tweede weerstand staat nu een voltage van 2.5V. Dat is onze nieuwe evenwichtstand. Nu moeten we er nog voor zorgen dat hier de sinusfunctie rond varieert.

Afbeeldingslocatie: http://s24.postimg.org/aip68h4y9/weerstanden.jpg

Dat doen we door het toevoegen van de audio-output uit de versterker via een condensator. Het audio-signaal laadt en ontlaadt in dat geval de condensator. Die condensator zal daardoor respectievelijk elektronen afgeven en opnemen, waardoor het voltage over de tweede weerstand verandert. Hierdoor fluctueert het audiosignaal rond de 2,5V. Het schema ziet er dan als volgt uit.

Afbeeldingslocatie: http://s27.postimg.org/e0higqte7/DCoffset.jpg

Low- en high-pass filter
Als laatste willen we dat de arduino de hoge tonen anders afleest dan de lage tonen. Dit doen we door middel van een low-pass filter en een high-pass filter. Dit klinkt misschien lastig, maar het is eigenlijk heel erg makkelijk. We zullen beginnen met het high-pass filter. Dat ziet er als volgt uit:

Afbeeldingslocatie: http://s24.postimg.org/f2607qc7l/highpass.jpg

Het low-pass filter is eigenlijk hetzelfde, maar dan andersom:

Afbeeldingslocatie: http://s11.postimg.org/iaxa147lr/lowpass.jpg

Conclusie

De conclusie kunnen we kort houden. Als we alle onderdelen samenvoegen, komt daar het volgende schema uit:

Afbeeldingslocatie: http://s27.postimg.org/fi7k61nin/totaal.jpg

De code

De code voor de arduino voeg ik bij (zonder uitleg nog). Ik ben van plan hier later nog uitleg bij te geven.

[code=c]const int sampleWindow = 20; // om de hoeveel tijd het licht wordt ververst.
unsigned int sample;
int ledBrightness;
int ledBrightness2;
unsigned int sample2;


void setup()
{
Serial.begin(9600);
pinMode(10,OUTPUT);
pinMode(11,OUTPUT);
pinMode(13,OUTPUT);
}


void loop()
{
unsigned long startMillis= millis(); // begintijd samplewindows
unsigned int peakToPeak = 0; // peak-to-peak level
unsigned int peakToPeak2 = 0;
unsigned int signalMax = 0;
unsigned int signalMin = 1024;
unsigned int signalMax2 = 0;
unsigned int signalMin2 = 1024;

// collect data for 50 mS
while (millis() - startMillis < sampleWindow) // als de verlopen tijd sinds de start van deze loop, kleiner is dan de sample windows, gebeurt het volgende:
{
sample = analogRead(0);
sample2 = analogRead(5);
if (sample < 1024) // storingen voorkomen
{
if (sample > signalMax)
{
signalMax = sample; // max level bass
}

else if (sample < signalMin)
{
signalMin = sample; // min level bass
}
if (sample2 > signalMax2)
{
signalMax2 = sample2; // max level hoog
}
else if (sample2 < signalMin2)
{
signalMin2 = sample2; // min level hoog
}
}
}
peakToPeak = signalMax - signalMin; // max - min = peak-peak amplitude
peakToPeak2 = signalMax2 - signalMin2;
Serial.println(peakToPeak2);

if(peakToPeak > 8) { // haal storingen weg en/of zorgt voor eventueel meer knipper-effect in het licht. (bass). Kan ook eventueel het effect van bass t.o.v. hoge tonen versterken of andersom.
ledBrightness = map(peakToPeak,0,1024,0,255);
}
else{
ledBrightness = 0;
}
if(peakToPeak2 > 8) { // haal storingen weg en/of zorgt voor eventueel meer knipper-effect in het licht. (hoge tonen). Kan ook eventueel het effect van bass t.o.v. hoge tonen versterken of andersom.
ledBrightness2 = map(peakToPeak2,0,1024,0,255);
}
else{
ledBrightness2 = 0;
}
analogWrite(10,ledBrightness);
analogWrite(11,ledBrightness2);
if(peakToPeak > 1000){ //indicatie-LEDje om te kijken of er versterkt moet worden.
digitalWrite(13,HIGH);
}
else{
digitalWrite(13,LOW);
}
if(peakToPeak2 > 1000){ //indicatie-LEDje om te kijken of er versterkt moet worden.
digitalWrite(8,HIGH);
}
else{
digitalWrite(8,LOW);
}
}
[/code=c]

Acties:
  • 0 Henk 'm!

  • Damic
  • Registratie: September 2003
  • Laatst online: 20:08

Damic

Tijd voor Jasmijn thee

In de plaats van quote gebruik code=c ;) de code werkt maar toch een opmerking:
C:
1
2
3
4
5
6
7
8
9
10
11
12
}


void loop()
{
unsigned long startMillis= millis(); // begintijd samplewindows
unsigned int peakToPeak = 0; // peak-to-peak level
unsigned int peakToPeak2 = 0;
unsigned int signalMax = 0;
unsigned int signalMin = 1024;
unsigned int signalMax2 = 0;
unsigned int signalMin2 = 1024;
naar
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
unsigned long startMillis=0; // begintijd samplewindows
unsigned int peakToPeak = 0; // peak-to-peak level
unsigned int peakToPeak2 = 0;
unsigned int signalMax = 0;
unsigned int signalMin = 1024;
unsigned int signalMax2 = 0;
unsigned int signalMin2 = 1024;

setup{//niets aan veranderen}

void loop()
{
startMillis= millis(); // begintijd samplewindows
peakToPeak = 0; // peak-to-peak level
peakToPeak2 = 0;
signalMax = 0;
signalMin = 1024;
signalMax2 = 0;
signalMin2 = 1024;

[ Voor 92% gewijzigd door Damic op 04-07-2015 23:28 ]

Al wat ik aanraak werk niet meer zoals het hoort. Damic houd niet van zijn verjaardag


Acties:
  • 0 Henk 'm!

  • AllesKan
  • Registratie: Juli 2011
  • Laatst online: 29-05-2023
Leuk effect!

Klein beetje (opbouwende!) kritiek:

Deze if:

if (sample < 1024) // storingen voorkomen

kan er sowieso uit, je leest de 10 bits A/D converter uit en die waarde varieert van 0 tot en met 1023. Kan nooit 1024 worden, laat staan 1025.

En dit soort dingen:

sample = analogRead(0);
sample2 = analogRead(5);

Kun je beter aanleren om die aan het begin van je programma te definieren, daar wordt je code een stuk leesbaarder van. Zoiets dus:

#define LOWPASS_PIN 0
#define HIGHPASS_PIN 5

en dan als je ze nodig hebt staat er dit:

sample = analogRead(LOWPASS_PIN);
sample2 = analogRead(HIGHPASS_PIN);

Dat heeft tevens als voordeel dat als je om wat voor reden dan ook je low-pass input niet meer op 0 wilt hebben maar op 4, je dat maar op 1 plek in je software hoeft te wijzigen.

NB: Je laat de mosfet schakeling niet zien, en je OpAmp verandert tijdens je uitleg van een 5532 in een 741 :P

Persoonlijk zou ik proberen om het linkerkanaal aan een low-pass filter te hangen, het rechterkanaal aan een high-pass filter en de uitgangen daarvan elk via een c'tje aan een eigen 0,55V spanningdeler hangen. Die signalen dan aansluiten op de 2 ADC ingangen. Zonder OpAmp dus.

Dan de Arduino via de software vertellen dat hij zijn interne 1,1V referentie voor de ADC moet gebruiken (dan is 0 -> 0V en 1023 -> 1,1V) en de amplitudevariatie softwarematig oplossen met een soort van voortschrijdend gemiddelde.

Acties:
  • 0 Henk 'm!

  • WouterT13
  • Registratie: Juli 2012
  • Laatst online: 09-09 20:01
Damic schreef op zaterdag 04 juli 2015 @ 23:22:
In de plaats van quote gebruik code=c ;) de code werkt maar toch een opmerking:
C:
1
2
3
4
5
6
7
8
9
10
11
12
}


void loop()
{
unsigned long startMillis= millis(); // begintijd samplewindows
unsigned int peakToPeak = 0; // peak-to-peak level
unsigned int peakToPeak2 = 0;
unsigned int signalMax = 0;
unsigned int signalMin = 1024;
unsigned int signalMax2 = 0;
unsigned int signalMin2 = 1024;
naar
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
unsigned long startMillis=0; // begintijd samplewindows
unsigned int peakToPeak = 0; // peak-to-peak level
unsigned int peakToPeak2 = 0;
unsigned int signalMax = 0;
unsigned int signalMin = 1024;
unsigned int signalMax2 = 0;
unsigned int signalMin2 = 1024;

setup{//niets aan veranderen}

void loop()
{
startMillis= millis(); // begintijd samplewindows
peakToPeak = 0; // peak-to-peak level
peakToPeak2 = 0;
signalMax = 0;
signalMin = 1024;
signalMax2 = 0;
signalMin2 = 1024;
Bedankt voor je reactie! Ik heb meteen ff quote naar code=c veranderd.
Ik heb over je code nog een vraag, want ik moet eerlijk zeggen dat ik het benoemen van dingen e.d. soms nog niet helemaal doorheb :) maar het enige wat je veranderd met die code is dat de variables voor de hele code (incl setup) gelden? Het ziet er iig netter uit.
AllesKan schreef op zaterdag 04 juli 2015 @ 23:28:
Leuk effect!

Klein beetje (opbouwende!) kritiek:

Deze if:

if (sample < 1024) // storingen voorkomen

kan er sowieso uit, je leest de 10 bits A/D converter uit en die waarde varieert van 0 tot en met 1023. Kan nooit 1024 worden, laat staan 1025.

En dit soort dingen:

sample = analogRead(0);
sample2 = analogRead(5);

Kun je beter aanleren om die aan het begin van je programma te definieren, daar wordt je code een stuk leesbaarder van. Zoiets dus:

#define LOWPASS_PIN 0
#define HIGHPASS_PIN 5

en dan als je ze nodig hebt staat er dit:

sample = analogRead(LOWPASS_PIN);
sample2 = analogRead(HIGHPASS_PIN);

Dat heeft tevens als voordeel dat als je om wat voor reden dan ook je low-pass input niet meer op 0 wilt hebben maar op 4, je dat maar op 1 plek in je software hoeft te wijzigen.

NB: Je laat de mosfet schakeling niet zien, en je OpAmp verandert tijdens je uitleg van een 5532 in een 741 :P

Persoonlijk zou ik proberen om het linkerkanaal aan een low-pass filter te hangen, het rechterkanaal aan een high-pass filter en de uitgangen daarvan elk via een c'tje aan een eigen 0,55V spanningdeler hangen. Die signalen dan aansluiten op de 2 ADC ingangen. Zonder OpAmp dus.

Dan de Arduino via de software vertellen dat hij zijn interne 1,1V referentie voor de ADC moet gebruiken (dan is 0 -> 0V en 1023 -> 1,1V) en de amplitudevariatie softwarematig oplossen met een soort van voortschrijdend gemiddelde.
Ook bedankt voor de reactie! Kritiek is altijd welkom natuurlijk; daar leren we alleen maar van. :) Ik zal morgen proberen de code aan te passen, net als de opmerking van Damic. (Daar is het nu een beetje te laat voor).
Wat de MOSFET-schakeling betreft: die ben ik inderdaad vergeten zie ik nu. en de OPAMP heb ik tijdens mijn project gewisseld van een 741 naar een 5532, omdat de 741 niet goed werkte helaas. Met de 5532 werkt het wel. Vandaar wss nog enkele foutjes in de tekst. Ik zal ze aanpassen!

Het laatste wat je zegt heeft als doel om de precisie te verhogen, denk ik? Ik heb de intere referentie voltage van de arduino nog niet helemaal bekeken, maar ik zal er naar kijken! Het klinkt als een goede optie om de precisie te verbeteren. Ik laat van me horen of het gelukt is :)

Acties:
  • 0 Henk 'm!

  • Damic
  • Registratie: September 2003
  • Laatst online: 20:08

Damic

Tijd voor Jasmijn thee

Niet alleen netter maar ook als je met grotere code bezig bent is dat beter voor je µp, want een loop is een loop en als je telkens je variabele gaat aanmaken, is niet zo gezond terwijl je nu al op voorrand zegt van ey ik heb een geheugenblok nodig reserveer die al vast ;)

Trouwens wat doe je met Serial.begin(9600);?

[ Voor 8% gewijzigd door Damic op 05-07-2015 00:24 ]

Al wat ik aanraak werk niet meer zoals het hoort. Damic houd niet van zijn verjaardag


Acties:
  • 0 Henk 'm!

  • AllesKan
  • Registratie: Juli 2011
  • Laatst online: 29-05-2023
WouterT13 schreef op zondag 05 juli 2015 @ 00:12:
Het laatste wat je zegt heeft als doel om de precisie te verhogen, denk ik? Ik heb de intere referentie voltage van de arduino nog niet helemaal bekeken, maar ik zal er naar kijken!
Ik bedoelde het meer om tot hetzelfde resultaat te komen, maar dan zonder OpAmp en zijn bijbehorende positieve en negatieve 12V spanningen. :)

Je resolutie is nu ook niet zo hoog want dit commando:

ledBrightness = map(peakToPeak,0,1024,0,255);

is (in dit geval, dus met deze waarden) exact hetzelfde als

ledBrightness = peakToPeak / 4;

En dat kan uiteraad niet anders omdat je Brightness resolutie maar 8 bits is. Anders gezegd, als je ervoor zorgt dat je een kwart van de ADC-range al ten volle kunt benutten zonder OpAmp dan is je resolutie gelijk.

Acties:
  • 0 Henk 'm!

  • WouterT13
  • Registratie: Juli 2012
  • Laatst online: 09-09 20:01
Damic schreef op zondag 05 juli 2015 @ 00:22:
Niet alleen netter maar ook als je met grotere code bezig bent is dat beter voor je µp, want een loop is een loop en als je telkens je variabele gaat aanmaken, is niet zo gezond terwijl je nu al op voorrand zegt van ey ik heb een geheugenblok nodig reserveer die al vast ;)

Trouwens wat doe je met Serial.begin(9600);?
Zo had ik er nog helemaal niet over nagedacht! Dat is zeker iets om rekening mee te houden. Bedankt!

Wat betreft de Serial.begin(9600): later in de code staat Serial.println(peakToPeak2). Ik had wat problemen met een vaag knipperende LED-strip, als er geen geluid werd afgespeeld. Ik wilde kijken of de arduino op dat moment echt iets uitlas of dat het een storing bij de schakeling met transistors was. Het probleem heeft zich echter vanzelf (op mysterieuze wijze) opgelost. Ineens was het weg.
AllesKan schreef op zondag 05 juli 2015 @ 00:26:
[...]

Ik bedoelde het meer om tot hetzelfde resultaat te komen, maar dan zonder OpAmp en zijn bijbehorende positieve en negatieve 12V spanningen. :)

Je resolutie is nu ook niet zo hoog want dit commando:

ledBrightness = map(peakToPeak,0,1024,0,255);

is (in dit geval, dus met deze waarden) exact hetzelfde als

ledBrightness = peakToPeak / 4;

En dat kan uiteraad niet anders omdat je Brightness resolutie maar 8 bits is. Anders gezegd, als je ervoor zorgt dat je een kwart van de ADC-range al ten volle kunt benutten zonder OpAmp dan is je resolutie gelijk.
ah, nu snap ik m! Dat is op zich zeker het proberen waard. Ik heb alleen op het moment niet de juiste weerstanden, dus die moet ik even halen, maar ik ga er naar kijken! Thnx! _/-\o_
Pagina: 1