<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>wasdswag</title><author><name>wasdswag</name></author><id>https://teletype.in/atom/wasdswag</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/wasdswag?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@wasdswag?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=wasdswag"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/wasdswag?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-05-31T03:04:39.299Z</updated><entry><id>wasdswag:8_f-Qxqekjc</id><link rel="alternate" type="text/html" href="https://teletype.in/@wasdswag/8_f-Qxqekjc?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=wasdswag"></link><title>retropie+nfc</title><published>2021-11-08T21:10:35.068Z</published><updated>2021-11-08T21:10:35.068Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/c8/91/c891343d-cca6-4350-9bf8-ba3afdc398d0.jpeg"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img2.teletype.in/files/9e/d3/9ed39dfd-06e7-445d-a961-834f4d1196be.jpeg&quot;&gt;</summary><content type="html">
  &lt;h2 id=&quot;RIyv&quot;&gt;&lt;a href=&quot;https://teletype.in/@wasdswag/retropie&quot; target=&quot;_blank&quot;&gt;поменял url %) &lt;br /&gt;инструкция по сборке ретро-консоли с проездными от метро теперь лежит тут:&lt;/a&gt;&lt;/h2&gt;
  &lt;p id=&quot;e1Gs&quot;&gt;&lt;/p&gt;
  &lt;figure id=&quot;v8zR&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/9e/d3/9ed39dfd-06e7-445d-a961-834f4d1196be.jpeg&quot; width=&quot;960&quot; /&gt;
  &lt;/figure&gt;

</content></entry><entry><id>wasdswag:retropie</id><link rel="alternate" type="text/html" href="https://teletype.in/@wasdswag/retropie?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=wasdswag"></link><title>как я собирал ретро-консоль на базе raspberry pi 4 и подружил ее с проездными московского метро</title><published>2021-11-08T07:03:12.369Z</published><updated>2021-11-10T19:45:41.423Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/25/14/25141328-6d93-45e8-9c00-64296b6b7ca8.jpeg"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img1.teletype.in/files/04/2b/042bb50a-a0f3-48ea-af13-3b70477bcc4e.jpeg&quot;&gt;Raspberry Pi — в народе она же малинка — одноплатный компьютер размером с кредитку, к которому можно подключить монитор мышь и клавиатуру и пользоваться ей как обычным десктопным компом, в качестве системы по умолчанию на него устанавливается линукс-дистрибутив на базе Debian — RaspberryPi OS, так же можно накатить Ubuntu или другую линукс системы с поддержкой ARM процессора. </summary><content type="html">
  &lt;h2 id=&quot;5UB4&quot;&gt;&lt;br /&gt;репозиторий проекта на гите:&lt;br /&gt;&lt;a href=&quot;https://github.com/wasdswag/MagicBox&quot; target=&quot;_blank&quot;&gt;https://github.com/wasdswag/MagicBox&lt;/a&gt;&lt;/h2&gt;
  &lt;h3 id=&quot;VjPc&quot;&gt;&lt;/h3&gt;
  &lt;figure id=&quot;WJmi&quot; class=&quot;m_column&quot;&gt;
    &lt;iframe src=&quot;https://www.youtube.com/embed/pSekRT9MNEU?autoplay=0&amp;loop=0&amp;mute=0&quot;&gt;&lt;/iframe&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;doIx&quot;&gt;немного исторической справки:&lt;/h2&gt;
  &lt;p id=&quot;xRLI&quot;&gt;Raspberry Pi — в народе она же малинка — одноплатный компьютер размером с кредитку, к которому можно подключить монитор мышь и клавиатуру и пользоваться ей как обычным десктопным компом, в качестве системы по умолчанию на него устанавливается линукс-дистрибутив на базе Debian — RaspberryPi OS, так же можно накатить Ubuntu или другую линукс системы с поддержкой ARM процессора. &lt;/p&gt;
  &lt;p id=&quot;4Lxr&quot;&gt;&lt;/p&gt;
  &lt;figure id=&quot;8yLR&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/04/2b/042bb50a-a0f3-48ea-af13-3b70477bcc4e.jpeg&quot; width=&quot;2000&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;bKYq&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;dQmv&quot;&gt;Но любят его далеко не за «десктоп», пусть и миниатюрный, — для обычных рабочих дел машинка слабовата и едва ли потягается в производительности с обыкновенным смартфоном на андройде, ютубчик в браузере посмотреть со скрипом можно, но не более того. Малинка давно зарекомендовала себя как платформа для различных самоделок и экспериментов, в сети можно найти множество интересных проектов под raspberry pi, от роботов до метеостанций и «умных» зеркал. &lt;/p&gt;
  &lt;p id=&quot;RDWi&quot;&gt;В совокупности с кучей всяких модулей, расширений и всевозможных сенсоров, которые удобно цепляются за ее гребенку пинов GPIO — платформа становится незаменимой игрушкой для гиков и отличным полигоном для прототипирования различных «умных» гаджетов. А полноценный линукс на борту и приличная производительность последней четвертой ревизии девайса дают еще большую гибкость для любых творческих экспериментов :)&lt;/p&gt;
  &lt;p id=&quot;XnQM&quot;&gt;Я давно питаю любовь к этим одноплатникам — делал на их базе несколько арт-ботов, (один из них до сих пор работает в телеге), делал &lt;a href=&quot;https://www.youtube.com/watch?v=CJaorNaS-Ng&quot; target=&quot;_blank&quot;&gt;конвертор лая моей собаки в твиты&lt;/a&gt; (и таким образом, листая свою ленту, узнавал, что ей неспокойно, пока я на работе), испытывал сервера на node.js, хостил на нем свой веб-сервер (практически это довольно бессмысленно, но прикольно) и тд&lt;/p&gt;
  &lt;p id=&quot;1SAo&quot;&gt;Использовать малинку как эмулятор старых игр — очень распространенная практика — для этого под нее существует аж несколько готовых эмуляционных систем:  &lt;a href=&quot;https://retropie.org.uk/&quot; target=&quot;_blank&quot;&gt;Retropie&lt;/a&gt;, &lt;a href=&quot;https://www.recalbox.com/&quot; target=&quot;_blank&quot;&gt;RecalBox&lt;/a&gt; или &lt;a href=&quot;https://www.lakka.tv/&quot; target=&quot;_blank&quot;&gt;Lakka.&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;iAjo&quot;&gt;Чтобы их поставить — семи пудов во лбу не нужно — просто записываешь образ любой понравившейся системы на микро SD карту (это «жесткий» диск малинки),  закидываешь ромы игр в папку roms, вставляешь это дело в рашпери, подключаешь монитор и любой геймпад — готово. &lt;/p&gt;
  &lt;p id=&quot;AnPZ&quot;&gt;Конечно, в отличии от готовых решений типа Nintendo mini classic — сами игры в комплект не входят, и тут —&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;j4Of&quot;&gt;&lt;strong&gt;важный дисклеймер:&lt;/strong&gt;&lt;/p&gt;
    &lt;p id=&quot;GLNL&quot;&gt;&lt;strong&gt;игры, (кроме тех случаев, где их принадлежность к паблик-домену непрозрачно указана) — даже самые древние, которые уже не купить в магазине легально, все еще принадлежат своим правообладателям! &lt;/strong&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;pwh5&quot;&gt;&lt;em&gt;*Поэтому ищем на свой страх и риск, исключительно в ознакомительных целях. Гугл справляется с этим на отлично, есть большие тематические форумы и сайты. &lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;VTZb&quot;&gt;От себя, я бы сказал, что в случае, если вы обладатель купленной копии игры, использовать ее образ в эмуляторе кажется наиболее морально и этически приемлемым, однако юридически — это может нарушать лицензионные соглашения. Тем не менее не думаю, что боевые спецназовцы из Atari срочно сделают машину времени и придут ловить вас с поличным :)&lt;/p&gt;
  &lt;p id=&quot;G90Q&quot;&gt;Цена вопроса такой самоделки может быть даже выше, чем готовые решения для ретро-гейминга от той же нинтендо, учитывая, что для рашпери понадобится блок питания не меньше 2.5A для RPi3 и не меньше 3A для четвертой малинки, сама SD карта минимум на 16 gb, (не менее 10 класса и желательно быстрая) геймпады и тд. Все это в комплект не входит (разве что вы покупаете готовый бандл в магазине) &lt;/p&gt;
  &lt;p id=&quot;eZCC&quot;&gt;Зато есть полная гибкость — вы не привязаны к одной платформе (SNES в случае с nintendo classic mini). На третьей малинке вполне легко без дополнительного охлада можно поиграть в игры для первой плойки — тот же Tekken3, Final Fantasy 7, Silent Hill — будет вполне бюджетно, а четвертая малинка с небольшим оверклокингом и охладом без проблем запускает хиты для Dreamcast — Сrazy Taxi, Sonic Adventures 2, Shenmue&lt;/p&gt;
  &lt;p id=&quot;jqj7&quot;&gt;Короче, стоит всерьез рассматривать — если хотите упороться и дух гика в вас живет — в остальных случаях ничего не мешает поставить тот же OpenEmu просто на рабочий комп и в ус не дуть. К тому же он бесплатный.&lt;/p&gt;
  &lt;p id=&quot;mkBo&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;1DC8&quot;&gt;ближе к делу:&lt;/h2&gt;
  &lt;p id=&quot;XlWr&quot;&gt;Мой эксперимент с ретро-консолью и проездными на метро вместо картриджей возник довольно спонтанно. Вообще я просто ждал, когда с али-экспресса мне приедут два чудо-девайса для рашпери:&lt;/p&gt;
  &lt;figure id=&quot;JOqO&quot; class=&quot;m_column&quot;&gt;
    &lt;iframe src=&quot;https://www.youtube.com/embed/kJn_Kc-wgow?autoplay=0&amp;loop=0&amp;mute=0&quot;&gt;&lt;/iframe&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Zxmz&quot;&gt;Вот такой 4-х дюймовый 7(!)-цветный &lt;a href=&quot;https://www.waveshare.com/4.01inch-e-paper-hat-f.htm&quot; target=&quot;_blank&quot;&gt;e-paper экран&lt;/a&gt;  — я обожаю «бумажные» дисплеи в читалках, есть в этой технологии какая-то аналогово-цифровая магия, а тут он еще и цветной. Конечно это сугубо не для видео и не для гейминга, там полное обновление изображения занимает секунд 15 (кстати в процессе довольно классно переливается и моргает), но я давно хотел с этим что-нибудь придумать, например сделать игру, где частота кадров 4 кадра в минуту — не баг, а фича. В общем, брал скорее на будущее, с намерением что-то классное с этим потом сделать&lt;/p&gt;
  &lt;figure id=&quot;Simi&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/1f/25/1f25625b-9e74-4438-b044-37d5cbe86866.jpeg&quot; width=&quot;800&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;0u6W&quot;&gt;&lt;a href=&quot;https://www.waveshare.com/wiki/UPS_HAT_(B)&quot; target=&quot;_blank&quot;&gt;Модуль автономного питания&lt;/a&gt; c аккумуляторами, который крепится пинами прям к задней панели малинки, не занимая гребенку пинов GPIO. Впоследствии он оказался скорее бесполезным — вернее, это отличная штука для нетребовательных задач, но с ретропаем или запущенной в графическом режиме OS он недодает по вольтажу — в дримкаст с таким точно не поиграешь. &lt;/p&gt;
  &lt;p id=&quot;Vf04&quot;&gt;Возможно это можно пофиксить, или поискать другие аккумы — не спец по электронике, но на всякий случай написал в техподдержку waveshare — вообще говоря довольно странно, что предупреждение о недо-вольтаже возникает даже при штатном использовании с третьей малинкой.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;8x1R&quot;&gt;&lt;strong&gt;UPD&lt;/strong&gt;: проблему недо-вольтажа можно решить дополнительно запитав малинку через ее штатный usb c порт — подключить шнур USB одним концом к USB порту модуля автономного питания, а type-c в обычный вход для питания малинки. &lt;strong&gt;ВАЖНО: &lt;/strong&gt;нельзя совмещать одновременно автономное питание и обычное питание от розетки, (сам блок с батарейками при этом может быть подключен к розетке, но либо все через батарейки, либо без них обычным штатным питаловом.&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;LnD7&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;7Qvd&quot;&gt;Девайсы пришли на почту, захотелось протестировать их в действии, и тут я вспомнил, что в шкафу у меня завалялась целая куча использованных проездных на метро. Так как по сути в них обычная NFC метка, была идея использовать их для проекта с RFID сканером в качестве ключа или триггера&lt;/p&gt;
  &lt;p id=&quot;s58S&quot;&gt;&lt;/p&gt;
  &lt;figure id=&quot;ULqL&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/ef/1f/ef1f0d53-1914-41cb-b43e-81b716753c1e.jpeg&quot; width=&quot;2049&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Ze5k&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;ExMf&quot;&gt;Недолго думая, я решил попробовать собрать портативную консоль, которая запускала бы любимые игры по «единому», читая команду с метки через сканер RFID. Для рашпери есть вот такая «шляпа»: &lt;/p&gt;
  &lt;figure id=&quot;Co48&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/2f/da/2fdaf1c8-f5ba-4f3f-91ff-f1d4c5af1e93.jpeg&quot; width=&quot;800&quot; /&gt;
    &lt;figcaption&gt;шляпа или hat — платы расширения для  Raspberry Pi, которые крепятся к ней через GPIO по приницпу бутерброда&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;PiyE&quot;&gt;Удобно, что на плате есть удлинитель GPIO пинов, стало быть прикрепив модуль к малинке первым слоем, сверху к этому бутерброду можно добавить и «бумажный» экран и использовать его например для показа артов / обложки запущенной игры и для (неспешного) мониторинга системы — заряд батареи, температура процессора и тд.&lt;/p&gt;
  &lt;p id=&quot;m6Ny&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;wb9E&quot;&gt;итого ингредиенты:&lt;/h2&gt;
  &lt;section style=&quot;background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;ul id=&quot;Qnh9&quot;&gt;
      &lt;li id=&quot;CMGG&quot;&gt;&lt;strong&gt;Rasberry PI 4 / 4gb&lt;/strong&gt;&lt;br /&gt;была в запасах не задействованная 3-я, но уж очень хотелось в Dreamcast :) Брал сразу набором на &lt;a href=&quot;https://amperka.ru/product/malina-v4-4gb&quot; target=&quot;_blank&quot;&gt;амперке, &lt;/a&gt;чтобы не искать по отдельности все нужные шнуры (microHDMI — HDMI) и блок питания (четверка к ним особо привередлива), плюс там в наборе уже есть микро sd c RaspberryPi OS на 16 гигов.&lt;br /&gt;Мне не потребовалась, использовал свою с большим объемом, но лишней точно не будет :)&lt;br /&gt;Весь комплект на амперке 10500р — на алике аналогичный возможно обойдется дешевле, но мне не терпелось&lt;/li&gt;
    &lt;/ul&gt;
    &lt;ul id=&quot;YAdq&quot;&gt;
      &lt;li id=&quot;ZgRj&quot;&gt;&lt;strong&gt;PN532 NFC hat &lt;/strong&gt;— 1900р&lt;/li&gt;
    &lt;/ul&gt;
    &lt;ul id=&quot;G7yJ&quot;&gt;
      &lt;li id=&quot;FuPi&quot;&gt;&lt;strong&gt;4&amp;#x60; ACeP 7-Color E-Paper E-Ink Display HAT &lt;/strong&gt;~3600р&lt;/li&gt;
      &lt;li id=&quot;S3Li&quot;&gt;&lt;strong&gt;UPS HAT (B) &lt;/strong&gt;~1600р&lt;/li&gt;
      &lt;li id=&quot;UQmt&quot;&gt;&lt;strong&gt;2 аккумулятора 16850 &lt;/strong&gt;~1200р&lt;/li&gt;
      &lt;li id=&quot;ZnTL&quot;&gt;&lt;strong&gt;один вентилятор и 2 медных радиатора для рашпери &lt;/strong&gt;~500р&lt;/li&gt;
      &lt;li id=&quot;0zpl&quot;&gt;&lt;strong&gt;большая micro sd карта 256 gb samsung &lt;/strong&gt;~3500р&lt;/li&gt;
      &lt;li id=&quot;sf9n&quot;&gt;&lt;strong&gt;лего для корпуса &lt;/strong&gt;~1200р&lt;/li&gt;
      &lt;li id=&quot;3zRZ&quot;&gt;&lt;strong&gt;геймпад &lt;/strong&gt;(любой, у меня от плойки)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/section&gt;
  &lt;p id=&quot;XWIz&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;WCq6&quot;&gt;Получилось, прямо скажем, не очень бюджетно — но этот набор можно урезать раза в 2-2,5, если убрать экран и питалово на аккумах, которое, как выяснилось позже, оказалось не особо полезным для этой цели. (хотя и позволяет поиграть в нетребовательные игры) Также sd карточка может быть существенно поменьше, я брал с запасом надолго.&lt;/p&gt;
  &lt;h3 id=&quot;gLxg&quot;&gt;&lt;/h3&gt;
  &lt;h2 id=&quot;icoo&quot;&gt;собираем бутерброд:&lt;/h2&gt;
  &lt;figure id=&quot;SBMD&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/02/e9/02e9feba-997a-40c5-8404-516447b1096b.jpeg&quot; width=&quot;922&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;Lbvn&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/19/71/197173f7-7bda-42d3-aec5-31f9cf8558d7.jpeg&quot; width=&quot;721&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;aQPv&quot;&gt;Также нужно немного охладить нашу малинку — радиаторы для нее самоклеющиеся, насаживаю один на чип процесора и видеоядра (они рядом) плюс маленький вентилятор:&lt;/p&gt;
  &lt;p id=&quot;sw5m&quot;&gt; &lt;/p&gt;
  &lt;figure id=&quot;iy4O&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/b2/9a/b29a2ad9-a213-4bb9-a591-4e6d86be63f7.jpeg&quot; width=&quot;1000&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;tnfs&quot;&gt;Цепляется он за 4 и 6 пин на GPIO — черным к земле на 6 и красным на 4 (5-вольтовая линия).  &lt;/p&gt;
  &lt;p id=&quot;Ag5r&quot;&gt;Проблема что вся гребенка у меня уже занята NFC модулем, поэтому я просто вытащил два проводка из джампера, оголил кончики и аккуратно &lt;s&gt;припаял&lt;/s&gt; насадил маленькими петельками их на пины, прижав сверху  NFC модулем.&lt;/p&gt;
  &lt;p id=&quot;r7xG&quot;&gt;Делать так конечно&lt;strong&gt; категорически не правильно &lt;/strong&gt;— лучше аккуратно припаять, но паяльника у меня не было, да и паять я не мастер. В любом случае, очень важно, чтобы ничего не замыкало провода и они были изолированы друг от друга. &lt;/p&gt;
  &lt;p id=&quot;pZV6&quot;&gt;Несмотря на такой колхоз, получилось в целом достаточно аккуратно, а модуль сверху, придавливая, дополнительно все фиксирует.&lt;/p&gt;
  &lt;p id=&quot;kta2&quot;&gt;&lt;/p&gt;
  &lt;figure id=&quot;ZmSq&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/15/81/1581ec83-b7cf-476e-9505-9d010b601b00.jpeg&quot; width=&quot;2076&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;ivlM&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;89rE&quot;&gt;Сам NFC модуль имеет три режима — по какому интерфейсу коммуницировать с малинкой: UART, SPI и I2C. Для переключения режимов, перед тем как накрывать все это дело экраном и собрать в самопальный корпус из лего — нужно выставить джамперы и переключатели в нужную позицию. &lt;/p&gt;
  &lt;p id=&quot;em3j&quot;&gt;Опытным путем мне подошел интерфейс I2C (про установку и настройку waveshare модулей у них всегда очень подробно изложено в &lt;a href=&quot;https://www.waveshare.com/wiki/PN532_NFC_HAT&quot; target=&quot;_blank&quot;&gt;вики&lt;/a&gt;). В моем случае я использовал I2C, так как SPI уже по умолчанию был занят экраном, и по тестам такое подключение сработало лучше всего. Позицию переключателей проще всего регулировать булавкой или иголкой, пальцы для такого великоваты :)&lt;/p&gt;
  &lt;figure id=&quot;wmRQ&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/d4/61/d46178a8-1a09-4fc7-88b7-53d188ffe5ca.png&quot; width=&quot;938&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;LMf3&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;RGsb&quot;&gt;собрал это все в корпус из лего:&lt;/h2&gt;
  &lt;figure id=&quot;VfFw&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/7b/46/7b46a3c1-ddcc-449c-839a-06e355c84dbb.jpeg&quot; width=&quot;909&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;ema2&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/98/c4/98c41383-d69c-48e8-b062-ee2e89fd7b78.jpeg&quot; width=&quot;903&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;ZBYr&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/8f/96/8f96098e-e810-4a0f-9ec3-8cab9d25b0f3.jpeg&quot; width=&quot;960&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;p0NP&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;LIiU&quot;&gt;основной софт&lt;/h2&gt;
  &lt;p id=&quot;UdL6&quot;&gt;В выборе эмуляционной системы, я однозначно остановился на&lt;a href=&quot;https://retropie.org.uk/&quot; target=&quot;_blank&quot;&gt; Retropie&lt;/a&gt; — он представляет собой не отдельную в вакууме ось, а надстройку над существующей и хорошо знакомой raspberry pi OS, а это уже даёт привычную среду для дальнейшей кастомизации и настройки. &lt;/p&gt;
  &lt;p id=&quot;zcGu&quot;&gt;Да и комьюнити и документации там побольше. Установка предельно простая: скачиваем &lt;a href=&quot;https://www.raspberrypi.com/software/&quot; target=&quot;_blank&quot;&gt;imager&lt;/a&gt; с официального сайта raspberry pi, вставляем micro SD в комп, и в выборе операционки в imager выбираем ретропай для нашей версии малинки (3 и 4 несовместимы между собой!) &lt;/p&gt;
  &lt;p id=&quot;mUH6&quot;&gt;Записываем образ на sd-карту, вставляем в малинку, подключаем к ней монитор, геймпад и клавиатуру (понадобится в ходе настройки) подключаем питание, и ждём загрузку системы. &lt;/p&gt;
  &lt;p id=&quot;NTF4&quot;&gt;Ретропай сходу определит геймпад и предложит его «замэпить» — просто следуем инструкции и нажимаем нужные кнопки. Последний хоткей я оставляю нетронутым, тогда им по умолчанию становится кнопка select. &lt;/p&gt;
  &lt;p id=&quot;UFSS&quot;&gt;Далее в играх под ретроарчем &lt;strong&gt;select+start&lt;/strong&gt; — выход, &lt;strong&gt;select+Y&lt;/strong&gt; — быстрое меню ретроарч в игре, которое позволяет сохранить текущий стейт игры, настроить контроллер и много всяких дополнительных плюшек.&lt;br /&gt;&lt;/p&gt;
  &lt;p id=&quot;oTGB&quot;&gt;Затем в пункте меню Retropie идем в настройки, настраиваем вайфай, заходим в пункт raspi-config (понадобится клавиатура) — &lt;br /&gt;в пункте &lt;strong&gt;3: Interface Options&lt;/strong&gt; включаем все необходимые интерфейсы, &lt;br /&gt;в моем случае это: SSH, I2C, SPI&lt;/p&gt;
  &lt;p id=&quot;4BaW&quot;&gt;Перезагружаем.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;1RfB&quot;&gt;&lt;em&gt;&lt;strong&gt;SSH&lt;/strong&gt; позволяет удаленно управлять малинкой с другого компа через командную строку терминала. Для этого необходимо узнать ее локальный IP-адрес, после подключения к вайфаю сделать это можно просто в основном меню настроек ретропая — там есть соотвествующий пункт «показать IP» например мой: 192.168.200.11&lt;/em&gt;&lt;/p&gt;
    &lt;p id=&quot;U92p&quot;&gt;на маке или линуксе открываем терминал и далее пишем:&lt;br /&gt;(на 10 винде тоже есть терминал (command promt или что-то в этом роде) — если нет — можно скачать Putty)&lt;/p&gt;
    &lt;pre id=&quot;MQAo&quot;&gt;ssh pi@192.168.200.11&lt;/pre&gt;
    &lt;p id=&quot;vxvB&quot;&gt;у нас спросят пароль, если вы специально его не меняли пишем &lt;strong&gt;raspberry&lt;/strong&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;jeBS&quot;&gt;&lt;br /&gt;Следующим шагом — в дополнении в ретропаю, можно установить и десктоп — мне он пригодился для одной задачи, но в целом делать это не обязательно, особенно если места не очень много. &lt;/p&gt;
  &lt;p id=&quot;LMtB&quot;&gt;Идем в retropie-setup в пункте tools ищем строку raspbian related tools — выбираем install pixel desktop. После этого выход из emulation station в десктоп можно совершить нажатием кнопки F4 — в командной строке набираем &lt;strong&gt;startx &lt;/strong&gt;жмем ENTER (или через основное меню — наряду с логотипами приставок там появится пункт PORTS — вызвать десктоп можно оттуда)&lt;/p&gt;
  &lt;p id=&quot;etLG&quot;&gt;По умолчанию в ретропай не включены все эмуляторы, которые он в принципе поддерживает. Тоже идем в настройки ретропая смотрим дополнительные пакеты и ставим. Некоторые лежат в экспериментальных. &lt;/p&gt;
  &lt;p id=&quot;6ZM1&quot;&gt;Если избирательно — просто ищите нужную вам платформу на сайте ретропая и смотрите вики по настройке и нужному эмулятору, у меня места много, поэтому я просто установил их все разом (это заняло какое-то время).&lt;/p&gt;
  &lt;p id=&quot;zfwg&quot;&gt;Вроде все основные пункты по самому ретропаю я осветил, но всю эту инфу можно без проблем и во всех подробностях найти в сети :)&lt;br /&gt;&lt;/p&gt;
  &lt;h2 id=&quot;wRXv&quot;&gt;устанавливаю модули:&lt;/h2&gt;
  &lt;p id=&quot;x1oO&quot;&gt;Тут все просто — инструкции для e-paper экрана, NFC сканнер и UPS блок с аккумуляторами подробно расписаны у производителя на вики страничках:&lt;br /&gt;&lt;strong&gt;&lt;a href=&quot;https://www.waveshare.com/wiki/4.01inch_e-Paper_Module_(F)&quot; target=&quot;_blank&quot;&gt;экран&lt;/a&gt; , &lt;a href=&quot;https://www.waveshare.com/wiki/UPS_HAT_(B)&quot; target=&quot;_blank&quot;&gt;UPS&lt;/a&gt; , &lt;a href=&quot;https://www.waveshare.com/wiki/PN532_NFC_HAT&quot; target=&quot;_blank&quot;&gt;NFC сканер&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;GSHW&quot;&gt;Писать свой скрипт я буду на питоне, поэтому использую инструкции для установки и скрипты-примеры для него.&lt;/p&gt;
  &lt;p id=&quot;16j5&quot;&gt;Все это делается в терминале, если делать на самой рашпери — выходим в режим терминала из графического режима emulation station нажатием клавиши F4, или, если накатили поверх ретропая десктоп — выходим в него и запускаем терминал там. &lt;/p&gt;
  &lt;p id=&quot;7Dms&quot;&gt;Мне же проще всего было проделывать все это удаленно, через SSH — так и команды с вики можно просто копипастить в терминал :)&lt;/p&gt;
  &lt;p id=&quot;TRsy&quot;&gt;Я начал с экрана, попутно по инструкции, устанавливаем весь нужный софт и библиотеки, основное что нам потребуется это менеджер пакетов для питона pip3&lt;/p&gt;
  &lt;p id=&quot;nVW8&quot;&gt;Запуск примеров: после того, как установили, в терминале переходим в директорию, где лежат примеры. Навигация по каталогам: &lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;hVJC&quot;&gt;&lt;strong&gt;cd /путь-к-папке/ &lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;cd ..&lt;/strong&gt; перейти на уровень выше&lt;br /&gt;&lt;strong&gt;cd ~&lt;/strong&gt;  перейти в домашнюю директорию&lt;br /&gt;&lt;strong&gt;ls &lt;/strong&gt; выводит список файлов и папок внутри директории&lt;br /&gt;для быстрого перехода можно набирая команды использовать клавишу tab для автонабора нужных файлов и директорий &lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;e3sl&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;Wv28&quot;&gt;Запуск примера с экраном, находясь в директории со скриптами:&lt;/p&gt;
  &lt;pre id=&quot;3Cht&quot;&gt;sudo python3 epd_4in01f_test.py&lt;/pre&gt;
  &lt;p id=&quot;ymJK&quot;&gt;&lt;br /&gt;Все картинки для e-paper экрана строго ограничены цветовой палитрой, никаких полутонов, а это значит, что их нужно прогонять через dithering-алгоритм. &lt;/p&gt;
  &lt;p id=&quot;NZyV&quot;&gt;Проще всего делать это в фотошопе, а &lt;a href=&quot;https://www.waveshare.com/wiki/E-Paper_Floyd-Steinberg&quot; target=&quot;_blank&quot;&gt;тут&lt;/a&gt; есть подробная инструкция. Также разрешение должно быть точно таким же, как и разрешение самого экрана, у меня 640×400. В тестовых скриптах есть примеры и картинки, вместо них можно подставить свои картинки и проверить. По моей задумке экран показывает обложку игры, когда я запускаю ее через «картридж» то есть проездной :)&lt;/p&gt;
  &lt;figure id=&quot;9yGB&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/6e/b8/6eb876a0-2353-49d0-b2c2-ee2c4f2143cf.jpeg&quot; width=&quot;823&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;iuZ1&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/be/da/bedace1a-f04f-4f79-9deb-686e44cc1721.jpeg&quot; width=&quot;914&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;4wyP&quot;&gt;Вне игры, в режиме ожидания, чтобы была какая-то картинка, можно зарядить любую свою, я же пока решил использовать свой старый скетч на &lt;a href=&quot;https://processing.org/&quot; target=&quot;_blank&quot;&gt;процессинге&lt;/a&gt;, который писал черт знает когда, с &lt;a href=&quot;https://lab.wasdswag.com/random-person/&quot; target=&quot;_blank&quot;&gt;генератором рандомных морд&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;Njri&quot;&gt;Малинка хорошо дружит с процессингом (но именно для этого я ставил десктоп, чтобы все установить и проверить запуск скетчей в редакторе),&lt;/p&gt;
  &lt;p id=&quot;NLmB&quot;&gt;А тут есть &lt;a href=&quot;https://medium.com/chi-chi-go-make/runing-headless-processing-sketch-in-rpi4-98bd44e79fce&quot; target=&quot;_blank&quot;&gt;детальный гид,&lt;/a&gt; как запускать скетчи на процессинге в командной строке, без экрана. Мне потребовалось лишь адаптировать разрешение сохраняемой картинки и цвета, чтобы они соответствовали палитре экрана. &lt;/p&gt;
  &lt;p id=&quot;Ameb&quot;&gt;В итоге команду на запуск скетча с генерацией картинки я вывел в отдельный исполняемый шелл-скрипт (о них подробнее будет позже), то есть он запускается из под консоли, минуя сам графический интерфейс редактора&lt;/p&gt;
  &lt;p id=&quot;dlSw&quot;&gt;В целом получилось так: каждые 5 минут в финальном скрипте, если сейчас не запущена игра, мы обновляем экран, и даем команду на запуск скетча, скетч сохраняет картинку в нужную директорию (переписывает один и тот же файл) — и ee мы используем при следующем обновлении экрана. &lt;/p&gt;
  &lt;p id=&quot;5Zcj&quot;&gt;Вообще говоря, в самом питоне уже есть библиотека для работы с графикой PIL (она устанавливается по инструкции вместе с экраном) и аналогичный скетч с генеративной графикой можно написать непосредственно в нем, но мне было лень разбираться, да и не особо нужно. &lt;/p&gt;
  &lt;p id=&quot;XBVa&quot;&gt;Можно просто накачать набор тематических картинок и показывать случайную без всяких лишних заморочек :) &lt;/p&gt;
  &lt;p id=&quot;kcUk&quot;&gt;А можно и вовсе рассмотреть варианты сборки, где экран не дополнительный / декоративный, а на нем и играть прям можно, тогда вся задумка с портативностью и батарейками будет еще более уместной. &lt;/p&gt;
  &lt;p id=&quot;LvGI&quot;&gt;Для малинки существует множество таких экранов, которые подключаются по GPIO + HDMI. Но меня лично заинтересовал вариант с подключением по DSI (к специальной шине для подключения дисплея на рашпери) типа&lt;a href=&quot;https://amperka.ru/product/waveshare-display-raspberry-pi-4n3in-dsi&quot; target=&quot;_blank&quot;&gt; такого&lt;/a&gt;  — так можно собрать все компактно, без лишних проводов.&lt;/p&gt;
  &lt;p id=&quot;pa5n&quot;&gt;С батарейным блоком поступил аналогично — просто &lt;a href=&quot;https://www.waveshare.com/wiki/UPS_HAT_(B)&quot; target=&quot;_blank&quot;&gt;следовал инструкции с вики&lt;/a&gt;, потестил скрипт индикации заряда в консоли — все работает&lt;/p&gt;
  &lt;p id=&quot;dNA2&quot;&gt;Если при запуске скрипта с примером консоль ругается на отсутствие какого-то модуля — устанавливаем этот модуль через pip, например, когда я ставил по инструкции модуль с батарейками, у меня не была установлена библиотека smbus. Фиксим:&lt;/p&gt;
  &lt;pre id=&quot;e2ih&quot;&gt;sudo pip3 install smbus &lt;/pre&gt;
  &lt;p id=&quot;yzSX&quot;&gt;Если запустим пример — увидим, как терминал пишет текущий уровень заряда&lt;/p&gt;
  &lt;p id=&quot;mTrH&quot;&gt;Точно так же с NFC hat: &lt;a href=&quot;https://www.waveshare.com/wiki/PN532_NFC_HAT&quot; target=&quot;_blank&quot;&gt;инструкция здесь&lt;/a&gt; подключал по I2C интерфейсу.&lt;br /&gt;В примерах несколько питон-скриптов на чтение и запись RFID меток.&lt;/p&gt;
  &lt;p id=&quot;p1uK&quot;&gt;Ключ, который выглядит как таблетка от домофона (идет в комплекте с платой) и читается и записывается. Но проездные, по понятной причине только читаются — от записи они защищены, иначе так каждый «умелец» мог бы обеспечить себе безлимитный бесплатный проезд :) &lt;/p&gt;
  &lt;p id=&quot;Ce99&quot;&gt;Можно купить чистые RFID метки и несколько упростить себе жизнь, ведь так можно на сами карточки напрямую записать команду запуска определенной игры. &lt;/p&gt;
  &lt;p id=&quot;OhtH&quot;&gt;Но у меня таких не было, да и определенный reuse шарм в таком случае пропадает. Тем более, что когда свободные «картриджи» закончатся, можно бесплатно пополнить запасы в мусорном ведре у турникета :))&lt;/p&gt;
  &lt;p id=&quot;mVgo&quot;&gt;Невозможность записи я обошел по-другому — у каждого такого проездного есть свой UID, выглядит как уникальный hex код, типа такого:&lt;em&gt; b&amp;#x27;4\xc1\xf7\xa9W\x8b\xa7&amp;#x27; &lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;ZnRV&quot;&gt;Именно его мы можем прочесть в терминале, приложив карточку к сканеру. А если мы можем его прочесть, значит мы можем использовать его как ключ к запуску, просто записав его как ключ в dictionary: &lt;/p&gt;
  &lt;pre id=&quot;qI3i&quot;&gt;{ &amp;lt;UID ключ&amp;gt; : ( &amp;lt;команда запуска игры&amp;gt;, &amp;lt;название игры&amp;gt;, &amp;lt;картинка игры&amp;gt;) } &lt;/pre&gt;
  &lt;p id=&quot;xzRo&quot;&gt;Впоследствии соберу свой каталог в отдельный &lt;a href=&quot;https://github.com/wasdswag/MagicBox/blob/main/run/catalogue.py&quot; target=&quot;_blank&quot;&gt;скрипт&lt;/a&gt;, команды запуска лежат исполняемыми .sh файлами — об этом расскажу ниже.&lt;/p&gt;
  &lt;h2 id=&quot;GcID&quot;&gt;&lt;br /&gt;собираю свой скрипт&lt;/h2&gt;
  &lt;p id=&quot;35C5&quot;&gt;Беру все нужные мне штуки из скриптов-примеров для модулей, делаю отдельную директорию home/pi/MagicBox — переношу туда нужные библиотеки (вся структура по ссылке на &lt;a href=&quot;https://github.com/wasdswag/MagicBox&quot; target=&quot;_blank&quot;&gt;гите&lt;/a&gt;) и комбинирую это все уже в своем скрипте.&lt;/p&gt;
  &lt;p id=&quot;PdhP&quot;&gt;Мой код далеко не идеальный, но все работает. Честно говоря, первый раз пишу на питоне, приходилась долго привыкать не ставить автоматом фигурные скобки {}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{} :-)&lt;/p&gt;
  &lt;p id=&quot;tNHt&quot;&gt;&lt;br /&gt;&lt;strong&gt;структура такая:&lt;/strong&gt;&lt;/p&gt;
  &lt;ol id=&quot;3RLJ&quot;&gt;
    &lt;li id=&quot;wzhg&quot;&gt;основной скрипт называется &lt;a href=&quot;https://github.com/wasdswag/MagicBox/blob/main/run/go.py&quot; target=&quot;_blank&quot;&gt;go.py&lt;br /&gt;&lt;/a&gt;в нем логика самого сканера карточек&lt;br /&gt;и мониторинг других модулей: батареи и экрана&lt;br /&gt;необходим модуль subprocess:&lt;br /&gt;&lt;em&gt;sudo pip3 install subprocess&lt;/em&gt;&lt;/li&gt;
    &lt;li id=&quot;u53t&quot;&gt;каталог / словарик с карточками-«картриджами» &lt;a href=&quot;https://github.com/wasdswag/MagicBox/blob/main/run/catalogue.py&quot; target=&quot;_blank&quot;&gt;catalogue.py&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;2d4b&quot;&gt;&lt;a href=&quot;https://github.com/wasdswag/MagicBox/blob/main/run/battery.py&quot; target=&quot;_blank&quot;&gt;battery.py&lt;/a&gt; там практически без изменений скрипт INA219.py из примера.&lt;br /&gt;Добавил только автоматическое выключение системы, если уровень заряда меньше 2% и мониторинг температуры процессора&lt;/li&gt;
    &lt;li id=&quot;Ny23&quot;&gt;&lt;a href=&quot;https://github.com/wasdswag/MagicBox/blob/main/run/screen.py&quot; target=&quot;_blank&quot;&gt;screen.py&lt;/a&gt; — там методы для обновления бумажного экрана, ему пасуем картинку и тд&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;XINz&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;MwV3&quot;&gt;Устроено это так: есть основной скрипт, в нем два потока — один отвечает за инфу на экране, каждые 10 секунд смотрит есть ли активный картридж с картинкой, мониторит батарею и температуру процессора, другой же отвечает за сканер, и если прикладываешь проездной и он есть в картотеке — запускает игру, и передает мониторинг-системе инфу о картридже, чтобы поменять картинку. И третий цикл в основном потоке для обновления картинок в режиме ожидания, если нет картриджа ждет 5 минут и меняет на картинку с &lt;a href=&quot;https://lab.wasdswag.com/random-person/&quot; target=&quot;_blank&quot;&gt;мордами&lt;/a&gt;.&lt;br /&gt;&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;RtQz&quot;&gt;*по возможности&lt;strong&gt; НИКОГДА &lt;/strong&gt;не выключайте малинку просто обрубив питание. Микро-SD карточки, на которых записана система очень чувствительны к такого рода стрессам, будут ошибки и бэд-блоки на диске, а то и вовсе полетит система. Именно поэтому, если что-то получилось сделать — советую делать бекап образа, чтобы в случае такой поломки из него можно было восстановить и перезаписать образ системы&lt;/p&gt;
    &lt;p id=&quot;SPuM&quot;&gt;в каталоге я предусмотрел 2 синих проездных с записанными системными командами reboot (sudo reboot) и выключение (sudo shutdown -h now), которые, в случае чего, позволяют быстро выключить или перезапустить малинку безопасно. По-хорошему бы, конечно кнопку отдельную вынести, но не было. (и лень)&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;6vLr&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;1EgW&quot;&gt;Весь код писал в SublimeText удаленно, подключив рашпери к компу через протокол Samba, чтобы в проводнике был доступ к файловой системе малинки. &lt;br /&gt;&lt;br /&gt;Смотрим тут если что, там ничего сложного: &lt;a href=&quot;https://ramokromok.com/threads/setting-up-samba-share-on-windows-10-to-access-files-on-the-retropie.105/&quot; target=&quot;_blank&quot;&gt;https://ramokromok.com/threads/setting-up-samba-share-on-windows-10-to-access-files-on-the-retropie.105/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Поскольку в настройках по умолчанию в самбе мы видим только папки roms, bios и splashscreens, а свою директорию с программой я сделал в home — обновляю настройки самбы, включив в него доступ ко всей директории home:&lt;/p&gt;
  &lt;p id=&quot;RZc8&quot;&gt;sudo — запуск чего-либо с правами админа&lt;br /&gt;nano — это текстовый редактор в терминале&lt;/p&gt;
  &lt;p id=&quot;Zszh&quot;&gt;&lt;/p&gt;
  &lt;pre id=&quot;5v33&quot;&gt;sudo nano /etc/samba/smb.conf&lt;/pre&gt;
  &lt;figure id=&quot;Wd73&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/84/5b/845be9b1-092a-4517-8e0a-3f32299d932c.png&quot; width=&quot;1394&quot; /&gt;
  &lt;/figure&gt;
  &lt;section style=&quot;background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;6aIc&quot;&gt;в нано:&lt;br /&gt;&lt;br /&gt;ctrl + O → ENTER  — сохранить&lt;br /&gt;ctrl + X — выйти&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;1i8J&quot;&gt;теперь помимо SSH мы можем получить доступ к фалам и папкам малинки прямо в проводнике, создавать и менять там файлы, закидывать ромы игр и тд. (правда иногда это может быть довольно медленно)&lt;/p&gt;
  &lt;p id=&quot;sCvX&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;tU00&quot;&gt;а теперь самое главное: &lt;br /&gt;как заставить все это работать?&lt;/h2&gt;
  &lt;p id=&quot;iP6k&quot;&gt;В ретропай, для запуска команд (игр в нашем случае) через консоль, минуя графический интерфейc emulation station, существует шел-скрипт &lt;a href=&quot;https://retropie.org.uk/docs/Runcommand/&quot; target=&quot;_blank&quot;&gt;runcommand.sh&lt;/a&gt;&lt;br /&gt;Запуск игр в нем осуществляется с такими параметрами:&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;zFAl&quot;&gt;&lt;code&gt;&lt;strong&gt;/opt/retropie/supplementary/runcommand/runcommand.sh 0 _SYS_ nes &amp;#x27;/home/pi/RetroPie/roms/nes/SuperMarioBros.nes&amp;#x27;&lt;/strong&gt;&lt;/code&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;Hwka&quot;&gt;То есть: &amp;lt;сам путь к скрипту&amp;gt;, &amp;lt;система (эмулятор)&amp;gt;  &amp;lt;и путь к файлу с ромом&amp;gt;&lt;/p&gt;
  &lt;p id=&quot;7hm5&quot;&gt;Для того чтобы скрипт корректно отработал, предполагается, что мы выходим из графического режима emulation station и запускаем все это дело через терминал.&lt;/p&gt;
  &lt;p id=&quot;Etwh&quot;&gt;Следовательно, перед запуском игры по проездному, нам нужно «убить» все процессы emulation station или уже запущенные ранее игры.&lt;br /&gt;&lt;br /&gt;Для того, чтобы наш питон-скрипт умел запускать и выполнять команды в терминале, добавляем ему в модули import os (или аналогичная вещь subprocess)&lt;/p&gt;
  &lt;p id=&quot;w7ue&quot;&gt;У каждого процесса в диспетчере задач есть свой уникальный номер, наша задача его выяснить и нежно вырубить командой&lt;/p&gt;
  &lt;pre id=&quot;3pW7&quot;&gt;$ kill -15  &amp;lt;ID&amp;gt;&lt;/pre&gt;
  &lt;p id=&quot;0E8Z&quot;&gt;Аргумент -15 это SIGTERM (то есть нежно) -9 SIGKILL (то есть жестко)&lt;br /&gt;всегда по возможности лучше нежно))&lt;br /&gt;&lt;br /&gt;Делаем массив имен процессов (это список всех возможных эмуляторов и сама emulation station)  посылаем его на проверку методу kill_process в скрипте &lt;a href=&quot;https://github.com/wasdswag/MagicBox/blob/main/run/go.py&quot; target=&quot;_blank&quot;&gt;go.py&lt;/a&gt;&lt;br /&gt;так же, через консольную команду: &lt;/p&gt;
  &lt;pre id=&quot;nOJx&quot;&gt;ps ax | grep &amp;lt;process_name&amp;gt; | grep -v grep&lt;/pre&gt;
  &lt;p id=&quot;wQ2S&quot;&gt;Выводим полную строку этого процесса в диспетчере задач, где первым элементом будет как раз ID процесса, который мы убиваем. И так будет со всеми!!!&lt;br /&gt;&lt;br /&gt;emulation-station может вырубится не сразу, и тогда может случится асинхрон, все процессы еще не вырубились, а игра уже запустилась, но при этом на экране мы ее не увидим. &lt;/p&gt;
  &lt;p id=&quot;ucwb&quot;&gt;Делаем для нее дополнительную проверку на наличие этого процесса в диспетчере в цикле, &lt;strong&gt;def process_is_running(proc_name)&lt;/strong&gt; —&lt;br /&gt;&lt;em&gt;&amp;lt;переключить на черно-белый режим&amp;gt; &lt;/em&gt;и убивать, убивать, убивать (секунды за 2-3 это происходит) — и только после этого даем команду на запуск рома через runcommand.sh&lt;br /&gt;&lt;/p&gt;
  &lt;p id=&quot;KMaJ&quot;&gt;Поскольку команды запуска довольно длинные, и не хотелось их вручную выносить в сам скрипт каталога (будет просто мешанина из стрингов!), я организовал отдельные исполняемые шелл-скрипты под каждую игрулю. &lt;br /&gt;&lt;br /&gt;sh-скрипт делается так:&lt;br /&gt;в терминале переходим в нужную нам директорию, у меня это папка в домашней директории /MagicBox/run/&lt;br /&gt;пример:&lt;/p&gt;
  &lt;pre id=&quot;jIWK&quot;&gt;cd MagicBox/run
nano crazyTaxi.sh&lt;/pre&gt;
  &lt;p id=&quot;uaBC&quot;&gt;nano — консольный текстовый редактор, &lt;br /&gt;crazyTaxi — карточка для игры Crazy Taxi, которую будем делать, &lt;br /&gt;.sh — расширение шел-скрипта.&lt;/p&gt;
  &lt;p id=&quot;JYQd&quot;&gt;&lt;br /&gt;В открывшемся редакторе пишу текст команды:&lt;/p&gt;
  &lt;pre id=&quot;ET5M&quot;&gt;/opt/retropie/supplementary/runcommand/runcommand.sh 0 _SYS_ dreamcast /home/pi/RetroPie/roms/dreamcast/Crazy_Taxi_v1/CrazyTaxi.gdi
emulationstation&lt;/pre&gt;
  &lt;p id=&quot;X80j&quot;&gt;ctrl + O → ENTER сохранить&lt;br /&gt;ctrl + X выйти из nano&lt;br /&gt;&lt;br /&gt;Это означает: запусти игру по такому-то пути, а на выходе из игры запусти обратно emulation station&lt;br /&gt;&lt;br /&gt;К тому же, при таком подходе, сам путь к директории нужной игры легко скопировать из проводника, а не писать его ручками, меняя все пробелы в строке на понятные компу &amp;quot;\ &amp;quot;  (по крайней мере на маке все пути корректно копируются в терминал, так, что компуктер это понимает)&lt;/p&gt;
  &lt;p id=&quot;Wjuv&quot;&gt;Далее этому файлу нужно дать доступ, то есть сделать его по настоящему исполняемым. В линуксе очень гибкая система настройки пользовательских прав, есть куча разных атрибутов, но я человек простой и использую ультимейт права для всех подобных скриптов, если не нужно сильно беспокоится о безопасности, поэтому далее:&lt;/p&gt;
  &lt;pre id=&quot;4h5a&quot;&gt;sudo chmod 777 crazyTaxi.sh&lt;/pre&gt;
  &lt;p id=&quot;ICAr&quot;&gt;sudo — это как запустить команду с правами администратора, &lt;br /&gt;chmod 777 — ставит права доступа на чтение запись и исполнение любому пользователю&lt;/p&gt;
  &lt;p id=&quot;0yKV&quot;&gt;Далее, в питон-скрипте просто указываем ссылку на директорию где лежат наши .sh скрипты с карточками, и вместо множества букв пасуем эти карточки в словарик с играми.&lt;br /&gt;&lt;br /&gt;Дополнительно я сделал две системные карточки на выключение и перезагрузку малинки, команды там простые и короткие, поэтому отдельных шел-скриптов, как с играми я не делал:&lt;br /&gt;перезагрузка — sudo reboot / выключение — sudo shutdown -h now&lt;br /&gt;&lt;br /&gt;Осталось только сделать так, чтобы наш основной скрипт запускался автоматом вместе с системой. Для этого в ретропае тоже есть скрипт autostart.sh&lt;br /&gt;идем к нему и редактируем:&lt;/p&gt;
  &lt;pre id=&quot;zhXS&quot;&gt;sudo nano /opt/retropie/configs/all/autostart.sh&lt;/pre&gt;
  &lt;p id=&quot;Goux&quot;&gt;мой основной скрипт называется go.py и лежит он в папке home/MagicBox/run&lt;br /&gt;пишем команду запуска скрипта:&lt;/p&gt;
  &lt;pre id=&quot;qbmd&quot;&gt;python3 /home/pi/MagicBox/run/go.py &amp;amp; emulationstation&lt;/pre&gt;
  &lt;p id=&quot;6G6n&quot;&gt;ctrl + O → ENTER / ctrl + X&lt;/p&gt;
  &lt;p id=&quot;DaCo&quot;&gt;Так, на старте системы, мы запустим скрипт в основном окне терминала, но если я захочу добавить новые карточки, будет не очень сподручно смотреть их UID код и добавлять в &lt;a href=&quot;https://github.com/wasdswag/MagicBox/blob/main/run/catalogue.py&quot; target=&quot;_blank&quot;&gt;словарик&lt;/a&gt; новые ключи. &lt;br /&gt;&lt;br /&gt;Сейчас программа, если я прикладываю «чистый» проездной печатает в терминал его UID — соответсвенно я его копирую и записываю ключом в словарик.&lt;/p&gt;
  &lt;p id=&quot;q2ec&quot;&gt;Если я ставлю запуск всей системы в автостарт — мой питон скрипт крутится к &amp;quot;главном&amp;quot; окне терминала под emulation station — если я хочу посмотреть вывод в консоль, скопировать чистый ключ, просто подключившись через SSH у меня не получится, нужно смотреть на самой малинке, то есть подрубать клаву, нажимать F4 — смотреть, запоминать — неудобно!&lt;em&gt; (хотя возможно, можно подключить логирование и просмотр записи лога в SSH, но я пока не разобрался)&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;На помощь мне приходит замечательное консольное приложение tmux, не раз им пользовался. Оно позволяет организовать работу в терминале «вкладками», которые можно открывать и «сворачивать» не завершая сам процесс.&lt;/p&gt;
  &lt;p id=&quot;q52z&quot;&gt;Я хочу сам основной скрипт закрепить в такой вкладке, чтобы можно было из любого места подключаться и смотреть вывод. &lt;/p&gt;
  &lt;p id=&quot;0RPj&quot;&gt;То есть, я смогу подключится к малинке по SSH, развернуть вкладку, в которой запущен скрипт, приложить новую карточку и скопировать UID, который высветится в терминале, и потом записать его в каталог. &lt;/p&gt;
  &lt;p id=&quot;1Nwv&quot;&gt;тмукса нет по умолчанию в малинке, его надо установить:&lt;/p&gt;
  &lt;pre id=&quot;Kgpq&quot;&gt;sudo apt-get install tmux&lt;/pre&gt;
  &lt;p id=&quot;OWFZ&quot;&gt;&lt;a href=&quot;https://losst.ru/shpargalka-po-tmux&quot; target=&quot;_blank&quot;&gt;шпаргалка&lt;/a&gt; по tmux&lt;/p&gt;
  &lt;p id=&quot;6IhB&quot;&gt;Делаю очередной шел-скрипт, в папке /home/pi/bin, чтобы запуск нашего питон скрипта происходил в tmux-вкладке:&lt;/p&gt;
  &lt;pre id=&quot;PABP&quot;&gt;sudo nano /home/pi/bin/magicBox.sh&lt;/pre&gt;
  &lt;p id=&quot;UUBM&quot;&gt;пишу:&lt;/p&gt;
  &lt;pre id=&quot;B2AG&quot;&gt;#!/bin/bash
tmux new-session -s &amp;quot;magic&amp;quot; -d -n &amp;quot;box&amp;quot;
tmux send-keys -t &amp;quot;magic:box&amp;quot; C-z  &amp;#x27;python3 /home/pi/MagicBox/run/go.py&amp;#x27; Enter&lt;/pre&gt;
  &lt;p id=&quot;j4VZ&quot;&gt;Это значит, что на старте системы я создаю новую вкладку, в которой запускаю наш питон-скрипт&lt;/p&gt;
  &lt;p id=&quot;BMDm&quot;&gt;Далее, я могу развернуть эту вкладку через SSH или в терминале самой малинки командой: &lt;/p&gt;
  &lt;pre id=&quot;QssY&quot;&gt;tmux a&lt;/pre&gt;
  &lt;p id=&quot;AUKD&quot;&gt;А свернуть ее сочетанием клавиш ctrl+B+D&lt;br /&gt;Теперь можно отредактировать автостарт:&lt;/p&gt;
  &lt;pre id=&quot;p2WX&quot;&gt;sudo nano /opt/retropie/configs/all/autostart.sh&lt;/pre&gt;
  &lt;p id=&quot;lbi4&quot;&gt;закомментировал запуск пайтон-скрипта напрямую, вместо него вписываю команду на запуск шелл-скрипта: &lt;/p&gt;
  &lt;pre id=&quot;lbi4&quot;&gt;/home/pi/bin/magicbox.sh &amp;amp; emulationstation 
#line above run session in a tmux tab for easy debuging
#python3 /home/pi/MagicBox/run/go.py &amp;amp; emulationstation&lt;/pre&gt;
  &lt;p id=&quot;33j4&quot;&gt;Есть правда один минус — запуская скрипт в основном окне терминала, без тмукса, прикладывая карту мы сразу видим на экране дефолтный ретропаевский сплэш-скрин загрузки (выглядит он &amp;quot;терминально&amp;quot; и не то чтобы очень красиво, зато с точки зрения обратной связи сразу понятно — тут что-то происходит)&lt;/p&gt;
  &lt;p id=&quot;Qi29&quot;&gt;С тмуксом — нас выбивает в чистую консоль и через пяток секунд запускается игра. Но поскольку я то знаю, что она запустится, меня это не особо смущает. &lt;br /&gt;В конце концов, можно заполнить так всю картотеку, а потом уже перенести запуск скрипта в автостарт напрямую (ну и обратную операцию мы можем сделать в любой момент) &lt;/p&gt;
  &lt;h2 id=&quot;WG9A&quot;&gt;&lt;/h2&gt;
  &lt;h2 id=&quot;iDPR&quot;&gt;оверклокинг&lt;/h2&gt;
  &lt;p id=&quot;PhfI&quot;&gt;С штатными настройками система хорошо справляется с играми PSX &lt;br /&gt;и попроще, если хотим поиграть в Dreamcast шедевры, нужно будет немного разогнать проц и видеоядро. Для этого в терминале пишем&lt;/p&gt;
  &lt;pre id=&quot;jEqd&quot;&gt;sudo nano /boot/config.txt&lt;/pre&gt;
  &lt;p id=&quot;atua&quot;&gt;я использовал такие настройки:&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;9at9&quot;&gt;arm_freq=1950&lt;br /&gt;over_voltage=4&lt;br /&gt;gpu_freq=600&lt;br /&gt;v3d-freq=750&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;MASd&quot;&gt;Конечно, тогда точно потребуется минимальное охлаждение, у меня с маленьким медным радиатором и вентилятором в процессе игры температура колеблется в районе 52—60° доходя до 65° максимум, что в общем, вполне в пределах разумного.&lt;br /&gt;&lt;/p&gt;
  &lt;p id=&quot;Djf5&quot;&gt;&lt;/p&gt;
  &lt;figure id=&quot;tsdt&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/9e/d3/9ed39dfd-06e7-445d-a961-834f4d1196be.jpeg&quot; width=&quot;960&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Y5Bn&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;llTI&quot;&gt;в заключении:&lt;/h2&gt;
  &lt;p id=&quot;mJfi&quot;&gt;Хочу сказать, что в процессе сборки всего проекта, я обнаружил, что меня не первого осенило использовать ретропай в связке с NFC сканером. В сети немного, но есть похожие проекты, которые впоследствии прояснили мне много чего про логику самой работы ретропая.&lt;br /&gt;&lt;br /&gt;Например есть аналогичный очень добротный проект тут: &lt;br /&gt;&lt;a href=&quot;https://www.daftmike.com/2016/07/NESPi.html&quot; target=&quot;_blank&quot;&gt;https://www.daftmike.com/2016/07/NESPi.html&lt;br /&gt;&lt;/a&gt;Кое-что по коду я подтырил у него, хотя это и потребовало значительной адаптации.&lt;br /&gt; Но там все по-серьезному: с 3D печатью, картриджы имитируют вид оригинальных и тд. &lt;/p&gt;
  &lt;p id=&quot;gTor&quot;&gt;Мне же нравится, что получилась немного &amp;quot;колхозная&amp;quot;, но самостоятельная история, которая не столько напрямую имитирует вид старых консолей и картриджи, сколько просто дает в такой новой форме аналоговые ощущения. &lt;br /&gt;Да и сама идея использовать для этого проездные мне показалось занятной.&lt;/p&gt;
  &lt;p id=&quot;LyDZ&quot;&gt;&lt;br /&gt;Буду рад если кому-то пригодится этот гид — полностью или частично.&lt;br /&gt;Если так — обязательно делитесь тем, что получилось в комментариях :)&lt;br /&gt;  &lt;/p&gt;

</content></entry></feed>