Fórum témák

» Több friss téma
Cikkek » MSGEQ7 equalizer IC használata Arduino-val
MSGEQ7 equalizer IC használata Arduino-val
Szerző: Fizikus, idő: Szept 23, 2013, Olvasva: 17402, Oldal olvasási idő: kb. 2 perc
Lapozás: OK   5 / 5

Spektrumanalizátor kapcsolás MSGEQ7 IC-vel

A mátrix kijelzőt és az MSGEQ7-es IC-t a mikrofonnal együtt, az előzőekben ismertetett két kapcsolásnak megfelelően, egyszerre, az Arduino-ra kötve, valamint a két mintaprogramot összegyúrva lényegében el is készült a projekt.

keszprojekt580.jpg

 

Az Arduino kód beolvassa az MSGEQ7-es IC-ről az audióspektrumot, majd a jel erősségének megfelelően kapcsolja be a LED mátrix kijelzőn soronként a LED-eket.

Az audio értékek beolvásása után csatornánként eltárolom egy tömbbe az eddigi maximális értékeket is. A kissebb zajok kiszűrése érdekében, csatornánként különböző nagyságú határértéknél kisebb értékeket nem veszem figyelembe. A megjelenítés során a csatornánkénti határérték és a maximum érték közötti intervallumot használom fel a kijelzés skálázására (azt osztom fel 8 szakaszra). Az alábbi kód működéséhez (is) szükséges a TimerOne.h Arduino könyvtár.

 

  1. // Equalizer teszt program
  2. #include < TimerOne.h > // Timer konyvtar
  3.  
  4. int dataPin = 11; //74HC595 Data 11-re kotve
  5. int clockPin = 12; //74HC595 Clock Pin 12-re kotve
  6. int latchPin = 13; //74HC595 Latch Pin 13-ra kotve
  7.  
  8. byte led[8]; // // a megjelenitendo adatokat tarolo tomb
  9.  
  10. int strobe = 4; //STROBE lab Pin4-re kotve
  11. int res = 5; // RESET lab Pin5-re kotve
  12. int audioAnalog = 5; // MSGEQ7 analog 5 pin-re kotve (A5)
  13. int spektrum[7]; // a mert audiospektrumot eltarolo tomb
  14. int jelMax[7];
  15. int hatarertek[7];
  16. int csatorna;
  17.  
  18. void setup()
  19. {
  20.  pinMode(res, OUTPUT); // RESET lab kimenet
  21.  pinMode(strobe, OUTPUT); // STROBE lab kimenet
  22.  digitalWrite(res,LOW);
  23.  digitalWrite(strobe,HIGH);
  24.  pinMode(latchPin, OUTPUT); // Latch lab kimenet
  25.  pinMode(clockPin, OUTPUT); // Clock lab kimenet
  26.  pinMode(dataPin, OUTPUT); // Data lab kimenet
  27.  led[7] = B00000000;
  28.  
  29.  jelMax[0] = 0;
  30.  jelMax[1] = 0;
  31.  jelMax[2] = 0;
  32.  jelMax[3] = 0;
  33.  jelMax[4] = 0;
  34.  jelMax[5] = 0;
  35.  jelMax[6] = 0;
  36.  
  37.  hatarertek[0] = 50;
  38.  hatarertek[1] = 60;
  39.  hatarertek[2] = 60;
  40.  hatarertek[3] = 65;
  41.  hatarertek[4] = 70;
  42.  hatarertek[5] = 70;
  43.  hatarertek[6] = 80;
  44.  
  45.  // 10000 microszekundum (1/100-ad masodperc) hosszusagu Timer interrupt
  46.  Timer1.initialize(10000);
  47.  // interrupt eseten a kijelzo frissito fuggveny meghivasa
  48.  Timer1.attachInterrupt(kijelzoFrissites);
  49. }
  50.  
  51. void loop()
  52. {
  53.  MSGEQ7meres();
  54.  for (csatorna = 0; csatorna < 7; csatorna++)
  55.   {
  56.   if (spektrum[csatorna] - hatarertek[csatorna] < (jelMax[csatorna]-hatarertek[csatorna])/8)
  57.    {
  58.    led[csatorna] = B10000000;
  59.    }
  60.   else if (spektrum[csatorna] - hatarertek[csatorna] < ((jelMax[csatorna]-hatarertek[csatorna])*2/8))
  61.   {
  62.   led[csatorna] = B11000000;
  63.   }
  64.   else if (spektrum[csatorna] - hatarertek[csatorna] < ((jelMax[csatorna]-hatarertek[csatorna])*3/8))
  65.   {
  66.   led[csatorna] = B11100000;
  67.   }
  68.   else if (spektrum[csatorna] - hatarertek[csatorna] < ((jelMax[csatorna]-hatarertek[csatorna])*4/8))
  69.   {
  70.   led[csatorna] = B11110000;
  71.   }
  72.   else if (spektrum[csatorna] - hatarertek[csatorna] < ((jelMax[csatorna]-hatarertek[csatorna])*5/8))
  73.   {
  74.   led[csatorna] = B11111000;
  75.   }
  76.   else if (spektrum[csatorna] - hatarertek[csatorna] < ((jelMax[csatorna]-hatarertek[csatorna])*6/8))
  77.   {
  78.   led[csatorna] = B11111100;
  79.   }
  80.   else if (spektrum[csatorna] - hatarertek[csatorna] < ((jelMax[csatorna]-hatarertek[csatorna])*7/8))
  81.   {
  82.   led[csatorna] = B11111110;
  83.   }
  84.   else led[csatorna] = B11111111;
  85.   }
  86.   delay(25);
  87. }
  88.  
  89. void kijelzoFrissites()
  90. {
  91.  byte row = B00000001; // kezdes az elso sorral
  92.  for (byte k = 0; k < 9; k++)
  93.   {
  94.   digitalWrite(latchPin, LOW);
  95.   shiftIt(led[k] ); // oszlopokra meno jel kikuldese
  96.   shiftIt(row ); // sorokra meno jel kikuldese
  97.   digitalWrite(latchPin, HIGH); // latch jel kikuldese
  98.   row = row << 1; // kovetkezo sorra ugras
  99.  }
  100. }
  101.  
  102. //szoftveres SPI (8 bit kuldese, LSB eloszor)
  103. void shiftIt(byte dataOut)
  104. {
  105.  boolean pinState;
  106.  digitalWrite(dataPin, LOW);
  107.  for (int i=0; i < 8; i++)
  108.   {
  109.   digitalWrite(clockPin, LOW);
  110.   if ( dataOut & (1 << i) )
  111.   {
  112.   pinState = HIGH;
  113.   }
  114.   else
  115.   {
  116.   pinState = LOW;
  117.   }
  118.  digitalWrite(dataPin, pinState);
  119.  digitalWrite(clockPin, HIGH);
  120.  digitalWrite(dataPin, LOW);
  121.  }
  122.  digitalWrite(clockPin, LOW);
  123. }
  124.  
  125. void MSGEQ7meres()
  126. {
  127.  digitalWrite(res, HIGH);
  128.  digitalWrite(res, LOW);
  129.  for(csatorna=0; csatorna < 7; csatorna++)
  130.   {
  131.   digitalWrite(strobe,LOW); // strobe pin alacsony-kovetkezo frekv.savra valtas
  132.   delayMicroseconds(30);
  133.   spektrum[csatorna] = analogRead(audioAnalog); // mert ertek eltarolasa a tombbe
  134.   digitalWrite(strobe,HIGH);
  135.   if (spektrum[csatorna] < hatarertek[csatorna])
  136.   {
  137.    spektrum[csatorna] = 0;
  138.   }
  139.   if (spektrum[csatorna] > jelMax[csatorna])
  140.   {
  141.    jelMax[csatorna] = spektrum[csatorna];
  142.   }
  143.  }
  144. }

 

Az elkészült projektről egy rövid kis video:

 videojpg.jpg

Ezzel a cikk végére is értem. Remélem tetszett, és sokan kedvet kapnak tőle az MSGEQ7 használatához.

Üdvözlettel: Fizikus

 

Következő: »»   5 / 5
Értékeléshez bejelentkezés szükséges!
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem