60 nap alatt Arduino - Házi feladatok - Zenegép

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: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

60 nap alatt Arduino - Házi feladatok - Zenegép

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

A hangkeltés/zenegép különféle megoldásai itt érhetőek el. Ez a #24-es lecke környékén bukkan fel...
Avatar
csegebiga
Chipgyilok
Hozzászólások: 288
Csatlakozott: 2015. március 27. péntek, 21:27

Re: 60 nap alatt Arduino - Házi feladatok - Zenegép

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

Üdv!
egy másik fórumon előkerült az Urbán féle Z80-as dallamcsengő.
ezzel kapcsolatban felmerült, hogy le kéne játszani a zenéket.

mivel éppen az Arduino rendszert tanulom (már63 nap alatt),

megírtam/módosítottam az ébresztőóra dallamlejátszóját és
megszerkesztettem az eredeti dallamcsengő hangkészletét definiáló z80snd.h állományt

a z80dallam:

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

/*
  ** Z80dallamcsengő dallamjátszó  **
   Buddha Mester által kreált dallam
      lejátszására kreált "szög"
  
  áramkör:
  Arduino UnoR3
  piezo speaker a Digital8 láb és a GND között 
*/

 //az eredeti dallamcsengő hangkészlet
 #include "z80snd.h"

// a dallam hangjegyei:  egy byte= adott hangmagasság adott ideig

int dallam[] = { N98, N94, N98, N94, N51, N51, NC0, 
                 N98, N94, N98, N94, N51, N51, NC0, 
                 N8C, N8C, N8D, N8F, N51, N4E, NC0, 
                 N8F, N91, N93, N94, N56, N56, NC0, 
                 N8C, N8C, N8D, N8F, N51, N4E, NC0, 
                 N8F, N91, N93, N94, N56, N56, NFE};


void setup() {
  // végiglépked a dallamon
  for (int hang = 0; (dallam[hang]<9900) ; hang++) //9900 dallam vége, 9999 dallamkészlet vége(még nem használt)
  {    
    int freki= dallam[hang];
    hang++;
    int hossz= dallam[hang];
    if (freki!=0) 
    {
      //digit 8 on megszólaltatja a hangot
      tone(8, freki,hossz);
      
      // két hang között meg kell várni a hang hosszát plusz még valamennyit
      // tapasztalat szerint a hang hossza + 30% jó szokott lenni:
      int kitart = hossz * 1.30;
      delay(kitart);

      // ha kint maradt volna a hang, leállíjuk:
      noTone(8); 
    }
    else 
    {
      // szünet
      delay(hossz);
    }
  }
}

void loop() 
{   
 // nem akarjuk folyamatosan leátszani a dallamot 
}
z80snd.h:

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

#define N00 0, 1000
#define N01 988, 1000 
#define N02 932, 1000 
#define N03 880, 1000 
#define N04 831, 1000 
#define N05 784, 1000 
#define N06 740, 1000 
#define N07 698, 1000 
#define N08 659, 1000 
#define N09 622, 1000 
#define N0A 587, 1000 
#define N0B 554, 1000 
#define N0C 523, 1000 
#define N0D 494, 1000 
#define N0E 466, 1000 
#define N0F 440, 1000 
#define N10 415, 1000 
#define N11 392, 1000 
#define N12 370, 1000 
#define N13 349, 1000 
#define N14 330, 1000 
#define N15 311, 1000 
#define N16 294, 1000 
#define N17 277, 1000 
#define N18 262, 1000 
#define N19 247, 1000 
#define N1A 233, 1000 
#define N1B 220, 1000 
#define N1C 208, 1000 
#define N1D 196, 1000 
#define N20 0, 750 
#define N21 988, 750 
#define N22 932, 750 
#define N23 880, 750 
#define N24 831, 750 
#define N25 784, 750 
#define N26 740, 750 
#define N27 698, 750 
#define N28 659, 750 
#define N29 622, 750 
#define N2A 587, 750 
#define N2B 554, 750 
#define N2C 523, 750 
#define N2D 494, 750 
#define N2E 466, 750 
#define N2F 440, 750 
#define N30 415, 750 
#define N31 392, 750 
#define N32 370, 750 
#define N33 349, 750 
#define N34 330, 750 
#define N35 311, 750 
#define N36 294, 750 
#define N37 277, 750 
#define N38 262, 750 
#define N39 247, 750 
#define N3A 233, 750 
#define N3B 220, 750 
#define N3C 208, 750 
#define N3D 196, 750 
#define N40 0, 500 
#define N41 988, 500 
#define N42 932, 500 
#define N43 880, 500 
#define N44 831, 500 
#define N45 784, 500 
#define N46 740, 500 
#define N47 698, 500 
#define N48 659, 500 
#define N49 622, 500 
#define N4A 587, 500 
#define N4B 554, 500 
#define N4C 523, 500 
#define N4D 494, 500 
#define N4E 466, 500 
#define N4F 440, 500 
#define N50 415, 500 
#define N51 392, 500 
#define N52 370, 500 
#define N53 349, 500 
#define N54 330, 500 
#define N55 311, 500 
#define N56 294, 500 
#define N57 277, 500 
#define N58 262, 500 
#define N59 247, 500 
#define N5A 233, 500 
#define N5B 220, 500 
#define N5C 208, 500 
#define N5D 196, 500 
#define N60 0, 375 
#define N61 988, 375 
#define N62 932, 375 
#define N63 880, 375 
#define N64 831, 375 
#define N65 784, 375 
#define N66 740, 375 
#define N67 698, 375 
#define N68 659, 375 
#define N69 622, 375 
#define N6A 587, 375 
#define N6B 554, 375 
#define N6C 523, 375 
#define N6D 494, 375 
#define N6E 466, 375 
#define N6F 440, 375 
#define N70 415, 375 
#define N71 392, 375 
#define N72 370, 375 
#define N73 349, 375 
#define N74 330, 375 
#define N75 311, 375 
#define N76 294, 375 
#define N77 277, 375 
#define N78 262, 375 
#define N79 247, 375 
#define N7A 233, 375 
#define N7B 220, 375 
#define N7C 208, 375 
#define N7D 196, 375 
#define N80 0, 250 
#define N81 988, 250 
#define N82 932, 250 
#define N83 880, 250 
#define N84 831, 250 
#define N85 784, 250 
#define N86 740, 250 
#define N87 698, 250 
#define N88 659, 250 
#define N89 622, 250 
#define N8A 587, 250 
#define N8B 554, 250 
#define N8C 523, 250 
#define N8D 494, 250 
#define N8E 466, 250 
#define N8F 440, 250 
#define N90 415, 250 
#define N91 392, 250 
#define N92 370, 250 
#define N93 349, 250 
#define N94 330, 250 
#define N95 311, 250 
#define N96 294, 250 
#define N97 277, 250 
#define N98 262, 250 
#define N99 247, 250 
#define N9A 233, 250 
#define N9B 220, 250 
#define N9C 208, 250 
#define N9D 196, 250 
#define NA0 0, 187 
#define NA1 988, 187 
#define NA2 932, 187 
#define NA3 880, 187 
#define NA4 831, 187 
#define NA5 784, 187 
#define NA6 740, 187 
#define NA7 698, 187 
#define NA8 659, 187 
#define NA9 622, 187 
#define NAA 587, 187 
#define NAB 554, 187 
#define NAC 523, 187 
#define NAD 494, 187 
#define NAE 466, 187 
#define NAF 440, 187 
#define NB0 415, 187 
#define NB1 392, 187 
#define NB2 370, 187 
#define NB3 349, 187 
#define NB4 330, 187 
#define NB5 311, 187 
#define NB6 294, 187 
#define NB7 277, 187 
#define NB8 262, 187 
#define NB9 247, 187 
#define NBA 233, 187 
#define NBB 220, 187 
#define NBC 208, 187 
#define NBD 196, 187 
#define NC0 0, 125 
#define NC1 988, 125 
#define NC2 932, 125 
#define NC3 880, 125 
#define NC4 831, 125 
#define NC5 784, 125 
#define NC6 740, 125 
#define NC7 698, 125 
#define NC8 659, 125 
#define NC9 622, 125 
#define NCA 587, 125 
#define NCB 554, 125 
#define NCC 523, 125 
#define NCD 494, 125 
#define NCE 466, 125 
#define NCF 440, 125 
#define ND0 415, 125 
#define ND1 392, 125 
#define ND2 370, 125 
#define ND3 349, 125 
#define ND4 330, 125 
#define ND5 311, 125 
#define ND6 294, 125 
#define ND7 277, 125 
#define ND8 262, 125 
#define ND9 247, 125 
#define NDA 233, 125 
#define NDB 220, 125 
#define NDC 208, 125 
#define NDD 196, 125 
#define NE0 0, 63 
#define NE1 988, 63 
#define NE2 932, 63 
#define NE3 880, 63 
#define NE4 831, 63 
#define NE5 784, 63 
#define NE6 740, 63 
#define NE7 698, 63 
#define NE8 659, 63 
#define NE9 622, 63 
#define NEA 587, 63 
#define NEB 554, 63 
#define NEC 523, 63 
#define NED 494, 63 
#define NEE 466, 63 
#define NEF 440, 63 
#define NF0 415, 63 
#define NF1 392, 63 
#define NF2 370, 63 
#define NF3 349, 63 
#define NF4 330, 63 
#define NF5 311, 63 
#define NF6 294, 63 
#define NF7 277, 63 
#define NF8 262, 63 
#define NF9 247, 63 
#define NFA 233, 63 
#define NFB 220, 63 
#define NFC 208, 63 
#define NFD 196, 63 
#define NFE 9900, 63
#define NFf 9999, 63 
az ottani témához untig elég volt azt az egy dallamot lejátszani.
ez szépen megy is. resetre lejátssza, és kész.


de.
az eredeti z80as epromban van kb 300 zeneszám.
ezt nem tudom (és nem is akarnám) a programba bedrótozni,
ezért más tárolási módot kell alkalmazni.

a "legegyszerűbb" leprogramozni egy 2716(16kbit=2048byte) vagy 2732(32kbit=4096byte) eprom olvasását, és a kiolvasott byte hangként való lejátszását
a 2732 eprom lábkiosztása
definiálni kell A0-A10 címbuszt(kimenet), D0-D7 adatbuszt(bemenet) és /OE /CE rendszerbuszt (kimenet) és a tápot(+5V GND ) ez összesen 24 láb lenne.
(az uno r3 erre azt hiszem nem képes. talán a mega)
a cím- és adatbuszt lehetne shift regiszterrel kiírni és beolvasni, a /OoutEnable /ChipEnable segítségével meg vezérelni az eprom működését

vagy a másik mód, hogy az epromból kiolvasott tartalmat töltöm be a gépbe, és azt játssza le.
ehhez valamilyen tárolóból kéne kiolvasni a tartalmat (pl sd kártya)
a tanfolyam nem tért ki az sd kártya kezelésre, (file megnyitása olvasásra, szekvenciális olvasása, file zárása.)
igy ez számomra elég ismeretlen terület.

mindkettő mellett és ellen szólnak érvek.

vagy ti milyen utat tartanátok kivitelezhetőnek?
thx
(c)
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: 60 nap alatt Arduino - Házi feladatok - Zenegép

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

Miért nagy EEPROM, amit nehéz is kezelni?
Én 24LC512-t raknék be (I2C-s EEPROM)
Zenére/hangkeltésre amit használnék (most írom a cikket pont):

Tone.h illetve az RTTTL eljárásgyűjtemény.
Tipp: http://www.instructables.com/id/Aruino- ... TL-Player/
https://github.com/ponty/arduino-rtttl-player

SD kezelés:
Arduino -> Minták -> SD -> datalogger
Arduino -> Minták -> SD -> readwrite
Vigyázz! A programban a pinMode(10, OUTPUT); esetén a SD.begin(4) helyett SD.begin(10) kell! Ha az SD a ChipSelectje a 10-es láb!
Avatar
csegebiga
Chipgyilok
Hozzászólások: 288
Csatlakozott: 2015. március 27. péntek, 21:27

Re: 60 nap alatt Arduino - Házi feladatok - Zenegép

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

Robert írta: Tone.h illetve az RTTTL eljárásgyűjtemény.
Tipp: http://www.instructables.com/id/Aruino- ... TL-Player/
https://github.com/ponty/arduino-rtttl-player
úgy látom, ez pont az ellenkezőjét teszi annak, amit én szeretnék tenni.
bepötyögött rengeteg zenét, és azt játssza le.
nekem van egy eprom tartalmam vagy a chipben, vagy egy bináris fájlban.
egy byte =adott hangmagasság+adott játszási idő definícióval.
(ezek vannak kibontva a z80snd.h állományban Hexa érték= Hz, ms formában)
és azt szeretném lejátszani.


EEPROM chipbe hogyan írok adatot pcről?
megírok egy soros port =>EEPROM transzfer alkalmazást (pl egy gomb megnyomására indulva)?
és a pc felől a jó öreg copy dallam.bin com6 paranccsal küldeném?
ezzel az a gáz, hogy az ellenőrzésnek is bele kell férnie a két byte kiírása közé

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

:tovább
  beolvasom a soros portról byte-ot, 
 :kiír
  kiírom a byte-ot, 
  beolvasom a byte-ot, 
  ellenőrzöm, kiírt==beolvasott? 
    ha jó, eprom cím++ és mehet tovább
    ha nem , újra kiír (watchdog needed! nehogy egy rossz cella végtelen ciklusba zárja a folyamatot)
beszerzek egy chipet és kipróbálom.


az sd kártyakezelést most olvasgatom. ha lesz hozzá hw, kipróbálom. :)
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: 60 nap alatt Arduino - Házi feladatok - Zenegép

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

PC / AVR oldalra I2C EEPROM feltöltő:
(Igaz, Bascom a AVR oldal)
http://www.mcselec.com/index.php?option ... &Itemid=57

Viszont itt a PC oldali program is :)
A bascom meg átemelhető Arduino alá némi programozással....
Válasz küldése