Как я собирал ретро-консоль на базе Raspberry Pi 4 и подружил ее с проездными московского метро

Репозиторий проекта на гите

Raspberry Pi — в народе она же малинка — хорошо известная среди гиков платформа для экспериментов и прототипирования разной степени умности гаджетов.
Думаю тут вряд-ли имеет смысл вдаваться в подробную историческую справку, просто хочу отметить что я давно питаю любовь к этим одноплатникам — делал на их базе несколько арт-ботов, (один из них до сих пор работает в телеге), делал конвертор лая моей собаки в твиты (и таким образом, листая свою ленту, узнавал, что ей неспокойно, пока я на работе), испытывал сервера на node.js, хостил на нем свой веб-сервер (практически это довольно бессмысленно, но прикольно) и тд

Использовать малинку как эмулятор старых игр — очень распространенная практика — для этого под нее существует аж несколько готовых эмуляционных систем: Retropie, RecalBox или Lakka.

Чтобы их поставить — семи пудов во лбу не нужно — просто записываешь образ любой понравившейся системы на микро SD карту (это «жесткий» диск малинки),   закидываешь ромы игр в папку roms, вставляешь это дело в рашпери, подключаешь монитор и любой геймпад — готово.

Конечно, в отличии от готовых решений типа Nintendo mini classic — сами игры в комплект не входят, и тут —

важный дисклеймер: игры, (кроме тех случаев, где их принадлежность к паблик-домену непрозрачно указана) — даже самые древние, которые уже не купить в магазине легально, все еще принадлежат своим правообладателям!
*Поэтому ищем на свой страх и риск, исключительно в ознакомительных целях. Гугл справляется с этим на отлично, есть большие тематические форумы и сайты.

От себя, я бы сказал, что в случае, если вы обладатель купленной копии игры, использовать ее образ в эмуляторе кажется наиболее морально и этически приемлемым, однако юридически — это может нарушать лицензионные соглашения. Тем не менее не думаю, что боевые спецназовцы из Atari срочно сделают машину времени и придут ловить вас с поличным :)

Цена вопроса такой самоделки может быть даже выше, чем готовые решения для ретро-гейминга от той же нинтендо, учитывая, что для рашпери понадобится блок питания не меньше 2.5A для RPi3 и не меньше 3A для четвертой малинки, сама SD карта минимум на 16 gb, (не менее 10 класса и желательно быстрая) геймпады и тд. Все это в комплект не входит (разве что вы покупаете готовый бандл в магазине)

Зато есть полная гибкость — вы не привязаны к одной платформе (SNES в случае с nintendo classic mini). На третьей малинке вполне легко без дополнительного охлада можно поиграть в игры для первой плойки — тот же Tekken3, Final Fantasy 7, Silent Hill — будет вполне бюджетно, а четвертая малинка с небольшим оверклокингом и охладом без проблем запускает хиты для Dreamcast — Сrazy Taxi, Sonic Adventures 2, Shenmue

Короче, стоит всерьез рассматривать — если хотите упороться и дух гика в вас живет — в остальных случаях ничего не мешает поставить тот же OpenEmu просто на рабочий комп и в ус не дуть. К тому же он бесплатный.

Ближе к делу

Мой эксперимент с ретро-консолью и проездными на метро вместо картриджей возник довольно спонтанно. Вообще я просто ждал, когда с али-экспресса мне приедут два чудо-девайса для рашпери:

Вот такой 4-х дюймовый 7(!)-цветный e-paper экран — я обожаю «бумажные» дисплеи в читалках, есть в этой технологии какая-то аналогово-цифровая магия, а тут он еще и цветной. Конечно это сугубо не для видео и не для гейминга, там полное обновление изображения занимает секунд 15 (кстати в процессе довольно классно переливается и моргает), но я давно хотел с этим что-нибудь придумать, например сделать игру, где частота кадров 4 кадра в минуту — не баг, а фича. В общем, брал скорее на будущее, с намерением что-то классное с этим потом сделать

e845dc546f78efe06f50fd571d57c378.jpeg

Модуль автономного питания c аккумуляторами, который крепится пинами прям к задней панели малинки, не занимая гребенку пинов GPIO. Впоследствии он оказался скорее бесполезным — вернее это отличная штука для не требовательных задач, но с ретропаем или запущенной в графическом режиме OS он недодает по вольтажу — в дримкаст с таким точно не поиграешь.

Возможно это можно пофиксить, или поискать другие аккумы — не спец по электронике, но на всякий случай написал в техподдержку waveshare — вообще говоря довольно странно, что предупреждение о недо-вольтаже возникает даже при штатном использовании с третьей малинкой.

UPD: проблему недо-вольтажа можно решить дополнительно запитав малинку через ее штатный usb c порт — подключить шнур USB одним концом к USB порту модуля автономного питания, а type-c в обычный вход для питания малинки. ВАЖНО: нельзя совмещать одновременно автономное питание и обычное питание от розетки, (сам блок с батарейками при этом может быть подключен к розетке, но либо все через батарейки, либо без них обычным штатным питаловом.

Девайсы пришли на почту, захотелось протестировать их в действии, и тут я вспомнил, что в шкафу у меня завалялась целая куча использованных проездных на метро. Так как по сути в них обычная NFC метка, была идея использовать их для проекта с RFID сканером в качестве ключа или триггера

106c95f4f491dc4142f4db5befd8c40b.jpeg

Недолго думая, я решил попробовать собрать портативную консоль, которая запускала бы любимые игры по «единому», читая команду с метки через сканер RFID. Для рашпери есть вот такая «шляпа»:

шляпа или hat — платы расширения для  Raspberry Pi, которые крепятся к ней через GPIO по принципу бутербродашляпа или hat — платы расширения для Raspberry Pi, которые крепятся к ней через GPIO по принципу бутерброда

Удобно, что на плате есть удлинитель GPIO пинов, стало быть прикрепив модуль к малинке первым слоем, сверху к этому бутерброду можно добавить и «бумажный» экран и использовать его например для показа артов / обложки запущенной игры и для (неспешного) мониторинга системы — заряд батареи, температура процессора и тд.

Ингредиенты

  • Rasberry PI 4 / 4gb была в запасах не задействованная 3-я, но уж очень хотелось в Dreamcast:) Брал сразу набором на амперке, чтобы не искать по отдельности все нужные шнуры (microHDMI — HDMI) и блок питания (четверка к ним особо привередлива), плюс там в наборе уже есть микро sd c RaspberryPi OS на 16 гигов. Мне не потребовалась, использовал свою с большим объемом, но лишней точно не будет :) Весь комплект на амперке 10500р — на алике аналогичный возможно обойдется дешевле, но мне не терпелось

  • PN532 NFC hat — 1900р

  • 4` ACeP 7-Color E-Paper E-Ink Display HAT ~3600р

  • UPS HAT (B) ~1600р

  • 2 аккумулятора 16850 ~1200р

  • один вентилятор и 2 медных радиатора для рашпери ~500р

  • большая micro sd карта 256 gb samsung ~3500р

  • лего для корпуса ~1200р

  • геймпад (любой, у меня от плойки)

Получилось, прямо скажем, не очень бюджетно —, но этот набор можно урезать раза в 2 — 2.5, если убрать экран и питалово на аккумах, которое, как выяснилось позже, оказалось не особо полезным для этой цели. (хотя и позволяет поиграть в нетребовательные игры) Так же sd карточка может быть существенно поменьше, я брал с запасом надолго.

Собираем бутерброд

59547f53962e700ba3c75122e35bfb60.jpeg0eaced20184a2b3e9b0d2678eb8a0b2f.jpeg

Также нужно немного охладить нашу малинку — радиаторы для нее самоклеющиеся, насаживаю один на чип процесора и видеоядра (они рядом) плюс маленький вентилятор:

b84d9ab452d606cdf5c05ccd21fac1ac.jpeg

Цепляется он за 4 и 6 пин на GPIO — черным к земле на 6 и красным на 4 (5-вольтовая линия). 

Проблема что вся гребенка у меня уже занята NFC модулем, поэтому я просто вытащил два проводка из джампера, оголил кончики и аккуратно припаял насадил маленькими петельками их на пины, прижав сверху NFC модулем.

Делать так конечно категорически не правильно — лучше аккуратно припаять, но паяльника у меня не было, да и паять я не мастер. В любом случае, очень важно, чтобы ничего не замыкало провода и они были изолированны друг от друга.

Не смотря на такой колхоз, получилось в целом достаточно аккуратно, а модуль сверху, придавливая, дополнительно все фиксирует.

5632204467d6848ae0123985424f89eb.jpeg

Сам NFC модуль имеет три режима — по какому интерфейсу коммуницировать с малинкой: UART, SPI и I2C. Для переключения режимов, перед тем как накрывать все это дело экраном и собрать в самопальный корпус из лего — нужно выставить джамперы и переключатели в нужную позицию.

Опытным путем мне подошел интерфейс I2C (про установку и настройку waveshare модулей у них всегда очень подробно изложено в вики). В моем случае я использовал I2C, так как SPI уже по умолчанию был занят экраном, и по тестам такое подключение сработало лучше всего. Позицию переключателей проще всего регулировать булавкой или иголкой, пальцы для такого великоваты :)

image-loader.svg

Собрал это все в корпус из лего

4ee502f6219e5e831ef5d0278ee0b2c2.jpeg1b24433c7a4512e68dbd1c25b91604b9.jpeg2b6877dbeb514337494d11f5347c994c.jpeg

Основной софт

В выборе эмуляционной системы, я однозначно остановился на Retropie — он представляет собой не отдельную в вакууме ось, а надстройку над существующей и хорошо знакомой raspberry pi OS, а это уже даёт привычную среду для дальнейшей кастомизации и настройки.

Да и комьюнити и документации там побольше. Установка предельно простая: скачиваем imager с официального сайта raspberry pi, вставляем micro SD в комп, и в выборе операционки в imager выбираем ретропай для нашей версии малинки (3 и 4 несовместимы между собой!)

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

Ретропай сходу определит геймпад и предложит его «замэпить» — просто следуем инструкции и нажимаем нужные кнопки. Последний хоткей я оставляю нетронутым, тогда им по умолчанию становится кнопка select.

Далее в играх под ретроарчем select+start — выход, select+Y — быстрое меню ретроарч в игре, которое позволяет сохранить текущий стейт игры, настроить контроллер и много всяких дополнительных плюшек.

Затем в пункте меню Retropie идем в настройки, настраиваем вайфай, заходим в пункт raspi-config (понадобится клавиатура) —
в пункте 3: Interface Options включаем все необходимые интерфейсы,
в моем случае это: SSH, I2C, SPI

Перезагружаем.

SSH позволяет удаленно управлять малинкой с другого компа через командную строку терминала. Для этого необходимо узнать ее локальный IP-адрес, после подключения к вайфаю сделать это можно просто в основном меню настроек ретропая — там есть соотвествующий пункт «показать IP» например мой: 192.168.200.11

открываем с рабочего компа терминал и пишем:

ssh pi@192.168.200.11

у нас спросят пароль, если вы специально его не меняли пишем raspberry


Следующим шагом — в дополнении в ретропаю, можно установить и десктоп — мне он пригодился для одной задачи, но в целом делать это не обязательно, особенно если места не очень много.

Идем в retropie-setup в пункте tools ищем строку raspbian related tools — выбираем install pixel desktop. После этого выход из emulation station в десктоп можно совершить нажатием кнопки F4 — в командной строке набираем startx жмем ENTER (или через основное меню — наряду с логотипами приставок там появится пункт PORTS — вызвать десктоп можно оттуда)

По умолчанию в ретропай не включены все эмуляторы, которые он в принципе поддерживает. Тоже идем в настройки ретропая смотрим дополнительные пакеты и ставим. Некоторые лежат в экспериментальных.

Если избирательно — просто ищите нужную вам платформу на сайте ретропая и смотрите вики по настройке и нужному эмулятору, у меня места много, поэтому я просто установил их все разом (это заняло какое-то время).

Вроде все основные пункты по самому ретропаю я освятил, но всю эту инфу можно без проблем и во всех подробностях найти в сети :)

Устанавливаю модули

Тут все просто — инструкции для e-paper экрана, NFC сканнер и UPS блок с аккумуляторами подробно расписаны у производителя на вики страничках:
экран, UPS, NFC сканер

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

Все это делается в терминале, если делать на самой рашпери — выходим в режим терминала из графического режима emulation station нажатием клавиши F4, или, если накатили поверх ретропая десктоп — выходим в него и запускаем терминал там.

Мне же проще всего было проделывать все это удаленно, через SSH — так и команды с вики можно просто копипастить в терминал :)

Я начал с экрана, попутно по инструкции, устанавливаем весь нужный софт и библиотеки, основное что нам потребуется это менеджер пакетов для питона pip3

Запуск примеров: после того как установили, в терминале переходим в директорию где лежат примеры. Навигация по каталогам:

cd /путь-к-папке/
cd … перейти на уровень выше
cd ~ перейти в домашнюю директорию
ls  выводит список файлов и папок внутри директории
для быстрого перехода можно набирая команды использовать клавишу tab для автонабора нужных файлов и директорий

Запуск примера с экраном, находясь в директории со скриптами:

sudo python3 epd_4in01f_test.py

Все картинки для e-paper экрана строго ограниченны цветовой палитрой, никаких полутонов, а это значит, что их нужно прогонять через dithering-алгоритм.

Проще всего делать это в фотошопе, а тут есть подробная инструкция. Так же разрешение должно быть точно таким же как и разрешение самого экрана, у меня 640×400. В тестовых скриптах есть примеры и картинки, вместо них можно подставить свои картинки и проверить. По моей задумке экран показывает обложку игры, когда я запускаю ее через «картридж» то есть проездной :)

6e969294860969bfdec2b61502cc5ad9.jpegd8273c6b35244ae6621d8398748cd4c2.jpeg

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

Малинка хорошо дружит с процессингом (но именно для этого я ставил десктоп, чтобы все установить и проверить запуск скетчей в редакторе),

А тут есть детальный гид, как запускать скетчи на процессинге в командной строке, без экрана. Мне потребовалось лишь адаптировать разрешение сохраняемой картинки и цвета, чтобы они соответствовали палитре экрана.

В итоге, команду на запуск скетча с генерацией картинки я вывел в отдельный исполняемый шелл-скрипт (о них подробнее будет позже), то есть он запускается из под консоли, минуя сам графический интерфейс редактора

В целом получилось так: каждые 5 минут в финальном скрипте, если сейчас не запущенна игра, мы обновляем экран, и даем команду на запуск скетча, скетч сохраняет картинку в нужную директорию (переписывает один и тот же файл) — и ee мы используем при следующем обновлении экрана.

Вообще говоря, в самом питоне уже есть библиотека для работы с графикой PIL (она устанавливается по инструкции вместе с экраном) и аналогичный скетч с генеративной графикой можно написать непосредственно в нем, но мне было лень разбираться, да и не особо нужно.

Можно просто накачать набор тематических картинок и показывать случайную без всяких лишних заморочек:)

А можно и вовсе рассмотреть варианты сборки, где экран не дополнительный / декоративный, а на нем и играть прям можно, тогда вся задумка с портативностью и батарейками будет еще более уместной.

Для малинки существует множество таких экранов, которые подключаются по GPIO + HDMI. Но меня лично заинтересовал вариант с подключением по DSI (к специальной шине для подключения дисплея на рашпери) типа такого — так можно собрать все компактно, без лишних проводов.

С батарейным блоком поступил аналогично — просто следовал инструкции с вики, потестил скрипт индикации заряда в консоли — все работает

Если при запуске скрипта с примером консоль ругается на отсутсвие какого-то модуля — устанавливаем этот модуль через pip, например, когда я ставил по инструкции модуль с батарейками, у меня не была установлена библиотека smbus. Фиксим:

sudo pip3 install smbus 

Если запустим пример — увидим как терминал пишет текущий уровень заряда

Точно так же с NFC hat: инструкция здесь подключал по I2C интерфейсу.
В примерах несколько питон-скриптов на чтение и запись RFID меток.

Ключ, который выглядит как таблетка от домофона (идет в комплекте с платой) и читается и записывается. Но проездные, по понятной причине только читаются — от записи они защищены, иначе так каждый «умелец» мог бы обеспечить себе безлимитный бесплатный проезд :)

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

Но у меня таких не было, да и определенный reuse шарм в таком случае пропадает. Тем более, что когда свободные «картриджи» закончатся, можно бесплатно пополнить запасы в мусорном ведре у турникета :))

Невозможность записи я обошел по другому — у каждого такого проездного есть свой UID, выглядит как уникальный hex код, типа такого: b'4\xc1\xf7\xa9W\x8b\xa7'

Именно его мы можем прочесть в терминале, приложив карточку к сканеру. А если мы можем его прочесть, значит мы можем использовать его как ключ к запуску, просто записав его как ключ в dictionary:

{  : ( <команда запуска игры>, <название игры>, <картинка игры>) } 

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

Cобираю свой скрипт

Беру все нужные мне штуки из скриптов-примеров для модулей, делаю отдельную директорию home/pi/MagicBox — переношу туда нужные библиотеки (вся структура по ссылке на гите) и комбинирую это все уже в своем скрипте.

Мой код далеко не идеальный, но все работает. Честно говоря, первый раз пишу на питоне, приходилась долго привыкать не ставить автоматом фигурные скобки {}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{} :-)

Cтруктура такая:

  1. основной скрипт называется go.pyв нем логика самого сканера карточеки мониторинг других модулей: батареи и экрананеобходим модуль subprocess: sudo pip3 install subprocess

  2. каталог / словарик с карточками-«картриджами» catalogue.py

  3. battery.py там практически без изменений скрипт INA219.py из примера.Добавил только автоматическое выключение системы, если уровень заряда меньше 2% и мониторинг температуры процессора

  4. screen.py — там методы для обновления бумажного экрана, ему пасуем картинку и тд

Устроено это так: есть основной скрипт, в нем два потока — один отвечает за инфу на экране, каждые 10 секунд смотрит есть ли активный картридж с картинкой, мониторит батарею и температуру процессора, другой же отвечает за сканер, и если прикладываешь проездной и он есть в картотеке — запускает игру, и передает мониторинг-системе инфу о картридже, чтобы поменять картинку. И третий цикл в основном потоке для обновления картинок в режиме ожидания, если нет картриджа ждет 5 минут и меняет на картинку с мордами.

*по возможности НИКОГДА не выключайте малинку просто обрубив питание. Микро-SD карточки, на которых записана система очень чувствительны к такого рода стрессам, будут ошибки и бэд-блоки на диске, а то и вовсе полетит система. Именно поэтому, если что-то получилось сделать — советую делать бекап образа, чтобы в случае такой поломки из него можно было восстановить и перезаписать образ системы

В каталоге я предусмотрел 2 синих проездных с записанными системными командами reboot (sudo reboot) и выключение (sudo shutdown -h now), которые, в случае чего, позволяют быстро выключить или перезапустить малинку безопасно. По хорошему бы конечно кнопку отдельную вынести, но не было. (и лень)

Весь код писал в SublimeText удаленно, подключив рашпери к компу через протокол Samba, чтобы в проводнике был доступ к файловой системе малинки.

Смотрим тут если что, там ничего сложного: https://ramokromok.com/threads/setting-up-samba-share-on-windows-10-to-access-files-on-the-retropie.105/

Поскольку в настройках по умолчанию в самбе мы видим только папки roms, bios и splashscreens, а свою директорию с программой я сделал в home — обновляю настройки самбы, включив в него доступ ко всей директории home:

sudo — запуск чего-либо с правами админа
nano — это текстовый редактор в терминале

sudo nano /etc/samba/smb.conf

image-loader.svg

в нано:

ctrl + O → ENTER — сохранить
ctrl + X — выйти

теперь помимо SSH мы можем получить доступ к фалам и папкам малинки прямо в проводнике, создавать и менять там файлы, закидывать ромы игр и тд. (правда иногда это может быть довольно медленно).

А теперь самое главное: как заставить все это работать?

В ретропай, для запуска команд (игр в нашем случае) через консоль, минуя графический интерфейc emulation station, существует шел-скрипт runcommand.sh
Запуск игр в нем осуществляется с такими параметрами:

/opt/retropie/supplementary/runcommand/runcommand.sh 0 _SYS_ nes '/home/pi/RetroPie/roms/nes/SuperMarioBros.nes'

То есть: <сам путь к скрипту>, <система (эмулятор)> <и путь к файлу с ромом>

Для того чтобы скрипт корректно отработал, предполагается, что мы выходим из графического режима emulation station и запускаем все это дело через терминал.

Следовательно, перед запуском игры по проездному, нам нужно «убить» все процессы emulation station или уже запущенные ранее игры.

Для того, чтобы наш питон-скрипт умел запускать и выполнять команды в терминале, добавляем ему в модули import os (или аналогичная вещь subprocess)

У каждого процесса в диспетчере задач есть свой уникальный номер, наша задача его выяснить и нежно вырубить командой

$ kill -15  

Аргумент -15 это SIGTERM (то есть нежно) -9 SIGKILL (то есть жестко)
всегда по возможности лучше нежно))

Делаем массив имен процессов (это список всех возможных эмуляторов и сама emulation station) посылаем его на проверку методу kill_process в скрипте go.py
так же, через консольную команду:

ps ax | grep  | grep -v grep

Выводим полную строку этого процесса в диспетчере задач, где первым элементом будет как раз ID процесса, который мы убиваем. И так будет со всеми!!!

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

Делаем для нее дополнительную проверку на наличие этого процесса в диспетчере в цикле, def process_is_running (proc_name)
<переключить на черно-белый режим> и убивать, убивать, убивать (секунды за 2–3 это происходит) — и только после этого даем команду на запуск рома через runcommand.sh

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

sh-скрипт делается так:
в терминале переходим в нужную нам директорию, у меня это папка в домашней директории /MagicBox/run/
пример:

cd MagicBox/run
nano crazyTaxi.sh

nano — консольный текстовый редактор,
crazyTaxi — карточка для игры Crazy Taxi, которую будем делать,
.sh — расширение шел-скрипта.

В открывшемся редакторе пишу текст команды:

/opt/retropie/supplementary/runcommand/runcommand.sh 0 _SYS_ dreamcast /home/pi/RetroPie/roms/dreamcast/Crazy_Taxi_v1/CrazyTaxi.gdi
emulationstation

ctrl + O → ENTER сохранить
ctrl + X выйти из nano

Это означает: запусти игру по такому-то пути, а на выходе из игры запусти обратно emulation station

К тому же, при таком подходе, сам путь к директории нужной игры легко скопировать из проводника, а не писать его ручками, меняя все пробелы в строке на понятные компу »\ » (по крайней мере на маке все пути корректно копируются в терминал, так, что компуктер это понимает)

Далее этому файлу нужно дать доступ, то есть сделать его по настоящему исполняемым. В линуксе очень гибкая система настройки пользовательских прав, есть куча разных атрибутов, но я человек простой и использую ультимейт права для всех подобных скриптов, если не нужно сильно беспокоится о безопасности, поэтому далее:

sudo chmod 777 crazyTaxi.sh

sudo — это как запустить команду с правами администратора,
chmod 777 — ставит права доступа на чтение запись и исполнение любому пользователю

Далее, в питон-скрипте просто указываем ссылку на директорию где лежат наши .sh скрипты с карточками, и вместо множества букв пасуем эти карточки в словарик с играми.

Дополнительно я сделал две системные карточки на выключение и перезагрузку малинки, команды там простые и короткие, поэтому отдельных шел-скриптов, как с играми я не делал:
перезагрузка — sudo reboot / выключение — sudo shutdown -h now

Осталось только сделать так, чтобы наш основной скрипт запускался автоматом вместе с системой. Для этого в ретропае тоже есть скрипт autostart.sh
идем к нему и редактируем:

sudo nano /opt/retropie/configs/all/autostart.sh

Мой основной скрипт называется go.py и лежит он в папке home/MagicBox/run
пишем команду запуска скрипта:

python3 /home/pi/MagicBox/run/go.py & emulationstation

ctrl + O → ENTER / ctrl + X

Так, на старте системы, мы запустим скрипт в основном окне терминала, но если я захочу добавить новые карточки, будет не очень сподручно смотреть их UID код и добавлять в словарик новые ключи.

Сейчас программа, если я прикладываю «чистый» проездной печатает в терминал его UID — соответсвенно я его копирую и записываю ключом в словарик.

Если я ставлю запуск всей системы в автостарт — мой питон скрипт крутится к «главном» окне терминала под emulation station — если я хочу посмотреть вывод в консоль, скопировать чистый ключ, просто подключившись через SSH у меня не получится, нужно смотреть на самой малинке, то есть подрубать клаву, нажимать F4 — смотреть, запоминать — неудобно! (хотя возможно, можно подключить логирование и просмотр записи лога в SSH, но я пока не разобрался)

На помощь мне приходит замечательное консольное приложение tmux, не раз им пользовался. Оно позволяет организовать работу в терминале «вкладками», которые можно открывать и «сворачивать» не завершая сам процесс.

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

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

Тмукса нет по умолчанию в малинке, его надо установить:

sudo apt-get install tmux

шпаргалка по tmux

Делаю очередной шел-скрипт, в папке /home/pi/bin, чтобы запуск нашего питон скрипта происходил в tmux-вкладке:

sudo nano /home/pi/bin/magicBox.sh

пишу:

#!/bin/bash
tmux new-session -s "magic" -d -n "box"
tmux send-keys -t "magic:box" C-z  'python3 /home/pi/MagicBox/run/go.py' Enter

Это значит, что на старте системы я создаю новую вкладку, в которой запускаю наш питон-скрипт.

Далее, я могу развернуть эту вкладку через SSH или в терминале самой малинки командой:

tmux a

А свернуть ее сочетанием клавиш ctrl+B+D
Теперь можно отредактировать автостарт:

sudo nano /opt/retropie/configs/all/autostart.sh

закомментировал запуск пайтон-скрипта напрямую, вместо него вписываю команду на запуск шелл-скрипта:

/home/pi/bin/magicbox.sh & emulationstation 
#line above run session in a tmux tab for easy debuging
#python3 /home/pi/MagicBox/run/go.py & emulationstation

Есть правда один минус — запуская скрипт в основном окне терминала, без тмукса, прикладывая карту мы сразу видим на экране дефолтный ретропаевский сплэш-скрин загрузки (выглядит он «терминально» и не то чтобы очень красиво, зато с точки зрения обратной связи сразу понятно — тут что-то происходит)

С тмуксом — нас выбивает в чистую консоль и через пяток секунд запускается игра. Но поскольку я то знаю, что она запустится, меня это не особо смущает.
В конце концов, можно заполнить так всю картотеку, а потом уже перенести запуск скрипта в автостарт напрямую (ну и обратную операцию мы можем сделать в любой момент).

Оверклокинг

С штатными настройками система хорошо справляется с играми PSX
и попроще, если хотим поиграть в Dreamcast шедевры, нужно будет немного разогнать проц и видеоядро. Для этого в терминале пишем

sudo nano /boot/config.txt

я использовал такие настройки:

arm_freq=1950
over_voltage=4
gpu_freq=600
v3d-freq=750

Конечно, тогда точно потребуется минимальное охлаждение, у меня с маленьким медным радиатором и вентилятором в процессе игры температура колеблется в районе 52—60° доходя до 65° максимум, что в общем, вполне в пределах разумного.

139c6e03016a3f415807c675927d8530.jpg

В заключении

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

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

Но там все по-серьезному: с 3D печатью, картриджи имитируют вид оригинальных и тд.

Мне же нравится, что получилась немного «колхозная», но самостоятельная история, которая не столько напрямую имитирует вид старых консолей и картриджи, сколько просто дает в такой новой форме аналоговые ощущения.

Да и сама идея использовать для этого проездные мне показалось занятной.

Буду рад если кому-то пригодится этот гид — полностью или частично.
И буду рад любому фидбеку и предложениям — я далеко не эксперт ни в линуксе ни в питоне:)

© Habrahabr.ru