Skocz do zawartości

Przeszukaj forum

Pokazywanie wyników dla tagów 'VICE'.

  • Szukaj wg tagów

    Wpisz tagi, oddzielając przecinkami.
  • Szukaj wg autora

Typ zawartości


Kategorie forum

  • Elektronika i programowanie
    • Elektronika
    • Arduino i ESP
    • Mikrokontrolery
    • Raspberry Pi
    • Inne komputery jednopłytkowe
    • Układy programowalne
    • Programowanie
    • Zasilanie
  • Artykuły, projekty, DIY
    • Artykuły redakcji (blog)
    • Artykuły użytkowników
    • Projekty - DIY
    • Projekty - DIY roboty
    • Projekty - DIY (mini)
    • Projekty - DIY (początkujący)
    • Projekty - DIY w budowie (worklogi)
    • Wiadomości
  • Pozostałe
    • Oprogramowanie CAD
    • Druk 3D
    • Napędy
    • Mechanika
    • Zawody/Konkursy/Wydarzenia
    • Sprzedam/Kupię/Zamienię/Praca
    • Inne
  • Ogólne
    • Ogłoszenia organizacyjne
    • Dyskusje o FORBOT.pl
    • Na luzie

Kategorie

  • Quizy o elektronice
  • Quizy do kursu elektroniki I
  • Quizy do kursu elektroniki II
  • Quizy do kursów Arduino
  • Quizy do kursu STM32L4
  • Quizy do pozostałych kursów

Szukaj wyników w...

Znajdź wyniki, które zawierają...


Data utworzenia

  • Rozpocznij

    Koniec


Ostatnia aktualizacja

  • Rozpocznij

    Koniec


Filtruj po ilości...

Data dołączenia

  • Rozpocznij

    Koniec


Grupa


Imię


Strona


TempX

Znaleziono 2 wyniki

  1. Dzisiaj taki faktycznie mały projekcik, zrealizowany (nie licząc czasu druku) w dwa popołudnia. Od pewnego czasu chodzi za mną małe, przenośne ustrojstwo oparte na RPi, czyli taka przenośna linuksowa konsolka. No - ale sama konsolka byłaby za nudna, warto by było coś tam ciekawego zainstalować... nawet się nie zastanawiałem, i wybrałem emulator VICE. Trochę miałem problemów, ale całość ładnie ruszyła (ekran ST7789 320x240, dźwięk I2S, nad zasilaniem jeszcze się namyślam), ale jeśli już emulacja C64 to przydałby się jakiś joystick (na podłączonej mini-klawiaturze od biedy da się pisać, ale o graniu można zapomnieć). Kupno raczej nie wchodziło w grę, poza tym konsolka ma być mała, a taki Quickshot byłby pewnie co najmniej tak duży jak ona... a chciałem żeby to był0o naprawdę małe, ale jednocześnie używalne. Tak więc trzeba było zajrzeć do swoich rupieci. I co przydatnego znalazłem: Wemos LOLIN32 Lite Joystick analogowy Waveshare (PSP1000) Akumulator 1200 mAh I oczywiście jakieś pstryczki, przełączniki i tym podobne drobiazgi, Zacząłem oczywiście od sprawdzenia sposobu komunikacji joysticka z konsolką. Od razu założyłem, że nie ma tam być żadnych kabli - najprostsze było połączeniu BLE. Po kilku próbach doszedłem do wniosku, że joystick będzie po prostu udawać drugą klawiaturę i użyję klawiszy które nie są zmapowane na klawiaturę C64. No i po paru próbach wyszło mi coś takiego: Urządzenie sprawdza się nadspodziewanie dobrze, przynajmniej w prostych grach. Jedynym problemem były ostre krawędzie w pierwszej wersji obudowy, utrudniające wygodne trzymanie. Kod jest krótki (niecałe 200 linii) więc zamieszczam go w całości: #include <BleKeyboard.h> #include <Bounce2.h> BleKeyboard bleKeyboard("BlueShot-I"); const uint8_t led_pin = 33; const uint8_t key1_pin = 27; const uint8_t key2_pin = 26; const uint8_t fire_pin = 25; const uint8_t x_pin=39; const uint8_t y_pin=36; Bounce AfButton=Bounce(), TfButton=Bounce(), FiButton=Bounce(); bool autoFire=false; uint32_t fireDelays[]={220, 150, 100, 70, 50, 500, 330}; const int fireDelayCnt = sizeof(fireDelays) / sizeof(fireDelays[0]); int fireDelayNo = 0; uint32_t fireTimer; uint32_t ledTimer; void setup() { Serial.begin(115200); pinMode(led_pin, OUTPUT); digitalWrite(led_pin,1); pinMode(fire_pin, INPUT_PULLUP); AfButton.attach(key1_pin, INPUT_PULLUP); TfButton.attach(key2_pin, INPUT_PULLUP); FiButton.attach(fire_pin, INPUT_PULLUP); AfButton.interval(30); TfButton.interval(30); FiButton.interval(10); bleKeyboard.begin(); ledTimer = millis(); } int keys[2][5]={ {KEY_NUM_8, KEY_NUM_2, KEY_NUM_4, KEY_NUM_6, KEY_NUM_0}, {KEY_NUM_SLASH, KEY_NUM_ASTERISK, KEY_NUM_PLUS, KEY_NUM_MINUS,KEY_NUM_PERIOD}}; uint8_t keySet=0; uint8_t lastKeys,thisKeys; int autoFirePos(int fire) { static int lastFire = 0; static bool fireState = false; if (!fire) { lastFire=0; return 0; } if (!lastFire) { fireTimer = millis(); fireState=true; lastFire = 1; } else if (millis() - fireTimer >= fireDelays[fireDelayNo]) { fireState = !fireState; fireTimer=millis(); } return fireState; } int xRead(int pin) { int i,sum; for (i=sum=0;i<32;i++) sum+=analogRead(pin); return sum /32; } #define BIT_JU 1 #define BIT_JD 2 #define BIT_JL 4 #define BIT_JR 8 static uint8_t dirbits[]={ BIT_JR,BIT_JR+BIT_JD, BIT_JD, BIT_JD+BIT_JL, BIT_JL, BIT_JL+BIT_JU, BIT_JU, BIT_JU+BIT_JR}; int readDirection() { int x=xRead(x_pin)-1800; int y=xRead(y_pin)-1800; int w=sqrt(x*x+y*y); if (w < 900) return 0; float a = atan2(y,x) * (4.0/PI) + 4.0625; w=(int)a; return dirbits[w & 7]; } void addKey (KeyReport *kr, uint8_t key) { int i; if (key >= 136) key -= 136; else if (key >= 128) { kr->modifiers |= 1 << (key & 7); return; } for (i=0;i<6;i++) if (!kr->keys[i]) { kr->keys[i] = key; break; } } enum { LEDCTL_NONE=0, LEDCTL_AUTOFIRE, LEDCTL_KEYSET}; uint8_t ledStatus; uint8_t ledControl=0; uint32_t ledControlTimer; void loop() { TfButton.update(); AfButton.update(); FiButton.update(); if (AfButton.rose()) { if (AfButton.previousDuration() > 400) { keySet = 1 - keySet; ledControl = LEDCTL_KEYSET; ledControlTimer = millis(); } else autoFire = !autoFire; } if (TfButton.fell()) { if (ledControl == LEDCTL_AUTOFIRE) fireDelayNo = (fireDelayNo + 1) % fireDelayCnt; else ledControl=LEDCTL_AUTOFIRE; ledControlTimer = millis(); } bool afToLed=false; if(bleKeyboard.isConnected()) { int i,fr; KeyReport kr; thisKeys=0; memset((void *)&kr,0,sizeof(kr)); thisKeys=readDirection(); fr=!FiButton.read(); if (fr) ledControl = LEDCTL_NONE; if (autoFire) { if (fr) afToLed = true; fr=autoFirePos(fr); } if (afToLed) ledStatus = fr; else ledStatus = millis() - ledTimer <= 50; if (fr) thisKeys |= 1<<4; if (thisKeys != lastKeys) { for (i=0; i<5; i++) if (thisKeys & (1<<i)) addKey(&kr,keys[keySet][i]); lastKeys = thisKeys; bleKeyboard.sendReport(&kr); delay(10); } } else { ledStatus = millis() - ledTimer >= 100; } uint32_t delta ; switch(ledControl) { case LEDCTL_KEYSET: delta = (millis() - ledControlTimer)/150; if (delta >= 24) ledControl = LEDCTL_NONE; else { static uint8_t pls[2][8] = { {1,0,1,1,1,0,0,0}, {1,1,1,0,1,0,0,0}}; ledStatus = pls[keySet][delta & 7]; } break; case LEDCTL_AUTOFIRE: delta= millis() - ledControlTimer; if (delta >= 3000) ledControl = LEDCTL_NONE; else { delta /= fireDelays[fireDelayNo]; ledStatus = delta & 1; } break; } digitalWrite(led_pin, ledStatus); if (autoFire) { if (millis() - ledTimer >= 500) ledTimer = millis(); } else { if (millis() - ledTimer >= 1000) ledTimer = millis(); } } Potrzebne biblioteki: stara dobra Bounce2 i ESP32-BLE-Keyboard. Fragment pliku sdl-vicerc dla c64: KeySet1North=264 KeySet1East=262 KeySet1South=258 KeySet1West=260 KeySet1Fire=256 KeySet2North=267 KeySet2East=269 KeySet2South=268 KeySet2West=270 KeySet2Fire=266 Ciekawsze możliwości: Autofire (oczywiście włączany na żądanie) z regulowaną częstotliwością (7 możliwości od 1 do 10 Hz), zsynchronizowany z przyciskiem fire (tzn. wciśnięcie fire od razu oddaje pierwszy strzał) Możliwość przełączenia zestawu klawiszy (w praktyce przy odpowiednim skonfigurowaniu x64 pozwala to na szybkie przełączanie portów). Pojedyncza dioda w czytelny sposób podaje stan połączenia BLE, włączenie i częstotliwość autofire oraz numer zestawu klawiszy. Schematu nie podaję bo jest trywialny - praktycznie wszystko wynika z kodu. Będę chciał tam jeszcze jakoś zmieścić gniazdo DB9 (żeby można było Quickshota podłączyć albo inną stalową wajchę), w programie to dołączenie raptem paru linijek w funkcji readDirection. Jakby ktoś miał jakieś pomysły - bardzo proszę o komentarz.
  2. Swego czasu pokazywałem tu już joystick do Vice. Powiem tak: sprawdził się, idealny do grania w podróży czy w barze. Niestety - ma swoje wady. Przede wszystkim analogowy joystick nie daje "wyczucia". Poza tym zmiana konfiguracji wymagałaby przekompilowania programu - postanowiłem zrobić jego następcę. Tak więc przedstawiam: BlueShot-II Założenia były proste: Pełnowymiarowy mechanizm wraz z dwoma przyciskami Fire Symulowanie wciśnięć konkretnych klawiszy na klawiaturze BLE (najprostsza i chyba najlepsza forma emuuacji joysticka dla emulatora Vice) Prosty w obsłudze autofire Możliwość szybkiej zmiany podstawowych parametrów (port, zestawy klawiszy, parametry startowe autofire itp) Możliwość zaprogramowania kilku presetów. Zasilanie z akumulatora z możliwością podłączenia kabla USB do naładowania I co najważniejsze - jak najniższa cena. O konstrukcji mechanicznej nie ma co się rozpisywać. To zwykły chiński mechanizm i dwa typowe przyciski. Zresztą - jeśli ktoś będzie bardzo chciał (w co wątpię) mogę opublikować pliki stl i scad. Ciekawsza natomiast jest elektronika. Sercem urządzenia jet płytka ESP32 - Lolin32 Lite. Ponieważ ma możliwość podłączenia akumulatorka, na pokładzie ma ładowarkę a przede wszystkim cena poniżej 20 PLN z dostawą następnego dnia jest raczej atrakcyjna - wybór był chyba naturalny. Do programowania służą trzy klawisze: PORT - krótkie wciśnięcie pokazuje który port symuluje w danej chwili joystick. Przytrzymanie powyżej pół sekundy to zmiana portu AUTOFIRE - krótkie wciśnięcie to włączenie/wyączenie autofire, przytrzymanie to zmiana okresu (od 100 to 1000 msec). PROGRAM - krótkie wciśnięcie zmienia bieżące parametry, przytrzymanie włącza edycję głównych opcji. Dwie diody służą do pokazania stanu. Dioda AUTOFIRE pali się cały czas jeśli autofire jest wyłączony, migocze jeśli autofire jest włączony zgodnie z ustawionym okresem. Dioda BLE pali się jeśli joystick jest połączony z hostem, migocze z częstotliwością 1 HZ jeśli nie. Trzecia możlliwość (krótkie błyski raz na sekundę) oznaczają pracę w trybie Serial (o tym później). Dodatkowo mały wyświetlacz OLED 128x32 służy do wyświetlania różnych ważnych informacji - np. bieżącego portu, stanu autofire - oraz jako monitor przy programowaniu. Do elektroniki dochodzi jeszcze mała pamięć EEPROM (nie chciałem ryzykować, bo zapisy mogą być dość częste i poleganie na bibliotece Preferences mogłoby - choć to mało prawdopodobne - skończyć się smętnie). Ponieważ pamięć typu 24C01 kosztowała mnie poniżej złotówki - po prostu podkleiłem ją (obudowa SOT-8 jest raczej płaska) kropelką pod spodem Lolina i przylutowałem kynarem do pinów. Jako że ESP32 pozwala na dużą dowolność jeśli chodzi o przydział pinów - postarałem się, aby te podłączone do konkretnych elementów znalazły się obok siebie (np. joystick i klawisze Fire podłączone są do sześciu kolejnych pinów ESP, podobnie reszta). Zresztą - układ połączeń (no, ciężko to nazwać schematem ale powinno być zrozumiałe) wygląda tak: Wyjaśnię od razu jedną rzecz. Ponieważ gniazdo akumulatora jest umieszczone dość niewygodnie, podlutowałem po prostu przewody akumulatora bezpośrednio do płytki, w tym miejscu: Teoretycznie powinienem w ogóle usunąć gniazdo akumulatora - ale po pierwsze w niczym mi ono nie przeszkadza, a możliwe jest jego wysłonięcie odpowiednio modyfikując obudowę. Wracając do pinów - takie rozmieszczenie pozwoliło mi po prostu wlutować gniazda bezpośrednio do płytki, bez konieczności projektowania i trawienia PCB. Szerokość obudowy jest wystarczająca, aby można było zastosować takie gniazda kątowe. Przejdę więc do programu. Przełączenie za pomocą klawiszy Port lub Autofire powoduje zapis do EEPROM -u (po starcie ostwarzany jest ostatni stan). Możliwości bieżących ustawień są następujące: Port - 1 lub 2 Autofire - włączenie / wyłączenie Autofire mode - still (działa cały czas) lub press (strzelanie seriami) Autofire period - okres powtarzania: 100, 150, 200, 250, 300, 400, 500, 650, 800 lub 1000 msec Swap fire - zamiana Fire i Fire2 (jeśli Fire2 jest w zestawie klawiszy) Keyset1 - wybrany jeden z siedmiu zaprogramowanych zestawów (Numpad i sześć programowalnych) dla portu 1 Keyset2 - to samo dla portu 2 Dirs - 8 lub 4 kierunki. W trybie 4 kierunków pozycje pośrednie nie (np Up-Right) nie są przekazywane, w ich miejsce jest przekazywana ostatnia z pozycji (w tym przypadku Up lub Right). Name - jedna z dwóch nazw pod którymi przedstawia się joystick. Copy from - skopiowanie ustawień z jednego z 5 programowapnych presetów. Wciśnięcie klawisza PROGRAM spowoduje zapisanie opcji do EEPROM-u. Wciśnięcie Fire2 oznacza anulowanie operacji. Możliwości ustawień głównych opcji to: Keyset (1 lub 2): ustawienie klawiszy przypisanych do joysticka. Można ustawić 4 (tylko podstawowe kierunki) lub 8 (również kierunki pośrednie). Jeśli pośredni kierunek nie będzie ustawiony, joystick zasymuluje wciśnięcie dwóch klawiszy (np. Up i Right). Jeśli Fire2 nie będzie zaprogramowany, będzie działać po prostu jak równoległy przycisk Fire. Name (1 lub 2) - możliwość ustawienia obu nazw. Maksymalna długość to 15 znaków (litery, cyfry, podkreślnik, myślnik, spacja) Preset (1 do 5) - predefiniowany zestaw opcji. Opcje są identyczne jak w bieżących ustaawieniach, tyle że zamiast "skopiuj z presetu" jest "skopiuj bieżące ustawienia". Dodatkowo istnieje możliwość zaprogramowania nazwy presetu (max 4 znaki). STORE - zapisanie do EEPROM-u CANCEL (lub Fire2) anulowanie operacji. Klawisze Port i Autofire mają jeszcze jedną funkcję: wciśnięcie obu na ponad pół sekundy spowoduje przejście wyświetlacza i mikrokontrolera w stan uśpienia. Przydaje się to przy ładowaniu akumulatora (wyłącznik musi być w pozycji "włączony") - mikrokontroler i wyświetlacz praktycznie w porównaniu z prądem ładowania nie pobierają prądu. Wyjście ze stanu uśpienia poprzez wciśnięcie Fire. Mógłbym na tym zakończyć: kompletny kod jest w załączniku, potrzebne są dodatkowe biblioteki dla Arduino: Bounce2 (z managera bibliotek) ESP32-BLE-Keyboard (z githuba: https://github.com/T-vK/ESP32-BLE-Keyboard) I2C-EEPROM (z managera bibliotek) Adafruit_SSDF1306 i Adafruit_GFX (z managera bibliotek) Skompilowany program zapewne będzie działać, ale można działanie poprawić. W tym celu należy: z biblioteki Bounce2 skopiować do folderu szkicu pliki Bounce2.h i Bounce2.cpp W pliku Bounce2.cpp odkomentować linię: //#define BOUNCE_WITH_PROMPT_DETECTION Najlepiej zrobić to przed pierwszą kompilacją programu, aby builder Arduino nie próbował użyć biblioteki z cache. Powinno to poprawić szybkość reakcji joysticka. Niestety - jest tu pewna niedogodność: nie można podłączyć joysticka do komputera, który nie ma BlueTooth. Oczywiście jedną z opcji jest dokupienie dongla, ale przynajmniej w przypadku Linuksa znalazłem rozwiązanie. Uruchomiony na Linuksie programik joyport.py zamieni przychodzące przez serial numery klawiszy na odpowiednie kody i "wstrzyknie" je do kolejki zdarzeń. Jako parametr można podać urządzenie (np. /dev/ttyUSB0) lub identyfikator USB (prawdopodobnie będzie to 1A86:7523). Joystick wwykryje uruchomienie drivera i odpowiednio zareaguje - zasygnalizuje błyskami diody podłąćzenie Serial, wyśle przez bluetooth informację "wszystkie klawisze puszczone" i dopóki driver będzie uruchomiony, nie będzie przekazywać nic na bluetooth. Do uruchomienia programu potrzebne są moduły python3-serial i python3-evdev (nie są instalowane domyślnie, ale można je doinstalować np. przez apt). I to by było na tyle. Źródła programu i program w załączniku: vicestk.zip W razie pytań jestem do dyspozycji - ale teraz muszę kończyć bo Giana czeka! 🙂
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.