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 кадра в минуту — не баг, а фича. В общем, брал скорее на будущее, с намерением что-то классное с этим потом сделать
Модуль автономного питания c аккумуляторами, который крепится пинами прям к задней панели малинки, не занимая гребенку пинов GPIO. Впоследствии он оказался скорее бесполезным — вернее это отличная штука для не требовательных задач, но с ретропаем или запущенной в графическом режиме OS он недодает по вольтажу — в дримкаст с таким точно не поиграешь.
Возможно это можно пофиксить, или поискать другие аккумы — не спец по электронике, но на всякий случай написал в техподдержку waveshare — вообще говоря довольно странно, что предупреждение о недо-вольтаже возникает даже при штатном использовании с третьей малинкой.
UPD: проблему недо-вольтажа можно решить дополнительно запитав малинку через ее штатный usb c порт — подключить шнур USB одним концом к USB порту модуля автономного питания, а type-c в обычный вход для питания малинки. ВАЖНО: нельзя совмещать одновременно автономное питание и обычное питание от розетки, (сам блок с батарейками при этом может быть подключен к розетке, но либо все через батарейки, либо без них обычным штатным питаловом.
Девайсы пришли на почту, захотелось протестировать их в действии, и тут я вспомнил, что в шкафу у меня завалялась целая куча использованных проездных на метро. Так как по сути в них обычная NFC метка, была идея использовать их для проекта с RFID сканером в качестве ключа или триггера
Недолго думая, я решил попробовать собрать портативную консоль, которая запускала бы любимые игры по «единому», читая команду с метки через сканер RFID. Для рашпери есть вот такая «шляпа»:
Удобно, что на плате есть удлинитель 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 карточка может быть существенно поменьше, я брал с запасом надолго.
Собираем бутерброд
Также нужно немного охладить нашу малинку — радиаторы для нее самоклеющиеся, насаживаю один на чип процесора и видеоядра (они рядом) плюс маленький вентилятор:
Цепляется он за 4 и 6 пин на GPIO — черным к земле на 6 и красным на 4 (5-вольтовая линия).
Проблема что вся гребенка у меня уже занята NFC модулем, поэтому я просто вытащил два проводка из джампера, оголил кончики и аккуратно припаял насадил маленькими петельками их на пины, прижав сверху NFC модулем.
Делать так конечно категорически не правильно — лучше аккуратно припаять, но паяльника у меня не было, да и паять я не мастер. В любом случае, очень важно, чтобы ничего не замыкало провода и они были изолированны друг от друга.
Не смотря на такой колхоз, получилось в целом достаточно аккуратно, а модуль сверху, придавливая, дополнительно все фиксирует.
Сам NFC модуль имеет три режима — по какому интерфейсу коммуницировать с малинкой: UART, SPI и I2C. Для переключения режимов, перед тем как накрывать все это дело экраном и собрать в самопальный корпус из лего — нужно выставить джамперы и переключатели в нужную позицию.
Опытным путем мне подошел интерфейс I2C (про установку и настройку waveshare модулей у них всегда очень подробно изложено в вики). В моем случае я использовал I2C, так как SPI уже по умолчанию был занят экраном, и по тестам такое подключение сработало лучше всего. Позицию переключателей проще всего регулировать булавкой или иголкой, пальцы для такого великоваты 🙂
Собрал это все в корпус из лего
Основной софт
В выборе эмуляционной системы, я однозначно остановился на 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. В тестовых скриптах есть примеры и картинки, вместо них можно подставить свои картинки и проверить. По моей задумке экран показывает обложку игры, когда я запускаю ее через «картридж» то есть проездной 🙂
Вне игры, в режиме ожидания, чтобы была какая-то картинка, можно зарядить любую свою, я же пока решил использовать свой старый скетч на процессинге, который писал черт знает когда, с генератором рандомных морд
Малинка хорошо дружит с процессингом (но именно для этого я ставил десктоп, чтобы все установить и проверить запуск скетчей в редакторе),
А тут есть детальный гид, как запускать скетчи на процессинге в командной строке, без экрана. Мне потребовалось лишь адаптировать разрешение сохраняемой картинки и цвета, чтобы они соответствовали палитре экрана.
В итоге, команду на запуск скетча с генерацией картинки я вывел в отдельный исполняемый шелл-скрипт (о них подробнее будет позже), то есть он запускается из под консоли, минуя сам графический интерфейс редактора
В целом получилось так: каждые 5 минут в финальном скрипте, если сейчас не запущенна игра, мы обновляем экран, и даем команду на запуск скетча, скетч сохраняет картинку в нужную директорию (переписывает один и тот же файл) — и ee мы используем при следующем обновлении экрана.
Вообще говоря, в самом питоне уже есть библиотека для работы с графикой PIL (она устанавливается по инструкции вместе с экраном) и аналогичный скетч с генеративной графикой можно написать непосредственно в нем, но мне было лень разбираться, да и не особо нужно.
Можно просто накачать набор тематических картинок и показывать случайную без всяких лишних заморочек 🙂
А можно и вовсе рассмотреть варианты сборки, где экран не дополнительный / декоративный, а на нем и играть прям можно, тогда вся задумка с портативностью и батарейками будет еще более уместной.
Для малинки существует множество таких экранов, которые подключаются по GPIO + HDMI. Но меня лично заинтересовал вариант с подключением по DSI (к специальной шине для подключения дисплея на рашпери) типа такого — так можно собрать все компактно, без лишних проводов.
С батарейным блоком поступил аналогично — просто следовал инструкции с вики, потестил скрипт индикации заряда в консоли — все работает
Если при запуске скрипта с примером консоль ругается на отсутсвие какого-то модуля — устанавливаем этот модуль через pip, например, когда я ставил по инструкции модуль с батарейками, у меня не была установлена библиотека smbus. Фиксим:
sudo pip3 install smbus
Если запустим пример — увидим как терминал пишет текущий уровень заряда
Точно так же с NFC hat: инструкция здесь подключал по I2C интерфейсу.
В примерах несколько питон-скриптов на чтение и запись RFID меток.
Ключ, который выглядит как таблетка от домофона (идет в комплекте с платой) и читается и записывается. Но проездные, по понятной причине только читаются — от записи они защищены, иначе так каждый «умелец» мог бы обеспечить себе безлимитный бесплатный проезд 🙂
Можно купить чистые RFID метки и несколько упростить себе жизнь, ведь так можно на сами карточки напрямую записать команду запуска определенной игры.
Но у меня таких не было, да и определенный reuse шарм в таком случае пропадает. Тем более, что когда свободные «картриджи» закончатся, можно бесплатно пополнить запасы в мусорном ведре у турникета :))
Невозможность записи я обошел по другому — у каждого такого проездного есть свой UID, выглядит как уникальный hex код, типа такого: b’4xc1xf7xa9Wx8bxa7′
Именно его мы можем прочесть в терминале, приложив карточку к сканеру. А если мы можем его прочесть, значит мы можем использовать его как ключ к запуску, просто записав его как ключ в dictionary:
{ : ( <команда запуска игры>, <название игры>, <картинка игры>) }
В последствии соберу свой каталог в отдельный скрипт, команды запуска лежат исполняемыми .sh файлами — об этом расскажу ниже.
Cобираю свой скрипт
Беру все нужные мне штуки из скриптов-примеров для модулей, делаю отдельную директорию home/pi/MagicBox — переношу туда нужные библиотеки (вся структура по ссылке на гите) и комбинирую это все уже в своем скрипте.
Мой код далеко не идеальный, но все работает. Честно говоря, первый раз пишу на питоне, приходилась долго привыкать не ставить автоматом фигурные скобки {}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{} 🙂
Cтруктура такая:
-
основной скрипт называется go.pyв нем логика самого сканера карточеки мониторинг других модулей: батареи и экрананеобходим модуль subprocess:sudo pip3 install subprocess
-
каталог / словарик с карточками-«картриджами» catalogue.py
-
battery.py там практически без изменений скрипт INA219.py из примера.Добавил только автоматическое выключение системы, если уровень заряда меньше 2% и мониторинг температуры процессора
-
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
в нано:
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° максимум, что в общем, вполне в пределах разумного.
В заключении
Хочу сказать, что в процессе сборки всего проекта, я обнаружил, что меня не первого осенило использовать ретропай в связке с NFC сканером. В сети немного, но есть похожие проекты, которые впоследствии прояснили мне много чего про логику самой работы ретропая.
Например есть аналогичный очень добротный проект тут. Кое-что по коду я подтырил у него, хотя это и потребовало значительной адаптации.
Но там все по-серьезному: с 3D печатью, картриджи имитируют вид оригинальных и тд.
Мне же нравится, что получилась немного «колхозная», но самостоятельная история, которая не столько напрямую имитирует вид старых консолей и картриджи, сколько просто дает в такой новой форме аналоговые ощущения.
Да и сама идея использовать для этого проездные мне показалось занятной.
Буду рад если кому-то пригодится этот гид — полностью или частично.
И буду рад любому фидбеку и предложениям — я далеко не эксперт ни в линуксе ни в питоне 🙂