MSGEQ7 adatkiolvasás probléma

whriley
Újonc
Újonc
Hozzászólások: 4
Csatlakozott: 2015. július 30. csütörtök, 18:02

MSGEQ7 adatkiolvasás probléma

Hozzászólás Szerző: whriley »

Sziasztok!

Elsőnek leszögezném most kóstoltam bele az elektronika világába, és sajnos máris problémába ütköztem. Egy MSGEQ7 IC-ből szeretném kinyerni az adatokat, de valami nem jó.
Értem, hogy a kód mit miért csinál és utána is olvastam, hogy valóban így kellene működni, de folyton 0 értékeket kapok, bár valahogy sikerült egyszer 1023at is na de abszolút nem a valós adatokat. A kapcsolás e kép szerint történt annyi a különbség, hogy nem volt 200K ellenálásom, így 2 75K és 1 50K ellenálásal oldottam meg sorba kötve, kerámia kondenzátort használtam (nem tudom ez lehet-e esetleg probléma), illetve az 5V-ot nem az Arduinotól vettem, ha külön PC tápegység használatával, (mert Arduinoval 3,5V-ot mértem valamiért az 5V helyett, mellesleg kipróbáltam 2féle Arduinoval nehogy az legyen a probléma) és ezt a kódot használtam:
msgeq7schem.jpg

Kód: Egész kijelölése

// MSGEQ7 Equalizer IC Arduino peldaprogram
int strobe = 4; // STROBE lab Pin4-re kotve
int reset = 5; // RESET lab Pin5-re kotve
int spektrum[7]; // a mert audiospektrumot eltarolo tomb
int MSGEQ7 = 5; // MSGEQ7 analog 5 pin-re kotve (A5)
int csatorna;
 
void setup()
{
Serial.begin(115200); // 115200 baud sebessegu soros kommunikacio letrehozasa
pinMode(reset, OUTPUT); // RESET lab kimenet
pinMode(strobe, OUTPUT); // STROBE lab kimenet
digitalWrite(reset,LOW);
digitalWrite(strobe,HIGH);
}
 
void MSGEQ7meres()
{
digitalWrite(reset, HIGH);
digitalWrite(reset, LOW);
for(csatorna=0; csatorna < 7; csatorna++)
{
digitalWrite(strobe,LOW); // strobe pin alacsony-kovetkezo frekv.savra valtas
delayMicroseconds(30);
spektrum[csatorna] = analogRead(MSGEQ7); // mert ertek eltarolasa a tombbe
digitalWrite(strobe,HIGH);
}
}
 
void loop()
{
MSGEQ7meres();
for (csatorna = 0; csatorna < 7; csatorna++)
{
Serial.print(spektrum[csatorna]);
Serial.print(" ");
}
Serial.println();
Ha valaki megtalálná a hibát annak nagyon örülnék, előre is köszönöm!
Nincs meg a kellő jogosultságod a hozzászóláshoz csatolt állományok megtekintéséhez.
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: MSGEQ7 adatkiolvasás probléma

Hozzászólás Szerző: kapu48 »

Ennek az uC-nek az adatlapját még nem olvastam!
Jó lett volna, ha azt is belinkeled!

De általában a RESET láb Low szintre aktív.
Tehát mérés előtt Hihg-re kellene állítani!
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: MSGEQ7 adatkiolvasás probléma

Hozzászólás Szerző: kapu48 »

Úgy tűnik a kérdező „whriley” elment nyaralni!

De mivel közben foglalkoztam a témával.
Adatlap: Seven Band Graphic Equalizer
https://www.sparkfun.com/datasheets/Com ... MSGEQ7.pdf

4. oldal szerint: Strobe Timing Diagram
tr - Reset Pulse Width 100 nS min
trs - Reset to Strobe Delay 72 uS min
ts - Strobe Pulse Width 18 uS min
tss - Strobe to Strobe Delay 72 uS min
to - Output Settling Time 36 uS min (with Cload = 22 pF and Rload = 1 Mohm)

Szerinti időzítéseket be kellene állítani az „void MSGEQ7meres()” rutinban!

Ami nem igazán valósult meg nála!
whriley
Újonc
Újonc
Hozzászólások: 4
Csatlakozott: 2015. július 30. csütörtök, 18:02

Re: MSGEQ7 adatkiolvasás probléma

Hozzászólás Szerző: whriley »

Sziasztok!

Köszönöm a válaszokat, de sajnos így se megy. Pedig kerestem egy új kódot (https://www.youtube.com/watch?t=10&v=InrQvtUuS2w), e szerint a videó szerint átkötöttem, úgyhogy még az sem lehet probléma. Persze nem csináltam meg a ledes részt. Szóval egyszerűen nem értem mi lehet a gond. Kipróbáltam amit kapu48 írt ezen az új kódon, úgy, hogy mindenhova delay(1)-et írtam (ha jól tudom ez bőven elég idő mivel 1ms várakozás).

Kód: Egész kijelölése

int analogPin=0;
int strobePin=2;
int resetPin=3;
int ledred=9;
int ledblue=10;
int ledgreen=11;
int spectrumValue[7];
int filter=80;

void setup(){
  
  Serial.begin(9600);
  pinMode(analogPin, INPUT);
  pinMode(strobePin, OUTPUT);
  pinMode(resetPin, OUTPUT);
  pinMode(ledred, OUTPUT);
  pinMode(ledblue, OUTPUT);
  pinMode(ledgreen, OUTPUT);
  digitalWrite(resetPin, LOW);
  delay(1);
  digitalWrite(strobePin, HIGH);
}

void loop(){
  
  digitalWrite(resetPin, HIGH);
  delay(1);
  digitalWrite(resetPin, LOW);
  for (int i=0;i<7;i++){
    digitalWrite(strobePin, LOW);
    delay(30);
    spectrumValue[i]=analogRead(analogPin);
    spectrumValue[i]=constrain(spectrumValue[i], filter, 1023);
    spectrumValue[i]=map(spectrumValue[i], filter,1023,0,255);
    Serial.print(spectrumValue[i]);
    Serial.print(" ");
    delay(1);
    digitalWrite(strobePin, HIGH);
    delay(1);
  }
  Serial.println();
  analogWrite(ledred,spectrumValue[0]);
  analogWrite(ledred,spectrumValue[1]);
  analogWrite(ledblue,spectrumValue[3]);
  analogWrite(ledblue,spectrumValue[4]);
  analogWrite(ledgreen,spectrumValue[5]);
  analogWrite(ledgreen,spectrumValue[6]);
}

 
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: MSGEQ7 adatkiolvasás probléma

Hozzászólás Szerző: kapu48 »

Én nem arra gondoltam, hogy összevissza helyezzél el várakozásokat! (Azzal csak rontottál a helyzeten!)
Hanem amit ott is magyaráz a video 1.50 – 2.20perc, időzítés beállításra:
https://www.youtube.com/watch?v=W4EG9Ik ... e=youtu.be
Diagram görbéket mutat és kihangsúlyozza skópon is a beállításukat!
De itt kiderült, hogy ez a jelzett R/C tagokkal megtörténik!

Kérdés:
Miket ír ki a debug monitorra a „ Serial.print(spectrumValue);” sór?
Ha 1 állandó ismert frekvenciájú folyamatos hangot küldesz rá.
Jó lenne ha közben „i”értékét is ki írná, mert így tudnánk melyik frekvencia sávon, milyen magas jelszintet kapsz?

Szerintem, neked az analóg jelek beolvasásának időzítését kellene összehangolnod az MSGEQ7 multiplexer frekvenciájával.
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: MSGEQ7 adatkiolvasás probléma

Hozzászólás Szerző: kapu48 »

Halható hangfrekvenciás sávban működő skópot a PC hangkártyájával is tudsz szimulálni.
Csak meg kel keresni a megfelelő softwert.

Azzal mérheted az MSGEQ7 kimenetén megjelenő analóg lépcsőzetes jelszinteket.
Ha az OK-nak tűnik? Már csak a megfelelően időzített kiolvasást kel belőni!

És még fontos!
Az Arduino analóg bemenetelére nem adhatsz nagyobb feszültséget, a beállított referencia feszültségnél!
A 3.3V-on működő Arduinot tönkre teszi az analog bemenetre kerülő 3.3V feletti jel!
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: MSGEQ7 adatkiolvasás probléma

Hozzászólás Szerző: kapu48 »

Térjünk vissza a: https://www.sparkfun.com/datasheets/Com ... MSGEQ7.pdf
4. oldal diagramhoz.

A 200K – 30pf R/C taggal beállított Strobe órajel frekvenciáját kellene eltalálni az alább közölt
program for ciklusában // ts-el jelölt várakozások állítgatásával.

Kód: Egész kijelölése

int analogPin=0;
int strobePin=2;
int resetPin=3;
int ledred=9;
int ledblue=10;
int ledgreen=11;
int spectrumValue[7];
int filter=80;

void setup(){
  
  Serial.begin(9600);
  pinMode(analogPin, INPUT);
  pinMode(strobePin, OUTPUT);
  pinMode(resetPin, OUTPUT);
  pinMode(ledred, OUTPUT);
  pinMode(ledblue, OUTPUT);
  pinMode(ledgreen, OUTPUT);
  digitalWrite(resetPin, LOW);
  delay(1);
  digitalWrite(strobePin, HIGH);
}

void loop(){
  
  digitalWrite(resetPin, HIGH);
  delay(1);
  digitalWrite(strobePin, LOW);
  digitalWrite(resetPin, LOW);
   delayMicroseconds(30);  // ts
  for (int i=0;i<7;i++){
    digitalWrite(strobePin, HIGH);
    delayMicroseconds(30);              // ts strobe pulse width
    digitalWrite(strobePin, LOW);
    delayMicroseconds(15);              // ts/2 nél történik a beolvasás
    spectrumValue[i]=analogRead(analogPin);
    spectrumValue[i]=constrain(spectrumValue[i], filter, 1023);
    spectrumValue[i]=map(spectrumValue[i], filter,1023,0,255);
    
    Serial.print(i);
    Serial.print(" : ");
    Serial.println(spectrumValue[i]);  // Terminálban figyeld az értékeket!
    delayMicroseconds(10);              // ts/2
  }
  Serial.println();
  analogWrite(ledred,spectrumValue[0]);
  analogWrite(ledred,spectrumValue[1]);
  analogWrite(ledblue,spectrumValue[3]);
  analogWrite(ledblue,spectrumValue[4]);
  analogWrite(ledgreen,spectrumValue[5]);
  analogWrite(ledgreen,spectrumValue[6]);
  delay(200);
}

whriley
Újonc
Újonc
Hozzászólások: 4
Csatlakozott: 2015. július 30. csütörtök, 18:02

Re: MSGEQ7 adatkiolvasás probléma

Hozzászólás Szerző: whriley »

Sziasztok!

Kérdésedre válaszolva:
Miket ír ki a debug monitorra a „ Serial.print(spectrumValue);” sór?: 0 0 0 0 0 0 0
Csináltam már azt is, hogy 20hz 100hz szinusz jeleket küldtem folyamatosan, de semmi változás.
Én igazából nem nagyon értem, hogy megadott kód ami letöltöttem, miért nem kész kód, miért nem csinálta ezt meg a szerző. Az a baj hogy nem értem olyan mélyen az ic belső működését. :(
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: MSGEQ7 adatkiolvasás probléma

Hozzászólás Szerző: kapu48 »

Sajnos ez itt HOBY fórum! (Nem pedig sült galambkapkodó játék!)

A hibát neked kel megkeresned a projektotban!
Lehet az hardveres, vagy softweres.
Ezt nevezzük tanulási folyamatnak.

Először nézd meg, hogy jó e az ADC mérés.
Kössél az MSGEQ7 helyet, 1 potmétert a: VREF < Csuszkát az ADC bemenetre > GND , pontokra.
És figyeld, hogy reagál a valamit ha mérés közben tekergeted a potit.
whriley
Újonc
Újonc
Hozzászólások: 4
Csatlakozott: 2015. július 30. csütörtök, 18:02

Re: MSGEQ7 adatkiolvasás probléma

Hozzászólás Szerző: whriley »

Értem, persze. ADC-nek működnie kell mert végső elkeseredésemre kipróbáltam egy alul áteresztő szűrővel (1 tekercs sorba, 1 kondi párhuzamosan) erősítő fejhallgató kimenet segítségével arduino analóg bemenetére hangot küldtem. Úgy működött, egy ledet villogtattam is ütemre csak eléggé "remeg" a fénye.
Legfeljebb megpróbálom ezen a vonalon finomítgatni a dolgot hátha legalább így sikerül.
Köszönöm a segítséged.
Válasz küldése