Sunday, June 7, 2015

Bluetooth Smartphone Companion / Remote V2

I've had the idea for quite some time to have a watch-like device that interacts with my smartphone. The main use case here is as a media remote control for when my smartphone is inaccessible, such as when motorcycling. I don't want a ton of functionality, but being able to view notifications in direct sunlight, and to allow for some minimal interaction with gloved fingers would be good.

So that's why I'm doing this: to scratch a personal itch. I'm a year-round cyclist, living in a city without a car. I love bikes, but in SF, cars are completely useless. A bike is the only way to get around SF and the surrounding areas. Traffic here is completely absurd. I am motorcycle-commuting 99% of the time. Riding for me is a matter of necessity, rather than convenience.

I have developed some accessories that some would view as creature comforts, but those people aren't riding a motorcycle on 100% of the vehicular trips I've taken. If I'm going anywhere outside of SF, it's on a motorcycle. Regardless of the distance, weather, or time of day.

Existing Products

There are a few products on the market kindof like this. One would be the pebble watch. There are also dedicated media remotes that will work with android phones that you can just buy. But, unfortunately, nothing quite fits the bill.

The watches rely on a touch screen and are impossibly tiny. The touch screens and small buttons would pulling over to remove gloves in order to operate. I also doubt they will last long in a rain storm. Despite what you may have heard, it does occasionally rain in California. And you can't necessarily tell if it's going to rain or not. Especially when you're traveling a couple hundred miles, it's not uncommon to ride through a highly-localized downpour.

And existing media remotes basically have all the downsides of my first iteration, which I'll describe below.

My first attempt

Version one of this device was based on the Adafruit Bluefruit EZ Key: https://www.adafruit.com/product/1535. This worked. And it still works. I was able to wire up some tact switches onto proto board, and the whole mess went into a 3D printed enclosure and got mounted on my handle bars. Operates for months on a 9V battery (provided I remember to switch it off when I get off the bike).

It works so well perhaps because it's so simple. All it does is send media key presses to control my media player. Just being able to set volume, start and stop the music, and skip past tracks I'm not feeling makes a long motorcycle trip a lot more bearable. But there are some issues with the first version.

Can't tell if it's supposed to be playing or not.

There just isn't any way to provide that kind of feedback. Sometimes media playback just stops. It's not always clear why. It could be because you're out of network coverage. It could be that Spotify has crashed. It could be because you hit a bump, and it actuated the play/pause button. It could be because you accidentally double-pressed play, or because you accidentally hit play/pause when you were adjusting the volume.

Media Key presses don't work well for setting volume

I would much rather have used a rotary encoder for this, but I couldn't fit the dual-555 timer on the board required to do the quarature decoding, and the EZ-Key firmware can't handle quadrature decoding by itself. I did request this feature on the forum.

The main problem with using media keys to adjust volume is because of this (mis-)"feature" in android designed to protect hearing for people with ear-buds. Basically if you attempt to raise the volume past a certain point, it displays a toast warning you that you might be damaging your hearing. Then it refuses to let you raise the volume any further until you tap the screen. Which sucks even if the phone is not zipped up deep inside your motorcycle suit and you're hurtling along I5 10 or 20 miles from the nearest exit. And your noise isolating ear buds are starting to pull out of your ears and consequently you can't hear anything at the lower volume you started listening at.

Can't tell what track is playing

This comes down to lack of a display, and lack of an ability to connect a display to the EZ-KEY. It's a single-purpose board, it implements the HCI profile, and that's all it does. To implement a display, you need either a more general-purpose bluetooth interface that can talk to an application running on the bluetooth host.

Can forget to start media player, making remote useless

Since there's no app or driver, there's no way to program it to do other functions. Like, for example, starting Spotify for me, when I forget. Which I do all the time. Gearing up for a motorcycle ride is like suiting up for an EVA. I've got the suit, boots, gloves, heated vest, heated gloves, helmet, earphones, phone, etc. It's all too easy to forget a step, especially when I'm rushed, or have a lengthy packing list to manage.

No UI For switching media source

My trips can take upwards of 5 hours. After a while, listening to music gets old and I switch to audio books or podcasts. The media-key based remote worked fine for switching audio tracks, but it's totally crappy at dealing with audio books. With audiobooks / podcasts, finding my place within a one or two hour recording is more important than skipping forward and backward to the next track. Also, having to pull over to get my phone out so I can change apps is a nuisance and slows me down when I'm trying to make time. The other issue is that when a podcast finishes playing, the media player app is often not in a state where it can continue playing, because it's play queue is empty. Fixing this problem would require a dedicated app with some ability to interact with the android system and automate tasks like switching between media apps, and populating their playlists.

I can hear that I've received a text, but I can't tell if It's worth pulling over for.

Since I've settled on building a device with a display, I might as well have it broadcast notifications. Recent android releases introduced the Notification API that allows an app to view the stream of notifications. This means it's possible to relay information about all the notifications currently visible, and even to dismiss them.

If I'm riding with the phones in, I'll hear that I've got a text or an email, but I can't tell which, who it's from, or what it says. If I'm on the way to meet someone, this could be important information. They may have changed their plans, finally gotten back to me about a spontaneous rendezvous in time for me to make a detour, or perhaps even are finally giving me their address. Or it could be completely irrelevant. But currently, I can't tell what it is until I pull over. So it becomes a nagging presence in my mind: do I stop now and see if it's important? Or do I just keep going? There are situations in which I've had to pull over to check messages 3 or 4 times before even leaving town. This is not great when you've got hundreds of miles to cover and are trying to make progress.

In conclusion

So yeah, that's why I'm doing this. But it's also a good excuse to learn the following things:
  • Embedded programming
  • Digital circuit Design
  • LCD interfaces
  • 3D Modeling
  • 3D Printing
  • PCB design
Stay tuned for more info.

No comments:

Post a Comment