Categories
Arduino Gadgets iOS Projects

iPad Zoom mute button

At work we’re primarily using Zoom for meetings while we’re in remote mode. Due to the recent problems found in their desktop software, I run it only on my iPad to provide a little more security (thanks to iPadOS’ sandboxed environment), plus the front facing camera on my iPad Pro is superior to my iMac and MacBook Pro’s.

The first issue I found with this setup was that I wanted to get the iPad into a position more perpendicular like a web cam, rather than the angled up shot below my face. I don’t think anyone wants to look up my nose unless I’m on a telehealth call, so I ordered this flexible stand for about $25 from Amazon and got it mounted:

Trying to bend this thing will give you a workout.

So far so good, until my first meeting. I wanted to follow conference call etiquette by muting myself when I wasn’t speaking, but it was a pain to reach and manually tap the mute button every time. Plus, although the flexible arm is super strong, it’s still going to wobble wildly if you touch the iPad and your video is going to show that.

Was there a way I could toggle muting myself without touching the iPad? After a quick Google search, the answer was YES!

The attached keyboard (Smart Keyboard Folio, Magic Keyboard) didn’t make any sense in this case, but a Bluetooth keyboard would be perfect!

Logical answer

The logical answer is to connect up a Bluetooth keyboard and hit Command + Shift + A when you want to toggle muting your mic, and you’re done. That’s it.

I’m not totally logical

Of course, the route I chose was different. I have enough keyboards on my desk, I really just want one button to do one thing.

Recently, I rigged a button to turn pages in the Books app over Bluetooth. We should be able to do the same thing here, right?

Figuring out the codes

The objective is clear: When we press a button, we send “command+shift+a” to the iPad.

Using Adafruit’s HID codes, we find:

  • Left shift == 0x02
  • a == 0x04

But what’s the “Command” button? Is that the “meta” or “GUI” key? If so, is it a modifier or just a regular key?

Lots o’ troubleshooting

I spent a lot of time troubleshooting over and over:

Compile a new sequence of commands, upload new firmware to the microcontroller, re-pair with the iPad, open Zoom and try to mute: No go.

From what I could tell, “shift + a” were working, but “shift + command + a” wasn’t. It wasn’t until I almost gave up that I had a breakthrough:

Let’s try remapping another key to “command” and see if we can press that key. How about Caps Lock?

It worked.

In my code I wrote:

// gold
ble.println("AT+BleKeyboardCode=02-00-39-00-00-00-00"); // shift + caps lock
ble.println("AT+BleKeyboardCode=02-00-04-00-00-00-00"); // shift + a
ble.println("AT+BleKeyboardCode=00-00");

This is as if the user pressed “shift + caps lock”, and then “shift + a” at the same time, then released. Now the Zoom app was getting the proper command from a Bluetooth “keyboard”.

Hardware

This setup is virtually identical to what I have here, it’s just a different button.

The USB cable coming in is only for power, and if I had the Adafruit Feather version on hand I would’ve used that with a battery so the box would be totally wireless.

The button is no more complicated than this tutorial.

GitHub: https://github.com/twstokes/labs/tree/master/zoommuter

Improvements

A better version of this would be:

  • A button to also toggle video
  • Using the Adafruit Feather BLE version with a battery so the box would entirely wireless
Categories
Arduino Coding Gadgets Projects Raspberry Pi

The latest obsession

Categories
Gadgets Technology

2009 Mac Pro video card upgrade

After upgrading to Yosemite, I noticed that graphics performance was starting to lag a bit on my 2009 Mac Pro while driving two monitors at fairly low resolutions. At one point I had two GT 120s running separate monitors, but after one replacement and two failures, I was back down to one.

GT 120
GT 120

I decided to look into upgrade options and was happy to see that OS X now supports non-EFI video cards. The only catch: You won’t see anything displayed until OS X loads your drivers. Who cares?

I settled on an EVGA GeForce GTX 660 2GB, which Best Buy happened to sell. I can feel the judgement from the hardcore nerds for buying something at Best Buy. Nevertheless, this was much cheaper than trying to buy another GT 120 to replace my second one and offers WAY more power. I don’t game on my Mac – I just want the OS to feel snappy and fluid.

GeForce GTX 660
GeForce GTX 660

Like many powerful cards, the GTX 660 requires the PCIe 6 pin power connector from the power supply or motherboard. I’ve ordered this, but until it gets here, I’ve rigged up an external power source.

Steps to install:

  1. Attach one of these cables to your Mac Pro motherboard OR rig up an external PSU like I did
  2. Insert the new card and attach the other end of the 6 pin PCIe power cable
  3. Put the card retainer back in place, fasten everything down and reassemble
  4. If running an external PSU, make sure it is powered up before powering up the Mac Pro

Thoughts after installation:

  • Why didn’t I do this sooner
  • OS X is silky smooth
  • The fans will ramp up audibly if doing anything intensive in apps that utilize the GPU, but that’s OK
  • Everything just works – no drivers to install
  • My biggest bottleneck is now my disk – an SSD is nextMac About

Heaven Benchmark results:

Mode: 1680×1050 fullscreen on one monitor

Before:

  • FPS: 5.9
  • Score: 148
  • Min FPS: 3.3
  • Max FPS: 11.8

After:

  • FPS: 52.8
  • Score: 1330
  • Min FPS: 8.3
  • Max FPS: 103.3

New GTX 660
New GTX 660

IMG_0801
External PSU 6 pin power cable running through an open slot.

IMG_0802
External PSU

 

Adjusting a blank to provide room for the external power
Adjusting a blank to provide room for the external power cable

IMG_0805 IMG_0809 IMG_0810

Temporary setup
Temporary setup with external power supply. A PSU tester is connected to keep the supply running without being attached to a motherboard.

IMG_0862
Final 6-pin PCIe cable installed

IMG_0864
No more rig!

 

Categories
Coding Gadgets Projects

Kinect + Arduino

With an Arduino Ethernet, Processing, and a Kinect, I was able to easily create this little demo where hand movement can control a servo. This is just a tiny step in my master plan to create a robot clone so that I don’t have to leave my chair.

The following libraries and drivers made this work and also made it super easy for me to create it:

OpenKinect
Daniel Shiffman’s Processing Kinect Library (he knows his stuff and has great examples on his site)
Arduino Ethernet UDP send / receive string

Servo:
EMAX ES08A Servo

How it works:

  1. The Arduino Ethernet acquires an IP address and waits for UDP packets on a certain port.
  2. The machine with the Kinect sends packets to the Arduino that contain hand coordinate data.
  3. The Arduino then takes this data (an integer) and maps the range from 0 to 180 degrees.
  4. The mapped value is sent to the servo.
Categories
Arduino Gadgets

Arduino Christmas

Categories
Arduino Gadgets

Arduino!

Pretty stoked to finally get one! So far I’ve dissected an old RC car and turned its wireless receiver board / remote into a volume controller for my Mac. I foresee many cool projects…

Categories
Gadgets Video

iPod touch as an auxiliary display

I played around tonight with making my iPod touch an auxiliary display. I thought it may be neat to just have random real-time public tweets cycle through on it so I made the following. As you can see there’s nothing too smooth about it yet – no AJAXiness implemented as this was purely proof of concept.

Categories
Gadgets Video

Avatar figurine lights up to sound

I think this is pretty cool for a Happy Meal toy…