├── firmware-pcb ├── keymap_iso50.c ├── tmk_keyboard ├── keymap_common.c ├── README ├── config.h ├── led.c ├── keymap_common.h ├── Makefile └── matrix.c ├── hardware ├── pcb-main │ ├── pcb.dcm │ ├── pcb-cache.dcm │ ├── fp-lib-table │ ├── footprints.pretty │ │ ├── Spring-Contact_SMD.kicad_mod │ │ ├── MountingHole_4mm.kicad_mod │ │ ├── MountingHole_5mm.kicad_mod │ │ ├── SW_PUSH_SMALL.kicad_mod │ │ ├── C_1206_HandSoldering.kicad_mod │ │ ├── MXDIODE.kicad_mod │ │ ├── Resistor_Horizontal_RM7mm.kicad_mod │ │ ├── LED-3MM.kicad_mod │ │ ├── USB_Micro-207A-BBA0-R.kicad_mod │ │ ├── Crystal_HC49-U_Vertical.kicad_mod │ │ └── MLF-44_Atmel.kicad_mod │ ├── lib │ │ ├── mx1a-simple.lib │ │ ├── aker.lib │ │ ├── dtsjw.lib │ │ ├── oupiin_usb.lib │ │ ├── atmega32u4.lib │ │ └── power.lib │ ├── pcb.pro │ ├── pcb.lib │ ├── led.sch │ ├── pcb-cache.lib │ └── pcb.sch ├── pcb-bottom-plate │ ├── fp-lib-table │ ├── footprints.pretty │ │ ├── MountingHole_3mm.kicad_mod │ │ ├── Clearing.kicad_mod │ │ ├── MountingHole_2.2mm_M2_Pad.kicad_mod │ │ ├── MountingHole_2.2mm_M2_Pad_Via.kicad_mod │ │ ├── Connector_B_5x10mm.kicad_mod │ │ └── SolderWirePad_single_SMD_5x10mm.kicad_mod │ ├── pcb-bottom-plate-cache.lib │ ├── pcb-bottom-plate.pro │ └── pcb-bottom-plate.sch ├── pcb-top-plate │ ├── fp-lib-table │ ├── footprints.pretty │ │ ├── MountingHole_3mm.kicad_mod │ │ ├── MountingHole_2.2mm_M2_Pad.kicad_mod │ │ ├── MountingHole_2.2mm_M2_Pad_Via.kicad_mod │ │ ├── Connector_B_5x10mm.kicad_mod │ │ └── SolderWirePad_single_SMD_5x10mm.kicad_mod │ ├── pcb-top-plate-cache.lib │ ├── pcb-top-plate.pro │ └── pcb-top-plate.sch ├── Makefile ├── README ├── frame.scad └── frame-pcb.scad ├── .gitmodules ├── firmware ├── README ├── keymap_common.c ├── led.c ├── config.h ├── keymap_iso50.c ├── keymap_common.h ├── Makefile └── matrix.c ├── .gitignore ├── BUGS ├── README ├── LICENSE └── Makefile /firmware-pcb/keymap_iso50.c: -------------------------------------------------------------------------------- 1 | ../firmware/keymap_iso50.c -------------------------------------------------------------------------------- /firmware-pcb/tmk_keyboard: -------------------------------------------------------------------------------- 1 | ../firmware/tmk_keyboard -------------------------------------------------------------------------------- /firmware-pcb/keymap_common.c: -------------------------------------------------------------------------------- 1 | ../firmware/keymap_common.c -------------------------------------------------------------------------------- /hardware/pcb-main/pcb.dcm: -------------------------------------------------------------------------------- 1 | EESchema-DOCLIB Version 2.0 2 | # 3 | #End Doc Library 4 | -------------------------------------------------------------------------------- /hardware/pcb-main/pcb-cache.dcm: -------------------------------------------------------------------------------- 1 | EESchema-DOCLIB Version 2.0 2 | # 3 | #End Doc Library 4 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "firmware/tmk_keyboard"] 2 | path = firmware/tmk_keyboard 3 | url = https://github.com/tmk/tmk_keyboard.git 4 | -------------------------------------------------------------------------------- /hardware/pcb-main/fp-lib-table: -------------------------------------------------------------------------------- 1 | (fp_lib_table 2 | (lib (name footprints)(type KiCad)(uri "$(KIPRJMOD)/footprints.pretty")(options "")(descr "")) 3 | ) 4 | -------------------------------------------------------------------------------- /firmware/README: -------------------------------------------------------------------------------- 1 | Building firmware .hex file: 2 | 3 | $ make program 4 | 5 | 6 | Upload firmware to keyboard (press reset button): 7 | 8 | $ make teensy 9 | -------------------------------------------------------------------------------- /hardware/pcb-bottom-plate/fp-lib-table: -------------------------------------------------------------------------------- 1 | (fp_lib_table 2 | (lib (name footprints)(type KiCad)(uri "$(KIPRJMOD)/footprints.pretty")(options "")(descr "")) 3 | ) 4 | -------------------------------------------------------------------------------- /hardware/pcb-top-plate/fp-lib-table: -------------------------------------------------------------------------------- 1 | (fp_lib_table 2 | (lib (name footprints)(type KiCad)(uri "$(KIPRJMOD)/footprints.pretty")(options "")(descr "")) 3 | ) 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *~ 2 | \#* 3 | *bak 4 | *.pdf 5 | *.png 6 | *.stl 7 | *.eep 8 | *.elf 9 | *.hex 10 | *.lss 11 | *.map 12 | *.sym 13 | *.net 14 | .dep 15 | obj_*_lufa 16 | plot_files/ 17 | *autosave* 18 | gh-pages/ 19 | -------------------------------------------------------------------------------- /BUGS: -------------------------------------------------------------------------------- 1 | BUGS 2 | 3 | - The bottom label should be scaled to the correct size; however, 4 | Incscape crashes when trying to do this. 5 | 6 | - The stabilizer holes in the PCB version of the top plate are too 7 | short by about 0.5 mm. 8 | -------------------------------------------------------------------------------- /hardware/Makefile: -------------------------------------------------------------------------------- 1 | all: bottom-label-de.pdf frame.stl bottom-label-pcb-de.pdf frame-pcb.dxf 2 | 3 | %.pdf: %.svg 4 | inkscape --export-pdf $@ $< 5 | 6 | %.stl: %.scad %.dxf 7 | openscad -o $@ $< 8 | 9 | clean: 10 | rm -f *.pdf *.stl 11 | -------------------------------------------------------------------------------- /hardware/pcb-main/footprints.pretty/Spring-Contact_SMD.kicad_mod: -------------------------------------------------------------------------------- 1 | (module iso50:Spring-Contact_SMD (layer F.Cu) (tedit 57E62808) 2 | (fp_text reference W1 (at 0 3.81) (layer F.SilkS) 3 | (effects (font (size 1 1) (thickness 0.15))) 4 | ) 5 | (fp_text value TEST_1P (at 0 -3.048) (layer F.Fab) hide 6 | (effects (font (size 1 1) (thickness 0.15))) 7 | ) 8 | (pad 1 smd rect (at 0 0) (size 2.9 4.4) (layers F.Cu F.Paste F.Mask)) 9 | ) 10 | -------------------------------------------------------------------------------- /hardware/pcb-main/lib/mx1a-simple.lib: -------------------------------------------------------------------------------- 1 | EESchema-LIBRARY Version 2.3 Date: Fri 31 Aug 2012 06:07:28 PM CEST 2 | #encoding utf-8 3 | # 4 | # MX1A 5 | # 6 | DEF MX1A S 0 40 Y Y 1 F N 7 | F0 "S" -150 250 60 H V C CNN 8 | F1 "MX1A" 0 100 60 H V C CNN 9 | DRAW 10 | P 2 0 1 0 -100 150 50 250 N 11 | P 3 0 1 0 -200 300 -200 150 -100 150 N 12 | X ~ 1 -200 400 100 D 50 50 1 1 P 13 | X ~ 2 200 150 100 L 50 50 1 1 P 14 | ENDDRAW 15 | ENDDEF 16 | # 17 | #End Library 18 | -------------------------------------------------------------------------------- /hardware/pcb-top-plate/footprints.pretty/MountingHole_3mm.kicad_mod: -------------------------------------------------------------------------------- 1 | (module MountingHole_3mm (layer F.Cu) (tedit 57F7573F) 2 | (descr "Mounting Hole 3mm, no annular") 3 | (tags "mounting hole 3mm no annular") 4 | (fp_text reference REF** (at 0 -4) (layer F.SilkS) hide 5 | (effects (font (size 1 1) (thickness 0.15))) 6 | ) 7 | (fp_text value MountingHole_3mm (at 0 4) (layer F.Fab) hide 8 | (effects (font (size 1 1) (thickness 0.15))) 9 | ) 10 | (pad "" np_thru_hole circle (at 0 0) (size 3 3) (drill 3) (layers *.Cu *.Mask F.SilkS)) 11 | ) 12 | -------------------------------------------------------------------------------- /hardware/pcb-bottom-plate/footprints.pretty/MountingHole_3mm.kicad_mod: -------------------------------------------------------------------------------- 1 | (module MountingHole_3mm (layer F.Cu) (tedit 57F7573F) 2 | (descr "Mounting Hole 3mm, no annular") 3 | (tags "mounting hole 3mm no annular") 4 | (fp_text reference REF** (at 0 -4) (layer F.SilkS) hide 5 | (effects (font (size 1 1) (thickness 0.15))) 6 | ) 7 | (fp_text value MountingHole_3mm (at 0 4) (layer F.Fab) hide 8 | (effects (font (size 1 1) (thickness 0.15))) 9 | ) 10 | (pad "" np_thru_hole circle (at 0 0) (size 3 3) (drill 3) (layers *.Cu *.Mask F.SilkS)) 11 | ) 12 | -------------------------------------------------------------------------------- /hardware/pcb-bottom-plate/footprints.pretty/Clearing.kicad_mod: -------------------------------------------------------------------------------- 1 | (module Clearing (layer F.Cu) (tedit 57F8C140) 2 | (descr "Mounting Hole 2.2mm, no annular, M2") 3 | (tags "mounting hole 2.2mm no annular m2") 4 | (fp_text reference REF** (at 0 -3.2) (layer F.SilkS) hide 5 | (effects (font (size 1 1) (thickness 0.15))) 6 | ) 7 | (fp_text value Clearing (at 0 3.2) (layer F.Fab) hide 8 | (effects (font (size 1 1) (thickness 0.15))) 9 | ) 10 | (fp_circle (center 0 0) (end 2.2 0) (layer Cmts.User) (width 0.15)) 11 | (fp_circle (center 0 0) (end 2.45 0) (layer F.CrtYd) (width 0.05)) 12 | ) 13 | -------------------------------------------------------------------------------- /hardware/pcb-main/lib/aker.lib: -------------------------------------------------------------------------------- 1 | EESchema-LIBRARY Version 2.3 Date: Sat 07 Jan 2012 10:57:54 AM CET 2 | #encoding utf-8 3 | # 4 | # ASX4 5 | # 6 | DEF ASX4 X 0 40 N N 1 F N 7 | F0 "X" 0 -200 60 H V C CNN 8 | F1 "ASX4" 0 200 60 H V C CNN 9 | $FPLIST 10 | aker 11 | $ENDFPLIST 12 | DRAW 13 | S -150 150 150 -150 0 1 0 N 14 | P 2 0 1 16 -100 100 -100 -100 N 15 | P 2 0 1 16 100 100 100 -100 N 16 | P 5 0 1 12 -50 50 50 50 50 -50 -50 -50 -50 50 f 17 | X 1 1 -250 0 100 R 40 40 1 1 P 18 | X GND 2 -100 -250 100 U 50 50 1 1 W 19 | X 2 3 250 0 100 L 40 40 1 1 P 20 | X GND 4 100 -250 100 U 50 50 1 1 W 21 | ENDDRAW 22 | ENDDEF 23 | # 24 | #End Library 25 | -------------------------------------------------------------------------------- /hardware/pcb-top-plate/pcb-top-plate-cache.lib: -------------------------------------------------------------------------------- 1 | EESchema-LIBRARY Version 2.3 2 | #encoding utf-8 3 | # 4 | # GND 5 | # 6 | DEF GND #PWR 0 0 Y Y 1 F P 7 | F0 "#PWR" 0 -250 50 H I C CNN 8 | F1 "GND" 0 -150 50 H V C CNN 9 | F2 "" 0 0 50 H V C CNN 10 | F3 "" 0 0 50 H V C CNN 11 | DRAW 12 | P 6 0 1 0 0 0 0 -50 50 -50 0 -100 -50 -50 0 -50 N 13 | X GND 1 0 0 0 D 50 50 1 1 W N 14 | ENDDRAW 15 | ENDDEF 16 | # 17 | # TEST_1P 18 | # 19 | DEF TEST_1P W 0 30 N N 1 F N 20 | F0 "W" 0 270 50 H V C CNN 21 | F1 "TEST_1P" 0 200 50 H V C CNN 22 | F2 "" 200 0 50 H V C CNN 23 | F3 "" 200 0 50 H V C CNN 24 | DRAW 25 | C 0 130 30 0 1 0 N 26 | X 1 1 0 0 100 U 50 50 1 1 P 27 | ENDDRAW 28 | ENDDEF 29 | # 30 | #End Library 31 | -------------------------------------------------------------------------------- /hardware/pcb-bottom-plate/footprints.pretty/MountingHole_2.2mm_M2_Pad.kicad_mod: -------------------------------------------------------------------------------- 1 | (module MountingHole_2.2mm_M2_Pad (layer F.Cu) (tedit 57F78B8A) 2 | (descr "Mounting Hole 2.2mm, M2") 3 | (tags "mounting hole 2.2mm m2") 4 | (fp_text reference W9 (at 0 -3.2) (layer F.SilkS) hide 5 | (effects (font (size 1 1) (thickness 0.15))) 6 | ) 7 | (fp_text value TEST_1P (at 0 3.2) (layer F.Fab) hide 8 | (effects (font (size 1 1) (thickness 0.15))) 9 | ) 10 | (fp_circle (center 0 0) (end 2.2 0) (layer Cmts.User) (width 0.15)) 11 | (fp_circle (center 0 0) (end 2.45 0) (layer F.CrtYd) (width 0.05)) 12 | (pad 1 thru_hole circle (at 0 0) (size 4.4 4.4) (drill 2.2) (layers *.Cu *.Mask)) 13 | ) 14 | -------------------------------------------------------------------------------- /hardware/pcb-bottom-plate/pcb-bottom-plate-cache.lib: -------------------------------------------------------------------------------- 1 | EESchema-LIBRARY Version 2.3 2 | #encoding utf-8 3 | # 4 | # GND 5 | # 6 | DEF GND #PWR 0 0 Y Y 1 F P 7 | F0 "#PWR" 0 -250 50 H I C CNN 8 | F1 "GND" 0 -150 50 H V C CNN 9 | F2 "" 0 0 50 H V C CNN 10 | F3 "" 0 0 50 H V C CNN 11 | DRAW 12 | P 6 0 1 0 0 0 0 -50 50 -50 0 -100 -50 -50 0 -50 N 13 | X GND 1 0 0 0 D 50 50 1 1 W N 14 | ENDDRAW 15 | ENDDEF 16 | # 17 | # TEST_1P 18 | # 19 | DEF TEST_1P W 0 30 N N 1 F N 20 | F0 "W" 0 270 50 H V C CNN 21 | F1 "TEST_1P" 0 200 50 H V C CNN 22 | F2 "" 200 0 50 H V C CNN 23 | F3 "" 200 0 50 H V C CNN 24 | DRAW 25 | C 0 130 30 0 1 0 N 26 | X 1 1 0 0 100 U 50 50 1 1 P 27 | ENDDRAW 28 | ENDDEF 29 | # 30 | #End Library 31 | -------------------------------------------------------------------------------- /hardware/pcb-top-plate/footprints.pretty/MountingHole_2.2mm_M2_Pad.kicad_mod: -------------------------------------------------------------------------------- 1 | (module MountingHole_2.2mm_M2_Pad (layer F.Cu) (tedit 57F78B8A) 2 | (descr "Mounting Hole 2.2mm, M2") 3 | (tags "mounting hole 2.2mm m2") 4 | (fp_text reference W9 (at 0 -3.2) (layer F.SilkS) hide 5 | (effects (font (size 1 1) (thickness 0.15))) 6 | ) 7 | (fp_text value TEST_1P (at 0 3.2) (layer F.Fab) hide 8 | (effects (font (size 1 1) (thickness 0.15))) 9 | ) 10 | (fp_circle (center 0 0) (end 2.2 0) (layer Cmts.User) (width 0.15)) 11 | (fp_circle (center 0 0) (end 2.45 0) (layer F.CrtYd) (width 0.05)) 12 | (pad 1 thru_hole circle (at 0 0) (size 4.4 4.4) (drill 2.2) (layers *.Cu *.Mask)) 13 | ) 14 | -------------------------------------------------------------------------------- /hardware/pcb-top-plate/footprints.pretty/MountingHole_2.2mm_M2_Pad_Via.kicad_mod: -------------------------------------------------------------------------------- 1 | (module MountingHole_2.2mm_M2_Pad_Via (layer F.Cu) (tedit 57F78B8A) 2 | (descr "Mounting Hole 2.2mm, M2") 3 | (tags "mounting hole 2.2mm m2") 4 | (fp_text reference W9 (at 0 -3.2) (layer F.SilkS) hide 5 | (effects (font (size 1 1) (thickness 0.15))) 6 | ) 7 | (fp_text value TEST_1P (at 0 3.2) (layer F.Fab) hide 8 | (effects (font (size 1 1) (thickness 0.15))) 9 | ) 10 | (fp_circle (center 0 0) (end 2.2 0) (layer Cmts.User) (width 0.15)) 11 | (fp_circle (center 0 0) (end 2.45 0) (layer F.CrtYd) (width 0.05)) 12 | (pad 1 thru_hole circle (at 0 0) (size 4.4 4.4) (drill 2.2) (layers *.Cu *.Mask)) 13 | ) 14 | -------------------------------------------------------------------------------- /hardware/pcb-bottom-plate/footprints.pretty/MountingHole_2.2mm_M2_Pad_Via.kicad_mod: -------------------------------------------------------------------------------- 1 | (module MountingHole_2.2mm_M2_Pad_Via (layer F.Cu) (tedit 57F78B8A) 2 | (descr "Mounting Hole 2.2mm, M2") 3 | (tags "mounting hole 2.2mm m2") 4 | (fp_text reference W9 (at 0 -3.2) (layer F.SilkS) hide 5 | (effects (font (size 1 1) (thickness 0.15))) 6 | ) 7 | (fp_text value TEST_1P (at 0 3.2) (layer F.Fab) hide 8 | (effects (font (size 1 1) (thickness 0.15))) 9 | ) 10 | (fp_circle (center 0 0) (end 2.2 0) (layer Cmts.User) (width 0.15)) 11 | (fp_circle (center 0 0) (end 2.45 0) (layer F.CrtYd) (width 0.05)) 12 | (pad 1 thru_hole circle (at 0 0) (size 4.4 4.4) (drill 2.2) (layers *.Cu *.Mask)) 13 | ) 14 | -------------------------------------------------------------------------------- /hardware/pcb-main/footprints.pretty/MountingHole_4mm.kicad_mod: -------------------------------------------------------------------------------- 1 | (module Mounting_Holes:MountingHole_4mm (layer F.Cu) (tedit 57EFD29F) 2 | (descr "Mounting Hole 4mm, no annular") 3 | (tags "mounting hole 4mm no annular") 4 | (fp_text reference REF** (at 0 -5) (layer F.SilkS) hide 5 | (effects (font (size 1 1) (thickness 0.15))) 6 | ) 7 | (fp_text value MountingHole_4mm (at 0 5) (layer F.Fab) hide 8 | (effects (font (size 1 1) (thickness 0.15))) 9 | ) 10 | (fp_circle (center 0 0) (end 4 0) (layer Cmts.User) (width 0.15)) 11 | (fp_circle (center 0 0) (end 4.25 0) (layer F.CrtYd) (width 0.05)) 12 | (pad 1 np_thru_hole circle (at 0 0) (size 4 4) (drill 4) (layers *.Cu *.Mask F.SilkS)) 13 | ) 14 | -------------------------------------------------------------------------------- /hardware/pcb-main/footprints.pretty/MountingHole_5mm.kicad_mod: -------------------------------------------------------------------------------- 1 | (module Mounting_Holes:MountingHole_5mm (layer F.Cu) (tedit 57EFD443) 2 | (descr "Mounting Hole 5mm, no annular") 3 | (tags "mounting hole 5mm no annular") 4 | (fp_text reference REF** (at 0 -6) (layer F.SilkS) hide 5 | (effects (font (size 1 1) (thickness 0.15))) 6 | ) 7 | (fp_text value MountingHole_5mm (at 0 6) (layer F.Fab) hide 8 | (effects (font (size 1 1) (thickness 0.15))) 9 | ) 10 | (fp_circle (center 0 0) (end 5 0) (layer Cmts.User) (width 0.15)) 11 | (fp_circle (center 0 0) (end 5.25 0) (layer F.CrtYd) (width 0.05)) 12 | (pad 1 np_thru_hole circle (at 0 0) (size 5 5) (drill 5) (layers *.Cu *.Mask F.SilkS)) 13 | ) 14 | -------------------------------------------------------------------------------- /README: -------------------------------------------------------------------------------- 1 | ISO50 -- a 50% DIY computer keyboard 2 | 3 | 4 | There are two variants of the ISO50 keyboard: hand-wired and 5 | PCB-based. Files and directories that have "pcb" in their name are 6 | part of the PCB-based variant. 7 | 8 | The hardware part is covered in directory ./hardware. 9 | 10 | Firmware is based on TMK (https://github.com/tmk/tmk_keyboard); see 11 | directories ./firmware or ./firmware-pcb, respectively. 12 | 13 | 14 | http://imgur.com/a/XgsYZ 15 | http://imgur.com/a/m9RCg 16 | 17 | 18 | The name of this project refers to the standard 105-key ISO keyboard 19 | layout, reduced to 50 %. It is not related to anything using the 20 | photography-related connotation of the name. It is not affiliated 21 | with http://blog.iso50.com/. 22 | -------------------------------------------------------------------------------- /hardware/pcb-top-plate/footprints.pretty/Connector_B_5x10mm.kicad_mod: -------------------------------------------------------------------------------- 1 | (module Connector_B_5x10mm (layer F.Cu) (tedit 57F75378) 2 | (descr "Wire Pad, Square, SMD Pad, 5mm x 10mm,") 3 | (tags "MesurementPoint Square SMDPad 5mmx10mm ") 4 | (attr smd) 5 | (fp_text reference W2 (at 0 -3.81) (layer F.SilkS) 6 | (effects (font (size 1 1) (thickness 0.15))) 7 | ) 8 | (fp_text value TEST_1P (at 0 6.35) (layer F.Fab) hide 9 | (effects (font (size 1 1) (thickness 0.15))) 10 | ) 11 | (fp_line (start 2.75 -5.25) (end -2.75 -5.25) (layer F.CrtYd) (width 0.05)) 12 | (fp_line (start 2.75 5.25) (end 2.75 -5.25) (layer F.CrtYd) (width 0.05)) 13 | (fp_line (start -2.75 5.25) (end 2.75 5.25) (layer F.CrtYd) (width 0.05)) 14 | (fp_line (start -2.75 -5.25) (end -2.75 5.25) (layer F.CrtYd) (width 0.05)) 15 | (pad 1 connect rect (at 0 0) (size 5 10) (layers B.Cu B.Mask)) 16 | ) 17 | -------------------------------------------------------------------------------- /hardware/pcb-bottom-plate/footprints.pretty/Connector_B_5x10mm.kicad_mod: -------------------------------------------------------------------------------- 1 | (module Connector_B_5x10mm (layer F.Cu) (tedit 57F75378) 2 | (descr "Wire Pad, Square, SMD Pad, 5mm x 10mm,") 3 | (tags "MesurementPoint Square SMDPad 5mmx10mm ") 4 | (attr smd) 5 | (fp_text reference W2 (at 0 -3.81) (layer F.SilkS) 6 | (effects (font (size 1 1) (thickness 0.15))) 7 | ) 8 | (fp_text value TEST_1P (at 0 6.35) (layer F.Fab) hide 9 | (effects (font (size 1 1) (thickness 0.15))) 10 | ) 11 | (fp_line (start 2.75 -5.25) (end -2.75 -5.25) (layer F.CrtYd) (width 0.05)) 12 | (fp_line (start 2.75 5.25) (end 2.75 -5.25) (layer F.CrtYd) (width 0.05)) 13 | (fp_line (start -2.75 5.25) (end 2.75 5.25) (layer F.CrtYd) (width 0.05)) 14 | (fp_line (start -2.75 -5.25) (end -2.75 5.25) (layer F.CrtYd) (width 0.05)) 15 | (pad 1 connect rect (at 0 0) (size 5 10) (layers B.Cu B.Mask)) 16 | ) 17 | -------------------------------------------------------------------------------- /hardware/pcb-main/lib/dtsjw.lib: -------------------------------------------------------------------------------- 1 | EESchema-LIBRARY Version 2.3 Date: Sun 08 Jan 2012 02:19:28 PM CET 2 | #encoding utf-8 3 | # 4 | # DTSM-6 5 | # 6 | DEF DTSM-6 S 0 40 Y Y 1 L N 7 | F0 "S" -285 -100 50 V V L BNN 8 | F1 "DTSM-6" -185 125 50 V V L BNN 9 | F2 "switch-tact-DTSM-6" 0 150 50 H I C CNN 10 | DRAW 11 | P 2 1 0 0 -175 -75 -125 -75 N 12 | P 2 1 0 0 -175 0 -175 -75 N 13 | P 2 1 0 0 -175 0 -125 0 N 14 | P 2 1 0 0 -175 75 -175 0 N 15 | P 2 1 0 0 -175 75 -125 75 N 16 | P 2 1 0 0 -100 0 -75 0 N 17 | P 2 1 0 0 -50 0 -25 0 N 18 | P 2 1 0 0 0 -100 -50 75 N 19 | P 2 1 0 0 0 75 0 100 N 20 | P 2 1 0 0 100 -100 0 -100 N 21 | P 2 1 0 0 100 100 0 100 N 22 | C 0 -100 5 1 1 0 F 23 | C 0 100 5 1 1 0 F 24 | X 1 1 0 -200 100 U 40 40 1 1 P 25 | X 2 2 100 -200 100 U 40 40 1 1 P 26 | X 3 3 0 200 100 D 40 40 1 1 P 27 | X 4 4 100 200 100 D 40 40 1 1 P 28 | ENDDRAW 29 | ENDDEF 30 | # 31 | #End Library 32 | -------------------------------------------------------------------------------- /hardware/pcb-top-plate/footprints.pretty/SolderWirePad_single_SMD_5x10mm.kicad_mod: -------------------------------------------------------------------------------- 1 | (module Wire_Pads:SolderWirePad_single_SMD_5x10mm (layer F.Cu) (tedit 57F74E42) 2 | (descr "Wire Pad, Square, SMD Pad, 5mm x 10mm,") 3 | (tags "MesurementPoint Square SMDPad 5mmx10mm ") 4 | (attr smd) 5 | (fp_text reference W2 (at 0 -3.81) (layer F.SilkS) 6 | (effects (font (size 1 1) (thickness 0.15))) 7 | ) 8 | (fp_text value TEST_1P (at 0 6.35) (layer F.Fab) 9 | (effects (font (size 1 1) (thickness 0.15))) 10 | ) 11 | (fp_line (start 2.75 -5.25) (end -2.75 -5.25) (layer F.CrtYd) (width 0.05)) 12 | (fp_line (start 2.75 5.25) (end 2.75 -5.25) (layer F.CrtYd) (width 0.05)) 13 | (fp_line (start -2.75 5.25) (end 2.75 5.25) (layer F.CrtYd) (width 0.05)) 14 | (fp_line (start -2.75 -5.25) (end -2.75 5.25) (layer F.CrtYd) (width 0.05)) 15 | (pad 1 smd rect (at 0 0) (size 5 10) (layers B.Cu F.Paste F.Mask)) 16 | ) 17 | -------------------------------------------------------------------------------- /hardware/pcb-bottom-plate/footprints.pretty/SolderWirePad_single_SMD_5x10mm.kicad_mod: -------------------------------------------------------------------------------- 1 | (module Wire_Pads:SolderWirePad_single_SMD_5x10mm (layer F.Cu) (tedit 57F74E42) 2 | (descr "Wire Pad, Square, SMD Pad, 5mm x 10mm,") 3 | (tags "MesurementPoint Square SMDPad 5mmx10mm ") 4 | (attr smd) 5 | (fp_text reference W2 (at 0 -3.81) (layer F.SilkS) 6 | (effects (font (size 1 1) (thickness 0.15))) 7 | ) 8 | (fp_text value TEST_1P (at 0 6.35) (layer F.Fab) 9 | (effects (font (size 1 1) (thickness 0.15))) 10 | ) 11 | (fp_line (start 2.75 -5.25) (end -2.75 -5.25) (layer F.CrtYd) (width 0.05)) 12 | (fp_line (start 2.75 5.25) (end 2.75 -5.25) (layer F.CrtYd) (width 0.05)) 13 | (fp_line (start -2.75 5.25) (end 2.75 5.25) (layer F.CrtYd) (width 0.05)) 14 | (fp_line (start -2.75 -5.25) (end -2.75 5.25) (layer F.CrtYd) (width 0.05)) 15 | (pad 1 smd rect (at 0 0) (size 5 10) (layers B.Cu F.Paste F.Mask)) 16 | ) 17 | -------------------------------------------------------------------------------- /firmware/keymap_common.c: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2012,2013 Jun Wako 3 | 4 | This program is free software: you can redistribute it and/or modify 5 | it under the terms of the GNU General Public License as published by 6 | the Free Software Foundation, either version 2 of the License, or 7 | (at your option) any later version. 8 | 9 | This program is distributed in the hope that it will be useful, 10 | but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | GNU General Public License for more details. 13 | 14 | You should have received a copy of the GNU General Public License 15 | along with this program. If not, see . 16 | */ 17 | #include "keymap_common.h" 18 | 19 | 20 | /* translates key to keycode */ 21 | uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) 22 | { 23 | return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]); 24 | } 25 | 26 | /* translates Fn keycode to action */ 27 | action_t keymap_fn_to_action(uint8_t keycode) 28 | { 29 | return (action_t){ .code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]) }; 30 | } 31 | -------------------------------------------------------------------------------- /firmware-pcb/README: -------------------------------------------------------------------------------- 1 | The PCB version of the ISO50 has its diodes oriented in a way that is 2 | unusual for projects using TMK (cathodes connected to columns instead 3 | of rows); see file matrix.c. 4 | 5 | 6 | Building firmware .hex file: 7 | 8 | $ make program 9 | 10 | 11 | Upload firmware to keyboard (press reset button first): 12 | 13 | $ make dfu 14 | 15 | 16 | Suggested soldering points for connecting a USBasp programmer to an 17 | assembled board: 18 | 19 | ----------------------------------------- 20 | Pin m32U4 USBasp Soldering 21 | name pin pin point 22 | ----- --------------- ------ --------- 23 | RESET 13 5 SW1 24 | GND 5,15,23,43,35 8,10 SW1 25 | VCC 2,7,14,24,34,44 2 R4 26 | MOSI 10 1 column 7 27 | MISO 11 9 R10 28 | SCLK 9 7 column 6 29 | ----------------------------------------- 30 | 31 | 32 | Installing a bootloader: 33 | 34 | $ avrdude -c usbasp -pm32u4 -U flash:w:ATMega32U4-usbdevice_dfu-1_0_0.hex 35 | 36 | 37 | Setting fuses: 38 | 39 | $ avrdude -c usbasp -pm32u4 -U lfuse:w:0xff:m -U hfuse:w:0xd9:m -U efuse:w:0xf3:m 40 | -------------------------------------------------------------------------------- /hardware/pcb-main/lib/oupiin_usb.lib: -------------------------------------------------------------------------------- 1 | EESchema-LIBRARY Version 2.3 Date: Sat 07 Jan 2012 11:57:34 AM CET 2 | #encoding utf-8 3 | # 4 | # USB_2 5 | # 6 | DEF ~USB_2 J 0 40 Y Y 1 F N 7 | F0 "J" -75 250 60 H V C CNN 8 | F1 "USB_2" 50 -300 60 H I C CNN 9 | F4 "VCC" 325 150 50 H I C CNN "VCC" 10 | F5 "D+" 300 50 50 H I C CNN "Data+" 11 | F6 "D-" 300 -50 50 H I C CNN "Data-" 12 | F7 "GND" 325 -150 50 H I C CNN "Ground" 13 | DRAW 14 | T 900 -100 0 60 0 0 0 USB Normal 1 C C 15 | P 5 0 0 0 -150 200 0 200 0 -200 -150 -200 -150 -200 N 16 | X ~ 1 200 150 200 L 50 50 1 1 I 17 | X ~ 2 200 50 200 L 50 50 1 1 I 18 | X ~ 3 200 -50 200 L 50 50 1 1 I 19 | X ~ 4 200 -150 200 L 50 50 1 1 I 20 | ENDDRAW 21 | ENDDEF 22 | # 23 | # USBMINI_B05 24 | # 25 | DEF ~USBMINI_B05 J 0 40 Y Y 1 F N 26 | F0 "J" -75 300 60 H V C CNN 27 | F1 "USBMINI_B05" -50 -350 60 H I C CNN 28 | DRAW 29 | T 900 -200 0 60 0 0 0 USB Normal 1 C C 30 | P 4 0 1 0 -300 250 0 250 0 -250 -300 -250 N 31 | X VBUS 1 200 200 200 L 50 50 1 1 w 32 | X D- 2 200 100 200 L 50 50 1 1 B 33 | X D+ 3 200 0 200 L 50 50 1 1 B 34 | X ID 4 200 -100 200 L 50 50 1 1 w 35 | X GND 5 200 -200 200 L 50 50 1 1 I 36 | ENDDRAW 37 | ENDDEF 38 | # 39 | #End Library 40 | -------------------------------------------------------------------------------- /hardware/pcb-main/footprints.pretty/SW_PUSH_SMALL.kicad_mod: -------------------------------------------------------------------------------- 1 | (module Buttons_Switches_ThroughHole:SW_PUSH_SMALL (layer F.Cu) (tedit 57EFD645) 2 | (fp_text reference SW1 (at 4.73075 -0.1905 -270) (layer F.SilkS) 3 | (effects (font (size 1 1) (thickness 0.15))) 4 | ) 5 | (fp_text value SW_PUSH (at 0 1.016) (layer F.Fab) 6 | (effects (font (size 1 1) (thickness 0.15))) 7 | ) 8 | (fp_circle (center 0 0) (end 0 -2.54) (layer F.SilkS) (width 0.15)) 9 | (fp_line (start -3.81 -3.81) (end 3.81 -3.81) (layer F.SilkS) (width 0.15)) 10 | (fp_line (start 3.81 -3.81) (end 3.81 3.81) (layer F.SilkS) (width 0.15)) 11 | (fp_line (start 3.81 3.81) (end -3.81 3.81) (layer F.SilkS) (width 0.15)) 12 | (fp_line (start -3.81 -3.81) (end -3.81 3.81) (layer F.SilkS) (width 0.15)) 13 | (pad 1 thru_hole circle (at 3.81 -2.54) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) 14 | (pad 2 thru_hole circle (at 3.81 2.54) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) 15 | (pad 1 thru_hole circle (at -3.81 -2.54) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) 16 | (pad 2 thru_hole circle (at -3.81 2.54) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) 17 | ) 18 | -------------------------------------------------------------------------------- /hardware/pcb-main/footprints.pretty/C_1206_HandSoldering.kicad_mod: -------------------------------------------------------------------------------- 1 | (module Capacitors_SMD1:C_1206_HandSoldering (layer F.Cu) (tedit 541A9C03) 2 | (descr "Capacitor SMD 1206, hand soldering") 3 | (tags "capacitor 1206") 4 | (attr smd) 5 | (fp_text reference C8 (at 0 -2.3) (layer F.SilkS) 6 | (effects (font (size 1 1) (thickness 0.15))) 7 | ) 8 | (fp_text value 100n (at 0 2.3) (layer F.Fab) 9 | (effects (font (size 1 1) (thickness 0.15))) 10 | ) 11 | (fp_line (start -3.3 -1.15) (end 3.3 -1.15) (layer F.CrtYd) (width 0.05)) 12 | (fp_line (start -3.3 1.15) (end 3.3 1.15) (layer F.CrtYd) (width 0.05)) 13 | (fp_line (start -3.3 -1.15) (end -3.3 1.15) (layer F.CrtYd) (width 0.05)) 14 | (fp_line (start 3.3 -1.15) (end 3.3 1.15) (layer F.CrtYd) (width 0.05)) 15 | (fp_line (start 1 -1.025) (end -1 -1.025) (layer F.SilkS) (width 0.15)) 16 | (fp_line (start -1 1.025) (end 1 1.025) (layer F.SilkS) (width 0.15)) 17 | (pad 1 smd rect (at -2 0) (size 2 1.6) (layers F.Cu F.Paste F.Mask)) 18 | (pad 2 smd rect (at 2 0) (size 2 1.6) (layers F.Cu F.Paste F.Mask)) 19 | (model Capacitors_SMD.3dshapes/C_1206_HandSoldering.wrl 20 | (at (xyz 0 0 0)) 21 | (scale (xyz 1 1 1)) 22 | (rotate (xyz 0 0 0)) 23 | ) 24 | ) 25 | -------------------------------------------------------------------------------- /hardware/pcb-main/footprints.pretty/MXDIODE.kicad_mod: -------------------------------------------------------------------------------- 1 | (module iso50:MXDIODE (layer F.Cu) (tedit 57DAC86E) 2 | (fp_text reference U30 (at -4.826 9.2075) (layer F.SilkS) hide 3 | (effects (font (thickness 0.3048))) 4 | ) 5 | (fp_text value MX-DI (at -5.08 -8.89) (layer F.SilkS) hide 6 | (effects (font (thickness 0.3048))) 7 | ) 8 | (fp_line (start -7.62 -7.62) (end 7.62 -7.62) (layer F.SilkS) (width 0.381)) 9 | (fp_line (start 7.62 -7.62) (end 7.62 7.62) (layer F.SilkS) (width 0.381)) 10 | (fp_line (start 7.62 7.62) (end -7.62 7.62) (layer F.SilkS) (width 0.381)) 11 | (fp_line (start -7.62 7.62) (end -7.62 -7.62) (layer F.SilkS) (width 0.381)) 12 | (pad 4 thru_hole circle (at 3.81 5.08) (size 2 2) (drill 1) (layers *.Cu *.Mask)) 13 | (pad 3 thru_hole circle (at -3.81 5.08) (size 2 2) (drill 1) (layers *.Cu *.Mask)) 14 | (pad "" np_thru_hole circle (at 0 0) (size 4 4) (drill 4) (layers *.Cu *.Mask)) 15 | (pad 2 thru_hole circle (at 2.54 -5.08) (size 2.49936 2.49936) (drill 1.50114) (layers *.Cu *.Mask)) 16 | (pad 1 thru_hole circle (at -3.81 -2.54) (size 2.49936 2.49936) (drill 1.50114) (layers *.Cu *.Mask)) 17 | (model ${KIPRJMOD}/lib/mx1a.pretty/cherrymx.wrl 18 | (at (xyz 0 0 0)) 19 | (scale (xyz 1 1 1)) 20 | (rotate (xyz 0 0 0)) 21 | ) 22 | ) 23 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2016 Bert Burgemeister 2 | 3 | The ./firmware/ directory contains code published under GPL. 4 | Everything else is published under 5 | 6 | The MIT License 7 | 8 | Permission is hereby granted, free of charge, to any person obtaining 9 | a copy of this software and associated documentation files (the 10 | "Software"), to deal in the Software without restriction, including 11 | without limitation the rights to use, copy, modify, merge, publish, 12 | distribute, sublicense, and/or sell copies of the Software, and to 13 | permit persons to whom the Software is furnished to do so, subject to 14 | the following conditions: 15 | 16 | The above copyright notice and this permission notice shall be 17 | included in all copies or substantial portions of the Software. 18 | 19 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 21 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 23 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 24 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 25 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 26 | -------------------------------------------------------------------------------- /hardware/pcb-main/footprints.pretty/Resistor_Horizontal_RM7mm.kicad_mod: -------------------------------------------------------------------------------- 1 | (module Resistors_ThroughHole:Resistor_Horizontal_RM7mm (layer F.Cu) (tedit 57EFD5D6) 2 | (descr "Resistor, Axial, RM 7.62mm, 1/3W,") 3 | (tags "Resistor Axial RM 7.62mm 1/3W R3") 4 | (fp_text reference R7 (at -0.508 2.159) (layer F.SilkS) 5 | (effects (font (size 1 1) (thickness 0.15))) 6 | ) 7 | (fp_text value 330 (at 3.81 3.81) (layer F.Fab) 8 | (effects (font (size 1 1) (thickness 0.15))) 9 | ) 10 | (fp_line (start -1.25 -1.5) (end 8.85 -1.5) (layer F.CrtYd) (width 0.05)) 11 | (fp_line (start -1.25 1.5) (end -1.25 -1.5) (layer F.CrtYd) (width 0.05)) 12 | (fp_line (start 8.85 -1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05)) 13 | (fp_line (start -1.25 1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05)) 14 | (fp_line (start 1.27 -1.27) (end 6.35 -1.27) (layer F.SilkS) (width 0.15)) 15 | (fp_line (start 6.35 -1.27) (end 6.35 1.27) (layer F.SilkS) (width 0.15)) 16 | (fp_line (start 6.35 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15)) 17 | (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15)) 18 | (pad 1 thru_hole circle (at 0 0) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)) 19 | (pad 2 thru_hole circle (at 7.62 0) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)) 20 | ) 21 | -------------------------------------------------------------------------------- /hardware/pcb-top-plate/pcb-top-plate.pro: -------------------------------------------------------------------------------- 1 | update=Thu 6 Oct 15:17:59 2016 2 | version=1 3 | last_client=kicad 4 | [pcbnew] 5 | version=1 6 | LastNetListRead= 7 | UseCmpFile=1 8 | PadDrill=0.600000000000 9 | PadDrillOvalY=0.600000000000 10 | PadSizeH=1.500000000000 11 | PadSizeV=1.500000000000 12 | PcbTextSizeV=1.500000000000 13 | PcbTextSizeH=1.500000000000 14 | PcbTextThickness=0.300000000000 15 | ModuleTextSizeV=1.000000000000 16 | ModuleTextSizeH=1.000000000000 17 | ModuleTextSizeThickness=0.150000000000 18 | SolderMaskClearance=0.000000000000 19 | SolderMaskMinWidth=0.000000000000 20 | DrawSegmentWidth=0.200000000000 21 | BoardOutlineThickness=0.100000000000 22 | ModuleOutlineThickness=0.150000000000 23 | [cvpcb] 24 | version=1 25 | NetIExt=net 26 | [eeschema] 27 | version=1 28 | LibDir= 29 | [eeschema/libraries] 30 | LibName1=power 31 | LibName2=device 32 | LibName3=transistors 33 | LibName4=conn 34 | LibName5=linear 35 | LibName6=regul 36 | LibName7=74xx 37 | LibName8=cmos4000 38 | LibName9=adc-dac 39 | LibName10=memory 40 | LibName11=xilinx 41 | LibName12=microcontrollers 42 | LibName13=dsp 43 | LibName14=microchip 44 | LibName15=analog_switches 45 | LibName16=motorola 46 | LibName17=texas 47 | LibName18=intel 48 | LibName19=audio 49 | LibName20=interface 50 | LibName21=digital-audio 51 | LibName22=philips 52 | LibName23=display 53 | LibName24=cypress 54 | LibName25=siliconi 55 | LibName26=opto 56 | LibName27=atmel 57 | LibName28=contrib 58 | LibName29=valves 59 | [general] 60 | version=1 61 | -------------------------------------------------------------------------------- /hardware/pcb-bottom-plate/pcb-bottom-plate.pro: -------------------------------------------------------------------------------- 1 | update=Sat 8 Oct 07:05:29 2016 2 | version=1 3 | last_client=kicad 4 | [pcbnew] 5 | version=1 6 | LastNetListRead= 7 | UseCmpFile=1 8 | PadDrill=0.600000000000 9 | PadDrillOvalY=0.600000000000 10 | PadSizeH=1.500000000000 11 | PadSizeV=1.500000000000 12 | PcbTextSizeV=1.500000000000 13 | PcbTextSizeH=1.500000000000 14 | PcbTextThickness=0.300000000000 15 | ModuleTextSizeV=1.000000000000 16 | ModuleTextSizeH=1.000000000000 17 | ModuleTextSizeThickness=0.150000000000 18 | SolderMaskClearance=0.000000000000 19 | SolderMaskMinWidth=0.000000000000 20 | DrawSegmentWidth=0.200000000000 21 | BoardOutlineThickness=0.100000000000 22 | ModuleOutlineThickness=0.150000000000 23 | [cvpcb] 24 | version=1 25 | NetIExt=net 26 | [eeschema] 27 | version=1 28 | LibDir= 29 | [eeschema/libraries] 30 | LibName1=power 31 | LibName2=device 32 | LibName3=transistors 33 | LibName4=conn 34 | LibName5=linear 35 | LibName6=regul 36 | LibName7=74xx 37 | LibName8=cmos4000 38 | LibName9=adc-dac 39 | LibName10=memory 40 | LibName11=xilinx 41 | LibName12=microcontrollers 42 | LibName13=dsp 43 | LibName14=microchip 44 | LibName15=analog_switches 45 | LibName16=motorola 46 | LibName17=texas 47 | LibName18=intel 48 | LibName19=audio 49 | LibName20=interface 50 | LibName21=digital-audio 51 | LibName22=philips 52 | LibName23=display 53 | LibName24=cypress 54 | LibName25=siliconi 55 | LibName26=opto 56 | LibName27=atmel 57 | LibName28=contrib 58 | LibName29=valves 59 | [general] 60 | version=1 61 | -------------------------------------------------------------------------------- /hardware/pcb-main/pcb.pro: -------------------------------------------------------------------------------- 1 | update=Fri 28 Oct 17:58:57 2016 2 | version=1 3 | last_client=kicad 4 | [cvpcb] 5 | version=1 6 | NetIExt=net 7 | [general] 8 | version=1 9 | [eeschema] 10 | version=1 11 | LibDir= 12 | [eeschema/libraries] 13 | LibName1=power 14 | LibName2=device 15 | LibName3=transistors 16 | LibName4=conn 17 | LibName5=linear 18 | LibName6=regul 19 | LibName7=74xx 20 | LibName8=cmos4000 21 | LibName9=adc-dac 22 | LibName10=memory 23 | LibName11=xilinx 24 | LibName12=microcontrollers 25 | LibName13=dsp 26 | LibName14=microchip 27 | LibName15=analog_switches 28 | LibName16=motorola 29 | LibName17=texas 30 | LibName18=intel 31 | LibName19=audio 32 | LibName20=interface 33 | LibName21=digital-audio 34 | LibName22=philips 35 | LibName23=display 36 | LibName24=cypress 37 | LibName25=siliconi 38 | LibName26=opto 39 | LibName27=atmel 40 | LibName28=contrib 41 | LibName29=valves 42 | [pcbnew] 43 | version=1 44 | PageLayoutDescrFile= 45 | LastNetListRead= 46 | PadDrill=0.762 47 | PadDrillOvalY=0.762 48 | PadSizeH=1.524 49 | PadSizeV=1.524 50 | PcbTextSizeV=1.5 51 | PcbTextSizeH=1.5 52 | PcbTextThickness=0.3 53 | ModuleTextSizeV=1 54 | ModuleTextSizeH=1 55 | ModuleTextSizeThickness=0.15 56 | SolderMaskClearance=0.2 57 | SolderMaskMinWidth=0 58 | DrawSegmentWidth=0.2 59 | BoardOutlineThickness=0.15 60 | ModuleOutlineThickness=0.15 61 | [schematic_editor] 62 | version=1 63 | PageLayoutDescrFile= 64 | PlotDirectoryName= 65 | SubpartIdSeparator=0 66 | SubpartFirstId=65 67 | NetFmtName= 68 | SpiceForceRefPrefix=0 69 | SpiceUseNetNumbers=0 70 | LabSize=60 71 | ERC_TestSimilarLabels=1 72 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | # Push the gh-pagesd www directory to Github Pages 2 | 3 | gh-pages: 4 | rm -rf gh-pages 5 | mkdir gh-pages 6 | cp hardware/bottom-label-de.svg gh-pages/ 7 | cp hardware/bottom-label-pcb-de.svg gh-pages/ 8 | (cd hardware; $(MAKE) frame.stl frame-pcb.stl) 9 | cp hardware/frame.stl gh-pages/ 10 | cp hardware/frame-pcb.stl gh-pages/ 11 | cp hardware/top-plate.dxf gh-pages/ 12 | cp hardware/top-plate-pcb.dxf gh-pages/ 13 | cp hardware/pcb-top-plate/plot_files/pcb-top-plate.zip gh-pages/ 14 | -cp hardware/pcb-top-plate/plot_files/pcb-top-plate.pdf gh-pages/ 15 | -cp hardware/pcb-top-plate/plot_files/pcb-top-plate-brd.svg gh-pages/ 16 | cp hardware/pcb-main/plot_files/pcb-main.zip gh-pages/ 17 | -cp hardware/pcb-main/plot_files/pcb-main.pdf gh-pages/ 18 | -cp hardware/pcb-main/plot_files/pcb-main-brd.svg gh-pages/ 19 | cp hardware/bottom-plate.dxf gh-pages/ 20 | cp hardware/bottom-plate-pcb.dxf gh-pages/ 21 | (cd firmware; $(MAKE) program) 22 | cp firmware/iso50_lufa.hex gh-pages/iso50-lufa.hex 23 | (cd firmware-pcb; $(MAKE) program) 24 | cp firmware-pcb/iso50_lufa.hex gh-pages/iso50-lufa-pcb.hex 25 | echo '

Generated files for project ISO50

' > gh-pages/index.html 26 | ls gh-pages | \ 27 | grep -v index.html | \ 28 | sed -e 's/^\(.*\)$$/\1<\/a>
/' >> gh-pages/index.html 29 | 30 | publish: gh-pages 31 | (cd gh-pages; \ 32 | git init; \ 33 | git add ./; \ 34 | git commit -a -m "gh-pages pseudo commit"; \ 35 | git push git@github.com:trebb/iso50.git +master:gh-pages) 36 | 37 | clean: 38 | rm -rf gh-pages 39 | -------------------------------------------------------------------------------- /firmware/led.c: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2012 Jun Wako 3 | 4 | This program is free software: you can redistribute it and/or modify 5 | it under the terms of the GNU General Public License as published by 6 | the Free Software Foundation, either version 2 of the License, or 7 | (at your option) any later version. 8 | 9 | This program is distributed in the hope that it will be useful, 10 | but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | GNU General Public License for more details. 13 | 14 | You should have received a copy of the GNU General Public License 15 | along with this program. If not, see . 16 | */ 17 | 18 | #include 19 | #include "stdint.h" 20 | #include "led.h" 21 | 22 | /* 23 | * LED pin configuration 24 | * LED: NumLock ScrollLock CapsLock 25 | * pin: B4 D7 D4, (D6, on-board LED) 26 | */ 27 | 28 | void 29 | led_set(uint8_t usb_led) 30 | { 31 | if (usb_led & (1< 3 | 4 | This program is free software: you can redistribute it and/or modify 5 | it under the terms of the GNU General Public License as published by 6 | the Free Software Foundation, either version 2 of the License, or 7 | (at your option) any later version. 8 | 9 | This program is distributed in the hope that it will be useful, 10 | but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | GNU General Public License for more details. 13 | 14 | You should have received a copy of the GNU General Public License 15 | along with this program. If not, see . 16 | */ 17 | 18 | #ifndef CONFIG_H 19 | #define CONFIG_H 20 | 21 | 22 | /* USB Device descriptor parameter */ 23 | #define VENDOR_ID 0x1209 24 | #define PRODUCT_ID 0x5050 25 | /* (Thanks to http://pid.codes) */ 26 | #define DEVICE_VER 0x0001 27 | #define MANUFACTURER trebb 28 | #define PRODUCT ISO50 29 | #define DESCRIPTION TMK keyboard firmware for ISO50 30 | 31 | /* key matrix size */ 32 | #define MATRIX_ROWS 4 33 | #define MATRIX_COLS 13 34 | 35 | /* define if matrix has ghost */ 36 | //#define MATRIX_HAS_GHOST 37 | 38 | /* Set 0 if debouncing isn't needed */ 39 | #define DEBOUNCE 5 40 | 41 | /* 42 | * Feature disable options 43 | * These options are also useful to firmware size reduction. 44 | */ 45 | 46 | /* disable debug print */ 47 | #define NO_DEBUG 48 | 49 | /* disable print */ 50 | #define NO_PRINT 51 | 52 | /* disable action features */ 53 | //#define NO_ACTION_LAYER 54 | //#define NO_ACTION_TAPPING 55 | #define NO_ACTION_ONESHOT 56 | #define NO_ACTION_MACRO 57 | //#define NO_ACTION_FUNCTION 58 | 59 | #endif 60 | -------------------------------------------------------------------------------- /firmware-pcb/config.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2012 Jun Wako 3 | 4 | This program is free software: you can redistribute it and/or modify 5 | it under the terms of the GNU General Public License as published by 6 | the Free Software Foundation, either version 2 of the License, or 7 | (at your option) any later version. 8 | 9 | This program is distributed in the hope that it will be useful, 10 | but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | GNU General Public License for more details. 13 | 14 | You should have received a copy of the GNU General Public License 15 | along with this program. If not, see . 16 | */ 17 | 18 | #ifndef CONFIG_H 19 | #define CONFIG_H 20 | 21 | 22 | /* USB Device descriptor parameter */ 23 | #define VENDOR_ID 0x1209 24 | #define PRODUCT_ID 0x5050 25 | /* (Thanks to http://pid.codes) */ 26 | #define DEVICE_VER 0x0001 27 | #define MANUFACTURER trebb 28 | #define PRODUCT ISO50 29 | #define DESCRIPTION TMK keyboard firmware for ISO50 30 | 31 | /* key matrix size */ 32 | #define MATRIX_ROWS 4 33 | #define MATRIX_COLS 14 34 | 35 | /* define if matrix has ghost */ 36 | //#define MATRIX_HAS_GHOST 37 | 38 | /* Set 0 if debouncing isn't needed */ 39 | #define DEBOUNCE 5 40 | 41 | /* 42 | * Feature disable options 43 | * These options are also useful to firmware size reduction. 44 | */ 45 | 46 | /* disable debug print */ 47 | #define NO_DEBUG 48 | 49 | /* disable print */ 50 | #define NO_PRINT 51 | 52 | /* disable action features */ 53 | //#define NO_ACTION_LAYER 54 | //#define NO_ACTION_TAPPING 55 | #define NO_ACTION_ONESHOT 56 | #define NO_ACTION_MACRO 57 | //#define NO_ACTION_FUNCTION 58 | 59 | #endif 60 | -------------------------------------------------------------------------------- /firmware-pcb/led.c: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2012 Jun Wako 3 | 4 | This program is free software: you can redistribute it and/or modify 5 | it under the terms of the GNU General Public License as published by 6 | the Free Software Foundation, either version 2 of the License, or 7 | (at your option) any later version. 8 | 9 | This program is distributed in the hope that it will be useful, 10 | but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | GNU General Public License for more details. 13 | 14 | You should have received a copy of the GNU General Public License 15 | along with this program. If not, see . 16 | */ 17 | 18 | #include 19 | #include "stdint.h" 20 | #include "led.h" 21 | 22 | /* 23 | * LED pin configuration 24 | * LED: NumLock CapsLock ScrollLock 25 | * pin: D3, D5 D1, D2 B3, E6 26 | */ 27 | 28 | void 29 | led_set(uint8_t usb_led) 30 | { 31 | if (usb_led & (1<event.pressed) { 47 | add_mods(MOD_BIT(KC_RALT)); 48 | layer_on(4); 49 | } else { 50 | del_mods(MOD_BIT(KC_RALT)); 51 | layer_off(4); 52 | } 53 | break; 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /firmware/keymap_common.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2012,2013 Jun Wako 3 | 4 | This program is free software: you can redistribute it and/or modify 5 | it under the terms of the GNU General Public License as published by 6 | the Free Software Foundation, either version 2 of the License, or 7 | (at your option) any later version. 8 | 9 | This program is distributed in the hope that it will be useful, 10 | but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | GNU General Public License for more details. 13 | 14 | You should have received a copy of the GNU General Public License 15 | along with this program. If not, see . 16 | */ 17 | #ifndef KEYMAP_COMMON_H 18 | #define KEYMAP_COMMON_H 19 | 20 | #include 21 | #include 22 | #include 23 | #include "action_layer.h" 24 | #include "action_util.h" 25 | 26 | 27 | extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; 28 | extern const uint16_t fn_actions[]; 29 | 30 | 31 | /* ISO50 keymap definition macro 32 | * Layout: 52key 33 | * ,-----------------------------------------------------------. 34 | * |Esc | Q| W| E| R| T| Y| U| I| O| P| [| ]| | 35 | * |------------------------------------------------------.En- | 36 | * |Tab | A| S| D| F| G| H| J| K| L| ;| '| #|ter | 37 | * |-----------------------------------------------------------| 38 | * |Shft| \| Z| X| C| V| B| N| M| ,| .| /|Shift|Bksp| 39 | * |-----------------------------------------------------------| 40 | * |Ctrl|Supr| Alt | Num | Nav | Rat|AltGr|Super|Menu|Ctrl| 41 | * `-----------------------------------------------------------' 42 | */ 43 | #define KEYMAP( \ 44 | K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, \ 45 | K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K37, \ 46 | K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K36, \ 47 | K30, K31, K32, K33, K34, K38, K39, K3A, K3B, K3C, K35 \ 48 | ) { \ 49 | { KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07, KC_##K08, KC_##K09, KC_##K0A, KC_##K0B, KC_##K0C }, \ 50 | { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17, KC_##K18, KC_##K19, KC_##K1A, KC_##K1B, KC_##K1C }, \ 51 | { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27, KC_##K28, KC_##K29, KC_##K2A, KC_##K2B, KC_##K2C }, \ 52 | { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37, KC_##K38, KC_##K39, KC_##K3A, KC_##K3B, KC_##K3C } \ 53 | } 54 | 55 | #endif 56 | -------------------------------------------------------------------------------- /firmware-pcb/keymap_common.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2012,2013 Jun Wako 3 | 4 | This program is free software: you can redistribute it and/or modify 5 | it under the terms of the GNU General Public License as published by 6 | the Free Software Foundation, either version 2 of the License, or 7 | (at your option) any later version. 8 | 9 | This program is distributed in the hope that it will be useful, 10 | but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | GNU General Public License for more details. 13 | 14 | You should have received a copy of the GNU General Public License 15 | along with this program. If not, see . 16 | */ 17 | #ifndef KEYMAP_COMMON_H 18 | #define KEYMAP_COMMON_H 19 | 20 | #include 21 | #include 22 | #include 23 | #include "action_layer.h" 24 | #include "action_util.h" 25 | 26 | 27 | extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; 28 | extern const uint16_t fn_actions[]; 29 | 30 | 31 | /* ISO50 keymap definition macro 32 | * Layout: 52key 33 | * ,-----------------------------------------------------------. 34 | * |Esc | Q| W| E| R| T| Y| U| I| O| P| [| ]| | 35 | * |------------------------------------------------------.En- | 36 | * |Tab | A| S| D| F| G| H| J| K| L| ;| '| #|ter | 37 | * |-----------------------------------------------------------| 38 | * |Shft| \| Z| X| C| V| B| N| M| ,| .| /|Shift|Bksp| 39 | * |-----------------------------------------------------------| 40 | * |Ctrl|Supr| Alt | Num | Nav | Rat|AltGr|Super|Menu|Ctrl| 41 | * `-----------------------------------------------------------' 42 | */ 43 | #define KEYMAP( \ 44 | K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, \ 45 | K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \ 46 | K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, \ 47 | K30, K31, K32, K34, K35, K37, K38, K3A, K3B, K3C, K3D \ 48 | ) { \ 49 | { KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07, KC_##K08, KC_##K09, KC_##K0A, KC_##K0B, KC_##K0C, KC_NO }, \ 50 | { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17, KC_##K18, KC_##K19, KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D }, \ 51 | { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27, KC_##K28, KC_##K29, KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D }, \ 52 | { KC_##K30, KC_##K31, KC_##K32, KC_NO, KC_##K34, KC_##K35, KC_NO, KC_##K37, KC_##K38, KC_NO, KC_##K3A, KC_##K3B, KC_##K3C, KC_##K3D } \ 53 | } 54 | 55 | #endif 56 | -------------------------------------------------------------------------------- /hardware/frame.scad: -------------------------------------------------------------------------------- 1 | h_key = dxf_dim(file="frame.dxf", name="key", 2 | layer="side-view", origin=[0, 0], scale=1); 3 | h_top_plate = dxf_dim(file="frame.dxf", name="tpl", 4 | layer="side-view", origin=[0, 0], scale=1); 5 | h_mid = dxf_dim(file="frame.dxf", name="mid", 6 | layer="side-view", origin=[0, 0], scale=1); 7 | h_bottom_plate = dxf_dim(file="frame.dxf", name="bpl", 8 | layer="side-view", origin=[0, 0], scale=1); 9 | h_label_clearance = dxf_dim(file="frame.dxf", name="lbl", 10 | layer="side-view", origin=[0, 0], scale=1); 11 | x0_cable = dxf_dim(file="frame.dxf", name="x0cable", 12 | layer="cable", origin=[0, 0], scale=1); 13 | y0_cable = dxf_dim(file="frame.dxf", name="y0cable", 14 | layer="cable", origin=[0, 0], scale=1); 15 | delta_cx = dxf_dim(file="frame.dxf", name="delta_cx", 16 | layer="cable", origin=[0, 0], scale=1); 17 | delta_cy = dxf_dim(file="frame.dxf", name="delta_cy", 18 | layer="cable", origin=[0, 0], scale=1); 19 | epsilon = 1; 20 | 21 | difference() { 22 | union() { 23 | difference() { 24 | hull() { 25 | color("green", $fs = 0.2, $fa = 2) { 26 | rotate_extrude() { 27 | import (file = "frame.dxf", layer = "outline-profile"); 28 | } 29 | translate([delta_cx, 0, 0]) { 30 | rotate_extrude() { 31 | import (file = "frame.dxf", layer = "outline-profile"); 32 | } 33 | } 34 | translate([delta_cx, delta_cy, 0]) { 35 | rotate_extrude() { 36 | import (file = "frame.dxf", layer = "outline-profile"); 37 | } 38 | } 39 | translate([0, delta_cy, 0]) { 40 | rotate_extrude() { 41 | import (file = "frame.dxf", layer = "outline-profile"); 42 | } 43 | } 44 | } 45 | } 46 | color("red") { 47 | translate([0, 0, -h_bottom_plate - h_label_clearance - epsilon]) { 48 | linear_extrude(height = h_key + h_top_plate + h_mid + h_bottom_plate + h_label_clearance + 2 * epsilon) { 49 | import (file = "frame.dxf", layer = "outline"); 50 | } 51 | } 52 | } 53 | } 54 | translate([0, 0, -h_bottom_plate]) { 55 | linear_extrude(height = h_bottom_plate + h_mid + h_top_plate) { 56 | import (file = "frame.dxf", layer = "hooks"); 57 | } 58 | } 59 | translate([0, 0, 0]) { 60 | linear_extrude(height = h_mid) { 61 | import (file = "frame.dxf", layer = "plate-support"); 62 | } 63 | } 64 | } 65 | color("cyan", $fs = 0.2, $fa = 2) { 66 | translate([x0_cable, y0_cable, 0]) { 67 | rotate([-90, 0, 0]) { 68 | rotate_extrude() { 69 | import (file = "frame.dxf", layer = "cable-shape"); 70 | } 71 | } 72 | } 73 | } 74 | translate([delta_cx - x0_cable, y0_cable + 2, (h_label_clearance + h_bottom_plate + h_mid + h_top_plate + h_key) / 2 - (h_label_clearance + h_bottom_plate)]) { 75 | rotate([90, 0, 180]) { 76 | linear_extrude(height = 5) { 77 | text("ISO50", halign = "right", valign = "center", font = "DejaVu Sans:style=Bold", size = 6, spacing = 1.1); 78 | } 79 | } 80 | } 81 | translate([x0_cable, y0_cable + 15, 0]) { 82 | rotate([90, 0, 0]) { 83 | linear_extrude(height = 30) { 84 | import (file = "frame.dxf", layer = "cable-chamfer"); 85 | } 86 | } 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /hardware/frame-pcb.scad: -------------------------------------------------------------------------------- 1 | h_key = dxf_dim(file="frame-pcb.dxf", name="key", 2 | layer="side-view", origin=[0, 0], scale=1); 3 | h_top_plate = dxf_dim(file="frame-pcb.dxf", name="tpl", 4 | layer="side-view", origin=[0, 0], scale=1); 5 | h_mid = dxf_dim(file="frame-pcb.dxf", name="mid", 6 | layer="side-view", origin=[0, 0], scale=1); 7 | h_bottom_plate = dxf_dim(file="frame-pcb.dxf", name="bpl", 8 | layer="side-view", origin=[0, 0], scale=1); 9 | h_label_clearance = dxf_dim(file="frame-pcb.dxf", name="lbl", 10 | layer="side-view", origin=[0, 0], scale=1); 11 | x0_cable = dxf_dim(file="frame-pcb.dxf", name="x0cable", 12 | layer="cable", origin=[0, 0], scale=1); 13 | y0_cable = dxf_dim(file="frame-pcb.dxf", name="y0cable", 14 | layer="cable", origin=[0, 0], scale=1); 15 | delta_cx = dxf_dim(file="frame-pcb.dxf", name="delta_cx", 16 | layer="cable", origin=[0, 0], scale=1); 17 | delta_cy = dxf_dim(file="frame-pcb.dxf", name="delta_cy", 18 | layer="cable", origin=[0, 0], scale=1); 19 | epsilon = 1; 20 | 21 | difference() { 22 | union() { 23 | difference() { 24 | hull() { 25 | /* color("green") { */ 26 | color("green", $fs = 0.2, $fa = 2) { 27 | rotate_extrude() { 28 | import (file = "frame-pcb.dxf", layer = "outline-profile"); 29 | } 30 | translate([delta_cx, 0, 0]) { 31 | rotate_extrude() { 32 | import (file = "frame-pcb.dxf", layer = "outline-profile"); 33 | } 34 | } 35 | translate([delta_cx, delta_cy, 0]) { 36 | rotate_extrude() { 37 | import (file = "frame-pcb.dxf", layer = "outline-profile"); 38 | } 39 | } 40 | translate([0, delta_cy, 0]) { 41 | rotate_extrude() { 42 | import (file = "frame-pcb.dxf", layer = "outline-profile"); 43 | } 44 | } 45 | } 46 | } 47 | color("red") { 48 | translate([0, 0, -h_bottom_plate - h_label_clearance - epsilon]) { 49 | linear_extrude(height = h_key + h_top_plate + h_mid + h_bottom_plate + h_label_clearance + 2 * epsilon) { 50 | import (file = "frame-pcb.dxf", layer = "outline"); 51 | } 52 | } 53 | } 54 | } 55 | translate([0, 0, -h_bottom_plate]) { 56 | linear_extrude(height = h_bottom_plate + h_mid + h_top_plate) { 57 | import (file = "frame-pcb.dxf", layer = "hooks"); 58 | } 59 | } 60 | translate([0, 0, 0]) { 61 | linear_extrude(height = h_mid) { 62 | import (file = "frame-pcb.dxf", layer = "plate-support"); 63 | } 64 | } 65 | } 66 | /* color("cyan") { */ 67 | color("cyan", $fs = 0.2, $fa = 2) { 68 | translate([x0_cable, y0_cable, 0]) { 69 | rotate([-90, 0, 0]) { 70 | rotate_extrude() { 71 | import (file = "frame-pcb.dxf", layer = "cable-shape"); 72 | } 73 | } 74 | } 75 | } 76 | translate([delta_cx - x0_cable, y0_cable + 2, (h_label_clearance + h_bottom_plate + h_mid + h_top_plate + h_key) / 2 - (h_label_clearance + h_bottom_plate)]) { 77 | rotate([90, 0, 180]) { 78 | linear_extrude(height = 5) { 79 | text("ISO50", halign = "left", valign = "center", font = "DejaVu Sans:style=Bold", size = 6, spacing = 1.1); 80 | } 81 | } 82 | } 83 | translate([x0_cable, y0_cable + 15, 0]) { 84 | rotate([90, 0, 0]) { 85 | linear_extrude(height = 30) { 86 | import (file = "frame-pcb.dxf", layer = "cable-chamfer"); 87 | } 88 | } 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /firmware/Makefile: -------------------------------------------------------------------------------- 1 | #---------------------------------------------------------------------------- 2 | # On command line: 3 | # 4 | # make all = Make software. 5 | # 6 | # make clean = Clean out built project files. 7 | # 8 | # make coff = Convert ELF to AVR COFF. 9 | # 10 | # make extcoff = Convert ELF to AVR Extended COFF. 11 | # 12 | # make program = Download the hex file to the device. 13 | # Please customize your programmer settings(PROGRAM_CMD) 14 | # 15 | # make teensy = Download the hex file to the device, using teensy_loader_cli. 16 | # (must have teensy_loader_cli installed). 17 | # 18 | # make dfu = Download the hex file to the device, using dfu-programmer (must 19 | # have dfu-programmer installed). 20 | # 21 | # make flip = Download the hex file to the device, using Atmel FLIP (must 22 | # have Atmel FLIP installed). 23 | # 24 | # make dfu-ee = Download the eeprom file to the device, using dfu-programmer 25 | # (must have dfu-programmer installed). 26 | # 27 | # make flip-ee = Download the eeprom file to the device, using Atmel FLIP 28 | # (must have Atmel FLIP installed). 29 | # 30 | # make debug = Start either simulavr or avarice as specified for debugging, 31 | # with avr-gdb or avr-insight as the front end for debugging. 32 | # 33 | # make filename.s = Just compile filename.c into the assembler code only. 34 | # 35 | # make filename.i = Create a preprocessed source file for use in submitting 36 | # bug reports to the GCC project. 37 | # 38 | # To rebuild project do "make clean" then "make all". 39 | #---------------------------------------------------------------------------- 40 | 41 | # Target file name (without extension). 42 | TARGET = iso50_lufa 43 | 44 | # Directory common source filess exist 45 | TMK_DIR = tmk_keyboard/tmk_core 46 | 47 | # Directory keyboard dependent files exist 48 | TARGET_DIR = . 49 | 50 | # project specific files 51 | SRC = keymap_common.c \ 52 | matrix.c \ 53 | led.c 54 | 55 | ifdef KEYMAP 56 | SRC := keymap_$(KEYMAP).c $(SRC) 57 | else 58 | SRC := keymap_iso50.c $(SRC) 59 | endif 60 | 61 | CONFIG_H = config.h 62 | 63 | 64 | # MCU name 65 | #MCU = at90usb1287 66 | MCU = atmega32u4 67 | 68 | # Processor frequency. 69 | # This will define a symbol, F_CPU, in all source code files equal to the 70 | # processor frequency in Hz. You can then use this symbol in your source code to 71 | # calculate timings. Do NOT tack on a 'UL' at the end, this will be done 72 | # automatically to create a 32-bit value in your source code. 73 | # 74 | # This will be an integer division of F_USB below, as it is sourced by 75 | # F_USB after it has run through any CPU prescalers. Note that this value 76 | # does not *change* the processor frequency - it should merely be updated to 77 | # reflect the processor speed set externally so that the code can use accurate 78 | # software delays. 79 | F_CPU = 16000000 80 | 81 | 82 | # 83 | # LUFA specific 84 | # 85 | # Target architecture (see library "Board Types" documentation). 86 | ARCH = AVR8 87 | 88 | # Input clock frequency. 89 | # This will define a symbol, F_USB, in all source code files equal to the 90 | # input clock frequency (before any prescaling is performed) in Hz. This value may 91 | # differ from F_CPU if prescaling is used on the latter, and is required as the 92 | # raw input clock is fed directly to the PLL sections of the AVR for high speed 93 | # clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' 94 | # at the end, this will be done automatically to create a 32-bit value in your 95 | # source code. 96 | # 97 | # If no clock division is performed on the input clock inside the AVR (via the 98 | # CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. 99 | F_USB = $(F_CPU) 100 | 101 | # Interrupt driven control endpoint task(+60) 102 | OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT 103 | 104 | 105 | # Boot Section Size in *bytes* 106 | # Teensy halfKay 512 107 | # Teensy++ halfKay 1024 108 | # Atmel DFU loader 4096 109 | # LUFA bootloader 4096 110 | # USBaspLoader 2048 111 | OPT_DEFS += -DBOOTLOADER_SIZE=512 112 | 113 | 114 | # Build Options 115 | # comment out to disable the options. 116 | # 117 | #BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) 118 | MOUSEKEY_ENABLE = yes # Mouse keys(+4700) 119 | EXTRAKEY_ENABLE = yes # Audio control and System control(+450) 120 | CONSOLE_ENABLE = yes # Console for debug(+400) 121 | #COMMAND_ENABLE = yes # Commands for debug and configuration 122 | #SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend 123 | #NKRO_ENABLE = yes # USB Nkey Rollover - not yet supported in LUFA 124 | 125 | 126 | # Optimize size but this may cause error "relocation truncated to fit" 127 | #EXTRALDFLAGS = -Wl,--relax 128 | 129 | # Search Path 130 | VPATH += $(TARGET_DIR) 131 | VPATH += $(TMK_DIR) 132 | 133 | include $(TMK_DIR)/protocol/lufa.mk 134 | include $(TMK_DIR)/common.mk 135 | include $(TMK_DIR)/rules.mk 136 | -------------------------------------------------------------------------------- /firmware-pcb/Makefile: -------------------------------------------------------------------------------- 1 | #---------------------------------------------------------------------------- 2 | # On command line: 3 | # 4 | # make all = Make software. 5 | # 6 | # make clean = Clean out built project files. 7 | # 8 | # make coff = Convert ELF to AVR COFF. 9 | # 10 | # make extcoff = Convert ELF to AVR Extended COFF. 11 | # 12 | # make program = Download the hex file to the device. 13 | # Please customize your programmer settings(PROGRAM_CMD) 14 | # 15 | # make teensy = Download the hex file to the device, using teensy_loader_cli. 16 | # (must have teensy_loader_cli installed). 17 | # 18 | # make dfu = Download the hex file to the device, using dfu-programmer (must 19 | # have dfu-programmer installed). 20 | # 21 | # make flip = Download the hex file to the device, using Atmel FLIP (must 22 | # have Atmel FLIP installed). 23 | # 24 | # make dfu-ee = Download the eeprom file to the device, using dfu-programmer 25 | # (must have dfu-programmer installed). 26 | # 27 | # make flip-ee = Download the eeprom file to the device, using Atmel FLIP 28 | # (must have Atmel FLIP installed). 29 | # 30 | # make debug = Start either simulavr or avarice as specified for debugging, 31 | # with avr-gdb or avr-insight as the front end for debugging. 32 | # 33 | # make filename.s = Just compile filename.c into the assembler code only. 34 | # 35 | # make filename.i = Create a preprocessed source file for use in submitting 36 | # bug reports to the GCC project. 37 | # 38 | # To rebuild project do "make clean" then "make all". 39 | #---------------------------------------------------------------------------- 40 | 41 | # Target file name (without extension). 42 | TARGET = iso50_lufa 43 | 44 | # Directory common source filess exist 45 | TMK_DIR = tmk_keyboard/tmk_core 46 | 47 | # Directory keyboard dependent files exist 48 | TARGET_DIR = . 49 | 50 | # project specific files 51 | SRC = keymap_common.c \ 52 | matrix.c \ 53 | led.c 54 | 55 | ifdef KEYMAP 56 | SRC := keymap_$(KEYMAP).c $(SRC) 57 | else 58 | SRC := keymap_iso50.c $(SRC) 59 | endif 60 | 61 | CONFIG_H = config.h 62 | 63 | 64 | # MCU name 65 | #MCU = at90usb1287 66 | MCU = atmega32u4 67 | 68 | # Processor frequency. 69 | # This will define a symbol, F_CPU, in all source code files equal to the 70 | # processor frequency in Hz. You can then use this symbol in your source code to 71 | # calculate timings. Do NOT tack on a 'UL' at the end, this will be done 72 | # automatically to create a 32-bit value in your source code. 73 | # 74 | # This will be an integer division of F_USB below, as it is sourced by 75 | # F_USB after it has run through any CPU prescalers. Note that this value 76 | # does not *change* the processor frequency - it should merely be updated to 77 | # reflect the processor speed set externally so that the code can use accurate 78 | # software delays. 79 | F_CPU = 16000000 80 | 81 | 82 | # 83 | # LUFA specific 84 | # 85 | # Target architecture (see library "Board Types" documentation). 86 | ARCH = AVR8 87 | 88 | # Input clock frequency. 89 | # This will define a symbol, F_USB, in all source code files equal to the 90 | # input clock frequency (before any prescaling is performed) in Hz. This value may 91 | # differ from F_CPU if prescaling is used on the latter, and is required as the 92 | # raw input clock is fed directly to the PLL sections of the AVR for high speed 93 | # clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' 94 | # at the end, this will be done automatically to create a 32-bit value in your 95 | # source code. 96 | # 97 | # If no clock division is performed on the input clock inside the AVR (via the 98 | # CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. 99 | F_USB = $(F_CPU) 100 | 101 | # Interrupt driven control endpoint task(+60) 102 | OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT 103 | 104 | 105 | # Boot Section Size in *bytes* 106 | # Teensy halfKay 512 107 | # Teensy++ halfKay 1024 108 | # Atmel DFU loader 4096 109 | # LUFA bootloader 4096 110 | # USBaspLoader 2048 111 | OPT_DEFS += -DBOOTLOADER_SIZE=4096 112 | 113 | 114 | # Build Options 115 | # comment out to disable the options. 116 | # 117 | #BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) 118 | MOUSEKEY_ENABLE = yes # Mouse keys(+4700) 119 | EXTRAKEY_ENABLE = yes # Audio control and System control(+450) 120 | CONSOLE_ENABLE = yes # Console for debug(+400) 121 | #COMMAND_ENABLE = yes # Commands for debug and configuration 122 | #SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend 123 | #NKRO_ENABLE = yes # USB Nkey Rollover - not yet supported in LUFA 124 | 125 | 126 | # Optimize size but this may cause error "relocation truncated to fit" 127 | #EXTRALDFLAGS = -Wl,--relax 128 | 129 | # Search Path 130 | VPATH += $(TARGET_DIR) 131 | VPATH += $(TMK_DIR) 132 | 133 | include $(TMK_DIR)/protocol/lufa.mk 134 | include $(TMK_DIR)/common.mk 135 | include $(TMK_DIR)/rules.mk 136 | -------------------------------------------------------------------------------- /hardware/pcb-main/footprints.pretty/Crystal_HC49-U_Vertical.kicad_mod: -------------------------------------------------------------------------------- 1 | (module Crystals:Crystal_HC49-U_Vertical (layer F.Cu) (tedit 0) 2 | (descr "Crystal Quarz HC49/U vertical stehend") 3 | (tags "Crystal Quarz HC49/U vertical stehend") 4 | (fp_text reference Y1 (at 0 -3.81) (layer F.SilkS) 5 | (effects (font (size 1 1) (thickness 0.15))) 6 | ) 7 | (fp_text value HC49S (at 0 3.81) (layer F.Fab) 8 | (effects (font (size 1 1) (thickness 0.15))) 9 | ) 10 | (fp_line (start 4.699 -1.00076) (end 4.89966 -0.59944) (layer F.SilkS) (width 0.15)) 11 | (fp_line (start 4.89966 -0.59944) (end 5.00126 0) (layer F.SilkS) (width 0.15)) 12 | (fp_line (start 5.00126 0) (end 4.89966 0.50038) (layer F.SilkS) (width 0.15)) 13 | (fp_line (start 4.89966 0.50038) (end 4.50088 1.19888) (layer F.SilkS) (width 0.15)) 14 | (fp_line (start 4.50088 1.19888) (end 3.8989 1.6002) (layer F.SilkS) (width 0.15)) 15 | (fp_line (start 3.8989 1.6002) (end 3.29946 1.80086) (layer F.SilkS) (width 0.15)) 16 | (fp_line (start 3.29946 1.80086) (end -3.29946 1.80086) (layer F.SilkS) (width 0.15)) 17 | (fp_line (start -3.29946 1.80086) (end -4.0005 1.6002) (layer F.SilkS) (width 0.15)) 18 | (fp_line (start -4.0005 1.6002) (end -4.39928 1.30048) (layer F.SilkS) (width 0.15)) 19 | (fp_line (start -4.39928 1.30048) (end -4.8006 0.8001) (layer F.SilkS) (width 0.15)) 20 | (fp_line (start -4.8006 0.8001) (end -5.00126 0.20066) (layer F.SilkS) (width 0.15)) 21 | (fp_line (start -5.00126 0.20066) (end -5.00126 -0.29972) (layer F.SilkS) (width 0.15)) 22 | (fp_line (start -5.00126 -0.29972) (end -4.8006 -0.8001) (layer F.SilkS) (width 0.15)) 23 | (fp_line (start -4.8006 -0.8001) (end -4.30022 -1.39954) (layer F.SilkS) (width 0.15)) 24 | (fp_line (start -4.30022 -1.39954) (end -3.79984 -1.69926) (layer F.SilkS) (width 0.15)) 25 | (fp_line (start -3.79984 -1.69926) (end -3.29946 -1.80086) (layer F.SilkS) (width 0.15)) 26 | (fp_line (start -3.2004 -1.80086) (end 3.40106 -1.80086) (layer F.SilkS) (width 0.15)) 27 | (fp_line (start 3.40106 -1.80086) (end 3.79984 -1.69926) (layer F.SilkS) (width 0.15)) 28 | (fp_line (start 3.79984 -1.69926) (end 4.30022 -1.39954) (layer F.SilkS) (width 0.15)) 29 | (fp_line (start 4.30022 -1.39954) (end 4.8006 -0.89916) (layer F.SilkS) (width 0.15)) 30 | (fp_line (start -3.19024 -2.32918) (end -3.64998 -2.28092) (layer F.SilkS) (width 0.15)) 31 | (fp_line (start -3.64998 -2.28092) (end -4.04876 -2.16916) (layer F.SilkS) (width 0.15)) 32 | (fp_line (start -4.04876 -2.16916) (end -4.48056 -1.95072) (layer F.SilkS) (width 0.15)) 33 | (fp_line (start -4.48056 -1.95072) (end -4.77012 -1.71958) (layer F.SilkS) (width 0.15)) 34 | (fp_line (start -4.77012 -1.71958) (end -5.10032 -1.36906) (layer F.SilkS) (width 0.15)) 35 | (fp_line (start -5.10032 -1.36906) (end -5.38988 -0.83058) (layer F.SilkS) (width 0.15)) 36 | (fp_line (start -5.38988 -0.83058) (end -5.51942 -0.23114) (layer F.SilkS) (width 0.15)) 37 | (fp_line (start -5.51942 -0.23114) (end -5.51942 0.2794) (layer F.SilkS) (width 0.15)) 38 | (fp_line (start -5.51942 0.2794) (end -5.34924 0.98044) (layer F.SilkS) (width 0.15)) 39 | (fp_line (start -5.34924 0.98044) (end -4.95046 1.56972) (layer F.SilkS) (width 0.15)) 40 | (fp_line (start -4.95046 1.56972) (end -4.49072 1.94056) (layer F.SilkS) (width 0.15)) 41 | (fp_line (start -4.49072 1.94056) (end -4.06908 2.14884) (layer F.SilkS) (width 0.15)) 42 | (fp_line (start -4.06908 2.14884) (end -3.6195 2.30886) (layer F.SilkS) (width 0.15)) 43 | (fp_line (start -3.6195 2.30886) (end -3.18008 2.33934) (layer F.SilkS) (width 0.15)) 44 | (fp_line (start 4.16052 2.1209) (end 4.53898 1.89992) (layer F.SilkS) (width 0.15)) 45 | (fp_line (start 4.53898 1.89992) (end 4.85902 1.62052) (layer F.SilkS) (width 0.15)) 46 | (fp_line (start 4.85902 1.62052) (end 5.11048 1.29032) (layer F.SilkS) (width 0.15)) 47 | (fp_line (start 5.11048 1.29032) (end 5.4102 0.73914) (layer F.SilkS) (width 0.15)) 48 | (fp_line (start 5.4102 0.73914) (end 5.51942 0.26924) (layer F.SilkS) (width 0.15)) 49 | (fp_line (start 5.51942 0.26924) (end 5.53974 -0.1905) (layer F.SilkS) (width 0.15)) 50 | (fp_line (start 5.53974 -0.1905) (end 5.45084 -0.65024) (layer F.SilkS) (width 0.15)) 51 | (fp_line (start 5.45084 -0.65024) (end 5.26034 -1.09982) (layer F.SilkS) (width 0.15)) 52 | (fp_line (start 5.26034 -1.09982) (end 4.89966 -1.56972) (layer F.SilkS) (width 0.15)) 53 | (fp_line (start 4.89966 -1.56972) (end 4.54914 -1.88976) (layer F.SilkS) (width 0.15)) 54 | (fp_line (start 4.54914 -1.88976) (end 4.16052 -2.1209) (layer F.SilkS) (width 0.15)) 55 | (fp_line (start 4.16052 -2.1209) (end 3.73126 -2.2606) (layer F.SilkS) (width 0.15)) 56 | (fp_line (start 3.73126 -2.2606) (end 3.2893 -2.32918) (layer F.SilkS) (width 0.15)) 57 | (fp_line (start -3.2004 2.32918) (end 3.2512 2.32918) (layer F.SilkS) (width 0.15)) 58 | (fp_line (start 3.2512 2.32918) (end 3.6703 2.29108) (layer F.SilkS) (width 0.15)) 59 | (fp_line (start 3.6703 2.29108) (end 4.16052 2.1209) (layer F.SilkS) (width 0.15)) 60 | (fp_line (start -3.2004 -2.32918) (end 3.2512 -2.32918) (layer F.SilkS) (width 0.15)) 61 | (pad 1 thru_hole circle (at -2.44094 0) (size 1.50114 1.50114) (drill 0.8001) (layers *.Cu *.Mask F.SilkS)) 62 | (pad 2 thru_hole circle (at 2.44094 0) (size 1.50114 1.50114) (drill 0.8001) (layers *.Cu *.Mask F.SilkS)) 63 | ) 64 | -------------------------------------------------------------------------------- /firmware/matrix.c: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2012 Jun Wako 3 | 4 | This program is free software: you can redistribute it and/or modify 5 | it under the terms of the GNU General Public License as published by 6 | the Free Software Foundation, either version 2 of the License, or 7 | (at your option) any later version. 8 | 9 | This program is distributed in the hope that it will be useful, 10 | but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | GNU General Public License for more details. 13 | 14 | You should have received a copy of the GNU General Public License 15 | along with this program. If not, see . 16 | */ 17 | 18 | /* 19 | * scan matrix 20 | */ 21 | #include 22 | #include 23 | #include 24 | #include 25 | #include "print.h" 26 | #include "debug.h" 27 | #include "util.h" 28 | #include "matrix.h" 29 | 30 | 31 | #ifndef DEBOUNCE 32 | # define DEBOUNCE 5 33 | #endif 34 | static uint8_t debouncing = DEBOUNCE; 35 | 36 | /* matrix state(1:on, 0:off) */ 37 | static matrix_row_t matrix[MATRIX_ROWS]; 38 | static matrix_row_t matrix_debouncing[MATRIX_ROWS]; 39 | 40 | static matrix_row_t read_cols(void); 41 | static void init_cols(void); 42 | static void unselect_rows(void); 43 | static void select_row(uint8_t row); 44 | 45 | 46 | inline uint8_t 47 | matrix_rows(void) 48 | { 49 | return MATRIX_ROWS; 50 | } 51 | 52 | inline uint8_t 53 | matrix_cols(void) 54 | { 55 | return MATRIX_COLS; 56 | } 57 | 58 | void 59 | matrix_init(void) 60 | { 61 | // initialize row and col 62 | unselect_rows(); 63 | init_cols(); 64 | 65 | // initialize matrix state: all keys off 66 | for (uint8_t i=0; i < MATRIX_ROWS; i++) { 67 | matrix[i] = 0; 68 | matrix_debouncing[i] = 0; 69 | } 70 | } 71 | 72 | uint8_t 73 | matrix_scan(void) 74 | { 75 | for (uint8_t i = 0; i < MATRIX_ROWS; i++) { 76 | select_row(i); 77 | _delay_us(30); // without this wait read unstable value. 78 | matrix_row_t cols = read_cols(); 79 | if (matrix_debouncing[i] != cols) { 80 | matrix_debouncing[i] = cols; 81 | if (debouncing) { 82 | debug("bounce!: "); debug_hex(debouncing); debug("\n"); 83 | } 84 | debouncing = DEBOUNCE; 85 | } 86 | unselect_rows(); 87 | } 88 | 89 | if (debouncing) { 90 | if (--debouncing) { 91 | _delay_ms(1); 92 | } else { 93 | for (uint8_t i = 0; i < MATRIX_ROWS; i++) { 94 | matrix[i] = matrix_debouncing[i]; 95 | } 96 | } 97 | } 98 | 99 | return 1; 100 | } 101 | 102 | bool 103 | matrix_is_modified(void) 104 | { 105 | if (debouncing) return false; 106 | return true; 107 | } 108 | 109 | inline bool 110 | matrix_is_on(uint8_t row, uint8_t col) 111 | { 112 | return (matrix[row] & ((matrix_row_t)1< 3 | 4 | This program is free software: you can redistribute it and/or modify 5 | it under the terms of the GNU General Public License as published by 6 | the Free Software Foundation, either version 2 of the License, or 7 | (at your option) any later version. 8 | 9 | This program is distributed in the hope that it will be useful, 10 | but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | GNU General Public License for more details. 13 | 14 | You should have received a copy of the GNU General Public License 15 | along with this program. If not, see . 16 | */ 17 | 18 | /* 19 | * scan matrix 20 | */ 21 | #include 22 | #include 23 | #include 24 | #include 25 | #include "print.h" 26 | #include "debug.h" 27 | #include "util.h" 28 | #include "matrix.h" 29 | 30 | 31 | #ifndef DEBOUNCE 32 | # define DEBOUNCE 5 33 | #endif 34 | static uint8_t debouncing = DEBOUNCE; 35 | 36 | /* matrix state(1:on, 0:off) */ 37 | static matrix_row_t matrix[MATRIX_ROWS]; 38 | static matrix_row_t matrix_debouncing[MATRIX_ROWS]; 39 | 40 | static uint8_t read_rows(void); 41 | static void init_rows(void); 42 | static void unselect_cols(void); 43 | static void select_col(uint8_t row); 44 | 45 | 46 | inline uint8_t 47 | matrix_rows(void) 48 | { 49 | return MATRIX_ROWS; 50 | } 51 | 52 | inline uint8_t 53 | matrix_cols(void) 54 | { 55 | return MATRIX_COLS; 56 | } 57 | 58 | void 59 | matrix_init(void) 60 | { 61 | // initialize row and col 62 | unselect_cols(); 63 | init_rows(); 64 | 65 | // initialize matrix state: all keys off 66 | for (uint8_t i=0; i < MATRIX_ROWS; i++) { 67 | matrix[i] = 0; 68 | matrix_debouncing[i] = 0; 69 | } 70 | } 71 | 72 | uint8_t 73 | matrix_scan(void) 74 | { 75 | for (uint8_t col = 0; col < MATRIX_COLS; col++) { 76 | select_col(col); 77 | _delay_us(30); // without this wait read unstable value. 78 | uint8_t rows = read_rows(); 79 | for (uint8_t row = 0; row < MATRIX_ROWS; row++) { 80 | bool prev_bit = matrix_debouncing[row] & ((matrix_row_t)1<