2024. április 19., péntek

Gyorskeresés

Építsünk mobiltelefont - I. rész

Írta: | Kulcsszavak: mobil . mobiltelefon . DIY . SIM . phone

[ ÚJ BEJEGYZÉS ]

Az elején leszögezem, hogy lehet nem lesz II. rész, mert mostanában elég kevés az időm a kislányom miatt.

Mivel az ötlet már régóta érik, de mostanában sürgetőbb lett, így gondoltam leírom magamnak is, hogy ne kelljen mindig újragondolni. Onnan ered a dolog, hogy a nagymamám már 80+ és sajnos egyre nehezebben látja a telefon kijelzőjén a szöveget. Valószínűleg összefüggésben lehet ez a hályoggal és a cukorbetegséggel is. Sajnos COVID alatt a hályogot nem tudják neki eltávolítani.
Van neki most egy ilyen Maxcom MM428. A gombokat látja, de a kijelzőn a szöveget nem mindig.

Ennek a készüléknek 1,8"-os kijelzője van.

Innen indul a prokejt. Ezek lesznek a főbb igények:

- A kijelző legyen minél nagyobb és kontrasztosabb.
Gondoltam monokróm LCD-re is, de jellemzően kisebbek vagy/és macerás a meghajtásuk. Jó esetben SPI, rossz esetben valamilyen párhuzamos meghajtást igényelnek. Van nekem itthon többféle 0,9-1,54"-ig bezárólag OLED kijelzőm. Sőt, van egy 3" méretű is, de azt sajnos csak párhuzamosan lehet meghajtani. Az összes többi I2C (IIC) vagy SPI. Úgy döntöttem, hogy az OLED a magas fényerő, a jó kontraszt miatt jó irány lesz, főleg ha találok egy nagyobb példányt I2C protokollal.

Találtam. 2,42", SSD1309-es libbel meghajtható (erről később bővebben), ami jól jön mert itthon az egyik másfeles OLED kijelzőm is ilyen, így amíg ez megérkezik, addig is tudom csinálni a GUI-t.

Azért fontos az I2C protokoll, mert arduino alapokon fog készülni a történet és az atmega 328-nak viszonylag kevés GPIO-ja van. Ha jól emlékszem, szám szerint pontosan 20. Itt jön a másik fontos rész:

-elosztani a rendelkezésre álló GPIO portokat úgy, hogy elég legyen.

Billentyűzet:

Van 8 analóg és 14 digitális PIN. Értelemszerűen az analógot A0-A7-ig jelöljük, a digitálisokat D0-D13-ig.
A lábkiosztással az lesz a gond, hogy ha akarok numpad-et (márpedig akarok), akkor csak a számok és a *, # igényelnek 12 inputot de ha ehhez még hozzávesszük a hívásindító, hívásmegszakító és 2 nyíl gombot akkor már 16-nál tartunk.

Billentyűzet lezárását először külön gombbal terveztem, mint pl. ami van a Nokia E6 oldalán is, egy rugós csúsztatható gomb az oldalán. Egyszerű, de nagyszerű. Viszont nincs kedvem szórakozni vele, mert nem igazán találtam a célnak megfelelő gombot + az egész keret, tok, borítás külön fejezet lesz mert meg kell tervezzem úgy, hogy 3D nyomtatóval ki is tudjam nyomtatni de azért használható is legyen.

Szóval a lezárást valószínűleg úgy fogom megoldani, hogy a piros gombot hosszabban nyomva a készülék zárol.
Ki/bekapcsolásra dedikált gomb lesz valahol.
Feloldás a zöld gomb és utána mondjuk a * gombbal, hasonlóan a régebbi nokiákhoz.
Hangerő állítás hívás közben lehetséges a fel/le nyilakkal.
Kihangosítón még gondolkodom, majd meglátjuk hogy sikerül kivitelezni.
DTMF kódokat is jó lenne implementálni, hogy hívás közben telefonos menükben lehessen lépkedni.
Csengetés valószínűleg a rendes hangszórón fog történni. Remélem jó hangos lesz. Ha nem jön össze az általam megrendelt összetevőkkel, akkor kap egy sima buzzer csipogót, aminek egy digitális lábat fent kell tartani.
Csengőhangerő állítása kizárólag menüből lesz elérhető. (Egyszerű csengőhang lesz, nincs kedvem ilyenekkel szórakozni szerintem + korlátos a tárhely) de majd meglátjuk.
Apropó, tárhely... telefonkönyvet, sms-eket és esetlegesen csengőhangokat tárolni kell valahol. Szerintem erre a SoC EEPROM-ja nem lesz alkalmas. Van neki 32KB Flash, ahova a programkód kerül... ez nem tudom mennyire lesz használható, de talán a csengőhang(ok) még itt is elférhetnek.
Viszont az EEPROM 2KB, ami ha max. 32 karakteres nevekkel számolunk és csak angol abc + 16 karakteres telefonszámmal, akkor (elvileg 1 karakter 1 bájt) egy bejegyzés 48 bájt. Összesen 42 bejegyzés. Nem sok.

És akkor az sms-eket még nem tároltam sehol. Igaz, hogy mind a telefonszámokat, mind pedig az sms-eket korlátozottan ugyan de tárolgatjuk sim kártyán is. Ezt a lehetőséget is végiggondolom vagy B opciónak marad egy lehetőleg szintén I2C buszos külső EEPROM.

A billentyűzet sok gombja miatt rendeltem egy 16 csatornás multiplexert , amiről pontosan még nem tudom hogyan működik. Eddigi infóim alapján 4 vagy 5 IO port kell neki. Valószínűleg egyébként nem fogom használni, hanem építek az áramköri lapra egyet magamnak. +3.3V a bemenő és leosztom 5 felé feszültségosztóval valahogy arányosan megpróbálom elosztani őket és erre merőlegesen kötök 4 analóg portot, így lényegében lesz egy 5x4-es mátrixom, amiből 20 gombot ki lehet hozni. Elméletileg megvalósítható lenne vele az egyszerre több gomb érzékelése is, de ezzel nem fogok foglalkozni. Lényege annyi, hogy ha megnyomok egy gombot, akkor az a 4 analóg port valamelyikén meg fog jelenni egy adott feszültséggértékkel, ami alapján a szoftver tudni fogja, hogy melyik gombot nyomtam meg.

Mostani terv szerint a feszültségosztó úgy fog kinézni, hogy sorba kapcsolva 5db 1k ellenállás, melyeken így egyformán 0,66 V feszültséget lehet majd mérni, ezeket szépen összeadom a mátrixban szóval ha pl. az első sor első gombját nyomom, akkor A0= 0,66V. Ha az első sor másodikát akkor A0= 1,32V. Ha a második sor első gombját nyomom, akkor A1 = 0,66V. Ha a harmadik sor harmadik gombját, akkor A3 = 1,98V és így tovább.

Azért is választottam az 1k ellenállást, mert így az áramkorláttól sem kell tartani, mivel az atmega328p lábain maximum 20mA folyhat. A gombokkal így legkevesebb 0,7mA és legtöbb 3,3mA áram fog folyni de lehet, hogy ezt még megszorzom egy tizessel és 10k ellenállást használok majd inkább.
Ezt most így könnyű volt leírni, viszont később össze kell raknom a próbapanelen és ha jó, akkor áramkör tervezőbe be, majd prototípus.

Értem én, hogy gőzgép de mi haaajtja!???

Oké, de még mindig nem jutottunk el addig, hogy mégis egy atmegával hogy fogunk telefonálni. Hova teszem a SIM kártyát?

Ide.

A SIM800L egy igen jól integrálható modul, viszonylag alacsony fogyasztással.
Van egy SIM900-as modulom, régebben azzal sokat kísérleteztem.
Elméletileg 2G-t tud meg talán UMTS-t is, de azzal annyira nem foglalkoztam mert nem lényeg. Tudja a GPRS-t meg az EDGE-t multiplexelve stb, stb.. de nem lesz rá szerintem szükség, kivéve ha a hálózati időszinkronizációhoz nem szükséges. Merthogy a chipnek van RTC-je, így a pontos időt elméletileg mindaddig tudja, amíg feszültség alatt marad. Hogy ez pontosan mit takar, még nem tudom. Ki kell deríteni, hogy a SIM800 maradhat-e közvetlen tápon folyamatosan áram alatt (értelemszerűen ez csak akkor lehetséges, ha készenléti módban uA alatti az áramfelvétele) vagy kell elé valamiféle soft vagy hard relé, esetleg tranzisztor, FET vagy valami amivel kapcsolni tudom. Valószínűleg egyébként utóbbi lesz.

Ha viszont az áramnál tartunk, akkor kelleni fog egy töltő elektronika. A TP4056-al eddigi tapasztalataim alapján elégedett voltam. Most rendeltem egy Type-C csatlakozós modult, hogy a mami bármilyen irányba bedughassa a szabány usb kábelt a szabvány usb töltőfejbe.

Akku gyanánt egy ilyet dobtam a kosárba. Elméletileg elegendő lesz és talán el is fogok férni.

Ahhoz, hogy legyen hang, minden valószínűség szerint kelleni fog hangszóró :DDD
Na meg erősítő, mert szerintem a SIM800-on keresztül a hangerőt nem fogom tudni szabályozni szoftveresen bár, még nem néztem ennek utána.
Mindenesetre rendeltem kétféle erősítőt. Egy ilyet és egy ilyet.

Előbbit azért, mert nagyon egyszerű és viszonylag könnyű átültetni a nyákra, az utóbbit meg azért, mert van rajta potméter (bár nem tudom az értékeit csak tippeltem). A potival fogom állítani a hangerőt. Eleinte arra is gondoltam, hogy legyen a hangerőállítás teljesen manulális egy tekerővel a készülék oldalán, amolyan sokol rádiósan de akkor a kihangosítót nem tudnám megoldani hacsak nem kötöm a potmétert analóg bemenetre, majd a kimenetet digitálisan vezérelve egy szintig elengedem a hangerőt és gombnyomásra pedig aktiválom a további részt kihangosító gyanánt. Valószínűleg ez lesz egyébként. Ha szerencsém van, akkor az első áramkörön az egyik ellenállást potival helyettesítve megoldható lesz a dolog.
Viszont a potmétert, mint azt az előbb írtam, nem direkt kötném az áramkörre hanem csak egy plusz analóg bemenetként a mikrokontrollerre. Az erősítő áramkörére pedig egy digitális potmétert kötök, ami szintén I2C buszon vezérelhető.

Hangszóró gyanánt bedobtam kétfélét, valamelyik csak jó lesz alapon. 1, 2.
A második annyiból jobb talán, hogy laposabb, így könnyebb lesz elférni.

Mikrofonként terv szerint ez fog szolgálni.

Hogy miért erőltetem annyira azt az I2C buszt?
Azért, mert a rajta lévő maximum 127 eszköz (ha jól emlékszem) mindegyike egyedi címmel rendelkezik és amelyiket megszólítja a kontroller, azzal kommunikál. Simán csak párhuzamosan fel vannak fűzve a sínre, így akár a 127 eszköznek is elég 2 pin. Hasonlóan az ethernet buszhoz. Az SPI-nek ezzel szemben az a hátránya, hogy ha egynél több eszközt akarok használni a buszon, akkor mindenkinek kell egy chipselect vagy enable pin, ami addig 1 amíg az adott eszközzel kommunikálunk, utána 0. Így ha mondjuk 5 eszközöm lógna az spi buszon, akkor már 5 pin foglalt, nem beszélve arról, hogy az spi-nek egy irányban kettő, oda-vissza irányban már 3 pin igénye van (MISO, MOSI, clock). Bár az SPI esetén létezik daisy chain konfiguráció, ebbe nem mélyedtem bele és nincs róla információm, hogy minden eszköz támogatja-e illetve mik a feltételei mert ha univerzálisan működik, akkor akár az I2C helyett alkalmazható is.

Az akku töltése megoldott lesz a célhardverrel, amit szerintem hagyok függetlenül a main boardtól a későbbi könnyebb javíthatóság érdekében (már ha lesz helyem a házban). A töltés érzékelése szerintem egyszerűen egy D pinen keresztül fog menni, mert a chip jelzi ezt egy leddel amit szerintem meg is hagyok, mert akkor függetlenül a készülék ki vagy bekapcsolt állapotától, látható a töltés állapota is. Az akku töltöttségét pedig elméletileg le lehet kérdezni a SIM800L-től, így nem kell vele külön foglalkozni.

Legfontosabb: a zseblámpa :) Kapni fog egy erősebb LED-et egy tranyóval + előtét ellenállás, vezérlés gyanánt egy analóg vagy digitális pin, ami marad (tökmind1) amit egy dedikált, de szoftveres gombbal (szintén egy A vagy D pin) fogok tudni vezérelni és erről akár visszajelzést is csinálhatunk a kijelzőre.

Mivel arduino esetén nem annyira nyilvánvaló dolog az objektumorientált programozás emiatt aztán én sem vagyok benne nagyon zseni, mert egyébként nem igazán volt rá szükségem eddigi életem során, így valószínűleg végig strukturált programozási módszert fogok alkalmazni. Objektumokat létrehozni és törölni egyébként sem célszerű de talán nem is lehetséges arduinoval, mert ilyen alacsony szinten a memóriatöredezettség elég gyorsan váratlan anomáliákhoz vezethet szóval törekedni kell a lehető legkevesebb adat memóriában tartására, ami pedig van, azoknak a helyet lehetőleg végig tartsuk fenn. Fentiek alapján lehetőleg kerülendők a vektorok vagy a megszámlálhatatlan darabszámú tömbök, stb...

Leginkább az ékezetes karakterekre és az sms-ekre, azon belül is főleg az sms/telefonkönyv vagy bármilyen szöveg bevitelére leszek kíváncsi. De a menükben való lépkedést is próbálom majd leegyszerűsíteni mert nem nagyon lesz időm szórakozni vele, szóval lesznek kompromisszumok.
Megpróbálom használhatóra csinálni, de kényelmesre, szépre nem hiszem, hogy lesz idő :)

Ja, igen, a SIM800L-ről még annyit, hogy simán serial kommunikáció van a mikrokontroller és közte, így 2 pin szükséges neki. Megpróbálom software serialra rakni, ha marad +2 gpio-m, mert akkor a hardware serialt a későbbiek során használhatom debugra.
Ha már debug, akkor hagyok +3.3V, GND, RX, TX pineket valahol az alaplapon a későbbi debuggolás miatt de valószínűleg az ICSP-t is kivezetem, mert azon keresztül később akár forrasztás nélkül is flashelhető az eszköz.

Eddigi tervezett lábkiosztás:

A0 - A3: 20 gomb a billentyűzeten: 0-9,*.#,zöld gomb, piros gomb, fel,le, zseblámpa.
A4-A5: Sda, SCL (I2C lábak)... flash, kijelző, digital potmeter, stb...
D2 lesz a power gomb, ezzel együtt pedig a sleep interrupt pin is.

Kiegészítés: itt jöttem rá, hogy csak 6 analóg portom van, ami nem lesz elég ha analóg potméteres hangerőszabályzást akarok, szóval át kell rakni a gombokat digitális + analóg vonalra.
Annyiban fog változni a történet, hogy a +5V-ot a feszültségosztón keresztül bekötöm az A0-ba, a leágazások ugyanúgy mennek csak 4 digitális PIN-re és ha valamelyik PIN inputot érzékel, akkor az analóggal megmérjük a feszültségszintet és így tudni fogjuk abban a sorban hányadik gomb.

Szóval a lábkiosztás újra :)

A0: gombsorhoz
A1-A3: SZABAD
A4-A5: SDA, SCL (I2C lábak)... flash, kijelző, digital potmeter, stb...
D0: RX (hardveres)
D1: TX (hardveres)
D2: sleep interrupt key, ez lesz a bekapcsoló gomb + valószínűleg a képernyőt is ezzel fogom kikapcsolni.
D3: RX1 (szoftveres)
D4: TX1 (szoftveres)
D5: Mivel PWM-es, így billentyűzet háttérvilágításra tökéletes lesz
D6: SZABAD (PWM)
D7: fenntartom arra a célra, ha esetleg kellene egy "mini tápegységet csinálni", a perifiriáknak, modulokanak tápot adni de leginkább elvenni kikapcsolás után - bár így a SIM800 modulban lévő RTC nem tudom hogy fog működni. Lehet, hogy kelleni fog külön RTC modul vagy meg kell oldanom az automatikus időszinronizálást minden egyes bekapcsolásnál. Meglátjuk.
D8: Töltés érzékelés
D9: SZABAD (PWM)
D10-13: SPI, ICSP

Egyelőre ennyi. Rakom össze a próbapanelt, összeszedem a szükséges könyvtárakat, tesztelgetek és elkezdek a GUI-val kísérletezni.

GUI-ról annyit így elöljáróban, hogy lesz egy állandó rész, az állapotsáv, ahova kiírom a térerősséget, akku töltöttséget, nem fogadott hívást, olvasatlan üzeneteket illetve ha megtelt a telefonkönyv/sms tárhely. Ha kifér valamennyire akkor esetleg még a szolgáltató nevét de az valószínűleg inkább a záróképernyőre vagy/és főképernyőre kerül.
Az óra és dátum valószínűleg szintén a kezdőképernyőn fog helyet kapni jó nagyban, alá esetleg kisebb betűkkel a szolgáltató nevét.

fel/le nyilakkal terv szerint azonnal a menübe lépünk, piros gomb mindig a törlés, mégse, vissza funkciókat látja el, a zöld pedig az OK-ot ha nem épp hívásban vagyunk. Zöld gombbal a kezdőképernyőről a tárcsázóba vagy telefonkönyvbe lépünk, pirossal ki, hívásmegszakítás, elutasítás, stb..

Zárolt képernyő esetén csak bekapcsolt kijelzővel fogom tudni megoldani, hogy a 112-t és a 911-et feloldás nélkül is lehessen hívni de ez a mai okostelefonoknál is így van, mert kikapcsolt kijelzővel nincs is gombsorod.

Folytatjuk... talán :)

Hozzászólások

(#1) Oldman2


Oldman2
veterán

Figyelem a projektet élénk figyelemmel!
:C

Köszi.
:R

(#2) Gdi


Gdi
senior tag

Na a legkönnyebb részén már túl vagy :)
Remélem lesz is belőle valami. Megnézném a végkifejletet.
Nagyiteló vásárlásnál én is nézem, hogy akik tervezték a manapság kapható modelleket, azok mégis hogy gondolták át a kreálmányukat?

''Milliárdnyi meggyilkolt csillag sikolya elhal az éj békéjében, és a kétségbeesésnek csak néhány, törékeny, kőbevésett szó áll ellen.''

(#3) Adamyno válasza Gdi (#2) üzenetére


Adamyno
tag

Egyszer csináltam már hasonlót, hívásokat lehetett vele indítani és fogadni de nem fejeztem be csak érdekességképpen kísérleteztem vele. Talán még a forráskódja is megvan de ez nulláról megy mert használni szeretném.

- Indítsd újra a gépedet! - Az egészet? - Nem, a felét...

(#4) Bambuszpro


Bambuszpro
tag

Érdekesnek tűnik. Remélem lesz folytatása. :)

Manapság az okos telefonok és az ostoba emberek korát éljük.

(#5) Viktor S


Viktor S
csendes tag

Ha tovább akrasz spórolni a pinekkel, a led akár mehetne közvetlenül az aksiról egy kapcsolóval vezérelve.

További hozzászólások megtekintése...
Copyright © 2000-2024 PROHARDVER Informatikai Kft.