Orodha ya maudhui:

RGB LED Matrix: 5 Hatua
RGB LED Matrix: 5 Hatua

Video: RGB LED Matrix: 5 Hatua

Video: RGB LED Matrix: 5 Hatua
Video: Lesson 25: HT16K33 4 digit display | Arduino Step By Step Course 2024, Novemba
Anonim
Image
Image
Ubunifu wa Vifaa
Ubunifu wa Vifaa

Tafuta Iliyoagizwa, na unaweza kupata miradi mingi ya matriki ya LED. Hakuna hata moja kati yao ilikuwa kile nilichotaka, ambayo ilikuwa kuchunguza mwingiliano wa vifaa na muundo wa programu kutoa kitu, na kutoa bidhaa ya mwisho katika PCB nadhifu na dereva ambaye wacha nivute kwenye "skrini ya LED" kwa kutumia kiwango cha hali ya juu. huunda (kwa mfano, kuchora laini tofauti na kuweka saizi maalum). Sehemu hii ilikuwa muhimu kwangu, kwani madereva mengi ya matriki ya LED ni mifupa wazi na hayatoi sana njia ya kuunda programu au picha. Hii haimaanishi kuwa huwezi kuunda picha na michoro na madereva mengine, tu kwamba italazimika kufanya kazi ya kurudia zaidi kutoka mradi hadi mradi.

Kwa hivyo niliamua kutimiza maono yangu. Hatua ya kwanza ilikuwa kubuni vifaa. Labda hii ilikuwa ngumu sana kwangu, kwani asili yangu ni programu zaidi. Tena, kulikuwa na miundo mingi iliyooka kabla, na kwa kweli niliitumia kwa msukumo, lakini nilitaka kujifunza kwa kufanya, kwa hivyo nilichapisha matrix 4x4 kwenye ubao wa mkate. Nilijifunza mengi kupitia mchakato huo, kwani maoni yangu ya kwanza hayakufanya kazi. Lakini, nilifanya muundo wa vifaa ambavyo vilifanya kazi, ambayo iliniruhusu kuanza kukuza dereva.

Nilichagua Arduino kama jukwaa langu la dereva kwa sababu inapatikana sana na ina marejeleo mengi mkondoni. Wakati uzoefu wa taaluma uliniruhusu kufika kwenye toleo la dereva kwa ujanja zaidi kuliko juhudi zangu za vifaa, bado kulikuwa na mwitikio mwingi wakati niliboresha utendaji wa dereva kwa mtawala mdogo wa ATMega na nikapanga API ya programu ambayo nilipenda.

Hati hii inayoweza kufundishwa muundo na mafunzo kadhaa muhimu kutoka kwa mradi wangu. Maelezo zaidi juu ya mradi huu yanaweza kupatikana kwenye wavuti yangu hapa, pamoja na vifaa kamili unavyoweza kununua ili kujenga tumbo lako la RGB LED.

Hatua ya 1: Ubuni wa vifaa

Lengo la msingi la muundo wangu wa vifaa ilikuwa kuunda safu za RGB za LED ambazo ningeweza kupanga, lakini pia sikutaka kutumia pesa nyingi pia. Njia niliyokaa ilikuwa kutumia rejista za mabadiliko ya 74HC595 kudhibiti LED. Ili kupunguza idadi ya sajili za mabadiliko zinazohitajika, nilipanga RGB za LED katika mpangilio wa matriki ambapo anode za kawaida zilifungwa pamoja kwa safu na risasi nyekundu, kijani kibichi na bluu zilifungwa pamoja kwenye safu. Kwa tumbo la 4x4, mchoro wa mzunguko ulionekana kama mchoro wa mzunguko ulioambatishwa.

Jambo moja ambalo utaona mara moja ni kwamba kutokana na mzunguko wa tumbo, kuna usanidi wa taa za LED ambazo haziwezi kufanywa na taa zote zinazotarajiwa zikiwa wakati huo huo. Kwa mfano, tumbo haliwezi kuwasha wakati huo huo taa mbili za LED ambazo zina ulalo kutoka kwa kila mmoja kwa sababu kuwezesha safu na nguzo zote mbili zitasababisha taa mbili za mwangaza ziangaze kwenye ulalo wa perpendicular kwa LED zinazohitajika. Ili kufanya kazi karibu na hii, tutatumia kuzidisha kukagua kila safu. Kuna rasilimali nyingi kwenye wavuti ambazo zinafunika ufundi wa kuzidisha, sitajaribu kuiga hapa.

Kwa kuwa ninatumia anode za kawaida za anode, hiyo inamaanisha safu zinatoa nguvu nzuri na nguzo zinazama chini. Habari njema ni kwamba rejista za mabadiliko ya 74HC595 zinaweza kupata na kuzama nguvu, lakini habari mbaya ni kwamba wana kikomo juu ya nguvu ngapi wanaweza kupata au kuzama. Pini za kibinafsi za 74HC595 zina sare ya juu ya sasa ya 70 mA, lakini ni bora kuweka chini ya 20 mA. Rangi za kibinafsi katika RGB zetu za RGB kila moja ina karibu kuteka 20 mA. Hii inamaanisha kuwa 74HC595 haiwezi kuwezesha moja kwa moja safu nzima ya LED ikiwa ninataka kuwasha zote.

Kwa hivyo badala ya kuweka nguvu safu moja kwa moja, 74HC595 badala yake itaendesha transistor kwa kila safu, na transistor itawasha au kuzima safu ya sasa inayoweka safu. Kwa kuwa muundo unatumia anode za kawaida za anode, transistor inayobadilika itakuwa PNP. Ikiwa tungetumia taa ya kawaida ya cathode, transistor inayobadilika itakuwa NPN. Kumbuka kuwa kwa kutumia transistor ya PNP kuendesha safu, mpangilio wa rejista ya zamu kuiwasha sasa inakuwa chini wakati transistor ya PNP inahitaji voltage hasi kati ya mtoaji na msingi kuwashwa, ambayo itaruhusu sasa chanya kutiririka safu.

Jambo lingine la kuzingatia ni mpangilio wa taka kidogo wa sajili za mabadiliko. Hiyo ni, kati ya rejista za mabadiliko, ambazo zinadhibiti safu na nguzo zipi kwenye tumbo. Ubunifu niliotuma nao ni mahali kidogo, au "muhimu zaidi", iliyotumwa kwa rejista za daisy zilizo na minyororo kudhibiti safu ya vipengee vyekundu vya LED, kipande cha pili kilidhibiti safu ya kijani ya safu ya kwanza, biti ya tatu inadhibiti safu ya kwanza kipengee cha hudhurungi, kidonge cha nne kinadhibiti kipengee nyekundu cha safu wima ya pili,… muundo huu unarudiwa kwenye safu wima kushoto kwenda kulia. Kisha kijacho kilituma udhibiti wa mwisho, au chini, safu, inayofuata ya pili hadi safu ya mwisho,… hii ilirudiwa mpaka mwisho ilitumwa, au "kidogo muhimu", inadhibiti safu ya kwanza, au ya juu, kwenye tumbo.

Mwishowe, nilihitaji kuamua ni vipinga vipi nitatumia kwa kila moja ya LED kwenye RGB LED. Wakati unaweza kutumia fomula ya kawaida ambayo inachanganya voltage ya mbele na ya sasa inayotakiwa kuhesabu kontena linalohitajika, niligundua kuwa kuweka kila mkondo wa LED kwa mililita 20 kulisababisha rangi nyeupe-nyeupe wakati taa zote nyekundu, kijani kibichi na hudhurungi zilikuwa zimewashwa. Kwa hivyo nilianza kuipiga mpira wa macho. Nyekundu sana katika nyeupe ilimaanisha kuongeza ohms nyekundu za mwangaza wa LED kupunguza sasa. Nilirudia kubadilisha vipinga vya ohms tofauti hadi nikapata mchanganyiko ambao ulitoa rangi nyeupe nilihisi ni sawa. Mchanganyiko wa mwisho ulikuwa 180 Ω kwa LED nyekundu, 220 Ω kwa LED ya kijani na 100 Ω kwa LED ya bluu.

Hatua ya 2: Ujenzi wa Vifaa - Bodi ya mkate

Ujenzi wa Vifaa - Bodi ya mkate
Ujenzi wa Vifaa - Bodi ya mkate
Ujenzi wa Vifaa - Bodi ya mkate
Ujenzi wa Vifaa - Bodi ya mkate

Awamu ya kwanza ya mjenzi wa vifaa ilikuwa upandaji mkate. Hapa nilitengeneza matrix ya 4x4 na RGB za LED. Matrix hii itahitaji bits 16 kudhibiti, 12 kwa safu za RGB, na 4 kwa kila safu. Sajili mbili za mabadiliko ya 74HC595 zinaweza kushughulikia yote. Kwanza nilitafiti na kubuni mzunguko ambao nilidhani utafanya kazi, kisha nikaijenga kwenye ubao wa mkate.

Labda changamoto kubwa ya ujenzi wa bodi ya mkate ilikuwa kusimamia waya zote. Nilichukua kitanda cha waya kilichopangwa tayari kwa bodi za mkate, lakini hafla hiyo ilikuwa ngumu sana. Ujanja ambao niliona kuwa wa kusaidia ni kuunda "bandari" ya kuunganisha na bodi ya Arduino. Hiyo ni, badala ya kuunganisha pini kwenye Arduino moja kwa moja na pini anuwai za IC kwenye ubao wa mkate, weka safu kadhaa kwenye ubao wa mkate kuwa kiunganishi cha Arduino, na kisha unganisha pini za ID zinazohusiana na safu hizo. Kwa mradi huu, unahitaji tu unganisho tano kwa Arduino: + 5V, ardhi, data, saa, na latch.

Mara ujenzi wa bodi ya mkate ulipofanyika, nilihitaji kuijaribu. Walakini, bila dereva wa aina fulani kutuma ishara sahihi kwa rejista za mabadiliko, sikuweza kujaribu kuona ikiwa mpangilio wa vifaa ulifanya kazi.

Hatua ya 3: Ubunifu wa Programu ya Dereva

Image
Image

Kutokana na uzoefu wangu mwenyewe wa kazi na maendeleo ya programu, hii ilikuwa sehemu ya mradi ambao labda nilikuwa wazi zaidi juu ya njia ya kuchukua. Nilichunguza madereva mengine mengi ya Arduino yenye msingi wa LED. Wakati hakika kuna madereva mazuri yanayopatikana, hakuna hata mmoja alikuwa na muundo ambao nilitaka. Malengo yangu ya kubuni ya dereva yalikuwa:

  • Toa kiwango cha juu cha API ili kuweza kuunda picha na michoro. Madereva wengi niliowaona walikuwa wakilenga zaidi picha zenye maandishi magumu. Pia, kwa kuwa mimi ni programu ya C ++ kwa biashara, nilitaka kutumia muundo mzuri wa vitu kutekeleza na kusimamia shughuli za kuchora kwa tumbo la LED.
  • Tumia njia iliyofungwa mara mbili kudhibiti picha kwenye skrini. Bafa moja ndio huingizwa kwa mpango, wakati nyingine inawakilisha hali ya saizi za tumbo wakati wowote. Faida ya njia hii ni kwamba hauhitajiki kutoa sasisho la sura inayofuata kwa skrini kati ya mizunguko ya sasisho la kuzidisha.
  • Tumia PWM kuruhusu zaidi ya rangi saba za asili RGB inaweza kutoa kupitia mchanganyiko rahisi wa vitu nyekundu, kijani kibichi na bluu.
  • Andika dereva kama "ingefanya kazi tu" na ukubwa tofauti wa matriki ya RGB ya LED ambayo ilifuata njia yangu ya muundo wa tumbo. Kumbuka kuwa wakati muundo wangu wa vifaa unatumia rejista za mabadiliko ya 74HC595, nitatarajia dereva wangu afanye kazi na mtindo wowote wa rejista ya kuhama juu ya / kuzima utaratibu ambao umewekwa kwa kutumia mpangilio sawa kama muundo wa vifaa vyangu. Kwa mfano, ningetarajia dereva wangu afanye kazi na muundo wa vifaa ambavyo vilitumia vidonge vya DM13A kudhibiti nguzo na chip ya 74HC595 kudhibiti safu.

Ikiwa unataka kwenda moja kwa moja kutazama nambari ya dereva, unaweza kuipata kwenye GitHub hapa.

Iteration ya kwanza ya dereva wangu ilikuwa kidogo ya eneo la kujifunza juu ya uwezo wa jukwaa la Arduino. Upeo ulio wazi zaidi ni RAM, ambayo ni ka 2K kwa Arduino Uno na Nano. Kutumia vitu vya C ++ katika hali kama hiyo mara nyingi haushauriwi kwa sababu ya kumbukumbu ya vitu. Walakini, nilihisi ikiwa imefanywa sawa, faida ya vitu katika C ++ ilizidi gharama zao (katika RAM).

Changamoto kuu ya pili ilikuwa kutafakari jinsi ya kutekeleza muundo wa upana wa mapigo kupitia rejista za mabadiliko ili nipate kuzalisha zaidi ya rangi saba za zamani za RGB LED. Baada ya kusanidiwa kwa miaka mingi kwenye majukwaa ya Linux, nilikuwa nikitumia miundo kama nyuzi kusimamia michakato ambayo inahitaji muda thabiti. Wakati wa kazi ya sasisho la rejista ya mabadiliko huishia kuwa muhimu sana wakati wa kufanya dereva wa tumbo la LED linalotumia kuzidisha. Sababu ni kwamba hata ingawa kuzidisha hufanyika haraka sana kwamba macho yako hayawezi kuona taa za kibinafsi ziking'aa na kuzima, ayes yako inaweza kuchukua tofauti katika jumla ya wakati ambao jumla ya LED ziko. Ikiwa safu moja ya LED inaendelea kuwaka kwa kipindi kirefu kuliko zingine, itaonekana kung'aa wakati wa kuzidisha. Hii inaweza kusababisha mwangaza usio sawa katika tumbo au upigaji wa mara kwa mara wa tumbo kwa ujumla (hii hufanyika wakati mzunguko mmoja wa sasisho unachukua muda mrefu kuliko zingine).

Kwa kuwa nilihitaji utaratibu thabiti wa muda wa kusasisha sasisho za rejista ya mabadiliko kuwa idhini, lakini Arduino haiungi mkono rasmi thread, ilibidi niunde utaratibu wangu kama wa utaftaji. Iteration yangu ya kwanza ya hii ilikuwa kuunda tu kipima muda ambacho kilitegemea kazi ya kitanzi cha Arduino () na ingefanya kitendo wakati muda fulani umepita tangu mara ya mwisho hatua hiyo ilipofutwa. Hii ni aina ya "kazi nyingi za ushirika". Inaonekana nzuri lakini kwa vitendo hii ilidhihirika kuwa haiendani wakati kiwango cha kurusha kilipimwa kwa microseconds. Sababu ya hii ni kwamba ikiwa nilikuwa na mbili za vipima muda vya kitanzi kwenda, moja ya vitendo vyao mara nyingi ilichukua muda mrefu wa kutosha kusababisha hatua ya pili kuwaka moto baadaye kuliko inavyotarajiwa.

Niligundua kuwa suluhisho la shida hii ni kutumia utaratibu wa kukatiza saa ya asili ya Arduino. Utaratibu huu hukuruhusu kuendesha kificho kidogo kwa vipindi sawa. Kwa hivyo nilibuni nambari ya dereva karibu na kipengee cha muundo wa kutumia saa kukatiza ili kuchochea msimbo wa kutuma matembezi ya matrix kusajili sasisho linalofuata kwenye mzunguko wa multiplex. Ili kufanya hivyo na kuruhusu sasisho kutokea kwenye picha ya skrini isiingiliane na dampo inayotumika kwenye rejista za mabadiliko (kitu ambacho tungeita "hali ya mbio"), nilitumia njia ya kuwa na bafa pacha za rejista za mabadiliko, moja ya kuandika na moja ya kusoma. Wakati mtumiaji anasasisha picha ya tumbo, shughuli hizi hufanyika kwa bafa ya kuandika. Shughuli hizo zinapokamilika, usumbufu umesimamishwa kwa muda (hii inamaanisha kukatisha saa hakuwezi kuwaka) na bafa ya kuandika hubadilishwa na bafa ya kusoma ya hapo awali na sio bafa mpya ya kusoma, basi tafsiri hufanywa tena. Halafu, wakati saa inapokatiza moto ikionyesha ni wakati wa kutuma usanidi kidogo unaofuata kwenye rejista za zamu, habari hiyo inasomwa kutoka kwa bafa ya kusoma ya sasa. Kwa njia hii, hakuna maandishi yanayotokea kwa bafa ambayo inaweza kusomwa kwa sasa wakati wa saa, ambayo inaweza kuharibu habari iliyotumwa kwa rejista za zamu.

Kubuni dereva aliyebaki ilikuwa kesi ya moja kwa moja ya muundo ulioelekezwa kwa kitu. Kwa mfano, niliunda kitu kusimamia picha ndogo ya rejista ya mabadiliko kwa hali yoyote ya skrini. Kwa kuingiza nambari inayohusu usimamizi wa picha kidogo, kuunda njia iliyotajwa hapo juu ya mapacha ilikuwa zoezi moja kwa moja. Lakini sikuandika hii yenye Maagizo ili kupongeza fadhila za muundo wa kitu. Vipengele vingine vya muundo ni pamoja na dhana ya Glyph na Picha ya RGB. Glyph ni muundo wa msingi wa picha ambao hauna habari ya asili ya rangi. Unaweza kufikiria kama picha nyeusi na nyeupe. Wakati Glyph inavutwa kwa skrini ya LED, habari ya rangi hutolewa kuonyesha jinsi saizi "nyeupe" zinapaswa kupakwa rangi. Picha ya RGB ni picha ambapo kila pikseli ina habari ya rangi yake mwenyewe.

Ninakuhimiza kukagua mifano ya mchoro wa Arduino na kukagua nyaraka za kichwa cha dereva ili ujue na jinsi ya kutumia dereva kuunda picha na michoro kwenye tumbo la RGB la LED.

Hatua ya 4: Kutengeneza Ghosting

Upepo wa LED
Upepo wa LED
Upepo wa LED
Upepo wa LED

Katika tumbo la LED, "kupumua" ni uzushi wa LED kwenye tumbo inayoangaza wakati haitakiwi, kawaida kiwango kilichopunguzwa sana. Ubunifu wangu wa vifaa vya asili uliathiriwa na roho, haswa katika safu ya mwisho. Sababu ya hii ni kwa sababu ya vitu viwili: transistors hazizimwi mara moja na uwezo wa vimelea katika RGB za LED.

Tunapochunguza safu, kwa sababu ya ukweli kwamba transistors hazizimwi mara moja, safu ya awali kwenye mzunguko wa skanisho bado inawezeshwa kidogo wakati safu inayofuata inawashwa. Ikiwa safu iliyopewa ambayo ilikuwa imezimwa kwenye safu ya kwanza imewashwa upya wakati safu mpya inapowashwa, LED ya safu hiyo kwenye safu iliyotangulia itawaka kwa muda mfupi wakati transistor ya safu ya awali bado iko kwenye mchakato wa kugeuka imezimwa. Kinachosababisha transistor kuchukua muda unaoonekana kuzima ni kueneza katika msingi wa transistor. Hii inasababisha njia ya mtoza-mtoaji kuendelea kupitisha wakati wa sasa umeondolewa kutoka kwa msingi, angalau hadi kueneza kutakapo. Kwa kuzingatia kuwa mzunguko wetu wa sasisho la kuzidisha husababisha safu kuwa kwa makusudi kwa kipindi cha muda uliopimwa kwa microseconds, kiwango cha muda ambacho transistor iliyojaa safu ya awali inabaki kuwa ya kusonga inaweza kuwa sehemu inayoonekana ya hiyo. Kama matokeo, jicho lako linaweza kuona wakati mdogo sana ambao taa ya safu ya awali imewashwa.

Ili kurekebisha shida ya kueneza kwa transistor, diode ya Schottky inaweza kuongezwa kwa transistor kati ya msingi na mtoza ili kusababisha sasa nyuma kidogo kwa msingi wakati transistor iko, kuzuia transistor kutoka kujaa. Hii kwa upande itasababisha transistor kuzima haraka zaidi wakati wa sasa umeondolewa kwenye msingi. Tazama nakala hii kwa ufafanuzi wa kina wa athari hii. Kama unavyoona kutoka kwenye picha kwenye sehemu hii, bila diode upepo unaonekana kabisa, lakini kuongeza diode kwenye mzunguko kwa kila safu inaondoa sana upeanaji.

LED za RGB zinahusika na jambo lingine linaloitwa uwezo wa vimelea. Sababu kuu ya hii ni ukweli kwamba kila moja ya rangi tatu za LED katika kitengo cha RGB LED kila moja ina voltages tofauti za mbele. Tofauti hii katika voltages ya mbele inaweza kusababisha athari ya uwezo wa umeme kati ya kila rangi ya LED. Kwa kuwa chaji ya umeme imejengwa katika kitengo cha LED wakati kinatumiwa, wakati nguvu inapoondolewa, uwezo wa vimelea unahitaji kutolewa. Ikiwa safu hiyo ya LED imewashwa tena kwa safu nyingine, malipo ya vimelea yatatoka kupitia safu hizo za LED na kuifanya iwe inang'aa kwa muda mfupi. Athari hii inafafanuliwa vizuri katika nakala hii. Suluhisho ni kuongeza njia ya kutokwa kwa malipo haya ya vimelea isipokuwa kwa njia ya LED yenyewe, na kisha kutoa wakati wa LED kutekeleza kabla safu haijawashwa tena. Katika muundo wangu wa vifaa, hii inafanikiwa kwa kuongeza kontena kwenye laini ya nguvu ya kila safu inayounganisha nguvu na ardhi. Hii itasababisha zaidi ya sasa kuteka na safu inaendeshwa, lakini hutoa njia ya kutokwa kwa uwezo wa vimelea wakati safu haijawezeshwa.

Ni muhimu kuzingatia, hata hivyo, kwamba katika mazoezi naona athari ya uwezo wa vimelea kuwa dhahiri sana (ikiwa utaitafuta, unaweza kuipata), na kwa hivyo ninafikiria kuongeza kontena hili la ziada kuwa la hiari. Athari za kupungua kwa muda kwa transistors zilizojaa ni nguvu zaidi na inayoonekana. Walakini, ukikagua picha tatu zilizotolewa katika sehemu hii, unaweza kuona kwamba wapinzani wanaondoa kabisa upeanaji wowote ambao bado unatokea zaidi ya ule wa transistor polepole.

Hatua ya 5: Utengenezaji wa Mwisho na Hatua Zifuatazo

Image
Image

Awamu ya mwisho ya mradi huu ilikuwa ni mimi kuunda bodi ya mzunguko iliyochapishwa (PCB). Nilitumia programu ya chanzo wazi Fritzing kubuni PCB yangu. Wakati kulikuwa na kazi nyingi za kurudia kukamilisha mpangilio wa LEDs 100 kwenye bodi ya 10x10, kwa kweli niligundua awamu hii ya mradi inaridhisha ajabu. Kugundua jinsi kila njia ya umeme ingewekwa ilikuwa kama fumbo, na kutatua ile fumbo iliunda hali ya kufanikiwa. Kwa kuwa sijawekwa kutengeneza bodi za mzunguko, nilitumia mojawapo ya rasilimali nyingi mkondoni ambazo hufanya matembezi madogo ya PCB ya kawaida. Kuunganisha sehemu pamoja kulikuwa sawa mbele kwani muundo wangu ulitumia sehemu zote za shimo.

Wakati wa kuandika Agizo hili, nina mipango ifuatayo ya miradi yangu ya RGB LED Matrix:

  1. Endelea kuboresha dereva kwenye safu ya API ili kuwezesha utendaji wa kiwango cha juu zaidi kwa programu, haswa kutembeza maandishi.
  2. Unda miundo kubwa ya tumbo, kama 16x16 au 16x32.
  3. Chunguza kutumia MOSFET badala ya BJTs kwa ubadilishaji wa nguvu ya safu
  4. Chunguza kutumia DM13A kama madereva ya sasa ya mara kwa mara badala ya 74HC595s kwa ubadilishaji wa safu
  5. Unda madereva kwa majukwaa mengine ya kudhibiti ndogo, kama vile Teensy, ODROID C2, au Raspberry Pi.

Kumbuka kuwa muundo wa vifaa na dereva vimetolewa chini ya leseni ya chanzo wazi ya GPL v3 kwenye ghala hii ya GitHub. Kwa kuongezea, kwa kuwa ingawa PCB hutengeneza "kukimbia kidogo" kwa muundo wangu wa PCB, bado napata zaidi kuliko mimi mwenyewe ninavyohitaji. Kwa hivyo ninauza vifaa kamili kwa miundo yangu anuwai ya RGB ya LED (PCB na sehemu zote zikijumuishwa) kutoka kwa wavuti yangu hapa.

Ilipendekeza: