To jest jeden projekt Pythona. Klawiaturę wybierasz flagą --layout przy uruchamianiu.
Nie ma trzech projektów ani osobnych instalacji.
unzip BrainBoard-final.zip
cd BrainBoardMasz dwie opcje:
poetry installpython3 -m venv .venv
source .venv/bin/activate # macOS/Linux
# .venv\Scripts\activate # Windows
pip install -r requirements.txtPYTHONPATH=. poetry run pytest # lub: PYTHONPATH=. python -m pytestPowinno wyświetlić 87 passed. Jeśli tak — wszystko jest OK.
Pełnoprawne okno z 3 układami klawiatury do wyboru, wpisywanym tekstem i sugestiami słów.
PYTHONPATH=. poetry run python -m src.gui.main_windowW okienku:
- Toolbar u góry: wybierasz Hex-O-Spell / Ring-O-Spell / Tree (Huffman)
- Pole tekstowe: pokazuje co wpisałeś
- Pasek sugestii: 3 propozycje słów po angielsku (klikalne myszką lub klawiszem 1/2/3)
- Klawiatura: aktualnie wybrany layout
Sterowanie z klawiatury:
←/a— w lewo→/d— w prawoSpacja/Enter/w— select (blink)Backspace/s— back/cofnij1/2/3— wstaw odpowiednią sugestię słowa
Tylko Ty + klawiatura komputera. Naciskasz L/R/B i widzisz jak speller się porusza.
To jest tryb na pokazy / żeby pokazać znajomemu jak to działa.
# Klawiaturka bigram-adaptive (polskie kontynuacje, układ z Ring-O-Spell):
PYTHONPATH=. poetry run python -m src.eeg_headset.cmd.scripted_repl --layout bigram
# Klawiaturka 5x6 (oryginalna):
PYTHONPATH=. poetry run python -m src.eeg_headset.cmd.scripted_repl --layout staticSterowanie:
Lluba— ruch w lewoRlubd— ruch w prawoBlubEnter— blink (zatwierdzenie)S— back (cofnięcie)Q— wyjście
Pełny przepływ: syntetyczny EEG → klasyfikator EEGNet → blink detector → speller. To jest tryb żeby zobaczyć cały system w akcji bez sprzętu.
# Bigram layout + scripted intencje:
PYTHONPATH=. poetry run python -m src.eeg_headset.cmd.run_keyboard \
--driver scripted \
--scripted-sequence blink,blink,right,blink,blink \
--layout bigram \
--headset-model SAMPLE_64CH
# Albo z losowym mockiem (model zobaczy losowe sinusy):
PYTHONPATH=. poetry run python -m src.eeg_headset.cmd.run_keyboard \
--driver mock --layout bigram --headset-model SAMPLE_64CH# Najpierw test połączenia z czepkiem:
PYTHONPATH=. poetry run python -m src.eeg_headset.cmd.brainaccess_sanity \
--model MIDI_16CH_BASE
# Potem odpalenie klawiatury:
PYTHONPATH=. poetry run python -m src.eeg_headset.cmd.run_keyboard \
--driver brainaccess --headset-model MIDI_16CH_BASE \
--layout bigram- Wgraj
firmware/bioamp_exg_pill.inodo Arduino/ESP32 przez Arduino IDE. - Podłącz elektrody (nad okiem, pod okiem, referencja na czole).
- Sprawdź port szeregowy (np.
/dev/ttyUSB0na Linux, COM3 na Windows). - Odpal:
PYTHONPATH=. poetry run python -m src.eeg_headset.cmd.run_keyboard \
--driver brainaccess --headset-model MIDI_16CH_BASE \
--bioamp-port /dev/ttyUSB0 \
--layout bigram--layout static # oryginalny 5×6, hardkodowany alfabet
--layout bigram # 6×6 ring, dynamicznie zmienia zawartość po każdej literzeTo jedna flaga, ten sam projekt, te same komendy. Speller to drop-in replacement — wszystko inne (driver, pipeline, model, blink detector) jest identyczne.
Wystarczy że podmienisz plik:
cp twoj_nowy_model.pth data/model/final_best.pthPlus podasz odpowiedni sample rate (BrainAccess MIDI ma 250 Hz, nie 160):
... --preprocess-sfreq 250 --preprocess-bandpass-low 7.0 --preprocess-bandpass-high 30.0Parametry modelu (f1, d, f2, liczba kanałów, klas) wykrywają się automatycznie ze state_dict — nie musisz nic edytować w kodzie.
PYTHONPATH=. poetry run python -m src.eeg_headset.cmd.scripted_repl --layout bigramJeśli to nie działa — zła instalacja Pythona/poetry.
PYTHONPATH=. poetry run pytestPowinno być 87 passed.
PYTHONPATH=. poetry run python -c "from src.inference.starter_bci import load_model; m = load_model(); print('OK', m.fc.out_features, 'klasy')"Powinno wypisać OK 2 klasy.
PYTHONPATH=. poetry run python -m src.eeg_headset.cmd.brainaccess_sanity --model MIDI_16CH_BASEJeśli brainaccess SDK not installed — musisz go doinstalować osobno (oficjalna wheel z BrainAccess), to jest poza pip'em.
BrainBoard/
├── START_HERE.md ← ten plik
├── README.md ← bardziej szczegółowa dokumentacja
├── pyproject.toml ← poetry, jak dotąd
├── requirements.txt
├── headsets.yaml ← konfiguracja czepków (BrainAccess MIDI itd.)
├── data/
│ ├── model/final_best.pth ← Twój model EEGNet, gotowy
│ └── language/polish_bigrams.json ← tabela bigramów dla layoutu bigram
├── firmware/
│ └── bioamp_exg_pill.ino ← sketch do flashowania Arduino/ESP32
├── src/
│ ├── eeg_headset/
│ │ ├── cmd/
│ │ │ ├── run_keyboard.py ← główna komenda
│ │ │ ├── scripted_repl.py ← REPL z klawiatury
│ │ │ ├── brainaccess_sanity.py ← test połączenia z BrainAccess
│ │ │ └── demo.py ← legacy demo
│ │ ├── drivers/ ← mock, playback, brainaccess, bioamp, scripted
│ │ ├── blink_detector.py
│ │ └── eeg_headset.py
│ ├── inference/
│ │ ├── pipeline.py ← BCIPipeline łączy wszystko
│ │ └── starter_bci.py ← EEGNet, load_model auto-detekcja
│ └── speller/
│ ├── speller.py ← façade
│ ├── state.py ← state machine (Idle→Writing→Sector→Letter)
│ ├── layout.py ← protokół layoutu
│ ├── static_layout.py ← oryginalny 5×6
│ └── bigram_layout.py ← bigram-adaptive Polski
└── tests/ ← 87 testów