Pagina1 van 1
Forum

Welkom bij de Tweaking4All gemeenschapsforums!
Voor je gaat deelnemen, bekijk de Forum Regels!

Specifieke onderwerpen: Start het onderwerp met de naam van het programma of systeem.
Bijvoorbeeld “MacOS X – Jouw vraag“, of bijvoorbeeld “MS Word – Jouw Tip of Truc“.

Merk op: Omschakelen naar een andere taal zal niet werken als je een post aan het lezen bent aangezien er waarschijnlijk geen vertaling beschikbaar is.



Arduino - WS2812 en...
 
Deel:
Meldingen
Alles wissen

[Opgelost] Arduino - WS2812 en Audio In

56 Berichten
2 Gebruikers
0 Reactions
8,816 Bekeken
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 12 jaar geleden
Berichten: 2859
Topic starter  

Dit is een onderwerp gestart naar aanleiding van een opmerking onder het "Arduino – WS2812 LED strip besturen met NeoPixel of FastLED" artikel (opmerking link) door Uncels.

Het idee is om een Arduino Audio input te geven en deze dan met LEDStrips zichtbaar te maken.


   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 12 jaar geleden
Berichten: 2859
Topic starter  

De betreffende YouTube video: link
En bijbehorende code: link.

Beiden geven helaas nauwelijks informatie over hoe het e.e.a. opgezet is.
Behalve dan dat de audio via de koptelefoon aansluiting van een PC gaat.

Het eerste probleem waar we tegen aan lopen is dat een koptelefoon aansluiting vaak de speakers van een laptop of PC UIT zet. Dus we horen geen muziek tenzij we de audio doorlussen naar een externe versterker, of als de betreffende PC een (werkende) uitgang heeft voor speakers of versterker. In mijn geval gaat geen van allen op. Mijn laptop heeft alleen een koptelefoon aansluiting en ik heb geen externe speakers of versterker.

Tweede probleem is dat een koptelefoon aansluiting ongeveer schommelt tussen de -1 Volt en +1 Volt.
Een Arduino analoog pin neemt alleen waarden tussen 0 en 5 Volt waar. Dus de negatieve schommel van geluid wordt gemist of als nul gezien.

Met een eenvoudige schakeling kunnen we die uitgang opkrikken zodat het tussen +1.5 Volt en +3.5 Volt gaat schommelen. Al stukken beter, maar dan missen we nog steeds een behoorlijk stuk van de schaal (0 - 5V of te wel waarden van 0 - 1023) van de Arduino. Dit hoeft niet erg te zijn, maar na wat experimenteren ziet het er niet echt geweldig uit. De stappen zijn wat ruw en onrustig.

Een andere optie is om een kleine versterker te gebruiken waarmee we het signaal opkrikken zodat er meer van het spectrum gebruikt wordt.

Anyhow - dit is het begin van een discussie / overleg hoe we dit wel goed kunnen doen ... 


   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 12 jaar geleden
Berichten: 2859
Topic starter  

Reactie van John (uit de opemerkingen):

Als je op deze link klikt zie je dat de bestelde ledstrip 5v is LEDstrip.
Dan zou ik de juiste componenten moeten hebben & de arduino gewoon op de usb aansluiten. 

Nu is het nog wachten tot de strip hier is.
Lukt het met de code te modificeren om die nog mooier te maken?

Zou het mogelijk zijn met een aanpassing in de code dat het linkerkanaal 1 ledstrip van 1meter & het rechterkanaal de andere ledstrip van 1meter aanstuurt tijdens het afspelen van muziek? en als er geen muziek speelt gewoon de moodlight brand? 

Ik ben een leek op dit gebied vandaar mijn vraag naar aanleiding van jouw reactie dat je de code wou verbeteren voor mooiere effecten.


   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 12 jaar geleden
Berichten: 2859
Topic starter  

Als de strip 5V is, dan gaat dat allemaal prima werken.
Niet vergeten: Arduino wordt door de 5V van de USB gevoed, en de LEDs worden door de aparte 5V voeding gevoed.

Voor wat betreft het idee van het audio project:
Ik had zelf ook zoiets in gedachten. Mood light of reageren op omgevingsgeluid misschien.
Zelf vindt ik de effecten bij muziek niet schokkend mooi, en het leek me een leuk idee om daar ook wat mee te doen.


   
BeantwoordenCiteren
(@uncels)
Trusted Member
Deelgenomen: 9 jaar geleden
Berichten: 81
 

Mogelijk als we de koptelefoonaansluiting vervangen door een microfoon?

Voorbeelden v Microfoon Maar welke is geschikt?


   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 12 jaar geleden
Berichten: 2859
Topic starter  

Dat is ook interessant! Zeker voor die prijs.

Maar ... dat registreert dan ook wel geluiden in de omgeving. Geen idee of dat wenselijk is. Vooral als mensen b.v. praten of ergens tegen aan stoten. Wel handig dat dit meteen microfoon en kleine versterker lijkt te zijn.

Nog goedkoper blijkbaar bij AliExpress.
Zowel Analoog (geluid) als Digitaal (detectie) te gebruiken .. zie ook: deze link.

Lees bij de reviews wel dat de output wat aan de lage kant is ...

Ik heb net wat componenten bestelt om een erg simpel versterkertje te maken.


   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 12 jaar geleden
Berichten: 2859
Topic starter  

Ik zit ook eens te kijken naar een Bluetooth module. Tegenwoordig koop je voor een paar Euro een Bluetooth Audio ontvanger.

Geen idee hoe het onder Windows gaat, maar de Mac speakers werken hier niet als ik een koptelefoon aansluiting gebruik. Ik weet hoe het e.e.a. mechanisch werkt, maar heb geen zin  om m'n Mac open te slopen omdat pinnetje los te koppelen.

Je kunt echter (op een Mac) wel geluid naar meerdere devices sturen - dus geluidskaart en b.v. Bluetooth speaker (of in ons geval: Bluetooth Audio receiver). Geen idee voor wat Windows betreft. Ik weet wel dat sommige geluidskaarten het toestaan dat zowel koptelefoon als speakers werken.


   
BeantwoordenCiteren
(@uncels)
Trusted Member
Deelgenomen: 9 jaar geleden
Berichten: 81
 

Over geen geluid op de pc, dat kun je opvangen met deze  Splitter. Die heb ik al liggen, maar de vraag blijft dat hier eerder gesproken werd over ongewenste spanningswisselingen uit de koptelefoon uitgang.


   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 12 jaar geleden
Berichten: 2859
Topic starter  

Ik vermoed dat zo'n splitter wel gaat werken.

Ik heb een paar componenten bestelt om wat mee te rommelen.
Ik wilde spanning omhoog brengen (zodat het gemiddelde 2.5V wordt ipv 0V) en liefst versterken zonder al te veel moeite. Dat laatste zou moeten kunnen met een kleine chip van 0.39 Euro. Maar ... dat moet ik dus eerst even testen.

Het omhoog brengen van de spanning werkt al goed, en ik krijg er al LEDs mee aan de gang.
Het viel me alleen op dat het met wat teveel LEDs tegelijk gaat - ik hoop dat versterking een beter "resolutie" gaat geven.

Ik zal vandaag nog een beetje rommelen met alleen spanning verhogen, en eens kijken of ik een betere berekening kan vinden voor de schaal. 

Voor toekomstige referentie heb ik de afbeelding van de eerder genoemde splitter aangehangen.


   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 12 jaar geleden
Berichten: 2859
Topic starter  

Met wat testen en omrekenen, met alleen het verhogen van de spanning, heb ik nu ruwweg een bereik van 40.

Dwz: tussen laagste punt en hoogste amplitude zitten 20 stappen.

Geluid gaat in een golf beweging, dus 20 stappen onder nul hebben dezelfde amplitude als de 20 stappen boven nul. 
Anders gezegd: Een waarde van 20 onder nul, klinkt net zo hard als 20 boven nul.

Of te wel ... voor een VU meter moet dus de 20 onder nul hetzelfde aangegeven worden als de 20 boven nul.

Ik speel nu met een strip van 60 LEDs, een meter, en dat zorgt ervoor dat het vaak met steppen van 3 LEDs tegelijk omhoog of omlaag gaat, wat er een beetje knullig uit ziet.

Ik ga nog wat meer experimenteren 


   
BeantwoordenCiteren
(@uncels)
Trusted Member
Deelgenomen: 9 jaar geleden
Berichten: 81
 

Fijn dat je er al aan bezig bent & dit project je interesseert.

Gaat het in stappen omhoog als je de code gebruikt uit het voorbeeld op youtube ? Daar leek het me goed te werken toch?

Houd ons op de hoogte aub, tevens wat we aan extra onderdelen nodig zouden hebben voor een optimaal resultaat.

Ik hoop dat meer mensen dit project gaan bouwen. (Ik kijk reikhalzend uit naar de bestelde ledstrips uit China, zodat ik mee kan experimenteren)


   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 12 jaar geleden
Berichten: 2859
Topic starter  

Nou ik heb wat lopen prullen met berekeningen enzo en verschillende schakelingen (zonder versterker).

Het werkt wel, maar er is veel storing in het laagste gebied van het geluid.
Dat wil zeggen dat ik meer afscherming nodig kan hebben, of dat de metingen (zonder versterking) een beetje prut zijn.

Met de beste berekening (zie onder) is het wel "aardig" maar onrustig.

Een voorbeeld van een van de Sketches:

#include <math.h>
#include "FastLED.h"
#define NUM_LEDS 60 
CRGB leds[NUM_LEDS];
#define PIN 6 // for LED strip
#define AVG 511
#define FACTOR 3
#define AUDIO_LEFT A0
#define NO_SOUND 16
float ValueLeft;

void setup()
{
  FastLED.addLeds<WS2811, PIN, GRB>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
  Serial.begin(9600);
  pinMode(A0, INPUT);
  setAll(0,0,0);
}
void loop() {
  ValueLeft = round(log10(max(1, 1+ abs(analogRead(AUDIO_LEFT) -AVG))) * (NUM_LEDS/FACTOR));
  
  if(isinf(ValueLeft)) { ValueLeft=NUM_LEDS; }
  else if(isnan(ValueLeft)) { ValueLeft=0; }
  else if(ValueLeft<NO_SOUND) { ValueLeft=0; }
  else if(ValueLeft>NUM_LEDS) { ValueLeft=NUM_LEDS; }
  
  Serial.println(ValueLeft);
  for(int i; i<NUM_LEDS; i++) {
    if(i<=ValueLeft) {
      setPixel(i,0xff,0,0);
    }
    else {
      setPixel(i,0,0,0);
    }
  }
  showStrip();
  delay(50);
}
void showStrip() {
 #ifdef ADAFRUIT_NEOPIXEL_H 
   strip.show();
 #endif
 #ifndef ADAFRUIT_NEOPIXEL_H
   FastLED.show();
 #endif
}
void setPixel(int Pixel, byte red, byte green, byte blue) {
 #ifdef ADAFRUIT_NEOPIXEL_H 
   strip.setPixelColor(Pixel, strip.Color(red, green, blue));
 #endif
 #ifndef ADAFRUIT_NEOPIXEL_H 
   // FastLED
   leds[Pixel].r = red;
   leds[Pixel].g = green;
   leds[Pixel].b = blue;
 #endif
}
void setAll(byte red, byte green, byte blue) {
  for(int i = 0; i < NUM_LEDS; i++ ) {
    setPixel(i, red, green, blue); 
  }
  showStrip();
}

   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 12 jaar geleden
Berichten: 2859
Topic starter  

Na wat experimenten met een microfoon kan ik alleen maar zeggen dat ook hiervoor een versterkertje nodig is.

Ik heb zelfs een Mic met versterkertje geprobeerd maar die was niet gevoelig genoeg.

Al met al zitten we dus vast met:

- een kleine signaal verschuiving (van -1V...1V -> 1.5V...3.5V) en
- een signaal versterking (van 1.5V...3.5V naar 0V tot 5V).

En dan hebben we nog niet het probleem opgelost dat de audio uitgeschakeld wordt op de computer. Een Y-splitter kan daarbij handig zijn, maar of dat zo goed gaat werken weet ik dus niet.

Ik heb ook wat meer getest met alleen voltage verschuiven, en in combinatie met het vuur effect ziet er dat best leuk uit. Ik kan alleen niet de muziek horen.

De sketch is op het vuur effect gebaseerd uit het artikeltje "LEDStrip effecten voor NeoPixel en FastLED".

Verder is de schakeling niet moeilijk - ik heb twee willekeurige weerstanden gepakt (4.7 KOhm - geel violet rood, zie ook de weerstand kleuren calculator),  en een 4.7 micro farad elektrolytische condensator. 

De LEDStrip wordt aangesloten zoals in het artikel is beschreven.

Voor de Audio-In heb ik pin A0, +5V en GND gebruikt - zie bijgesloten tekening. De tekening is dus een aanvulling op de aangesloten LEDStrip. Deze schakeling zou het voltage van -1V...1V naar 1.5V...3.5V moeten opkrikken.

Het vuur gedraagt zich nu een beetje naar de muziek - maar ja, ik kan de muziek niet horen dus ik gok het maar.

Als je in de Arduino IDE de seriële monitor aanzet dan zie je de berekende waarden.

#include "FastLED.h"
#include <math.h>
#define NUM_LEDS 60 
#define AVG 511
#define FACTOR 3
#define AUDIO_LEFT A0
#define NO_SOUND 16
float ValueLeft;
CRGB leds[NUM_LEDS];
#define PIN 6 // for LED strip
void setup()
{
  FastLED.addLeds<WS2812, PIN, GRB>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
  Serial.begin(9600);
  pinMode(A0, INPUT);
  setAll(0,0,0);
}
void loop() {
  ValueLeft = round(log10(max(1, 1+ abs(analogRead(AUDIO_LEFT) -AVG))) * (NUM_LEDS/FACTOR));
  
  if(isinf(ValueLeft)) { ValueLeft=NUM_LEDS; }
  else if(isnan(ValueLeft)) { ValueLeft=0; }
  else if(ValueLeft<NO_SOUND) { ValueLeft=0; }
  else if(ValueLeft>NUM_LEDS) { ValueLeft=NUM_LEDS; }
  
  Serial.println(ValueLeft);
  Fire(30+ValueLeft,ValueLeft*4,10);
}
void Fire(int Cooling, int Sparking, int SpeedDelay) {
  static byte heat[NUM_LEDS];
  int cooldown;
  
  // Step 1. Cool down every cell a little
  for( int i = 0; i < NUM_LEDS; i++) {
    cooldown = random(0, ((Cooling * 10) / NUM_LEDS) + 2);
    
    if(cooldown>heat) {
      heat=0;
    } else {
      heat=heat-cooldown;
    }
  }
  
  // Step 2. Heat from each cell drifts 'up' and diffuses a little
  for( int k= NUM_LEDS - 1; k >= 2; k--) {
    heat[k] = (heat[k - 1] + heat[k - 2] + heat[k - 2]) / 3;
  }
    
  // Step 3. Randomly ignite new 'sparks' near the bottom
  if( random(255) < Sparking ) {
    int y = random(7);
    heat[y] = heat[y] + random(160,255);
    //heat[y] = random(160,255);
  }
  // Step 4. Convert heat to LED colors
  for( int j = 0; j < NUM_LEDS; j++) {
    setPixelHeatColor(j, heat[j] );
  }
  showStrip();
  delay(SpeedDelay);
}
void setPixelHeatColor (int Pixel, byte temperature) {
  // Scale 'heat' down from 0-255 to 0-191
  byte t192 = round((temperature/255.0)*191);
 
  // calculate ramp up from
  byte heatramp = t192 & 0x3F; // 0..63
  heatramp <<= 2; // scale up to 0..252
 
  // figure out which third of the spectrum we're in:
  if( t192 > 0x80) { // hottest
    setPixel(Pixel, 255, 255, heatramp);
  } else if( t192 > 0x40 ) { // middle
    setPixel(Pixel, 255, heatramp, 0);
  } else { // coolest
    setPixel(Pixel, heatramp, 0, 0);
  }
}
// REPLACE TO HERE
void showStrip() {
 #ifdef ADAFRUIT_NEOPIXEL_H 
   // NeoPixel
   strip.show();
 #endif
 #ifndef ADAFRUIT_NEOPIXEL_H
   // FastLED
   FastLED.show();
 #endif
}
void setPixel(int Pixel, byte red, byte green, byte blue) {
 #ifdef ADAFRUIT_NEOPIXEL_H 
   // NeoPixel
   strip.setPixelColor(Pixel, strip.Color(red, green, blue));
 #endif
 #ifndef ADAFRUIT_NEOPIXEL_H 
   // FastLED
   leds[Pixel].r = red;
   leds[Pixel].g = green;
   leds[Pixel].b = blue;
 #endif
}
void setAll(byte red, byte green, byte blue) {
  for(int i = 0; i < NUM_LEDS; i++ ) {
    setPixel(i, red, green, blue); 
  }
  showStrip();
}

   
BeantwoordenCiteren
(@uncels)
Trusted Member
Deelgenomen: 9 jaar geleden
Berichten: 81
 

Hans, ik heb de codes & je info opgeslagen maar wacht nog altijd op de ledstrips. De splitter zal goed werken, die kun je rustig aanschaffen die heb ik in het verleden al eens aangesloten met een ander project.
Ik laat je het resultaat weten, als ik de strips binnen heb.
Bedankt voor alle moeite tot zover.


   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 12 jaar geleden
Berichten: 2859
Topic starter  

Prima! Ik experimenteer hier lekker verder 


   
BeantwoordenCiteren
Pagina 1 / 4
Deel: