Diskuze: Rozdělení množiny bodů
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Tvůrce

Zobrazeno 23 zpráv z 23.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Nebyl by i trochu praktičtější popis, ze kterého by byla myšlenka
pochopitelnější?
Předpokládám - to se střídají červená a zelená (ne žlutá) LED, ne? Podle toho příkladu by výchozí barevný obrázek měl 7x9 bodů, červených LED 3x5 a zelených 4x4. Jas každé LED se vypočte z obrázku z bodů v matici např. 3x3 rozmístěných kolem místa souřadnice LED. Největší váhu má barva v místě LED, sousedící menší a uhlopříčné ještě menší (vychází se ze stejné barevné složky). Vzhledem k tomu že chybí modrá barva, započítává se s malým podílem i modrá složka - stačí když ostatní LED budou místo modré trochu svítit a mozek si modrou domyslí ze zkušeností (vidí modrou oblohu i když displej modrou vůbec nemá). Kvůli rychlosti je dobře aby se namísto dělení použila celočíselná rotace, na to je dobré zohlednit váhové koeficienty. Např.:
R11 = (r11*8 + (r01+r10+r21+r12)*4 + (r00+r20+r02+r22) + b11*4) >> 5
Není-li četnost LED stejná (např. se používají body 2xzelená, 1xčervená a 1xmodrá), pak se úměrně tomu pro četnější LED použije menší přepočtová matice (nemusí to být čtverec).
Barvy byly na obrázku jen pro znázornění, všechny diody mám červené a napojené na obvod s programovatelnou pamětí. Jde o to, že složitější obrázky nelze zobrazit celé, musí tam rychle problikávat ty podmnožiny (proto jich musí být co nejméně). Které diody mají svítit je vidět jen na prvním obrázku (bílá svítí, černá ne). Jde o to, že u většího počtu "obrázků" je docela složité je rozložit ručně (zvášť když jsou velké)
Tak snad někdo odpoví kdo pochopil, já jaksi pointu problému nepochopil. (přemapovat obraz s přeskakováním pozic by nebyl problém, to asi nebylo předmětem dotazu)
Na jednoduchém poli LED diod lze ovládat pouze sloupce a řádky. Tím pádem nelze zobrazit složitější obrázky, písmena... Já potřebuji tyhle obrázky rozložit na části, které zobrazit jdou.
Takže můžeš rozsvítit vždycky jen diody ve sloupci / řádku ?
EDIT: jo aha, napsal si to post předemnou. No tak pak si jen projedeš první v řádcích a zapamatuješ si souřadnice. To samé uděláš klidně i pro sloupce, porovnáš co je lepší(rychlejší ?) pro zobrazení a to použiješ.
Už jsem nestihl edit ... Ale pak nechápu jak můžeš zobrazit tu čtverečkovou síť v posledním obrázku.
Poslední obrázek se rozdělí na dvě části. Když zapneš každý druhý řádek a každý druhý sloupec dopadne to takhle:
0 1 0 1 0 1
1 . # . # . #
0 . . . . . .
1 . # . # . #
0 . . . . . .
1. # . # . #
https://dl.dropboxusercontent.com/…367/LED.html Tady je ukázka vytvoření písmene A na poli diod o rozměrech 3x5. První dva obrázky ukazují střídající se části "obrázku" a třetí ukazuje vzhled při vysoké rychlosti blikání.
Myslím si, že se jedná o sloupcový multiplexer. Jak psal Panda38 nic se neskupinkuje, pošle se signál postupně po jednom na všechny sloupce + odpovídající řádky. Na tomto principu fungovala jehličková tiskárna.
Já potřebuju těch částí co nejméně, u toho pole diod mám malou paměť, takže dávat to tam po jednotlivých bodech/čarách nemůžu.
Multiplexovaný displej používá matici LED organizovaných do řádků a
sloupců. Přepíná se vždy v každém okamžiku jen jeden sloupec
(nebo řádek) a v něm se zapnou příslušné LEDky = multiplex (tedy
cyklické přepínání sloupců). V tom případě je realizace jednoduchá,
nic není třeba skupinkovat. Skupinkování by Ti nic nepřineslo, naopak je
velmi nepraktické z hlediska svítivosti LED (tj. středního proudu jimi
tekoucího). Časování by bylo závislé na počtu skupin - v jedné chvíli
by trvale svítily všechny LED (např. kdyby se rozsvítilo vše, tj. jedna
skupina), jindy bys přepínal postupně všechny sloupce (šikmá čára,
která by nešla skupinkovat) a to by se projevilo na různé svítivosti. LEDky
jsou napájené určitým proudem - a ten proud bývá stanoven pro
multiplexovaný režim, kdy např. pro matici 5x7 svítí každá LED jen 1/7
času (proto je proud 7x větší než by byl ve statickém režimu). To
znamená - že při skupinkování by v jedné chvíli displej svítil příliš
jasně a v jiné téměř vůbec. Dokonce při malém počtu skupin bys LEDky
odpálil příliš velkým proudem. Proto zapomeň na skupinkování a
přepínej cyklicky po jednom.
Malá paměť nemůže být problém. Jestli nepoužíváš grafiku tak nepotřebuješ paměť pro grafický displej. Přerušení od časovače v každém kroku vezme znak z textové paměti, podívá se do ROM paměti generátoru znaků a odtud vezme jeden sloupeček LED diod. Při příštím přerušení vezme další sloupeček. Nepotřebuje žádnou zvláštní RAM.
Změny ve svítivosti jsou patrné jen u velkých počtů diod. A spálit se nemohou díky ochranným odporům. Do paměti, kterou v tom obvodu mám nastavuji jednotlivé kroky (při zobrazování po jednom je to krok za každou diodu). S pouhými 2 čítači toho víc nezvládnu a do paměti se vejde jen určitý počet kroků (myslím že 256 * 8 "animací").
Dost nešťastné řešení.
Tak třeba takto (jistě to není moc optimální): Nejdříve najít při jaké kombinaci řádků a sloupců se obslouží co nejvíce rozsvícených LED - projít všechny kombinace řádků (tj. tady 512) a pro každou kombinaci vyhledat sloupce které splňují rozsvícení (tj. data_sloupce_obrázku AND řádky == řádky), odtud spočítat počet LED a najít tak nejlepší kombinaci. Obsloužené LED z obrazu odmazat a hledat další kombinaci s největším počtem LED, atd. až se najdou všechny kroky.
Jenom mi prosím poraď, jak projít všechny kombinace(jestli to jde i jinak než pomocí cyklu)
Nejde jinak než cyklem. Něco jako:
#define ROWS 9 // pocet linek
#define COLS (7*8) // pocet sloupecku - napr. 8 pozic po 7 sloupeccich
int radky,sloupec, lednum, led0, ledbest, i;
unsigned char sloupce[COLS/8]; // stradac masky sloupcu
unsigned char sloupce_best[COLS/8]; // nejlepsi maska sloupcu
ledbest=-1;
// cyklus pres vsechny kombinace radku
for (radky=0; radky<(1<<ROWS); radky++)
{
// spocteni bitu "1" v masce radku
led0=0;
for (i=0; i<ROWS; i++) if (radky & (1<<i)) led0++;
// vymazani stradace sloupecku
memset(sloupce, 0, COLS/8);
lednum=0;
// cyklus pres sloupce
for (sloupec=0; sloupec<COLS; sloupec++)
{
// sloupecek vyhovuje, pridani k stradaci masky
if ((pic[sloupec] & radky) == radky)
{
sloupce[sloupec/8] |= (1 << (sloupec & 7));
lednum += led0;
}
}
// nalezena lepsi kombinace
if (lednum > ledbest)
{
ledbest = lednum;
memcpy(sloupce_best; sloupce, COLS/8);
}
}
// pokud je ledbest=0, konec cyklu, jinak pridani do seznamu animaci, odecteni LED od obrazku a hledani dalsi kombinace
Zobrazeno 23 zpráv z 23.