{"id":13434675,"url":"https://github.com/sffubs/dactyl_manuform_gimbal","last_synced_at":"2025-03-18T01:32:01.244Z","repository":{"id":75718302,"uuid":"453203550","full_name":"sffubs/dactyl_manuform_gimbal","owner":"sffubs","description":"Instrutions and designs for building the dactyl-manuform-gimbal keyboard","archived":false,"fork":false,"pushed_at":"2022-03-13T21:19:52.000Z","size":17258,"stargazers_count":47,"open_issues_count":0,"forks_count":3,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-10-27T17:24:01.923Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sffubs.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2022-01-28T20:11:52.000Z","updated_at":"2024-10-13T18:29:11.000Z","dependencies_parsed_at":"2023-03-11T20:19:02.100Z","dependency_job_id":null,"html_url":"https://github.com/sffubs/dactyl_manuform_gimbal","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sffubs%2Fdactyl_manuform_gimbal","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sffubs%2Fdactyl_manuform_gimbal/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sffubs%2Fdactyl_manuform_gimbal/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sffubs%2Fdactyl_manuform_gimbal/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sffubs","download_url":"https://codeload.github.com/sffubs/dactyl_manuform_gimbal/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244139321,"owners_count":20404492,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-07-31T03:00:20.302Z","updated_at":"2025-03-18T01:32:01.238Z","avatar_url":"https://github.com/sffubs.png","language":null,"funding_links":[],"categories":["Models"],"sub_categories":["Manuform"],"readme":"# Dactyl-Manuform-Gimbal keyboard\n![keyboard](keyboard.jpg)\n\nWhy? I wanted to build something a bit different, something that I'd not seen before. I wondered what a keyboard would look like if I merged it with an RC controller, and tried using the RC gimbals as a mouse.\n\nThe result is quite fun. It's fairly space-efficient, and allows me to use the mouse with either hand. It has proximity sensors to detect when your hand is on the joystick, and turns some of the keys into mouse buttons. Haptic feedback helps to tell when you have switched layers, or long-pressed a key.\n\nYou might have noticed it has more keys on the right than the left. This is because I wanted the option to use it with [Plover](http://www.openstenoproject.org/plover/), which for a standard layout requires a minimum of 6 columns on the right, and 5 columns on the left. (I've not actually tested it with Plover, having built a [different keyboard](https://www.thingiverse.com/thing:5021950) for that in the meantime).\n\nFair warning: there is quite a lot of soldering involved if you want to make one:\n\n![underside](underside.jpg)\n\n## Components\n### Keys\nI picked gateron red switches and DSA keycaps, sold to me by [Mechboards](mechboards.co.uk).\n\n### Gimbals\nThe twist in this design is the inclusion of a pair of joysticks. These are RC gimbals - see [here](FrSky_M9.md) for some details of how they are wired up.\n\n### Proximity\nThe keyboard uses a proximity switch to detect when a hand is over the joystick, and uses this to switch the mouse buttons on. This is using an [APDS-9660](https://www.sparkfun.com/products/12787) sensor \u0026 breakout board which is glued to the underside of the case (it's the purple circuit board visible under the corner of the gimbal).\n\nHere it is working:\n\n![proximity_demo.gif](proximity_demo.gif)\n\nThe proximity sensor looks up through the little square hole next to the gimbal, so your hand needs to be somewhere over that hole for it to activate:\n\n![proximity location](proximity_location.jpg)\n\nIt will trigger unexpectedly if you get hair over that hole, so I advise you to keep your cat away from it.\n\n### Controller\nOriginally this was designed to work with two [Pro Micro](https://www.sparkfun.com/products/12640) controllers, but these didn't really have enough flash for the QMK features I wanted.\n\nSo I used a beefier board that I was familiar with: the [Teensy 3.2](https://www.hobbytronics.co.uk/teensy-v32), which has been really good to me before. However, it turns out that QMK only sort-of supports the Teensy, so I had a lot of trouble getting it to work reliably.\n\nIn the end, I gave up, and swapped to a pair of [STM32F401CCU6 \"Black pill\"](https://stm32-base.org/boards/STM32F401CCU6-WeAct-Black-Pill-V1.2.html) controllers. These work flawlessly with QMK, though I did manage to kill two boards during assembly, and I'm not quite sure how.\n\nIn any case, the swap from the original 5v board to a 3.3v one meant that a level-shifter had to be added between the board and the I2C and LED lines on the breakout board.\n\nHere's how the blackpill controller is wired:\n\n![controller_pinout](controller_pinout.jpg)\n\nB10 should be wired to 3V3 on the left-hand half, and to GND on the right-hand half.\n\nRemember that TX1 on the left-hand half needs to be connected to RX1 on the right-hand half, and vice-versa.\n\n### Haptic\nI wanted to try getting some haptic feedback from the keyboard, for example when using mod-taps, or when switching to/from mouse mode. QMK has support for the [DRV2605L](https://learn.adafruit.com/adafruit-drv2605-haptic-controller-breakout) driver built in, so I used this.\n\nI picked a linear resonant actuator to use with it, the Jinlong G0832012. Not for any highly specific reason; it was easily available and looked like roughly the right thing.\n\n### LEDs \u0026 per-key PCBs\nPer-key RGB LEDs are the cornerstone of a fancy mechanical keyboard! I had to have them. To try and keep things tidy, I used [Amoeba Royale](https://github.com/mtl/keyboard-pcbs/tree/master/amoeba-royale) per-key PCBs, printed for me by [Aisler](https://aisler.net). I got a bunch of SK6812 mini 3535 LEDs to to go with them, along with kailh hotswap sockets, and some small signal diodes.\n\nHonestly, they were still quite painful to use. The holes in the PCB had to be filed out before the LEDs would fit in them, and the LED casings would melt if the soldering iron was on them for more than half a second. I had a couple of PCBs that were faulty also.\n\nHere was my method for soldering them:\n- Sit the LED in the hole\n- Spread some flux over the back of the LED\n- For each terminal\n\t- Put some solder on the PCB pad\n\t- Dag it onto the LED. Hopefully you will get a little solder bridge form\n- Try once for each pad, and if it didn't work, leave it for a couple of minutes to cool before you try again.\n- Repeat until all connections are made, then test the PCB.\n\nHowever, once the whole lot was wired up, they do look quite tidy. The PCBs are not secured to the case, it seems to be enough just to press-fit them onto the back of the keys.\n\n### Split communication\nThe two halves communicate through a TRRS connector. However, this just provides serial communications and a common ground wire - I left the 5v wire unconnected. Both of the halves need to be connected to the host computer over USB. This is for two reasons:\n- Each half can send its own mouse events, which simplifies things\n- I think the power draw for the whole keyboard might exceed 500ma - certainly I had some problems trying to power the whole thing from a single USB port\n\n### OLED\nI bought a pair of \"OLED screens\" from Mechboards, because of course I wanted my keyboard to have a screen! Actually this turned out to be a really helpful debugging tool, and I ended up printing a lot of diagnostic information to the OLED screen. I suspect they are SSD1306 128x32 screens, since they worked in QMK without any modifications.\n\n## Daughterboard PCB\nThere are a lot of connections in this keyboard: the haptic breakout board, proximity board, OLED, LED, gimbals, TRRS connection. Wiring all of these directly to the controller would be difficult.\n\nTo simplify things, I designed a PCB to hold all of these connections. It also contains a 3.3v regulator to drive the ADPS9660 board, from back when the whole system was designed to run on 5v.\n![PCB](pcb.jpg)\n\nOriginally the SCL, SDA, and LED connections on the left were meant to go straight to pins on the pro micro controller. However, when using this with a blackpil controller, you will need to use a [level shifter](https://learn.sparkfun.com/tutorials/bi-directional-logic-level-converter-hookup-guide/all) to convert between 3.3v and 5v.\n\nHere are the sources:\n- [dactyl-manuform-gimbal.kicad_pcb](dactyl-manuform-gimbal.kicad_pcb)\n- [dactyl-manuform-gimbal.pro](dactyl-manuform-gimbal.pro)\n- [dactyl-manuform-gimbal.sch](dactyl-manuform-gimbal.sch)\n\nI had mine manufactured by [Aisler](https://aisler.net/).\n\nYou will also need these parts to make up the board:\n- Q3: 2N3904 TO-92\n- R6 \u0026 R7: 1k resistor\n- R2, R3, R4, R5: 10k resistor\n- Q1 \u0026 Q2: BS170 TO-92\n- R1: 470R resistor\n- J5 \u0026 J6: JST_PH_B3B header\n- AMS1117 3.3v voltage regulator\n- Adafruit DRV2506L haptic driver\n\n## Geometry\nThe geometry was generated using a fork of Joshua Shreve's dactyl-keyboard generator:\n\nhttps://github.com/sffubs/dactyl-keyboard/tree/gimbal\n\n![case.jpg](case.jpg)\n\nI custom-designed some controller trays to fit:\n\nhttps://cad.onshape.com/documents/eb5f1e8bc035539a3b22c66d/w/b0de5830ef436e9c93686258/e/9e4ae3f698d1b142e7089f96?renderMode=0\u0026uiState=621a5917d956b2473540e545\n\nThis for the right-hand keyboard - you will need to print the mirror image for the left-hand keyboard.\n\n![Controller tray](Controller_tray.png)\n\nThe final files I used are here:\n- [DM_left_final.step](DM_left_final.step)\n- [DM_left_final.stl](DM_left_final.stl)\n- [DM_left_plate_final.stp](DM_left_plate_final.stp)\n- [DM_left_plate_final.stl](DM_left_plate_final.stl)\n- [DM_right_final.step](DM_right_final.step)\n- [DM_right_final.stl](DM_right_final.stl])\n- [DM_right_plate_final.step](DM_right_plate_final.step)\n- [DM_right_plate_final.stl](DM_right_plate_final.stl)\n- [Controller_tray.stl](Controller_tray.stl)\n- [DM_OLED_clip.stl](DM_OLED_clip.stl)\n\n## Printing\nI printed this on my Ender 3, using Prusament Galaxy Black PLA filament, with a 0.4mm nozzle at 0.2mm resolution. I used tree-style supports, which much reduced the time and plastic required.\n\n## Firmware\n\nThe keyboard runs on QMK, and the firmware can be found here:\n\nhttps://github.com/sffubs/qmk_firmware/tree/master/keyboards/handwired/dactyl_manuform_gimbal\n\nBuild using \n\n`qmk -kb handwired/dactyl_manuform_gimbal -km default`\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsffubs%2Fdactyl_manuform_gimbal","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsffubs%2Fdactyl_manuform_gimbal","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsffubs%2Fdactyl_manuform_gimbal/lists"}