neděle 27. března 2016

Displej s dotykovou vrstvou na různých mikrokontrolérech

Podražily OLED displeje, ale zlevnily TFT LCD, tak jsem si koupil další - krásně velký 2,8" s ILI9341 a dotykovou vrstvou, kterou čte XPT2046 (AliExpress):


Tento displej se připojuje k počítači sériově přes SPI, ovšem nenabízí jen jedno SPI rozhraní, ale rovnou tři!

První SPI je pro obrazová data, je na pinech na levé hraně, v dolní části. Druhé SPI rozhraní je pro dotykovou vrstvu a je taktéž na pinech vlevo, ale na horních pěti (označených TOUCH). A poslední SPI rozhraní je pro čtečku SD karet a je vyvedeno na obrázku vpravo (který jsem trošku moc ořízl, takže ty vývody nejsou vidět).

SPI sběrnice umožňuje připojit několik slave zařízení naráz, takže jsem logicky propojil SDI (MOSI) s T_DIN, SDO (MISO) s T_DO a SCK s T_CLK. A pak jsem to zkoušel rozjet na třech různých mikrokontrolérech: Arduinu, STM32F103 a ESP8266.

Ještě než napíšu jak jsem dopadl, musím zdůraznit, že displej je prodejcem inzerován jako "5V/3.3V", což může kvalitně zmást. Pravda je, že napájení (VCC) může být 3,3 nebo 5 V, protože zespodu displeje je lineární regulátor napětí nastavený na 3,0 V. Dokonce bych řekl, že je lepší, když je displej napájený 5 V, protože se mi choval stabilněji, ale možná se mi to jen zdálo (v nepájivém kontaktním poli často zlobí jednotlivé drátky a výsledky pokusů nejsou zrovna směroplatné). Pokud ho napájíme jen 3,3 V, ze kterých si ten regulátor uzobne 0,3 V pro sebe, tak pak displej může dostat i méně než 3 V a nepracuje se mu možná tak dobře. Na to jsou tam ostatně ty dvě pájecí plošky hned pod regulátorem, které můžeme páječkou jednoduše propojit, čímž regulátor vyřadíme z cesty a displej pak má plných 3,3 V.

Zároveň ten prodejcův příslib "5V/3.3V" neznamená, že kterákoliv ze tří SPI sběrnic je 5V tolerantní! Proto pokud připojujeme displej k 5V mikrokontroléru, jakým je například Arduino, musíme zařadit do SPI cesty "level shifter", měnič napěťových úrovní, jinak bychom mohli něco v displeji usmažit. Jako převodník poslouží například obvod CD4050E nebo některý z hotových prodávaných modulů osazených MOSFET tranzistory.

Mimochodem, podsvícení displeje (pin označený jako "LED") funguje stejně dobře na 3,3 V i na 5 V a nevidím tam ani rozdíl v úrovni podsvícení.

Ještě pár slov k použitým knihovnám. Přestože je komunikace s XPT2046 poměrně jednoduchá, neztrácel jsem čas psaním vlastní knihovny, a místo toho jsem si našel již hotová řešení (a pak ztrácel čas s nimi). První knihovnu pro své Teensy napsal Paul Stoffregen a je dostupná pod názvem XPT2046_Touchscreen na https://github.com/PaulStoffregen/XPT2046_Touchscreen. Druhá je od Spirose Papadimitrioua https://github.com/spapadim/XPT2046 a na rozdíl od první vyžaduje zapojení i pinu T_IRQ. Třetí je od Bodmera https://github.com/Bodmer/TFT_Touch/ a nepoužívá hardwarovou SPI sběrnici mikrokontroléru, takže může být připojena na kterékoliv piny a obslouží si je ručně. To jsem zprvu považoval za nevýhodu a knihovnu tak vyřadil z dalších testů, ovšem dnes už to vidím trošku jinak...

Jako grafickou knihovnu pro ILI9341 jsem použil velmi známou Adafruit_GFX se svým Adafruit_ILI9341 ovladačem. Adafruit podporuje už nejen Arduino, ale i ESP8266, takže se mi zdálo super, že použiju jednu knihovnu pro všechny tři mikrokontroléry.

Nyní už tedy jak jsem dopadl: první testy probíhaly na ESP8266. Tam XPT2046_Touchscreen nefungoval při testech vůbec. Ladicí hlášky ukazovaly, že vrací nesmyslně vysoké hodnoty tlaku (od 4 do 8 tisíc) a hodnoty polohy pochodovaly v cyklu v celém ADC rozsahu. Zkusil jsem tedy knihovnu XPT2046 a ta nefungovala taktéž, přestože podle pěkného článku na http://nailbuster.com/?page_id=341 fungovat měla. Asi se ty knihovny nějak nepohodly o právo komunikace na sběrnici, nebo jedna nastavila rychlost, které druhá nestačila nebo něco podobného. Nakonec pomohlo vyměnit grafickou knihovnu od Adafruitu za upravenou verzi zvanou "Adafruit_ILI9341esp" (která je ke stažení na výše uvedeném článku) a pak se vše perfektně rozběhlo. Bohužel jsem nebyl sto na první pohled poznat, co je v té "ILI9341esp" verzi změněno tak, že XPT2046 už s ní nekoliduje (neboť tam bylo příliš mnoho rozdílů), ale neměl jsem dost času, tak jsem to přestal řešit a smířil se s tím, že stačí použít "esp" verzi grafické knihovny a dotyková vrstva funguje (resp. ta daná knihovna pak správně komunikuje).

Další testy proběhly na ARMu STM32F103 - resp. na Maple Mini. Použil jsem "plugin" z www.stm32duino.com, který se "zasune" do Arduino IDE 1.6.x. Díky tomu mi přijela i opět jaksi upravená knihovna Arduino_ILI9341_STM, kterou jsem zkusil a fungovala výborně (asi 20x rychleji než na Arduinu nebo ESP8266). K ní jsem zkusil přidat obě výše zmíněné XPT2046 knihovny, ale dle očekávání žádná nefungovala. Pro sdílení SPI mezi dvěma různými zařízeními jsou totiž potřeba SPI transakce, které ale moje (starší?) verze STM32 "pluginu" pro Arduino IDE nepodporovala. Takže konec, žádné dotyky. Ovšem teď zpětně si říkám, že jsem měl použít tu knihovnu od Bodmera a jednoduše připojit TOUCH piny k některým z 30 volných pinů STM32F103...

Poslední na řadu přišlo Arduino Pro Mini: knihovna XPT2046_Touchscreen fungovala ihned, ale vracela hodnoty otočené o 90 stupňů, nebo prostě prohozené osy X a Y. Chvíli mě to bavilo, ale pak jsem raději přešel na knihovnu XPT2046, která se mi osvědčila na ESP8266. Tady ovšem nefungovala a ještě navíc rozbila kreslení obrazu. Asi se ty dva čipy porvaly o SPI sběrnici jako na ESP8266.

O správném připojení a ovládání více zařízení na jedné SPI sběrnici napsal pěkný článek výše už zmíněný Paul - http://www.dorkbotpdx.org/blog/paul/better_spi_bus_design_in_3_steps. Zkusil jsem upravit knihovnu XPT2046 podle jeho rad: nejdřív jsem do ní přidal podporu transakcí, a když to nestačilo, tak jsem ještě korektně předinicializoval obě CS linky, jak Paul doporučuje.

Přesto příklad kreslicí aplikace XPTPaint (v "examples" u XPT2046) pořád nefungoval, než jsem s úžasem zjistil, že v jedné ose vrací knihovna hodnoty od 0 do 20 a pak naráz skáče až na 56738 a až ke druhé straně obrazovky drží tento nesmyslný ofset (který nevím, kde se bere). Z nedostatku času jsem to vyřešil následujícím hackem (přidáním jednoho řádku do aplikace XPTPaint):

   touch.getPosition(x, y);
   if (x > 56730) x -= 56710; // WTF!?

Od té chvíle fungovalo na Arduinu s Adafruit_ILI9341 a XPT2046 vše v pořádku a mohl jsem nehtem malovat jak na malířském plátně.

Měl bych teď, po správné implementaci transakcí do XPT2046, ji znovu zkusit na ESP8266 s jinými ILI9341 knihovnami, ale nevím, kdy se k tomu dostanu. Taktéž bych měl zjistit, kde se na Arduinu bere ten nesmyslný ofset (možná přeteče nějaká proměnná?). A také bych měl zkusit pohledat na stm32duino.com, jestli už nemají SPI s transakcemi. Hmmm, napíšu, jestli se k něčemu z toho někdy dostanu.

sobota 19. března 2016

Tablet KB901 - smrt a rozborka

Kamarád Marek mi daroval tablet - krásný 9,2" neznačkový (nikde žádný nápis), že prý už je moc pomalý a ať si ho rozdělám a vezmu si z něj třeba displej. To mi přesně káplo do noty, protože se pídím po pořádném displeji pro Arduino/STM32/ESP8266, takže jsem tablet vzal a přinesl domů.

Tablet kupodivu normálně fungoval, i když opravdu pomalu. Běžel v něm Android 4.2.2 a byla předinstalována řada běžných aplikací. Nainstaloval jsem na něj Elixir2, abych zjistil, že zde nejsou žádné zajímavé senzory. Pak jsem nainstaloval Google Chrome a pustil můj oblíbený Peacekeeper web benchmark, ve kterém tablet dosáhl neuvěřitelně nízkého skóre 161 bodů (při splnění pouhých 2 HTML5 testů ze sedmi). To je asi 3x pomalejší než Raspberry Pi, nepletu-li se. Tak pomalý by gigahertzový procesor být neměl - něco tu musí být špatně.

Každého by napadlo, že v pozadí běží zpomalující aplikace, ale ne, žádné tam nebyly. Tak jsem se rozhodl pro rootnutí, že třeba nad tabletem získám lepší kontrolu a na něco přijdu. Po připojení k počítači jsem zjistil, že tablet si říká KB901 a že se ještě nedávno prodával za více než 100 amerických dolarů, tedy u nás tipuji na 3000+ Kč. Je v něm procesor AllWinner A13 běžící na 1 GHz, 512 MB RAM, a více než 9" displej má rozlišení pouhých 800x480 bodů. Ale jak se říká, darovanému koni na zuby nehleď. Navíc, 800x480 by pro Arduino/STM/ESP bylo úplně dostačující rozlišení.

Zde trocha dalších informací přímo z adb shellu:

root@android:/ # cat /proc/cpuinfo                                             
Processor : ARMv7 Processor rev 2 (v7l)
BogoMIPS : 1001.88
Features : swp half thumb fastmult vfp edsp neon vfpv3 
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x3
CPU part : 0xc08
CPU revision : 2

Hardware : sun5i
Revision : a13b
Serial : 060365103731303050564b371625420e

root@android:/ # cat /proc/partitions                                          
major minor  #blocks  name

  93        0      16384 nanda
  93        8      16384 nandb
  93       16      32768 nandc
  93       24     786432 nandd
  93       32    1048576 nande
  93       40      16384 nandf
  93       48      32768 nandg
  93       56     327680 nandh
  93       64     262144 nandi
  93       72    5177344 nandj

Před rootováním mě napadlo nainstalovat CWM. Stáhl jsem si verzi 6.0.28 z XDA a našel dokonce i řadu nějak upravených ROM na ruské adrese. Instalace CWM nebyla úplně přímočará, protože tablet má několik zajímavých vlastností - například nejde zapnout, pokud je vložena SD karta. Také nejde zapnout při držení Volume+, což by mi mělo umožnit nainstalovat ZIP z SD karty. Nakonec jsem tam ručně rozbalený CWM dostal přes adb shell a taktéž ručně nainstaloval. Pak jsem musel ručně rebootovat do CWM a když jsem v něm konečně byl, ze samé euforie jsem dal "wipe cache" a "wipe data". A navrch nainstaloval SuperSU ze ZIPu.

A to jsem asi neměl dělat. Od té doby jsem už normální start neviděl. CWM začal hlásit, že nejde přimountovat žádný oddíl. Když jsem se z toho konečně vzpamatoval a zkontroloval cat /proc/partitions, zjistil jsem, že kernel z původních 10 oddílů nevidí ani jeden. V /dev/block bylo taky docela pusto. Napadlo mě podívat se na výstup dmesg, kterému vévodily stovky řádků následujícího znění:


[    2.728136] PHY_PageReadSpare : too much ecc err,bank 0 block 7,page 0 
[    9.875478] [FORMAT_ERR] There is not enough valid block for using!
[    9.881758] [FORMAT_ERR] There is not enough free blocks for distribute!
[    9.888469] [FORMAT_ERR] Format nand disk failed!
[    9.893184] [NAND]init_blklayer fail 

Pochopil jsem, že tady mi už pšenka nepokvete. Nevím tedy, jestli jsem zavinil smrt nějakým chybným krokem já, nebo jestli tento CWM nebyl to pravé ořechové, nebo jestli jsem se přesně trefil do momentu, kdy se vnitřní eMMC paměť definitivně odporoučela do křemíkového nebe, ale výsledek byl každopádně takový, že Android už nešel nastartovat. Neumím ho ani obnovit, když v /dev/block/ nejsou žádné diskové oddíly, na které by případně šlo nahrát některý z těch ruských firmwarů.

Rozloučil jsem se s ním a vzal do ruky šroubovák. Po chvíli jsem se dostal dovnitř:


Zajímavé, jak je všechno maličké - vlastně zhruba stejně velké, jako Orange Pi Plus. Procesor má na sobě nálepku o výstupní kontrole v prosinci 2013, takže tablet byl nejspíš ještě v české dvouleté záruce. To je docela tristní, že tabletu ještě v záruce odejde paměť - ten čip s ručně napsanou čínskou osmičkou. Zajímavé je, že nad ním je místo na další čip, takže tablet mohl mít i 16 GB vnitřní paměti. Teď kdybych byl frajer, koupím si někde stejnou paměť a normálně ji přepájím.

Místo toho jsem pokračoval v rozborce. Protože tablet nešel vypnout, musel jsem jako první odpájet čerstvě plně nabitou baterii:


Byla přilepena k zádům displeje nějakým hnusně smrdícím asfaltem, takže jsem ji musel vyhodit z domu. Ráno ji zkusím odbalit, asfalt zahodit a použít ji v nějakém Arduino projektu - 6500 čínských mAh se může hodit!

Na desce je ještě zajímavý WiFi modul vpravo dole - je samostatný, připájený shora na plošný spoj tabletu jen čtyřmi body (nepočítaje 2 body dole pro externí anténu). Zřejmě je připojen na vnitřní USB. Vtipná je anténa - drát vedle doprostřed displeje, kde je nalisovaná anténečka na takovém tom pružném "plošném spoji", který je přilepený na plechová záda displeje! To se už nedivím, že recenzenti psali, že už jedna zeď od WiFi routeru způsobuje problémy s příjmem.

Vlevo od něj je zřejmě řadič displeje - GSL 3680. Tento by chtělo nějak osamostatnit a připojit i s displejem k nějakému mému projektu. Ještě dál vlevo je napájecí (a nabíjecí) část se známým AXP209, nad ní slot na mikroSD kartu, nad ní vlevo od procesoru jsou RAM čipy a pak už jen vlevo nahoře dvě kamerky s trapným VGA rozlišením.

Úplně vpravo nahoře na tom výběžku plošného spoje je zřejmě část starající se o podsvícení displeje a na samém chvostu pak zvukový modul, jehož výstup je drátky spojen s maličkým reproduktorem, který se chytře drží zad displeje svým magnetem.

A to je konec. Displej samostatně zapojit neumím, eMMC paměť měnit nebudu - jediná možnost jak tablet oživit by byla naučit ho žít jen s SD kartou a na vnitřní paměť zapomenout. Ale nemá to smysl, když už mám krásný nový tablet. Takže sbohem a snad půjde použít aspoň ta baterie...

EDIT: našel jsem blog, kde se někdo povrtal v jiném tabletu, jehož vnitřnosti jsou velmi podobné. Dobře popsal jednotlivé broučky, tak to sem nalinkuji.

úterý 15. března 2016

Tablet UMAX VisionBook 7Q Plus

Koupil jsem si dnes tablet, abych mohl ladit aplikace, které programuji pro Android. Úmyslně jsem chtěl ten nejlevnější a nejobyčejnější tablet na trhu, aby se mi nestalo, že program odladím na "nabušeném dělu" a potom v praxi u zákazníka narazím na nějaké problémy (způsobené třeba velikostí paměti, pomalostí procesoru, malostí rozlišení atd.). Proto jsem zadal na několika e-shopech "seřadit tablety od nejlevnějšího" a vybral první, který splňoval mé klíčové požadavky: IPS displej, 1 GB RAM a Bluetooth: vyhrál to UMAX VisionBook 7Q Plus za 1690 Kč.
První dojem po rozbalení: tablet je srandovně maličký - jen o málo větší než můj mobil. Je i tenký a lehký. Překvapením je náhradní modrý zadní kryt - asi pro lidi, kterým se celobílé provedení moc nelíbí.

Skvělé je, že kromě dobrého displeje a dostatečné velikosti RAM jsem získal ještě čtyřjádrový 64bitový procesor MT8163 s ARM Cortex-A53 architekturou běžící až na 1300 MHz a grafiku Mali-T720 s podporou OpenGL ES 3.1. Android je tu Lollipop verze 5.1, což je taky paráda (mnoho prodejců bez uzardění pořád prodává zařízení s Androidem 4.x). Rozlišení 1024x600 v 7" neurazí ani nenadchne. Potěší řada senzorů (zrychlení, gravitace, magnetického pole, orientace, rotace), je tu gyroskop a především přijímač GPS, který v levnějších tabletech vůbec nebývá. Kamery 2Mpix/0,3Mpix (zadní/přední) odpovídají ceně tabletu a fotit s nimi nic nebudu. Výborný je ale miniHDMI výstup. USB je OTG: připojená fleška, myš i klávesnice fungovaly skvěle. USB zásuvka je zároveň vstupem pro externí zdroj, takže není potřeba ssebou tahat speciální nabíječku, stačí cokoliv s mikroUSB výstupem (třeba v autě). Slot na mikroSD kartu je tu také, co víc si přát?

Hned po rozbalení jsem tablet podrobil rychlostním testům. AnTuTu benchmark je etalon, použil jsem tedy jej (ve verzi 6.0.1). Celkové skóre je 29111 bodů: 3D test měl 2352 bodů, User eXperience 12035 bodů, výkon CPU 10798 bodů a rychlost RAM 3926 bodů. AnTuTu HTML Test, který jsem omylem pustil samostatně, ukázal 17264 bodů. Pravda, náročné AnTuTu testy 3D grafiky dost pokulhávaly - ukazovaly těsně nad 1 FPS. V praxi by to chtělo zkusit některou ze starších 3D her, měly by díky Mali-T720 jet pěkně (mám koupený Asphalt 6, tak příležitostně zkusím). Při běžném používání je tablet zcela plynulý a reaguje okamžitě.

Zajímavé jsou předinstalované aplikace: OneDrive, Word, Excel a PowerPoint jsem v androidím tabletu opravdu nečekal! Ovšem řadový uživatel přicházející z MS Windows musí být šťastný jak blecha. Dále potěší ES File Explorer (standardní Android přijde bez správce souborů a uživatel tápe) a nakonec je tu i iVysílání, které k mému překvapení normálně funguje a přehrává pořady z archivu ČT (pokud nesáhneme na posuvník v čase pořadu, to už se pak nerozběhne). Samozřejmě je tu kompletní sestava aplikací od Google. Navíc najdeme ještě MX Player, FM Rádio (wow, takže tablet má i rádio!). Boží třešničkou na dortu je plovoucí aplikace (vznáší se nad čímkoliv spuštěným) zobrazující aktuální vytížení každého ze čtyř jader CPU.

Z výše popsaného mám pocit, že tablet je na svou cenu velmi dobře vybavený jak po HW stránce, tak i programově. Podle mého názoru je ihned po vybalení plně použitelný pro kancelářskou práci i multimediální zábavu. Jdu zkusit pustit na něm mé vlastní aplikace :-)

EDIT: doplněno o pár dní později
Ukázalo se, že tento super levný prcek má kromě všech super vlastností zmíněných výše ještě jednu naprosto zásadní - umí 802.11ac, tedy WiFi v pásmu 5 GHz! Tím se morálně posouvá o další level výše a je přímo předurčen do husté bytové zástavby, kde už pásmo 2,4 GHz skomírá a jedinou možností bezdrátového Internetu je přejít na 5 GHz, což dneska ještě málokteré zařízení podporuje.

Ještě zmíním výsledky v testu Peacekeeper - 609 bodů celkem (při třech HTML5 testech ze sedmi). Podrobné výsledky: Rendering 34,4 bodů, webglSphere 57 FPS, HTML5 Canvas 7 bodů, Data 8100 bodů, DOM operace 2254 bodů a Text parsing 19276 bodů.
Pro porovnání Nexus 5 s 2,26 GHz CPU - 678 bodů (a taky jen 3 HTML5 testy ze sedmi). Podrobné výsledky: Rendering 28 bodů, webglSphere 57,6 FPS, HTML5 Canvas 5,7 bodů, Data 11113 bodů, DOM operace 2524 bodů a Text parsing 31925 bodů. Samozřejmě identický browser (Chrome 49). Závěr - tablet je nečekaně rychlý a šlape na paty 5x dražším zařízením!