Еще один приемник для геймпадов из RF модуля

Тема в разделе "Xbox 360", создана пользователем arch_saint, 03.07.2016.

  1. arch_saint

    arch_saint Пользователь

    Регистрация:
    21.09.2013
    Сообщения:
    83
    Симпатии:
    15
    Загорелся и я желанием сделать себе приемник для беспроводных геймпадов из RF модуля от толстушки. Покупать ардуину под это дело было бы расточительно (да и не люблю я их), вариант с использованием FT232 у меня не заработал, не хватало скорости порта, так что я решил сделать свою реализацию на AVR, благо контроллеры лежали, да и давно хотелось поизучать их, а изучать на конкретной задаче имхо намного продуктивнее.
    Первым делом сделал мост, который принимал команды по UART и отправлял в RF модуль, немного поигрался с возможностями модуля, даже снял видео с демонстрацией, но стало быстро понятно, что лежащая рядом с модулем здоровая отладочная плата, это мягко говоря неудобно. В закромах были найдены ATTiny13, у которых не оказалось аппаратного уарта, так что решено было пока сделать автономный вариант, а дальше уже будет видно (очень уж привлекает возможность использовать ring of light для вывода уведомлений).



    Для того, чтобы собрать полноценный приемник понадобится:
    1. Собственно сам RF модуль, я использовал модель ревизии F (есть сведения, что у ревизии A меньше радиус приема, а также проблема с совместимость с Windows 8/10)
    2. Микроконтроллер AVR. Подойдет практически любой, я использовал ATTiny13, но скомпилировать прошивку можно и под другие контроллеры, возможно только придется поменять назначение портов в дефайнах, ну и выставить клок в 1 МГц для корректной работы задержек
    3. Линейный стабилизатор на 3.3 вольта, я использовал 1117-33
    4. 2 мелких конденсатора по входу и выходу стабилизатора, я поставил керамику 1 мкФ
    5. 3 резистора по 10 КОм, для подтяжки линий. Вообще здесь номинал не так критичен, можно спокойно брать резисторы от 5 до 20 КОм, все должно работать
    6. Разъем USB-B, или кусок кабеля с разъемом USB-A, или может у вас есть свои предпочтения в способе подключения - выбирайте на свой вкус и цвет.
    7. Монтажный провод, паяльник, программатор, нетрясущиеся руки - все стандартно.

    Схема подключения
    x360reciever.png

    Скомпилированная прошивка под ATTiny13 приютилась в архиве во вложениях

    Исходный код на языке C
    Код:
    #define F_CPU 1000000L
    #include <avr/io.h>
    #include <util/delay.h>
    
    
    //pb1 - sync
    //pb0 - clock
    //pb2 - data
    
    #define DATA 2
    #define CLOCK 0
    #define SYNC 1
    #define DATA_PORT PORTB
    #define DATA_DDR DDRB
    #define CLOCK_PIN PINB
    #define CLOCK_DDR DDRB
    #define SYNC_PIN PINB
    #define SYNC_DDR DDRB
    
    char prev;
    int i;
    
    void sendToRFModule (unsigned char recieved)
    {
        prev = 0xFF;
        DATA_PORT &= ~(1<<DATA); //óñòàíîâêà 0
        for(i = 0; i < 11; i++)
        {
            while (prev == (CLOCK_PIN & (1<<CLOCK))){} //detects change in clock
            prev = CLOCK_PIN & (1<<CLOCK); // should be after downward edge of clock, so send bit of data now
            if (i < 2)
            {
                DATA_PORT &= ~(1<<DATA); //óñòàíîâêà 0
            }
            else
            {
                if (recieved >> 7)
                {
                    DATA_PORT |= 1<<DATA; //óñòàíîâêà 1
                }
                else
                {
                    DATA_PORT &= ~(1<<DATA); //óñòàíîâêà 0
                }
                recieved = recieved << 1;
            }
    
            while (prev == (CLOCK_PIN & (1<<CLOCK))){} //detects upward edge of clock
            prev = CLOCK_PIN & (1<<CLOCK);
        }
        DATA_PORT |= 1<<DATA; //óñòàíîâêà 1
    }
    
    int main(void)
    {
    
        DATA_DDR |= 1<<DATA;   //gpio init
        CLOCK_DDR &= ~(1<<CLOCK); //gpio init
        SYNC_DDR &= ~(1<<SYNC); //gpio init
    
    
        DATA_PORT |= 1<<DATA; //óñòàíîâêà 1
    
        _delay_ms(3500);
    
        sendToRFModule(0x84);
    
        int timer;
        int flag;
    
        while(1)
        {
            if ((SYNC_PIN & (1<<SYNC)) == 0)
            {
                flag = 1;
    
                for (timer = 0; (timer < 400) && (flag); timer++)
                {
                   if (SYNC_PIN & (1<<SYNC))
                   {
                       sendToRFModule(0x04);
                       flag = 0;
                   }
                   _delay_ms(2);
                }
                if (flag)
                {
                    sendToRFModule(0xA9);
                    _delay_ms(4);
                    sendToRFModule(0xB6);
                    _delay_ms(4);
                    sendToRFModule(0x09);
                    _delay_ms(500);
                    sendToRFModule(0xA0);
                    _delay_ms(4);
                    sendToRFModule(0xB0);
                }
                _delay_ms(2000);
            }
        }
    }
    
    Если буден нужен hex под другой микроконтроллер, пишите - сделаю

    Принцип работы очень простой, короткое нажатие на кнопку на модуле - синхронизация, долгое нажатие на кнопку - отключение всех геймпадов.
     

    Вложения:

    • Xreciever13.zip
      Размер файла:
      606 байт
      Просмотров:
      16
    jekakmv, aleksandrych, Tobirg и 2 другим нравится это.
  2. mason

    mason Пользователь

    Регистрация:
    23.09.2015
    Сообщения:
    402
    Симпатии:
    25
    А нет желания усложнить код?
    при подключении питания загорается центральный светик моргнет 2-3 раза(инициализация что у нас все включилось загрузилось) . После того как все отморгалось он ушол в сон(ничего не горит ждет команду).Задержать кнопку все проснулось и запустили бут анимацию(зеленое кольцо), анимация пролетела и центральный светик горит постоянной(устройство включено). тыкаем на центральную кнопку 2 раза и у нас инициализируется режим синхронизации(когда модуль ищет джойстик) когда джой подключен горит постоянно секция зеленого круга. ну и выключение задержать кнопку в этом режиме все тухнет(и также посылает команду всем джойстиком уснуть) и ждет включения.
    И последнее если возможно когда модуль"спит" его можно было включить через джой прям как на боксе.

    данная идея у меня давно, но так не реализовал ибо не програмер
     
    Последнее редактирование: 03.07.2016
  3. Boxdemon

    Boxdemon Пользователь

    Регистрация:
    05.07.2014
    Сообщения:
    569
    Симпатии:
    91
    Китайцы давно запилили подделку под оригинальный ресивер на своем контроллере. И всё стоит 500р. Смысл данного? Если бы вы запили без участия rf модуля. Тогда смысл есть.
     
  4. mason

    mason Пользователь

    Регистрация:
    23.09.2015
    Сообщения:
    402
    Симпатии:
    25
    смысл в том что есть модуль и валяется без дела прикупил тинку не сложная схемка и вуаля модуль к пк готов
     
  5. Boxdemon

    Boxdemon Пользователь

    Регистрация:
    05.07.2014
    Сообщения:
    569
    Симпатии:
    91
    Извращенство.
     
  6. Ryu

    Ryu Пользователь

    Регистрация:
    12.06.2013
    Сообщения:
    3.453
    Симпатии:
    736
    @Boxdemon, та не вредничай ты.
    Сам, чай, уж давно вышел из возраста, когда хочется своими руками что-нибудь такое запилить.
    Я бы радовался, что народ такие стремления проявляет.
     
  7. Boxdemon

    Boxdemon Пользователь

    Регистрация:
    05.07.2014
    Сообщения:
    569
    Симпатии:
    91
    2007 году, когда были только оригиналы почти по 3000 р это имело смысл. Тогда на pic'ах собирали. Сейчас при стоимости девайса в 500 р (копии) я думаю 99% даже заморачиваться не будут. Для самообразования, когда времени до .. много, это да, катит.
     
  8. arch_saint

    arch_saint Пользователь

    Регистрация:
    21.09.2013
    Сообщения:
    83
    Симпатии:
    15
    Неоднократно слышал, что у китайских ресиверов проблемы с определением и драйверами, а на этот поставились оригинальные дрова от M$. Насчет цены - сама панелька обошлась в 100 рублей (а у большинства они скорее всего просто валяются без дела), все остальное было под рукой, хотя цена обвязки тоже не превышает сотни рублей. С учетом нынешних стипендий достаточно неплохо, ну и приобретенный опыт бесценен. Время - да, вещь дорогая, но в данном случае оно было.
    Касательно приемника без участия RF модуля - вполне можно попробовать разобраться, только стоимость готового изделия будет весьма высокой, да и не факт, что оно будет работать стабильно и безглючно, так что при доступности панелек от толстушек это имхо лишено всякого смысла.


    Давайте обсудим в лс, часть из описанного точно можно сделать
     
  9. Boxdemon

    Boxdemon Пользователь

    Регистрация:
    05.07.2014
    Сообщения:
    569
    Симпатии:
    91
    На копию - ресивер ставятся дрова не родные в ручном режиме, с определением проблем нет. На джойстик ставятся родные дрова автоматом.
     
  10. Dr_Quake

    Dr_Quake Пользователь

    Регистрация:
    26.06.2013
    Сообщения:
    3.076
    Симпатии:
    221
    На копии дрова родные, ID отличается. Ставятся руками тыкая в нужный драйвер.
     
  11. Boxdemon

    Boxdemon Пользователь

    Регистрация:
    05.07.2014
    Сообщения:
    569
    Симпатии:
    91
    Дрова ресивера другие и другое устройство в винде это если совсем копия.
     
    Последнее редактирование: 04.07.2016
  12. Dr_Quake

    Dr_Quake Пользователь

    Регистрация:
    26.06.2013
    Сообщения:
    3.076
    Симпатии:
    221
    Таких ещё не встречал. Но такая копия наверняка будет в части игр косячить.
     
  13. Boxdemon

    Boxdemon Пользователь

    Регистрация:
    05.07.2014
    Сообщения:
    569
    Симпатии:
    91
    Всё норм, джой подсасывает оригинал драйвер и правильно определяется, и в 10 тоже всё работает.
     
  14. Dr_Quake

    Dr_Quake Пользователь

    Регистрация:
    26.06.2013
    Сообщения:
    3.076
    Симпатии:
    221
    WTF?
     
  15. Boxdemon

    Boxdemon Пользователь

    Регистрация:
    05.07.2014
    Сообщения:
    569
    Симпатии:
    91
    На оригинал дрова подсасываются с инета автоматом. На те копии, что у меня, ручками ставишь -выбираешь устройство и к нему драйвер.
     
  16. Boxdemon

    Boxdemon Пользователь

    Регистрация:
    05.07.2014
    Сообщения:
    569
    Симпатии:
    91
    Ориг
    [​IMG]
     
  17. Boxdemon

    Boxdemon Пользователь

    Регистрация:
    05.07.2014
    Сообщения:
    569
    Симпатии:
    91
    Не ориг
    [​IMG]
     
  18. Dr_Quake

    Dr_Quake Пользователь

    Регистрация:
    26.06.2013
    Сообщения:
    3.076
    Симпатии:
    221
    Ты, блин, слепой или какой ещё? Это я ясно написал после, ты же написал что не родные дрова.
     
  19. Boxdemon

    Boxdemon Пользователь

    Регистрация:
    05.07.2014
    Сообщения:
    569
    Симпатии:
    91
    На скринах всё видно.
     
  20. AlexTNT

    AlexTNT Пользователь

    Регистрация:
    09.10.2015
    Сообщения:
    1.955
    Симпатии:
    283

Поделиться этой страницей