I designed the first version of the Ahmsville Dial a little more than a year back, and I’ve loved using it, despite its limitations.
Last year I finally decided to update the dial, so I took all my experience with it, and put it into the development of version two, with very specific goals in mind, my first goal was to create multiple versions of the dial to cater to different types of users, my second goal was to make the dial operate in both wired and wirelessly modes, my third goal was to make the dial extremely easy to use even for people with zero programming skills, this largely meant I had to develop a companion app for the dial, the last goal I had was to give the dial context awareness, which simply means having the dial automatically switch its configuration to match whatever software your using it with, this way, the dial can be programmed to do different things within different applications...this feature is one of many enabled by the companion app.
Ahmsville Dial V2 follows the same design philosophy as the version one, only with a higher resolution encoder, new hardware features, improved and streamlined code, simplified assembly process, and the aforementioned companion app for windows users.
The first big change to the system is in the circuit, the dial now uses the ATSAMD21G chip, which is the same chip used in the Arduino Zero boards, and a lot of the MKR series boards, compared with the ATMEGA32u4 used in the previous version, this chip is much faster and generally better suited to handle all the new features of the Dial.
Another change to the system is the inclusion of an NRF24 wireless chip, with this, the dial is now able to operate wirelessly. I went this route because Bluetooth hid just wasn’t going to cut it, especially for the more advanced features I implemented in this version of the dial, the dial can also be used wired via the now included USB type C port, I have also made sure that there are no tradeoffs functionally between the wired and wireless modes.so switching between them is as simple as unplugging the USB cable from the PC and plugging in the wireless adapter or vice versa, the software on the dial is smart enough to handle the switching between all the connections.
The dial, although primarily designed for your PC, can also be used to control other devices, the wireless adapter which features an ATMEGA32u4 has some of its pins broken out to allow for easy integration into other electronics systems.
The Knob (Magnetic Rotary Encoder)
The rotary encoding method that’s used in the dial is one of my very own designs, it’s a ball-bearing assisted, high resolution, and contactless magnetic rotary encoder, the knob is fitted with a ring of tiny neodymium magnets in an alternating magnetic pole configuration; on the main board, there are two linear hall effect sensors used to read the analog values on the magnets. This system allows the knob to operate through a ball bearing without ever touching the electronics, this makes for a very smooth-feeling knob and is also one of the reasons the dial is so durable. This trend of isolating all moving parts from the electronics is something you will notice with all the hardware features of the Ahmsville Dial.
The knob has a base resolution of 80 steps per revolution and can go as high as 4000 steps, the spacenav and the absolute variants also feature a secondary rotary encoder with a base resolution of 100 steps per revolution which can also go as high as 4000 steps. You can learn more about this rotary encoder here.
Capacitive Touch
Under the knob lies a backlit capacitive touchpad that gives you four touch inputs, single tap, double tap, short press, and long press, this touch inputs can be mapped through the companion app, or programmatically through Arduino IDE to different functions on your PC. The capacitive touch detection is also done on the Arduino, you can learn more about it here.
Mechanical switch Macro Keys
The macrokey and the absolute variants of the dial feature 5 key mechanical switch macros, each key is interrupt based and is programmed to register tap and hold as two separate inputs, making a total of 10 mappable macros, each key is also individually backlit and is fully customizable through the companion app.
5 axis space Navigator
This feature was designed for people that do 3D and CAD-related work, and also for people that have the need for a multiple-axis controller, maybe for a drone or an RC car.
Using the mpu6050 motion tracking chip, and another magnet/hall effect sensor setup, I was able to create a 5-axis controller, the mpu6050 provides pitch and roll, while the magnets and hall effect sensors provide movements on the x, andy plane, the fifth axis; Yaw is used in implementing a feature I tentatively called adaptive space navigation, with this feature, the dial is able to adapt to any orientation you place it in…so no matter the orientation you place the dial on your desk, you can be sure that up will always be up, the same goes for all other directions. This feature was achieved by detecting when and by how much the dial rotates about the z-axis(yaw) and then moving all the axis in the software to match that angular deviation.
The underlying code for reading the motion data from the mpu6050 is provided by the i2cdevlib by Jeff Rowberg.
I also designed a spring-loaded mechanism for the space navigator, the mechanism allows the top section of the dial to move in all the required directions, and it also connects the top section of the dial to the bottom, it's built from 3d printed and machined parts. I went through quite a few iterations to make sure the mechanism was durable and able to reliably provide movements in all the required directions.
Programmable LEDs and Haptic Feedback
The dial now uses SMT addressable LEDs, 1 on the main board to provide the top surface glow, 7 on the USB C power board for the base under glow and 5 more for each macro key. In addition to making the dial look really cool, they also provide additional functionalities to the dial. For example, you can map different colors and animations to the dial as a way of identifying the currently loaded application configuration. Like all the other features of the dial, the leds can be controlled and configured through the companion app
The Dial also uses a coin-type vibration motor to provide really satisfying haptic feedback for the knob’s rotation, the capacitive touch, and the space navigator.
The Dial VariantsAs I mentioned earlier, one of my goals for the dial was to create different variations, with the understanding that different people will have different uses for a device like this.
I designed four variations of the dial with different combinations of the hardware features discussed above. The image below shows a comparison between the four variants.
When I started the development of version 2 of the dial, one of my top priorities was to make a device that was really easy to use, even for people with no engineering or programming skills, I developed the companion app to help me accomplish just that.
The app provides context awareness to the dial, so the configurations loaded onto the dial can dynamically switch to match the active application on your PC, the app detects whatever window you currently have active and then communicates the appropriate information to the dial via serial communication. This feature means that you can set a unique configuration for all your favorite apps with no overlap, the Ahmsville dial app will manage the switching between the configurations.
The entire Ahmsville dial system has been designed in such a way that the user will never have to write a single line of code, all the configuration code required by the dial can be generated from the user interface, you can create new configuration files, and attach different operations to all the hardware controls on the dial: you can choose different key combinations, and even combine keyboard and mouse shortcuts, you can set controls to quickly launch files and application or set the keys to print long texts, you can also set the knob’s resolution and configure all the LEDs and animations on the dial, essentially; anything you’ll need to configure on the dial can be done through the user interface.
The app is written to run unobtrusively in the background, so once you have the app installed and the dial configured to your liking, all other operations like connections and app switching are performed in the background.
The app runs on windows only and the release installer exe can be downloaded here, the app although fully functional, is in continuous development so more features will be added with time. I’ll have the code for the app open-sourced and available on GitHub so anybody can modify and recompile it.
Watch the Video for a more detailed overview of the companion app.
Building the DialTo build the dial, you’ll need to get the kit with all the required custom PCBs from my Tindie Store,you can get the boards alone and source the rest of the parts yourself, I also have the full kit with all the required parts available and you can also get the dial fully assembled.
3D printing files can be downloaded here.
The assembly process is pretty straightforward and quit satisfying, I have also prepared detailed step-by-step Build Instructions for all the variations of the dial.
Comments