Wheelwriter 70 - QMK Conversion and XT Case Build

SunshineRag_DT

18 Nov 2022, 02:33

I recently posted my "The Franken XT" keyboard and I wanted to do a post that documented that effort.
Wheelwriter_XT_MAshup.jpg
Wheelwriter_XT_MAshup.jpg (139.92 KiB) Viewed 6354 times
The goal was to use an extra XT case I had laying around and insert a Wheelwriter 70 assembly. I saw an interesting comment on Reddit that indicated the Wheelwriter barrel plate seemed to be able to fit inside an XT case and wanted to test that theory. The Wheelwriter layout is more usable than a XT and although not perfect, if it could be configured with QMK the 78 available keys, the Code key, and function rows to the left allow a lot of flexibility for key layout. Since I did not have the F pcb anyways this allowed me to at least use these components and has a very unique and interesting look.

The first task was to see if I could even get the Wheelwriter keyboard assembly to fit. The Wheelwriter backplate is about 1/4-1/2 an inch too wide on the left of the function keys (looking at the barrel plate), and there was interference with the posts in the case and needed a little trimmed off the top sides to let the feet lay flat inside the case. None of this requires removal of barrel plate so it the plate can be trimmed without disassembly. This was possible with modification via grinder of the backplate. (NOTE: This is the time to consider a screw or bolt mod. I just wanted to test this out so I didnt, but using a grinder can certainly pop some rivets.)

plate_cropped.jpg
plate_cropped.jpg (1.45 MiB) Viewed 8957 times
This then fits in the case like so:
rough_fit.jpg
rough_fit.jpg (1.2 MiB) Viewed 8957 times
I put the keyboard, a Level1Techs MStar controller, and cable back inside and then assembled the case to make sure everything could be put together. It was tight, but they all fit and looked pretty good.
FrankenXT-2.jpg
FrankenXT-2.jpg (1.52 MiB) Viewed 8957 times
Once I realized that I could get this to work I decided to use my Level1Techs controller that I acquired for my Mini M and see if I could configure it to work with this keyboard. This actually looked like it would work well as it already had the 2x16 triomate connectors that fit the 2x15 ribbon cables on the Wheelwriter.

I assigned an 16x8 matrix in QMK and used some debugging functions to map the matrix. The following is the matrix layout for the Wheelwriter 70, in column/row pairs, other Wheelwriters may be different as they seem to use different membranes for the smaller layouts.
wheelwriter-layout-matrix.png
wheelwriter-layout-matrix.png (32.3 KiB) Viewed 8957 times
The QMK layout definition is the following, for the MStar this means adding the definition to Level1Techs m_star_classic.h header file:

Code: Select all

// Keep the Wheelwriter matrix at 16 columns to maintain implementation 
// consistency using the Default mappings, but cols 0 and F are not used
#define LAYOUT_wheelwriter70( \
    K4A, K4B,   K4C, K4D, K4E, K4F, K4G, K4H, K4I, K4J, K4K, K4L, K4M, K4N, K4O, K4P, K4Q,   K4R, K4S, K4T, \
    K3A, K3B,    K3C, K3D, K3E, K3F, K3G, K3H, K3I, K3J, K3K, K3L, K3M, K3N, K3O,   K3Q,     K3R, K3S, K3T, \
    K2A, K2B,    K2C,  K2D, K2E, K2F, K2G, K2H, K2I, K2J, K2K, K2L, K2M,  K2N, K2O,  K2Q,    K2R, K2S, K2T, \
    K1A, K1B,   K1C, K1D, K1E, K1F, K1G, K1H, K1I, K1J, K1K, K1L, K1M, K1N,  K1O,   K1Q,          K1S,      \
    K0A, K0B,               K0E,                    K0J,                   K0O,      K0Q,    K0R, K0S, K0T  \
) \
{ \
/* 00 */ { KC_NO,  K0B,   K0A,   KC_NO, KC_NO, KC_NO, KC_NO, K2H,   K2I,   KC_NO, KC_NO, K2N,   K2Q,   K0S,    KC_NO,    KC_NO }, \
/* 01 */ { KC_NO,  K1A,   K1B,   KC_NO, K2D,   K2E,   K2F,   K2G,   K2J,   K2K,   K2L,   K2M,   K2R,   K2S,    KC_NO,    KC_NO }, \
/* 02 */ { KC_NO,  K4A,   K4B,   KC_NO, K4C,   KC_NO, KC_NO, K4H,   K4I,   K4O,   KC_NO, K4N,   K4Q,   K4S,    KC_NO,    KC_NO }, \
/* 03 */ { KC_NO,  K3A,   KC_NO, KC_NO, K4D,   K4E,   K4F,   K4G,   K4J,   K4K,   K4L,   K4M,   K4R,   K4T,    KC_NO,    KC_NO }, \
/* 04 */ { KC_NO,  K3B,   K3C,   KC_NO, K3D,   K3E,   K3F,   K3G,   K3J,   K3K,   K3L,   K3M,   K3R,   K3S,    KC_NO,    KC_NO }, \
/* 05 */ { KC_NO,  K2A,   K2B,   KC_NO, KC_NO, KC_NO, KC_NO, K3H,   K3I,   K3O,   KC_NO, K3N,   KC_NO, K3T,    KC_NO,    KC_NO }, \
/* 06 */ { KC_NO,  KC_NO, K2C,   K1Q,   K1E,   K1F,   K1G,   K1H,   K1K,   K1L,   K1M,   KC_NO, K1S,   K2T,    KC_NO,    KC_NO }, \
/* 07 */ { KC_NO,  K0J,   K0Q,   K1C,   KC_NO, KC_NO, KC_NO, K1I,   K1J,   KC_NO, KC_NO, K1N,   K0R,   K0T,     K0E ,    KC_NO }, \
}
/*           0      1      2      3      4      5      6      7      8      9      A      B      C      D       E       F     */
For testing I have this implemented in the QMK keymap file for the configuration as the following. I didn't want to do anything fancy to start just get it up and running but will add more layers and mods.

Code: Select all

 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  [0] = LAYOUT_wheelwriter70( /* Base layer */
  KC_F1, KC_F2,   KC_ESC,  KC_1,    KC_2,   KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_MINS, KC_EQL,  KC_NO, KC_BSPC,   KC_PSCR, KC_SLCK, KC_PAUS, 
  KC_F3, KC_F4,   KC_TAB,  KC_Q,    KC_W,   KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC, KC_RBRC,        KC_BSLS,   KC_INS,  KC_HOME, KC_PGUP, 
  KC_F5, KC_F6,   KC_CLCK, KC_A,    KC_S,   KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT, KC_NUHS,        KC_ENT,    KC_DEL,  KC_END,  KC_PGDN, 
  KC_F7, KC_F8,   KC_LSFT, KC_NUBS, KC_Z,   KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_NO,          KC_RSFT,            KC_UP,            
  KC_F9, KC_F10,                    KC_LCTL,                           KC_SPACE,                                      KC_RCTL,                 KC_RALT,   KC_LEFT, KC_DOWN, KC_RGHT 
  ),

};
The connectors on the wheelwriter membrane are 15 traces but column 0 on the column connector is not connected. So the matrix actually starts at column 1. Only 8 traces are used on the row connector, rows 0-7. Because the membrane connectors are 15 wide you have to leave the position farthest from the blue pill as the empty position in the triomate.
mstar_triomate_connection.jpg
mstar_triomate_connection.jpg (962.67 KiB) Viewed 8957 times
Once I got it all tested and debugged I flashed the configuration using the QMK_MSYS tool. It's alive!
wheelwriter70_qmk.jpg
wheelwriter70_qmk.jpg (912.82 KiB) Viewed 8957 times
[UPDATE]
I have been able to get this to compile with the VIA toolkit and allow dynamic update of layout. You have to build a layout file below to load into the Design Tab, using the "Use V2 definitions" option enabled. You can then go to the Configure Tab to modify the mapping. The "vendorId" and "productId" in this file need to match the values in the QMK build with VIA enabled. I was only allowed to build with 3 layers due to a constraint in the compiler for the STM32. The pairs in the text are row, col mappings of the matrix to the key in KLE layout format. FYI the row, col layout was very annoying as I had already documented my matrix in col, row format, so I had to go and swap all the pairs around in my KLE file...

Code: Select all

{
  "name": "MStar Wheelwriter70",
  "vendorId": "0xFEED",
  "productId": "0xB155",
  "lighting": "none",
  "matrix": { "rows": 8, "cols": 16 },
  "layouts": {
    "keymap": [
			  [
				"2,1",
				"2,2",
				{
				  "x": 0.25
				},
				"2,4 ",
				"3,4 ",
				"3,5 ",
				"3,6 ",
				"3,7 ",
				"2,7 ",
				"2,8 ",
				"3,8 ",
				"3,9 ",
				"3,10",
				"3,11",
				"2,11",
				"2,9 ",
				{
				  "w": 2
				},
				"2,12",
				{
				  "x": 0.25
				},
				"3,12",
				"2,13",
				"3,13"
			  ],
			  [
				"3,1",
				"4,1",
				{
				  "x": 0.25,
				  "w": 1.5
				},
				"4,2 ",
				"4,4 ",
				"4,5 ",
				"4,6 ",
				"4,7 ",
				"5,7 ",
				"5,8 ",
				"4,8 ",
				"4,9 ",
				"4,10",
				"4,11",
				"5,11",
				"5,9 ",
				{
				  "w": 1.5,
				  "h": 2,
				  "w2": 2.25,
				  "h2": 1,
				  "x2": -0.75,
				  "y2": 1
				},
				"0,12",
				{
				  "x": 0.25
				},
				"4,12",
				"4,13",
				"5,13"
			  ],
			  [
				"5,1",
				"5,2",
				{
				  "x": 0.25,
				  "w": 1.75
				},
				"6,2 ",
				"1,4 ",
				"1,5 ",
				"1,6 ",
				"1,7 ",
				"0,7 ",
				"0,8 ",
				"1,8 ",
				"1,9 ",
				"1,10",
				"1,11",
				"0,11",
				{
				  "x": 2.5
				},
				"1,12",
				"1,13",
				"6,13"
			  ],
			  [
				"1,1",
				"1,2",
				{
				  "x": 0.25,
				  "w": 2.25
				},
				"7,3 ",
				"6,4 ",
				"6,5 ",
				"6,6 ",
				"6,7 ",
				"7,7 ",
				"7,8 ",
				"6,8 ",
				"6,9 ",
				"6,10",
				"7,11",
				{
				  "w": 2.75
				},
				"6,3",
				{
				  "x": 1.25
				},
				"6,12"
			  ],
			  [
				"0,2",
				"0,1",
				{
				  "x": 3,
				  "w": 2.5
				},
				"7,14",
				{
				  "w": 7
				},
				"7,1",
				{
				  "x": 1.25,
				  "w": 1.5
				},
				"7,2",
				{
				  "x": 0.25
				},
				"7,12",
				"0,13",
				"7,13"
			  ]
		]
	}
}
MSTAR_VIA.jpg
MSTAR_VIA.jpg (218.87 KiB) Viewed 8555 times
Putting it all together. The controller is tight fit and needed some electrical tape protection to ensure that it does not short against the case base or plate. I also wound a couple of layers of electrical tape around the cable to pinch it as a cable stop at the back, this worked very well and actually looked good. Once crammed in there I can run the usb cable out the back and connect it up and it stays pretty tight.

After cutting the Wheelwriter cover to fit over the barrel plate and inside the case we finally have something that looks like it might have come from the factory. When trimming the Wheelwriter cover remember to leave extra space (1/4in) to the right of the nav cluster as the case has a little extra gap there. Here is how it turned out....
FrankenXT.2jpg.jpg
FrankenXT.2jpg.jpg (1.01 MiB) Viewed 6354 times
As I mentioned in my post is this probably not my best idea, but it was a fun and a learning effort for me using QMK. I suspect not many will have a spare XT case and a Wheelwriter assembly but hopefully this is helpful for others in using QMK and the MStar controller.
Last edited by SunshineRag_DT on 05 Feb 2023, 18:10, edited 21 times in total.

User avatar
Muirium
µ

19 Nov 2022, 10:35

Nice project. I have a spare XT case if anyone’s needing one for this.

User avatar
TNT

20 Nov 2022, 20:40

I like the odd looks of the layout. Maybe you can find a solution for covering up the holes.

What cable did you use? I had kind of a hard time finding coiled USB-C cables in a decent quality and length.

SunshineRag_DT

21 Nov 2022, 17:32

Yeah not alot out there. I found this on ebay "Heavy Duty USB-C to USB-A 2.0 Charge Sync Cable Tangle Free Coiled Wire Design
". This had the best coil I could find, still pretty short as it as a 3 foot coiled length, but it is a total 6ft coiled cord so it is much bigger coiled length than others I saw. The coil is maybe a 1.5 feet. The coil was actually very nice, and it is tight and consistent loops with matte finish and not shiny plastic. I do not like the braided aviator cables, but I suppose those might work if they fit your style.

As for quality, it seems ok. Maybe someone can find a longer coiled cable but I could not. FYI the blue pill is a micro usb, so I had to do a micro to female C adapter inside the case to get this look.

User avatar
Bjerrk

21 Nov 2022, 21:20

Haha, awesome project.
I recently QMK-converted a wheelwriter, but it actually still functions as a typewriter as well! Something about playing Quake on a typewriter seemed like a good idea at the time.

SunshineRag_DT

22 Nov 2022, 03:17

Bjerrk wrote:
21 Nov 2022, 21:20
Haha, awesome project.
I recently QMK-converted a wheelwriter, but it actually still functions as a typewriter as well! Something about playing Quake on a typewriter seemed like a good idea at the time.
FYI, if you were interested in VIA mapping that QMK, I have uploaded my JSON for that just now.

User avatar
dotdash

14 Dec 2022, 18:39

What hoops did you have to jump through to get the m-star to compile on current QMK? I'd eventually like to get Vial enabled QMK on my M-Star powered Mini-M but I can't even get a basic QMK compile to work. I got QMK going and did a test compile on the omnikeyish, which worked fine. Then I pulled the m_star repo via git, and copied it to my QMK directory. First pass bombed, but I was able to change references in keymap.c from KC_SLCK to KC_SCRL to get past the initial errors. Now I'm getting something about send_string.c pulling in include/runetype.h and it doesn't like the comma placement.

SunshineRag_DT

29 Dec 2022, 02:35

dotdash wrote:
14 Dec 2022, 18:39
What hoops did you have to jump through to get the m-star to compile on current QMK?
To be honest the only thing I did was sort out the Wheelwriter matrix and mapped it to the MSTAR Mini M pin layout. QMK did the rest for me. Also note that I did not build any of the standard MSTAR configs other than the Mini M so I dont know if the other configs might have some things to sort to compile properly as I think MSTAR was compiled and tested to an older QMK.

I used the QMK_MSYS tool to compile under Windows, so it took care of most if the configuration for me. I downloaded the QMK_MSYS tool, and then ran a setup command that pulls the QMK repo. I then copied the Level1 code into the build directory as "\qmk_firmware\keyboards\m_star_classic". I cloned the mini m mapping data into a new folder to create for the Wheelwriter70 configuration and futzed about there. The mini m connector layout uses the 16x12 matrix with the 2x16 triomates so it naturally fit with the two 15 trace membrane connections of the 14x8 matrix on the Wheelwriter.

I think the Level1Techs QMK structure is not really in the correct structure as I think they should have separate configurations as each "keymap" that is in their configuration is technically a completely new matrix and pin layout (122, Model M, Mini, etc) and each should probably be a new keyboard as opposed to a keymap. This would create alot of redundant code so I do understand why they did it that way. The MSTAR project is not really a keyboard or a layout, it is just a common hardware configuration (STM32 Blue Pill). You compile that into a specific controller for a layout. Conceptually in QMK if the matrix layout changes you should probably have a new build for it, but the Level1 code worked as is to compile to a specific matrix target. This becomes more important for VIA and VIAL so you might likely can only change and compile one of these "keymaps" since the VIA JSON will be common for a VIAL keyboard I think.

In general, even with base QMK, I do recall that I had problems with the row/col matrix begin double defined so believe I just used the config.h at the top level (m_star_classic folder) and not in the keymap folder. I think I did have to change some of the key constants like you mention for some reason, as stated I think MSTAR was tested on an older QMK version. Oh and I did disable some of the MSTAR build options that were stated as not compatible with VIA, I dont recall what they were right now but they are documented in VIA.

That said you could use the MSTAR code to run ANY matrix up to 16x12 using the STM32 blue pill. This is pretty much what I did with the Wheelwriter, I just used the Mini M PCB with the Triomates because it was compatible with the Wheelwriter membrane connections. For a custom layout you could just define the pins used and connect it to the matrix wires using a connector or directly. So instead of using the Triomate connections you could attach a custom matrix directly to the blue pilll. The only compile issue I had (other than my errors) was when building VIA if you dont bump the layer count down to 3 you get an exception that it wont fit into the virtual EEPROM.

FYI I only got VIA enabled, I never got around to using the VIAL configuration. As VIAL is a QMK fork I just dont know if there are any additional gotchas as I used standard QMK. Technically I would think they would be compatible, but there are several caveats to QMK in the VIAL docs. That and the VIAL JSON might need to be stored in EEPROM and as the SMT32 does not have an EEPROM it uses a virtual one set aside in the flash memory and maybe other things for VIAL. As stated I had to bump the layers back for VIA, not sure how VIAL would add to that virtual memory layout or if you would run into storage issues for the JSON data using the SMT32. At this point loading the design file into VIA is really ok for me if I want to change the layout.

By now maybe you sorted all the compile issues, but hopefully this helps.

User avatar
guidemetothelight

19 Apr 2023, 10:39

Muirium wrote:
19 Nov 2022, 10:35
Nice project. I have a spare XT case if anyone’s needing one for this.
Hey µ,

you still do :?:

User avatar
Muirium
µ

19 Apr 2023, 11:36

I do. ;)

User avatar
guidemetothelight

19 Apr 2023, 12:01

Muirium wrote:
19 Apr 2023, 11:36
I do. ;)
Thats great to hear ! Sadly this thing is only "normal" Buckling Spring.
Maybe If I find a capacitive Model (kmnov hinted at the 85 series), I will ask you once again :)

SunshineRag_DT

22 Apr 2023, 07:37

guidemetothelight wrote:
19 Apr 2023, 12:01
Maybe If I find a capacitive Model (kmnov hinted at the 85 series), I will ask you once again :)
I suspect kmnov meant the IBM 65/85/95 Electronic Typewriter:https://typewriterdatabase.com/198x-ibm ... typewriter.

Likely these are the transition between the Selectric and the Wheelwriters. I don't think they made it in the Wheelwriter configuration, but they definitely use capacitive Model F assemblies. The layout of those 85 series would not be compatible with an XT case.

User avatar
guidemetothelight

23 Apr 2023, 13:26

SunshineRag_DT wrote:
22 Apr 2023, 07:37
I suspect kmnov meant the IBM 65/85/95 Electronic Typewriter:https://typewriterdatabase.com/198x-ibm ... typewriter.
Yeah , that was the one , thank you ! actually aquired a 95 for veeery cheap :D very happy , hope it gets here soon
SunshineRag_DT wrote:
22 Apr 2023, 07:37
I don't think they made it in the Wheelwriter configuration, but they definitely use capacitive Model F assemblies. The layout of those 85 series would not be compatible with an XT case.
Interesting. Well , I just ordered screws to screw mod the Model M like 67 series Keyboard , maybe ill have to get back to µ and take him up on his offer :roll: :?:

User avatar
guidemetothelight

25 Apr 2023, 14:27

SunshineRag_DT wrote:
18 Nov 2022, 02:33
After cutting the Wheelwriter cover to fit over the barrel plate and inside the case we finally have something that looks like it might have come from the factory. When trimming the Wheelwriter cover remember to leave extra space (1/4in) to the right of the nav cluster as the case has a little extra gap there. Here is how it turned out....
Hey , I am planning on replicating this Build ( since it is hella cool 8-) )
Any advice / stuff you wish you had done differently ?

SunshineRag_DT

26 Apr 2023, 06:28

guidemetothelight wrote:
25 Apr 2023, 14:27
Any advice / stuff you wish you had done differently ?
I was in too much of a hurry to get it all together but I wish I screw/bolt modded it, I would have really liked to add the ISO position flippers, but you already have an ISO Wheelwriter so I think you have all positions available already.

The main thing I did wrong was to forget to initially cut out room on the plate for the feet to fold in properly. I cracked one a bit trying to close the case the first time. Luckily the crack was inside, was not visible and was fixable. You can see what I finally did in pics with the notch cut on each side to let the feet go all the way down.

Most of the stuff I didn't document was fitting that keyboard assembly to get it centered. If you take a close look at this download/file.php?id=76054 you can see I am resting the cut outs on the case supports around the feet springs. Also note there is some foam tape at the front of the case to keep the bottom aligned and stop movement.

Centering the thing was alot of trial and error. The cutout on the plate for the case support is the main way to position the keyboard assembly. If you cut or measure slowly to get those post cutouts in the right spot and the right size it will help keep the keyboard assembly aligned that really helps. Try to work to get the back of the assembly to use the case supports to get the proper back alignment. Mine are a little off center and a little deep and wide so I have to wiggle the keyboard to center as I tighten the case, although it does allow me to fiddle a bit with the final alignment.

Using a dremel with a cutting head I also notched some "fingers" at the bottom of the inside the case (where the foam tape is) to position and drop the keyboard assembly in front, which I think I had to do to fit the cover. I might take a pic of that sometime to show that, and it should still be compatible with the original assembly if I ever get one. The case pressure fits the keyboard assembly to secure it as there is a bump on the lower case. You dont want too much pressure there either as it might stress the rivets, but I have not had any problems.

Also there is a gap on the arrow cluster side and the cluster sits a little further from the side. If you cut the Wheelwriter cover to use as a plate remember to leave room on that side to cover all the way. Also, also... I used electrical table to create a cablestop when running the cable out the back which pressure fits the cable when the case is closed.

That's about all I can think of right now, hope you have as much fun as I did!

User avatar
guidemetothelight

26 Apr 2023, 10:50

SunshineRag_DT wrote:
26 Apr 2023, 06:28
That's about all I can think of right now, hope you have as much fun as I did!
Thank you so so much for all the Info & for taking the time to write this.
I will update over on my thread when I have progress to share. :)

Post Reply

Return to “Workshop”