Tuesday, May 30, 2023

New photography series

 A new series of posts for my photography

Since 2021, I've been leaning into photography as a hobby. Starting with my father's Olympus OM-2 35mm film camera and a reusable plastic film camera, I have set out to capture scenes I find beautiful in New York and abroad. This post is an introduction to a new series I'm planning to showcase my best photos, explaining my cameras, film stocks, and developers.

Camera 1: Olympus OM-2 with assorted lenses


My primary camera for taking photos is my father's old Olympus OM-2, a 35mm automatic-exposure film camera originally released in 1975. I love the weight and solid feeling of the metal body and all-metal components. I have collected 3 lenses from the OM series: 
  • Olympus Zuiko 50mm f/3.4 (for most scenes, macro, and portraits)
  • Olympus Zuiko 100-200mm f/5
  • Olympus Zuiko 35mm f/?
So far, this camera has proven to be a great all-around system. It is just small enough that I can carry it on a shoulder strap while exploring new cities but offers all the features and interchangeable lenses that I want. (Plus it's cool to be using my dad's high-school camera.) 

Sadly, this camera's light meter and timing calibration are in need of service, so it'll be awhile before I can take new photos.

Camera 2: Reusable plastic 35mm camera with flash (e.g. the party camera)


I've opted to leave this as more of a category than a specific model of camera, because I have gone through about 3 since I started in 2021. I'm still yet to find one with a flash that lasts longer than 2-3 months of use. (The ones on the market now like the Kodak Ultra F9 are especially bad.)

The main purpose of this camera is to have a small, cheap flash film camera to take to parties and night events, where my OM-2 would be unwieldy (and flash-less).

In hopes of a better flash system and with the exciting prospect of getting 2x photos per roll, I am planning to try the Kodak Ektar H35 half-frame camera next.

Film Stocks

With the explosion in popularity of film photography since 2019/2020, finding (reasonably priced) film stock is harder than ever. In the past all of my photography has been with Fujifilm Fujicolor Superia 400. On a few occasions, cost and availability has pushed me to try Ilford SFX 200 and HP5 400 speed film, with only limited success.

Recently though, I have wanted to try alternatives to Fujicolor's green tint, and plan to try Kodak stocks such as UltraMax 400 and Portra 800.

Film developers

I have yet to take the very deep and expensive plunge into developing and/or scanning my own film, so for now I rely on film labs to do it for me. So far I have tried the following labs:
  • Photoreal, downtown Brooklyn (low-quality scans)
  • Eliz Digital, Manhattan Chinatown (low-quality scans)
  • Bleeker Digital, Nolita (slightly better but still low-quality scans)
  • State Film Lab, Louisville KY (best quality scans, slow turn-around, requires shipping)
Prioritizing scan quality, I have decided to stick with State Film Lab, as they're the only lab capable of producing scans which show individual film grains.

Future posts

In the future, I plan to release some of my past photography in a series of posts to this blog.

Thursday, May 25, 2023

Hello, Inky: Hello World with the Inky 7.3

Creating a personal dashboard with the Inky Frame 7.3


I am working to create a personal e-ink dashboard with the Pimorioni Inky Frame 7.3, a 7.3" color e-ink programmable display with integrated Raspberry Pi Pico. As a first step in this process, I set out to learn about the board and create a basic Hello World program.

Limitations of the Inky Frame and Rapsberry Pi Pico


It's a microcontroller board.
When I ordered the Inky Frame, I didn't fully appreciate that the Pico is a microcontroller board as opposed to a fully fledged computer like a Raspberry Pi Model B. This means that instead of running a full operating system, it runs code directly on its two ARM Cortex-M0+ cores. With limited RAM and CPU power and without the operating system to manage networking, peripherals, and task scheduling, "simple" tasks like fetching data from APIs and loading images become more complicated. I will be writing programs in either MicroPython (for readability and ease of use) or in C++ (for performance). These will have limited build-in functionality compared to a full Python 3.x environment.

Pimoroni's graphics library is limited.
The Picographics module maintained by Pimoroni supports only basic rendering functionality. It can only render JPG images or 8x8px sprites from a specially loaded sprite sheet, and text can only be rendered as a bitmap or a jagged Hershey vector font. If I want to support more advanced rendering, I will need to get creative and build abstractions to overcome this limited feature set.

The refresh rate is slow.
The Inky Frame 7.3 has a slow refresh time of 40 seconds in full color. This rules out any applications that would refresh every minute, such as a wall clock program. Instead I will optimize for use cases that require less refreshing, such as displaying unread emails and news headlines.

Creating the Hello World

Fortunately, the 2MB of memory on the Pico are pre-flashed by Pimoroni with the Micropython interpreter and a set of demo programs. After running a few of them, I got to reading the example code and the picographics docs. While the examples feel a bit scrappy, I was able to begin extracting their functionality into a new module I call Display, which I plan to use as the base of my abstractions and utility functions while creating my programs for the Inky Frame.

You can view the module here (linked to the commit, to show it at this point in time).

I created a basic demo mode which uses only the bitmap text rendering feature to create an artistic repeated word display.

An example of the text-based demo mode.

Next steps: Network requests

For the next step in this project, I will test out the Pico's ability to make network requests, parse JSON response bodies, and display the results.



Tuesday, May 16, 2023

Reviving this blog

Now that I'm working full time, I need a source of inspiration to see my personal projects through to fruition. Inspired by the updates I gave for my PyGame video game Explore back as a teenager, I would like to renew this blog as a place to give updates on my projects, even if my day-to-day is very different from the simple days of Explore :)

With this said, I have a number of unfinished projects in the works that I would like to see completed:

Color E-Ink Display

I recently purchased a 7.3" e-ink display from Pimoroni (Inky Frame 7.3" (Pico W Aboard)). It has an onboard Raspberry Pi Pico with WiFi and Bluetooth radios. I've decided to use it to create a helpful dashboard-type display to mount on the wall next to my standing desk. I hope to use it to display useful things like unread emails, Slack notifications, weather forecast, and more.
The Inky display sits on my shelf, with the factory image still displayed.

Facial Recognition Door Lock v2.0

Back in freshman year of college, I created a facial recognition automatic door lock for my dorm room. It used a Raspberry Pi model 2B with a Pi Camera Module to perform face recognition using OpenCV and the program was written in C++, as no Python bindings were available for ARM at that time. Its camera poked through the eye-hole in the door and a heavy-duty servo manipulated a 3D-printed assembly that could rotate the door's deadbolt lock in either position.

Now, 6 years later, I hope to recreate the success of my first door lock with new, upgraded tools. My hope is to learn about the advancements in facial recognition technology and write about my experience then vs. now.
Somehow I have no photos or videos of the door lock in my dorm, but I did find this photo of myself trying to compile OpenCV from source for ARM. (There were no distributables back then.) You had to adjust the compilation settings so that the gcc on the Pi would not run out of memory and crash.

GPT and ElevenLabs powered voice chat agent with personality

Thanks to OpenAI and ElevenLabs, the technology exists to create RoBro, your very own robotic bro. Extremely realistic inflections and emotional speech by ElevenLabs should allow us to load a Raspberry Pi with some speakers, a microphone, and a dude-bro personality. Other personality types, like an angry Roomba or seductive smart-door-lock may also be entertaining.

SDLGL: My pet game engine

SDLGL is a 2D game library that I have worked on on-and-off since 2017. Inspired by my humble beginnings using Allegro and PyGame, but frustrated with their limited capabilities, I have set out to create my own engine that uses SDL to interact with PC graphics, input, and sound. All other abstractions for game creation such as scene and entity management, collision, physics, animation, etc. are written from scratch in C++.

I see the project as a great way to learn in-depth about C++, game programming design patterns, and how to manage programming complexity as a project grows over time.

So far, I have created a simple top-down tank shooting game using the engine, but there is still lots of work and refactoring to be done before a useable game can be created in SDLGL.

A screenshot of my tank shooter POC game.

Looking forward

Clearly, there are a lot of projects I need to wrap up! I hope to post regular updates on my progress here, so that I feel inspired (or at least pressured) to finish them all.

-Grayson