Приставки > Джойстики и прочие манипуляторы
Восстановление геймпада (клона) от Sega Mega Drive 2
(1/1)
SEGA-man:
Имею стародельный геймпад, то есть шестикнопочный клон для Sega MD2 и как часто бывает с этими клонами с каплей - он перестал работать.
Я проерил провод и он звонится нормально, то есть провода целые и на удивление качественные (как телефонные).
У Hotpixel на гитхабе заметил интересный проект где он сделал переходник для мыши, с использованием arduino nano.
Я понимаю что arduino nano не совсем будет подходить, а вот если RPi-Zero ??
Может кто имел дело с таким?

Добавлено позже:
Вот еще нашел интересную статью, где человек восстанавливает геймпад при помощи atmega8
https://dzen.ru/a/Y4HEsPHGXi7GqIZL

Добавлено 9 ноября 2025 года:
Может кому-то довелось скачать код для атмеги8 из этой статьи: https://dzen.ru/a/Y4HEsPHGXi7GqIZL

Очень хочется глянуть.
В итоге написал Алексею (кластеру), который порекомендовал писать на C для Raspberry Pi Zero.
Скорее всего плата разбери попадет мне в руки только в след году, поэтому хотелось попросить мож у кого есть свои наработки на этот счет.
Думаю много людей захотят таким образом воостановить свои старые джойстики)
Фамиклон:

--- Цитата: SEGA-man от 09 Ноябрь 2025, 20:41:20 ---Думаю много людей захотят таким образом воостановить свои старые джойстики
--- Конец цитаты ---
А оно того стоит? С трехкнопочным проблем вроде нет, а если у кого вдруг поломался супер-пупер хороший джой о шести кнопках, проще выпилить каплю с рабочего китайского донора.
SEGA-man:
Думаю стоит, выпиливать каплю и резать текстолит зачем? Еще надо рабочую плату найти.
А так, купил на алишке разбери зеро за 150р, залил код и запаял вместо капли.
Тем более, что эта проблема, когда капля отмирает частая, и думаю многим пригодится решение на разбери зеро судя по посту в Дзене :)
Фамиклон:

--- Цитата: SEGA-man от 20 Ноябрь 2025, 21:21:54 ---Тем более, что эта проблема, когда капля отмирает частая, и думаю многим пригодится решение на разбери зеро судя по посту в Дзене :)
--- Конец цитаты ---
Про Дзен конечно улыбнуло. Не буду говорить о том, что по многим авторам статей там клиника плачет, но, тут у нас 30 подписчиков, 600 просмотров за три года. А точно падёж джоев прям массовая проблема? Совершенно ничего не имею против энтузиазма во всех проявлениях, но с практичной точки зрения человек всегда выберет наиболее простой и доступный вариант.

--- Цитата: SEGA-man от 20 Ноябрь 2025, 21:21:54 ---Еще надо рабочую плату найти.
--- Конец цитаты ---
На Али примерно от 350 рубасов, мне кажется, не так уж велика цена.
Nhisti:
Я бы понял так заморачиваться с оригинальным контроллером, они нынче стоят как чугунный мост, особенно шестикнопочники, тут же проще новый купить.
SEGA-man:

--- Цитата: Фамиклон от 21 Ноябрь 2025, 19:47:54 ---На Али примерно от 350 рубасов, мне кажется, не так уж велика цена.

--- Конец цитаты ---

Так я ж видел качество этих джойстиков и могу сравнить новодельный клон и стародельный. Стародельные клоны, как в моем случае, часто имели хорошие провода и крестовину.


Добавлено позже:

--- Цитата: SEGA-man от 23 Ноябрь 2025, 00:13:52 ---Так я ж видел качество этих джойстиков и могу сравнить новодельный клон и стародельный. Стародельные клоны, как в моем случае, часто имели хорошие провода и крестовину.

--- Конец цитаты ---
ну вот тебе и юзкейс, как говорится) Сможешь восстановить оригинальный джой. А я в данном случае хочу восстановить хороший клон
Фамиклон:

--- Цитата: SEGA-man от 23 Ноябрь 2025, 00:13:52 ---Так я ж видел качество этих джойстиков и могу сравнить новодельный клон и стародельный. Стародельные клоны, как в моем случае, часто имели хорошие провода и крестовину.
--- Конец цитаты ---
Дык я ж не предлагаю на замену, я предлагаю в качестве донора капли, секрет которой известен сеговцам и китайцам.
Sanyameloman:

--- Цитата ---А я в данном случае хочу восстановить хороший клон
--- Конец цитаты ---

По-моему, на том же "Водолее" продаются в том числе и хорошие платы для хороших клонов. Но, опять же - безумству храбрых поём мы песню :)
Только внимательно и проверять лучше на чём-нибудь, что не так жалко будет ежели что)
SEGA-man:
О чем вообще разговор? Ну покупайте эти платы и пилите текстолит сами. Зачем тут это флуд?
Sanyameloman:

--- Цитата: SEGA-man от 05 Декабрь 2025, 21:08:32 ---Ну покупайте эти платы и пилите текстолит сами. Зачем тут это флуд?
--- Конец цитаты ---
Может, из-за того, что название данной темы носит общий характер, а не сфокусировано только на восстановлении геймпада Атмегой, "Малиной" или чем-то ещё? :)
Люди предлагают варианты - изощрённые, конечно, но вполне логичные (для поставленной задачи) и экономичные.
Я же платы предлагал не для пилежа, а для полноценной замены неисправной (те платы такого же размера).
Лично мне интересно найти "вундермикруху", как на фото внизу. Плата из относительно свежего джоя для мега драйва, но в дизайне Сега Сатурн (даже вторую кнопку Mode сделали :biggrin:).
Поиск по обозначению на этом чипе ничего не дал - а жаль... А ведь такая микруха могла бы решить и вашу проблему (если, конечно, у вас не стоит задача восстановить геймпад именно путём программирования микроконтроллера/микрокомпьютера).
DaemoniX:
Такая микра и в геймпадах с переключателем на турбо была, но сейчас и там ничтожный шанс её найти, если брать новым. Только если на барахолках поиграть в лотерею.
Да и в обычных с надписью 16-bit могла попадаться.
Sanyameloman:

--- Цитата: DaemoniX от 06 Декабрь 2025, 10:58:20 ---Такая микра и в геймпадах с переключателем на турбо была
--- Конец цитаты ---
Что любопытно, применимо к шестикнопочному джою мега драйва нигде не нашёл полноценного решения на элементной базе - везде попадаются какие-то оговорки и "нюансы". Либо решения для трёхкнопочного джоя, либо для шестикнопочного с кучей логики, который при всём при этом может неадекватно работать с "трёхкнопочными" играми (схема внизу с доп. переключателем - сам не проверял). Хотя, казалось бы, для той же сеги сатурн, как выяснилось, проблема решается всего двумя 74HC153.
Nhisti:

--- Цитата: Sanyameloman от 06 Декабрь 2025, 22:23:31 ---может неадекватно работать с "трёхкнопочными" играми
--- Конец цитаты ---
Именно для этого и существует кнопка Mode
Sanyameloman:

--- Цитата: Nhisti от 07 Декабрь 2025, 16:09:17 ---Именно для этого и существует кнопка Mode
--- Конец цитаты ---
Вот по идее да - для запуска той же Golden Axe надо зажать MODE перед включением питания приставки, чтоб включить трёхкнопочный режим. Прям хоть проверь схемку-то :D
(И да: ясень пень, что китайщину так восстанавливать нафиг не надо - чисто "научный" интерес так сказать :))
RafGul:

--- Цитата: DaemoniX от 06 Декабрь 2025, 10:58:20 ---Такая микра и в геймпадах с переключателем на турбо была, но сейчас и там ничтожный шанс её найти, если брать новым. Только если на барахолках поиграть в лотерею.
Да и в обычных с надписью 16-bit могла попадаться.

--- Конец цитаты ---

У этой микросхемы пины не совпадают с выводами 315-5638, кнопки x, y, z, A, B, C замыкаются с землёй ч/з сопротивление 3,3кОм. Версия с турбо имеется ввиду.
RafGul:

--- Цитата: SEGA-man от 09 Ноябрь 2025, 20:41:20 ---Может кому-то довелось скачать код для атмеги8 из этой статьи: https://dzen.ru/a/Y4HEsPHGXi7GqIZL

--- Конец цитаты ---

Автор обновил ссылку!
На всякий случай:
SEGA-man:
Да, обновил но я чет не разобрался со сборкой, поэтому через ИИ сделал кода на Си.
Прикрепил архив с файлом.

У меня пока нет возможности его затестить, но может кто попробует и отпишет?
Он совместим с atmega88
SEGA-man:
Прочитав статьи по данной тематике, как например здесь и при помощи ИИ, мне удалось написать код на С который легко можно залить через Arduino Nano по SPI.
Для разработки и заливки решил использовать Platformio. Теперь хочется ревью от более опытного программиста, кто мог бы указать на баги.

--- Код: ---/*
 * Sega Mega Drive / Genesis controller
 * 3-button + proper 6-button extension
 *
 * MCU: ATmega8 / ATmega88
 * Clock: 8 MHz (internal)
 */

#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdbool.h>
#include <stdint.h>

/* ================= Sega DB9 mapping =================
 *
 * PD2  UP / X
 * PD3  DOWN / Y
 * PD4  LEFT / Z
 * PD5  RIGHT / MODE
 * PD6  A / B
 * PD7  START / C
 *
 * PB7  TH / SELECT (input from console)
 *
 * All outputs are ACTIVE LOW
 */

/* ================= Button source =================
 * Replace these macros with your real button inputs
 * Note: Buttons are assumed to be active-low (pressed = LOW)
 */
#define BTN_UP()     ((PINB & (1 << PB0)) == 0)
#define BTN_RIGHT()  ((PINB & (1 << PB1)) == 0)
#define BTN_DOWN()   ((PINB & (1 << PB2)) == 0)
#define BTN_LEFT()   ((PINB & (1 << PB3)) == 0)
#define BTN_START()  ((PINB & (1 << PB4)) == 0)
#define BTN_A()      ((PINB & (1 << PB5)) == 0)
#define BTN_B()      ((PINC & (1 << PC0)) == 0)
#define BTN_C()      ((PINC & (1 << PC4)) == 0)
#define BTN_MODE()   ((PINC & (1 << PC5)) == 0)
#define BTN_X()      ((PINC & (1 << PC3)) == 0)
#define BTN_Y()      ((PINC & (1 << PC2)) == 0)
#define BTN_Z()      ((PINC & (1 << PC1)) == 0)


/* ================= Internal state ================= */

static volatile uint8_t phase = 0;
static volatile uint8_t isSix = 0;
static volatile uint8_t prevTH = 1;
static volatile uint8_t idleTicks = 0;

/* ================= Helpers ================= */

static inline void writeLo(uint8_t pin)
{
    PORTD &= ~(1 << pin);
}

static inline void writeHi(uint8_t pin)
{
    PORTD |= (1 << pin);
}

static inline uint8_t th_level(void)
{
    return (PINB & (1 << PB7)) ? 1 : 0;
}

/* ================= Timer0 overflow (~1 ms) ================= */

#if defined(__AVR_ATmega8__)
ISR(TIMER0_OVF_vect)
#else
ISR(TIMER0_COMPA_vect)
#endif
{
    /* Increment idleTicks atomically */
    uint8_t ticks = idleTicks;
    ticks++;
    idleTicks = ticks;

    if (ticks > 12) {
        /* Disable interrupts to prevent race condition with main loop */
        cli();
        phase = 0;
        isSix = 0;     /* fallback to 3-button */
        sei();
    }
}

/* ================= TH polling ================= */

static inline void sega_poll_th(void)
{
    uint8_t th = th_level();

    if (th != prevTH) {
        prevTH = th;
        idleTicks = 0;

        /* Disable interrupts to prevent race condition with ISR */
        cli();
        uint8_t p = phase;
        if (++p >= 8) {
            p = 0;
            isSix = 1;   /* successful 6-button detect */
        }
        phase = p;
        sei();
    }
}

/* ================= Sega output ================= */

static inline void sega_output(void)
{
    uint8_t th = th_level();

    /* release all lines */
    writeHi(PD2); writeHi(PD3); writeHi(PD4);
    writeHi(PD5); writeHi(PD6); writeHi(PD7);

    /* ---------- 3 BUTTON MODE ---------- */
    if (!isSix) {
        if (th) {
            BTN_B() ? writeLo(PD6) : writeHi(PD6);
            BTN_C() ? writeLo(PD7) : writeHi(PD7);
        } else {
            BTN_UP()    ? writeLo(PD2) : writeHi(PD2);
            BTN_DOWN()  ? writeLo(PD3) : writeHi(PD3);
            BTN_LEFT()  ? writeLo(PD4) : writeHi(PD4);
            BTN_RIGHT() ? writeLo(PD5) : writeHi(PD5);
            BTN_A()     ? writeLo(PD6) : writeHi(PD6);
            BTN_START() ? writeLo(PD7) : writeHi(PD7);
        }
        return;
    }

    /* ---------- 6 BUTTON MODE ---------- */
    switch (phase) {

    case 0:
    case 1:
    case 2:
        if (!th) {
            BTN_UP()    ? writeLo(PD2) : writeHi(PD2);
            BTN_DOWN()  ? writeLo(PD3) : writeHi(PD3);
            BTN_LEFT()  ? writeLo(PD4) : writeHi(PD4);
            BTN_RIGHT() ? writeLo(PD5) : writeHi(PD5);
        }
        break;

    case 3:
        if (th) {
            BTN_B() ? writeLo(PD6) : writeHi(PD6);
            BTN_C() ? writeLo(PD7) : writeHi(PD7);
        } else {
            BTN_A()     ? writeLo(PD6) : writeHi(PD6);
            BTN_START() ? writeLo(PD7) : writeHi(PD7);
        }
        break;

    case 4:
        /* 6-button ID phase */
        writeLo(PD2); writeLo(PD3);
        writeLo(PD4); writeLo(PD5);
        break;

    case 5:
        if (!th) {
            BTN_X()    ? writeLo(PD2) : writeHi(PD2);
            BTN_Y()    ? writeLo(PD3) : writeHi(PD3);
            BTN_Z()    ? writeLo(PD4) : writeHi(PD4);
            BTN_MODE() ? writeLo(PD5) : writeHi(PD5);
        }
        break;

    case 6:
    case 7:
        /* These phases are not used in 6-button mode output */
        /* Controller should be idle during these phases */
        break;
    }
}

/* ================= Main ================= */

int main(void)
{
    /* Disable ADC (digital I/O only) */
    ADCSRA &= ~(1 << ADEN);

    /* PD2–PD7 outputs */
    DDRD |= (1 << PD2) | (1 << PD3) | (1 << PD4) |
            (1 << PD5) | (1 << PD6) | (1 << PD7);

    /* TH input (PB7) - no pull-up needed, console drives it */
    DDRB &= ~(1 << PB7);
   
    /* Button inputs: PB0-PB5 */
    DDRB &= ~((1 << PB0) | (1 << PB1) | (1 << PB2) | (1 << PB3) | (1 << PB4) | (1 << PB5));
    PORTB |= (1 << PB0) | (1 << PB1) | (1 << PB2) | (1 << PB3) | (1 << PB4) | (1 << PB5);  /* Enable pull-ups */
   
    /* Button inputs: PC0-PC5 */
    DDRC &= ~((1 << PC0) | (1 << PC1) | (1 << PC2) | (1 << PC3) | (1 << PC4) | (1 << PC5));
    PORTC |= (1 << PC0) | (1 << PC1) | (1 << PC2) | (1 << PC3) | (1 << PC4) | (1 << PC5);  /* Enable pull-ups */

#if defined(__AVR_ATmega8__)
    /* ---------- ATmega8 : Timer0 overflow ---------- */
    /* F_CPU = 8 MHz
     * Prescaler = 64
     * Overflow period ≈ 2.048 ms
     * idleTicks > 12 gives ~24.6 ms timeout
     */

    TCCR0 = (1 << CS01) | (1 << CS00);   /* clk/64 */
    TCNT0 = 0;                           /* initialize counter */
    TIMSK |= (1 << TOIE0);               /* enable overflow interrupt */
#elif defined(__AVR_ATmega88__) || defined(__AVR_ATmega88A__) || defined(__AVR_ATmega88PA__)
    /* ---------- ATmega88 / ATmega88A / ATmega88PA / ATmega88PB ---------- */
    /* F_CPU = 8 MHz
    * Prescaler = 64
    * OCR0A = 124 → 1 ms
    */

    TCCR0A = (1 << WGM01);               /* CTC */
    TCCR0B = (1 << CS01) | (1 << CS00);  /* clk/64 */
    TCNT0  = 0;                          /* initialize counter */
    OCR0A  = 124;
    TIMSK0 = (1 << OCIE0A);
#endif

    sei();

    while (1) {
        sega_poll_th();
        sega_output();
    }
}
--- Конец кода ---
Навигация
Главная страница сообщений

Перейти к полной версии