60 nap alatt Arduino #23 - Analóg+hang

A "60 nap alatt Arduino" tanfolyam házi feladatai és közvetlen témái
Válasz küldése
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

60 nap alatt Arduino #23 - Analóg+hang

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

A megoldás az analóg jel hangmagasságra gyakorolt hatásáról.... :)

A túl egyszerű:

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

/*  Hang parameterekkel
    Analog megközelítés
    60 nap alatt arduino tanfolyam
    (c) TavIR http://avr.tavir.hu  */
 
    #define Speaker 10
      //Hangszoro helye
    int sensorPin = A3;
      //Ezt az analog bemenetet hasznaljuk
    int sensorValue;
      //Ez a beolvasott ertek

void setup() {
      //hangszoro kimeneti labon
    pinMode(Speaker, OUTPUT);
  }

void loop() {
     //beolvassuk az analog erteket
  sensorValue = analogRead(sensorPin);
  sensorValue=sensorValue*10;  
    //Speaker bekapcsol
  digitalWrite(Speaker, HIGH);  
    //varunk
  delayMicroseconds(sensorValue);          
    //Speaker kikapcsol        
  digitalWrite(Speaker, LOW);   
    //varunk
  delayMicroseconds(sensorValue);                  
}
A hozzászólást 1 alkalommal szerkesztették, utoljára Robert 2012. augusztus 25. szombat, 10:05-kor.
Avatar
macsek
Bitmanipulátor
Hozzászólások: 121
Csatlakozott: 2008. december 4. csütörtök, 7:00

A kapcs. rajz is 1szerű :)

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

Kép
Avatar
macsek
Bitmanipulátor
Hozzászólások: 121
Csatlakozott: 2008. december 4. csütörtök, 7:00

Macsek LCD VU mérő v1.0

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

Az én VU mérőm így néz ki.
Örülnék ha más is megmutatná mit csinált.

Ahol megjegyzésben 16 szóközről van szó ott igazából annyi van a kódban csak a fórummotor megeszi a többletet.
Én most nem tettem semmit az analóg lábra, csak egy csipesszel odanyúltam. Ha hangot kötnénk rá biztos érdekesebb lenne.

Kicsit bénának érzem a VU csúcstartás megoldásomat, milyen jobb 5letetek van rá?
// VU mero
// Macsek 2012.08.15
// arduino
/////////
#include "LiquidCrystal.h" //LCD-re irjuk az eredmenyt

// beallithato parameterek
#define MEROLAB A1 // ezen az arduino porton merunk

  #define LCD_RS 4  
  #define LCD_E  5  
  #define LCD_D4 6
  #define LCD_D5 7
  #define LCD_D6 8
  #define LCD_D7 9

// konstansok
#define MAXHE 1023 // maximalis merheto hangero (10 biten 0..1023)
#define KARSZELESSEG 5  // ennyi oszlopbol all egy karakter
#define KIJELZOHOSSZ 16 // ennyi karakter fer egy sorba
#define FELBONTAS (KIJELZOHOSSZ*KARSZELESSEG)  // 16 karakter * 5 oszlop
#define VU_TARTAS 5000  // ennyi millisecig tartjuk a max erteket
#define TELI_CHR 5  // inverz szokoz
#define CSIK_CHR_2 (TELI_CHR+1)
#define CSIK_CHR_3 '|'
#define CSIK_CHR_4 (TELI_CHR+2)
#define CSIK_CHR_5 0


unsigned int hangero=0;
unsigned int hangero_csucs=0;
unsigned long hangcsucs_ido;
byte torolni_kell = 0;


LiquidCrystal lcd(LCD_RS, LCD_E, LCD_D4, LCD_D5, LCD_D6, LCD_D7);

///////////////////////////////////////////////////////////////////////////////////////////////
void plot(byte y, byte x, byte uzemmod) // Y, X, uzemmod= 0:csak "pont" 1:teli vonal
{
  char x_egesz;
  char x_maradek;
  char kiirando;
    
  lcd.setCursor(0,y);
  x_egesz   = x / KARSZELESSEG;
  x_maradek = x % KARSZELESSEG;
  
  if(uzemmod != 0)
  {
    // meghuzzuk a vonalat
    while(--x_egesz >=0)
      lcd.write(TELI_CHR);
    
    if(x_maradek > 0)
      lcd.write(x_maradek);
    
    lcd.write(' ');
  }
  else // futopont
  {
    switch(x_maradek)
    {
      case 0:
        if(x_egesz > 0)
        {
          x_egesz--;
          kiirando = CSIK_CHR_5;
        }
        else
          // nincs is mit kiirni
          kiirando = ' ';
        break;
        
      case 1:
        // egyes vonal
        kiirando = 1;
        break;
        
      case 2:
        kiirando = CSIK_CHR_2;
        break;
  
      case 3:
        kiirando = CSIK_CHR_3;
        break;
        
      case 4:
        kiirando = CSIK_CHR_4;
        break;
        
      case 5:
        kiirando = CSIK_CHR_5;
        break;
    }
    if(x_egesz>0)
    {
      lcd.setCursor(x_egesz-1,y);
      lcd.write(' ');
      lcd.write(kiirando);
    }
    else
    {
      lcd.setCursor(x_egesz,y);
      lcd.write(kiirando);
    }
  }
  // 1234567890123456
  lcd.print(" "); // gyors valtas miatt jobb letorolni, ne maradjon szemet
}
   
   
void char_oszlop_gen(byte karakterkod, byte sorertek) // definial egy sajat karaktert az LCDn
{
  byte sorszam;
  byte c[8];
  
  c[7]=0;  // a kozepso csik also pixele hianyzik, igy ez lesz az ipari szabvany
  for(sorszam=0; sorszam<7; sorszam++) // karakter kepen belul az oszlop sorszama
    c[sorszam] = sorertek;
  
  lcd.createChar(karakterkod, c); // ELOBB kell karaktert definialni, csak utana johet a begin
}


void setup(void) /////////////////////////////////////////////////////////////////////////////////
{
  byte karakterkod, sorszam;
//  byte c[8];
  byte hatvany2; // ketto az n-ediken
  char uzemmod;
  
  // Ugy tunik, hogy ezekre valamiért nincs is szukseg.
//  pinMode(LCD_RS, OUTPUT);
//  pinMode(LCD_E,  OUTPUT);
//  pinMode(LCD_D4, OUTPUT);
//  pinMode(LCD_D5, OUTPUT);
//  pinMode(LCD_D6, OUTPUT);
//  pinMode(LCD_D7, OUTPUT);
  
  
  // Nem sikerult hatvanyozni es amugy is sok memoriat zabalna, mert float
  // igy hatvany2 lesz 2 aktualis hatvanya
  
  hatvany2 = 16; // nem merem beleirni a forba, mert nem volt rola szo, h lehet
  // ha KIJELZOHOSSZ nem 5 akkor feltehetoleg modositani kell hatvany2-t 2^(KIJELZOHOSSZ-1) -re
  for(karakterkod=1; karakterkod<=KARSZELESSEG; karakterkod++) // ennyiedik karaktert babraljuk
  {
    // eloallitjuk a karaktert
    char_oszlop_gen(karakterkod, 32 - hatvany2);
    hatvany2 /= 2;
  }

  // meg mielott valaki kotozkodesre gondolna:
  // Mar mukodott ezt is ciklussal, csak a fuggoleges vonal kiszedese bonyolult, igy konnyebben ertheto
  char_oszlop_gen(CSIK_CHR_2, 8 );
  char_oszlop_gen(CSIK_CHR_4, 2);
  char_oszlop_gen(CSIK_CHR_5, 1);
  
  lcd.begin(16,2);
  // 1234567890123456
  lcd.print("LCD kivezmero v1");
  lcd.setCursor(0,1); // masodik sor
  lcd.print("Macsek");
  
  delay(500);
  
  // csicsamicsa
  #define DLY 100
  for(uzemmod=1; uzemmod>=0; uzemmod--)
  {
    for(sorszam=0; sorszam<=FELBONTAS; sorszam++)
    {
      plot(1, sorszam, uzemmod); // Y, X, teli vonal/pont
      delay (DLY);
    }

    for(sorszam=FELBONTAS; sorszam<255; sorszam--)
    {
      plot(1, sorszam, uzemmod); // Y, X, teli vonal/pont
      delay (DLY);
    }
  }
}


void loop(void)
{
  hangero = analogRead(MEROLAB);
  hangero = hangero*FELBONTAS/MAXHE;  // skalazzuk, max bemenet legyen teljes csik
  plot(1, hangero, 1);
  
  if(hangero>hangero_csucs)
  {
    hangero_csucs = hangero;
    hangcsucs_ido = millis();
    torolni_kell = 1;
  }
  
  if(hangcsucs_ido+VU_TARTAS>millis())
    plot(0, hangero_csucs, 0);
  else if( torolni_kell>0 )
  {
    lcd.setCursor(0,0);
    // 1234567890123456
    lcd.print(" "); // 16 db szokoz letorli azt a sort
    torolni_kell = 0;
    hangero_csucs = 0;
  }

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

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

Már megint én vagyok az, aki nem érti az egészet!

A zajból hogyan jön ki a hangerő?
Mi biztosítja, hogy pont a jel csúcsán vesztek mintát?
És ha pont a hullámvölgyben mértek?

Legalább valami mérésátlagolás kellene bele!
:?
Avatar
macsek
Bitmanipulátor
Hozzászólások: 121
Csatlakozott: 2008. december 4. csütörtök, 7:00

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

kapu48 írta:Már megint én vagyok az, aki nem érti az egészet!
Meg aki legalább reagál :)
Kezdem azt hinni, h Robin kívül mostanában csak te meg én írjuk a fórumot. Ja nem, SzLacus is szokott néha írni.
kapu48 írta:A zajból hogyan jön ki a hangerő?
Hát úgy, h megmérjük :lol:
Vagy attól tartasz, h túl magas a zajszint a jel szintjéhez képest?
kapu48 írta:Mi biztosítja, hogy pont a jel csúcsán vesztek mintát?
Semmi. De ha nem egy fix frekvenciás jelet kell mérni, aminek a frekvenciája pont a mi mérési gyakoriságunk egész számú többszöröse (felharmonikusa), akkor ez miért baj?
A shannon elv alapján egy folytonos idejű jel elvileg tökéletesen visszaállítható mintáiból, ha a mintavételi frekvencia legalább kétszer akkora, mint a jel legmagasabb frekvenciájú komponense..
kapu48 írta: És ha pont a hullámvölgyben mértek?
Akkor pont ugyanakkora értékű csak ellentétes előjelű a kapott eredmény ;-)
kapu48 írta:Legalább valami mérésátlagolás kellene bele!
:?
Miért? Ez nem deprez-műszer, amit féltenénk, ezek csak pixelek egy kijelzőn. Nem zavarja őket az ugrálás.
Mondjuk egy gördülő átlag kisimíthatná az ugrálását, de én azt nem hiányolom belőle.

Viszont a csúcs-tartó megoldásomról írtam is, h nem érzem tökéletesnek.
Szerintetek ezzel jobb lenne?
A program legvégén van ez a sor:

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

hangero_csucs = 0; 
Ezt kicserélni a következőre:

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

hangero_csucs = hangero;
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

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

macsek írta:
kapu48 írta:Már megint én vagyok az, aki nem érti az egészet!
Meg aki legalább reagál :)
Kezdem azt hinni, h Robin kívül mostanában csak te meg én írjuk a fórumot. Ja nem, SzLacus is szokott néha írni.
Á, szerintem annyira jó a tanfolyam, hogy mindenki egyből érti és használja:).
Vagy túl töümény, túl sűrű és így az elején sikerült elveszni benne....

De erre is lesz megoldás lassan....
- könyvben is elérhető,
- tanfolyam II,
- időkibővítő készülék,
- Bascom-AVR irányba váltás,
- Föld forgáslassító,
- nyári szabik elfogynak,
- határidős munkák-feladatok és akkor rohamléptekben pótlás jön...
Avatar
nfeco65
Újonc
Újonc
Hozzászólások: 5
Csatlakozott: 2008. május 19. hétfő, 6:00

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

Szia

visszatértem a 23. leckéhez az analogRead- hoz
itt futottam egy problémába
külső referencia feszültséget szertnék használni egy 3V-os analog eszköz mérésére (gyroscope).
a leckében szerepel az analogReference(EXTERNAL); utasítás
a fordításnál viszont hibát hoz erre a sorra
" error: expected constructor, destructor, or type conversion before '(' token

mi lehet a probléma
UNO R3 +EXT1
Arduino 1.0.1
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

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

Arduino-0023?
Melyik programkód?
Avatar
nfeco65
Újonc
Újonc
Hozzászólások: 5
Csatlakozott: 2008. május 19. hétfő, 6:00

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

Igen.
60 nap alatt Arduino #23 - Analóg világ című leckében szerepel ez a program :

/*
AnalogInput
60 nap alatt arduino tanfolyam
(c) TavIR http://avr.tavir.hu
*/

int sensorPin = A1;
//errol az analog labrol olvasunk
analogReference(DEFAULT); //alapertelmezett a referencia

void setup() {
Serial.begin(9600);
}

void loop() {
Serial.print("Analog 1:");
Serial.println(analogRead(sensorPin));
delay(1000);
}

ebben az analogReference( ) utasítást nem fogadja el bármelyik paraméterét használom akkor sem
EXTERNAL ,INTERNAL ,INTERNAL1V1, DEFAULT
a fordításnál hozza a hibaüzenetet
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

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

A "analogReference(DEFAULT); //alapertelmezett a referencia" sort tedd be a void setup() részbe...
Avatar
nfeco65
Újonc
Újonc
Hozzászólások: 5
Csatlakozott: 2008. május 19. hétfő, 6:00

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

Köszönöm
Ez volt a Hiba
Válasz küldése