# Tiny Pi Pro, a super tiny gaming handheld based on Raspberry Pi Zero

- Author: Tejashwi Kalp Taru
- Published: 2019-08-01
- Canonical: https://tejashwi.in/tinypi-pro-a-raspberry-handheld/
- Categories: Raspberry, DIY, Electronics
- Tags: raspberry, retrogames, sudomod, nostalgia, tinypipro
- Summary: TinyPi pro is an ultra-small gaming device based on Raspberry Pi zero. TinyPi pro can emulate several systems such as NES, SNES, Game boy and others. Even after a very small form factor, it can play games well. Just to compare the size, you can fit a TinyPi pro with your keychain

When the TinyPi Pro kit arrived, I wasn't sure I could actually play games on something this small. The whole thing fits on a keychain. But it works.

I covered the wider scene of these builds in [an earlier post on Raspberry Pi retro gaming](/relive-retogaming-raspberry/). This one is about living with the TinyPi Pro specifically.

## The kit

Pi0cket (also known as moosepr) built this as a hobby project. The first version had a low-resolution display, limited buttons, and a partial 3D case:

<div class="text-center">
    <picture><source type="image/avif" srcset="/assets/images/tinypipro/tiny_pi.avif"><source type="image/webp" srcset="/assets/images/tinypipro/tiny_pi.webp"><img src="/assets/images/tinypipro/tiny_pi.jpg" alt="tiny pi" class="" width="300" height="250" loading="lazy" decoding="async">
    </picture>
</div>

The Pro version fixed those problems. It doesn't require any soldering.

## What's changed

The screen is now a 1.3 inch IPS display at 240x240 pixels with good viewing angles.

Sound comes through i2s (Inter-IC Sound), which the Raspberry Pi supports natively. It won't replace headphones, but it works.

The kit includes a 400mAh battery. About an hour of playtime under heavy use.

The case uses selective laser sintering (SLS), which gives it a smooth finish. It's one of the better cases I've seen in DIY kits.

## The build in pictures

<div id="imageSlider" class="carousel slide" data-bs-ride="carousel">
    <div class="carousel-indicators">
        <button type="button" data-bs-target="#imageSlider" data-bs-slide-to="0" class="active" aria-current="true" aria-label="Slide 1"></button>
        <button type="button" data-bs-target="#imageSlider" data-bs-slide-to="1" aria-label="Slide 2"></button>
        <button type="button" data-bs-target="#imageSlider" data-bs-slide-to="2" aria-label="Slide 3"></button>
        <button type="button" data-bs-target="#imageSlider" data-bs-slide-to="3" aria-label="Slide 4"></button>
        <button type="button" data-bs-target="#imageSlider" data-bs-slide-to="4" aria-label="Slide 5"></button>
        <button type="button" data-bs-target="#imageSlider" data-bs-slide-to="5" aria-label="Slide 6"></button>
        <button type="button" data-bs-target="#imageSlider" data-bs-slide-to="6" aria-label="Slide 7"></button>
        <button type="button" data-bs-target="#imageSlider" data-bs-slide-to="7" aria-label="Slide 8"></button>
    </div>

    <div class="carousel-inner text-center">
        <div class="carousel-item active">
            <picture><source type="image/avif" srcset="/assets/images/tinypipro/case-480w.avif 480w, /assets/images/tinypipro/case-640w.avif 640w, /assets/images/tinypipro/case-768w.avif 768w, /assets/images/tinypipro/case-960w.avif 960w, /assets/images/tinypipro/case.avif 1280w" sizes="(max-width: 768px) 100vw, 768px"><source type="image/webp" srcset="/assets/images/tinypipro/case-480w.webp 480w, /assets/images/tinypipro/case-640w.webp 640w, /assets/images/tinypipro/case-768w.webp 768w, /assets/images/tinypipro/case-960w.webp 960w, /assets/images/tinypipro/case.webp 1280w" sizes="(max-width: 768px) 100vw, 768px"><source type="image/jpeg" srcset="/assets/images/tinypipro/case-480w.jpg 480w, /assets/images/tinypipro/case-640w.jpg 640w, /assets/images/tinypipro/case-768w.jpg 768w, /assets/images/tinypipro/case.jpg 1280w" sizes="(max-width: 768px) 100vw, 768px"><img src="/assets/images/tinypipro/case.jpg" alt="TinyPi pro case" class="" width="1280" height="562" loading="lazy" decoding="async">
    </picture>
        </div>
        <div class="carousel-item">
            <picture><source type="image/avif" srcset="/assets/images/tinypipro/case-open-480w.avif 480w, /assets/images/tinypipro/case-open-640w.avif 640w, /assets/images/tinypipro/case-open-768w.avif 768w, /assets/images/tinypipro/case-open-960w.avif 960w, /assets/images/tinypipro/case-open.avif 1280w" sizes="(max-width: 768px) 100vw, 768px"><source type="image/webp" srcset="/assets/images/tinypipro/case-open-480w.webp 480w, /assets/images/tinypipro/case-open-640w.webp 640w, /assets/images/tinypipro/case-open-768w.webp 768w, /assets/images/tinypipro/case-open-960w.webp 960w" sizes="(max-width: 768px) 100vw, 768px"><source type="image/jpeg" srcset="/assets/images/tinypipro/case-open-480w.jpg 480w, /assets/images/tinypipro/case-open-640w.jpg 640w, /assets/images/tinypipro/case-open-768w.jpg 768w, /assets/images/tinypipro/case-open.jpg 1280w" sizes="(max-width: 768px) 100vw, 768px"><img src="/assets/images/tinypipro/case-open.jpg" alt="Case open" class="" width="1280" height="528" loading="lazy" decoding="async">
    </picture>
        </div>
        <div class="carousel-item">
            <picture><source type="image/avif" srcset="/assets/images/tinypipro/case-open-2-480w.avif 480w, /assets/images/tinypipro/case-open-2-640w.avif 640w, /assets/images/tinypipro/case-open-2-768w.avif 768w, /assets/images/tinypipro/case-open-2-960w.avif 960w, /assets/images/tinypipro/case-open-2.avif 1280w" sizes="(max-width: 768px) 100vw, 768px"><source type="image/webp" srcset="/assets/images/tinypipro/case-open-2-480w.webp 480w, /assets/images/tinypipro/case-open-2-640w.webp 640w, /assets/images/tinypipro/case-open-2-768w.webp 768w" sizes="(max-width: 768px) 100vw, 768px"><source type="image/jpeg" srcset="/assets/images/tinypipro/case-open-2-480w.jpg 480w, /assets/images/tinypipro/case-open-2-640w.jpg 640w, /assets/images/tinypipro/case-open-2-768w.jpg 768w, /assets/images/tinypipro/case-open-2.jpg 1280w" sizes="(max-width: 768px) 100vw, 768px"><img src="/assets/images/tinypipro/case-open-2.jpg" alt="Case open 2" class="" width="1280" height="539" loading="lazy" decoding="async">
    </picture>
        </div>
        <div class="carousel-item">
            <picture><source type="image/avif" srcset="/assets/images/tinypipro/battery-480w.avif 480w, /assets/images/tinypipro/battery-640w.avif 640w, /assets/images/tinypipro/battery-768w.avif 768w, /assets/images/tinypipro/battery-960w.avif 960w, /assets/images/tinypipro/battery.avif 1280w" sizes="(max-width: 768px) 100vw, 768px"><source type="image/webp" srcset="/assets/images/tinypipro/battery-480w.webp 480w, /assets/images/tinypipro/battery-640w.webp 640w, /assets/images/tinypipro/battery-768w.webp 768w, /assets/images/tinypipro/battery-960w.webp 960w, /assets/images/tinypipro/battery.webp 1280w" sizes="(max-width: 768px) 100vw, 768px"><source type="image/jpeg" srcset="/assets/images/tinypipro/battery-480w.jpg 480w, /assets/images/tinypipro/battery-640w.jpg 640w, /assets/images/tinypipro/battery-768w.jpg 768w, /assets/images/tinypipro/battery.jpg 1280w" sizes="(max-width: 768px) 100vw, 768px"><img src="/assets/images/tinypipro/battery.jpg" alt="The tiny battery for TinyPi pro" class="" width="1280" height="539" loading="lazy" decoding="async">
    </picture>
        </div>
        <div class="carousel-item">
            <picture><source type="image/avif" srcset="/assets/images/tinypipro/circuit-back.avif"><img src="/assets/images/tinypipro/circuit-back.jpg" alt="TinyPi pro circuit on backside" class="" width="404" height="539" loading="lazy" decoding="async">
    </picture>
        </div>
        <div class="carousel-item">
            <picture><source type="image/avif" srcset="/assets/images/tinypipro/circuit-front.avif"><img src="/assets/images/tinypipro/circuit-front.jpg" alt="TinyPi pro circuit on frontside" class="" width="404" height="539" loading="lazy" decoding="async">
    </picture>
        </div>
        <div class="carousel-item">
            <picture><source type="image/avif" srcset="/assets/images/tinypipro/circuit-back-assembled.avif"><img src="/assets/images/tinypipro/circuit-back-assembled.jpg" alt="Circuit assembled back" class="" width="404" height="539" loading="lazy" decoding="async">
    </picture>
        </div>
        <div class="carousel-item">
            <picture><source type="image/avif" srcset="/assets/images/tinypipro/side-open.avif"><img src="/assets/images/tinypipro/side-open.jpg" alt="Side open view for TinyPi Pro" class="" width="404" height="539" loading="lazy" decoding="async">
    </picture>
        </div>
    </div>

    <button class="carousel-control-prev" type="button" data-bs-target="#imageSlider" data-bs-slide="prev">
        <span class="carousel-control-prev-icon" aria-hidden="true"></span>
        <span class="sr-only">Previous</span>
    </button>
    <button class="carousel-control-next" type="button" data-bs-target="#imageSlider" data-bs-slide="next">
        <span class="carousel-control-next-icon" aria-hidden="true"></span>
        <span class="sr-only">Next</span>
    </button>

</div>

wermy made a build video:

<iframe title="Tiny Pi Pro handheld running RetroPie" loading="lazy" width="560" height="315" src="https://www.youtube.com/embed/eHv7w5ioWu0" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

## After two weeks

It plays games well despite its size. If you have large hands, the buttons will feel cramped, but it's manageable.

A headphone jack or hardware volume buttons would be nice additions. Not dealbreakers.

The build itself is mostly straightforward. Fitting the Raspberry Pi with the pogo pins took a few tries. Be patient with that part.

I like it. Thanks [pi0cket](https://pi0cket.com/)

If the Pi still feels like overkill, the [ATtiny85 game console](/a-tiny-game-console-based-on-attiny85/) I built later runs on a chip the size of a fingernail.
