Arduino UNO играет в 2048 с размером поля 8х8

Относительно недавно в сети появилась увлекательная игра 2048. Много народу затянула с первых дней её появления в сети. И все ради того чтоб собрать заветное число 2048. Наигравшись вдоволь в эту игру, мне попалась новая версия игры, в которой число клеток строк и столбцов увеличилось до восьми.
Тут-то все и началось, после трех часов игры я так и не проиграл, а азарт только возрастал пропорционально полученным очкам. Убив почти половину дня, складывая циферки, мне стало интересно. Сколько по времени можно играть в эту игру? Но нарочно проигрывать я не хотел, (не зря ведь целый день играл) решил написать скетч который будет за меня выполнять не сложные действия, перемещая строки и столбцы с цифрами. Сразу хочу уточнить, что идею написать программку для выполнения на ПК я отбросил, ибо это давно избитая тема. Алгоритм в видео отличается от того что использовал я при написании скетча.
Итак, приступим, что нам понадобится:
  • Arduino UNO
  • Фирменная утилита Atmel – Flip
  • Провод и перемычка
Цель была достаточно простой: написать скетч для Arduino UNO, который будет эмулировать нажатие клавиш стрелок на клавиатуре. Чтоб при подключении устройства к компьютеру запускался скетч и на мониторе стали передвигаться циферки игры 2048.
Алгоритм наших действий:
  1. Пишем скетч с нужным функционалом и заливаем в МК ATmega328
  2. Прошиваем загрузчик Arduino, usb контроллер ATmega8U2
Для эмулирования нажатий клавиш я использовал библиотеку HIDKeyboard. Что ж теперь переходим к самому интересному – будем превращать Arduino UNO в HID устройство, а конкретней в USB клавиатуру.
Немного теории.
Прошивка загрузчика — для начала нужно перевести Arduino в режим Device Firmware Update или в более часто используемом варианте DFU. Он служит для перепрошивки контроллера выполняющего роль конвертера serial to usb.
Как известно, основное отличие Arduino UNO от предыдущих моделей плат Arduino заключается в наличие второго контроллера ATmega8U2, на смену аппаратному конвертору USB <-> COM (FT232R). Преимуществом данного решения является возможность замены прошивки в интерфейсном контроллере с целью эмуляции произвольного устройства при подключении Arduino к ПК (накопителя, hid-устройства и т.д.). Как это сделать? У интерфейсного контроллера имеется режим DFU – прошивка контроллера ATmega8U2 через подключение через USB. Почти как прошивка центрального контроллера Arduino. Для этого можно воспользоваться фирменной утилитой Flip. Для того чтоб перевести контроллер в этот режим программирования потребуется небольшая аппаратная модернизация Arduino. Видимо разработчики его специально создали, чтоб пользоваться DFU-режимом интерфейсного контроллера. В интернете много пишут о том, что следует припаять резистор на 10кОм на специально предусмотренное для него место на обратной стороне платы.
Формально сложности никакой нет, вот только не каждый рискнет паять. Да и честно это ни к чему. Есть способ намного удобней.
После этих действий компьютер обнаружит новое устройство и попытается самостоятельно поставить драйвера, но у него ничего не получится. Настало время установить фирменную утилиту Flip от Atmel. Открываем диспетчер задач и видим новое устройство Arduino Uno DFU.
Выберем драйвер из папки недавно установленной утилиты FLIP. В итоге у нас появится новое устройство – AT90USB82. В дальнейшем при подключении Arduino, устройство будет определять как USB устройство. Теперь нам следует залить HEX файл с инструкциями USB клавиатуры. Чтоб компьютер в дальнейшем распознавал нашу Arduino как usb клавиатуру. Запускаем FLIP.

  1. Выбираем в меню Device > Select > AT90USB82
  2. Выбираем в меню Setting > Communication > USB
  3. Жмем Open
  4. Приступаем к прошивке, жмем Run
По окончании процесса прошивки можно закрыть программу и проверить, как работает устройство. В итоге мой Arduino успешно играл в 2048 почти неделю. Даже на ночь его не выключал. В подтверждение вот мой результат.
Вот так можно превратить Arduino UNO в HID-устройство. Кстати можно не только играться в игры но и разыграть друга, подключив к его компьютеру устройство, которое запустит блокнот и будет писать там анекдоты, либо запускать команды, ведь клавиатура это главный пульт управления компьютером. К сожалению нельзя применить этот метод к плате Arduino Nano. Как уже говорилось ранее – второй контроллер Arduino UNO (ATmega8U2) используется в роли конвертера USB to Serial для определения компьютером Arduino UNO как USB устройство. Можно сделать вывод: реализовать этот метод, без посторонних устройств, возможно лишь при наличии на плате Arduino микроконтроллера запрограммированного как USB-to-serial конвертер. Но что делать, если у вас Arduino Nano или иная плата без конвертера USB to Serial? В таком случае можно купить отдельно конвертер подобный этому.
Поделиться публикацией
Комментарии 17
    0
    Спасибо большое за пост, как раз то чего мне не хватало, учитывая что у меня китайский клон и нет площадок на днище, а про хитрость с перемычкой нигде не видел. Но не совсем понял про «Прошиваем загрузчик Arduino, usb контроллер ATmega8U2». Можно немного подробнее, а то в тексте запутался. Если я правильно понял то нужен специальный hex файл с эмуляцией хид устройства, если так, то можно зааттачить к посту этот хекс? И как восстановить оригинальную прошивку для ATmega8U2 если вдруг захочется откатится? если есть оригинал, то можно ли его тоже зааттачить к посту. И с удовольствием бы посмотрел исходник ардуиновского скетча. Заранее спс)

    И правильно ли я понял порядок:
    1) Пишем обычный скетч в ардуино иде с приминением библиотеки.
    2) Через иде заливаем скетч на ардуино
    3) переключаем в режим DFU
    4) через флип заливаем специальную прошивку для ATmega8U2 чтобы ардуино определялось как юсб устройство?
      0
      Доброго времени суток. Это мой первый пост, прошу сильно не «ругать».
      В статье есть ссылка на скетч.
      1) Пишем обычный скетч в ардуино иде с приминением библиотеки.
      2) Через иде заливаем скетч на ардуино
      3) переключаем в режим DFU
      4) через флип заливаем специальную прошивку для ATmega8U2 чтобы ардуино определялось как юсб устройство?
      Вы все правильно поняли, так и нужно делать. Hex файлы я выложил вместе со скетчем. В репозитории находятся 3 файла:
      Arduino-HID-Bot-2048.ino — скетч для Arduino UNO для игры в 2048.
      Arduino-keyboard.hex — этот hex файл заливаем при помощи FLIP для перевода arduino в режим USB клавиатуры (но сначала нужно залить основной скетч).
      Arduino-usbserial-uno.hex — этот hex файл нужен для того чтоб обратно вернуть Arduino UNO. Заливаете через FLIP этот hex файл и ваш Arduino уже как и раньше определяется компьютером.
      «Прошиваем загрузчик Arduino, usb контроллер ATmega8U2» — извиняюсь, тут я немного слукавил, я имел в виду тот факт, что главным отличием Arduino UNO является новый контроллер USB Atmel ATmega8U2, который заменяет собой устаревший примитивный чип FTDI, обладает низкими задержками и самое главное, даёт возможность перепрограммировать USB-интерфейс таким образом, чтобы плата Arduino Uno определялась компьютером как MIDI-устройство, клавиатура, мышь (HID-инфтерфейс) и так далее — на что хватит вашей фантазии.
        0
        Большое спасибо!!! Теперь я понял. :) кстати попробовал поиграться с перемычкой и проводом. В итоге мне замыкание провода на резистор не понадобилось. Просто поставил перемычку, подключил ардуино к пк и снял перемычку.

        Еще у меня в китайском ардуино стоит не 8 мега а 16, так она определилась и так во флипе использовал. :) но под нее подошла прошивка от 8ки. Теперь сделаю троллинг бокс для коллеги :)
          0
          А как загрузить другой скетч? Перепрошить обратно на USB-to-serial, залить скетч и перепрошить на HID?
            0
            Да, все верно. Прошиваете через FLIP usb-to-serial и заливаете в ардуину скетч) Если у вас 2 ардуинки то можете не мучиться (постоянно перепрошивая ардуинку), на одной ардуинке писать скетчи и заливать в МК потом этот МК ставить в другую ардуинку которая в режиме HID-устройства. Так будет быстрей)
              0
              Понятно. Спасибо за ответ :) Я слышал, что есть ардуино с возможностью изменять режим работы USB через скетч. Вы не знаете ничего по этому поводу?
                0
                Разнообразие плат на основе ардуино великое множество) особенно тех которые производятся в Китае (там их просто море) с разными дополнениями, расширениями и т.д. Если и есть такая плата которая может изменять режим работы USB-контроллера в самом скетче (такие мне не встречались), то сама реализация работы платы с USB должна быть на том же контроллере где находится основная прошивка (скетч). В Arduino UNO — 2 контроллера один для работы USB, на другом находится скетч и вся переферия. Первое что можно предложить это платы Teensy — их можно прошивать на лету хоть в клавиатуру, мышь или джойстик)) вот статьи по ним:
                Боевой HID-эмулятор на Arduino
                Using USB Keyboard
                Тест скорости передачи данных USB
                USB: Keyboard
                Цена на Teensy варьируется от 1000-2500 рублей, в зависимости от версии и магазина.
        0
        А как Arduino «играет»? Оно как то видит обстановку на игровом поле, или постоянно отправляет нажатия случайных стрелок? Статью следовало бы назвать «Arduino эмулирует клавиатуру», а не так громко. Где брали прошивку для эмуляции клавиатуры?
          0
          О том что творится на поле Arduino ничего не знает, а лишь отправляет нажатия клавиш в заданном порядке. В статье я писал что являлось целью:
          Цель была достаточно простой: написать скетч для Arduino UNO, который будет эмулировать нажатие клавиш стрелок на клавиатуре. Чтоб при подключении устройства к компьютеру запускался скетч и на мониторе стали передвигаться циферки игры 2048.
          Прошивку я нашел на англоязычном форуме, на каком точно уже не помню, т.к. это устройство я собирал еще в начале апреля.
          0
          Если интересно, то простейший алгоритм: вверх, вправо, вниз, влево на поле 8x8 работает очень хорошо: у меня он работал несколько суток, набрал 16 654 310 032 очков, потом я нечаянно браузер закрыл, а так бы он еще работал и работал — поле было меньше чем на половину заполнено. Правда, я своего робота просто в консоли в хроме написал на js.

          Команда для консоли: window.setInterval(function(){for(var i=0;i<200;i++){GM.move(0);GM.move(1);GM.move(2);GM.move(3);};},10);
            0
            ругается, говорит что:
            Uncaught ReferenceError: GM is not defined
            (anonymous function)
              0
              На самом деле, всё ещё проще. Там есть встроенный игровой бот. Он делает ходы в случайном направлении.
              Включается так (команды надо набрать в консоли):
              Первая команда инициализирует временной интервал для setInterval():

              auto_move_time = 10; // 10 миллисекунд можно заменить на своё значение.

              Вторая команда:

              start_auto_move(); // запускает самоиграйку.
                0
                www.csie.ntu.edu.tw/~b01902112/9007199254740992/ — Works on my machine
              0
              А можно просто купить Teensy
                +1
                Не хватает как минимум ссылки на 8 на 8 версию…
                0
                Большое спасибо за пост! Как раз по работе нужно было автоматически понажимать кнопки на 50+ компах, теперь я знаю, как это сделать. Уже заказал Uno rev3 (кстати, на офсайте написано, что на rev3 вроде как достаточно поставить перемычку для перевода в режим DFU).

                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                Самое читаемое