Page 1 of 2
Hand Wiring Switches and LED Backlighting questions
Posted: 14 Mar 2014, 03:32
by rklm
I am putting together the resources to construct a custom 60% board at the moment.
I have worked out a layout which I feel doesn't stray too far from my current keyboard usage:
http://www.keyboard-layout-editor.com/# ... 39f70cf994
If you guys have any suggestions, I would love to here them.
I have a 3d model for the plate (which incorporates a cavity for the wiring and space for a teensy2.0):
https://tinkercad.com/things/irhM1hX1m7v (still editing the .skp that I exported this from).
The local campus library has a Makerbot 2 with an 11x6x6 printing space, and I will most likely use it to print my model with either ABS or PLA. I have two sheets of 1/16" steel which I am going to layer and use as the bottom plate.
When I am done, I will post a full build log, however before I can really continue I need to figure out one or two more things.
I would like to add backlighting, but I am having some trouble finding the right LEDs and resistors.
Most of the white 3mm through-hole LEDs I have found are something like 2.8-3.6V 20mA. When I plug those numbers into
http://led.linear1.org/led.wiz with the teensy2.0's 5v source voltage and 75 LEDs (one per switch), I get about 1500mA draw (with 82ohm 1/4watt resistors)... which would appear to be 1000mA more than the USB bus (or the teensy for that matter) could handle.
The LEDs that were recommended on /r/mechanicalkeyboards have about the same specs too:
http://www.ebay.com/itm/50pcs-3mm-Pink- ... OU:US:3160
How should I go about wiring up LEDs to the teensy without destroying electronics?
Also... other suggestions, for reasons.
Posted: 14 Mar 2014, 08:03
by Broadmonkey
The normal way of adding that amount of LEDs, when you only have 500mA is by controlling them with PWM, that way you can cut almost 3/4 of the power consumption from the LEDs (IIRC).
Posted: 14 Mar 2014, 08:40
by kile
Broadmonkey wrote:The normal way of adding that amount of LEDs, when you only have 500mA is by controlling them with PWM, that way you can cut almost 3/4 of the power consumption from the LEDs (IIRC).
That would work, but only if you group the LEDs into at least 3 groups and then successively turn one group on and all the others off. Make a sort of grouped running LEDs circuit. If you have PWM on all the LEDs at the same time you will drop the average current, but the peak will stay the same.
I suggest getting a few samples of different brand LEDs and see how bright they are with less current. Chances are, some of the LEDs will be bright enough at 5mA especially if you have 75 of them to combine their light. At 20mA they will probably be too bright anyway.
Posted: 14 Mar 2014, 19:39
by rklm
These ones here:
http://www.wayengineer.com/index.php?ma ... b6a371d3da
state that their operating current is 5-19mA. Does that mean that some of them might run at 5 and some might run at 19?? Or is there a way for me to drive them at the lower current?
Posted: 14 Mar 2014, 20:46
by rklm
I read up on controlling PWM on the Teensy (
https://www.pjrc.com/teensy/td_pulse.html) and it looks like the way to go.
I suppose the plan is now to wire up my matrix of 13x6 with 20mA/3.6v LEDs and 82ohm 1/4watt resistors to one of the PWM pins on the Teensy (I will most likely have a number of pins available, since I am only using 19 for my switch matrix) and run them at a pulse width of 25%.
That aught to bring the LED power consumption down under 400mA, which leaves 100mA for the Teensy (I think I read somewhere that it uses 50mA, correct me if I am wrong).
That wraps up pretty much all of the hardware problems I had, but opens the door to some new software problems I will have to work out :S
The guy who works in the 3d printing room at the library will be back on the 18th, so that gives me a couple days to work out any more kinks before I can really get started on the project. I have pretty much everything else I need to start soldering this bad boy together.
Posted: 16 Mar 2014, 12:34
by kile
That will not work for at least two reasons. You can not directly drive 75 LEDs from one AVR pin. An AVR pin is capable of at most 40mA, but even going over 20mA is probably not safe for the pin in the long run. You can, however, use PWM to drive a MOSFET which will then turn the LEDs on and off. Which leads to the second problem: as I already mentioned in the previous post, PWM only lowers the average, not the peak current. While the PWM signal is high, the current draw will be 1500mA, and then it will drop to 0mA while the signal is low.
As I said, the best solution to this is to use lower current per LED. LEDs are not on/off devices - they will start emiting light at much lower currents. The 20mA probably means the current at which the LED will have peak brightness before any more current starts to damage it.
So, drive the LEDs at 5mA and see how bright they are. If they are bright enough - you have your solution.
The LEDs you linked should work, but they are not flangeless - meaning they have a small ring around their base that you will need to sand off if you want them to sit well in the CherryMX switch. Not a problem, but it could take a while for 75 switches.
Posted: 16 Mar 2014, 13:21
by matt3o
couldn't you PWM the LEDs in batches? only half or 1/3 or 1/4 at any given time.
Posted: 16 Mar 2014, 13:33
by Muirium
Are you after simple, even backlighting? If so, I'm sure I read that people have patched a whole load of LEDs onto a keyboard's power rail before, wired up right so they all share the current.
Pulse Width Modulation — aka flicker — annoys me quite a bit. I don't mind it on a few keys here and there, but a large area of them pulsing away really distracts my eyes. The only fundamental advantage to a PWM matrix of LEDs is that you can address them individually and do fancy light shows, like the Ducky Shine 3. But if you want a practical light, a level voltage is the better way.
Posted: 16 Mar 2014, 21:12
by rklm
On the Teensy, is there a way to directly reduce the current without PWM?
Also, I am using a matrix of 19, so I suppose given that the teensy2.0 has 24 pins I could split the LEDs among the remaining 5?
That would be 15 LEDs per pin, and 75mA per pin at 5mA per light.
This seems so complicated... how do keyboard manufacturers manage to do this?!
Posted: 16 Mar 2014, 21:16
by Muirium
They don't. I'm pretty sure that they just go by the main USB power rail, except for the rare full LED matrix keyboards that are beginning to show up now. But I'm no engineer, so bear that in mind!
Posted: 16 Mar 2014, 22:09
by Broadmonkey
Okay okay.. what I meant was to control the whole 75 leds with PWM. You can not control it from one PIN, this is not possible from just about any controller, since you can only draw so much current from one PIN.
If you use PWM and you set it up to have the rising edge on all PINs you have connected the LEDs to, it would still draw too much current since the peak will be too high, that is why you want to "spread" the rising edge out on as many groups of LEDs as possible (this is just straight from the head, so it might not be true, so please correct me. Also if you can explain it better)
So what you want is to create as many groups of LEDs as possible, if not have a single PWM pin for every LED, this is not however possible from a Teensy, so you would have to get something to help you. The answer?
Well, an LED driver ofcourse!
This is what is used in the
MAX keyboard Blackbird: TLC59282
I haven't look much into it, since I am not THAT fussed about LEDs. But I know this is how large keyboard manufacturers do it.
Posted: 16 Mar 2014, 22:17
by Soarer
Yeah, well, they often just switch the LEDs with a FET that can take the current.
PWM and bigger resistors have the same effect - reducing average current, and reducing brightness. PWM might not be the best choice if peak current is still over the 500mA USB limit!
Don't forget, manufacturers shave every cent off costs. So they use the cheapest LEDs they can (and waste your power...). Ultrabright LEDs can give a nice glow at less than a mA each (or maybe a tad more if they have to shine through a not very transparent keycap). Think resistors in the 1k to 10k range
![Smile :)](./images/smilies/icon_e_smile.gif)
Key point: when an LED says it's 20mA, that's 20mA for its rated brightness (lumens/millicandelas) and other parameters; you can run less.
Teensy has power limits from each pin (40mA?), from each port (100mA?), and for the whole device (500mA?). All must be respected.
Do you want to be able to dim them from your firmware? Then PWM is the simplest way to go. Switch them? Still need at least one pin (plus FET), so might as well make it a PWM pin even if you don't use the PWM. Always on? No problem, just wire to USB 5V.
Deck published their schematics for a couple of keyboards -
http://www.deckkeyboards.com/support/de ... -schematic - they use a resistor DAC to set brightness to a different levels without using PWM.
Posted: 17 Mar 2014, 01:34
by rklm
The brightness of the LEDs doesn't really matter too much for my purposes (as long as they are visible) and they can all be on at the same time (all the time).
The case I am building this into is going to be extraordinarily streamlined, so the simpler the wiring the better (between the LEDs and the matrix, I am going to have a lot of layers and only a few mm to solder in).
Is it possible to reduce the draw from the LEDs to 5mA via resistors alone?
Say I use LEDs that are 3.6v @ 20mA spec, but I treat them like 5mA LEDs and use 330 ohm resistors (like these
http://www.amazon.com/E-Projects-330k-R ... 1%2F4+watt ), would they actually only draw the correct amount and work on the pins of a teensy?
Posted: 17 Mar 2014, 01:38
by rklm
Or maybe it would be best to just use a short extension and tap right into the 5v on the USB cable?
Posted: 17 Mar 2014, 02:39
by Soarer
For 'on all the time' you can wire to one of the two +5V pins on the Teensy and draw up to the USB limit (minus a bit for the Teensy); no need to extend and tap the USB cable itself.
Even 5mA per LED would be too much really (well, how many LEDs?). Aren't you still thinking about the mA rating wrongly? That's just the nominal rating, and you can give it more or less current by changing the resistor as you desire.
You can find 10000 mcd brightness LEDs for about $5 for 100. They are, as you would say, '20mA' LEDs, but at that current they would be far too bright for backlighting. They should run fine with large resistors at (possibly much) less than 1mA, giving the right brightness level (experimentation required to get it just right).
Posted: 17 Mar 2014, 03:01
by rklm
The keyboard community is so awesome, this thread has been so helpful.
I am only using 75 LEDs (one per key) so I figure as long as I stay under ~400mA I would be alright (not sure of the power consumption of the Teensy, but I thought it was below 100mA), and 75x5mA is only 375mA.
I do plan to use cherry mx LED color changer clips (just got them from the recent massdrop), but I doubt they will reduce the brightness of the LEDs that much.
If they will be bright enough running at ~1mA, then I suppose I should use a 1.5k 1/4watt resistor like this:
http://www.amazon.com/E-Projects-1-5k-R ... 1%2F4+watt
That would bring the power consumption down to 75mA for LEDs on the whole board.
Then I'll wire them to the 5v on the teensy (which I assume is a direct connection to the 5v pin in the mini-usb header?)
Posted: 17 Mar 2014, 22:36
by rklm
Gave my 3d model (
https://tinkercad.com/things/k4Cn3ejGuAP) to the library, and it is being printed now.
Once I pick it up, I start a build log thread.
Posted: 17 Mar 2014, 23:14
by jeffkoch
Soarer wrote:Yeah, well, they often just switch the LEDs with a FET that can take the current.
PWM and bigger resistors have the same effect - reducing average current, and reducing brightness. PWM might not be the best choice if peak current is still over the 500mA USB limit!
<snip>
Do you want to be able to dim them from your firmware? Then PWM is the simplest way to go. Switch them? Still need at least one pin (plus FET), so might as well make it a PWM pin even if you don't use the PWM. Always on? No problem, just wire to USB 5V.
<snip>.
If you scan the rows and columns, you could illuminate any individual LED or set of LEDs. Perhaps have each key light when pressed, or backlight the entire board, and have the key extinguish when pressed.
Posted: 17 Mar 2014, 23:18
by Muirium
Like this:
Not my cup of tea. But reactive mode has its charm, compared to the others.
Posted: 17 Mar 2014, 23:39
by Soarer
jeffkoch wrote:If you scan the rows and columns, you could illuminate any individual LED or set of LEDs. Perhaps have each key light when pressed, or backlight the entire board, and have the key extinguish when pressed.
Well, of course, but you'll be adding a fair amount of circuitry and/or specialised driver chips to do it!
Various ways to skin that rat...
http://geekhack.org/index.php?topic=26751.0 ![Wink ;)](./images/smilies/icon_e_wink.gif)
Posted: 18 Mar 2014, 01:27
by rklm
Ok... well... I did briefly consider wiring the LEDs ~through~ the switches... so that when they are actuated the light would come on... but there are probably complications that I am not foreseeing, and there would probably have to be another set of resistors to prevent current from making it's way into the teensy through the switch...
But if someone wants to see that in this build, and can explain a wiring pattern that would be safe for all the electronics... that might be enough incentive for me to figure it out.
Posted: 18 Mar 2014, 01:34
by rklm
This was what I was imagining originally (without any sort of light-show work)
Blue connections are the negative from the LEDs, purple rectangles are 330 ohm resistors
Red connections are for the switch matrix, brown rectangles are diodes
Green connections are from the switch to the teensy, the top connections are a ribbon cable (like this:
http://deskthority.net/workshop-f7/the- ... t1067.html )
Sorry for the inexcusable ugliness... this was only meant to be a reference for myself
![Razz :P](./images/smilies/icon_razz.gif)
Posted: 18 Mar 2014, 03:57
by rklm
Maybe something like this?
The LED would be connected to 2 resistors, so it would glow dimly, until the switch makes a connection that bypasses one of the resistors so it can run at its maximum spec.
I am such a good graphical artist XD
Posted: 18 Mar 2014, 10:57
by Muirium
I understand it. The bit I question is whether the Teensy is going to see this as on or off when the switch is open and closed. The lower resistor makes the open state dubious, and the left resistor has the same effect on the closed state. Guess it's worth a test on a breadboard.
Posted: 18 Mar 2014, 23:16
by Grendel
matt3o wrote:couldn't you PWM the LEDs in batches? only half or 1/3 or 1/4 at any given time.
I believe the G710+ does that, cycling through quadrants. Ducky may too, their USB descriptor claims 300mA power use. Doesn't really help w/ the flickering :/ Driving 1/4 of the LED's at a time is possible but requires some more thinking about how exactly you shift through the quad's -- probably via an external 4-way switch that distributes the PWM signal to the MOS-FET's (could get its clock signal from TOV.) If you drive the timer w/ 2MHz (/8) (resulting in a ~8kHz cycle), the cycle time of the segments would be ~2kHz, flicker shouldn't be too bad.
Edit: it's kind of pointless tho, since the LED's can be on max. 1/4 of the 500us cycle so you have to drive them w/ more current to compensate for the loss of 3/4 on-time
Muirium wrote:Pulse Width Modulation — aka flicker — annoys me quite a bit. I don't mind it on a few keys here and there, but a large area of them pulsing away really distracts my eyes. The only fundamental advantage to a PWM matrix of LEDs is that you can address them individually and do fancy light shows, like the Ducky Shine 3. But if you want a practical light, a level voltage is the better way.
While in general I wholeheartedly agree here, I usually use 2MHz based timer driven PWM where I can (Frosty Flake, CMS Demo mod, Scorpius 32 mod, SmallFry test board) since it's easier to implement and it's very smooth -- no flicker visible to me during normal use (and I'm VERY sensitive to stroboscopic effects. Gave away a 710+ and DS3 because of this.)
Posted: 19 Mar 2014, 01:00
by Soarer
rklm wrote:Maybe something like this?
The LED would be connected to 2 resistors, so it would glow dimly, until the switch makes a connection that bypasses one of the resistors so it can run at its maximum spec.
Trouble is, although that would change the current flowing through the LED, there isn't an easy way for the CPU to read the switch state any more! And even if that problem is solved, making it work correctly with multiple switches pressed probably wouldn't be viable.
Posted: 19 Mar 2014, 01:19
by rklm
Soarer wrote:rklm wrote:Maybe something like this?
The LED would be connected to 2 resistors, so it would glow dimly, until the switch makes a connection that bypasses one of the resistors so it can run at its maximum spec.
Trouble is, although that would change the current flowing through the LED, there isn't an easy way for the CPU to read the switch state any more! And even if that problem is solved, making it work correctly with multiple switches pressed probably wouldn't be viable.
That is pretty much what I figured. Just a wild idea
I will probably just wire up an independent matrix with 330 ohm resistors to keep the draw under 400mA. Positive leads to the 5v on the teensy, negative to the ground. Clean and simple
Also, the case 3d print failed (it was too wide, and the cooling PLA curled the edges in).
I talked to the guy who runs the 3d printing room at the local library (I have a pretty awesome local library let me tell you), and he recommends that I just laser cut the layers from acrylic.
This is turning out more and more similar to Matt3o's build the more I fiddle with it XD
Hopefully tomorrow I will have the vector files together for the laser cut layers, and I can get the case together and show off some pics.
I will show off the source of my switches as well, it is a surprise too
Posted: 20 Mar 2014, 19:25
by rklm
A small teaser before I get my LEDs, finish the project, and upload my build log:
(I guess if you are really adamant about seeing this project you could just look at the stuff I put on imgur XD )
Posted: 23 Mar 2014, 17:43
by rklm
I have everything wired up (except for the leds, waiting for them to ship from China), but now I am having some programming problems.
Before I start modifying hasu's code for the teensy, I wanted to test the matrix by running a modified "HelloKeypad" script (from the keypad library), but so far I cant get anything to show up on the serial monitor.
I have inspected the whole board for gratuitous wiring errors a number of times but I can't find anything visible that would keep ALL the keys from functioning.
Any advice? Test software or the like?
Posted: 24 Mar 2014, 13:44
by rklm
I took a hard look at the wiring done for the Brownfox and Lowpoly's Apple m0110 again and noticed that I had wired my diodes in series.
Went back in and added a wire to connect all the diodes to, so that their connection on the rows would be in parallel.
After fixing that bit, I can't find anything else that seems wrong. I will post pictures later.
I wrote a small piece of software that turns the yellow LED on the teensy on until a connection on the matrix is made, and it works when I jump any of the row pins to any of the column pins, but it doesn't work when I actuate the switches.
I don't think that the switches are broken, and I don't think it can be a wiring error anymore, so I am not sure what is going on.
My assumption is that the teensy is putting out 3.3v on one of the pins and lighting up the LED if it hits a ground (it works when I jump from one of the pins to any ground) and it is sending the 3.3v the wrong direction for the diode.
I am going to test the connections with a voltmeter later and let you guys know what I find.