RomânăEnglish
Gadgetisimo » Ghiduri tehnice » Cum să construiești un Game Bub: ghid complet de la KiCad și JLCPCB până la firmware Rust și FPGA Artix-7

Cum să construiești un Game Bub: ghid complet de la KiCad și JLCPCB până la firmware Rust și FPGA Artix-7

GENERAT CU AI
🧠 TL;DR generat de AI

  • Ghid complet, practic, pentru a-ți construi singur Game Bub din sursele de pe GitHub, cu pași reali și capcane întâlnite pe parcurs.
  • Generarea de Gerbers/BOM/CPL în KiCad 9 implică instalarea manuală a pluginului JLCPCB „Fabrication Toolkit” — primul loc unde pierzi timp.
  • Carcasa 3D: comandă separată la JLC3DP; rășina mată ieftină e mai robustă decât transparentul „de poză”. Atenție la polaritatea bateriei JST.
Sumar automat pe baza articolului curent. Model: gpt-5

Cum spuneam și în articolul de aici, am început un proiect destul de ambițios — unul pe care îl aveam pe lista de to-do de peste un an de zile. De ce? Pentru că îmi plac proiectele în care se vede că cineva a pus pasiune, că a muncit să iasă ceva. Față de mult prea mult din conținutul de pe internet, tip influencer sau videoclipuri scurte care par făcute pentru oameni fără răbdare.

Ca multe lucruri care vin pe neașteptate, l-am scos de la naftalină inspirat — cu context negativ — de un alt material din online. M-am săturat să văd pe cineva pe internet făcând ceva doar dacă îl sponsorizează cineva, filmat cinematic și perfect montat, încât totul pare simplu și ieșit dintr-o echipă din spate. Realitatea e alta. Viața reală e altfel, iar până ajungi la un rezultat sunt multă muncă, multe detalii și bani care nu vin din sponsorizări.

Ăsta e parcursul meu real, cel prin care probabil ar trebui să treacă oricine vrea să construiască un Game Bub din fișierele sursă ale proiectului de pe GitHub.

Ca persoană cu background tehnic am câte puțin din fiecare: hardware, software, programare, electronică, arhitectură CPU, lipitură de componente. Bagajul de pornire a fost generos, și tot a fost dificil pe alocuri. Sincer însă, proiectul m-a prins — atât de tare încât am început să-i fac modificări, să planific funcții noi. Dar despre asta, altă dată.

Pentru că am vrut să pun cât mai multe detalii, inițial plănuisem să-l împart în mai multe articole. Am decis până la urmă să-l las într-unul singur. E mai lung, dar mai util dacă îl urmărești de la cap la coadă.

La finalul articolului, o comparație realistă între ce înseamnă să-l construiești tu și ce înseamnă să-l cumperi gata făcut — din punct de vedere al costurilor.

Ce conține proiectul

După ce am descărcat proiectul de pe GitHub, primul pas a fost să înțeleg în mare ce e acolo. Structura are trei secțiuni mari:

  • PCB-ul și componentele aferente
  • Carcasa, butoanele și partea mecanică
  • Firmware-ul

KiCad, Gerbers și capcana cu pluginul

Schema PCB-ului este făcută în KiCad. Va trebui să-l instalați și voi — eu am folosit KiCad 9.0, descărcat gratuit de pe kicad.org. Dar asta nu e suficient. Pentru a putea comanda la un producător de PCB-uri, trebuie să generați trei tipuri de fișiere din proiect: Gerbers (descriu fizic fiecare strat al plăcii), BOM (Bill of Materials, lista cu coduri de componente) și CPL (Component Placement List, coordonate și orientări pentru mașina pick-and-place).

Există un plugin pentru fiecare producător major de PCB-uri. Problema — și ăsta e primul punct în care o să pierdeți timp — este că pluginul pentru JLCPCB, numit „Fabrication Toolkit”, nu apare în repository-ul oficial KiCad. Trebuie instalat manual: descărcați ZIP-ul din github.com/bennymeg/JLC-Plugin-for-KiCad/releases și în Plugin and Content Manager folosiți opțiunea „Install from File…”. Atenție că trebuie să căutați la tab-ul „Plugins”, nu „Fabrication Plugins” — eu am pierdut câteva minute până m-am prins.

După ce e instalat, deschideți fișierul pcb/handheld_rev2/handheld.kicad_pro, mergeți în PCB Editor → Tools → External Plugins → Fabrication Toolkit și dați Generate. Pluginul scoate trei fișiere: handheld.zip (Gerbers), bom.csv și positions.csv. Astea sunt cele trei lucruri pe care le încărcați la JLCPCB.

Cum funcționează de fapt o comandă de PCB la JLCPCB

Eu am ales JLCPCB pentru că proiectul și lista de componente au fost gândite pentru acest producător. Am luat drumul cel mai scurt.

Comanda de PCB-uri nu e ca un produs luat din depozit. Placa trebuie construită după planurile tale, fișierele sunt verificate, și de multe ori primești întrebări dacă ceva nu e clar. Cei de la JLCPCB au fost reactivi — mi-au scris pe email toate întrebările și au răspuns rapid.

Componentele pentru PCB am ales să le iau tot de acolo, în mare parte pentru că ei le pot lipi profesional. Eu nu am acasă aparatură pentru lipitură BGA sau SMD-uri fine. Pe scurt: fără cuptor de reflow nu ai ce să faci cu un board care are FPGA în BGA.

Ce trebuie setat manual — site-ul nu ghicește din Gerbers

Când faci comanda, câteva opțiuni trebuie selectate manual — site-ul nu le detectează automat:

  • Designul Game Bub e pe 6 straturi — trebuie să alegi opțiunea „High Precision PCB”, nu varianta standard pe 2 straturi.
  • Surface finish: ENIG (Gold) — obligatoriu. Fără ENIG nu lipești corect BGA-ul de la FPGA.
  • Dimensiuni placă: 90.1mm × 135mm — se introduc manual.
  • Cantitate: 5 (minimul standard la asamblare).

La livrare: opțiunea rapidă (2-3 zile) e vizibil mai scumpă decât varianta standard (5-6 zile). Dacă nu te grăbești, varianta standard e complet rezonabilă.

Fluxul „Parts Selection by JLCPCB” — partea care te surprinde prima dată

JLCPCB nu îți afișează prețul final imediat ce trimiți comanda. Dacă vrei să-ți asambleze plăcile cu componentele din stocul lor, fluxul e cam așa:

  • Plătești o taxă de serviciu ca ei să caute componentele în stocul LCSC.
  • Aștepți 1-2 zile.
  • Primești email cu un raport: ce au găsit, ce nu au, ce substituiri propun.
  • Le răspunzi cu confirmări.
  • Abia acum primești prețul final și plătești restul (PCB + asamblare + componente).

Surpriza este că plătești o taxă inițială fără să ai în față imaginea costului total, iar comanda nu apare în coș în mod normal după plată — rămâne într-un fel de stand-by până când ei revin cu raportul. Dacă te aștepți la un proces tip e-commerce clasic (adaugi în coș → plătești → primești marfa), aici e altfel.

Clarificările cu JLCPCB: întrebări la care probabil vei răspunde și tu

Au fost câteva runde de email. Le pun pe scurt, pentru că oricine face același proiect va primi exact aceleași întrebări.

Designator mismatch: au întrebat de patru pini din schemă — JP1301, TP401, TP402, J1501 — care nu aveau componentă în BOM. Sunt un jumper de lipit, test points și motorul de vibrație, lucruri pe care le montezi manual. Am ales opțiunea „ignoră și continuă”.

Substituiri propuse pentru componentele cu stoc limitat — le-am acceptat după verificare în datasheet-uri:

  • Butoanele tactile SW1601-SW1608 → GT-TC155C-H0060-L50
  • IMU LSM6DS3TR-C → LSM6DSDTR (echivalent funcțional)
  • IO expander TCA9535 → TCA9555PWR (versiunea UMW)
  • Logic shifters U1901-U2004 → SN74LVC1T45DCKR
  • Test points → RH-5000

Componente indisponibile: jack-ul de căști SJ-43614-SMT-TR și difuzoarele CMS-160903-18S-X8. Pentru jack: opțiunea A, lipit manual. Pentru difuzoare: alt furnizor.

Componentele lipsă: AliExpress, Mouser, buydisplay

Restul componentelor sunt împărțite între AliExpress și comercianți mari ca Mouser sau Farnell. AliExpress merge rezonabil ca timp de livrare. Mouser și Farnell sunt mai rapide, dar folosesc exclusiv servicii premium (UPS Express, DHL Express), iar prețurile de livrare sunt pe măsură. Pentru un proiect de hobby, dacă nu te grăbești, AliExpress e perfect rezonabil.

De lipit manual pe placă:

  • Jack căști 3.5mm SJ-43614-SMT
  • Slot cartuș GBA (căutare: „GBA cartridge socket”)
  • Motor vibrație tip monedă 10mm
  • Port link GBA (opțional)
  • Conector PMOD (opțional, experimental)
  • Butoane shoulder PTS645VN13SMTR92LFS

Componente externe (nu pe PCB):

Display LCD: ER-TFT035IPS-6 de la buydisplay.com. Opțiuni la comandare: fără touch panel, cu conector FPC pe 50 pini. Dacă te lovești de termeni ca ZIF, ZIP, FPC sau FCC — în contextul ăsta înseamnă același lucru.

Baterie LiPo 755068, 3.7V, conector JST-PH. Capacitate 3000-4000 mAh în funcție de ce găsești. Codul 755068 înseamnă 7.5mm grosime × 50mm lățime × 68mm lungime.

Difuzoare CMS-160903-18S-X8 — luate de la Mouser. Nu se lipesc; se presează pe contactele de pe PCB când asamblezi în carcasa printată 3D.

Atenție la baterie: unii producători chinezi montează conectorul JST-PH cu polaritatea inversată față de standardul comercial. Înainte să o conectezi la PCB, verifică întotdeauna cu multimetrul. Dacă o cuplezi invers, arzi placa.

Carcasa printată 3D prin JLC3DP

Fișierele STL sunt în proiect la 3d/handheld_rev2/: Front, Rear, DpadButton, FaceButtonArray, ExtButtonArray, SideButtonArray, ShoulderButtonArray.

JLC3DP (serviciul de 3D printing al celor de la JLCPCB) a fost alegerea evidentă, dar atenție: nu poți pune carcasa în același coș cu PCBA. Sunt două comenzi separate, cu shipping separat.

Material: am ales 9600 Resin (SLA), Matte White. Toată comunitatea alege rășina transparentă (8001 Resin) ca să se vadă PCB-ul prin carcasă — arată bine în poze. Dar transparentul e mai fragil și considerabil mai scump. Pentru un prototip practic, m-am dus pe varianta solidă și ieftină. Dacă vreți show-ul de pe internet pe care alții îl fac sponsorizați, alegeți transparent.

Opțiunea de culori diferite la butoane (galben, roșu, ca pe Game Boy-ul original) crește prețul considerabil. N-am considerat că merită, mai ales că nici nu știam dacă o să pot duce proiectul la bun sfârșit.

Sticla de protecție pentru ecran — capitol nerezolvat

Autorul original a comandat sticlă temperată custom: 0.7mm grosime, silkscreen negru pe spate, adeziv 3M. La cantitate mică iese destul de scumpă.

Alternativa pe care am explorat-o e să folosesc o sticlă de la un Nintendo DSi. Arată diferit și nu se potrivește perfect pe carcasa printată 3D, dar merge pentru experimente. Ideal ar fi să modific STL-ul carcasei din față să se potrivească cu această sticlă — ceva pentru viitor.

La 3-4 săptămâni după prima comandă aveam în față PCB-ul și majoritatea componentelor.

Câteva lucruri importante de știut despre comenzi:

PCB-urile nu se pot comanda singular, câte una. La majoritatea producătorilor există un minim de 5 bucăți. Și aproape inevitabil vei greși ceva la o comandă pe AliExpress, mai ales la componente fără un cod clar. La mine: bateriile au venit prea mari și nu încăpeau în carcasă, pinii metalici pentru butoane prea mici, arcurile pentru butoanele L și R la fel. Poate am greșit eu la comandă, poate nu am fost suficient de atent. Oricum, face parte din proces.

Prima pornire: firmware-ul, ESP32-ul și FPGA-ul

PCB-ul a venit de la JLCPCB asamblat, cu toate componentele SMD lipite. Pasul următor era să pun software pe el. Fără firmware, placa nu face nimic.

Primul test a fost simplu: am conectat flexul LCD și un cablu USB-C. LED-ul verde de status s-a aprins — placa primește curent, totul e în regulă din punct de vedere hardware. Pe ecran nimic, pentru că ESP32-ul nu avea niciun program pe el.

FPGA și microSD

Game Bub-ul are două componente de programat: un FPGA Artix-7, care emulează Game Boy și GBA în hardware, și un ESP32-S3, care gestionează UI-ul, SD card-ul și afișajul. Pentru FPGA, autorul proiectului a publicat deja bitstream-urile pre-compilate în release-ul v0.1 de pe GitHub: boot.bit.gz, gameboy.bit.gz, gba.bit.gz. Nu trebuie compilat nimic.

Am formatat un card de 128GB cu FAT32 prin Rufus, am creat folderul system/ și am pus acolo cele trei fișiere plus BIOS-urile: SameBoy bootrom-urile pentru GB/GBC și BIOS-ul open-source Cult-of-GBA pentru GBA, redenumite conform documentației proiectului.

Firmware-ul ESP32: lupta cu tool-chain-ul

Firmware-ul e scris în Rust și folosește ESP-IDF de la Espressif. Pe Windows am dat imediat de o problemă clasică: calea de build depășea limita de 260 de caractere a sistemului. Am trecut pe macOS, unde lucrurile merg nativ.

Instalarea tool-chain-ului:

bash
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
cargo install espup && espup install
cargo install espflash

A mai trebuit să setez manual câteva variabile de mediu pentru ca build-ul să găsească environment-ul Python al ESP-IDF, după care compilarea a mers — durează cam 10-15 minute la prima rulare:

bash
. ~/export-esp.sh
cargo run --release --features=rev2

Espflash detectează automat portul USB și flashează firmware-ul. Pasul final: scriptul flash_nvs.py scrie în memoria NVS revizia hardware-ului și numărul de serie al plăcii — fără asta firmware-ul refuză să pornească.

bash
python3 flash_nvs.py --serial 0001 --revision 2

Card în slot, Power apăsat — meniul Game Bub pe ecran. Animație de boot, logo, meniu principal. Prima placă funcțională, dintr-un proiect pornit de la zero, la care nici nu credeam că o să-l pot duce la bun sfârșit.

Produsul final: ce e remarcabil și ce mai are nevoie de șlefuire

Să vorbim puțin despre produsul în sine, deși la mine nu e chiar final — cum am menționat, mi-a trezit interesul și m-am apucat să-i fac modificări, mai ales la firmware, FPGA și software.

Ce a reușit dezvoltatorul original, în modul one man show, poate rivaliza în mare măsură cu produse dezvoltate de companii cu echipe dedicate și bugete pe măsură. Implementarea FPGA, dezvoltarea PCB-ului și a firmware-ului Rust de la zero, compatibilitatea cu cartușe GB, GBC și GBA originale plus ROM-uri de pe card SD — e de-a dreptul impresionant.

Pe de altă parte, l-aș clasifica ca un produs care, atunci când îl ții în mână, se simte a un produs solid de hobby și nu un produs final de pe raft. Starea proiectului din GitHub dictează aceste senzații: în multe privințe mai are nevoie de șlefuire, și asta nu s-a mai întâmplat în repository. E oarecum de înțeles, pentru că autorul original a mers spre o zonă comercială prin crowdfunding și e normal să-și păstreze câteva atuuri acolo.

Zonele pe care le-am identificat ca având nevoie de evoluție:

Firmware-ul, în forma lui originală, are doar utilitate de bază. Funcții prezente în meniu dar neimplementate în cod, bug-uri care se manifestau în situații specifice — liste lungi de ROM-uri duceau la panic crash pentru că depășeau memoria disponibilă. Funcția Dark Mode neimplementată, Rumble fără posibilitatea de a seta niveluri de putere pentru motorul de vibrații. Pe lângă astea, am considerat că lipsesc și alte lucruri pe care le-am implementat în versiunea mea modificată de firmware, câteva se pot observa în imaginile din galerie.

PCB-ul cred că are și el nevoie de câteva finisaje. Butoanele de power și de volum mi se par fragile pentru utilizare intensă. Aș înlocui butoanele de volum cu o rotiță clasică tip radio, mult mai fiabilă în timp. Butonul de power, care va fi unul dintre cele mai solicitate de pe consolă, l-aș înlocui cu unul mai solid, cu lipire through-hole în loc de SMD — spun asta din experiență, pentru că butonul de power s-a rupt la mine la asamblare. Carcasa printată 3D are, normal, toleranțe care fac ca butoanele să nu se așeze perfect pe componentele SMD de dedesubt.

Tot la carcasă: deși e la îndemână și rapidă ca soluție, materialul se mai curbează față de o carcasă produsă în matriță, ceea ce face ca cele două jumătăți — față și spate — să nu se închidă ideal.

Cu toate acestea, produsul rămâne excepțional prin nivelul atins de o singură persoană. Dacă ești pasionat de electronică, e contagios. De când am început să-l implementez, m-a prins suficient încât să adaug funcții noi la firmware și să extind compatibilitatea cu alte console pe același hardware. La un moment dat, când timpul îmi va permite, o să pun toate modificările mele înapoi pe GitHub, ca și alții să poată beneficia de ele.

Costurile de construcție versus produsul gata: hai să vorbim despre bani

Pe pagina de crowdfunding de pe Crowd Supply, Game Bub se poate comanda la 269$ plus 18$ livrare. Prețul ăsta e probabil fără taxe, deci în Europa trebuie să mai adăugăm undeva la 20%, ceea ce duce la un total de aproximativ 344 de dolari.

Costurile mele, pe tot ce am comandat, inclusiv taxe de livrare și taxe de import acolo unde a fost cazul:

  • Componente AliExpress: 31,51 Euro
  • JLCPCB (PCB, componente PCB, carcasă 3D plus taxe): 156 Euro
  • Componente Mouser: 12,64 Euro

Total: aproximativ 200 Euro, adică în jur de 215-220 de dolari.

Desigur că prețul de pe crowdfunding beneficiază de reduceri de volum — la mine costul per componentă e mai mare față de când construiești câteva sute de unități. Diferența poate fi undeva la 20%. Și mai pot adăuga o marjă de eroare și optimizare de 5-10% la costurile mele.

Dacă vrei produsul final, clar mai șlefuit și mai finisat decât ce e în GitHub, gata să-l folosești de pe raft — opțiunea Crowd Supply e pentru tine.

Dacă ești pasionat, dacă vrei să beneficiezi de o curbă de învățare și să rămâi cu cunoștințe pe care le poți folosi în alte proiecte viitoare, dacă vrei să fii mândru de aptitudinile tale — atunci proiectul din GitHub e cel pe care să-l alegi. Drumul de la comandă până la produsul funcțional în mână o să-ți ofere satisfacții mult mai mari decât dacă l-ai lua de pe raft.

Dacă ești la primul proiect de tipul ăsta, sincer, economia în sine probabil nu merită per se. Faci minimum 4 săptămâni de muncă pentru circa 100 de dolari economisiți. Dar treci prin tot procesul: KiCad, BOM, PCBA, asamblare manuală, configurare firmware. Înveți cum se construiește o placă cu FPGA și BGA cu mâna ta. Și poate ajungi chiar să contribui înapoi la comunitate. Asta nu se poate cuantifica.

P.S. Sunt sigur că am uitat anumite detalii despre proiect — e și normal, am lucrat câteva săptămâni bune atât la construcție cât și la dezvoltarea adițională. Dacă vă apucați de proiect și aveți întrebări, scrieți în zona de comentarii și o să vă răspund.

Galerie cu poze din meniu și din joc

(una dintre funcțiile implementate de mine in firmware este cea de a face screenshot-uri)

Imagini de pe parcursul proiectului

GENERAT CU AI
🤖 Recomandări AI din blog

Articole selectate automat pe baza articolului curent. Model: gpt-5

Back To Top
Gadgetisimo
Prezentare generală a confidențialității

Acest site folosește cookie-uri pentru a-ți putea oferi cea mai bună experiență în utilizare. Informațiile cookie sunt stocate în navigatorul tău și au rolul de a te recunoaște când te întorci pe site-ul nostru și de a ajuta echipa noastră să înțeleagă care sunt secțiunile site-ului pe care le găsești mai interesante și mai utile.