One nit pick... The firmware is BIOS compatible as it is. One of my friends says it sometimes doesn't some "online" quickly enough to be able to hit F2 or Del or whatever to access the BIOS. There is a _delay_ms(2000) (originally from the pjrc code) when initiating. This delay could probably be shortened, I'm not entirely sure why it is needed.
Here is the schematic too, if you want to add that to the main wiki post, litster.
All my switches came from very old Wyse and Cherry POS keyboards. The switch bottoms came from old Wyse plate-mounted switches. The stems and springs came from an old Cherry POS keyboard with browns. Since I have mixed all the parts together, I don't remember if the switch tops were from the Wyse blacks, or Cherry POS browns. But they are all pretty old. The feel of the Phantom is different than my Filco browns, in a very good way IMO. I love typing on the Phantom now. I don't know if it is the switches, the aluminum plate, the PCB, or a combination of all.
Also, you can't just keep soldering and desoldering over and over again if you keep modding your switches. You can, but you will soon damage the PCB. With the phantom plate, you can do it without desoldering and soldering, and you don't even need to open up the case. And you don't need the tools and skills to solder and desolder to swap switches.
Like I said the stickers are designed to fill up the space between the lower and upper switch case in order to reduce the play and minimize the switch wobble. If you remove the keycap next to the switch you want test for wiggle, you will notice that the upper switch case is having a tendency to move.
Do you think it is possible for us to get some Group buy for vinyl stickers?
Vinyl stickers for what?
I see what you mean, RiGS. I suspect that the cut out isn't too big of a problem since the switch top isn't resting on the area where the extra cutout is. But I could see it could be less structually stable by a little bit. Hard to say. If I have time I will take close up HD movie of shaking a switch on phantom and on a Filco to see if there is any difference. Wish I still have the high speed 600fps Casio camera to take super slow mo movie of the switch while shaking it. That would be cool.
Anybody has any idea where I can find a USB cable that is similar to the original Filco cable where there is cable gland that hooks to the case? I haven't been able to find anything like that.
Those in the video are a lot more blunt than the ones you linked... here (http://www3.towerhobbies.com/cgi-bin/wti0001p?&I=LXBUWH&P=7) is the Tamiya model I would suggest, although they might even be too blunt. There's tons of different tweezers tho. Something more blunt than what you linked, perhaps less blunt than mine :)
Indeed, that would be cool.
are we still debating wobblilililiity? seriously guys, it's a keyboard.
question for litster: how did you get usb out on your plexi cases? did you do a small l-style cable from the teensy?
A gland is an organ in an animal's body that synthesizes a substance for release of substances such as hormones or breast milk, often into the bloodstream (endocrine gland) or into cavities inside the body or its outer surface (exocrine gland).
I'm thinking about making a case out of fiberglass. I don't own a Filco and it's much cheaper for me to make my own case (free actually since I'm an automotive painter with free supplies). I've worked with fiberglass on automotive paint repair before so I think I have what it takes. I'll probably fabricate the case out of clay or foam or something and then make a mold. Anyone else done something like this? I wonder how hard carbon fiber would be to work with, on second thought. There are so many car modification blogs and forums with DIY instructions for making custom carbon fiber parts...
If someone has a Filco case who would like to take on a project like this too, don't throw away your mold if you make one. :)
You could buy a PLU for 1/3-1/2 the cost of a Filco that would probably be your best bet.
You can get a PLU for pretty good price from qtan. I think TheProfosist bought 3 from qtan and qtan told him that he would give others similar pricing. You get switches from a PLU as well, you just have to desolder them off of the PCB.Yea the price was $68 before shipping. Was a white one with blues pm or post in his forum for a quote for the case color and switch type that you want.
You guys are making me pulling out all the stops...
I give you... 1080p goodness! (well, you have to manually switch to 1080p :-))
Keep in mind that the browns on the Phantom are at least 15 years old, while the Filco is less than a year old.
Filco:
[video=youtube;BNMmwvvwZso]http://www.youtube.com/watch?v=BNMmwvvwZso[/video]
Phantom:
[video=youtube;vH4OvhTzid4]http://www.youtube.com/watch?v=vH4OvhTzid4[/video]
EDIT:
Yes, I had to sack a perfectly good blank yellow PBT keycap to shoot these videos. LOL!
Haha. Amazing video, it seems the plate doesn't affect the wobblility. Now I want a Phantom as well.
I wonder how hard carbon fiber would be to work with, on second thought. There are so many car modification blogs and forums with DIY instructions for making custom carbon fiber parts...
I'm thinking about making a case out of fiberglass. I don't own a Filco and it's much cheaper for me to make my own case (free actually since I'm an automotive painter with free supplies). I've worked with fiberglass on automotive paint repair before so I think I have what it takes. I'll probably fabricate the case out of clay or foam or something and then make a mold. Anyone else done something like this? I wonder how hard carbon fiber would be to work with, on second thought. There are so many car modification blogs and forums with DIY instructions for making custom carbon fiber parts...
If someone has a Filco case who would like to take on a project like this too, don't throw away your mold if you make one. :)
If you get the carbon fiber as cloth then it's nearly identical to working with fiberglass. What you think of as the carbon-fiber look is purely a cosmetic layer. Carbon fiber structures are made with uni-directional carbon fibers that are laid in an alternating pattern according to the structural requirements of the item being crafted. For a standard flat panel this would usually include layers at 90° and 45° to the first layer.
Robotics club here at my uni makes everything out of their makerbot. >< They just print parts they need. Too bad Keyboard case is too big for it.can it do walls thin enough for keys?
soo... any chance of getting the dimensions for case design anytime soon?
So presuming that you are talking about the cherry switch stickers, vinyl is the wrong choice. The real deal I believe are made of paper, possibly some fiber reinforced stuff but definitely not vinyl. Vinyl is far too easily deformed for that to work.
The stickers work so well you wouldn't believe it.
actually, i'm curious now what impact this is going to have with being able to get the housing open from the top only, once these are plate mounted.
img1
however, sixty's stickers above are different than the ones seen below:
img2
Ok, so what's new is all the stuff outlined in this post (http://geekhack.org/showwiki.php?title=Island:17458&p=466081&viewfull=1#post466081).
You can now define a bunch of settings in a text file, compile it, and upload it to the converter. There's a few example config files in the tools zip.
The tools are Windows only, but should be very easy to build for Linux and Mac.
You probably want to get all three zip files anyway - there's list of HID codes in the src archive which might come in handy.
The converter now outputs the HID codes that come from the first (fixed) stage of translation to the debug output (hid_listen), preceded by + or -. This should help a bit if you're not sure which code you need to remap for a key.
I've removed previously hard-coded settings. They are now in the legacy.sc config file. If you want the v0.997 converter to act exactly like v0.996:
- Flash the Teensy with the hex file
- Open a command line prompt in the tools folder, and type these commands:
- scas legacy.sc legacy.scb
- scwr legacy.scb
There's two versions of the hex file for each Teensy. The _temp versions will reset all settings each time they boot up. Hopefully they won't be needed, but if I've screwed up, or writing the config to the Teensy is interrupted, they can be used to clean things up.
General Status Update...
- EEPROM handling in Converter - done.
- Utilities to read/write EEPROM - done (for Windows).
- Settings binary format - done.
- Settings handling in Converter - done (but not fully tested).
- Simple compiler to turn Settings text file into Settings binary file - todo.
What are the Settings then?!
- Remaps
- Macros
- Layers
- Selects
Remaps
Are not whole translation tables! As a silly example, if you wanted to swap the '1' key with the '2' key, you might write:
1=2
2=1
(with some additional bumph around that to define a block).
Macros
Can trigger for any single key with any of the standard modifiers.
Separate macros can be defined on make and break (although, on make only is the most useful and reliable).
Macros are sequences of comands which can currently be: key events, modifier manipulation, and delays.
Layers
Up to 8 keys can be defined to act as a 'Fn' key to access further layers.
Any key can be used in this way - the keys are defined using the remap mechanism, so remapping a key to, say, 'FN1' defines it.
A layer is defined as any combination of those keys - so theoretically up to 256 layers! However, since each layer takes up a fair bit of memory, roughly 3 is the max on a Teensy 2.0, and maybe 25 on a Teensy++.
Each remap block is tagged with the layer it applies to (if not the base layer).
Selects
Up to 7 keys can be defined to toggle configurations of settings.
As with layers, these can be defined as remaps (to SELECT1 etc). But they can also be put in a macro, so that you can define a combination of keys to select a configuration.
All of the blocks for remaps, macros and layers can be tagged with a Select ID (1 to 7). But it is not required. In fact, base settings would usually not be marked as a Select.
Triggering a Select toggles that group of settings, but leaves the others alone.
So, basically... enough Settings to shoot yourselves in the foot with! :-)
Back to the todo - does anyone have experience with Boost::Spirit?
It looks interesting for the compiler part...
This new update sounds very awesome. We need someone to help port it over to use on Phantom :-)
Currently got about a dozen items on my to-do list, and making this sort of thing possible, somehow, is quite high on the list. I really can't say at the moment how quickly I'll be able get to it though.
Is there a detailed pcb picture with measurements available for people designing their own case?I will get this done within the next couple of days. I am pretty busy, but I should be able to squeeze it in. It shouldn't take too long...
Don't stress yourself, this is very much appreciated, thank you!There are CAD drawings for all the mounting plate in a zip file in the wiki article. They should in fact be more interesting than the PCB itself, but I will make a drawing of it as well.
am i right in thinking that the 5 large holes are free to be used for pcb mounting? (ie nothing else needs to go through there?)
Blank 1.5 modifiers are really hard to find. I wonder if I can modify my 7bit plate for 12 1.25 keys. I was counting on GB4 to get blanks but they were removed so I'm sort of screwed.
I like the idea of all the extra keys on the bottom row but 1.5 keys seem to be pretty rare.
Have you seen bmy layout it uses 1.25 and 1.75 instead. there are small 0.125 gaps on the ends of the row though not that it bothers me.
SP claims to have PBT 1.5x modifiers in stock right now...
yeah, i get that with the quantity you need to do, you'll be doing them in all your spare time. that being said, i'm not suggesting you bolt it to your desk, but rather a small piece of board, which you could then clamp to any flat surface, being dinning room table, desk, etc. i've done this with a lot of my mountable tools, where i don't want them permanently fixed.
aluminum and 1/16" thick. A little filing may be required for Costar stabilizers. Just a little bit.
We are getting close to get parts sorted and packed. Any effort going into revving the current Teensy firmware? I see there is some firmware action with the Ergo Dox project. I lot of that could benefit Phantom's firmware as well, right?
I wasn't keeping up much with the firmware, but the prototypes work fine, so in its current state it's good enough to use, yes?
last_char = nil
start_time = Time.now
loop
next_char = gets.chomp
if next_char == last_char && ((Time.now - start_time).to_f < 0.1)
break
else
start_time = Time.now
last_char = next_char
return next_char
end
end
Firmware should be:
Sorry about the uncompilable code, and failure to write is as a proper method, but you get the idea.
PS: I just realized who I was communicating with. Why did you change your name? Did Vespa dump you and you lost your schwartz? ;-)
BOARD = phantom
MCU = atmega32u4
F_CPU = 16000000
#BOARD = iso
#MCU = at90usb1286
#F_CPU = 16000000
# BOARD = symmetric
# MCU = at90usb1286
# F_CPU = 16000000
# BOARD = pontus
# MCU = at90usb1286
# F_CPU = 16000000
I can compile hex files, but then you wont see how I log your keystrokes and mail them to myself =Dworked perfectly now i just need to get all my switches on and finish everything up. After that im going to have to find someone that can program a layer in for my layout.
Seriously, there should be compiled hex files in the repository. But the current ANSI with winkeys layout is the only one I know to work for sure.
Ok, so I went ahead and added the hex file. I don't know if that is actually downloadable from the http or if you need to use git...
Just for the fun of it, I decided to compile Hasu's tmk keyboard firmware (specifically the macway build) and program it to my phantom. Surprisingly, more than half the switches sent keystrokes (though the not the right keystrokes). With some work, I think this firmware could be made to work with the phantom. This would probablty be the easier way to get media keys and function layers, because Hasu's firmware already has these features implemented. Unfortunately I'm not very good at programming, so hopefully someone else can do this.though about that previously as well as the firware worked for the dox. And has all the features i need.
What language is that even?
I linked to the github page above but that may have been a bit secluded https://github.com/BathroomEpiphanies/Teensy-Keyboard
I made the code more general, moving model specific functions out of the main file. Pins, layout, AVR chip, CPU speed, and so on is defined in the make file. I will remove the "Phantom-Firmware" repository. Right away may be just as well =)
I played with the tmk firmware back when this all first started: https://github.com/riffautae/tmk_keyboard (https://github.com/riffautae/tmk_keyboard)
I wrote the code to map the LED's and keys proper.
I couldn't get anything to run though, I expect this was my build environment. When I get my board I will play with it more.
can someone start building a list of things (preferably on the wiki?) that we need done to the phantom firmware? my parts are in LA with reaper, but i do have a number of teensies and if nothing else, finally have a test execution environment..
I'm in the midst of figuring out how to modify the LED brightness, have to build a build VM first. Also, would be nice to have one of each layout available already built.
/* LEDs are on output compare pins OC1B OC1C
This activates fast PWM mode on them.
Prescaler 256 and 8-bit counter results in
16000000/256/256 = 244 Hz blink frequency.
LED_A: Caps Lock
LED_B: Scroll Lock */
/* Output on PWM pins are turned off when the timer
reaches the value in the output compare register,
and are turned on when it reaches TOP (=255). */
void setup_leds(void) {
TCCR1A |= // Timer control register 1A
(1<<WGM10) | // Fast PWM 8-bit
(1<<COM1B1)| // Clear OC1B on match, set at TOP
(1<<COM1C1); // Clear OC1C on match, set at TOP
TCCR1B |= // Timer control register 1B
(1<<WGM12) | // Fast PWM 8-bit
(1<<CS12); // Prescaler 256
OCR1B = 250; // Output compare register 1B
OCR1C = 250; // Output compare register 1C
// LEDs: LED_A -> PORTB6, LED_B -> PORTB7
DDRB &= 0x3F;
PORTB &= 0x3F;
}
can someone start building a list of things (preferably on the wiki?) that we need done to the phantom firmware?
My LED's are so bright, that the only setting that doesn't burn holes in my eyes is 1. I probably should have used stronger resistors than the 100 ohm ones I have in there, but they were the only ones I had on me at the time.can someone start building a list of things (preferably on the wiki?) that we need done to the phantom firmware?
The only things I think we need are media keys and programmable layers, along with whatever other crazy features we can dream up.
My LED's are so bright, that the only setting that doesn't burn holes in my eyes is 1. I probably should have used stronger resistors than the 100 ohm ones I have in there, but they were the only ones I had on me at the time.can someone start building a list of things (preferably on the wiki?) that we need done to the phantom firmware?
The only things I think we need are media keys and programmable layers, along with whatever other crazy features we can dream up.
const uint8_t is_modifier[NKEY] = {
true, true, false, false, false, false, // COL 0
true, false, false, false, false, false, // COL 1
true, false, false, false, false, false, // COL 2
NA, false, false, false, false, false, // COL 3
NA, false, false, false, false, false, // COL 4
NA, false, false, false, false, false, // COL 5
NA, false, false, false, false, false, // COL 6
false, false, false, false, false, false, // COL 7
NA, false, false, false, false, false, // COL 8
NA, false, false, false, false, false, // COL 9
true, false, false, false, false, false, // COL 10
true, false, false, false, false, false, // COL 11
false, NA, false, false, NA, false, // COL 12
true, true, false, false, false, false, // COL 13
false, NA, NA, false, false, false, // COL 14
false, false, NA, false, false, false, // COL 15
false, NA, NA, false, false, false, // COL 16
};
const uint8_t layout[NKEY] = {
//ROW 0 ROW 1 ROW 2 ROW 3 ROW 4
KEY_LEFT_CTRL, KEY_LEFT_SHIFT, KEY_CAPS_LOCK, KEY_TAB, KEY_1, KEY_ESC, // COL 0
KEY_LEFT_GUI, KEY_PIPE, KEY_A, KEY_Q, KEY_2, KEY_TILDE, // COL 1
KEY_LEFT_ALT, KEY_Z, KEY_S, KEY_W, KEY_3, KEY_F1, // COL 2
NA, KEY_X, KEY_D, KEY_E, KEY_4, KEY_F2, // COL 3
NA, KEY_C, KEY_F, KEY_R, KEY_5, KEY_F3, // COL 4
NA, KEY_V, KEY_G, KEY_T, KEY_6, KEY_F4, // COL 5
NA, KEY_B, KEY_H, KEY_Y, KEY_7, KEY_F5, // COL 6
KEY_SPACE, KEY_N, KEY_J, KEY_U, KEY_8, KEY_F6, // COL 7
NA, KEY_M, KEY_K, KEY_I, KEY_9, KEY_F7, // COL 8
NA, KEY_COMMA, KEY_L, KEY_O, KEY_0, KEY_F8, // COL 9
KEY_RIGHT_ALT, KEY_PERIOD, KEY_SEMICOLON, KEY_P, KEY_MINUS, KEY_F9, // COL 10
KEY_RIGHT_GUI, KEY_SLASH, KEY_QUOTE, KEY_LEFT_BRACE, KEY_EQUAL, KEY_F10, // COL 11
KEY_APPLICATION, NA, KEY_BACKSLASH, KEY_RIGHT_BRACE, NA, KEY_F11, // COL 12
KEY_RIGHT_CTRL, KEY_RIGHT_SHIFT, KEY_ENTER, KEY_BACKSLASH, KEY_BACKSPACE, KEY_F12, // COL 13
KEY_LEFT, NA, NA, KEY_DELETE, KEY_INSERT, KEY_PRINTSCREEN,// COL 14
KEY_DOWN, KEY_UP, NA, KEY_END, KEY_HOME, KEY_SCROLL_LOCK,// COL 15
KEY_RIGHT, NA, NA, KEY_PAGE_DOWN, KEY_PAGE_UP, KEY_PAUSE, // COL 16
};
The value at position col*6+row in the array "pressed" is 1 if that key is pressed and 0 otherwise. Remember that rows and columns are zero-indexed.ok so what would be needed the would probably be an if/then, another variable, and another array. Though I am mostly lost as to how to make it work and havnt even found the part you talked about yet. I know very little about programming though it seems enough to be dangerous.
alaricljs, this pretty sweet!agreed now if even one layer was made to work you could add that in as well.
ic07 has been building teensy firmware for ergo Dox. Wonder if he could help, or someone takes his code and port it over for Phantom.
Where can I find this code?
So I've got basic function layer support working with one other layer that is active only when the function key is held down. This is only useful if you have a locking cherry switch installed, so I'm working on expanding this to something more useful.Thats fine for me as I have a HHKB esk layer. Also I think even Hazu's firmware that was used for the DOX was only able to do that also toggling layers without a locking switch wasnt possible
Are you guys interested in an aluminum metal case? If someone can provide the CAD file for something that fits or an exact duplicate of the current stock filco case, I might be able to get a friend of mine to make it. He works at a CNC machine shop.Im good im just using a PLU-87 case for mine.
I wish I knew how to draw it up on autoCAD.
Are you guys interested in an aluminum metal case? If someone can provide the CAD file for something that fits or an exact duplicate of the current stock filco case, I might be able to get a friend of mine to make it. He works at a CNC machine shop.
I wish I knew how to draw it up on autoCAD.
I'm gonna order a digital caliper to get accurate measurements. Right now I only have a standard ruler :(. Any recommended micro calipers? Are the $10 ones on ebay any good?Are you guys interested in an aluminum metal case? If someone can provide the CAD file for something that fits or an exact duplicate of the current stock filco case, I might be able to get a friend of mine to make it. He works at a CNC machine shop.Give me dimensions and I can finalize one.
I wish I knew how to draw it up on autoCAD.
For you cats thinking about doing a case, my Phantom is naked and my wallet doesn't have the 350 hit points necessary for that MKC one. I'm in.Not even sure the $350 MKC case fits the phantom boards and plates.
I'm gonna order a digital caliper to get accurate measurements. Right now I only have a standard ruler :(. Any recommended micro calipers? Are the $10 ones on ebay any good?The differences between the cheap digital calipers and the expensive ones are that the expensive ones are absolute and don't break. It may measure a bit more accurately but even cheap ones measure two decimal points in mm fairly accurately, well, accurately enough for us anyway.
I'm gonna order a digital caliper to get accurate measurements. Right now I only have a standard ruler :(. Any recommended micro calipers? Are the $10 ones on ebay any good?Are you guys interested in an aluminum metal case? If someone can provide the CAD file for something that fits or an exact duplicate of the current stock filco case, I might be able to get a friend of mine to make it. He works at a CNC machine shop.Give me dimensions and I can finalize one.
I wish I knew how to draw it up on autoCAD.For you cats thinking about doing a case, my Phantom is naked and my wallet doesn't have the 350 hit points necessary for that MKC one. I'm in.Not even sure the $350 MKC case fits the phantom boards and plates.
For you cats thinking about doing a case, my Phantom is naked and my wallet doesn't have the 350 hit points necessary for that MKC one. I'm in.if you need a cheap case just pick up a PLU-87 its a direct knockoff of a Filco.
Use a micro straight blade screw driver and gently press the black plastic piece toward the plate edge so that it engages properly. You may or may not hear a click as it seats itself. The tolerance is very tight.I managed to actually get the key installed, but I can't seem to avoid a fair amount of friction. I can feel a little bit of resistance when lowering the key but it still gets stuck coming up if you don't release it very quickly. With the switch removed the keycap moves freely with just the stabilizers but if I put the stem in the cap it causes a noticeable amount of friction on the stabilizers.
Oh yeah, by gently I mean as hard as you can with confidence that if you slip you won't destroy it or cut your hand open.
Are you guys interested in an aluminum metal case? If someone can provide the CAD file for something that fits or an exact duplicate of the current stock filco case, I might be able to get a friend of mine to make it. He works at a CNC machine shop.I'd love to have an aluminum case but it really comes down to how much it is.
I wish I knew how to draw it up on autoCAD.
const uint16_t kbmap[NKEY] = {is_modifier[0]character[0], is_modifier[1]character[1], ...};
const uint8_t is_modifier[] = (uint8_t[])kbmap;
const uint8_t layout[] = (uint8_t[])kbmap + 1;
[...]
for(col = 0, key = 0; col < NCOL; col++) {
for(row = 0; row < NROW; row++, key+=2) {
[...]
}
}
if((layout[key] & 0x0100) == 0x0100)
mod_keys |= (layout[key] & 0x00FF);
if((layout[key] & 0xFF00) == 0x0100)
mod_keys |= (layout[key] & 0x00FF);
uint8_t layout_value(uint8_t index){ //Just make sure that there are never more than 128 keys!
//create new layout pointer, type cast it to 8 bit pointer
uint8_t *layout_val = (uint8_t*) layout;
//index now needs to be twice as big plus one
index *= 2;
index++;
return layout_val[index];
}
uint8_t layout_type(uint8_t index){ // Just make sure that there are never more than 128 keys!
//create new layout pointer, type cast it to 8 bit pointer
uint8_t *layout_val = (uint8_t*) layout;
//index now needs to be twice as big
index *= 2;
return layout_val[index];
}
uint16_t layout[NKEY] = {layout_type[0]layout_value[0], layout_type[1]layout_value[1], ...};
uint8_t *layout_type = (uint8_t *)kbmap;
uint8_t *layout_value = (uint8_t *)kbmap + 1;
...
for(int row=0; row<NROW; row++, index+=2)
if(layout_type[index] == interesting)
do_something_with(index_value[index])
What about the stabilizers?i guess i dont know what your asking about. I only have one key that needs stabilizers and that the spacebar I just picked some costar ones up from WASD.
fit the switches perfectly
They fit in... I have yet to test with an actual spacebar though. I can once i get home if you want.fit the switches perfectly
^^ What about the stabilizer(s) fitting? Costar have really tight tolerances.
Their a touch tight and provide too much friction. With the spacebar on conventionally it wouldnt return up if you hit it in the middle if you hit it elsewhere there was about a 70% chance you would get it to return. Now it you put the spacebar on backwards which is the way i prefer it it actually works like 90% on the time. I think I may put a stoner spring in the spacebar and lube up the stabilizers and their clips and se it that makes a difference.They fit in... I have yet to test with an actual spacebar though. I can once i get home if you want.fit the switches perfectly
^^ What about the stabilizer(s) fitting? Costar have really tight tolerances.
are you using 6.25x spacebar?yep
A) So far, no one as implemented the mx lock switch in the firmware, correct?I don't know about the Phantom firmware, but I know that Hasu did some kind of emulation of a locking Caps Lock in his ADB-to-USB protocol converter code. Because the mode is controlled by the USB host and not the keyboard and the controller can not make a switch lock or unlock, emulation was not perfect.
A) Locking switches shouldn't need any special routines. As long as they are pressed, they are.. pressed. Well actually it may be wise to assureI meant as in more advanced use, like toggling caps lock. Yes, I realize that there will be a problem when it is out of sync if one were to press caps lock on another keyboard for instance.
I tried the "Locking Caps Lock"(0x82) instead of Caps Lock(0x39) in Windows and it failed to handle the key.
I suppose the only solution is to send two packets for each change in state of the caps lock - one with the key down, and then one with the key up a millisecond or so later.
That appears to be how the Belkin adapter handles it.
Anyway, thanks for your answers, I won't have to check the traces of the LEDs now. Just to confirm before I start breaking stuff, does it look something like this?
http://i.imgur.com/TkuBo.png
It wouldn't be too hard to write function that checks top see if the caps lock switch is down, and if it is down it can make sure that capslock is always on. I wrote a similar function that would make it so that numlock is always on when my secondary function layer is active so that I can use the keypad without needing to worry about whether my numlock is on.
I could implement a caps lock for locking switches if anybody wants, but I wont bother if there is no demand.
jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJFJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJFJJJJJJJJJ
HHHHHHHHHSHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
HHHHHHHHHHHHHH
ÖGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGKGGGGGGGGGGGGGGGGGGGG
also anyone got an iso hex file?
Man I wish that I bought one of these :( missed out!I have 2 7bit Custom plates and 2 sets of keycaps that match my layout but no PCBs, sorry.
Man I wish that I bought one of these :( missed out!I have 2 7bit Custom plates and 2 sets of keycaps that match my layout but no PCBs, sorry.
I dont think there are any extra PCBs floating around I think that lootbag was selling his coimpleted Phantom in the classifieds though. Its a 7bit custom... if yo want ansi win yo ushould probably have to sink like an additional $50 in to get a new plate then desolder and resolder the thing, which wouldnt be the most cost effective. If your going that far you might want to consider getting like I got that allows a standard spacebar and an ansi win 1st row but you still can have a full number pad. A example of my layout after a plate change is below:Man I wish that I bought one of these :( missed out!I have 2 7bit Custom plates and 2 sets of keycaps that match my layout but no PCBs, sorry.
Ah that is a shame! Do you think that I stand much chance? Ideally after ANSI with Win key.
Ah that is a shame! Do you think that I stand much chance? Ideally after ANSI with Win key.
Totally forgot about that even though im building 3 of those.Ah that is a shame! Do you think that I stand much chance? Ideally after ANSI with Win key.
If all you are looking for is a standard layout ANSI w/ winkey then pick up a Filco TKL and get in on bpiphany's replacement controller.
also anyone got an iso hex file?
I have been reworking the firmware quite a bit. One change is that the mapping is located in a file of it's own. So there will be ISO ANSI ANSIWIN and ISOWIN files when I update the github repository. I can probably squeeze that in tonight after work, before I go to bed...
make phantom iso
At the moment you need to edit the Makefile to set the parameters according to what you need. And simply runmake
or rathermake clean; make
just to be sure there are no intermediate files from an earlier compile messing things up. Changing the microcontroller requires a clean for sure.notepad++ should work also right?
If I knew how to work with make I would like to have a syntax something likeCode: [Select]make phantom iso
At the moment you need to edit the Makefile to set the parameters according to what you need.
make phantom LAYOUT=iso
LAYOUT=iso make phantom
This won't override variable LAYOUT defined in Makefile.C:\AVR-Keyboard>make clean
Cleaning everything:
find . -maxdepth 1 -regextype posix-awk -regex \
"(.*\.hex|.*\.eep|.*\.cof|.*\.elf|.*\.map|.*\.sym|.*\.lss|.*\.o|
.*\.lst|.*\.s|.*\.d|.*\.i)" \
-exec rm {} +
find: invalid predicate `-regextype'
make: *** [clean] Error 1
When the file is opened, the filename and percentage usage of the Teensy's memory are shown.
Is anyone else using the ansi/iso hex having problems getting the # key to work on an ISO layout board? I can't figure out if it's a firware issue or I soldered a diode the wrong way around...I already tested the switch which is fine and the rest of the board works ok, but I get no response from the # key.i had that on one of my keys as well was a pain to swap
edit - Nevermind, its a duff diode >:D.
It wasn't that bad to be honest, I managed to cut the diode in half which made it a whole lot easier to desolder. Then all it took was a bit of wick and some patience, I was thinking I would have to desolder the whole board at one point though...thought the same myself but decided to just solder it on the back since there was enough clearance.
I just desoldered all the through-hole diodes from my Ergodox and then soldered SMD diodes back on. It took me maybe an hour to desolder all the diodes. I use a Edsyn Soldapullt Silverstat. It sucks good! Rarely I need to desolder a hole twice.I use the same desolder! its probably the best manual one you can get.
Plate mount Cherry stabilizers.
Usage: find [path...] [expression]
default path is the current directory; default expression is -print
expression may consist of:
operators (decreasing precedence; -and is implicit where no others are given):
( EXPR ) ! EXPR -not EXPR EXPR1 -a EXPR2 EXPR1 -and EXPR2
EXPR1 -o EXPR2 EXPR1 -or EXPR2 EXPR1 , EXPR2
options (always true): -daystart -depth -follow --help
-maxdepth LEVELS -mindepth LEVELS -mount -noleaf --version -xdev
tests (N can be +N or -N or N): -amin N -anewer FILE -atime N -cmin N
-cnewer FILE -ctime N -empty -false -fstype TYPE -gid N -group NAME
-ilname PATTERN -iname PATTERN -inum N -ipath PATTERN -iregex PATTERN
-links N -lname PATTERN -mmin N -mtime N -name PATTERN -newer FILE
-nouser -nogroup -path PATTERN -perm [+-]MODE -regex PATTERN
-size N[bckw] -true -type [bcdpfls] -uid N -used N -user NAME
-xtype [bcdpfls]
actions: -exec COMMAND ; -fprint FILE -fprint0 FILE -fprintf FILE FORMAT
-ok COMMAND ; -print -print0 -printf FORMAT -prune -ls
Just bumping this thread to say that I got hasu's TMK_Keyboard firmware working on for Phantoms, and the source is now available on hasu's git here (https://github.com/tmk/tmk_keyboard).
What this means is that you get programmable layers, media keys, mouse keys, and NKRO over usb.
It's in a text table with an extremely readable layout, the only difficulty is in knowing what macros to use for the keycode you want.
Here's a link to the phantom map file (https://github.com/tmk/tmk_keyboard/blob/master/keyboard/phantom/keymap.c).
I got it to work now, media keys and all. Pretty sweet firmware. FN layers as well too.
I will definitely be going with this one.
jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJFJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJFJJJJJJJJJ
I can't recreate these problems with this firmware, so I believe those were resolved as well.
I got it to work now, media keys and all. Pretty sweet firmware. FN layers as well too.Which project do you build to make the Phantom firmware? Is it ps2_usb? Can you post your Makefile, please?
I will definitely be going with this one.
$ cd tmk_keyboard/keyboard/phantom
$ make -f Makefile.pjrc
Flashed the resulting phantom_pjrc.hex and it worked! :-D
Buy a Creme Cheese 7x from Tsangan here: http://geekhack.org/index.php?topic=37894.0Thank you!
2. The extra stabilizer mount point is for some funky 7.00X spacebars that looks like that with non-symmetric stems. http://deskthority.net/wiki/Space_bar#7_units_.28133mm_wide.2C_3_mounts.2C_57mm_and_42.8mm_apart.29 Just like 6.25X spacebars with off-center switch stem are supported http://deskthority.net/wiki/Space_bar#6.25_units_.28118mm_wide.2C_3_mounts.2C_no_center_mount.29Wow.. I didn't realize space bars were so varied and complex! Thank you for the links. :)
does that mean any custom case for the Filco TKL will fit the phantom? For example the Vortex Aluminum case at mechnicalkeyboards, will that fit?nope because that requires the bent plate of a filco to work the plates made for the phantom are completely flat. Also i dont believe the MKC case fits either though i dont remember why.
Um, do you have to push the Teensy button to start the loader, or is there another way? I did push it before, and I'm writing this on my Phantom, but I can't load new firmware onto it because the Teensy application only tells me to "Press Button To Activate". :Ddo you have the driver for the ATMega32u4?
Any chance we can design a bent plate to add cases choice for the phantom?
Pretty sure I do, otherwise the keyboard wouldn't be working, or am I thinking crazy now?Um, do you have to push the Teensy button to start the loader, or is there another way? I did push it before, and I'm writing this on my Phantom, but I can't load new firmware onto it because the Teensy application only tells me to "Press Button To Activate". :Ddo you have the driver for the ATMega32u4?
OCR1B = 250; // Output compare register 1B
OCR1C = 250; // Output compare register 1C
To tell you the truth, I have no idea if the PWM LED brightness code is even working properly in this firmware...#MOUSEKEY_ENABLE = yes # Mouse keys
in your makefile. You will also need to place mousekeys-specific codes in your keymap.
diff --git a/keyboard/phantom/led.c b/keyboard/phantom/led.c
index 3523cb7..109004b 100644
--- a/keyboard/phantom/led.c
+++ b/keyboard/phantom/led.c
@@ -23,12 +23,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
void led_set(uint8_t usb_led)
{
if (!(usb_led & (1<<USB_LED_CAPS_LOCK)))
- PORTB &= ~(1<<6);
+ DDRB &= ~(1<<6);
else
- PORTB |= (1<<6);
+ DDRB |= (1<<6);
if (!(usb_led & (1<<USB_LED_SCROLL_LOCK)))
- PORTB &= ~(1<<7);
+ DDRB &= ~(1<<7);
else
- PORTB |= (1<<7);
+ DDRB |= (1<<7);
}
12. Insert Teensy with pins on to PCB. Push Teensy as far in as possible without forcing it, without bending the pins, and make sure Teensy circuit board is not touching Phantom PCB. While the legs are sticking though the Phantom PCB, cut the pins flush to the Phantom PCB. This must be done in this way so the pins don't interfere with switches at these locations: F3, F4, 4, 5.
13. Once the Teensy pins are cut flush to the Phantom PCB, solder the Teensy on to the PCB. Make sure the solder is not sticking out of the PCB when cooled. The solder joints must be flat. FLAT!
i want to see close up pictures of the teensy soldered in on both sides of the board
I had some pics posted elsewhere.
http://i.imgur.com/TeuTc.jpg
http://i.imgur.com/rX0wI.jpg
Edit: Here is a better pic of it. I had to modify it a bit as the solder spots where a tad bit too high in this pic: http://i.imgur.com/95MBNh.jpg
Make them not stick out from the PCB. Flat (flush) side cutters were a great help.
That last pic of damorgue's has 2 spots that are pretty much perfect... To the right of U1 and under the 1 of U1.
I agree. Better wording: I'd like to see pictures of the top and bottom of how the PCB should look after the teensy is soldered on.i want to see close up pictures of the teensy soldered in on both sides of the board
Reads as: 'Pictures of the teensy soldered to the top of the PCB and soldered to the bottom of the PCB' as far as my education takes me.
do yo uguys want me to build one of the extras that IO have around and take pics? i am how ever missing a plate...I agree. Better wording: I'd like to see pictures of the top and bottom of how the PCB should look after the teensy is soldered on.i want to see close up pictures of the teensy soldered in on both sides of the board
Reads as: 'Pictures of the teensy soldered to the top of the PCB and soldered to the bottom of the PCB' as far as my education takes me.
do yo uguys want me to build one of the extras that IO have around and take pics? i am how ever missing a plate...
thanks I build one of mine right away once i get a plate (which will probably be with the ones with my GB)do yo uguys want me to build one of the extras that IO have around and take pics? i am how ever missing a plate...
your pics seem to always be excellent and highly instructional :D
I should have taken pics of mine with the stupid spacers left on there. You know, to show you what NOT to do. The solder joints on top of the PCB looked AWESOME, but I don't think the PCB would have fit in the case with the Teensy so far from being flush with the board.
Then I could have taken photos of my shoddy desoldering job and the traces I wrecked after going to the Teensy legs with diagonal cutters. But that would just be cruel. I was frustrated that day.
However, I am now really well versed in exactly what NOT to do when assembling a Phantom. Sometimes you just gotta learn the hard way. That was kind of an expensive way to learn something, though. Luckily, bavman was willing to do the R2 GB after we got permission.
I don't know about PWM and phantom hardware very much, though this patch may cure your LED problem.Thank you very much, it worked! :)
Where can I find phantom schematic?
The only thing the small 90degree bend at the front and back does it make it compatible with vortex case. No other case requires this bend. Having two bends like this for each case might add significant costs.
Can anyone confirm that with the right plate built, is it possible to have a 1.5/1/1.5/6/1.5/1/1/1.5 bottom row?bpiphany confirmed that once i dont know in which thread exactly though
Can anyone confirm that with the right plate built, is it possible to have a 1.5/1/1.5/6/1.5/1/1/1.5 bottom row?Yes. I have modified a PHISO plate to have this layout for the bottom row. There are positions on the circuit board for the right Alt and Windows keys. The position of the space bar switch is the same for 7-unit and 6-unit space bars, as long as you use a space bar from a winkeyful Cherry G80-1800, G80-11800 or G80-11900.
/*
Copyright 2011 Jun Wako <wakojun@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*
* Keymap for Phantom controller
*/
#include <stdint.h>
#include <stdbool.h>
#include <avr/pgmspace.h>
#include "keycode.h"
#include "print.h"
#include "debug.h"
#include "util.h"
#include "keymap.h"
// Convert physical keyboard layout to matrix array.
// This is a macro to define keymap easily in keyboard layout form.
#define KEYMAP( \
K5A, K5C, K5D, K5E, K5F, K5G, K5H, K5I, K5J, K5K, K5L, K5M, K5N, K5O, K5P, K5Q, \
K5B, K4A, K4B, K4C, K4D, K4E, K4F, K4G, K4H, K4I, K4J, K4K, K4L, K4N, K4O, K4P, K4Q, \
K3A, K3B, K3C, K3D, K3E, K3F, K3G, K3H, K3I, K3J, K3K, K3L, K3M, K3N, K3O, K3P, K3Q, \
K2A, K2B, K2C, K2D, K2E, K2F, K2G, K2H, K2I, K2J, K2K, K2L, K2N, K2O, K2P, K2Q, \
K1A, K1C, K1D, K1E, K1F, K1G, K1H, K1I, K1J, K1K, K1L, K1N, K1O, K1P, K1Q, \
K0A, K0B, K0C, K0H, K0K, K0L, K0M, K0N, K0O, K0P, K0Q \
) { \
/* A B C D E F G H I J K L M N O P Q */ \
/* 0 */ { KC_##K0A, KC_##K0B, KC_##K0C, KC_NO , KC_NO , KC_NO , KC_NO , KC_##K0H, KC_NO , KC_NO , KC_##K0K, KC_##K0L, KC_##K0M, KC_##K0N, KC_##K0O, KC_##K0P, KC_##K0Q}, \
/* 1 */ { KC_##K1A, KC_NO , KC_##K1C, KC_##K1D, KC_##K1E, KC_##K1F, KC_##K1G, KC_##K1H, KC_##K1I, KC_##K1J, KC_##K1K, KC_##K1L, KC_NO , KC_##K1N, KC_##K1O, KC_##K1P, KC_##K1Q}, \
/* 2 */ { KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D, KC_##K2E, KC_##K2F, KC_##K2G, KC_##K2H, KC_##K2I, KC_##K2J, KC_##K2K, KC_##K2L, KC_NO , KC_##K2N, KC_##K2O, KC_##K2P, KC_##K2Q}, \
/* 3 */ { KC_##K3A, KC_##K3B, KC_##K3C, KC_##K3D, KC_##K3E, KC_##K3F, KC_##K3G, KC_##K3H, KC_##K3I, KC_##K3J, KC_##K3K, KC_##K3L, KC_##K3M, KC_##K3N, KC_##K3O, KC_##K3P, KC_##K3Q}, \
/* 4 */ { KC_##K4A, KC_##K4B, KC_##K4C, KC_##K4D, KC_##K4E, KC_##K4F, KC_##K4G, KC_##K4H, KC_##K4I, KC_##K4J, KC_##K4K, KC_##K4L, KC_NO , KC_##K4N, KC_##K4O, KC_##K4P, KC_##K4Q}, \
/* 5 */ { KC_##K5A, KC_##K5B, KC_##K5C, KC_##K5D, KC_##K5E, KC_##K5F, KC_##K5G, KC_##K5H, KC_##K5I, KC_##K5J, KC_##K5K, KC_##K5L, KC_##K5M, KC_##K5N, KC_##K5O, KC_##K5P, KC_##K5Q}, \
}
#define KEYCODE(layer, row, col) (pgm_read_byte(&keymaps[(layer)][(row)][(col)]))
// Assign Fn key(0-7) to a layer to which switch with the Fn key pressed.
static const uint8_t PROGMEM fn_layer[] = {
0, // Fn0
1, // Fn1
2, // Fn2
3, // Fn3
4, // Fn4
5, // Fn5
6, // Fn6
7 // Fn7
};
// Assign Fn key(0-7) to a keycode sent when release Fn key without use of the layer.
// See layer.c for details.
static const uint8_t PROGMEM fn_keycode[] = {
KC_NO, // Fn0
KC_NO, // Fn1
KC_NO, // Fn2
KC_NO, // Fn3
KC_NO, // Fn4
KC_NO, // Fn5
KC_NO, // Fn6
KC_NO // Fn7
};
/*
* Phantom keyboard layout with winkeys and 7bit style editing block. I am
* Not in the mood to implement full 7-bit keymap.
*
*
* ,---. ,---------------. ,---------------. ,---------------. ,-----------.
* |Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau|
* `---' `---------------' `---------------' `---------------' `-----------'
* ,-----------------------------------------------------------. ,-----------.
* |~ | 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp | |Ins|Hom|PgU|
* |-----------------------------------------------------------| |-----------|
* |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |Del|End|PgD|
* |-----------------------------------------------------------| |---|---|---|
* |Caps | A| S| D| F| G| H| J| K| L| ;| '|Return | |???|???|???|
* |-----------------------------------------------------------| |---|---|---|
* |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | |???|Up |???|
* |-----------------------------------------------------------| |-----------|
* |Ctl|Gui|Alt| Space |Alt|Gui|App|Ctl| |Lef|Dow|Rig|
* `-----------------------------------------------------------' `-----------'
*/
static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Layer 0: Default Layer
*
* ANSI:
*
* ,---. ,---------------. ,---------------. ,---------------. ,-----------.
* |Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|Nlk|Mac|
* `---' `---------------' `---------------' `---------------' `-----------'
* ,-----------------------------------------------------------. ,-----------.
* |~ | 1| 2| 3| 4| 5| 6| 7| 8| 9| -| =|V+ |Backsp | |Cap|Hom|PgU|
* |-----------------------------------------------------------| |-----------|
* |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |Del|End|PgD|
* |-----------------------------------------------------------| |-----------|
* |Btn1 | A| S| D| F| G| H| J| K| L| ;| '|Return | |Bt2|Mut|VlU|
* |-----------------------------------------------------------| |-----------|
* |Shft | Z| X| C| V| B| N| M| ,| .| /|Caps | |Bt3|Up |VlD|
* |-----------------------------------------------------------| |-----------|
* |Ctl|Gui|Alt| Space |???|Alt|App|Ctl| |Lef|Dow|Rig|
* `-----------------------------------------------------------' `-----------'
*/
KEYMAP(\
ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR, SLCK, MACRO( MD(LALT), D(F4), END ), \
GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS, EQL, BSPC, CAPS, HOME, PGUP, \
TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC, RBRC, BSLS, DEL, END, PGDN, \
BTN1, A, S, D, F, G, H, J, K, L, SCLN, QUOT, ENT, BTN2, MUTE, VOLUP, \
LSFT, Z, X, C, V, B, N, M, COMM, DOT, SLSH, CAPS, BTN3, UP, VOLDOWN, \
LCTL, LGUI, LALT, SPC, 0, RALT, APP, RCTL, LEFT, DOWN, RGHT),
/* Layer 1: Numlock mode (Numlock)
* ,---. ,---------------. ,---------------. ,---------------. ,-----------.
* |Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|Nlk|Mac|
* `---' `---------------' `---------------' `---------------' `-----------'
* ,-----------------------------------------------------------. ,-----------.
* |~ | 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp | | /| *| -|
* |-----------------------------------------------------------| |-----------|
* |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |P_7|P_8|P_9|
* |-----------------------------------------------------------| |---|---|---|
* |Btn1 | A| S| D| F| G| H| J| K| L| ;| '|Return | |P_4|P_5|P_6|
* |-----------------------------------------------------------| |---|---|---|
* |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | |P_1|P_2|P_3|
* |-----------------------------------------------------------| |-----------|
* |Ctl|Gui|Alt| Space |???|Alt|App|Ctl| |P_0|Pdt|Pls|
* `-----------------------------------------------------------' `-----------'
*/
KEYMAP(\
ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR, NLCK, MACRO( MD(LALT), D(F4), END ), \
GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS, EQL, BSPC, PSLS, PAST, PMNS, \
TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC, RBRC, BSLS, P7, P8, P9, \
BTN1, A, S, D, F, G, H, J, K, L, SCLN, QUOT, ENT, P4, P5, P6, \
LSFT, Z, X, C, V, B, N, M, COMM, DOT, SLSH, RSFT, P1, P2, P3, \
LCTL, LGUI, LALT, SPC, 0, RALT, APP, RCTL, P0, PDOT, PPLS),
};
static const unit16_t PROGMEM fn_actions[] = {
ACTION_LAYER_DEFAULT, // FN0
ACTION_LAYER_SET_TOGGLE(1) // NLCK
};
uint8_t keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t col)
{
return KEYCODE(layer, row, col);
}
uint8_t keymap_fn_layer(uint8_t index)
{
return pgm_read_byte(&fn_layer[index]);
}
uint8_t keymap_fn_keycode(uint8_t index)
{
return pgm_read_byte(&fn_keycode[index]);
}
*
Copyright 2012 Jun Wako <wakojun@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <avr/io.h>
#include "stdint.h"
#include "led.h"
void led_set(uint8_t usb_led)
{
if (!(usb_led & (1<<USB_LED_CAPS_LOCK)))
DDRB &= ~(1<<6);
else
DDRB |= (1<<6);
if (!(usb_led & (1<<USB_LED_NUM_LOCK)))
DDRB &= ~(1<<7);
else
DDRB |= (1<<7);
}
/*
Copyright 2011 Jun Wako <wakojun@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*
* Keymap for Phantom controller
*/
#include <stdint.h>
#include <stdbool.h>
#include <avr/pgmspace.h>
#include "keycode.h"
#include "action.h"
#include "action_macro.h"
#include "print.h"
#include "debug.h"
#include "util.h"
#include "keymap.h"
// Convert physical keyboard layout to matrix array.
// This is a macro to define keymap easily in keyboard layout form.
#define KEYMAP( \
K5A, K5C, K5D, K5E, K5F, K5G, K5H, K5I, K5J, K5K, K5L, K5M, K5N, K5O, K5P, K5Q, \
K5B, K4A, K4B, K4C, K4D, K4E, K4F, K4G, K4H, K4I, K4J, K4K, K4L, K4N, K4O, K4P, K4Q, \
K3A, K3B, K3C, K3D, K3E, K3F, K3G, K3H, K3I, K3J, K3K, K3L, K3M, K3N, K3O, K3P, K3Q, \
K2A, K2B, K2C, K2D, K2E, K2F, K2G, K2H, K2I, K2J, K2K, K2L, K2N, K2O, K2P, K2Q, \
K1A, K1C, K1D, K1E, K1F, K1G, K1H, K1I, K1J, K1K, K1L, K1N, K1O, K1P, K1Q, \
K0A, K0B, K0C, K0H, K0K, K0L, K0M, K0N, K0O, K0P, K0Q \
) { \
/* A B C D E F G H I J K L M N O P Q */ \
/* 0 */ { KC_##K0A, KC_##K0B, KC_##K0C, KC_NO , KC_NO , KC_NO , KC_NO , KC_##K0H, KC_NO , KC_NO , KC_##K0K, KC_##K0L, KC_##K0M, KC_##K0N, KC_##K0O, KC_##K0P, KC_##K0Q}, \
/* 1 */ { KC_##K1A, KC_NO , KC_##K1C, KC_##K1D, KC_##K1E, KC_##K1F, KC_##K1G, KC_##K1H, KC_##K1I, KC_##K1J, KC_##K1K, KC_##K1L, KC_NO , KC_##K1N, KC_##K1O, KC_##K1P, KC_##K1Q}, \
/* 2 */ { KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D, KC_##K2E, KC_##K2F, KC_##K2G, KC_##K2H, KC_##K2I, KC_##K2J, KC_##K2K, KC_##K2L, KC_NO , KC_##K2N, KC_##K2O, KC_##K2P, KC_##K2Q}, \
/* 3 */ { KC_##K3A, KC_##K3B, KC_##K3C, KC_##K3D, KC_##K3E, KC_##K3F, KC_##K3G, KC_##K3H, KC_##K3I, KC_##K3J, KC_##K3K, KC_##K3L, KC_##K3M, KC_##K3N, KC_##K3O, KC_##K3P, KC_##K3Q}, \
/* 4 */ { KC_##K4A, KC_##K4B, KC_##K4C, KC_##K4D, KC_##K4E, KC_##K4F, KC_##K4G, KC_##K4H, KC_##K4I, KC_##K4J, KC_##K4K, KC_##K4L, KC_NO , KC_##K4N, KC_##K4O, KC_##K4P, KC_##K4Q}, \
/* 5 */ { KC_##K5A, KC_##K5B, KC_##K5C, KC_##K5D, KC_##K5E, KC_##K5F, KC_##K5G, KC_##K5H, KC_##K5I, KC_##K5J, KC_##K5K, KC_##K5L, KC_##K5M, KC_##K5N, KC_##K5O, KC_##K5P, KC_##K5Q}, \
}
static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Layer 0: Default Layer
*
* ANSI:
*
* ,---. ,---------------. ,---------------. ,---------------. ,-----------.
* |Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|Nlk|Mac|
* `---' `---------------' `---------------' `---------------' `-----------'
* ,-----------------------------------------------------------. ,-----------.
* |~ | 1| 2| 3| 4| 5| 6| 7| 8| 9| -| =|V+ |Backsp | |Cap|Hom|PgU|
* |-----------------------------------------------------------| |-----------|
* |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |Del|End|PgD|
* |-----------------------------------------------------------| |-----------|
* |Btn1 | A| S| D| F| G| H| J| K| L| ;| '|Return | |Bt2|Mut|VlU|
* |-----------------------------------------------------------| |-----------|
* |Shft | Z| X| C| V| B| N| M| ,| .| /|Caps | |Bt3|Up |VlD|
* |-----------------------------------------------------------| |-----------|
* |Ctl|Gui|Alt| Space |???|Alt|App|Ctl| |Lef|Dow|Rig|
* `-----------------------------------------------------------' `-----------'
*/
KEYMAP(\
ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR, FN1, FN2, \
GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0,MINS, EQL,BSPC, CAPS,HOME,PGUP, \
TAB, Q, W, E, R, T, Y, U, I, O, P,LBRC,RBRC,BSLS, DEL, END,PGDN, \
BTN1, A, S, D, F, G, H, J, K, L,SCLN,QUOT, ENT, BTN2,MUTE,VOLU, \
LSFT, Z, X, C, V, B, N, M,COMM, DOT,SLSH, CAPS, BTN3, UP,VOLD, \
LCTL,LGUI,LALT, SPC, NO,RALT, APP,RCTL, LEFT,DOWN,RGHT),
/* Layer 1: Numlock mode (Numlock)
* ,---. ,---------------. ,---------------. ,---------------. ,-----------.
* |Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|Nlk|Mac|
* `---' `---------------' `---------------' `---------------' `-----------'
* ,-----------------------------------------------------------. ,-----------.
* |~ | 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp | | /| *| -|
* |-----------------------------------------------------------| |-----------|
* |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |P_7|P_8|P_9|
* |-----------------------------------------------------------| |---|---|---|
* |Btn1 | A| S| D| F| G| H| J| K| L| ;| '|Return | |P_4|P_5|P_6|
* |-----------------------------------------------------------| |---|---|---|
* |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | |P_1|P_2|P_3|
* |-----------------------------------------------------------| |-----------|
* |Ctl|Gui|Alt| Space |???|Alt|App|Ctl| |P_0|Pdt|Pls|
* `-----------------------------------------------------------' `-----------'
*/
KEYMAP(\
ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR, FN0, FN2, \
GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0,MINS, EQL,BSPC, PSLS,PAST,PMNS, \
TAB, Q, W, E, R, T, Y, U, I, O, P,LBRC,RBRC,BSLS, P7, P8, P9, \
BTN1, A, S, D, F, G, H, J, K, L,SCLN,QUOT, ENT, P4, P5, P6, \
LSFT, Z, X, C, V, B, N, M,COMM, DOT,SLSH, RSFT, P1, P2, P3, \
LCTL,LGUI,LALT, SPC, NO,RALT, APP,RCTL, P0,PDOT,PPLS),
};
/* id for user defined functions */
enum function_id {
MACRO = 0xff
};
static const uint16_t PROGMEM fn_actions[] = {
ACTION_LAYER_DEFAULT, // FN0
ACTION_LAYER_SET_TOGGLE(1), // FN1 NLCK
ACTION_FUNCTION(MACRO, 0), // FN2
};
/*
* Macro definition
*/
#define MACRO(...) ({ static prog_macro_t _m[] PROGMEM = { __VA_ARGS__ }; _m; })
#define MACRO_NONE 0
static const prog_macro_t *get_macro(uint8_t id, bool pressed)
{
switch (id) {
case 0:
return (pressed ?
MACRO( MD(LALT), D(F4), END ) :
MACRO( U(F4), MU(LALT), END ) );
}
return MACRO_NONE;
}
/*
* user defined action function
*/
void keymap_call_function(keyrecord_t *record, uint8_t id, uint8_t opt)
{
keyevent_t event = record->event;
uint8_t tap_count = record->tap_count;
debug("action_call_function: ");
if (event.pressed) debug("pressed"); else debug("released");
debug(" id: "); debug_hex(id);
debug(" tap_count: "); debug_dec(tap_count);
debug("\n");
switch (id) {
case MACRO:
action_macro_play(get_macro(opt, event.pressed));
break;
}
}
/* translates key to keycode */
uint8_t keymap_key_to_keycode(uint8_t layer, key_t key)
{
return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]);
}
/* translates Fn index to action */
action_t keymap_fn_to_action(uint8_t keycode)
{
action_t action;
if (FN_INDEX(keycode) < sizeof(fn_actions) / sizeof(fn_actions[0])) {
action.code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]);
} else {
action.code = ACTION_NO;
}
return action;
}
/* convert key to action */
action_t action_for_key(uint8_t layer, key_t key)
{
uint8_t keycode = keymap_key_to_keycode(layer, key);
switch (keycode) {
case KC_FN0 ... KC_FN31:
return keymap_fn_to_action(keycode);
default:
return keymap_keycode_to_action(keycode);
}
}
Yes that would be pretty cool! I think I just need the measurements or the location of the bottom right cluster, even just their location in relation to the alpha keys would do ;DSorry for the late reply, but I have been in a mess the past few days. Actually, my old modified file wasn't clean enough, so I had to redo it. I assumed you wanted ANSI.
Yes that would be pretty cool! I think I just need the measurements or the location of the bottom right cluster, even just their location in relation to the alpha keys would do ;DSorry for the late reply, but I have been in a mess the past few days. Actually, my old modified file wasn't clean enough, so I had to redo it. I assumed you wanted ANSI.
The right Alt is under . and the keys to the right of it are aligned with [ ] and \ .
diff --git a/common/keyboard.c b/common/keyboard.c
index e4bc3dc..432ea89 100644
--- a/common/keyboard.c
+++ b/common/keyboard.c
@@ -86,7 +86,7 @@ void keyboard_task(void)
if (matrix_change & ((matrix_row_t)1<<c)) {
action_exec((keyevent_t){
.key = (key_t){ .row = r, .col = c },
- .pressed = (matrix_row & (1<<c)),
+ .pressed = (matrix_row & ((matrix_row_t)1<<c)),
.time = (timer_read() | 1) /* time should not be 0 */
});
// record a processed key
However, I want to change it and have a few questions. First off based off reading a couple of the previous posts it sounds like I can't put media keys on the top layer. I was hoping to put media keys in the insert cluster where insert and such are. Am I reading this right? As hasu mentioned, that should be no problem.
I finally figured out how to get to the keymap.c file and pulled it up in the winavr programmers notepad. So if I want to change the layout all I have to is change what it says for the key on the layout and then in the matrix right below the layout correct? The only place that counts is in the matrix, the comment block is just for reference.
Also what should I put for no key in the layout and in the matrix below? NO (literally that)
What I want to do with that is move the "F" keys to the number keys as a function layer because I will be physically removing the switches from the board.
So this leads into my next question. How do I specify the bottom key map to be my function layer and I would assume that any keys that are not changed in the Function layer would remain the same. In the layout and the matrix lines would i just put FN in for the function key? As long as the fn_layer array is unchanged you use FN1 to get to layer 1. Also place FN1 in the same location in both layers. The new layer assignments are as listed, if you only want a few things to change, duplicate layer 0 to layer 1 then make your changes.
I am wanting to do the function as a momentary only and not a toggle. That is how it works.
Copyright 2011 Jun Wako <wakojun@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*
* Keymap for Phantom controller
*/
#include <stdint.h>
#include <stdbool.h>
#include <avr/pgmspace.h>
#include "keycode.h"
#include "print.h"
#include "debug.h"
#include "util.h"
#include "keymap.h"
// Convert physical keyboard layout to matrix array.
// This is a macro to define keymap easily in keyboard layout form.
#define KEYMAP( \
K5A, K5C, K5D, K5E, K5F, K5G, K5H, K5I, K5J, K5K, K5L, K5M, K5N, K5O, K5P, K5Q, \
K5B, K4A, K4B, K4C, K4D, K4E, K4F, K4G, K4H, K4I, K4J, K4K, K4L, K4N, K4O, K4P, K4Q, \
K3A, K3B, K3C, K3D, K3E, K3F, K3G, K3H, K3I, K3J, K3K, K3L, K3M, K3N, K3O, K3P, K3Q, \
K2A, K2B, K2C, K2D, K2E, K2F, K2G, K2H, K2I, K2J, K2K, K2L, K2N, K2O, K2P, K2Q, \
K1A, K1C, K1D, K1E, K1F, K1G, K1H, K1I, K1J, K1K, K1L, K1N, K1O, K1P, K1Q, \
K0A, K0B, K0C, K0H, K0K, K0L, K0M, K0N, K0O, K0P, K0Q \
) { \
/* A B C D E F G H I J K L M N O P Q */ \
/* 0 */ { KC_##K0A, KC_##K0B, KC_##K0C, KC_NO , KC_NO , KC_NO , KC_NO , KC_##K0H, KC_NO , KC_NO , KC_##K0K, KC_##K0L, KC_##K0M, KC_##K0N, KC_##K0O, KC_##K0P, KC_##K0Q}, \
/* 1 */ { KC_##K1A, KC_NO , KC_##K1C, KC_##K1D, KC_##K1E, KC_##K1F, KC_##K1G, KC_##K1H, KC_##K1I, KC_##K1J, KC_##K1K, KC_##K1L, KC_NO , KC_##K1N, KC_##K1O, KC_##K1P, KC_##K1Q}, \
/* 2 */ { KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D, KC_##K2E, KC_##K2F, KC_##K2G, KC_##K2H, KC_##K2I, KC_##K2J, KC_##K2K, KC_##K2L, KC_NO , KC_##K2N, KC_##K2O, KC_##K2P, KC_##K2Q}, \
/* 3 */ { KC_##K3A, KC_##K3B, KC_##K3C, KC_##K3D, KC_##K3E, KC_##K3F, KC_##K3G, KC_##K3H, KC_##K3I, KC_##K3J, KC_##K3K, KC_##K3L, KC_##K3M, KC_##K3N, KC_##K3O, KC_##K3P, KC_##K3Q}, \
/* 4 */ { KC_##K4A, KC_##K4B, KC_##K4C, KC_##K4D, KC_##K4E, KC_##K4F, KC_##K4G, KC_##K4H, KC_##K4I, KC_##K4J, KC_##K4K, KC_##K4L, KC_NO , KC_##K4N, KC_##K4O, KC_##K4P, KC_##K4Q}, \
/* 5 */ { KC_##K5A, KC_##K5B, KC_##K5C, KC_##K5D, KC_##K5E, KC_##K5F, KC_##K5G, KC_##K5H, KC_##K5I, KC_##K5J, KC_##K5K, KC_##K5L, KC_##K5M, KC_##K5N, KC_##K5O, KC_##K5P, KC_##K5Q}, \
}
#define KEYCODE(layer, row, col) (pgm_read_byte(&keymaps[(layer)][(row)][(col)]))
// Assign Fn key(0-7) to a layer to which switch with the Fn key pressed.
static const uint8_t PROGMEM fn_layer[] = {
0, // Fn0
1, // Fn1
2, // Fn2
3, // Fn3
4, // Fn4
5, // Fn5
6, // Fn6
7 // Fn7
};
// Assign Fn key(0-7) to a keycode sent when release Fn key without use of the layer.
// See layer.c for details.
static const uint8_t PROGMEM fn_keycode[] = {
KC_NO, // Fn0
KC_NO, // Fn1
KC_NO, // Fn2
KC_NO, // Fn3
KC_NO, // Fn4
KC_NO, // Fn5
KC_NO, // Fn6
KC_NO // Fn7
};
/*
* Phantom keyboard layout with winkeys and 7bit style editing block. I am
* Not in the mood to implement full 7-bit keymap.
*
*
* ,---. ,---------------. ,---------------. ,---------------. ,-----------.
* |Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau|
* `---' `---------------' `---------------' `---------------' `-----------'
* ,-----------------------------------------------------------. ,-----------.
* |~ | 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp | |Ins|Hom|PgU|
* |-----------------------------------------------------------| |-----------|
* |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |Del|End|PgD|
* |-----------------------------------------------------------| |---|---|---|
* |Caps | A| S| D| F| G| H| J| K| L| ;| '|Return | |???|???|???|
* |-----------------------------------------------------------| |---|---|---|
* |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | |???|Up |???|
* |-----------------------------------------------------------| |-----------|
* |Ctl|Gui|Alt| Space |Alt|Gui|App|Ctl| |Lef|Dow|Rig|
* `-----------------------------------------------------------' `-----------'
*/
static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Layer 0: Default Layer
*
* ANSI:
*
* ,---. ,---------------. ,---------------. ,---------------. ,-----------.
* |Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau|
* `---' `---------------' `---------------' `---------------' `-----------'
* ,-----------------------------------------------------------. ,-----------.
* |~ | 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp | |Ins|Hom|PgU|
* |-----------------------------------------------------------| |-----------|
* |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |Del|End|PgD|
* |-----------------------------------------------------------| |---|---|---|
* |Caps | A| S| D| F| G| H| J| K| L| ;| '|Return | |???|???|???|
* |-----------------------------------------------------------| |---|---|---|
* |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | |???|Up |???|
* |-----------------------------------------------------------| |-----------|
* |Ctl|Gui|Alt| Space |Alt|Gui|App|Ctl| |Lef|Dow|Rig|
* `-----------------------------------------------------------' `-----------'
*/
KEYMAP(\
ESC, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, \
GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS, EQL, BSPC, INS, HOME, PGUP, \
TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC, RBRC, BSLS, DEL, END, PGDN, \
FN1, A, S, D, F, G, H, J, K, L, SCLN, QUOT, ENT, 0, 0, 0, \
LSFT, Z, X, C, V, B, N, M, COMM, DOT, SLSH, RSFT, 0, UP, 0, \
LCTL, LGUI, LALT, SPC, RALT, RGUI, APP, RCTL, LEFT, DOWN, RGHT),
/* Layer 1: Function Layer
*
* ,---. ,---------------. ,---------------. ,---------------. ,-----------.
* |Esc| | | | | | | | | | | | | | | | | | | |
* `---' `---------------' `---------------' `---------------' `-----------'
* ,-----------------------------------------------------------. ,-----------.
* |~ | F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Backsp | |V- |Mut|V+ |
* |-----------------------------------------------------------| |-----------|
* |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |Prv|Ply|Nxt|
* |-----------------------------------------------------------| |-----------|
* |FN1 | A| S| D| F| G| H| J| K| L| ;| '|Return | |???|???|???|
* |-----------------------------------------------------------| |-----------|
* |Shft | Z| X|Clc| V| B| N| M| ,| .| /|Caps | |???|Up |???|
* |-----------------------------------------------------------| |-----------|
* |Ctl|Gui|Alt| Space |Alt|Gui|App|Ctl| |Lef|Dow|Rig|
* `-----------------------------------------------------------' `-----------'
*/
KEYMAP(\
ESC, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, \
GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F10, F11, F12, VOLD, MUTE, VOLU, \
TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC, RBRC, BSLS, MPRV, MPLY, MNXT, \
FN1, A, S, D, F, G, H, J, K, L, SCLN, QUOT, ENT, 0, 0, 0, \
LSFT, Z, X,CALC, V, B, N, M, COMM, DOT, SLSH, CAPS, 0, PSCR, 0, \
LCTL, LGUI, LALT, SPC, RALT, RGUI, APP, RCTL, LEFT, DOWN, RGHT),
};
uint8_t keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t col)
{
return KEYCODE(layer, row, col);
}
uint8_t keymap_fn_layer(uint8_t index)
{
return pgm_read_byte(&fn_layer[index]);
}
uint8_t keymap_fn_keycode(uint8_t index)
{
return pgm_read_byte(&fn_keycode[index]);
}
Not sure this is the right place but I don't see where to ask for help,
So I received my Phantom PCB with diodes,
I soldered all the diodes and checked them with a multimeter -> all good, no diodes shorted and all of them are soldered correctly, - pin on the square pad.
I soldered the teensy and uploaded the ANSI win firmware from bpphany -> seems all right
Problem is I have non working keys.
I didn't solder any switch so I plugged the board and checked voltage for each switch and some of them are showing 0V (confirmed by a writing test in a notepad)
I have very few electronics knowledge so I might be missing something obvious or I might be testing things wrong so here is my question:
If you come accross a faulty switch what are the steps you use to try and fix it.
Ok so I tried aquakey and here is the resultShow Image(https://dl.dropboxusercontent.com/u/63153503/aquakey.png)
the right alt is now working (I forgot to solder the diode)
I resolder every diode on the faulty keys and same result.
I also reloaded the firmware and tried both win and winkeyless.
Problem is still here.
So now I guess it has something to do with the teensy.
Can the faulty keys pattern be linked to a specific teensy leg?
I can help you with that man. :D
I just posted my teensy in another thread so it reminded me to mention it here too since I know people are starting to get PCBs and plates:How do you achieve those flat solder joints? Mine always bulb up even if the through-hole pins don't stick out the hole.
When you build yours, solder the teensy as flush as you can to the PCB. Mine is touching the PCB, with only 1 layer of electrical tape between the PCB and teensy to insulate them. You'd want it as flush as possible because this could help clearance with future case designs. Also, the solder joint on the other side should be as flush as possible. If they stick up like typical solder joints, then switches won't be flush. Mine are literally flat.
(Attachment Link) (Attachment Link) (Attachment Link)
Also, after reading, it is possible to reprogram the teensy without pushing the button right?
These two hex files are from the original source code from prins. They work.
(Attachment Link)
(Attachment Link)
This one is from a recent github source. For PHANSI.
(Attachment Link)
For absolute coding noobs (me in this case), is there a GUI programmer that supports layers and macros (say I want of the 1x bottom row keys to be copy, and the other be paste)? I don't think that alaricljs supported layers or macros
Also, after reading, it is possible to reprogram the teensy without pushing the button right?
Has there been any major changes to the firmware lately? I haven't been following it, and am just wondering if multi-stroke key presses or any sort of macro functionality has been implemented? Did any of the other firmwares than Hasu's ever get of the ground?
and MX lock?
That is the way I am currently running it. Shift doesn't do the same as caps lock though, and doesn't work even slightly for the other locks. I am taking this as still no.
Does anyone know what happened to the other firmwares?
I don't know about PWM and phantom hardware very much, though this patch may cure your LED problem.
Where can I find phantom schematic?Code: [Select]diff --git a/keyboard/phantom/led.c b/keyboard/phantom/led.c
index 3523cb7..109004b 100644
--- a/keyboard/phantom/led.c
+++ b/keyboard/phantom/led.c
@@ -23,12 +23,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
void led_set(uint8_t usb_led)
{
if (!(usb_led & (1<<USB_LED_CAPS_LOCK)))
- PORTB &= ~(1<<6);
+ DDRB &= ~(1<<6);
else
- PORTB |= (1<<6);
+ DDRB |= (1<<6);
if (!(usb_led & (1<<USB_LED_SCROLL_LOCK)))
- PORTB &= ~(1<<7);
+ DDRB &= ~(1<<7);
else
- PORTB |= (1<<7);
+ DDRB |= (1<<7);
}
#include <avr/io.h>
#include "led.h"
void led_set(uint8_t usb_led)
{
if (usb_led & (1<<USB_LED_CAPS_LOCK))
{
// Output high.
DDRB |= (1<<6);
PORTB |= (1<<6);
}
else
{
// Output low.
DDRB &= ~(1<<6);
PORTB &= ~(1<<6);
}
if (usb_led & (1<<USB_LED_SCROLL_LOCK))
{
// Output high.
DDRB &= ~(1<<7);
PORTB |= (1<<7);
}
else
{
// Output low.
DDRB &= ~(1<<7);
PORTB &= ~(1<<7);
}
}
Was this ever applied? The code is currently as quoted below and it causes the scroll lock to be very dim.
Replacing PORTB with DDRB works for me to fix it. I don't know or care why it works when I do so, but there is something fishy going on there.
#include <avr/io.h>
#include "led.h"
void led_set(uint8_t usb_led)
{
if (usb_led & (1<<USB_LED_CAPS_LOCK))
{
// Output high.
DDRB |= (1<<6);
PORTB |= (1<<6);
}
else
{
// Output low.
DDRB &= ~(1<<6);
PORTB &= ~(1<<6);
}
if (usb_led & (1<<USB_LED_SCROLL_LOCK))
{
// Output high.
DDRB |= (1<<7);
PORTB |= (1<<7);
}
else
{
// Output low.
DDRB &= ~(1<<7);
PORTB &= ~(1<<7);
}
}
Works fine with Linux though, but Windows is my main driver.
Also got another problem: it seems some keys are not working, most of them in the first row I think.
ESC, Tab, Caps, Shift, and Ctrl. Tilde works though. Black band of diode to the square. Also tested the solder joints of the diodes with Multimeter Diode Check from the backside and everything seemed fine :(
I'm using ISO Layout. If I select HID Keyboard driver manually it shows a different error "device could not boot" or sth like that.
Where can I measure to find out why the keys are not working?
Firmware was built using: make -f Makefile.pjrc iso
Just debugged the keyboard matrix, it seems the whole column0 is not working, which for iso seems: Esc, 1, Tab, Caps, LShift, LCtrl
Solder joint looks fine to me, but I'll address this after my vacation. I'll be back in 4 months, thanks for your help!
could someone post a quick diagram on how to hard wire a phantom board to a teensy without the standard pcb so that the columns and rows line up with their respective pins on the teensy? I have an idea for mine that won't allow the use of the pcb. Also any suggestions where i could get a new teensy controller?
First one I built from this round 2 batch. It's pretty long, but there is a detailed index in the video description to jump around:
There are instructions on DT, but these are the key differences that I do:
- solder diodes on the opposite side of the switches, so they're facing down. This is so you can easily replace them if any happens rather than desoldering the whole board
- solder the top side of one of the two legs so it holds diode in place, clip excess leads, then solder the bottom two legs. This holds them in place, so you don't have bent leads when soldering
- make the teensy as flush as possible, as described here (http://geekhack.org/index.php?topic=26742.msg903513#msg903513), so it can be compatible with current and future cases.
I'm going to watch this tomorrow but just seeing all those different switches :o !!
Do I need to use linux to compile a custom layout firmware or is there an easier way under Windows?
could someone post a quick diagram on how to hard wire a phantom board to a teensy without the standard pcb so that the columns and rows line up with their respective pins on the teensy? I have an idea for mine that won't allow the use of the pcb. Also any suggestions where i could get a new teensy controller?
Do I need to use linux to compile a custom layout firmware or is there an easier way under Windows?
There surely is a way. It ain't gonna be easier though...
Edit: You were perhaps looking for a GUI or something. I'm not sure if someone built something like that. Compiling on the other hand is going to be easier on Linux any day.
could someone post a quick diagram on how to hard wire a phantom board to a teensy without the standard pcb so that the columns and rows line up with their respective pins on the teensy? I have an idea for mine that won't allow the use of the pcb. Also any suggestions where i could get a new teensy controller?
Schematics!
(Attachment Link)
So I put everything together and not all my keys are working. I tried a couple different hex files but have not tried to compile my own yet. Does anyone have a link to a nice Ansi150 layout hex I can try just to be sure?Show Image(http://i.imgur.com/58WLOtN.jpg)
This shows the keys that work. I had my ErgoDox work flawlessly the first time I plugged it in and flashed a firmware, and I just built a 38GT last night with zero issues with my diodes. Any ideas?
Did you solder those 3 extra pins on the teensy?
Did you solder those 3 extra pins on the teensy?
Nope.... :(
Back to the drawing board, I might have a lot of desoldering to do unless there is a way to get these in with the plate/keys attached. Completely my fault being a newb and skipping directions.
Looking at WhiteFireDragon's teensy picture it looks like I should have pins through D4, D5, and E6 (As labeled on the teensy PCB). It looks like it'll be less work to desolder the small Teensy PCB.
This line right here "Make sure you also install legs to pin 13, 17, and 30." Arg :-[
I was going to desolder all the pins on the teensy (Only 24 instead of 172+ from switches and LEDs), but looking at the unused teensy for my second Phantom I think the solder is on both sides of the small PCB so I'm probably SOL.
Did you solder those 3 extra pins on the teensy?
Nope.... :(
Back to the drawing board, I might have a lot of desoldering to do unless there is a way to get these in with the plate/keys attached. Completely my fault being a newb and skipping directions.
Looking at WhiteFireDragon's teensy picture it looks like I should have pins through D4, D5, and E6 (As labeled on the teensy PCB). It looks like it'll be less work to desolder the small Teensy PCB.
Did you solder those 3 extra pins on the teensy?
Nope.... :(
Back to the drawing board, I might have a lot of desoldering to do unless there is a way to get these in with the plate/keys attached. Completely my fault being a newb and skipping directions.
Looking at WhiteFireDragon's teensy picture it looks like I should have pins through D4, D5, and E6 (As labeled on the teensy PCB). It looks like it'll be less work to desolder the small Teensy PCB.
Yeah looks like you skipped this step at 22m 53sec (http://www.youtube.com/watch?v=gdLAdci6p-w#t=0h22m53s). You need to access both sides of the PCB to add in those 3 extra pins. Since you already have the plate installed and soldered the switches, you need to desolder all switches to take the everything off before you can access both sides of teensy.
To anyone building for the first time, test all connectivity between diodes, traces, and controller before the switches goes on. It saves the hassle that danielucf had to go through. That's at 34m 48s (http://www.youtube.com/watch?v=gdLAdci6p-w#t=0h34m48s), and 36m 00s (http://www.youtube.com/watch?v=gdLAdci6p-w#t=0h36m00s).
Still need a Ansi150 hex file from somewhere. Not worried about function layers until I have more time to learn how to compile my own .hex files.I built you a default ansi 150 firmware.
// Phantom ANSI 150
static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* 0: qwerty */
KEYMAP_ANSI_150(\
ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, \
GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, INS, HOME,PGUP, \
TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, DEL, END, PGDN, \
CAPS, A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, \
LSFT, Z, X, C, V, B, N, M, COMM,DOT, SLSH, RSFT, UP, \
LCTL,LGUI,LALT, SPC, RALT,FN0,RCTL, LEFT,DOWN,RGHT),
/* 1: media keys */
KEYMAP_ANSI_150(\
TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,SLEP, \
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,VOLU, \
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, MSEL,MUTE,VOLD, \
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, \
TRNS, TRNS,TRNS,CALC,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, MPLY, \
TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS, MPRV,MSTP,MNXT)
};
static const uint16_t PROGMEM fn_actions[] = {
[0] = ACTION_LAYER_MOMENTARY(1)
};
[code]
Need a bit of help with my programming my Phantom (using hasu's firmware) . I've modified phantom_ansi_150.h as shown below, and kept the rest of the headers and sources untouched.
Not sure what do to from here on out:Code: [Select]// Phantom ANSI 150
static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* 0: qwerty */
KEYMAP_ANSI_150(\
ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, \
GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, INS, HOME,PGUP, \
TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, DEL, END, PGDN, \
CAPS, A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, \
LSFT, Z, X, C, V, B, N, M, COMM,DOT, SLSH, RSFT, UP, \
LCTL,LGUI,LALT, SPC, RALT,FN0,RCTL, LEFT,DOWN,RGHT),
/* 1: media keys */
KEYMAP_ANSI_150(\
TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,SLEP, \
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,VOLU, \
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, MSEL,MUTE,VOLD, \
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, \
TRNS, TRNS,TRNS,CALC,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, MPLY, \
TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS, MPRV,MSTP,MNXT)
};
static const uint16_t PROGMEM fn_actions[] = {
[0] = ACTION_LAYER_MOMENTARY(1)
};
[code]
make -f Makefile.lufa ansi_150
This requires that you have a AVR toolchain installed.Firmware was built using: make -f Makefile.pjrc iso
Just debugged the keyboard matrix, it seems the whole column0 is not working, which for iso seems: Esc, 1, Tab, Caps, LShift, LCtrl
Check your connection on pin D5
How would I unsolder the D5 pin?
I don't own a pump.
So how would I go about changing a firmware for hardware Colemak?
/* Layer 1: COLEMAK
*
*
*
* ,---. ,---------------. ,---------------. ,---------------. ,-----------.
* |Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau|
* `---' `---------------' `---------------' `---------------' `-----------'
* ,-----------------------------------------------------------. ,-----------.
* |~ | 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp | |Ins|Hom|PgU|
* |-----------------------------------------------------------| |-----------|
* |Tab | Q| W| F| P| G| J| L| U| Y| ;| [| ]| \| |Del|End|PgD|
* |-----------------------------------------------------------| |---|---|---|
* |Backsp| A| R| S| T| D| H| N| E| I| O| '|Return | |???|???|???|
* |-----------------------------------------------------------| |---|---|---|
* |Shift | Z| X| C| V| B| K| M| ,| .| /|Shift | |???|Up |???|
* |-----------------------------------------------------------| |-----------|
* |Ctl|Gui|Alt| Space |Alt|Gui|FN0|Ctl| |Lef|Dow|Rig|
* `-----------------------------------------------------------' `-----------'
*/
KEYMAP(\
ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, \
GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, INS, HOME,PGUP, \
TAB, Q, W, F, P, G, J, L, U, Y, SCLN, LBRC,RBRC,BSLS, DEL, END, PGDN, \
BSPC, A, R, S, T, D, H, N, E, I, O,QUOT, ENT, 0, 0, 0, \
LSFT,Z, X, C, V, B, K, M, COMM,DOT, SLSH, RSFT, 0, UP, 0, \
CAPS,LGUI,LALT, SPC, RALT,RGUI,FN0, RCTL, LEFT,DOWN,RGHT),
So how would I go about changing a firmware for hardware Colemak?Code: [Select]/* Layer 1: COLEMAK
*
*
*
* ,---. ,---------------. ,---------------. ,---------------. ,-----------.
* |Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau|
* `---' `---------------' `---------------' `---------------' `-----------'
* ,-----------------------------------------------------------. ,-----------.
* |~ | 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp | |Ins|Hom|PgU|
* |-----------------------------------------------------------| |-----------|
* |Tab | Q| W| F| P| G| J| L| U| Y| ;| [| ]| \| |Del|End|PgD|
* |-----------------------------------------------------------| |---|---|---|
* |Backsp| A| R| S| T| D| H| N| E| I| O| '|Return | |???|???|???|
* |-----------------------------------------------------------| |---|---|---|
* |Shift | Z| X| C| V| B| K| M| ,| .| /|Shift | |???|Up |???|
* |-----------------------------------------------------------| |-----------|
* |Ctl|Gui|Alt| Space |Alt|Gui|FN0|Ctl| |Lef|Dow|Rig|
* `-----------------------------------------------------------' `-----------'
*/
KEYMAP(\
ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, \
GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, INS, HOME,PGUP, \
TAB, Q, W, F, P, G, J, L, U, Y, SCLN, LBRC,RBRC,BSLS, DEL, END, PGDN, \
BSPC, A, R, S, T, D, H, N, E, I, O,QUOT, ENT, 0, 0, 0, \
LSFT,Z, X, C, V, B, K, M, COMM,DOT, SLSH, RSFT, 0, UP, 0, \
CAPS,LGUI,LALT, SPC, RALT,RGUI,FN0, RCTL, LEFT,DOWN,RGHT),
that is my colemak layer.
Just fiddling with the firmware and have hit a little snag. I'm using the TMK source and I'm trying to program locking switches for caps lock and scroll lock. I've managed to get caps lock to work but I've not seen any way to get Scroll working as a lock switch.
Just fiddling with the firmware and have hit a little snag. I'm using the TMK source and I'm trying to program locking switches for caps lock and scroll lock. I've managed to get caps lock to work but I've not seen any way to get Scroll working as a lock switch.
Fix this issue. Mechanical locking switch support for NumLock and ScrollLock are implemented now.
https://github.com/tmk/tmk_keyboard/issues/46
See this.
https://github.com/tmk/tmk_keyboard#mechanical-locking-support
#define KEYMAP_RIND( \
K5A, K5C, K5D, K5E, K5F, K5H, K5I, K5J, K5K, K5L, K5M, K5N, K5O, K5P, K5Q, K5R, \
K4A, K4B, K4C, K4D, K4E, K4F, K4G, K4H, K4I, K4J, K4K, K4L, K4M, K4O, K4P, K4Q, K4R, \
K3A, K3B, K3C, K3D, K3E, K3F, K3G, K3H, K3I, K3J, K3K, K3L, K3M, K3P, K3Q, K3R, \
K2A, K2B, K2C, K2D, K2E, K2F, K2G, K2H, K2I, K2J, K2K, K2L, K2M, K2N, \
K1A, K1B, K1C, K1D, K1E, K1F, K1G, K1H, K1I, K1J, K1K, K1L, K1M, K1N, K1Q, \
K0A, K0B, K0C, K0G, K0L, K0M, K0N, K0P, K0Q, K0R \
) KEYMAP( \
K5A, NO, K5C, K5D, K5E, K5F, NO, K5H, K5I, K5J, K5K, K5L, K5M, K5N, K5O, K5P, K5Q, K5R, \
K4A, K4B, K4C, K4D, K4E, K4F, K4G, K4H, K4I, K4J, K4K, K4L, K4M, NO, K4O, K4P, K4Q, K4R, \
K3A, K3B, K3C, K3D, K3E, K3F, K3G, K3H, K3I, K3J, K3K, K3L, K3M, NO, K3P, K3Q, K3R, \
K2A, K2B, K2C, K2D, K2E, K2F, K2G, K2H, K2I, K2J, K2K, K2L, K2M, K2N, NO, NO, NO, \
K1A, K1B, K1C, K1D, K1E, K1F, K1G, K1H, K1I, K1J, K1K, K1L, K1M, K1N, NO, K1Q, NO, \
K0A, K0B, K0C, NO, NO, K0G, NO, NO, K0L, K0M, K0N, K0P, K0Q, K0R \
)
// Phantom RIND
static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* 0: qwerty */
KEYMAP_RIND(\
ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, \
GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, INS, HOME,PGUP, \
TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, DEL, END, PGDN, \
CAPS,A, S, D, F, G, H, J, K, L, SCLN,QUOT,NUHS,ENT, \
LSFT,NUBS,Z, X, C, V, B, N, M, COMM,DOT, SLSH,RSFT,FN0, UP, \
LCTL,LGUI,LALT, SPC, RALT,RGUI,RCTL, LEFT,DOWN,RGHT),
/* 1: media keys */
KEYMAP_RIND(\
TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,MSTP, \
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, MPLY,MPRV,VOLU, \
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, MUTE,MNXT,VOLD, \
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \
TRNS,TRNS,TRNS,TRNS,CALC,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, \
TRNS,TRNS,TRNS, TRNS, TRNS,APP, TRNS, TRNS,TRNS,TRNS)
};
static const uint16_t PROGMEM fn_actions[] = {
[0] = ACTION_LAYER_MOMENTARY(1)
};
// Phantom RIND
static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* 0: qwerty */
KEYMAP_RIND(\
ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, \
GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, INS, HOME,PGUP, \
TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, DEL, END, PGDN, \
CAPS,A, S, D, F, G, H, J, K, L, SCLN,QUOT,NUHS,ENT, \
LSFT,NUBS,Z, X, C, V, B, N, M, COMM,DOT, SLSH,RSFT,FN0, UP, \
LCTL,LGUI,LALT, SPC, RALT,RGUI,RCTL, LEFT,DOWN,RGHT),
/* 1: media keys */
KEYMAP_RIND(\
TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,MSTP, \
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, MPLY,MPRV,VOLU, \
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, MUTE,MNXT,VOLD, \
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \
TRNS,TRNS,TRNS,TRNS,CALC,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, \
TRNS,TRNS,TRNS, TRNS, TRNS,APP, TRNS, TRNS,TRNS,TRNS)
};
static const uint16_t PROGMEM fn_actions[] = {
[0] = ACTION_LAYER_MOMENTARY(1)
};
Nicely spotted Grimey, that fixed it. Thanks!
Well it ain't that hard - why don't you try it and play with Layouts a little bit? :-)
https://github.com/tmk/tmk_keyboard/blob/master/doc/build.md
Does anyone know if I was to cut an opening in a Round 1 Phantom plate for the controller would it fit a QFR PCB? I guess another way to ask is the controller the only thing preventing use of a Phantom plate in a QFR case and PCB? If it is does anyone have any numbers that I can use to modify a phantom plate to work?
I was just trying to save another vet in the forums a couple $$ and I have a phantom plate that I won't be using plus WFD is on vacation until the 27th.
Not going to chop it up that bad just want to mod it so it will be compatible for a QFR. Just needing to know if the key spacing is the same. And dimensions on the plate for other holes that need to get cut.the spacing is the same so go ahead and dremel a controller cutout.
Not going to chop it up that bad just want to mod it so it will be compatible for a QFR. Just needing to know if the key spacing is the same. And dimensions on the plate for other holes that need to get cut.the spacing is the same so go ahead and dremel a controller cutout.
I am experiencing something weird with my Phantom. When I plug it into my computer F4, 6^, T, G, and V do not work. However when I plug it into my tablet through an OTG cable those keys magically work. Any idea what on earth could be causing this? If a trace on COL5 was bad I would assume that the keys would never work period, but they work on one device but not another...
I am experiencing something weird with my Phantom. When I plug it into my computer F4, 6^, T, G, and V do not work. However when I plug it into my tablet through an OTG cable those keys magically work. Any idea what on earth could be causing this? If a trace on COL5 was bad I would assume that the keys would never work period, but they work on one device but not another...
there were some windows 7 updates that fked things over for me. have you tried to re flash the firmware and/or try the phantom on another pc?
Is there any guide or help file on how to program macros? I have everything working except I am unsure on how to make macros work. I saw somewhere in this thread someone used MACRO(MD(KEY),D(KEY2),END) does this work? is there a way to have it type something without making each key a D(KEY)? Thanks
Stuff...
i put pins in those three extra holes, they are all soldered to the pcbIt looks like you have too much solder & heat on those joints. You could try if you haven't already the diode check as described in the DT wiki Phantom assembly instructions. That is where you test each switch pad to the row & column to the
i used this firmware
http://geekhack.org/index.php?topic=26742.msg640096#msg640096
i tried all three but the one i used with the other phantom i built was phantom-PHANSIWIN.hex
col_13 -> D6Yep. I found out yesterday that D6 is also connected to the Teensy's on-board LED, so I can't shut off the annoying thing in firmware ...
BTW, the AVR-Keyboard firmware launches the boot loader if you press both Shift keys... which I noticed that I do occasionally when typing.Same, I changed mine to lshift, rshift, rcontrol and printscreen I think. No way you're going to press that **** accidentally ;).
BTW, the AVR-Keyboard firmware launches the boot loader if you press both Shift keys... which I noticed that I do occasionally when typing.Same, I changed mine to lshift, rshift, rcontrol and printscreen I think. No way you're going to press that **** accidentally ;).
Same, I changed mine to lshift, rshift, rcontrol and printscreen I think. No way you're going to press that **** accidentally ;).I'm thinking of changing it to Caps Lock - LGUI - RGUI for nostalgic reasons... ;)
lelSame, I changed mine to lshift, rshift, rcontrol and printscreen I think. No way you're going to press that **** accidentally ;).I'm thinking of changing it to Caps Lock - LGUI - RGUI for nostalgic reasons... ;)
So my phantom's all soldered up (except the switches) and is running TMK firmware. I just used jumper wire to confirm all the keys worked, and the greys ones in this picture aren't responding.. Any ideas what could be causing this and what I can do to fix it? Also worth noting I've tried the two firmwares in the OP of this topic, and the phantom is running ANSI 150It looks like col0 (esc,1,capslock,Lshift,ctrl) are not connected to the controller. You can find a Phantom build guide in the DT Wiki. i would check for continuity from the pin on the controller back to that col0 and the switch pins and diodes. That is also one of pins that have to be added to the Teensy. I would also do the same for the other non working ones.Show Image(http://i.imgur.com/XEPswNg.png)
It looks like col0 (esc,1,capslock,Lshift,ctrl) are not connected to the controller. You can find a Phantom build guide in the DT Wiki. i would check for continuity from the pin on the controller back to that col0 and the switch pins and diodes. That is also one of pins that have to be added to the Teensy. I would also do the same for the other non working ones.
Great News! I had to reheat and re flow the solder joints on a Teensy to get to work also.Added a bit of solder to all the teensy connections.. Now all the keys work except caps lock. No idea why that single key isn't working :/
All fixed!
I would to build a phantom with a layout like the plum 96.Show Image(http://i.imgur.com/xHcgfXy.png)
I'm assuming the Teensy can handle the extra keys correct? What plate would I purchase to go along with the Phantom PCB?
has there been a GB yet for 1.5x 1.x .5x 7x phantom with 1.75x left shifts plate?
has there been a GB yet for 1.5x 1.x .5x 7x phantom with 1.75x left shifts plate?
You mean right shift? No. You can always have a one-off plate made.
But Phantom PCB only has 3 columns on the right, not 4.All plates should have holes for the keys in-between the arrow keys and the 6-key cluster, though. They are also fully supported by the PCB.
Are there any advantages of building my own phantom + Teensy over a Duky Shine 3 TKL? I can't seem to find much information on the capabilities of the Teensy. I'm hoping that the fact that we can make our own firmware mods would be an advantage.
I do want backlighting, but I don't need the flashy options. Brightness control is all I'm interested in.
Can I can get more layers with the Teensy than I could with the Ducky? For example, could I use something like "Function Q" to register as a unique keystroke in which I could then use AutoHotKey to identify and use it? Or is Function limited to certain keys?
Can the Teensy do anything more than the Ducky Shine 3? With the Teensy, does anyone know if I can apply the Fn key toward any key or is it limited like most keyboards?
So I figured I'd see if I have more luck with necro-posting than the previous poster; I don't think my problem deserves a new topic, it's pretty dumb.
I build my Phantom a few weeks ago, and while it was fine in the beginning, entire rows of keys became erratic after a while, becoming periodically unresponsive or chattering. Since rows and not individual switches were affected, I managed to fix it by sucking off most of the solder on the Teensy joints, and resoldering. One row didn't get fixed though, the uppermost one, so I tried to do the same procedure again at the B5 joint... and ended up sucking up the leg. I guess in that case, the problem was that the B5 leg wasn't properly soldered to the Phantom, so desoldering it on the Teensy side made it come loose.
Can this be fixed without desoldering every switch to access the topside of the PCB? I assume no, but I've been wrong about a lot when it comes to soldering lately.
So I figured I'd see if I have more luck with necro-posting than the previous poster; I don't think my problem deserves a new topic, it's pretty dumb.
I build my Phantom a few weeks ago, and while it was fine in the beginning, entire rows of keys became erratic after a while, becoming periodically unresponsive or chattering. Since rows and not individual switches were affected, I managed to fix it by sucking off most of the solder on the Teensy joints, and resoldering. One row didn't get fixed though, the uppermost one, so I tried to do the same procedure again at the B5 joint... and ended up sucking up the leg. I guess in that case, the problem was that the B5 leg wasn't properly soldered to the Phantom, so desoldering it on the Teensy side made it come loose.
Can this be fixed without desoldering every switch to access the topside of the PCB? I assume no, but I've been wrong about a lot when it comes to soldering lately.
Inspect the Teensy and PCB closely to make sure you didn't pull any pads. Assuming you didn't, just buy another pin and solder it from both sides. They're cheap -- you'll pay more for shipping than for the pins.
So I figured I'd see if I have more luck with necro-posting than the previous poster; I don't think my problem deserves a new topic, it's pretty dumb.
I build my Phantom a few weeks ago, and while it was fine in the beginning, entire rows of keys became erratic after a while, becoming periodically unresponsive or chattering. Since rows and not individual switches were affected, I managed to fix it by sucking off most of the solder on the Teensy joints, and resoldering. One row didn't get fixed though, the uppermost one, so I tried to do the same procedure again at the B5 joint... and ended up sucking up the leg. I guess in that case, the problem was that the B5 leg wasn't properly soldered to the Phantom, so desoldering it on the Teensy side made it come loose.
Can this be fixed without desoldering every switch to access the topside of the PCB? I assume no, but I've been wrong about a lot when it comes to soldering lately.
Inspect the Teensy and PCB closely to make sure you didn't pull any pads. Assuming you didn't, just buy another pin and solder it from both sides. They're cheap -- you'll pay more for shipping than for the pins.
Thanks, I guess that's a no. I'm not sure if it's my cheap equipment or what, but even desoldering a single switch is a huge pain for me: there's always a tiny bit of solder left behind that is damn hard to remove. So I guess I'll have to sell the keyboard in parts.
Sorry, I didn't fully answer your question. In my defense it was very early. :-[
You can only pass solder from one side, presumably because of the switch plate. So that definitely presents a problem. But if you can get the solder to melt/flow all the way through both PCBs, and assuming your Teensy is as close as it can possibly get to touching your Phantom PCB, then you might be able to force enough solder in from the Teensy (bottom) side all the way through. The goal is to get as much solder in there as possible so it connects to the pad & pin on the opposite Phantom side. Get a hot iron and work quickly. It's worth a try.
The tricky part will be holding the new pin in place while you solder. Maybe needle-nose vice grips will work?
Wait -- Did you use the black plastic spacers on the pins in your Teensy? If you did you are SOL. :-X