User Tag List

Показано с 1 по 10 из 14

Тема: Джойстик от денди.

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #14

    Регистрация
    11.05.2019
    Адрес
    г. Углич
    Сообщений
    89
    Спасибо Благодарностей отдано 
    14
    Спасибо Благодарностей получено 
    3
    Поблагодарили
    3 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Всех С Наступающим!

    В свете выхода новой игры Delta's Shadow имеющей возможность использования 8-ми кнопочного Kempston, возникло желание задействовать в своём Пентагоне ранее свободные линии этого интерфейса. А дабы не встраивать в корпус разъём DB9 решил подключить джойстик Dendy через переходник DB9 -> ОНЦ-ВГ-4-5-16В и плату Arduino Nano. В инете нашёл несколько примерно одинаковых скетчей считывающих данные о нажатие кнопок и отправляющих готовый байт в COM порт, собственно на их базе и был написан мой вариант скетча. К слову, ни один из скетчей не заработал с продающимися в магазинах новодельными джойстиками для Dendy, просматривая сигналы на логическом анализаторе понял, что необходима пауза в 10-20мс между пакетами сигналов Clock и Latch, с добавленной задержкой между опросами джойстик начал выдавать биты состояния кнопок. Что бы не отвыкать от привычного управления ( в Delta's Shadow на кнопке "Огонь" стоит "Прыжок") сделал две переключаемых конфигурации кнопок, переключение между ними комбинациями кнопок: "START" + "Вверх" обратное переключение "START" + "Вниз". Схема подключения я думаю будет понятна из комментариев в скетче.

    Скрытый текст

    #include <Arduino.h>

    const int data = 2;
    const int latch = 3;
    const int clock = 4;

    const int TICK = 12;
    bool up1=true;
    bool up2=true;
    bool mode=false; // переключатель конфигурации джойстика

    void init_joystick(int data, int latch, int clock)
    {
    pinMode(data, INPUT);
    pinMode(clock, OUTPUT);
    pinMode(latch, OUTPUT);
    pinMode(5, OUTPUT); // D4 кнопка А
    pinMode(6, OUTPUT); // D5 кнопка B
    pinMode(7, OUTPUT); // D6 кнопка C
    pinMode(8, OUTPUT); // D7 кнопка START
    pinMode(9, OUTPUT); // D3 кнопка вверх
    pinMode(10, OUTPUT); // D2 кнопка вниз
    pinMode(11, OUTPUT); // D1 кнопка влево
    pinMode(12, OUTPUT); // D0 кнопка вправо


    digitalWrite(clock, HIGH);
    }

    int get_keys_state_joystick(int data, int latch, int clock)
    {


    digitalWrite(latch, LOW);
    digitalWrite(clock, LOW);

    digitalWrite(latch, HIGH);
    delayMicroseconds(TICK);
    digitalWrite(latch, LOW);

    int keys_state = 0;

    for (int i = 0; i < 8; ++i) {



    keys_state += digitalRead(data) * (1 << i);

    digitalWrite(clock, HIGH);
    delayMicroseconds(TICK);
    digitalWrite(clock, LOW);
    delayMicroseconds(TICK);


    }

    delayMicroseconds(10000);
    return keys_state;
    }

    void setup()
    {
    init_joystick(data, latch, clock);


    }

    void loop()
    {

    int bit_STATE = get_keys_state_joystick(data, latch, clock);

    if ( bitRead((bit_STATE), 4)!=true & bitRead((bit_STATE), 3)!=true)

    {
    mode= true;
    }

    if ( bitRead((bit_STATE), 3)!=true & bitRead((bit_STATE), 5)!=true)

    {
    mode= false;
    }




    // кнопка A огонь
    if( bitRead((bit_STATE), 0))
    {
    if ( mode)
    {
    digitalWrite(8, HIGH);

    }
    else
    {
    digitalWrite(5, HIGH);
    }
    }
    else
    {
    if ( mode)
    {
    digitalWrite(8, LOW);

    }
    else
    {
    digitalWrite(5, LOW);
    }

    }



    //кнопка B прыжок c дублированием кнопки вверх если mode не активен

    if( bitRead((bit_STATE), 1))
    {
    if(mode)
    {
    digitalWrite(5, HIGH);

    }
    else
    {
    up2=true;
    }

    }
    else
    {
    if(mode)
    {
    digitalWrite(5, LOW);
    }

    else
    {
    up2 = false;
    }
    }






    //кнопка С смена костюма
    if( bitRead((bit_STATE), 2))
    {
    digitalWrite(6, HIGH);


    }
    else
    {
    digitalWrite(6, LOW);

    }



    // кнопка START пауза/ выход
    if( bitRead((bit_STATE), 3))
    {
    digitalWrite(7, HIGH);


    }
    else
    {
    digitalWrite(7, LOW);

    }



    // кнопка вверх
    if( bitRead((bit_STATE), 4))
    {
    up1=true;


    }
    else
    {
    up1=false;

    }


    if((mode&up1!=true)|(mode!=true&up1!=true|up2!=true ))
    {
    digitalWrite(9, LOW);
    }
    else
    {
    digitalWrite(9, HIGH);
    }


    // кнопка вниз

    if( bitRead((bit_STATE), 5))
    {
    digitalWrite(10, HIGH);


    }
    else
    {
    digitalWrite(10, LOW);

    }

    //кнопка влево
    if( bitRead((bit_STATE), 6))
    {
    digitalWrite(11, HIGH);


    }
    else
    {
    digitalWrite(11, LOW);

    }

    //кнопка вправо
    if( bitRead((bit_STATE), 7))
    {
    digitalWrite(12, HIGH);


    }
    else
    {
    digitalWrite(12, LOW);

    }


    }
    [свернуть]


    Последний раз редактировалось Lapu-Leen; 31.12.2020 в 22:51.
    "Робик"
    "Ленинград 48К"
    "Пентагон-48К"
    "Пентагон-128К" +AY+Kempston+ FDD эмулятор
    "Atari 65XE"+SIO2Arduino+AstartA

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Это Денди?
    от Atari в разделе Nintendo
    Ответов: 19
    Последнее: 25.03.2011, 17:38
  2. Джойстик для MSX
    от geners в разделе MSX
    Ответов: 13
    Последнее: 25.04.2009, 03:20
  3. Джойстик для C64
    от AlexBel в разделе Commodore 16/64/128
    Ответов: 14
    Последнее: 30.11.2008, 20:36

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •