Mindenféle hangok sokfelől

 ( balagesz | 2014. január 4., szombat - 23:50 )

Újra elmúlt egy év, de – szerencsére – a címben szereplő hangok nem a fejemben vannak a szilveszteri italozás következményeképp. Ami azt illeti, ennél jobb év végét kívánok magamnak a következőkben, a mostani nem sikerült valami „fényesre”. De legalább volt időm befejezni ezt a „hang” projektet. Ez egy régi terv, sok-sok éve „nekifogtam”, de mindig volt valami, ami miatt félre lehetett tenni. :) Lassan állt össze a koncepció, cserébe a végén egészen felgyorsult a megvalósítás. Annyi idő volt átgondolni, aztán a végén – a megvalósítás közben – mégis sorra módosultak a részletek. Emiatt egy kicsit „szedett-vedett” a végeredmény, tervezni még véletlenül se így kell ám! :)

De miről is van szó? Az alapprobléma: van egy – mondjuk úgy – erősítőnek használt tárgy, amin egy darab külső bemenet van. Nekem meg van „sok” jelforrásom, amik közül változó, hogy éppen mit akarok használni. A kábelek dugdosása meg annyira nem szimpatikus. A megoldás: kell egy eszköz, aminek van több bemenete illetve egy kimenete. (Ez jön az erősítő és a „sok” jelforrásom közé.) Valamilyen módon választható, hogy melyik bemenetét kapcsolja össze a kimenetével. Így be lehet dugva egyszerre az összes jelforrás kábele, a megfelelőt rá lehet kapcsolni az erősítőre. Tehát NEM KELL tudni a különböző bemeneteket EGYSZERRE a kimenetre kapcsolni, elég egy szimpla „jelválasztó”, fölösleges egy „keverő”.

Az erősítőnek használt tárgy régen egy nagyobb fajta kazettás magnetofon volt. Még a „klasszikus” formájú, oldaláról lecsatolható hangszórós felépítés. (Ez a magnetofon is megérne egy külön mesét. (Kép az nem lesz róla, elő kéne ásni.) A mechanikája olyan felépítésű, ami meglehetősen ritka. Van benne egy motor, ez hajtja magát a szalagot. De ez a motor mozgatja a mechanika szinte összes egyéb részét is. Amikor a play gombot lenyomják, akkor az csak egy „valamit” eltol és elindítja a motort. Az meg felhúzza a fejszerelvényt, rákapcsolja a megfelelő tengelyre a hajtást... Ugyanígy működik az összes többi gomb is. A rec a nagy átlagtól eltérően nem a play gombbal együtt nyomandó, hanem csak egymagában... :) Akit érdekelnek az ilyen (működésű) dolgok, annak ez a mechanika egy vizuális o....... csoda. :) ) Eléggé „gyengusz” hangja volt, de csak a gyári hangszórók miatt. Nem is az eredetijeivel használtam, kapott két 40W-os normális 3 utas hangdobozt. Ebben a felállásban már teljesen vállalható – persze nem HiFi – hangja lett, egyetlen hibájának talán a kissé magas alapzajt lehetne felhozni. Ezt a cuccot használtam mindenhez hangkeltésre, először a plus/4-hez, azután az AMIGA-hoz, majd később – amikor már lett használható hangú hangkártyám – a pc-hez is. Külső bemenete ennek volt talán több is, de érdemben csak egyet lehetett használni. (A többit (másikat?) túl zajosnak ítéltem. :) ) A „jelválasztó” már itt képbe jött, ez olyan 1996-97 körül lehetett. A következő lett a megoldás:

Az egyik pár RCA aljzat a kimenet, a másik három pár közül kapcsolódik ide valamelyik.

A „jelválasztást” egy 4 áramkörös 3 állású forgókapcsoló oldja meg, nem éppen egy bonyolult szerkezet. Ami fontos: a GND-k is kapcsoltak, tehát csak az éppen kiválasztott kütyü van galvanikusan összekapcsolva az erősítővel. Így nem lesznek fölösleges földhurkok, amit elkerülni még talán az is segít, hogy a jobb / bal csatorna födje is külön kapcsolódik.

Ez a „jelválasztó” volt használatban az elmúlt hetekig bezárólag, de az erősítő már néhány éve lecserélődött. (A pontos időpontra nem emlékszem, de az „új kütyü” már RoHS-konform, így 2006 utáni időszak lesz az.) Mindenesetre a magnóval simán elvoltam 20 évig... :) (A magnó kazettás részét persze már nem használtam, azt megette az idő. Illetve még az empéhárom is jobban szól, mint a(z a fajta) szalag.) És még a mai napig röhögőgörcs fog el az ilyen asztali multimédia-speakerek láttán, főleg hallatán. (Mondhatnám hogy „be kéne tiltani” őket, de ha az átlagnak (bocs) az a minőség is megfelel... :) ) Ezeknek a hangminősége (illetve minőtlensége) össze sem hasonlítható a 2×40W (Valódi!) hangdoboz + az azt „meghajtani képes” erősítő kombinációval! Azért a történethez hozzátartozik, hogy a mostani erősítőnek használt tárgy egy „mikro hifi”, ennek sem használom a gyári hangdobozait, a régi „nagy dobozok” sokkal jobban szólnak.

Viszont idő közben a régi „jelválasztóval” akadt két gondom is. Az egyikkel nem lehet mit kezdeni: „kinőttem” a képességeit. (Kevés a 3 csatorna. Nem mindig, mert aktívan talán kettőt használok, de sokszor kellett volna háromnál több, így itt is maradt a vezetékek dugdosása.) A másik gondon talán lehetne segíteni: a kapcsoló kezd erősen kontakthibás lenni. Jártam már vele így, szét lehet szedni és meg lehet takarítani az érintkezőit, de ez már talán a harmadik ilyen esetem lenne, és csak elodáznám vele az elkerülhetetlent, hogy készítsek egy újat.

Tehát megvan a terv: kell egy új „jelválasztó”. No de mik legyenek a specifikációk?

  1. Legyen több csatorna, lehetőleg annyi amennyi tutira nem kell. Mondjuk az előző duplája (6 csatorna) elég lesz.
  2. Kapcsoló elemnek nem akarok (esetlegesen zajos) elektronikus kapcsolót, viszont ennyire sok áramkörös forgókapcsolót beszerezni egyrészt nehéz, másrészt drága, harmadrészt nagy méretű. Így megoldásként marad az elektromechanikus működésű relé. A méretek miatt a lehető legkisebb.
  3. Egyszerre továbbra is csak egy jelforrás lesz a bemenetre kötve, a többit jelforrás földjeit is le kell választani a földhurkok elkerülése végett (mint régen), tehát kapcsolni kell a GND-t is.
  4. Okulva a kapcsoló kh-s „hajlamából”, a reléket foglalatba kellene rakni, hogy ha ilyen gond lenne, forrasztás nélkül cserélhetők legyenek.
  5. Mivel a 3 (4) áramkörös relék ritkábbak, egy bemenet (R + L csatorna, két jel) két darab két áramkörös relével kapcsolható. (A több áramkörös relék ugyan drágábbak is, de kevesebb is kellene belőlük, így az ár nem úgy fontos.) De ha már két relé: az egyik kapcsolhatja külön a GND-t, a vezérlést meg úgy célszerű megoldani, hogy összekapcsoláskor a GND-k kapcsolódjanak először. Szétkapcsoláskor meg természetesen utoljára.
  6. Mivel a relék kapcsolgatási igénye már meghaladja egy „mezei” mechanikus kapcsoló tudását, ezért a vezérlést csinálhatja egy mikrovezérlő, a lehetőségek így viszont kitágulnak.
  7. A kezelést könnyítendő, kelleni fog mondjuk egy kijelző, amin a kiválasztott csatornaszám látható (többek között). Ennek a hajtását ugyanúgy megoldhatja a µC.
  8. Az RCA csatlakozók ugyan jók, de nagyok. Célszerű inkább 3.5mm-es Jack csatlakozót használni. Mivel az elektronika elég bonyolult, „légszereléssel” nem lehet / célszerű összerakni, ezért egy prototípus NYÁK lesz az alapja. A Jack aljzat ezért NYÁK-ra szerelhető legyen, elkerülendő a kábelerdőt.
  9. Ha már proto-NYÁK: a relé „foglalata” (és vele együtt maga a relé) is raszteres lábkiosztású legyen, a szerelést tovább egyszerűsítendő.

Ezek voltak a feltételek körülbelül. A legnehezebb feladat a kapcsolóelem, tehát itt a relé típusának a kiválasztása. Van sokféle... A választás végül egy Fujitsu/Takamisawa relére esett, méghozzá az A-5W-K típusra. Kicsi, 5V-os a tekercse (Nem kell plusz táp!), sztenderd raszteres a lábkiosztása (ugyan foglalat külön nincs hozzá, de a hagyományos precíziós IC foglalat tökéletesen megteszi, a spéci foglalat mindig drága amúgy is), két áramkörös. Az adatlap szerint 200000 kapcsolást kibír, de ez majd hosszabb távon derül ki. (Itt nem lesznek túl nagy kapcsolt áramok, ez pedig negatívan is (!) befolyásolhatja az élettartamot. :) ) Az ára olyan 400 Ft. körül mozog, a hat csatornához ebből 12 az majdnem 5000 Ft. Mondjuk az előző kütyü alacsonyabb költségvetésű volt. (Illetve lehetne ez húzósabb is, tehát nem panaszkodok!)

Valami ilyesmi felépítést képzeltem el:

Felül 6 db. bemeneti csatlakozó, plusz a kimeneti. (Mondjuk ezek a csatlakozók nem normál raszteresek, nem 2.54 mm a lábtávolság, hanem 2.5 mm. Persze ekkora méretben ez simán „elmegy” kategória, szerencsére.) Alul a csatornákhoz tartozó relék foglalatai. Az egész részben „bedrótozva”:

A GND-t kapcsoló relék vannak az alsó sorban, ott a két áramkör párhuzamosan van kötve. (Mivel a Jack csatlakozóban közös a BAL / JOBB csatornához tartozó föld, így itt nem lehet azt külön kapcsolni, mivel nincs mit.) A földelés kapcsolása így talán be van biztosítva... :) Ugyan a kimeneti Jack alatt látszólag elég nagy szabad hely van, de az már itt látszott, hogy a µC + a relék meghajtása itt nem fog elférni. De csak a hajtás + a vezérlés csatlakozója az igen:

Itt a cucc már „fel van töltve” majd 5000 Ft. értékű relével, és még csak sejtésem sincs, hogy működni fog-e az elképzelés. :) (Figyelmesebben megnézve a reléket látszik, hogy 4 db. Régebbi szériából van mint a többi (2005-ösek). Azok még nem is RoHS példányok... De az újak is még 2008-as gyártásúak. Azt nem garantálom, hogy akkor lettek megvéve, de hogy a projekt 2008-09 körül elkezdődött, az valószínű... Nem kapkodom el, na!) A kész (kb...) „kábelezés” szerintem egész kulturált lett:

A panelre az +5V-ot rákapcsolva, illetve az ULN2003-ak bemenetére a megfelelő jelet adva kapcsolnak a relék, az kötődik össze azzal, aminek kell. Fél siker... De „mi is van itt összerakva”?

Ez a rajz „visszafele” készült. (Szokás szerint.) Azért ilyen – hogy is mondjam – csúf a kábelezés, mert a kész áramkörön szép. (Mivel a megépítésnél fontos volt az egyszerűség, emiatt az inkább lett esztétikus az utólag készült rajzzal ellentétben.) A #2..#6 csatornák ugyanúgy néznek ki mint az #1, a megfelelő jeleket (+5V, bejövő analóg jel GND, bal illetve jobb oldal) mindegyik csatorna párhuzamosan megkapja. Ezen felül minden csatornához tartozik két különálló meghajtójel a két reléhez. Alkatrésznek meg tartozik hozzá egy Jack aljzat + a két relé. De szerintem egyértelmű ez a rajzról. Ami esetleg feltűnhet, az a K2 pozíciószámú csatlakozó. Ez – egyelőre – a fenti képen még nincs beültetve, a későbbi „kavarások” miatt került be, de erről majd ott.

Ez eddig megvan. De – hogy egy klasszikust idézzek némileg elferdítve – „Értem én hogy relé... De mi hajtja?” Először szalagkábellel gondoltam a vezérlő + a relés nyákok összekötését, de később már egyszerűbbnek tűnt, ha a két csatlakozón keresztül csak simán „összedugom” a két áramkört. Ebből a megfontolásból született a következő elektronika:

Mikrovezérlőnek egy ATmega88-at sikerült választani. (Volt belőle egy csővel, de szép lassan elhasználom őket erre-arra... Régen egészen baráti ára volt, csak aztán megérkezett a gazdasági válság...) Az alkatrészoldal még egész kulturált itt is, na de a másik? Annyira azért az sem vészes. A kérdés itt is aktuális: „mi is van itt összerakva”?

A rajz – természetesen – itt is „visszafele” készült, mint az előzőnél. Az összeszerelésnél a portlábak úgy lettek bekötve, „ahogy jöttek sorban”. Emiatt lett ilyen „idióta” a kiosztás... Annyi volt az elképzelés, hogy az egyszerű huzalozás fontosabb mint az egyszerű kód a meghajtáshoz. Így jött össze az a gyönyörűség például, hogy a kijelző meghajtásához tartozó 8 portbitből az egyik más csoportba került. (Nem baj, a szoftver majd megoldja. Azt könnyebb mókolni mint a hardvert.) A kapcsolási rajzon látszik 3 kondenzátor, ami a kész képeken annyira nem. Nincsenek elfelejtve, csak „elbújtak” a mikrovezérlő alá. A kijelző fele menő vezetékek között ott van az a 3 portláb is, amin keresztül a µC felprogramozható. De ehhez kell még a tok RESET lába is, annak viszont már nincs hely a 10-es csatlakozón. (A kijelzőnek nem kellene táp amúgy, de pont a programozáshoz van az is kivezetve.) Az lett a megoldás, hogy a kijelző „DP” vonala (ez a tizedespont) egy Jumperrel átkapcsolható a RESET-re. (A RESET „áramkör” – szokásommal ellentétben – nincs túlbonyolítva, de itt rá mertem bízni a feladatot a tok saját BOD/SUT rendszerére.) Ebben az esetben nincs tizedespont meghajtás, cserébe lehet programozni... Az a pont nem éppen létkérdés. :) A rajzon szerepel még egy potenciométer is, ez sem látszik még a nyákon, erről majd később.

Az összeszerelt stuff így néz ki:

A végeredmény valahogy úgy volt elképzelve, hogy ez a cucc így majd be fog épülni egy kívánt méretű dobozba. A visszajelzéshez ebbe még bekerül az egy digitnyi 7 szegmenses kijelző, amit egy 10-es szalagkábellel oda vezetek, ahova „jól esik”. (A rajzon be vannak írva a szegmensek is, de ekkor még a kijelzős panel nem volt kész. Tetszőleges, hogy melyik vonal melyik szegmens lehet, ez majd a programból lesz lerendezve.) A tápot, illetve a vezérlést meg az erősítőnek használt tárgyból kihozom egy csatlakozón. Meglett a következő feladat: megfelelő méretű (nem túl nagy, nem túl vastag, ...) doboz kellene. Na, itt le is ült a projekt vagy másfél hónapra, ugyanis a „szokásos helyeken” körbenézve nem találtam tökéletest. Olyan volt, amire ráfogtam hogy megfelel, de az üzletig már nem sikerült eljutni. :)

Eközben közeledett a Karácsony, az ünnepek éppen jó időpontnak tűntek, hogy végére járjak a feladatnak. Viszont doboz nincs...

...de! Van nekem az erősítőnek használt tárgyam, amibe úgyis bele fog menni az ebből kijövő hang. Meg onnan kapja majd a tápját illetve a vezérlést is. Mi lenne, ha bekerülne annak a dobozába? Így megspórolok egy plusz külső kütyüt. Az ötlet végül is jó, mert a „mikro hifi” dobozában „bőven” van hely, csak valahogy nem akartam azt faragni. A hátulja így néz ki:

A doboza tipikus „pc-ház”, a hátsó és pár oldalsó csavart kitekerve le lehet kapni a tető/oldallemezt. (Érdekesség: a típustáblán szerepel két négyzet egymásban, ez a „kettős szigetelésű készülék” jele. De hogy a búbánatba lehet ez kettős szigetelésű? Maximum a hálózati kábel, az valóban az.) Belül három szinten helyezkednek el a „dolgok”:

Alul van a CD olvasó (poén: LG a kütyü, de Samsung meghajtó van benne... :) ), a középső szint az erősítő / rádió / komplett vezérlés, a legfelső szinten van a tápegység. (Igen, kapcsolóüzemű. „Nem illik” analóg környezetbe, de ez van... Erre jön a hálózat közvetlenül, ez meg csak a „levegővel szigetelten” van rászerelve a fém keretre. Tipikus szerelés ez a „mai” szórakoztató elektronikai termékeknél, de hogy ez így hogyan lehet „kettős szigetelésű”, arról valaki felvilágosíthatna... :) ) Illetve ezekre merőlegesen van az előlap egy szép nagy nyákkal, azon van az összes I/O (gombok / tekerők illetve kijelző / LED-ek formájában). A táp „teteje” a hátlap azon magasságába esik körülbelül, amilyen magasan a hálózati kábel megy be a dobozon belülre. (Lenne róla egy kép, de annyira rosszul sikerült, hogy nem merem iderakni... :) ) A fölötte levő helyen csak levegő van (mivel az előlap magasabb, szerencsére nem okoskodták túl a dolgot), oda lehet építkezni.

A megfelelő furatok elkészítése „nyűgös” volt egy kicsit, a fémlemez annyira vékony, hogy a fúrás közben a perem inkább kihajlott, mint normálisan kifúródott volna, de egy adag kalapács + reszelő „csodákra képes”:

Erre belül került egy csík szigetelő szalag, mivel nem akartam a hátlappal összeközösíteni az összes bemenet GND-jét, ha már a reléket beépítettem hozzá, majd a helyére került a cucc. A hátlap így már nem olyan esztétikus mint volt, de – ha minden jól megy – ritkán fogom látni:

A tervezés hiánya, vagyis a megváltozott körülmények viszont itt kezdenek „kicsúcsosodni”. A vezérléshez szükség lesz egy valamilyen jelre, eredetileg erre a „hátérvilágítás” kapcsolójelét gondoltam felhasználni. Ezt lehet a távirányítóról kapcsolgatni, kis ügyeskedéssel befogható ez is a feladatra. Aztán lehetőség még a távirányító infra vevőjének a jelét is feldolgozni közvetlenül (az m88 elég lenne rá), ami nem annyira triviális azért. (Ez amúgy még nincs teljesen elvetve, de most nem ez a megoldás van.) Viszont némi gondolkodás után arra jutottam, hogy „nem életszerű” szituáció az, hogy úgy akarom én a bemenetet váltani, hogy nincs kézközelségben a cucc, így nincs szükség a távirányítós küzdésre, simán megteszi egy egyszerű nyomógomb is. De hol legyen ez a gomb? Ha már a kijelzőt „bele kell faragni” valahova, célszerű ezt is ugyanoda rakni. Cserébe van egy probléma: a kijelző felé menő 10-es kábelen nincs fölösleges láb amin a kapcsoló jelét vissza lehet vezetni. Így ide nagyobb csatlakozót kell felrakni. Illetve ezt, ha össze van rakva, igen macerás szétszedni. Ha a kijelző vonalai amúgy is azok, amikkel a programozás történik, akkor a nyomógomb mellé még a programozó csatlakozót is célszerű felrakni, ráadásul kívülről elérhető helyre.

A végeredményről elfelejtettem képet lőni, csak egy köztes állapot van meg:

De mi is lett végül ezen behuzalozva?

Semmi extra, a kijelző (FND317, közös katódos hétszegmenses) a hozzá tartozó áramkorlátozó ellenállásokkal, a nyomógomb és a programozó csatlakozó. A Jumper azért kell, hogy a kijelző „DP” vonalát le lehessen választani, ha programozás módban van a belső elektronika. (Ha akkor rajta lenne, a kijelzőben lévő LED „elhúzná” a µC RESET lábát, nem engedné elindulni.)

A kijelzős panel a helyén:

Az előlapi kezelőszervek panelje alól kikandikál a csatlakozó, erre rá lehet dugni a szalagkábelt. El is fér, mi kell még? Rögzítésnek egyelőre „melegragasztó” lett befogva, remélem hogy nem akarom többet kiszedni... :) A „faragás” nem lett ugyan túl szép:

De „szerencsére” ezt a részt egy külső ajtó lezárja, becsukott állapotban nem látszik az egészből semmi. (A programozó csatlakozó kiosztását gondosan felírtam, jól jön az! :) )

Viszont a „horror” most jön: a kész cucc bekábelezése:

Az első rajzon emlegetett K2-es csatlakozóra dugott kábel az analóg hangot a dobozon belül rávezeti az AUX IN-re, tehát ezt kívülről nem kell összehurkolni. A kijelző panelen lévő 14 pólusú csatlakozó első 10 pólusa ugyanolyan sorrendben lett bekötve mint a mikrovezérlős panel 10 pólusú csatlakozója, így azt a részt egyszerű csatlakozózni. A maradék 4 vezetékből kettő nem használt, a másik kettő meg a nyomógomb, de ezt a másik csatlakozóra kell kötni, ami alapvetően a tápé. Ezért néz ez ki ilyen tragikusan. :) A második rajzon szerepelt egy potenciométer, ez sem volt az eredeti tervben. A készüléken belül csak olyan +5V-os táp van, ami StandBy állapotban is jelen van. Kellett egy olyan jel, aminek a segítségével meg lehet állapítani, hogy mikor van a készülék bekapcsolva. Kikapcsolt állapotban fölöslegesen menne a kijelző illetve a relék. Egy olyan jelet „találtam”, ami egy kicsit magasabb feszültségű mint kellene, a potméter ezt osztja olyan szintre, hogy a µC ne pusztuljon bele. :) (Fontos megjegyzés: önálló érként egy drót se megy sehova, így ha valahonnan le is szakadna egy vezeték, a többi mechanikusan rögzíti, nem tud egyből a tápba belehullani. Ettől függetlenül NEM KÖVETENDŐ PÉLDA ez a fajta kábelerdő, amit itt összehoztam! Ha valami tényleg leszakad, egyből működési hiányosság lesz a végeredménye, így azt én észreveszem. Ez meg nem másnak készült!)

A végeredmény valami ilyesmi (sötétben, hülye szögből fotózva, hogy ne legyen rajta a tükörképem a képen :) ):

Itt már fut a hozzá készült firmware is. Na de milyen UI-t lehet kitalálni egy darab nyomógombra és egy 7 szegmenses kijelzőre? :) Az elképzelés így nézett ki:

  1. Legyen 0 is, tehát olyan állapot, amikor nincs egyik bemenet sem kiválasztva!
  2. A gomb nyomogatására lépegessen körbe 0, 1, 2, 3, 4, 5, 6, 0, ...
  3. Mivel a kapcsolás időbe telik (várni célszerű az analógok szétkapcsolása, a GND szétkapcsolása, az új GND összekapcsolása és az új analógok összekapcsolása között is), ezért gombnyomásra csak a kijelző változzon, ne kapcsoljon egyből. Azt akkor tegye meg, ha már egy ideje nincs új gombnyomás!
  4. Jó lenne egy „ReCall” funkció, amikor az előző csatornát kapcsolja vissza. Ez úgy illeszthető be, hogy az első gombnyomás csak az előzőleg használtat kapcsolja vissza, a következő nyomás az éppen most használtat, majd utána jön csak az előre lépegetéses ciklus!
  5. Kikapcsoláskor mentse el a beállított csatornát, amit a következő bekapcsoláskor kapcsoljon is vissza!

Végül is nem egy lehetetlen elképzelés. Milyen „nyelven” készüljön a stuff? Régen rávágtam volna, hogy természetesen assemblyben, de kezdek öregedni. Az utóbbi pár év munkáin már látszik, hogy jó-jó az asm, de nem túl hatékony fejleszteni benne. Beágyazott rendszereknél leginkább a C jöhet szóba, esetleg a C++, de azzal egyelőre ráérek. C-t sajnos sosem tanultam, épp itt az ideje. Persze itt volt már (te jó ég...) három évvel ezelőtt is, ez a projekt (mármint a C tanulása) azóta is tart. :) Csak az igazi lelkesedés hiányzik. A gondom az szokott lenni, hogy programozni valamiben csak úgy lehet megtanulni, ha programokat írok az adott nyelven. De a tankönyvi példák sosem mozgattak, a beágyazott rendszerek meg amúgy is más tészta. A feladat „csak” annyi, hogy olyan bonyolultságú feladatokat keressek, amiket van esély megoldani, és mindeközben az sem árt, ha hasznos is. Na, EZ egy tipikusan ilyen meló.

Végül is elkészült, de az hozzá tartozik, hogy ez már a harmadik olyan C-ben megcsinált AVR-es programom, ami kész valamilyen szinten, és használva is van. De ezek közül ez a legegyszerűbb. :) Külön IDE-t egyelőre nem használok, szeretem látni, hogy mi történik menet közben. Egy másik projektből (talán a SUN KB-s mókából) „optimalizáltam” egy Makefile-t, ezt kézzel szerkesztgetve szépen megy a fordítás. (Egyszer majd kipróbálom „közvetlenül”, make nélkül... :) ) A „terminálban matatást megkönnyítendő” van a projekt könyvtárában néhány szkript, ebből három van gyakran használva. Az 1 nevű (!) egy „tisztítást” hajt végre, a 2 nevű fordít, a 3 nevű meg az AVRDUDE segítségével felprogramozza a tokot. Azért ilyen szépek a nevek, mert egy ./1, ./2 illetve ./3 beírásával elérhetők ezek a funkciók, keveset kell gépelni. (Nyilván a megfelelő IDE kívánt widgetjére „ráklikkelve” ugyanez a hatás érhető el, de – amíg nem értem tisztán hogy minek kell történnie – inkább csinálom ezt kézzel.) Amit egyelőre nem erőltettem, az a debug. Visszajelzésre ott a hatalmas kijelzőm, :) de ez a mikrovezérlő azért is jó választás, mert „ismerem”. Ha valami nem az elvárt módon működik, akkor nem kell azt találgatni, hogy az adott perifériát rosszul próbálom-e használni, vagy hibásan írtam le a fordítónak a feladatot. Itt tuti mindig az utóbbi lesz... (A µC un. FUSE bitjeinek a programozásához is van egy szkript, mivel itt NEM a programmemória egy kitüntetett címére kerülnek ezek, a programozó a letöltendő HEX fájlból nem tudja azt kideríteni. (Mivel nincs benne...))

Apró dolgokat azért a kódolás közben ismét sikerült tanulni. Az egyik, hogy a C is alkalmas arra, hogy elpacsáljam az erőforrásokat. :) Pl. az AVR magnak van egy olyan jó tulajdonsága, hogy van benne egy jó nagy rakás regiszter. Ez a komplett program olyan „bonyolult”, hogy a rendszermemóriát nem is lenne szükséges használni (maximum a vermet a szubrutinhívásoknál a visszatérési címek tárolására), de a C fordítót valahogy kétlem, hogy rá lehetne erre venni. :) Aztán az is tisztán látszik, hogy a globális változóktól nem mindig célszerű félni, okosan használva sokat lehet vele „spórolni”. Itt ugyan minimális mennyiségben használtam, de valahogy el sem akartam gondolkodni azon, hogy hogyan kerüljem ki. Ha már változók: emlékeim szerint kizárólag 8 bites előjel nélküli változókat kellett használni, meg nincsenek pointerek. Vagyis az mégis van, a ROM olvasó rutinok pointert várnak. De azon kívül egész jól el voltam nélkülük. (Ha azt a pár globális változót ki akarnám „optimalizálni” (muhaha...), gondolom többet használnám...) Mindenesetre tanulságos. A feladathoz mérten amúgy „röhejesen nagy” ennek a mikrovezérlőnek a teljesítménye, tehát nem volt szükség a túlzott optimalizációra, de az ilyenek azért zavarni szoktak, már csak az elvek miatt is, ugye. (Aki 1 MHz alatti órajellel kezdte a programozást, pár dolgot máshogy lát. :) )

Viszont ha idáig eljutottam (rajzoltam kapcsolási rajzokat), akár a kész kódot is „közreadhatom”, hátha jó lesz kiindulási alapnak valakinek. (A végén ott lesznek a megfelelő linkek.) A fordításhoz szükséges az avr-gcc, az avr-libc, illetve a make. A tok felprogramozásához az AVRDUDE a legkézenfekvőbb, ez talán a létező összes programozó hardvert kezeli. (Én személy szerint egy Xilinx PC3 kompatibilis JTAG (!) kábelt használtam most erre a célra, ami „csak” azért érdekes, mert NEM JTAG-on keresztül történik a dolog.) Más típusú AVR-re szerintem igen könnyű portolni a kódot, mivel nem használ semmi extra képességet, amit az m88 tud. (Például simán elég lenne a fele akkora memóriakapacitásokkal rendelkező m48 is, vagy a régebbi m8, de nekem éppen ez volt kéznél.)

Ha már sikerült egy kicsit káoszosra összeállítani a folyamatos módosítások miatt a dolgot, akkor mutatok egy „szépséget” a gyártótól is:

Ez a kép a kezelőszervek paneljának CD-t vezérlő gombjairól és környékéről készült. Ami érdekes lesz, az a nyomógombok felett található 5 db. elektrolit kondenzátor. Ezek áramköri szempontból un. passzív alkatrészek. No de „mennyire”?

Konkrétan annyira, hogy mindkét lábuk az összefüggő földfóliára van forrasztva. Ennél passzívabbak már nem is lehetnének. :) (A pozíciójukból arra lehet következtetni, hogy a nyomógombok „pergésmentesítését” látták volna talán el, de ez nem tuti. Mindenesetre fölöslegesek lettek, így módosították a nyák huzalozását tartalmazó egyetlen rétegnek a maszkját. De minden más maradt. Nem változott a forrasztásgátló lakk maszkja, a pozíciórajzok mindkét oldalon, a fúrófájlok, és ezek szerint a beültető gép programozásához se nyúltak. Olcsóbb volt bent hagyni az öt kondenzátort, mint a többi dolgot megcsinálni? (Aminek a végén maradt volna termékenként 5 plusz kondenzátor, azt hova rakják? :) )) Mókás.

Na de visszatérve a saját hatáskörbe tartozó részekhez... Végül is összeállt az egész, pontosan úgy működik ahogy elterveztem mind elektronikai, mind szoftver oldalról, tehát minden oké. Hogy ez is működni fog-e 10+ évig? Jó kérdés. „Bolondbiztos-e” az elkészült mű? Kezelés szempontjából az, szerelés szempontjából viszont koránt sem. (Célszerű lenne a kábeleknek + a reléknek külön rögzítés, hogy mást ne is említsek.) A fentiekből kiderült, hogy van pár átgondolatlanságnak látszó részlet a történetben, ez pontosan azért is van! :) Konklúzió: nem árt, ha az ember már az ELEJÉN tisztában van azzal, hogy a VÉGLEGES változat MILYEN LESZ, és nem a feladat megoldása közben módosulnak a specifikációk. A mai fejlesztési tempók mellett el se akarom képzelni, mennyi ilyen „megoldás” lehet, amiről nem is hallunk...

Linkek:

  1. A „mű” kapcsolási rajza egyben
  2. Firmware forráskód, az m88-ra fordított HEX fájllal együtt
  3. avr-libc olvasnivaló, ugyan sok mindent nem értek még, de segítség

balagesz

---

2014.01.04.

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Szép! Hű, ha az évek során hardverközelben maradtam volna valszeg én is hasonló dolgokat alkotnék. Mindenesetre most csak ámulok.

Ja, meg nézem a main.c-t. Jól sejtem, hogy a for-on belül minden ciklus elején elmegy a cpu aludni, majd a gombnyomás, mint külső (hardver) interrupt ébreszti fel? Én, mint aki a scanf, meg printf-ben szocializálódott e bejegyzés olvasása közben elképzelni nem tudtam, hogy a gombnyomás érzékelése pontosan hogyan van megoldva.

-------------
"Mérnökkel vitatkozni olyan, mint disznóval birkózni a sárban - kis idő múlva rájössz: Ő ezt élvezi..."

Minden ciklus elején elmegy a CPU aludni, de nem a gombnyomás, hanem egy időzítő ébresztgeti másodpercenként kb. 122-szer. (8 MHz az alapórajel, ezt egy előosztó osztja 256-tal, majd a Timer is még 256-tal.) "Ébredés" után vizsgálja a bemeneteket, majd az állapotgép alapján végrehajtja amit kell (legtöbbször egy számlálót csökkent az időzítéshez), majd kezdődik elölről az egész az alvással.

Gratula, szép projekt! A megvalósítás is külön szép! Mindig csodálattal adózom, hogy milyen szépen tudnak bánni néhányan a próbapanellal. Nekem sajnos nem megy, ezért megtanultam nyákot csinálni. Ehhez kapcsolódik az első avr projektem is. Csináltam egy uv levilágítót, egy régi szkenner átalakításával. Egy atmega 8 a lelke, egyszer majd talán csinálok róla leírást, ha lesz hozzá kedvem.

Az avr-libc linkért pedig külön köszönet, hasznos kis gyűjtemény.

Régen (még iskolás korban) én is rengeteg nyákot csináltam. Csőtoll (később alkoholos filc) + sok-sok festegetés, majd maratás. Külön öröm, amikor az egy napos festegetés után a komplett mintázatot lemarja a sav... :) Egy idő után "elegem lett" a történetből, sokáig nem is foglalkoztam ilyesmivel. Manapság sokkal egyszerűbb a helyzet: fotolakkal vagy még egyszerűbben, sima vasalással a "legjobban utált" része a dolognak lett a legegyszerűbb. Persze egy gond még így is maradt: a második "legjobban utált" feladat, a fúrás. Na, a fúrást a próbapanellal szinte teljesen el lehet felejteni. :)

Néha nekem is kedvem támad újra "nyákolni", de vegyszereim nincsenek hozzá. Amire meg beszerezném őket, oda a kedv. :)

A fúrást én is gyűlölöm, sajnos látszik is sokszor a végeredményen. Jelenleg azon kísérletezek, hogy milyen smd cuccokat van esélyem kézzel beforrasztani. Azzal meg lehet spórolni a fúrás nagy részét. :) Egy jó állvány sokat tud segíteni, de így sem egy leányálom.

Igen, ezen én is elgondolkodtam. Mármint az SMD-s alkatrészeken. Személy szerint a 0805-ös kondenzátorokat / ellenállásokat simán forrasztgatom (itt is látszik, vagyis nem látszik pár darab), ha a passzívokhoz nem kell fúrni, már az is nagy könnyebbítés. IC-k esetén a sima PLCC is megy, sőt csináltam már egyszer (egyik haverom segítségével) vasalásos technikával TQFP-t is. Ez utóbbinak 0.5 mm-es a lábtávolsága, azért ez már annak a technológiának erősen a határán van. :) A mezei SO tokok az sétagalopp. Úgyhogy ez nem lehet akadály. Viszont itt meg előjön az, hogy az egy oldalas nyák kevés lesz, két oldalhoz meg nincs furatgalván. Szóval kifogásom mindig akad. :)

Nicely done, Amigo!

Pár apró ötlet a V2-höz.
A kimeneti csatornákra mehet egy soros RC tag. Amit úgy érdemes megméretezni, hogy a használt vonali impedancián a törési frekvenciája 25kHz körül legyen. Ez agyoncsapja a váltási zajt.
A drive-ok táplábai közé a tok közelébe egy-egy 1uF-os kondi nem árt, mert a védődiódák akkor tudnak jól dolgozni, ha a relé kapcsolásakor meginduló induktív visszalövést kis impedancián keresztül tudják elfolyatni. Bár amire ezek tervezve lettek, ahhoz képest nem túl komoly igénybevételek ezek a relék.
A PWRC láb osztóját megfűszerezheted úgy is, hogy záróirányban sorba kötsz két schotkey diódát az AVR tápja és a föld közé. A 2-es lábról egy 4,7k körüli értékkel viszed a jelet a diódák közös pontjára és onnan az AVR 10-es lábára. Ez a megoldás biztosítja, hogy a bejövő jel szintjéről függetlenül 5,2 és -0,2V között lesz a vezérlőjel.
--
"Maradt még 2 kB-om. Teszek bele egy TCP-IP stacket és egy bootlogót. "

A váltási zajról jut eszembe, hogy az előző változathoz képest tulajdonképpen eltűnt. Igen jó ötletnek tűnik így utólag az, hogy bekapcsolásnál a GND-k előbb vannak összekapcsolva időben a jelnél, bontásnál meg fordítva.

A PWRCK osztójánál nem meséltem el mindent, de most megteszem. A jel magas szintje nem túl nagy, éppen csak annyira, hogy ne akarjam közvetlenül beleengedni a tokba. A gond inkább az, hogy amikor alacsony, akkor még mindig elég magasan van, az osztás azt segíti, hogy akkor már tutira alacsonynak lássa a mikrovezérlő. A csak magas szintet egy nem túl elegáns "jó nagy" soros ellenállással is el lehetne lőni, a határolást rábízva a µC lábán belül levő védődiódákra, de ez már igazán „dirty hack”. :)

A 2003-as kondenzátor hiánnyal viszont egyetértek, oda "elfért" volna, szívesen megnézném egy szkóppal, hogy mekkorákat rugdos a relé. "Mentségemre" szóljon, hogy a rajzról lemaradt egy 100nF, ami közvetlenül a relés panel csatlakozó táp-föld közé van beszerelve. Ezen a képen valamennyire talán még látszik is, a "drótos" oldalon a bal felső sarokban ott van a csatlakozó két lába között (szürke vezetékek).

Csak most volt időm elolvasni a bejegyzést, de betáraztam magamnak, mert tudtam, hogy érdekes lesz, és tényleg. :)

Nekem sokkapcsolós megoldásra az isostat rendszerű (vagy ahhoz hasonló) nyomógombok jutnak az eszembe, biztos gyártanak még ilyesmit, és az tud xor logikát is (igaz magadnak összerakni nem tudom mennyire esélyes). Bár tény, hogy a megoldásod jóval okosabb lehetett így. :)

Mi egyetemen egy laboron programoztunk AVR-t C-ben AVR Studioban, azzal egész olyan mintha nem is egy külső eszközön futna a program, ugyanúgy lehet debuggolni, csak a build lassabb. :)

Egyébként szeretnék egy mikrokontrolleres projektet csinálni, már az is megvan, mit szeretnék építeni. Csak az elektronikai tudás, az alapanyagok egy része és a lelkesedés hiányzik, de most megint kedvet kaptam hozzá, köszönöm! :)