
A hand-wired USB and Bluetooth keyboard powered by Python - kfihihc
https://github.com/makerdiary/python-keyboard
======
BiteCode_dev
A lot of people are asking:

\- why python?

\- isn't is slow?

Remember that Python is a language spec, there are several implementations.

This project uses a particular implementation called CircuitPython (
[https://en.wikipedia.org/wiki/CircuitPython](https://en.wikipedia.org/wiki/CircuitPython)),
a derivative project from MicroPython (
[https://fr.wikipedia.org/wiki/MicroPython](https://fr.wikipedia.org/wiki/MicroPython)),
by the people at AdaFruit.

This implementation runs with a very different VM that can fit within 256k of
code space and 16k of RAM.

So, while obviously you cannot expect anywhere near C level of perfs, this is
way lighter than CPython.

The advantage is that you get the ease of Python to program your board,
including the clean terce language, the memory management and the rich data
structures. You can even have a live shell on some embeded hardwares! The
whole dev process is so simple: code, copy your module, run.

Of course, some features of CPython are not available.

~~~
mzakharo1
many people dont realize, but micropython has unix port, and it can be much
slower than CPython. micropython's main advantage is size, not speed.

------
davefp
Great job! I've not seen python-based keyboard firmware before, I'm impressed
that it's fast enough to run something like a keyboard.

Without detracting from the code in the post, I recommend that anyone wanting
to make and program their own keyboard should take a look at QMK, a widely
supported keyboard firmware project that is FOSS:
[https://qmk.fm/](https://qmk.fm/)

------
hellweaver666
If you want to make a little macro-keyboard equivalent at a fraction of the
cost, I wrote a little guide (with example code) here:
[https://makeandymake.github.io/2020/05/02/seeeduino-xiao-
cir...](https://makeandymake.github.io/2020/05/02/seeeduino-xiao-
circuitpython-usb-hid-macro-keypad.html)

~~~
kart23
this is pretty cool!

I've wanted to hardwire a keyboard, but a full-size one seems pretty
intimidating.

------
mchan889
This looks cool, however can someone with some electronics know-how explain to
me why the connections on most, if not all the keys are crossed? They don't
look like insulated wires, though I could be wrong.

~~~
n3k5
Insulated wires that look a lot like bare metal are quite common, e.g. in
electromagnet coils.

[https://en.wikipedia.org/wiki/Magnet_wire](https://en.wikipedia.org/wiki/Magnet_wire)

The insulation melts away where it comes in contact with hot solder, so it's
very easy to work with for hand-wiring projects.

------
Abishek_Muthian
This is nice, we need more such open-source, affordable keyboard designs and
components; Especially for accessibility keyboards[1] as their costs are
exorbitant.

[1][https://needgap.com/problems/96-one-hand-keyboard-
keyboard-a...](https://needgap.com/problems/96-one-hand-keyboard-keyboard-
accessibility)

------
stonecharioteer
Haha that's amazing. What's the latency on this though? I always assumed
firmware written in python would be slow for a use case like a keyboard.

~~~
kfihihc
It is a bit slow. It takes 4 ms to scan the matrix once right now. With some
optimizations, it may be faster.

~~~
sk0g
Would Numpy be of use? Haven't looked at the source yet, but for a keyboard, 4
ms per matrix would be noticeably laggy, especially if you add debouncing (is
that even a thing in keyboards?)

~~~
turbinerneiter
It's a microcontroller. It has maybe 512k of storage and 128k of memory. The
Numpy package probably is ~100Mb

The controller is running CircuitPython which is a fork of MicroPython - a
tiny re-implementation Python for microcontrollers.

~~~
sk0g
Valid point! Might still be able to get a speed up if you can write and import
your own C code though.

------
thecureforzits
Nice, if I made it I would replace the capslock with control and "~" with
escape. Make the _least used_ keys require combinations, not the often used
ones.

~~~
StavrosK
I use Caps Lock for both Ctrl and Esc, wouldn't have it any other way. Shift
keys are also open/closing parens, holding down the tilde turns the
"yuihjknm," section to a numpad, holding down Tab turns jkl; to {}[], etc.

Very handy when programming.

~~~
Keyframe
How's caps both ctrl and esc? Can you explain on shifts a bit? I guess you
autotab

~~~
StavrosK
Oh, they're all hold/tap. Hold CapsLock to get Ctrl, tap to get Esc. Similarly
with the shifts, hold to get shift, tap to get ( on left and ) on right. Tab
is the same way, hold down tab to transform the keys.

~~~
Keyframe
Well, well.. why didn't I think of that! Thanks!

------
jonny383
Honestly, why Python? Writing a much faster equivalent in C really isn't any
more complicated...

~~~
kfihihc
Just for fun :)

The hardware includes a QSPI flash which presents as an USB storage that
stored Python source code, and you can modify Python directly.

BTW, It provides a new way to validate your hardware product ideas quickly.

~~~
jonny383
Solid answer. I just realised my question sounded cynical - which wasn't my
intention.

