├── .gitignore ├── pics ├── 75er001.png ├── 75er002.png ├── 75er003.png ├── 75er004.png ├── 75er005.png ├── 75er006.png ├── 75er007.png ├── 75er008.png ├── 75er009.png ├── 75er010.png ├── 75er013.png ├── 75er014.png ├── 75er015.png ├── 75er016.png ├── 75er017.png ├── 75er004_1.png ├── 75er004_2.png ├── keebCase.png ├── wrist36L.png ├── wrist36R.png ├── wristCon.png ├── andimoto6064.png ├── andimotoTKL.png ├── costar_stabs.png ├── andimotoTKLiso.png ├── keebCaseLocks.png ├── keebcu_banner.png ├── numpad_render.png ├── pics │ ├── macro001.JPG │ ├── macro002.JPG │ ├── macro003.JPG │ ├── macro004.JPG │ ├── keebcu_002.JPG │ ├── keebcu_004.JPG │ ├── keebcu_005.JPG │ ├── keebcu_006.JPG │ ├── keebcu_007.JPG │ ├── keebcu_008.JPG │ ├── keebcu_009.JPG │ ├── keebcu_010.JPG │ ├── keebcu_011.JPG │ ├── keebcu_012.JPG │ ├── keebcu_013.JPG │ ├── keebcu_014.JPG │ ├── keebcu_015.JPG │ ├── keebcu_016.JPG │ ├── keebcu_017.JPG │ ├── numpad_001.jpg │ ├── numpad_002.jpg │ ├── andimoto75Q1iso-001.jpg │ ├── andimoto75Q1iso-002.jpg │ ├── andimoto75Q1iso-003.jpg │ ├── andimoto75Q1iso-004.jpg │ ├── andimoto75Q1iso-005.jpg │ ├── andimoto75Q1iso-006.jpg │ ├── andimoto75Q1iso-007.jpg │ ├── andimoto75Q1iso-008.jpg │ ├── andimoto75Q1iso-009.jpg │ ├── andimoto75Q1iso-010.jpg │ ├── andimoto75Q1iso-011.jpg │ └── andimoto75Q1iso-012.jpg ├── wristComplete.png ├── andimoto75Q1-iso.png ├── andimoto_smallTKL.png ├── usbCutoutPlaceing.png ├── andimoto7583-xda001.png ├── andimoto7583-xda002.png ├── andimoto_smallTKL_iso.png ├── stab-key-sizes-cherry.png ├── img │ ├── IMG_20201101_000850.jpg │ ├── IMG_20201101_000857.jpg │ ├── IMG_20201101_000921.jpg │ ├── IMG_20201101_000947.jpg │ ├── IMG_20201101_001009.jpg │ ├── IMG_20201101_001109.jpg │ ├── IMG_20201215_085124.jpg │ ├── IMG_20201215_085352.jpg │ ├── IMG_20201224_110359.jpg │ ├── IMG_20201224_110407.jpg │ ├── IMG_20201224_111618.jpg │ ├── IMG_20201224_111624.jpg │ ├── IMG_20201224_111630.jpg │ ├── IMG_20201224_111640.jpg │ ├── IMG_20201224_111739.jpg │ ├── IMG_20201224_111744.jpg │ ├── IMG_20201224_111752.jpg │ ├── IMG_20201228_204647.jpg │ ├── IMG_20210111_150655.jpg │ ├── IMG_20210111_151033.jpg │ ├── IMG_20210111_151044.jpg │ ├── IMG_20210111_151047.jpg │ ├── IMG_20210111_151052.jpg │ ├── IMG_20210111_151100.jpg │ ├── IMG_20210111_151114.jpg │ ├── IMG_20210111_151118.jpg │ ├── IMG_20210119_213742.jpg │ ├── IMG_20210318_140604.jpg │ ├── IMG_20210318_140613.jpg │ ├── IMG_20210318_140618.jpg │ ├── IMG_20210318_140627.jpg │ ├── IMG_20210318_140654.jpg │ ├── IMG_20210318_175820.jpg │ ├── IMG_20210318_175835.jpg │ ├── IMG_20210405_204525.jpg │ ├── IMG_20210406_151226.jpg │ ├── IMG_20210406_151326.jpg │ ├── IMG_20210406_151405.jpg │ ├── IMG_20210406_151424.jpg │ ├── IMG_20210406_151432.jpg │ ├── IMG_20210406_151457.jpg │ └── screwHolesColorChange.jpg └── andimoto_smallTKL_isoBlue.png ├── stl ├── andimotoTKL │ └── wrist │ │ ├── wrist358L.stl │ │ ├── wrist358R.stl │ │ ├── wristConnectors.stl │ │ └── wrist358Complete.stl ├── numpad │ ├── numpad_case_proMicro.stl │ └── numpad_lid_proMicro.stl ├── andimotoTKLiso │ └── wrist │ │ ├── wrist358L.stl │ │ ├── wrist358R.stl │ │ ├── wrist358Complete.stl │ │ └── wristConnectors.stl ├── macropad │ └── macropad_5x2_ProMicro.stl ├── andimoto7583 │ ├── andimoto7583_lid_CNC.stl │ ├── andimoto7583_lidR_CNC.stl │ ├── Readme.md │ ├── andimoto7584-frame-proMicro │ │ ├── andimoto7584-riser.stl │ │ ├── andimoto7584-lidAll-frame-proMicro.stl │ │ ├── andimoto7584-caseAll-frame-proMicro.stl │ │ ├── andimoto7584-caseLeft-frame-proMicro.stl │ │ ├── andimoto7584-caseRight-frame-proMicro.stl │ │ ├── andimoto7584-frameAll-frame-proMicro.stl │ │ ├── andimoto7584-frameLeft-frame-proMicro.stl │ │ ├── andimoto7584-lidLeft-frame-proMicro.stl │ │ ├── andimoto7584-lidRight-frame-proMicro.stl │ │ └── andimoto7584-frameRight-frame-proMicro.stl │ └── andimoto7583-obj-cnc │ │ ├── Unnamed-andimoto7583_lid.mtl │ │ ├── Unnamed-andimoto7583_lidL.mtl │ │ ├── Unnamed-andimoto7583_lidR.mtl │ │ ├── Unnamed-andimoto7583_lid_CNC.mtl │ │ ├── Unnamed-andimoto7583_lidR_CNC.mtl │ │ ├── Unnamed-andimoto7583_mainCase.mtl │ │ ├── Unnamed-andimoto7583_mainCaseLeft.mtl │ │ ├── Unnamed-andimoto7583_keyboardRiser.mtl │ │ └── Unnamed-andimoto7583_mainCaseRight.mtl ├── andimoto75Q1 │ ├── andimoto75Q1-frameL.stl │ ├── andimoto75Q1-frameR.stl │ ├── andimoto75Q1-riser.stl │ ├── andimoto75Q1-lidL-teensy2.stl │ ├── andimoto75Q1-lidRteensy2.stl │ ├── andimoto75Q1-caseL-teensy2.stl │ └── andimoto75Q1-caseR-teensy2.stl ├── andimoto75Q1-iso │ ├── andimoto75Q1-iso-frameL.stl │ ├── andimoto75Q1-iso-frameR.stl │ ├── andimoto75Q1-iso-riser.stl │ ├── andimoto75Q1-iso-ALL-frame.stl │ ├── andimoto75Q1-iso-lidRteensy2.stl │ ├── andimoto75Q1-iso-caseL-teensy2.stl │ ├── andimoto75Q1-iso-caseR-teensy2.stl │ ├── andimoto75Q1-iso-lidL-teensy2.stl │ ├── andimoto75Q1-iso-ALL-Case-Teensy2.stl │ └── andimoto75Q1-iso-ALL-Lid-Teensy2.stl ├── andimotoSmallTKLiso │ ├── wristRest │ │ ├── wrist330L.stl │ │ ├── wrist330R.stl │ │ ├── wristConnectors.stl │ │ └── wrist330_complete.stl │ ├── andimotoSmallTKLiso_lidL.stl │ ├── andimotoSmallTKLiso_keyboardRiser.stl │ ├── andimotoSmallTKLiso_lidR-ProMicro.stl │ ├── andimotoSmallTKLiso_lidR-Teensy2.stl │ ├── andimotoSmallTKLiso_mainCaseLeft.stl │ ├── andimotoSmallTKLiso_ALL-Lid-Teensy2.stl │ ├── andimotoSmallTKLiso_ALL-Case-ProMicro.stl │ ├── andimotoSmallTKLiso_ALL-Case-Teensy2.stl │ ├── andimotoSmallTKLiso_ALL-Lid-ProMicro.stl │ ├── andimotoSmallTKLiso_mainCaseRight-Teensy.stl │ └── andimotoSmallTKLiso_mainCaseRight-ProMicro.stl └── andimotoSmallTKL │ └── andimotoSmallTKL_fRow │ ├── andimotoSmallTKL_fRow_Riser.stl │ ├── andimotoSmallTKL_fRow_LidL_Teensy2.stl │ ├── andimotoSmallTKL_fRow_LidR_Teensy2.stl │ ├── andimotoSmallTKL_fRow_mainCaseLeft_Teensy2.stl │ └── andimotoSmallTKL_fRow_mainCaseRight_Teensy2.stl ├── wiring_sheets ├── qmk_layout_sheet.ods ├── andimoto6064 │ ├── andimoto6064.png │ ├── andimoto6064_wiring.odg │ ├── andimoto6064_wiring.pdf │ ├── andimoto6064_mirrored.png │ └── andimoto6064_qmk_layout.pdf ├── andimoto7583 │ ├── andimoto7583.png │ ├── andimoto7583_wiring.odg │ ├── andimoto7583_wiring.pdf │ ├── andimoto7583_mirrored.png │ └── andimoto7583_qmk_layout.pdf ├── qmk_teensy2_layout_sheets.pdf ├── andimmoto-numpad │ ├── andimoto-numpad.png │ └── andimoto-numpad-mirrored.png ├── qmk_ArduinoProMicro_layout_sheets.pdf ├── andimoto75Q1-iso │ ├── andimoto75Q1-iso-mirrored.png │ ├── andimoto75Q1_iso_teensy2_wiring.odg │ └── andimoto75Q1_iso_teensy2_wiring.pdf └── andimoto_SmallTKL_iso │ ├── andimoto_smallTKL_iso.png │ ├── andimoto_smallTKL_iso_wiring.odg │ ├── andimoto_smallTKL_iso_wiring.pdf │ ├── andimoto_smallTKL_iso_mirrored.png │ └── andimoto_smallTKL_iso_qmk_layout.pdf ├── conf └── module-calls.conf ├── constants.scad ├── wrist.scad ├── keebCase.scad ├── numpad.scad ├── macropad.scad ├── andimoto6064.scad ├── andimoto6061.scad ├── andimoto7583.scad ├── andimotoTKL.scad ├── andimotoSmallTKL.scad ├── andimoto75Q1.scad ├── template_to_copy.scad ├── andimotoSmallTKLiso.scad └── andimoto75Q1-iso.scad /.gitignore: -------------------------------------------------------------------------------- 1 | orig/* 2 | test_* 3 | deprecated/test/ 4 | -------------------------------------------------------------------------------- /pics/75er001.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/75er001.png -------------------------------------------------------------------------------- /pics/75er002.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/75er002.png -------------------------------------------------------------------------------- /pics/75er003.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/75er003.png -------------------------------------------------------------------------------- /pics/75er004.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/75er004.png -------------------------------------------------------------------------------- /pics/75er005.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/75er005.png -------------------------------------------------------------------------------- /pics/75er006.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/75er006.png -------------------------------------------------------------------------------- /pics/75er007.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/75er007.png -------------------------------------------------------------------------------- /pics/75er008.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/75er008.png -------------------------------------------------------------------------------- /pics/75er009.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/75er009.png -------------------------------------------------------------------------------- /pics/75er010.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/75er010.png -------------------------------------------------------------------------------- /pics/75er013.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/75er013.png -------------------------------------------------------------------------------- /pics/75er014.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/75er014.png -------------------------------------------------------------------------------- /pics/75er015.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/75er015.png -------------------------------------------------------------------------------- /pics/75er016.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/75er016.png -------------------------------------------------------------------------------- /pics/75er017.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/75er017.png -------------------------------------------------------------------------------- /pics/75er004_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/75er004_1.png -------------------------------------------------------------------------------- /pics/75er004_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/75er004_2.png -------------------------------------------------------------------------------- /pics/keebCase.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/keebCase.png -------------------------------------------------------------------------------- /pics/wrist36L.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/wrist36L.png -------------------------------------------------------------------------------- /pics/wrist36R.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/wrist36R.png -------------------------------------------------------------------------------- /pics/wristCon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/wristCon.png -------------------------------------------------------------------------------- /pics/andimoto6064.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/andimoto6064.png -------------------------------------------------------------------------------- /pics/andimotoTKL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/andimotoTKL.png -------------------------------------------------------------------------------- /pics/costar_stabs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/costar_stabs.png -------------------------------------------------------------------------------- /pics/andimotoTKLiso.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/andimotoTKLiso.png -------------------------------------------------------------------------------- /pics/keebCaseLocks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/keebCaseLocks.png -------------------------------------------------------------------------------- /pics/keebcu_banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/keebcu_banner.png -------------------------------------------------------------------------------- /pics/numpad_render.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/numpad_render.png -------------------------------------------------------------------------------- /pics/pics/macro001.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/pics/macro001.JPG -------------------------------------------------------------------------------- /pics/pics/macro002.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/pics/macro002.JPG -------------------------------------------------------------------------------- /pics/pics/macro003.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/pics/macro003.JPG -------------------------------------------------------------------------------- /pics/pics/macro004.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/pics/macro004.JPG -------------------------------------------------------------------------------- /pics/wristComplete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/wristComplete.png -------------------------------------------------------------------------------- /pics/andimoto75Q1-iso.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/andimoto75Q1-iso.png -------------------------------------------------------------------------------- /pics/andimoto_smallTKL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/andimoto_smallTKL.png -------------------------------------------------------------------------------- /pics/pics/keebcu_002.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/pics/keebcu_002.JPG -------------------------------------------------------------------------------- /pics/pics/keebcu_004.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/pics/keebcu_004.JPG -------------------------------------------------------------------------------- /pics/pics/keebcu_005.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/pics/keebcu_005.JPG -------------------------------------------------------------------------------- /pics/pics/keebcu_006.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/pics/keebcu_006.JPG -------------------------------------------------------------------------------- /pics/pics/keebcu_007.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/pics/keebcu_007.JPG -------------------------------------------------------------------------------- /pics/pics/keebcu_008.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/pics/keebcu_008.JPG -------------------------------------------------------------------------------- /pics/pics/keebcu_009.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/pics/keebcu_009.JPG -------------------------------------------------------------------------------- /pics/pics/keebcu_010.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/pics/keebcu_010.JPG -------------------------------------------------------------------------------- /pics/pics/keebcu_011.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/pics/keebcu_011.JPG -------------------------------------------------------------------------------- /pics/pics/keebcu_012.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/pics/keebcu_012.JPG -------------------------------------------------------------------------------- /pics/pics/keebcu_013.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/pics/keebcu_013.JPG -------------------------------------------------------------------------------- /pics/pics/keebcu_014.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/pics/keebcu_014.JPG -------------------------------------------------------------------------------- /pics/pics/keebcu_015.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/pics/keebcu_015.JPG -------------------------------------------------------------------------------- /pics/pics/keebcu_016.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/pics/keebcu_016.JPG -------------------------------------------------------------------------------- /pics/pics/keebcu_017.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/pics/keebcu_017.JPG -------------------------------------------------------------------------------- /pics/pics/numpad_001.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/pics/numpad_001.jpg -------------------------------------------------------------------------------- /pics/pics/numpad_002.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/pics/numpad_002.jpg -------------------------------------------------------------------------------- /pics/usbCutoutPlaceing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/usbCutoutPlaceing.png -------------------------------------------------------------------------------- /pics/andimoto7583-xda001.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/andimoto7583-xda001.png -------------------------------------------------------------------------------- /pics/andimoto7583-xda002.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/andimoto7583-xda002.png -------------------------------------------------------------------------------- /pics/andimoto_smallTKL_iso.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/andimoto_smallTKL_iso.png -------------------------------------------------------------------------------- /pics/stab-key-sizes-cherry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/stab-key-sizes-cherry.png -------------------------------------------------------------------------------- /pics/img/IMG_20201101_000850.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/img/IMG_20201101_000850.jpg -------------------------------------------------------------------------------- /pics/img/IMG_20201101_000857.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/img/IMG_20201101_000857.jpg -------------------------------------------------------------------------------- /pics/img/IMG_20201101_000921.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/img/IMG_20201101_000921.jpg -------------------------------------------------------------------------------- /pics/img/IMG_20201101_000947.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/img/IMG_20201101_000947.jpg -------------------------------------------------------------------------------- /pics/img/IMG_20201101_001009.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/img/IMG_20201101_001009.jpg -------------------------------------------------------------------------------- /pics/img/IMG_20201101_001109.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/img/IMG_20201101_001109.jpg -------------------------------------------------------------------------------- /pics/img/IMG_20201215_085124.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/img/IMG_20201215_085124.jpg -------------------------------------------------------------------------------- /pics/img/IMG_20201215_085352.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/img/IMG_20201215_085352.jpg -------------------------------------------------------------------------------- /pics/img/IMG_20201224_110359.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/img/IMG_20201224_110359.jpg -------------------------------------------------------------------------------- /pics/img/IMG_20201224_110407.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/img/IMG_20201224_110407.jpg -------------------------------------------------------------------------------- /pics/img/IMG_20201224_111618.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/img/IMG_20201224_111618.jpg -------------------------------------------------------------------------------- /pics/img/IMG_20201224_111624.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/img/IMG_20201224_111624.jpg -------------------------------------------------------------------------------- /pics/img/IMG_20201224_111630.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/img/IMG_20201224_111630.jpg -------------------------------------------------------------------------------- /pics/img/IMG_20201224_111640.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/img/IMG_20201224_111640.jpg -------------------------------------------------------------------------------- /pics/img/IMG_20201224_111739.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/img/IMG_20201224_111739.jpg -------------------------------------------------------------------------------- /pics/img/IMG_20201224_111744.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/img/IMG_20201224_111744.jpg -------------------------------------------------------------------------------- /pics/img/IMG_20201224_111752.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/img/IMG_20201224_111752.jpg -------------------------------------------------------------------------------- /pics/img/IMG_20201228_204647.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/img/IMG_20201228_204647.jpg -------------------------------------------------------------------------------- /pics/img/IMG_20210111_150655.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/img/IMG_20210111_150655.jpg -------------------------------------------------------------------------------- /pics/img/IMG_20210111_151033.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/img/IMG_20210111_151033.jpg -------------------------------------------------------------------------------- /pics/img/IMG_20210111_151044.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/img/IMG_20210111_151044.jpg -------------------------------------------------------------------------------- /pics/img/IMG_20210111_151047.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/img/IMG_20210111_151047.jpg -------------------------------------------------------------------------------- /pics/img/IMG_20210111_151052.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/img/IMG_20210111_151052.jpg -------------------------------------------------------------------------------- /pics/img/IMG_20210111_151100.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/img/IMG_20210111_151100.jpg -------------------------------------------------------------------------------- /pics/img/IMG_20210111_151114.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/img/IMG_20210111_151114.jpg -------------------------------------------------------------------------------- /pics/img/IMG_20210111_151118.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/img/IMG_20210111_151118.jpg -------------------------------------------------------------------------------- /pics/img/IMG_20210119_213742.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/img/IMG_20210119_213742.jpg -------------------------------------------------------------------------------- /pics/img/IMG_20210318_140604.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/img/IMG_20210318_140604.jpg -------------------------------------------------------------------------------- /pics/img/IMG_20210318_140613.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/img/IMG_20210318_140613.jpg -------------------------------------------------------------------------------- /pics/img/IMG_20210318_140618.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/img/IMG_20210318_140618.jpg -------------------------------------------------------------------------------- /pics/img/IMG_20210318_140627.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/img/IMG_20210318_140627.jpg -------------------------------------------------------------------------------- /pics/img/IMG_20210318_140654.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/img/IMG_20210318_140654.jpg -------------------------------------------------------------------------------- /pics/img/IMG_20210318_175820.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/img/IMG_20210318_175820.jpg -------------------------------------------------------------------------------- /pics/img/IMG_20210318_175835.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/img/IMG_20210318_175835.jpg -------------------------------------------------------------------------------- /pics/img/IMG_20210405_204525.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/img/IMG_20210405_204525.jpg -------------------------------------------------------------------------------- /pics/img/IMG_20210406_151226.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/img/IMG_20210406_151226.jpg -------------------------------------------------------------------------------- /pics/img/IMG_20210406_151326.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/img/IMG_20210406_151326.jpg -------------------------------------------------------------------------------- /pics/img/IMG_20210406_151405.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/img/IMG_20210406_151405.jpg -------------------------------------------------------------------------------- /pics/img/IMG_20210406_151424.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/img/IMG_20210406_151424.jpg -------------------------------------------------------------------------------- /pics/img/IMG_20210406_151432.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/img/IMG_20210406_151432.jpg -------------------------------------------------------------------------------- /pics/img/IMG_20210406_151457.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/img/IMG_20210406_151457.jpg -------------------------------------------------------------------------------- /pics/pics/andimoto75Q1iso-001.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/pics/andimoto75Q1iso-001.jpg -------------------------------------------------------------------------------- /pics/pics/andimoto75Q1iso-002.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/pics/andimoto75Q1iso-002.jpg -------------------------------------------------------------------------------- /pics/pics/andimoto75Q1iso-003.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/pics/andimoto75Q1iso-003.jpg -------------------------------------------------------------------------------- /pics/pics/andimoto75Q1iso-004.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/pics/andimoto75Q1iso-004.jpg -------------------------------------------------------------------------------- /pics/pics/andimoto75Q1iso-005.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/pics/andimoto75Q1iso-005.jpg -------------------------------------------------------------------------------- /pics/pics/andimoto75Q1iso-006.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/pics/andimoto75Q1iso-006.jpg -------------------------------------------------------------------------------- /pics/pics/andimoto75Q1iso-007.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/pics/andimoto75Q1iso-007.jpg -------------------------------------------------------------------------------- /pics/pics/andimoto75Q1iso-008.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/pics/andimoto75Q1iso-008.jpg -------------------------------------------------------------------------------- /pics/pics/andimoto75Q1iso-009.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/pics/andimoto75Q1iso-009.jpg -------------------------------------------------------------------------------- /pics/pics/andimoto75Q1iso-010.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/pics/andimoto75Q1iso-010.jpg -------------------------------------------------------------------------------- /pics/pics/andimoto75Q1iso-011.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/pics/andimoto75Q1iso-011.jpg -------------------------------------------------------------------------------- /pics/pics/andimoto75Q1iso-012.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/pics/andimoto75Q1iso-012.jpg -------------------------------------------------------------------------------- /pics/andimoto_smallTKL_isoBlue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/andimoto_smallTKL_isoBlue.png -------------------------------------------------------------------------------- /pics/img/screwHolesColorChange.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/pics/img/screwHolesColorChange.jpg -------------------------------------------------------------------------------- /stl/andimotoTKL/wrist/wrist358L.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimotoTKL/wrist/wrist358L.stl -------------------------------------------------------------------------------- /stl/andimotoTKL/wrist/wrist358R.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimotoTKL/wrist/wrist358R.stl -------------------------------------------------------------------------------- /stl/numpad/numpad_case_proMicro.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/numpad/numpad_case_proMicro.stl -------------------------------------------------------------------------------- /stl/numpad/numpad_lid_proMicro.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/numpad/numpad_lid_proMicro.stl -------------------------------------------------------------------------------- /wiring_sheets/qmk_layout_sheet.ods: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/wiring_sheets/qmk_layout_sheet.ods -------------------------------------------------------------------------------- /stl/andimotoTKLiso/wrist/wrist358L.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimotoTKLiso/wrist/wrist358L.stl -------------------------------------------------------------------------------- /stl/andimotoTKLiso/wrist/wrist358R.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimotoTKLiso/wrist/wrist358R.stl -------------------------------------------------------------------------------- /stl/macropad/macropad_5x2_ProMicro.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/macropad/macropad_5x2_ProMicro.stl -------------------------------------------------------------------------------- /stl/andimoto7583/andimoto7583_lid_CNC.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimoto7583/andimoto7583_lid_CNC.stl -------------------------------------------------------------------------------- /stl/andimoto75Q1/andimoto75Q1-frameL.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimoto75Q1/andimoto75Q1-frameL.stl -------------------------------------------------------------------------------- /stl/andimoto75Q1/andimoto75Q1-frameR.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimoto75Q1/andimoto75Q1-frameR.stl -------------------------------------------------------------------------------- /stl/andimoto75Q1/andimoto75Q1-riser.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimoto75Q1/andimoto75Q1-riser.stl -------------------------------------------------------------------------------- /stl/andimotoTKL/wrist/wristConnectors.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimotoTKL/wrist/wristConnectors.stl -------------------------------------------------------------------------------- /stl/andimoto7583/andimoto7583_lidR_CNC.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimoto7583/andimoto7583_lidR_CNC.stl -------------------------------------------------------------------------------- /stl/andimotoTKL/wrist/wrist358Complete.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimotoTKL/wrist/wrist358Complete.stl -------------------------------------------------------------------------------- /wiring_sheets/andimoto6064/andimoto6064.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/wiring_sheets/andimoto6064/andimoto6064.png -------------------------------------------------------------------------------- /wiring_sheets/andimoto7583/andimoto7583.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/wiring_sheets/andimoto7583/andimoto7583.png -------------------------------------------------------------------------------- /wiring_sheets/qmk_teensy2_layout_sheets.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/wiring_sheets/qmk_teensy2_layout_sheets.pdf -------------------------------------------------------------------------------- /stl/andimoto75Q1/andimoto75Q1-lidL-teensy2.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimoto75Q1/andimoto75Q1-lidL-teensy2.stl -------------------------------------------------------------------------------- /stl/andimoto75Q1/andimoto75Q1-lidRteensy2.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimoto75Q1/andimoto75Q1-lidRteensy2.stl -------------------------------------------------------------------------------- /stl/andimotoTKLiso/wrist/wrist358Complete.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimotoTKLiso/wrist/wrist358Complete.stl -------------------------------------------------------------------------------- /stl/andimotoTKLiso/wrist/wristConnectors.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimotoTKLiso/wrist/wristConnectors.stl -------------------------------------------------------------------------------- /stl/andimoto75Q1-iso/andimoto75Q1-iso-frameL.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimoto75Q1-iso/andimoto75Q1-iso-frameL.stl -------------------------------------------------------------------------------- /stl/andimoto75Q1-iso/andimoto75Q1-iso-frameR.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimoto75Q1-iso/andimoto75Q1-iso-frameR.stl -------------------------------------------------------------------------------- /stl/andimoto75Q1-iso/andimoto75Q1-iso-riser.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimoto75Q1-iso/andimoto75Q1-iso-riser.stl -------------------------------------------------------------------------------- /stl/andimoto75Q1/andimoto75Q1-caseL-teensy2.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimoto75Q1/andimoto75Q1-caseL-teensy2.stl -------------------------------------------------------------------------------- /stl/andimoto75Q1/andimoto75Q1-caseR-teensy2.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimoto75Q1/andimoto75Q1-caseR-teensy2.stl -------------------------------------------------------------------------------- /stl/andimotoSmallTKLiso/wristRest/wrist330L.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimotoSmallTKLiso/wristRest/wrist330L.stl -------------------------------------------------------------------------------- /stl/andimotoSmallTKLiso/wristRest/wrist330R.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimotoSmallTKLiso/wristRest/wrist330R.stl -------------------------------------------------------------------------------- /stl/andimoto75Q1-iso/andimoto75Q1-iso-ALL-frame.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimoto75Q1-iso/andimoto75Q1-iso-ALL-frame.stl -------------------------------------------------------------------------------- /wiring_sheets/andimmoto-numpad/andimoto-numpad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/wiring_sheets/andimmoto-numpad/andimoto-numpad.png -------------------------------------------------------------------------------- /wiring_sheets/andimoto6064/andimoto6064_wiring.odg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/wiring_sheets/andimoto6064/andimoto6064_wiring.odg -------------------------------------------------------------------------------- /wiring_sheets/andimoto6064/andimoto6064_wiring.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/wiring_sheets/andimoto6064/andimoto6064_wiring.pdf -------------------------------------------------------------------------------- /wiring_sheets/andimoto7583/andimoto7583_wiring.odg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/wiring_sheets/andimoto7583/andimoto7583_wiring.odg -------------------------------------------------------------------------------- /wiring_sheets/andimoto7583/andimoto7583_wiring.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/wiring_sheets/andimoto7583/andimoto7583_wiring.pdf -------------------------------------------------------------------------------- /wiring_sheets/qmk_ArduinoProMicro_layout_sheets.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/wiring_sheets/qmk_ArduinoProMicro_layout_sheets.pdf -------------------------------------------------------------------------------- /stl/andimoto75Q1-iso/andimoto75Q1-iso-lidRteensy2.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimoto75Q1-iso/andimoto75Q1-iso-lidRteensy2.stl -------------------------------------------------------------------------------- /stl/andimotoSmallTKLiso/andimotoSmallTKLiso_lidL.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimotoSmallTKLiso/andimotoSmallTKLiso_lidL.stl -------------------------------------------------------------------------------- /stl/andimotoSmallTKLiso/wristRest/wristConnectors.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimotoSmallTKLiso/wristRest/wristConnectors.stl -------------------------------------------------------------------------------- /wiring_sheets/andimoto6064/andimoto6064_mirrored.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/wiring_sheets/andimoto6064/andimoto6064_mirrored.png -------------------------------------------------------------------------------- /wiring_sheets/andimoto7583/andimoto7583_mirrored.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/wiring_sheets/andimoto7583/andimoto7583_mirrored.png -------------------------------------------------------------------------------- /stl/andimoto75Q1-iso/andimoto75Q1-iso-caseL-teensy2.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimoto75Q1-iso/andimoto75Q1-iso-caseL-teensy2.stl -------------------------------------------------------------------------------- /stl/andimoto75Q1-iso/andimoto75Q1-iso-caseR-teensy2.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimoto75Q1-iso/andimoto75Q1-iso-caseR-teensy2.stl -------------------------------------------------------------------------------- /stl/andimoto75Q1-iso/andimoto75Q1-iso-lidL-teensy2.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimoto75Q1-iso/andimoto75Q1-iso-lidL-teensy2.stl -------------------------------------------------------------------------------- /stl/andimotoSmallTKLiso/wristRest/wrist330_complete.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimotoSmallTKLiso/wristRest/wrist330_complete.stl -------------------------------------------------------------------------------- /wiring_sheets/andimoto6064/andimoto6064_qmk_layout.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/wiring_sheets/andimoto6064/andimoto6064_qmk_layout.pdf -------------------------------------------------------------------------------- /wiring_sheets/andimoto7583/andimoto7583_qmk_layout.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/wiring_sheets/andimoto7583/andimoto7583_qmk_layout.pdf -------------------------------------------------------------------------------- /stl/andimoto75Q1-iso/andimoto75Q1-iso-ALL-Case-Teensy2.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimoto75Q1-iso/andimoto75Q1-iso-ALL-Case-Teensy2.stl -------------------------------------------------------------------------------- /stl/andimoto75Q1-iso/andimoto75Q1-iso-ALL-Lid-Teensy2.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimoto75Q1-iso/andimoto75Q1-iso-ALL-Lid-Teensy2.stl -------------------------------------------------------------------------------- /stl/andimotoSmallTKLiso/andimotoSmallTKLiso_keyboardRiser.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimotoSmallTKLiso/andimotoSmallTKLiso_keyboardRiser.stl -------------------------------------------------------------------------------- /stl/andimotoSmallTKLiso/andimotoSmallTKLiso_lidR-ProMicro.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimotoSmallTKLiso/andimotoSmallTKLiso_lidR-ProMicro.stl -------------------------------------------------------------------------------- /stl/andimotoSmallTKLiso/andimotoSmallTKLiso_lidR-Teensy2.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimotoSmallTKLiso/andimotoSmallTKLiso_lidR-Teensy2.stl -------------------------------------------------------------------------------- /stl/andimotoSmallTKLiso/andimotoSmallTKLiso_mainCaseLeft.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimotoSmallTKLiso/andimotoSmallTKLiso_mainCaseLeft.stl -------------------------------------------------------------------------------- /wiring_sheets/andimmoto-numpad/andimoto-numpad-mirrored.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/wiring_sheets/andimmoto-numpad/andimoto-numpad-mirrored.png -------------------------------------------------------------------------------- /wiring_sheets/andimoto75Q1-iso/andimoto75Q1-iso-mirrored.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/wiring_sheets/andimoto75Q1-iso/andimoto75Q1-iso-mirrored.png -------------------------------------------------------------------------------- /wiring_sheets/andimoto_SmallTKL_iso/andimoto_smallTKL_iso.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/wiring_sheets/andimoto_SmallTKL_iso/andimoto_smallTKL_iso.png -------------------------------------------------------------------------------- /stl/andimoto7583/Readme.md: -------------------------------------------------------------------------------- 1 | Added lid without holder for pcb. Just the top of the pcb holder was removed. The pocket for the pcb is still there. 2 | Files are marked with *CNC 3 | -------------------------------------------------------------------------------- /stl/andimotoSmallTKLiso/andimotoSmallTKLiso_ALL-Lid-Teensy2.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimotoSmallTKLiso/andimotoSmallTKLiso_ALL-Lid-Teensy2.stl -------------------------------------------------------------------------------- /stl/andimotoSmallTKLiso/andimotoSmallTKLiso_ALL-Case-ProMicro.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimotoSmallTKLiso/andimotoSmallTKLiso_ALL-Case-ProMicro.stl -------------------------------------------------------------------------------- /stl/andimotoSmallTKLiso/andimotoSmallTKLiso_ALL-Case-Teensy2.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimotoSmallTKLiso/andimotoSmallTKLiso_ALL-Case-Teensy2.stl -------------------------------------------------------------------------------- /stl/andimotoSmallTKLiso/andimotoSmallTKLiso_ALL-Lid-ProMicro.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimotoSmallTKLiso/andimotoSmallTKLiso_ALL-Lid-ProMicro.stl -------------------------------------------------------------------------------- /wiring_sheets/andimoto75Q1-iso/andimoto75Q1_iso_teensy2_wiring.odg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/wiring_sheets/andimoto75Q1-iso/andimoto75Q1_iso_teensy2_wiring.odg -------------------------------------------------------------------------------- /wiring_sheets/andimoto75Q1-iso/andimoto75Q1_iso_teensy2_wiring.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/wiring_sheets/andimoto75Q1-iso/andimoto75Q1_iso_teensy2_wiring.pdf -------------------------------------------------------------------------------- /stl/andimoto7583/andimoto7584-frame-proMicro/andimoto7584-riser.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimoto7583/andimoto7584-frame-proMicro/andimoto7584-riser.stl -------------------------------------------------------------------------------- /stl/andimotoSmallTKLiso/andimotoSmallTKLiso_mainCaseRight-Teensy.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimotoSmallTKLiso/andimotoSmallTKLiso_mainCaseRight-Teensy.stl -------------------------------------------------------------------------------- /wiring_sheets/andimoto_SmallTKL_iso/andimoto_smallTKL_iso_wiring.odg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/wiring_sheets/andimoto_SmallTKL_iso/andimoto_smallTKL_iso_wiring.odg -------------------------------------------------------------------------------- /wiring_sheets/andimoto_SmallTKL_iso/andimoto_smallTKL_iso_wiring.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/wiring_sheets/andimoto_SmallTKL_iso/andimoto_smallTKL_iso_wiring.pdf -------------------------------------------------------------------------------- /stl/andimotoSmallTKLiso/andimotoSmallTKLiso_mainCaseRight-ProMicro.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimotoSmallTKLiso/andimotoSmallTKLiso_mainCaseRight-ProMicro.stl -------------------------------------------------------------------------------- /wiring_sheets/andimoto_SmallTKL_iso/andimoto_smallTKL_iso_mirrored.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/wiring_sheets/andimoto_SmallTKL_iso/andimoto_smallTKL_iso_mirrored.png -------------------------------------------------------------------------------- /wiring_sheets/andimoto_SmallTKL_iso/andimoto_smallTKL_iso_qmk_layout.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/wiring_sheets/andimoto_SmallTKL_iso/andimoto_smallTKL_iso_qmk_layout.pdf -------------------------------------------------------------------------------- /stl/andimotoSmallTKL/andimotoSmallTKL_fRow/andimotoSmallTKL_fRow_Riser.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimotoSmallTKL/andimotoSmallTKL_fRow/andimotoSmallTKL_fRow_Riser.stl -------------------------------------------------------------------------------- /stl/andimotoSmallTKL/andimotoSmallTKL_fRow/andimotoSmallTKL_fRow_LidL_Teensy2.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimotoSmallTKL/andimotoSmallTKL_fRow/andimotoSmallTKL_fRow_LidL_Teensy2.stl -------------------------------------------------------------------------------- /stl/andimotoSmallTKL/andimotoSmallTKL_fRow/andimotoSmallTKL_fRow_LidR_Teensy2.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimotoSmallTKL/andimotoSmallTKL_fRow/andimotoSmallTKL_fRow_LidR_Teensy2.stl -------------------------------------------------------------------------------- /conf/module-calls.conf: -------------------------------------------------------------------------------- 1 | module1: mainCase(layout); 2 | module2: lid(); 3 | module3: mainCaseLeft(layout); 4 | module4: mainCaseRight(layout); 5 | module5: lidL(); 6 | module6: lidR(); 7 | module7: keyboardRiser(); 8 | -------------------------------------------------------------------------------- /stl/andimoto7583/andimoto7584-frame-proMicro/andimoto7584-lidAll-frame-proMicro.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimoto7583/andimoto7584-frame-proMicro/andimoto7584-lidAll-frame-proMicro.stl -------------------------------------------------------------------------------- /stl/andimoto7583/andimoto7584-frame-proMicro/andimoto7584-caseAll-frame-proMicro.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimoto7583/andimoto7584-frame-proMicro/andimoto7584-caseAll-frame-proMicro.stl -------------------------------------------------------------------------------- /stl/andimoto7583/andimoto7584-frame-proMicro/andimoto7584-caseLeft-frame-proMicro.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimoto7583/andimoto7584-frame-proMicro/andimoto7584-caseLeft-frame-proMicro.stl -------------------------------------------------------------------------------- /stl/andimoto7583/andimoto7584-frame-proMicro/andimoto7584-caseRight-frame-proMicro.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimoto7583/andimoto7584-frame-proMicro/andimoto7584-caseRight-frame-proMicro.stl -------------------------------------------------------------------------------- /stl/andimoto7583/andimoto7584-frame-proMicro/andimoto7584-frameAll-frame-proMicro.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimoto7583/andimoto7584-frame-proMicro/andimoto7584-frameAll-frame-proMicro.stl -------------------------------------------------------------------------------- /stl/andimoto7583/andimoto7584-frame-proMicro/andimoto7584-frameLeft-frame-proMicro.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimoto7583/andimoto7584-frame-proMicro/andimoto7584-frameLeft-frame-proMicro.stl -------------------------------------------------------------------------------- /stl/andimoto7583/andimoto7584-frame-proMicro/andimoto7584-lidLeft-frame-proMicro.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimoto7583/andimoto7584-frame-proMicro/andimoto7584-lidLeft-frame-proMicro.stl -------------------------------------------------------------------------------- /stl/andimoto7583/andimoto7584-frame-proMicro/andimoto7584-lidRight-frame-proMicro.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimoto7583/andimoto7584-frame-proMicro/andimoto7584-lidRight-frame-proMicro.stl -------------------------------------------------------------------------------- /stl/andimoto7583/andimoto7584-frame-proMicro/andimoto7584-frameRight-frame-proMicro.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimoto7583/andimoto7584-frame-proMicro/andimoto7584-frameRight-frame-proMicro.stl -------------------------------------------------------------------------------- /stl/andimotoSmallTKL/andimotoSmallTKL_fRow/andimotoSmallTKL_fRow_mainCaseLeft_Teensy2.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimotoSmallTKL/andimotoSmallTKL_fRow/andimotoSmallTKL_fRow_mainCaseLeft_Teensy2.stl -------------------------------------------------------------------------------- /stl/andimotoSmallTKL/andimotoSmallTKL_fRow/andimotoSmallTKL_fRow_mainCaseRight_Teensy2.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andimoto/keebcu/HEAD/stl/andimotoSmallTKL/andimotoSmallTKL_fRow/andimotoSmallTKL_fRow_mainCaseRight_Teensy2.stl -------------------------------------------------------------------------------- /stl/andimoto7583/andimoto7583-obj-cnc/Unnamed-andimoto7583_lid.mtl: -------------------------------------------------------------------------------- 1 | # FreeCAD v2024.1 build0 Arch module 2 | # https://www.freecad.org 3 | newmtl color_727980 4 | Kd 0.4470588266849518 0.4745098054409027 0.501960813999176 5 | Tr 0.0 6 | d 1.0 7 | # Material Count: 1 -------------------------------------------------------------------------------- /stl/andimoto7583/andimoto7583-obj-cnc/Unnamed-andimoto7583_lidL.mtl: -------------------------------------------------------------------------------- 1 | # FreeCAD v2024.1 build0 Arch module 2 | # https://www.freecad.org 3 | newmtl color_727980 4 | Kd 0.4470588266849518 0.4745098054409027 0.501960813999176 5 | Tr 0.0 6 | d 1.0 7 | # Material Count: 1 -------------------------------------------------------------------------------- /stl/andimoto7583/andimoto7583-obj-cnc/Unnamed-andimoto7583_lidR.mtl: -------------------------------------------------------------------------------- 1 | # FreeCAD v2024.1 build0 Arch module 2 | # https://www.freecad.org 3 | newmtl color_727980 4 | Kd 0.4470588266849518 0.4745098054409027 0.501960813999176 5 | Tr 0.0 6 | d 1.0 7 | # Material Count: 1 -------------------------------------------------------------------------------- /stl/andimoto7583/andimoto7583-obj-cnc/Unnamed-andimoto7583_lid_CNC.mtl: -------------------------------------------------------------------------------- 1 | # FreeCAD v2024.1 build0 Arch module 2 | # https://www.freecad.org 3 | newmtl color_727980 4 | Kd 0.4470588266849518 0.4745098054409027 0.501960813999176 5 | Tr 0.0 6 | d 1.0 7 | # Material Count: 1 -------------------------------------------------------------------------------- /stl/andimoto7583/andimoto7583-obj-cnc/Unnamed-andimoto7583_lidR_CNC.mtl: -------------------------------------------------------------------------------- 1 | # FreeCAD v2024.1 build0 Arch module 2 | # https://www.freecad.org 3 | newmtl color_727980 4 | Kd 0.4470588266849518 0.4745098054409027 0.501960813999176 5 | Tr 0.0 6 | d 1.0 7 | # Material Count: 1 -------------------------------------------------------------------------------- /stl/andimoto7583/andimoto7583-obj-cnc/Unnamed-andimoto7583_mainCase.mtl: -------------------------------------------------------------------------------- 1 | # FreeCAD v2024.1 build0 Arch module 2 | # https://www.freecad.org 3 | newmtl color_727980 4 | Kd 0.4470588266849518 0.4745098054409027 0.501960813999176 5 | Tr 0.0 6 | d 1.0 7 | # Material Count: 1 -------------------------------------------------------------------------------- /stl/andimoto7583/andimoto7583-obj-cnc/Unnamed-andimoto7583_mainCaseLeft.mtl: -------------------------------------------------------------------------------- 1 | # FreeCAD v2024.1 build0 Arch module 2 | # https://www.freecad.org 3 | newmtl color_727980 4 | Kd 0.4470588266849518 0.4745098054409027 0.501960813999176 5 | Tr 0.0 6 | d 1.0 7 | # Material Count: 1 -------------------------------------------------------------------------------- /stl/andimoto7583/andimoto7583-obj-cnc/Unnamed-andimoto7583_keyboardRiser.mtl: -------------------------------------------------------------------------------- 1 | # FreeCAD v2024.1 build0 Arch module 2 | # https://www.freecad.org 3 | newmtl color_727980 4 | Kd 0.4470588266849518 0.4745098054409027 0.501960813999176 5 | Tr 0.0 6 | d 1.0 7 | # Material Count: 1 -------------------------------------------------------------------------------- /stl/andimoto7583/andimoto7583-obj-cnc/Unnamed-andimoto7583_mainCaseRight.mtl: -------------------------------------------------------------------------------- 1 | # FreeCAD v2024.1 build0 Arch module 2 | # https://www.freecad.org 3 | newmtl color_727980 4 | Kd 0.4470588266849518 0.4745098054409027 0.501960813999176 5 | Tr 0.0 6 | d 1.0 7 | # Material Count: 1 -------------------------------------------------------------------------------- /constants.scad: -------------------------------------------------------------------------------- 1 | /* constants.scad 2 | Author: andimoto@posteo.de 3 | ---------------------------- 4 | for placing assambled parts and 5 | single parts go to end of this file 6 | 7 | this file is a template which may be copied to create a new keyboard layout 8 | and to configure and place essential parts like usb cut out, screw holes or stabilizers 9 | 10 | this file includes KeyV2 files. see https://github.com/rsheldiii/KeyV2 11 | if you don't want this file to be included, just don't clone this library or 12 | remove the call for placing all keycaps on the keyboard. 13 | */ 14 | 15 | 16 | /* ###### don't touch this! ###### */ 17 | //Unit square length, from Cherry MX data sheet 18 | //this is the size of 1unit including keycap size and 19 | //the space to the next keycap 20 | lkey=19.05; 21 | //Hole size, from Cherry MX data sheet 22 | holesize=14; 23 | 24 | //calculated vars 25 | holediff=lkey-holesize; 26 | caseWidth=width*lkey; 27 | caseDepth=height*lkey; 28 | 29 | /* for costar style stab cutouts */ 30 | stabX=3.3;//6.75; 31 | stabCutoutWidth=0.825; 32 | 33 | /* these are the values of the costar style stabilizers */ 34 | shortStabX=24; 35 | longStabX=101; 36 | 37 | innerExtraLid = 1; 38 | 39 | //constant for inner case 40 | innerCaseRadius=1; 41 | 42 | //default height of the frame when in use 43 | frameHeight = 6; 44 | 45 | //height of the head of a cylinder head screw m2 46 | screwHeadHeight = 3; 47 | 48 | extraSpace=0.8; 49 | -------------------------------------------------------------------------------- /wrist.scad: -------------------------------------------------------------------------------- 1 | /* wrist.scad 2 | Author: andimoto@posteo.de 3 | ---------------------------- 4 | for placing assambled parts and 5 | single parts go to end of this file 6 | 7 | set the form of the wrist rest in "wristForm" array 8 | */ 9 | 10 | $fn=50; 11 | 12 | wristLength = 306; 13 | edgeRadius = 1; 14 | 15 | connectorRadius=3; 16 | connectorLen=40; 17 | 18 | wristForm=[ 19 | [0,0], 20 | [80,0], 21 | [80,5], 22 | [78.2,8.2], 23 | [75,10], 24 | [40,16], 25 | [0,16] 26 | ]; 27 | 28 | 29 | 30 | module connector(rad,conLength) 31 | { 32 | cylinder(r=rad, h=conLength, center=true); 33 | } 34 | 35 | module wristProfile(form) 36 | { 37 | polygon(form); 38 | } 39 | 40 | module wrist(length=360) 41 | { 42 | translate([edgeRadius,edgeRadius,edgeRadius]) 43 | rotate([90,0,90]) 44 | minkowski() 45 | { 46 | union() 47 | { 48 | linear_extrude(length-edgeRadius*2) 49 | wristProfile(wristForm); 50 | } 51 | /* rotate([0,90,0]) cylinder(r=edgeRadius, h=1, center=true); */ 52 | sphere(r=edgeRadius); 53 | } 54 | } 55 | 56 | module wristRestLeft(length) 57 | { 58 | difference() { 59 | wrist(length); 60 | translate([0,-1,0]) rotate([90,0,90]) linear_extrude(length/2) 61 | scale([1.1,1.2,1]) wristProfile(wristForm); 62 | translate([length/2,10,6]) rotate([0,90,0]) connector(connectorRadius+0.2,connectorLen); 63 | translate([length/2,40,6]) rotate([0,90,0]) connector(connectorRadius+0.2,connectorLen); 64 | translate([length/2,70,6]) rotate([0,90,0]) connector(connectorRadius+0.2,connectorLen); 65 | } 66 | } 67 | 68 | module wristRestRight(length=360) 69 | { 70 | difference() { 71 | wrist(length); 72 | translate([length/2,-1,0]) rotate([90,0,90]) linear_extrude(length/2) 73 | scale([1.1,1.2,1]) wristProfile(wristForm); 74 | translate([length/2,10,6]) rotate([0,90,0]) connector(connectorRadius+0.2,connectorLen); 75 | translate([length/2,40,6]) rotate([0,90,0]) connector(connectorRadius+0.2,connectorLen); 76 | translate([length/2,70,6]) rotate([0,90,0]) connector(connectorRadius+0.2,connectorLen); 77 | } 78 | } 79 | 80 | 81 | translate([0,150+connectorLen,connectorLen/2]) connector(connectorRadius-0.0,connectorLen-3); 82 | translate([0,150+connectorLen+10,connectorLen/2]) connector(connectorRadius-0.0,connectorLen-3); 83 | translate([0,150+connectorLen+20,connectorLen/2]) connector(connectorRadius-0.0,connectorLen-3); 84 | /* wristProfile(wristForm); */ 85 | /* wrist(wristLength); */ 86 | /* translate([0,100,0]) wristRestRight(wristLength); */ 87 | /* translate([20,100,0]) wristRestLeft(wristLength); */ 88 | -------------------------------------------------------------------------------- /keebCase.scad: -------------------------------------------------------------------------------- 1 | /* keebCase.scad 2 | Author: andimoto@posteo.de 3 | ---------------------------- 4 | for placing assambled parts and 5 | single parts go to end of this file 6 | */ 7 | 8 | $fn=50; 9 | 10 | keebLen = 330; 11 | keebThickness = 60; 12 | keebHeight = 117; 13 | wallThickness = 3; 14 | sideThickness = 10; 15 | edgeRadius = 2; 16 | 17 | magnetRadius = 5/2; 18 | magnetThickness = 1; 19 | 20 | lockRadius = 10; 21 | lockThickness = 6; 22 | 23 | module sphereCut() 24 | { 25 | translate([0,0,10]) 26 | difference() 27 | { 28 | sphere(r=11); 29 | translate([0,13,0]) cube([22, 22, 22],center = true); 30 | translate([0,0,5.1]) cube([22, 22, 22],center = true); 31 | } 32 | } 33 | 34 | module lock(radius=lockRadius, height=lockThickness, negativ=false) 35 | { 36 | difference() { 37 | /* lock part */ 38 | minkowski() 39 | { 40 | difference() { 41 | hull() 42 | { 43 | cylinder(r=radius,h=height); 44 | translate([0,radius*2,0]) cylinder(r=radius,h=height); 45 | } 46 | translate([radius*2-radius/2,radius,0]) cylinder(r=radius,h=height); 47 | translate([-radius*2+radius/2,radius,0]) cylinder(r=radius,h=height); 48 | } 49 | cylinder(r=edgeRadius,h=0.0000001, center=true); 50 | } 51 | 52 | 53 | if(negativ == false) 54 | { 55 | /* cutout for fingers */ 56 | translate([0,0,2]) sphereCut(); 57 | translate([0,radius*2,2]) rotate([0,0,180]) sphereCut(); 58 | } 59 | 60 | if(negativ == false) 61 | { 62 | /* magnet holes */ 63 | translate([0,-radius/1.5,0.75]) cylinder(r=magnetRadius, h=magnetThickness+0.5, center=true); 64 | translate([0,radius*2+radius/1.5,0.75]) cylinder(r=magnetRadius, h=magnetThickness+0.5, center=true); 65 | } 66 | 67 | /* debug cut */ 68 | /* cube([radius*2,50,5]); */ 69 | } 70 | if(negativ == true) 71 | { 72 | /* magnet holes */ 73 | translate([0,-radius/1.5,-0.5]) cylinder(r=magnetRadius, h=magnetThickness, center=true); 74 | translate([0,radius*2+radius/1.5,-0.5]) cylinder(r=magnetRadius, h=magnetThickness, center=true); 75 | } 76 | } 77 | /* lock(negativ=true); */ 78 | 79 | 80 | module halfCase(locks=true, magnets=true) 81 | { 82 | difference() { 83 | minkowski() 84 | { 85 | cube([keebHeight+sideThickness*2, 86 | keebThickness+wallThickness*2, 87 | keebLen/2+wallThickness]); 88 | cylinder(r=edgeRadius, center=true); 89 | } 90 | 91 | translate([sideThickness,wallThickness,wallThickness]) 92 | minkowski() 93 | { 94 | cube([keebHeight, 95 | keebThickness, 96 | keebLen/2]); 97 | cylinder(r=edgeRadius, center=true); 98 | } 99 | 100 | 101 | if(magnets == true) 102 | { 103 | /* magnets */ 104 | translate([sideThickness/2-edgeRadius, keebThickness/6,keebLen/2+wallThickness]) 105 | cylinder(r=magnetRadius, h=magnetThickness, center=true); 106 | translate([sideThickness/2-edgeRadius,(keebThickness+2*wallThickness)-keebThickness/6,keebLen/2+wallThickness]) 107 | cylinder(r=magnetRadius, h=magnetThickness, center=true); 108 | 109 | translate([keebHeight+sideThickness*2-sideThickness/2+edgeRadius, keebThickness/6,keebLen/2+wallThickness]) 110 | cylinder(r=magnetRadius, h=magnetThickness, center=true); 111 | translate([keebHeight+sideThickness*2-sideThickness/2+edgeRadius,(keebThickness+2*wallThickness)-keebThickness/6,keebLen/2+wallThickness]) 112 | cylinder(r=magnetRadius, h=magnetThickness, center=true); 113 | } 114 | 115 | if(locks == true) 116 | { 117 | color("yellow") translate([lockThickness-wallThickness+1,keebThickness/2+wallThickness,(keebLen/2+wallThickness)-lockRadius+0.5]) 118 | rotate([90,0,0]) rotate([0,-90,0]) scale([1.02,1.02,1]) lock(negativ=true); 119 | 120 | color("yellow") translate([keebHeight+sideThickness+lockThickness,keebThickness/2+wallThickness,(keebLen/2+wallThickness)-lockRadius+0.5]) 121 | rotate([90,0,0]) rotate([0,90,0]) scale([1.02,1.02,1]) lock(negativ=true); 122 | } 123 | } 124 | } 125 | 126 | 127 | /* ############################################# */ 128 | /* ########## Place keyboard case ############## */ 129 | /* ############################################# */ 130 | 131 | color("yellow") translate([2,2,0]) halfCase(locks=true,magnets=true); 132 | /* color("yellow") translate([2,2,keebLen+wallThickness*2+1+0.0]) mirror([0,0,1]) halfCase(locks=true,magnets=true); */ 133 | 134 | 135 | /* case locks */ 136 | color("black") translate([lockThickness-0.1,(keebThickness/2+wallThickness*2)-1,(keebLen/2)-lockRadius+3.5]) 137 | rotate([90,0,0]) rotate([0,-90,0]) lock(negativ=false); 138 | 139 | color("black") translate([(keebHeight+sideThickness*2)-lockThickness/3,(keebThickness/2+wallThickness*2)-1,(keebLen/2)-lockRadius+3.5]) 140 | rotate([90,0,0]) rotate([0,90,0]) lock(negativ=false); 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | /*########### DEBUG ###########*/ 150 | 151 | /* test print */ 152 | /* difference() 153 | { 154 | translate([2,2,1]) halfCase(locks=true,magnets=true); 155 | cube([keebHeight+10,keebThickness+10,keebLen/2+wallThickness*2]); 156 | } */ 157 | -------------------------------------------------------------------------------- /numpad.scad: -------------------------------------------------------------------------------- 1 | /* numpad.scad 2 | Author: andimoto@posteo.de 3 | ---------------------------- 4 | for placing assambled parts and 5 | single parts go to end of this file 6 | 7 | this file contains the layout for my numpad keyboard 3d model which can be printed 8 | 9 | this file includes KeyV2 files. see https://github.com/rsheldiii/KeyV2 10 | if you don't want this file to be included, just don't clone this library or 11 | set the 'DoKeycapSimulation' parameter of KeyboardSim() to false. 12 | */ 13 | 14 | /* ########## predefinitions ############ */ 15 | $fn=30; 16 | 17 | 18 | /* Thickness of entire plate which holds the switches. 19 | * this is the top of the keyboard 20 | */ 21 | plateThickness=3; 22 | /* thickness of the walls */ 23 | wallThickness=3; 24 | /* height of the case */ 25 | caseHeight=13; 26 | 27 | /* space between inner case stabilizers 28 | and the bottom/lip of the case */ 29 | innerCaseSpace = 5; 30 | 31 | 32 | //length, in units, of board 33 | width=4; 34 | //Height, in units, of board 35 | height=6; 36 | 37 | /* thickness of the lid. 38 | the function 'lid()' will add an 39 | extra mm to get a step for the lip 40 | see 'innerExtraLid' variable in constants */ 41 | lidThickness=3; 42 | 43 | 44 | /* ########## variables for cutting keyboard into smaller pieces ########## */ 45 | /* these are unit values; one unit is one key or switchhole 46 | * this makes the keyboard printable on nearly every printer. 47 | */ 48 | cutAfterUnits = 7.25; 49 | spacebarCut = 4.5; 50 | 51 | /* fRowSeparator [true/false] 52 | * Select separation of F-Row (or Row 0; key[0][1]=0) 53 | * This will move the upper row by a half unit (lkey*0.5) 54 | */ 55 | fRowSeparator=false; 56 | 57 | /* skirt selctor and skirt settings 58 | * select 'skirtSelect' as true to activate a additional skirt 59 | * around the keyboard case. The variables 'skirtX' & 'skirtY' 60 | * are configurable as you want the skirt. These values ADD the 61 | * configured amount to the side of the case. 62 | * Note: be careful here, this interacts with caseRadius 63 | * 64 | * If this is activated you can call 'capFrame()' 65 | * (or capFrameR/capFrameL) to create a nice frame 66 | * around the keycaps to cover the switches. This may give 67 | * a cleaner look if this is prefered. 68 | */ 69 | skirtSelect = false; 70 | skirtX = 3; 71 | skirtY = 3; 72 | 73 | /* edge radius of the case 74 | * Note: be careful here, this interacts with skirtX/Y 75 | * THIS IS ONLY VALID WHEN 'skirtSelect' IS TRUE 76 | */ 77 | caseRadius=5; 78 | 79 | 80 | /* ################## calculated vars #################### */ 81 | 82 | 83 | /* debug extra for avoiding artefacts @ compilation */ 84 | extra=1; 85 | 86 | 87 | /* add or reduce some tolerance for the switch holes. 88 | * depends on your printers resolution and if you want 89 | * narrow or loose fit of switches. do not configure to 90 | * narrow switch holes. when placing switches into the holes 91 | * they will pull the case apart and bend it. this will normally 92 | * be reduced by the lid, but do not overact this. 93 | */ 94 | switchHoleTolerance = -0.2; 95 | 96 | 97 | /* ############################################## */ 98 | /* ########## LAYOUT AND KEYCAP COLORS ########## */ 99 | /* ############################################## */ 100 | /* Usage: [[column place, row place],keycap unit, color for keycap simulation] */ 101 | /* "column place" is the place of the switch hole in the column; 102 | - example: Esc, F1, F2, F3, ... 103 | 0 1 2 3 ... 104 | "row place" is the place of the switch in the row; 105 | - example: Esc, accent, TAB, CapsLock, ... 106 | */ 107 | 108 | /* numpad layout */ 109 | layout = [ 110 | [[ 0,1],1,"Blue"], //numlock 111 | [[ 1,1],1,"Blue"], // / 112 | [[ 2,1],1,"Blue"], // * 113 | [[ 3,1],1,"Blue"], // - 114 | //start ROW 1 115 | [[ 0,2],1,"DeepSkyBlue"], //7 116 | [[ 1,2],1,"DeepSkyBlue"], //8 117 | [[ 2,2],1,"DeepSkyBlue"], //9 118 | [[ 3,2.5],1,"Blue"], // + 119 | //start ROW 2 120 | [[ 0,3],1,"DeepSkyBlue"], //4 121 | [[ 1,3],1,"DeepSkyBlue"], //5 122 | [[ 2,3],1,"DeepSkyBlue"], //6 123 | /* [[ 3,2],1,"MintCream"], //E */ 124 | //start ROW 3 125 | [[ 0,4],1,"DeepSkyBlue"], //1 126 | [[ 1,4],1,"DeepSkyBlue"], //2 127 | [[ 2,4],1,"DeepSkyBlue"], //3 128 | [[ 3,4.5],1,"Red"], // numpad enter 129 | //start ROW 4 130 | [[ 0,5],2,"DeepSkyBlue"], //0 131 | [[ 2,5],1,"DeepSkyBlue"], //, 132 | 133 | ]; 134 | 135 | /* enable placment of stabilizers on switchholes with x.5 unit in y direction 136 | * for example: true for numpad enter or numpad + 137 | * if you just want a single unit (1unit keycap) you can set this to false */ 138 | enableStabsOnHalfs = true; 139 | 140 | /* move pcb and usb cutout in x direction 141 | for better placement */ 142 | pcbShift=8.5; 143 | 144 | /* cutout for micro usb plug (not the housing of the usb plug!) 145 | * change this if using mini usb 146 | */ 147 | usbCutX=8; 148 | usbCutY=wallThickness; 149 | 150 | /* Arduino Pro Micro USB Port height */ 151 | usbCutZ=3.4; 152 | 153 | /* Teensy2 USB Port height */ 154 | /* usbCutZ=4.5; */ 155 | 156 | 157 | /* space in lid for placing the controller pcb. 158 | * this example is for arduino pro micro clones. 159 | * if you use teensy2.0 or something else configure 160 | * the size of the controller pcb you use. the function 161 | * 'pcbCutout()' will add 1mm to 'pcbWidth' for some clearance. 162 | * pcbLength should be as exactly as possible. this keeps the pcb 163 | * perfectly even if pcbWidth is to much 164 | */ 165 | /* teensy2 cutout */ 166 | //pcbHeight = 1.8; 167 | //pcbWidth = 18.5; 168 | //pcbLength = 31.4; 169 | 170 | /* arduino pro micro cutout */ 171 | pcbHeight = 2; 172 | pcbWidth = 18; 173 | pcbLength = 34;; 174 | 175 | /* set 'addRisers' to true or false 176 | * to calculate a lid with holes for risers 177 | * and add risers to simulation 178 | */ 179 | addRisers = true; 180 | 181 | /* keyboardRiser config 182 | * angleBaseX -> width of the riser 183 | * angleBaseY -> depth of the riser 184 | */ 185 | angleBaseY=90; 186 | angleBaseX=12; 187 | /* riser edge radius */ 188 | angleBaseRad=1; 189 | /* polygon; this is the shape of the riser */ 190 | riserPoints = [ 191 | [0,0], 192 | [angleBaseY,0], 193 | [angleBaseY,4], 194 | [0,18] 195 | ]; 196 | 197 | /* optional: move keyboard risers as needed */ 198 | xRiserR=-22; 199 | xRiserL=22; 200 | yRiserAll=0; 201 | 202 | riserConnectorRadius = 4; 203 | riserConnectorX = 0; 204 | riserConnectorY1 = 40; 205 | 206 | 207 | 208 | 209 | /* ####### include keyboard lib ############ */ 210 | include 211 | include 212 | 213 | 214 | /* this module gets called in 'holematrix' and adds a specific 215 | * object to the 'holematrix'. it enables placing switchholes 216 | * or other cutout objects to the model */ 217 | module extraCutoutHook() 218 | { 219 | } 220 | 221 | /* this module gets called in 'keycapMatrix()' and adds a specific 222 | * object to the keycapMatrix. keycapMatrix is needed as a cutout element 223 | * from the frame. this hook gives possibility to add more elements such 224 | * as the enter keycap. 225 | */ 226 | module extraKeycapCutoutHook() 227 | { 228 | } 229 | 230 | /* this module gets called in 'keySim()' and adds a specific 231 | * object to the 'key simulation'. it enables placing keys 232 | * or other objects to the model simulation */ 233 | module extraKeySimHook() 234 | { 235 | } 236 | 237 | 238 | /* ####### screw hole config ######## */ 239 | /* set the screw holes to a good position. 240 | * if your keyboard is bigger, you can add some 241 | * more screw holes into the keyboard case and lid. 242 | */ 243 | screwHoleArray = [ 244 | [20.5,lkey], //left lower row 245 | [55,lkey], 246 | 247 | 248 | [19,lkey*5], //left upper row 249 | [57,lkey*5], 250 | ]; 251 | 252 | /* rotate screw hole spacers */ 253 | screwSpacerRotation=0; 254 | 255 | /* move horizontal case stabilizers inside the case. 256 | * to move horizontal by lkey/2 for half switch cutout. 257 | * this enables to set x.5 values in layout array. 258 | * else use 0!! 259 | */ 260 | caseStabMov=0; 261 | 262 | /* screw holes when enabling outer case frame */ 263 | frameScrewHoleArray = [ 264 | [-skirtX/2-innerCaseRadius/2,-skirtY/2-innerCaseRadius/2], //lower row 265 | [caseWidth/4,-skirtY/2-innerCaseRadius/2], 266 | [caseWidth/2-lkey,-skirtY/2-innerCaseRadius/2], 267 | [caseWidth/2+lkey,-skirtY/2-innerCaseRadius/2], //lower row 268 | [caseWidth-caseWidth/4,-skirtY/2-innerCaseRadius/2], 269 | [caseWidth+skirtX/2+innerCaseRadius/2,-skirtY/2-innerCaseRadius/2], 270 | 271 | [-skirtX/2-innerCaseRadius/2,lkey*1.5], //lower row 272 | [caseWidth+skirtX/2+innerCaseRadius/2,lkey*1.5], 273 | 274 | [-skirtX/2-innerCaseRadius/2,caseDepth-lkey*0.75], //lower row 275 | [caseWidth/2-lkey,caseDepth-lkey*0.75], 276 | [caseWidth/4,caseDepth-lkey*0.75], 277 | [caseWidth/2+lkey,caseDepth-lkey*0.75], //lower row 278 | [caseWidth-caseWidth/4,caseDepth-lkey*0.75], 279 | [caseWidth+skirtX/2+innerCaseRadius/2,caseDepth-lkey*0.75], 280 | 281 | [-skirtX/2-innerCaseRadius/2,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2], //lower row 282 | [caseWidth/4,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2], 283 | [caseWidth/2-lkey,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2], 284 | [caseWidth/2+lkey,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2], //lower row 285 | [caseWidth-caseWidth/4,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2], 286 | [caseWidth+skirtX/2+innerCaseRadius/2,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2] 287 | ]; 288 | 289 | 290 | 291 | 292 | /* set colors for simulation, set 0 for default OpenSCAD Gui Colors */ 293 | colorCaseTop="White"; 294 | colorCaseMid="DarkGray"; 295 | colorLid="Black"; 296 | colorRiserR="Black"; 297 | colorRiserL="Black"; 298 | 299 | frameColor="Black"; 300 | 301 | /* color simulation for switches 302 | select top and bottom color */ 303 | switchColorTop = "Ivory"; 304 | switchColorBottom = "Black"; 305 | 306 | /* simulate a keycap profile with number of fragments ($fn = setKeycapFragments) 307 | which will be set to key() call. 308 | KeyV2 currently (2022-06) does not support XDA. 309 | Use DSA as they look very similar 310 | NOTE: DSA is fixed to 3rd row as KeyV2 includes row number into calculation 311 | of DSA caps 312 | NOTE: currently not all profiles are working. OEM or DCS are always simulated! */ 313 | keycapProfile = "SA"; // SA, DSA, DCS, G20, Hi-Pro, OEM 314 | setKeycapFragments = 50; 315 | 316 | /* ###################### BUILD_LINE ########################*/ 317 | /* ##########################################################*/ 318 | /* All calls after this line have to be ignored by the build script. 319 | * Do not place any calls above build line (or comment it) 320 | */ 321 | 322 | /* uncomment following line to get the keyboard simulation 323 | * with keycaps. set DoKeycapSimulation to true or false to add 324 | * or remove keycap simulation 325 | */ 326 | /* KeyboardSim(layout,doFrameSim=false,DoKeycapSimulation=false,xRotate=9.5); */ 327 | 328 | /* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */ 329 | /* ##### uncomment the keyboard part you want to print ##### */ 330 | /* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv */ 331 | 332 | /* ### complete keyboard model ### */ 333 | /* mainCase(layout); */ 334 | /* lid(); */ 335 | 336 | /* keycap frame functions. activate if skirt is enabled 337 | and you want a frame that hides the switches, which is 338 | a more classic look to none printed keyboards */ 339 | /* translate([0,0,13]) 340 | capFrame(layout); */ 341 | 342 | /* translate([0,0,13]) 343 | capFrameR(layout); */ 344 | 345 | /* translate([0,0,13]) 346 | capFrameL(layout); */ 347 | 348 | /* ### devided keyboard and lid model ### */ 349 | mainCaseLeft(layout); 350 | /* mainCaseRight(layout); */ 351 | 352 | /* lidL(); */ 353 | /* lidR(); */ 354 | 355 | 356 | /* keyboardRiser(); */ 357 | -------------------------------------------------------------------------------- /macropad.scad: -------------------------------------------------------------------------------- 1 | /* macropad.scad 2 | Author: andimoto@posteo.de 3 | ---------------------------- 4 | for placing assambled parts and 5 | single parts go to end of this file 6 | 7 | this file is a template which may be copied to create a new keyboard layout 8 | and to configure and place essential parts like usb cut out, screw holes or stabilizers 9 | 10 | this file includes KeyV2 files. see https://github.com/rsheldiii/KeyV2 11 | if you don't want this file to be included, just don't clone this library or 12 | set the 'DoKeycapSimulation' parameter of KeyboardSim() to false. 13 | */ 14 | 15 | /* ########## predefinitions ############ */ 16 | $fn=80; 17 | 18 | 19 | /* Thickness of entire plate which holds the switches. 20 | * this is the top of the keyboard 21 | */ 22 | plateThickness=3; 23 | /* thickness of the walls */ 24 | wallThickness=3; 25 | /* height of the case */ 26 | caseHeight=13; 27 | 28 | /* space between inner case stabilizers 29 | and the bottom/lip of the case */ 30 | innerCaseSpace = 5; 31 | 32 | //length, in units, of board 33 | width=5; 34 | //Height, in units, of board 35 | height=2.5; 36 | 37 | /* thickness of the lid. 38 | the function 'lid()' will add an 39 | extra mm to get a step for the lip 40 | see 'innerExtraLid' variable in constants */ 41 | lidThickness=3; 42 | 43 | 44 | /* ########## variables for cutting keyboard into smaller pieces ########## */ 45 | /* these are unit values; one unit is one key or switchhole 46 | * this makes the keyboard printable on nearly every printer. 47 | */ 48 | cutAfterUnits = 7.25; 49 | spacebarCut = 4.5; 50 | 51 | /* fRowSeparator [true/false] 52 | * Select separation of F-Row (or Row 0; key[0][1]=0) 53 | * This will move the upper row by a half unit (lkey*0.5) 54 | */ 55 | fRowSeparator=false; 56 | 57 | /* skirt selctor and skirt settings 58 | * select 'skirtSelect' as true to activate a additional skirt 59 | * around the keyboard case. The variables 'skirtX' & 'skirtY' 60 | * are configurable as you want the skirt. These values ADD the 61 | * configured amount to the side of the case. 62 | * Note: be careful here, this interacts with caseRadius 63 | * 64 | * If this is activated you can call 'capFrame()' 65 | * (or capFrameR/capFrameL) to create a nice frame 66 | * around the keycaps to cover the switches. This may give 67 | * a cleaner look if this is prefered. 68 | */ 69 | skirtSelect = true; 70 | skirtX = 4; 71 | skirtY = 4; 72 | 73 | /* enables screw holes in frame (if capFrame() is called) 74 | and in the case. The screws will be placed according to 75 | the array frameScrewHoleArray[] around the case and frame. 76 | */ 77 | frameScrewsEnable = false; 78 | 79 | /* edge radius of the case 80 | * Note: be careful here, this interacts with skirtX/Y 81 | * THIS IS ONLY VALID WHEN 'skirtSelect' IS TRUE 82 | */ 83 | caseRadius=5; 84 | 85 | 86 | /* debug extra for avoiding artefacts @ compilation */ 87 | extra=1; 88 | 89 | 90 | /* add or reduce some tolerance for the switch holes. 91 | * depends on your printers resolution and if you want 92 | * narrow or loose fit of switches. do not configure to 93 | * narrow switch holes. when placing switches into the holes 94 | * they will pull the case apart and bend it. this will normally 95 | * be reduced by the lid, but do not overact this. 96 | */ 97 | switchHoleTolerance = -0.2; 98 | 99 | 100 | /* ############################################## */ 101 | /* ########## LAYOUT AND KEYCAP COLORS ########## */ 102 | /* ############################################## */ 103 | /* Usage: [[column place, row place],keycap unit, color for keycap simulation] */ 104 | /* "column place" is the place of the switch hole in the column; 105 | - example: Esc, F1, F2, F3, ... 106 | 0 1 2 3 ... 107 | "row place" is the place of the switch in the row; 108 | - example: Esc, accent, TAB, CapsLock, ... 109 | */ 110 | 111 | /* template_ansiUS_7583 */ 112 | layout = [ 113 | //start ROW 0 Function ROW 114 | [[ 0,0.5],1,"Gold"], //Esc 115 | [[ 1,0.5],1,"Gold"], //F1 116 | [[ 2,0.5],1,"Gold"], //F2 117 | [[ 3,0.5],1,"Gold"], //F3 118 | [[ 4,0.5],1,"Gold"], //F4 119 | [[ 0,1.5],1,"Gold"], //' 120 | [[ 1,1.5],1,"Gold"], //1 121 | [[ 2,1.5],1,"Gold"], //2 122 | [[ 3,1.5],1,"Gold"], //3 123 | [[ 4,1.5],1,"Gold"], //4 124 | ]; 125 | 126 | /* enable placment of stabilizers on switchholes with x.5 unit in y direction 127 | * for example: true for numpad enter or numpad + 128 | * if you just want a single unit (1unit keycap) you can set this to false */ 129 | enableStabsOnHalfs = false; 130 | 131 | /* move pcb and usb cutout in x direction 132 | for better placement */ 133 | pcbShift=0; 134 | 135 | /* cutout for micro usb plug (not the housing of the usb plug!) 136 | * change this if using mini usb 137 | */ 138 | usbCutX=8; 139 | usbCutY=wallThickness; 140 | 141 | /* Arduino Pro Micro USB Port height */ 142 | usbCutZ=3.4; 143 | 144 | /* Teensy2 USB Port height */ 145 | /* usbCutZ=4.5; */ 146 | 147 | 148 | /* space in lid for placing the controller pcb. 149 | * this example is for arduino pro micro clones. 150 | * if you use teensy2.0 or something else configure 151 | * the size of the controller pcb you use. the function 152 | * 'pcbCutout()' will add 1mm to 'pcbWidth' for some clearance. 153 | * pcbLength should be as exactly as possible. this keeps the pcb 154 | * perfectly even if pcbWidth is to much 155 | */ 156 | /* teensy2 cutout */ 157 | /* pcbHeight = 1.8; 158 | pcbWidth = 18.5; 159 | pcbLength = 31.4; */ 160 | 161 | /* arduino pro micro cutout */ 162 | pcbHeight = 2; 163 | pcbWidth = 18; 164 | pcbLength = 34;; 165 | 166 | /* set 'addRisers' to true or false 167 | * to calculate a lid with holes for risers 168 | * and add risers to simulation 169 | */ 170 | addRisers = false; 171 | 172 | /* keyboardRiser config 173 | * angleBaseX -> width of the riser 174 | * angleBaseY -> depth of the riser 175 | */ 176 | angleBaseY=110; 177 | angleBaseX=60; 178 | /* riser edge radius */ 179 | angleBaseRad=1; 180 | /* polygon; this is the shape of the riser */ 181 | riserPoints = [ 182 | [0,0], 183 | [angleBaseY,0], 184 | [angleBaseY,3], 185 | [0,18] 186 | ]; 187 | 188 | /* optional: move keyboard risers as needed */ 189 | xRiserR=0; 190 | xRiserL=0; 191 | yRiserAll=0; 192 | 193 | /* move connectors (round cylinders on top of risers) 194 | around. this is useful for layouts which have a narrow 195 | height, but still need risers */ 196 | riserConnectorRadius = 5; 197 | riserConnectorX = 0; 198 | riserConnectorY1 = 60; 199 | 200 | 201 | 202 | 203 | /* ####### include keyboard lib ############ */ 204 | include 205 | include 206 | 207 | /* this module gets called in 'holematrix' and adds a specific 208 | * object to the 'holematrix'. it enables placing switchholes 209 | * or other cutout objects to the model */ 210 | module extraCutoutHook() 211 | { 212 | } 213 | 214 | /* this module gets called in 'keycapMatrix()' and adds a specific 215 | * object to the keycapMatrix. keycapMatrix is needed as a cutout element 216 | * from the frame. this hook gives possibility to add more elements such 217 | * as the enter keycap. 218 | */ 219 | module extraKeycapCutoutHook() 220 | { 221 | } 222 | 223 | /* this module gets called in 'keySim()' and adds a specific 224 | * object to the 'key simulation'. it enables placing keys 225 | * or other objects to the model simulation */ 226 | module extraKeySimHook() 227 | { 228 | } 229 | 230 | 231 | /* ####### screw hole config ######## */ 232 | /* set the screw holes to a good position. 233 | * if your keyboard is bigger, you can add some 234 | * more screw holes into the keyboard case and lid. 235 | */ 236 | screwHoleArray = [ 237 | [lkey,5.5], //left lower row 238 | [lkey*4,5.5], 239 | [lkey,lkey*2.21], 240 | [lkey*4,lkey*2.21], // right lower row 241 | ]; 242 | 243 | /* rotate screw hole spacers */ 244 | screwSpacerRotation=90; 245 | 246 | /* move horizontal case stabilizers inside the case. 247 | * to move horizontal by lkey/2 for half switch cutout. 248 | * this enables to set x.5 values in layout array. 249 | * else use 0!! 250 | */ 251 | caseStabMov=lkey/2; 252 | 253 | /* screw holes when enabling outer case frame */ 254 | frameScrewHoleArray = [ 255 | [-skirtX/2-innerCaseRadius/2,-skirtY/2-innerCaseRadius/2], //lower row 256 | [caseWidth/4,-skirtY/2-innerCaseRadius/2], 257 | [caseWidth/2-lkey,-skirtY/2-innerCaseRadius/2], 258 | [caseWidth/2+lkey,-skirtY/2-innerCaseRadius/2], //lower row 259 | [caseWidth-caseWidth/4,-skirtY/2-innerCaseRadius/2], 260 | [caseWidth+skirtX/2+innerCaseRadius/2,-skirtY/2-innerCaseRadius/2], 261 | 262 | [-skirtX/2-innerCaseRadius/2,lkey*1.5], //lower row 263 | [caseWidth+skirtX/2+innerCaseRadius/2,lkey*1.5], 264 | 265 | [-skirtX/2-innerCaseRadius/2,caseDepth-lkey*0.75], //lower row 266 | [caseWidth/2-lkey,caseDepth-lkey*0.75], 267 | [caseWidth/4,caseDepth-lkey*0.75], 268 | [caseWidth/2+lkey,caseDepth-lkey*0.75], //lower row 269 | [caseWidth-caseWidth/4,caseDepth-lkey*0.75], 270 | [caseWidth+skirtX/2+innerCaseRadius/2,caseDepth-lkey*0.75], 271 | 272 | [-skirtX/2-innerCaseRadius/2,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2], //lower row 273 | [caseWidth/4,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2], 274 | [caseWidth/2-lkey,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2], 275 | [caseWidth/2+lkey,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2], //lower row 276 | [caseWidth-caseWidth/4,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2], 277 | [caseWidth+skirtX/2+innerCaseRadius/2,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2] 278 | ]; 279 | 280 | 281 | 282 | 283 | /* set colors for simulation, set 0 for default OpenSCAD Gui Colors */ 284 | colorCaseTop="White"; 285 | colorCaseMid="DarkGray"; 286 | colorLid="Black"; 287 | colorRiserR="Black"; 288 | colorRiserL="Black"; 289 | 290 | frameColor="Black"; 291 | 292 | /* color simulation for switches 293 | select top and bottom color */ 294 | switchColorTop = "Ivory"; 295 | switchColorBottom = "Black"; 296 | 297 | /* simulate a keycap profile with number of fragments ($fn = setKeycapFragments) 298 | which will be set to key() call. 299 | KeyV2 currently (2022-06) does not support XDA. 300 | Use DSA as they look very similar 301 | NOTE: DSA is fixed to 3rd row as KeyV2 includes row number into calculation 302 | of DSA caps 303 | NOTE: currently not all profiles are working. OEM or DCS are always simulated! */ 304 | keycapProfile = "SA"; // SA, DSA, DCS, G20, Hi-Pro, OEM 305 | setKeycapFragments = 50; 306 | 307 | /* ###################### BUILD_LINE ########################*/ 308 | /* ##########################################################*/ 309 | /* All calls after this line have to be ignored by the build script. 310 | * Do not place any calls above build line (or comment it) 311 | */ 312 | 313 | /* uncomment following line to get the keyboard simulation 314 | * with keycaps. set DoKeycapSimulation to true or false to add 315 | * or remove keycap simulation 316 | */ 317 | /* KeyboardSim(layout,doFrameSim=false,DoKeycapSimulation=false,xRotate=9.5); */ 318 | 319 | /* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */ 320 | /* ##### uncomment the keyboard part you want to print ##### */ 321 | /* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv */ 322 | 323 | /* ### complete keyboard model ### */ 324 | /* mainCase(layout); */ 325 | /* lid(); */ 326 | 327 | /* keycap frame functions. activate if skirt is enabled 328 | and you want a frame that hides the switches, which is 329 | a more classic look to none printed keyboards */ 330 | /* translate([0,0,13]) 331 | capFrame(layout); */ 332 | 333 | /* translate([0,0,13]) 334 | capFrameR(layout); */ 335 | 336 | /* translate([0,0,13]) 337 | capFrameL(layout); */ 338 | 339 | /* ### devided keyboard and lid model ### */ 340 | mainCaseLeft(layout); 341 | /* mainCaseRight(layout); */ 342 | 343 | /* lidL(); */ 344 | /* lidR(); */ 345 | 346 | /* keyboardRiser(); */ 347 | -------------------------------------------------------------------------------- /andimoto6064.scad: -------------------------------------------------------------------------------- 1 | /* andimoto6064.scad 2 | Author: andimoto@posteo.de 3 | ---------------------------- 4 | for placing assambled parts and 5 | single parts go to end of this file 6 | 7 | this file contains the layout for my 6064 keyboard 3d model which can be devided 8 | to print on smaller printers 9 | 10 | this file includes KeyV2 files. see https://github.com/rsheldiii/KeyV2 11 | if you don't want this file to be included, just don't clone this library or 12 | set the 'DoKeycapSimulation' parameter of KeyboardSim() to false. 13 | */ 14 | 15 | /* ########## predefinitions ############ */ 16 | $fn=30; 17 | 18 | 19 | /* Thickness of entire plate which holds the switches. 20 | * this is the top of the keyboard 21 | */ 22 | plateThickness=3; 23 | /* thickness of the walls */ 24 | wallThickness=3; 25 | /* height of the case */ 26 | caseHeight=13; 27 | 28 | /* space between inner case stabilizers 29 | and the bottom/lip of the case */ 30 | innerCaseSpace = 5; 31 | 32 | //length, in units, of board 33 | width=15; 34 | //Height, in units, of board 35 | height=5; 36 | 37 | /* thickness of the lid. 38 | the function 'lid()' will add an 39 | extra mm to get a step for the lip 40 | see 'innerExtraLid' variable in constants */ 41 | lidThickness=3; 42 | 43 | 44 | /* ########## variables for cutting keyboard into smaller pieces ########## */ 45 | /* these are unit values; one unit is one key or switchhole 46 | * this makes the keyboard printable on nearly every printer. 47 | */ 48 | cutAfterUnits = 6.5; 49 | spacebarCut = 4; 50 | 51 | /* fRowSeparator [true/false] 52 | * Select separation of F-Row (or Row 0; key[0][1]=0) 53 | * This will move the upper row by a half unit (lkey*0.5) 54 | */ 55 | fRowSeparator=false; 56 | 57 | /* skirt selctor and skirt settings 58 | * select 'skirtSelect' as true to activate a additional skirt 59 | * around the keyboard case. The variables 'skirtX' & 'skirtY' 60 | * are configurable as you want the skirt. These values ADD the 61 | * configured amount to the side of the case. 62 | * Note: be careful here, this interacts with caseRadius 63 | * 64 | * If this is activated you can call 'capFrame()' 65 | * (or capFrameR/capFrameL) to create a nice frame 66 | * around the keycaps to cover the switches. This may give 67 | * a cleaner look if this is prefered. 68 | */ 69 | skirtSelect = false; 70 | skirtX = 0; 71 | skirtY = 0; 72 | 73 | /* enables screw holes in frame (if capFrame() is called) 74 | and in the case. The screws will be placed according to 75 | the array frameScrewHoleArray[] around the case and frame. 76 | */ 77 | frameScrewsEnable = false; 78 | 79 | /* edge radius of the case 80 | * Note: be careful here, this interacts with skirtX/Y 81 | * THIS IS ONLY VALID WHEN 'skirtSelect' IS TRUE 82 | */ 83 | caseRadius=5; 84 | 85 | 86 | /* ################## calculated vars #################### */ 87 | 88 | 89 | /* debug extra for avoiding artefacts @ compilation */ 90 | extra=1; 91 | 92 | 93 | /* add or reduce some tolerance for the switch holes. 94 | * depends on your printers resolution and if you want 95 | * narrow or loose fit of switches. do not configure to 96 | * narrow switch holes. when placing switches into the holes 97 | * they will pull the case apart and bend it. this will normally 98 | * be reduced by the lid, but do not overact this. 99 | */ 100 | switchHoleTolerance = -0.2; 101 | 102 | 103 | /* ############################################## */ 104 | /* ########## LAYOUT AND KEYCAP COLORS ########## */ 105 | /* ############################################## */ 106 | /* Usage: [[column place, row place],keycap unit, color for keycap simulation] */ 107 | /* "column place" is the place of the switch hole in the column; 108 | - example: Esc, F1, F2, F3, ... 109 | 0 1 2 3 ... 110 | "row place" is the place of the switch in the row; 111 | - example: Esc, accent, TAB, CapsLock, ... 112 | */ 113 | 114 | /* ansiUS_6064 */ 115 | layout = [ 116 | //start ROW 1 117 | [[0,0],1,"DarkSlateGray"], //' 118 | [[1,0],1,"DarkSlateGray"], //1 119 | [[2,0],1,"DarkSlateGray"], //2 120 | [[3,0],1,"DarkSlateGray"], //3 121 | [[4,0],1,"DarkSlateGray"], //4 122 | [[5,0],1,"DarkSlateGray"], //5 123 | [[6,0],1,"DarkSlateGray"], //6 124 | [[7,0],1,"DarkSlateGray"], //7 125 | [[8,0],1,"DarkSlateGray"], //8 126 | [[9,0],1,"DarkSlateGray"], //9 127 | [[10,0],1,"DarkSlateGray"], //0 128 | [[11,0],1,"DarkSlateGray"], //-_ 129 | [[12,0],1,"DarkSlateGray"], //=+ 130 | [[13,0],2,"DarkSlateGray"], //backspace 131 | //start ROW 2 132 | [[ 0,1],1.5,"DarkSlateGray"], //TAB 133 | [[1.5,1],1,"DarkSlateGray"], //Q 134 | [[2.5,1],1,"DarkSlateGray"], //W 135 | [[3.5,1],1,"DarkSlateGray"], //E 136 | [[4.5,1],1,"DarkSlateGray"], //R 137 | [[5.5,1],1,"DarkSlateGray"], //T 138 | [[6.5,1],1,"DarkSlateGray"], //Y 139 | [[7.5,1],1,"DarkSlateGray"], //U 140 | [[8.5,1],1,"DarkSlateGray"], //I 141 | [[9.5,1],1,"DarkSlateGray"], //O 142 | [[10.5,1],1,"DarkSlateGray"], //P 143 | [[11.5,1],1,"DarkSlateGray"], //[ 144 | [[12.5,1],1,"DarkSlateGray"], //] 145 | [[13.5,1],1.5,"DarkSlateGray"], // \ 146 | //start ROW 3 147 | [[ 0,2],1.75,"DarkSlateGray"], //CapsLock 148 | [[1.75,2],1,"DarkSlateGray"], //A 149 | [[2.75,2],1,"DarkSlateGray"], //S 150 | [[3.75,2],1,"DarkSlateGray"], //D 151 | [[4.75,2],1,"DarkSlateGray"], //F 152 | [[5.75,2],1,"DarkSlateGray"], //G 153 | [[6.75,2],1,"DarkSlateGray"], //H 154 | [[7.75,2],1,"DarkSlateGray"], //J 155 | [[8.75,2],1,"DarkSlateGray"], //K 156 | [[9.75,2],1,"DarkSlateGray"], //L 157 | [[10.75,2],1,"DarkSlateGray"], //; 158 | [[11.75,2],1,"DarkSlateGray"], //' 159 | [[12.75,2],2.25,"DarkSlateGray"], //ENTER 160 | //start ROW 4 161 | [[0,3],2,"DarkSlateGray"], //LShift 162 | [[2,3],1,"DarkSlateGray"], //Z 163 | [[3,3],1,"DarkSlateGray"], //X 164 | [[4,3],1,"DarkSlateGray"], //C 165 | [[5,3],1,"DarkSlateGray"], //V 166 | [[6,3],1,"DarkSlateGray"], //B 167 | [[7,3],1,"DarkSlateGray"], //N 168 | [[8,3],1,"DarkSlateGray"], //M 169 | [[9,3],1,"DarkSlateGray"], //, 170 | [[10,3],1,"DarkSlateGray"], //. 171 | [[11,3],1,"DarkSlateGray"], // / 172 | [[12,3],1,"DarkSlateGray"], //RShift 173 | [[13,3],1,"DarkSlateGray"], //UP 174 | [[14,3],1,"DarkSlateGray"], //del 175 | //start ROW 5 176 | [[0, 4],1.25,"DarkSlateGray"], //LCTRL 177 | [[1.25,4],1.25,"DarkSlateGray"], //TUX 178 | [[2.5 ,4],1.25,"DarkSlateGray"], //ALT 179 | [[3.75,4],6.25,"DarkSlateGray"], //SPACE 180 | [[10 ,4],1,"DarkSlateGray"], //Fn 181 | [[11,4],1,"DarkSlateGray"], //menu 182 | [[12,4],1,"DarkSlateGray"], //LEFT 183 | [[13,4],1,"DarkSlateGray"], //DOWN 184 | [[14,4],1,"DarkSlateGray"], //RIGHT 185 | ]; 186 | 187 | /* enable placment of stabilizers on switchholes with x.5 unit in y direction 188 | * for example: true for numpad enter or numpad + 189 | * if you just want a single unit (1unit keycap) you can set this to false */ 190 | enableStabsOnHalfs = true; 191 | 192 | /* move pcb and usb cutout in x direction 193 | for better placement */ 194 | pcbShift=0; 195 | 196 | /* cutout for micro usb plug (not the housing of the usb plug!) 197 | * change this if using mini usb 198 | */ 199 | usbCutX=8; 200 | usbCutY=wallThickness; 201 | 202 | /* Arduino Pro Micro USB Port height */ 203 | usbCutZ=3.4; 204 | 205 | /* Teensy2 USB Port height */ 206 | /* usbCutZ=4.5; */ 207 | 208 | /* space in lid for placing the controller pcb. 209 | * this example is for arduino pro micro clones. 210 | * if you use teensy2.0 or something else configure 211 | * the size of the controller pcb you use. the function 212 | * 'pcbCutout()' will add 1mm to 'pcbWidth' for some clearance. 213 | * pcbLength should be as exactly as possible. this keeps the pcb 214 | * perfectly even if pcbWidth is to much 215 | */ 216 | /* teensy2 cutout */ 217 | //pcbHeight = 1.8; 218 | //pcbWidth = 18.5; 219 | // pcbLength = 31.4; 220 | 221 | /* arduino pro micro cutout */ 222 | pcbHeight = 2; 223 | pcbWidth = 18; 224 | pcbLength = 34; 225 | 226 | 227 | /* set 'addRisers' to true or false 228 | * to calculate a lid with holes for risers 229 | * and add risers to simulation 230 | */ 231 | addRisers = true; 232 | 233 | /* keyboardRiser config 234 | * angleBaseX -> width of the riser 235 | * angleBaseY -> depth of the riser 236 | */ 237 | angleBaseY=80; 238 | angleBaseX=80; 239 | /* riser edge radius */ 240 | angleBaseRad=1; 241 | /* polygon; this is the shape of the riser */ 242 | riserPoints = [ 243 | [0,0], 244 | [angleBaseY,0], 245 | [angleBaseY,3], 246 | [0,16] 247 | ]; 248 | 249 | /* optional: move keyboard risers as needed */ 250 | xRiserR=0; 251 | xRiserL=0; 252 | yRiserAll=0; 253 | 254 | riserConnectorRadius = 5; 255 | riserConnectorX = 0; 256 | riserConnectorY1 = 50; 257 | 258 | 259 | 260 | 261 | /* ####### include keyboard lib ############ */ 262 | include 263 | include 264 | 265 | /* this module gets called in 'holematrix' and adds a specific 266 | * object to the 'holematrix'. it enables placing switchholes 267 | * or other cutout objects to the model */ 268 | module extraCutoutHook() 269 | { 270 | } 271 | 272 | /* this module gets called in 'keycapMatrix()' and adds a specific 273 | * object to the keycapMatrix. keycapMatrix is needed as a cutout element 274 | * from the frame. this hook gives possibility to add more elements such 275 | * as the enter keycap. 276 | */ 277 | module extraKeycapCutoutHook() 278 | { 279 | } 280 | 281 | /* this module gets called in 'keySim()' and adds a specific 282 | * object to the 'key simulation'. it enables placing keys 283 | * or other objects to the model simulation */ 284 | module extraKeySimHook() 285 | { 286 | } 287 | 288 | 289 | /* ####### screw hole config ######## */ 290 | /* set the screw holes to a good position. 291 | * if your keyboard is bigger, you can add some 292 | * more screw holes into the keyboard case and lid. 293 | */ 294 | screwHoleArray = [ 295 | [20,lkey-0.4], //left lower row 296 | [114,lkey-0.4], 297 | [171,lkey-0.4], 298 | [266,lkey-0.4], // right lower row 299 | 300 | [19,lkey*4+wallThickness-3], //left upper row 301 | [114,lkey*4+wallThickness-3], 302 | [171,lkey*4+wallThickness-3], 303 | [266,lkey*4+wallThickness-3], //right upper row 304 | ]; 305 | 306 | /* rotate screw hole spacers */ 307 | screwSpacerRotation=0; 308 | 309 | /* move horizontal case stabilizers inside the case. 310 | * to move horizontal by lkey/2 for half switch cutout. 311 | * this enables to set x.5 values in layout array. 312 | * else use 0!! 313 | */ 314 | caseStabMov=0; 315 | 316 | /* screw holes when enabling outer case frame */ 317 | frameScrewHoleArray = [ 318 | [-skirtX/2-innerCaseRadius/2,-skirtY/2-innerCaseRadius/2], //lower row 319 | [caseWidth/4,-skirtY/2-innerCaseRadius/2], 320 | [caseWidth/2-lkey,-skirtY/2-innerCaseRadius/2], 321 | [caseWidth/2+lkey,-skirtY/2-innerCaseRadius/2], //lower row 322 | [caseWidth-caseWidth/4,-skirtY/2-innerCaseRadius/2], 323 | [caseWidth+skirtX/2+innerCaseRadius/2,-skirtY/2-innerCaseRadius/2], 324 | 325 | [-skirtX/2-innerCaseRadius/2,lkey*1.5], //lower row 326 | [caseWidth+skirtX/2+innerCaseRadius/2,lkey*1.5], 327 | 328 | [-skirtX/2-innerCaseRadius/2,caseDepth-lkey*0.75], //lower row 329 | [caseWidth/2-lkey,caseDepth-lkey*0.75], 330 | [caseWidth/4,caseDepth-lkey*0.75], 331 | [caseWidth/2+lkey,caseDepth-lkey*0.75], //lower row 332 | [caseWidth-caseWidth/4,caseDepth-lkey*0.75], 333 | [caseWidth+skirtX/2+innerCaseRadius/2,caseDepth-lkey*0.75], 334 | 335 | [-skirtX/2-innerCaseRadius/2,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2], //lower row 336 | [caseWidth/4,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2], 337 | [caseWidth/2-lkey,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2], 338 | [caseWidth/2+lkey,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2], //lower row 339 | [caseWidth-caseWidth/4,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2], 340 | [caseWidth+skirtX/2+innerCaseRadius/2,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2] 341 | ]; 342 | 343 | 344 | 345 | 346 | /* set colors for simulation, set 0 for default OpenSCAD Gui Colors */ 347 | colorCaseTop="White"; 348 | colorCaseMid="DarkGray"; 349 | colorLid="Black"; 350 | colorRiserR="Black"; 351 | colorRiserL="Black"; 352 | 353 | frameColor="Black"; 354 | 355 | /* color simulation for switches 356 | select top and bottom color */ 357 | switchColorTop = "Ivory"; 358 | switchColorBottom = "Black"; 359 | 360 | /* simulate a keycap profile with number of fragments ($fn = setKeycapFragments) 361 | which will be set to key() call. 362 | KeyV2 currently (2022-06) does not support XDA. 363 | Use DSA as they look very similar 364 | NOTE: DSA is fixed to 3rd row as KeyV2 includes row number into calculation 365 | of DSA caps 366 | NOTE: currently not all profiles are working. OEM or DCS are always simulated! */ 367 | keycapProfile = "SA"; // SA, DSA, DCS, G20, Hi-Pro, OEM 368 | setKeycapFragments = 50; 369 | 370 | /* ###################### BUILD_LINE ########################*/ 371 | /* ##########################################################*/ 372 | /* All calls after this line have to be ignored by the build script. 373 | * Do not place any calls above build line (or comment it) 374 | */ 375 | 376 | /* uncomment following line to get the keyboard simulation 377 | * with keycaps. set DoKeycapSimulation to true or false to add 378 | * or remove keycap simulation 379 | */ 380 | /* KeyboardSim(layout,doFrameSim=false,DoKeycapSimulation=false,xRotate=9.5); */ 381 | 382 | /* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */ 383 | /* ##### uncomment the keyboard part you want to print ##### */ 384 | /* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv */ 385 | 386 | /* ### complete keyboard model ### */ 387 | /* mainCase(layout); */ 388 | /* lid(); */ 389 | 390 | /* keycap frame functions. activate if skirt is enabled 391 | and you want a frame that hides the switches, which is 392 | a more classic look to none printed keyboards */ 393 | /* translate([0,0,13]) 394 | capFrame(layout); */ 395 | 396 | /* translate([0,0,13]) 397 | capFrameR(layout); */ 398 | 399 | /* translate([0,0,13]) 400 | capFrameL(layout); */ 401 | 402 | /* ### devided keyboard and lid model ### */ 403 | /* mainCaseLeft(layout); */ 404 | /* mainCaseRight(layout); */ 405 | 406 | /* lidL(); */ 407 | /* lidR(); */ 408 | 409 | /* keyboardRiser(); */ 410 | -------------------------------------------------------------------------------- /andimoto6061.scad: -------------------------------------------------------------------------------- 1 | /* andimoto6061.scad 2 | Author: andimoto@posteo.de 3 | ---------------------------- 4 | for placing assambled parts and 5 | single parts go to end of this file 6 | 7 | this file is a template which may be copied to create a new keyboard layout 8 | and to configure and place essential parts like usb cut out, screw holes or stabilizers 9 | 10 | this file includes KeyV2 files. see https://github.com/rsheldiii/KeyV2 11 | if you don't want this file to be included, just don't clone this library or 12 | set the 'DoKeycapSimulation' parameter of KeyboardSim() to false. 13 | */ 14 | 15 | /* ########## predefinitions ############ */ 16 | $fn=30; 17 | 18 | 19 | /* Thickness of entire plate which holds the switches. 20 | * this is the top of the keyboard 21 | */ 22 | plateThickness=3; 23 | /* thickness of the walls */ 24 | wallThickness=3; 25 | /* height of the case */ 26 | caseHeight=13; 27 | 28 | /* space between inner case stabilizers 29 | and the bottom/lip of the case */ 30 | innerCaseSpace = 5; 31 | 32 | //length, in units, of board 33 | width=15; 34 | //Height, in units, of board 35 | height=5; 36 | 37 | /* thickness of the lid. 38 | the function 'lid()' will add an 39 | extra mm to get a step for the lip 40 | see 'innerExtraLid' variable in constants */ 41 | lidThickness=3; 42 | 43 | 44 | /* ########## variables for cutting keyboard into smaller pieces ########## */ 45 | /* these are unit values; one unit is one key or switchhole 46 | * this makes the keyboard printable on nearly every printer. 47 | */ 48 | cutAfterUnits = 6.5; 49 | spacebarCut = 2.5; 50 | 51 | /* fRowSeparator [true/false] 52 | * Select separation of F-Row (or Row 0; key[0][1]=0) 53 | * This will move the upper row by a half unit (lkey*0.5) 54 | */ 55 | fRowSeparator=false; 56 | 57 | /* skirt selctor and skirt settings 58 | * select 'skirtSelect' as true to activate a additional skirt 59 | * around the keyboard case. The variables 'skirtX' & 'skirtY' 60 | * are configurable as you want the skirt. These values ADD the 61 | * configured amount to the side of the case. 62 | * Note: be careful here, this interacts with caseRadius 63 | * 64 | * If this is activated you can call 'capFrame()' 65 | * (or capFrameR/capFrameL) to create a nice frame 66 | * around the keycaps to cover the switches. This may give 67 | * a cleaner look if this is prefered. 68 | */ 69 | skirtSelect = false; 70 | skirtX = 0; 71 | skirtY = 0; 72 | 73 | /* enables screw holes in frame (if capFrame() is called) 74 | and in the case. The screws will be placed according to 75 | the array frameScrewHoleArray[] around the case and frame. 76 | */ 77 | frameScrewsEnable = false; 78 | 79 | /* edge radius of the case 80 | * Note: be careful here, this interacts with skirtX/Y 81 | * THIS IS ONLY VALID WHEN 'skirtSelect' IS TRUE 82 | */ 83 | caseRadius=10; 84 | 85 | 86 | /* ################## calculated vars #################### */ 87 | 88 | 89 | /* debug extra for avoiding artefacts @ compilation */ 90 | extra=1; 91 | 92 | 93 | /* add or reduce some tolerance for the switch holes. 94 | * depends on your printers resolution and if you want 95 | * narrow or loose fit of switches. do not configure to 96 | * narrow switch holes. when placing switches into the holes 97 | * they will pull the case apart and bend it. this will normally 98 | * be reduced by the lid, but do not overact this. 99 | */ 100 | switchHoleTolerance = -0.2; 101 | 102 | 103 | /* ############################################## */ 104 | /* ########## LAYOUT AND KEYCAP COLORS ########## */ 105 | /* ############################################## */ 106 | /* Usage: [[column place, row place],keycap unit, color for keycap simulation] */ 107 | /* "column place" is the place of the switch hole in the column; 108 | - example: Esc, F1, F2, F3, ... 109 | 0 1 2 3 ... 110 | "row place" is the place of the switch in the row; 111 | - example: Esc, accent, TAB, CapsLock, ... 112 | */ 113 | 114 | /* ansiUS_6061 */ 115 | layout = [ 116 | //start ROW 1 117 | [[0,0],1,"White"], //' 118 | [[1,0],1,"MintCream"], //1 119 | [[2,0],1,"MintCream"], //2 120 | [[3,0],1,"MintCream"], //3 121 | [[4,0],1,"MintCream"], //4 122 | [[5,0],1,"MintCream"], //5 123 | [[6,0],1,"MintCream"], //6 124 | [[7,0],1,"MintCream"], //7 125 | [[8,0],1,"MintCream"], //8 126 | [[9,0],1,"MintCream"], //9 127 | [[10,0],1,"MintCream"], //0 128 | [[11,0],1,"MintCream"], //-_ 129 | [[12,0],1,"MintCream"], //=+ 130 | [[13,0],2,"White"], //backspace 131 | //start ROW 2 132 | [[ 0,1],1.5,"Grey"], //TAB 133 | [[1.5,1],1,"MintCream"], //Q 134 | [[2.5,1],1,"MintCream"], //W 135 | [[3.5,1],1,"MintCream"], //E 136 | [[4.5,1],1,"MintCream"], //R 137 | [[5.5,1],1,"MintCream"], //T 138 | [[6.5,1],1,"MintCream"], //Y 139 | [[7.5,1],1,"MintCream"], //U 140 | [[8.5,1],1,"MintCream"], //I 141 | [[9.5,1],1,"MintCream"], //O 142 | [[10.5,1],1,"MintCream"], //P 143 | [[11.5,1],1,"MintCream"], //[ 144 | [[12.5,1],1,"MintCream"], //] 145 | [[13.5,1],1.5,"Grey"], // \ 146 | //start ROW 3 147 | [[ 0,2],1.75,"Grey"], //CapsLock 148 | [[ 1.75,2],1,"MintCream"], //A 149 | [[ 2.75,2],1,"MintCream"], //S 150 | [[ 3.75,2],1,"MintCream"], //D 151 | [[ 4.75,2],1,"MintCream"], //F 152 | [[ 5.75,2],1,"MintCream"], //G 153 | [[ 6.75,2],1,"MintCream"], //H 154 | [[ 7.75,2],1,"MintCream"], //J 155 | [[ 8.75,2],1,"MintCream"], //K 156 | [[ 9.75,2],1,"MintCream"], //L 157 | [[10.75,2],1,"MintCream"], //; 158 | [[11.75,2],1,"MintCream"], //' 159 | [[12.75,2],2.25,"Grey"], //ENTER 160 | //start ROW 4 161 | [[ 0,3],2.25,"Grey"], //LShift 162 | [[ 2.25,3],1,"MintCream"], //Z 163 | [[ 3.25,3],1,"MintCream"], //X 164 | [[ 4.25,3],1,"MintCream"], //C 165 | [[ 5.25,3],1,"MintCream"], //V 166 | [[ 6.25,3],1,"MintCream"], //B 167 | [[ 7.25,3],1,"MintCream"], //N 168 | [[ 8.25,3],1,"MintCream"], //M 169 | [[ 9.25,3],1,"MintCream"], //, 170 | [[10.25,3],1,"MintCream"], //. 171 | [[11.25,3],1,"MintCream"], // / 172 | [[12.25,3],2.75,"Grey"], //RShift 173 | //start ROW 5 174 | [[ 0,4],1.25,"Grey"], //LCTRL 175 | [[1.25,4],1.25,"Grey"], //TUX 176 | [[2.5 ,4],1.25,"Grey"], //ALT 177 | [[3.75,4],6.25,"White"], //SPACE 178 | [[10 ,4],1.25,"Grey"], //COMP 179 | [[11.25,4],1.25,"Grey"], //Fn 180 | [[12.5 ,4],1.25,"Grey"], //RCTRL 181 | [[13.75 ,4],1.25,"Grey"], //RCTRL 182 | 183 | ]; 184 | 185 | /* enable placment of stabilizers on switchholes with x.5 unit in y direction 186 | * for example: true for numpad enter or numpad + 187 | * if you just want a single unit (1unit keycap) you can set this to false */ 188 | enableStabsOnHalfs = true; 189 | 190 | /* move pcb and usb cutout in x direction 191 | for better placement */ 192 | pcbShift=0; 193 | 194 | /* cutout for micro usb plug (not the housing of the usb plug!) 195 | * change this if using mini usb 196 | */ 197 | usbCutX=8; 198 | usbCutY=wallThickness; 199 | 200 | /* Arduino Pro Micro USB Port height */ 201 | usbCutZ=3.4; 202 | 203 | /* Teensy2 USB Port height */ 204 | /* usbCutZ=4.5; */ 205 | 206 | /* space in lid for placing the controller pcb. 207 | * this example is for arduino pro micro clones. 208 | * if you use teensy2.0 or something else configure 209 | * the size of the controller pcb you use. the function 210 | * 'pcbCutout()' will add 1mm to 'pcbWidth' for some clearance. 211 | * pcbLength should be as exactly as possible. this keeps the pcb 212 | * perfectly even if pcbWidth is to much 213 | */ 214 | /* teensy2 cutout */ 215 | pcbHeight = 1.8; 216 | pcbWidth = 18.5; 217 | pcbLength = 31.4; 218 | 219 | /* arduino pro micro cutout */ 220 | //pcbHeight = 2; 221 | //pcbWidth = 18; 222 | //pcbLength = 34; 223 | 224 | /* set 'addRisers' to true or false 225 | * to calculate a lid with holes for risers 226 | * and add risers to simulation 227 | */ 228 | addRisers = true; 229 | 230 | /* keyboardRiser config 231 | * angleBaseX -> width of the riser 232 | * angleBaseY -> depth of the riser 233 | */ 234 | angleBaseY=80; 235 | angleBaseX=60; 236 | /* riser edge radius */ 237 | angleBaseRad=1; 238 | /* polygon; this is the shape of the riser */ 239 | riserPoints = [ 240 | [0,0], 241 | [angleBaseY,0], 242 | [angleBaseY,3], 243 | [0,16] 244 | ]; 245 | 246 | /* optional: move keyboard risers as needed */ 247 | xRiserR=0; 248 | xRiserL=0; 249 | yRiserAll=0; 250 | 251 | riserConnectorRadius = 5; 252 | riserConnectorX = 0; 253 | riserConnectorY1 = 50; 254 | 255 | 256 | 257 | 258 | /* ####### include keyboard lib ############ */ 259 | include 260 | include 261 | 262 | /* this module gets called in 'holematrix' and adds a specific 263 | * object to the 'holematrix'. it enables placing switchholes 264 | * or other cutout objects to the model */ 265 | module extraCutoutHook() 266 | { 267 | } 268 | 269 | /* this module gets called in 'keycapMatrix()' and adds a specific 270 | * object to the keycapMatrix. keycapMatrix is needed as a cutout element 271 | * from the frame. this hook gives possibility to add more elements such 272 | * as the enter keycap. 273 | */ 274 | module extraKeycapCutoutHook() 275 | { 276 | } 277 | 278 | /* this module gets called in 'keySim()' and adds a specific 279 | * object to the 'key simulation'. it enables placing keys 280 | * or other objects to the model simulation */ 281 | module extraKeySimHook() 282 | { 283 | } 284 | 285 | 286 | /* ####### screw hole config ######## */ 287 | /* set the screw holes to a good position. 288 | * if your keyboard is bigger, you can add some 289 | * more screw holes into the keyboard case and lid. 290 | */ 291 | screwHoleArray = [ 292 | [26,lkey-0.5], //left lower row 293 | [114,lkey-0.5], 294 | [170,lkey-0.5], 295 | [260,lkey-0.5], // right lower row 296 | 297 | [26,lkey*2+wallThickness-3], //left upper row 298 | [110,lkey*2+wallThickness-3], 299 | [171,lkey*2+wallThickness-3], 300 | [256,lkey*2+wallThickness-3], //right upper row 301 | 302 | [26,lkey*3+wallThickness-3], //left upper row 303 | [110,lkey*3+wallThickness-3], 304 | [171,lkey*3+wallThickness-3], 305 | [256,lkey*3+wallThickness-3], //right upper row 306 | 307 | [26,lkey*4+wallThickness-3], //left upper row 308 | [114,lkey*4+wallThickness-3], 309 | [171,lkey*4+wallThickness-3], 310 | [256,lkey*4+wallThickness-3], //right upper row 311 | ]; 312 | 313 | /* rotate screw hole spacers */ 314 | screwSpacerRotation=0; 315 | 316 | /* move horizontal case stabilizers inside the case. 317 | * to move horizontal by lkey/2 for half switch cutout. 318 | * this enables to set x.5 values in layout array. 319 | * else use 0!! 320 | */ 321 | caseStabMov=0; 322 | 323 | /* screw holes when enabling outer case frame */ 324 | frameScrewHoleArray = [ 325 | [-skirtX/2-innerCaseRadius/2,-skirtY/2-innerCaseRadius/2], //lower row 326 | [caseWidth/4,-skirtY/2-innerCaseRadius/2], 327 | [caseWidth/2-lkey,-skirtY/2-innerCaseRadius/2], 328 | [caseWidth/2+lkey,-skirtY/2-innerCaseRadius/2], //lower row 329 | [caseWidth-caseWidth/4,-skirtY/2-innerCaseRadius/2], 330 | [caseWidth+skirtX/2+innerCaseRadius/2,-skirtY/2-innerCaseRadius/2], 331 | 332 | [-skirtX/2-innerCaseRadius/2,lkey*1.5], //lower row 333 | [caseWidth+skirtX/2+innerCaseRadius/2,lkey*1.5], 334 | 335 | [-skirtX/2-innerCaseRadius/2,caseDepth-lkey*0.75], //lower row 336 | [caseWidth/2-lkey,caseDepth-lkey*0.75], 337 | [caseWidth/4,caseDepth-lkey*0.75], 338 | [caseWidth/2+lkey,caseDepth-lkey*0.75], //lower row 339 | [caseWidth-caseWidth/4,caseDepth-lkey*0.75], 340 | [caseWidth+skirtX/2+innerCaseRadius/2,caseDepth-lkey*0.75], 341 | 342 | [-skirtX/2-innerCaseRadius/2,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2], //lower row 343 | [caseWidth/4,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2], 344 | [caseWidth/2-lkey,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2], 345 | [caseWidth/2+lkey,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2], //lower row 346 | [caseWidth-caseWidth/4,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2], 347 | [caseWidth+skirtX/2+innerCaseRadius/2,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2] 348 | ]; 349 | 350 | 351 | 352 | 353 | /* set colors for simulation, set 0 for default OpenSCAD Gui Colors */ 354 | colorCaseTop="Grey"; 355 | colorCaseMid="Grey"; 356 | colorLid="DarkGrey"; 357 | colorRiserR="DarkGrey"; 358 | colorRiserL="DarkGrey"; 359 | 360 | frameColor="Black"; 361 | 362 | /* color simulation for switches 363 | select top and bottom color */ 364 | switchColorTop = "Ivory"; 365 | switchColorBottom = "Black"; 366 | 367 | /* simulate a keycap profile with number of fragments ($fn = setKeycapFragments) 368 | which will be set to key() call. 369 | KeyV2 currently (2022-06) does not support XDA. 370 | Use DSA as they look very similar 371 | NOTE: DSA is fixed to 3rd row as KeyV2 includes row number into calculation 372 | of DSA caps 373 | NOTE: currently not all profiles are working. OEM or DCS are always simulated! */ 374 | keycapProfile = "OEM"; // SA, DSA, DCS, G20, Hi-Pro, OEM 375 | setKeycapFragments = 50; 376 | 377 | /* ###################### BUILD_LINE ########################*/ 378 | /* ##########################################################*/ 379 | /* All calls after this line have to be ignored by the build script. 380 | * Do not place any calls above build line (or comment it) 381 | */ 382 | 383 | /* uncomment following line to get the keyboard simulation 384 | * with keycaps. set DoKeycapSimulation to true or false to add 385 | * or remove keycap simulation 386 | */ 387 | KeyboardSim(layout,doFrameSim=false,DoKeycapSimulation=true,xRotate=9.5); 388 | 389 | /* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */ 390 | /* ##### uncomment the keyboard part you want to print ##### */ 391 | /* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv */ 392 | 393 | /* ### complete keyboard model ### */ 394 | /* mainCase(layout); */ 395 | /* lid(); */ 396 | 397 | /* keycap frame functions. activate if skirt is enabled 398 | and you want a frame that hides the switches, which is 399 | a more classic look to none printed keyboards */ 400 | /* translate([0,0,13]) 401 | capFrame(layout); */ 402 | 403 | /* translate([0,0,13]) 404 | capFrameR(layout); */ 405 | 406 | /* translate([0,0,13]) 407 | capFrameL(layout); */ 408 | 409 | /* ### devided keyboard and lid model ### */ 410 | /* mainCaseLeft(layout); */ 411 | /* mainCaseRight(layout); */ 412 | 413 | /* lidL(); */ 414 | /* lidR(); */ 415 | 416 | /* keyboardRiser(); */ 417 | -------------------------------------------------------------------------------- /andimoto7583.scad: -------------------------------------------------------------------------------- 1 | /* andimoto7583.scad 2 | Author: andimoto@posteo.de 3 | ---------------------------- 4 | for placing assambled parts and 5 | single parts go to end of this file 6 | 7 | this file contains the layout for my 7583 keyboard 3d model which can be devided 8 | to print on smaller printers 9 | 10 | this file includes KeyV2 files. see https://github.com/rsheldiii/KeyV2 11 | if you don't want this file to be included, just don't clone this library or 12 | set the 'DoKeycapSimulation' parameter of KeyboardSim() to false. 13 | */ 14 | 15 | /* ########## predefinitions ############ */ 16 | $fn=30; 17 | 18 | 19 | /* Thickness of entire plate which holds the switches. 20 | * this is the top of the keyboard 21 | */ 22 | plateThickness=3; 23 | /* thickness of the walls */ 24 | wallThickness=3; 25 | /* height of the case */ 26 | caseHeight=13; 27 | 28 | /* space between inner case stabilizers 29 | and the bottom/lip of the case */ 30 | innerCaseSpace = 5; 31 | 32 | //length, in units, of board 33 | width=16; 34 | //Height, in units, of board 35 | height=6; 36 | 37 | /* thickness of the lid. 38 | the function 'lid()' will add an 39 | extra mm to get a step for the lip 40 | see 'innerExtraLid' variable in constants */ 41 | lidThickness=3; 42 | 43 | 44 | /* ########## variables for cutting keyboard into smaller pieces ########## */ 45 | /* these are unit values; one unit is one key or switchhole 46 | * this makes the keyboard printable on nearly every printer. 47 | */ 48 | cutAfterUnits = 7.25; 49 | spacebarCut = 4.5; 50 | 51 | /* fRowSeparator [true/false] 52 | * Select separation of F-Row (or Row 0; key[0][1]=0) 53 | * This will move the upper row by a half unit (lkey*0.5) 54 | */ 55 | fRowSeparator=false; 56 | 57 | /* skirt selctor and skirt settings 58 | * select 'skirtSelect' as true to activate a additional skirt 59 | * around the keyboard case. The variables 'skirtX' & 'skirtY' 60 | * are configurable as you want the skirt. These values ADD the 61 | * configured amount to the side of the case. 62 | * Note: be careful here, this interacts with caseRadius 63 | * 64 | * If this is activated you can call 'capFrame()' 65 | * (or capFrameR/capFrameL) to create a nice frame 66 | * around the keycaps to cover the switches. This may give 67 | * a cleaner look if this is prefered. 68 | */ 69 | skirtSelect = true; 70 | skirtX = 5; 71 | skirtY = 5; 72 | 73 | /* enables screw holes in frame (if capFrame() is called) 74 | and in the case. The screws will be placed according to 75 | the array frameScrewHoleArray[] around the case and frame. 76 | */ 77 | frameScrewsEnable = true; 78 | 79 | /* edge radius of the case 80 | * Note: be careful here, this interacts with skirtX/Y 81 | * THIS IS ONLY VALID WHEN 'skirtSelect' IS TRUE 82 | */ 83 | caseRadius=1; 84 | 85 | 86 | /* ################## calculated vars #################### */ 87 | 88 | 89 | /* debug extra for avoiding artefacts @ compilation */ 90 | extra=1; 91 | 92 | 93 | /* add or reduce some tolerance for the switch holes. 94 | * depends on your printers resolution and if you want 95 | * narrow or loose fit of switches. do not configure to 96 | * narrow switch holes. when placing switches into the holes 97 | * they will pull the case apart and bend it. this will normally 98 | * be reduced by the lid, but do not overact this. 99 | */ 100 | switchHoleTolerance = -0.2; 101 | 102 | 103 | /* ############################################## */ 104 | /* ########## LAYOUT AND KEYCAP COLORS ########## */ 105 | /* ############################################## */ 106 | /* Usage: [[column place, row place],keycap unit, color for keycap simulation] */ 107 | /* "column place" is the place of the switch hole in the column; 108 | - example: Esc, F1, F2, F3, ... 109 | 0 1 2 3 ... 110 | "row place" is the place of the switch in the row; 111 | - example: Esc, accent, TAB, CapsLock, ... 112 | */ 113 | 114 | /* ansiUS_7583 */ 115 | layout = [ 116 | //start ROW 0 Function ROW 117 | [[0,0],1,"DarkGray"], //Esc 118 | [[1,0],1,"LightGrey"], //F1 119 | [[2,0],1,"LightGrey"], //F2 120 | [[3,0],1,"LightGrey"], //F3 121 | [[4,0],1,"LightGrey"], //F4 122 | [[5,0],1,"DimGray"], //F5 123 | [[6,0],1,"DimGray"], //F6 124 | [[7,0],1,"DimGray"], //F7 125 | [[8,0],1,"DimGray"], //F8 126 | [[9,0],1,"LightGrey"], //F9 127 | [[10,0],1,"LightGrey"], //F10 128 | [[11,0],1,"LightGrey"], //F11 129 | [[12,0],1,"LightGrey"], //F12 130 | [[13,0],1,"DimGray"], //PrintScreen 131 | [[14,0],1,"DimGray"], //PrintScreen 132 | [[15,0],1,"DimGray"], // Del/Ins 133 | //start ROW 1 134 | [[ 0,1],1,"DimGray"], //' 135 | [[1,1],1,"LightGrey"], //1 136 | [[2,1],1,"LightGrey"], //2 137 | [[3,1],1,"LightGrey"], //3 138 | [[4,1],1,"LightGrey"], //4 139 | [[5,1],1,"LightGrey"], //5 140 | [[6,1],1,"LightGrey"], //6 141 | [[7,1],1,"LightGrey"], //7 142 | [[8,1],1,"LightGrey"], //8 143 | [[9,1],1,"LightGrey"], //9 144 | [[10,1],1,"LightGrey"], //0 145 | [[11,1],1,"LightGrey"], //-_ 146 | [[12,1],1,"LightGrey"], //=+ 147 | [[13,1],2,"DimGray"], //backspace 148 | [[15,1],1,"DimGray"], //home 149 | //start ROW 2 150 | [[ 0,2],1.5,"DimGray"], //TAB 151 | [[1.5,2],1,"LightGrey"], //Q 152 | [[2.5,2],1,"LightGrey"], //W 153 | [[3.5,2],1,"LightGrey"], //E 154 | [[4.5,2],1,"LightGrey"], //R 155 | [[5.5,2],1,"LightGrey"], //T 156 | [[6.5,2],1,"LightGrey"], //Y 157 | [[7.5,2],1,"LightGrey"], //U 158 | [[8.5,2],1,"LightGrey"], //I 159 | [[9.5,2],1,"LightGrey"], //O 160 | [[10.5,2],1,"LightGrey"], //P 161 | [[11.5,2],1,"LightGrey"], //[ 162 | [[12.5,2],1,"LightGrey"], //] 163 | [[13.5,2],1.5,"DimGray"], // \ 164 | [[15,2],1,"DimGray"], // PgUp 165 | //start ROW 3 166 | [[ 0,3],1.75,"DimGray"], //CapsLock 167 | [[1.75,3],1,"LightGrey"], //A 168 | [[2.75,3],1,"LightGrey"], //S 169 | [[3.75,3],1,"LightGrey"], //D 170 | [[4.75,3],1,"LightGrey"], //F 171 | [[5.75,3],1,"LightGrey"], //G 172 | [[6.75,3],1,"LightGrey"], //H 173 | [[7.75,3],1,"LightGrey"], //J 174 | [[8.75,3],1,"LightGrey"], //K 175 | [[9.75,3],1,"LightGrey"], //L 176 | [[10.75,3],1,"LightGrey"], //; 177 | [[11.75,3],1,"LightGrey"], //' 178 | [[12.75,3],2.25,"DarkGray"], //ENTER 179 | [[15,3],1,"DimGray"], //PgDn 180 | //start ROW 4 181 | [[ 0,4],2.25,"DimGray"], //LShift 182 | [[2.25,4],1,"LightGrey"], //Z 183 | [[3.25,4],1,"LightGrey"], //X 184 | [[4.25,4],1,"LightGrey"], //C 185 | [[5.25,4],1,"LightGrey"], //V 186 | [[6.25,4],1,"LightGrey"], //B 187 | [[7.25,4],1,"LightGrey"], //N 188 | [[8.25,4],1,"LightGrey"], //M 189 | [[9.25,4],1,"LightGrey"], //, 190 | [[10.25,4],1,"LightGrey"], //. 191 | [[11.25,4],1,"LightGrey"], // / 192 | [[12.25,4],1.75,"DimGray"], //RShift 193 | [[14,4],1,"DimGray"], //UP 194 | [[15,4],1,"DimGray"], //end 195 | //start ROW 5 196 | [[ 0,5],1.25,"DimGray"], //LCTRL 197 | [[1.25,5],1.25,"DimGray"], //TUX 198 | [[2.5 ,5],1.25,"DimGray"], //ALT 199 | [[3.75,5],6.25,"DarkGray"], //SPACE 200 | [[10 ,5],1,"DimGray"], //COMP 201 | [[11 ,5], 1,"DimGray"], //Fn 202 | [[12 ,5], 1,"DimGray"], //RCTRL 203 | [[13,5],1,"DimGray"], //LEFT 204 | [[14,5],1,"DimGray"], //DOWN 205 | [[15,5],1,"DimGray"], //RIGHT 206 | ]; 207 | 208 | /* enable placment of stabilizers on switchholes with x.5 unit in y direction 209 | * for example: true for numpad enter or numpad + 210 | * if you just want a single unit (1unit keycap) you can set this to false */ 211 | enableStabsOnHalfs = true; 212 | 213 | /* move pcb and usb cutout in x direction 214 | for better placement */ 215 | pcbShift=7; 216 | 217 | /* cutout for micro usb plug (not the housing of the usb plug!) 218 | * change this if using mini usb 219 | */ 220 | usbCutX=8; 221 | usbCutY=wallThickness; 222 | 223 | /* Arduino Pro Micro USB Port height */ 224 | usbCutZ=3.4; 225 | 226 | /* Teensy2 USB Port height */ 227 | /* usbCutZ=4.5; */ 228 | 229 | /* space in lid for placing the controller pcb. 230 | * this example is for arduino pro micro clones. 231 | * if you use teensy2.0 or something else configure 232 | * the size of the controller pcb you use. the function 233 | * 'pcbCutout()' will add 1mm to 'pcbWidth' for some clearance. 234 | * pcbLength should be as exactly as possible. this keeps the pcb 235 | * perfectly even if pcbWidth is to much 236 | */ 237 | /* arduino pro micro cutout */ 238 | pcbHeight = 2; 239 | pcbWidth = 18; 240 | pcbLength = 34; 241 | 242 | /* teensy2 cutout */ 243 | //pcbHeight = 1.8; 244 | //pcbWidth = 18.5; 245 | // pcbLength = 31.4; 246 | 247 | 248 | 249 | /* set 'addRisers' to true or false 250 | * to calculate a lid with holes for risers 251 | * and add risers to simulation 252 | */ 253 | addRisers = true; 254 | 255 | /* keyboardRiser config 256 | * angleBaseX -> width of the riser 257 | * angleBaseY -> depth of the riser 258 | */ 259 | angleBaseY=90; 260 | angleBaseX=90; 261 | /* riser edge radius */ 262 | angleBaseRad=1; 263 | /* polygon; this is the shape of the riser */ 264 | riserPoints = [ 265 | [0,0], 266 | [angleBaseY,0], 267 | [angleBaseY,3], 268 | [0,13] 269 | ]; 270 | 271 | /* optional: move keyboard risers as needed */ 272 | xRiserR=10; 273 | xRiserL=-10; 274 | yRiserAll=0; 275 | 276 | /* move connectors (round cylinders on top of risers) 277 | around. this is useful for layouts which have a narrow 278 | height, but still need risers */ 279 | riserConnectorRadius = 5; 280 | riserConnectorX = 0; 281 | riserConnectorY1 = 60; 282 | 283 | 284 | 285 | 286 | /* ####### include keyboard lib ############ */ 287 | include 288 | include 289 | 290 | /* this module gets called in 'holematrix' and adds a specific 291 | * object to the 'holematrix'. it enables placing switchholes 292 | * or other cutout objects to the model */ 293 | module extraCutoutHook() 294 | { 295 | } 296 | 297 | /* this module gets called in 'keycapMatrix()' and adds a specific 298 | * object to the keycapMatrix. keycapMatrix is needed as a cutout element 299 | * from the frame. this hook gives possibility to add more elements such 300 | * as the enter keycap. 301 | */ 302 | module extraKeycapCutoutHook() 303 | { 304 | } 305 | 306 | /* this module gets called in 'keySim()' and adds a specific 307 | * object to the 'key simulation'. it enables placing keys 308 | * or other objects to the model simulation */ 309 | module extraKeySimHook() 310 | { 311 | } 312 | 313 | 314 | /* ####### screw hole config ######## */ 315 | /* set the screw holes to a good position. 316 | * if your keyboard is bigger, you can add some 317 | * more screw holes into the keyboard case and lid. 318 | */ 319 | screwHoleArray = [ 320 | [20,lkey-0.4], //left lower row 321 | [140,lkey-0.4], 322 | [170,lkey-0.4], 323 | [285.5,lkey-0.4], // right lower row 324 | 325 | [20,lkey*3+wallThickness-3], //left mid row 326 | [128,lkey*3+wallThickness-3], 327 | [180,lkey*3+wallThickness-3], 328 | [285,lkey*3+wallThickness-3], //right mid row 329 | 330 | [20,lkey*5+wallThickness-3], //left upper row 331 | [133,lkey*5+wallThickness-3], 332 | [171,lkey*5+wallThickness-3], 333 | [285.5,lkey*5+wallThickness-3], //right upper row 334 | ]; 335 | 336 | /* rotate screw hole spacers */ 337 | screwSpacerRotation=0; 338 | 339 | /* move horizontal case stabilizers inside the case. 340 | * to move horizontal by lkey/2 for half switch cutout. 341 | * this enables to set x.5 values in layout array. 342 | * else use 0!! 343 | */ 344 | caseStabMov=0; 345 | 346 | /* screw holes when enabling outer case frame */ 347 | frameScrewHoleArray = [ 348 | [-skirtX/2-innerCaseRadius/2,-skirtY/2-innerCaseRadius/2], //lower row 349 | [caseWidth/4,-skirtY/2-innerCaseRadius/2], 350 | [caseWidth/2-lkey,-skirtY/2-innerCaseRadius/2], 351 | [caseWidth/2+lkey,-skirtY/2-innerCaseRadius/2], //lower row 352 | [caseWidth-caseWidth/4,-skirtY/2-innerCaseRadius/2], 353 | [caseWidth+skirtX/2+innerCaseRadius/2,-skirtY/2-innerCaseRadius/2], 354 | 355 | [-skirtX/2-innerCaseRadius/2,lkey*2], //lower row 356 | [caseWidth+skirtX/2+innerCaseRadius/2,lkey*2], 357 | 358 | [-skirtX/2-innerCaseRadius/2,caseDepth-lkey*2], //lower row 359 | [caseWidth+skirtX/2+innerCaseRadius/2,caseDepth-lkey*2], 360 | 361 | [-skirtX/2-innerCaseRadius/2,caseDepth+skirtY/2+innerCaseRadius/2], //lower row 362 | [caseWidth/4,caseDepth+skirtY/2+innerCaseRadius/2], 363 | [caseWidth/2-lkey,caseDepth+skirtY/2+innerCaseRadius/2], 364 | [caseWidth/2+lkey,caseDepth+skirtY/2+innerCaseRadius/2], //lower row 365 | [caseWidth-caseWidth/4,caseDepth+skirtY/2+innerCaseRadius/2], 366 | [caseWidth+skirtX/2+innerCaseRadius/2,caseDepth+skirtY/2+innerCaseRadius/2] 367 | ]; 368 | 369 | 370 | 371 | 372 | /* set colors for simulation, set 0 for default OpenSCAD Gui Colors */ 373 | colorCaseTop="Black"; 374 | colorCaseMid="DarkGray"; 375 | colorLid="DarkGray"; 376 | colorRiserR="DarkGray"; 377 | colorRiserL="DarkGray"; 378 | 379 | frameColor="DarkGray"; 380 | 381 | /* color simulation for switches 382 | select top and bottom color */ 383 | switchColorTop = "Ivory"; 384 | switchColorBottom = "Black"; 385 | 386 | /* simulate a keycap profile with number of fragments ($fn = setKeycapFragments) 387 | which will be set to key() call. 388 | KeyV2 currently (2022-06) does not support XDA. 389 | Use DSA as they look very similar 390 | NOTE: DSA is fixed to 3rd row as KeyV2 includes row number into calculation 391 | of DSA caps 392 | NOTE: currently not all profiles are working. OEM or DCS are always simulated! */ 393 | keycapProfile = "DSA"; // SA, DSA, DCS, G20, Hi-Pro, OEM 394 | setKeycapFragments = 50; 395 | 396 | /* ###################### BUILD_LINE ########################*/ 397 | /* ##########################################################*/ 398 | /* All calls after this line have to be ignored by the build script. 399 | * Do not place any calls above build line (or comment it) 400 | */ 401 | 402 | /* uncomment following line to get the keyboard simulation 403 | * with keycaps. set DoKeycapSimulation to true or false to add 404 | * or remove keycap simulation 405 | */ 406 | /* KeyboardSim(layout,doFrameSim=true,DoKeycapSimulation=true,xRotate=6.5); */ 407 | 408 | /* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */ 409 | /* ##### uncomment the keyboard part you want to print ##### */ 410 | /* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv */ 411 | 412 | /* ### complete keyboard model ### */ 413 | /* mainCase(layout); */ 414 | /* lid(); */ 415 | 416 | /* keycap frame functions. activate if skirt is enabled 417 | and you want a frame that hides the switches, which is 418 | a more classic look to none printed keyboards */ 419 | /* translate([0,0,15]) 420 | capFrame(layout); */ 421 | 422 | /* translate([0,0,13]) 423 | capFrameR(layout); */ 424 | 425 | /* translate([0,0,13]) 426 | capFrameL(layout); */ 427 | 428 | /* ### devided keyboard and lid model ### */ 429 | /* mainCaseLeft(layout); */ 430 | /* mainCaseRight(layout); */ 431 | 432 | /* lidL(); */ 433 | /* lidR(); */ 434 | 435 | keyboardRiser(); 436 | -------------------------------------------------------------------------------- /andimotoTKL.scad: -------------------------------------------------------------------------------- 1 | /* andimotoTKL.scad 2 | Author: andimoto@posteo.de 3 | ---------------------------- 4 | for placing assambled parts and 5 | single parts go to end of this file 6 | 7 | this file contains the layout for my TKL keyboard 3d model which can be devided 8 | to print on smaller printers 9 | 10 | this file includes KeyV2 files. see https://github.com/rsheldiii/KeyV2 11 | if you don't want this file to be included, just don't clone this library or 12 | set the 'DoKeycapSimulation' parameter of KeyboardSim() to false. 13 | */ 14 | 15 | /* ########## predefinitions ############ */ 16 | $fn=30; 17 | 18 | 19 | /* Thickness of entire plate which holds the switches. 20 | * this is the top of the keyboard 21 | */ 22 | plateThickness=3; 23 | /* thickness of the walls */ 24 | wallThickness=3; 25 | /* height of the case */ 26 | caseHeight=13; 27 | 28 | /* space between inner case stabilizers 29 | and the bottom/lip of the case */ 30 | innerCaseSpace = 5; 31 | 32 | //length, in units, of board 33 | width=18.25; 34 | //Height, in units, of board 35 | height=6; 36 | 37 | /* thickness of the lid. 38 | the function 'lid()' will add an 39 | extra mm to get a step for the lip 40 | see 'innerExtraLid' variable in constants */ 41 | lidThickness=3; 42 | 43 | 44 | /* ########## variables for cutting keyboard into smaller pieces ########## */ 45 | /* these are unit values; one unit is one key or switchhole 46 | * this makes the keyboard printable on nearly every printer. 47 | */ 48 | cutAfterUnits = 8.5; 49 | spacebarCut = 5.5; 50 | 51 | /* fRowSeparator [true/false] 52 | * Select separation of F-Row (or Row 0; key[0][1]=0) 53 | * This will move the upper row by a half unit (lkey*0.5) 54 | */ 55 | fRowSeparator=true; 56 | 57 | /* skirt selctor and skirt settings 58 | * select 'skirtSelect' as true to activate a additional skirt 59 | * around the keyboard case. The variables 'skirtX' & 'skirtY' 60 | * are configurable as you want the skirt. These values ADD the 61 | * configured amount to the side of the case. 62 | * Note: be careful here, this interacts with caseRadius 63 | * 64 | * If this is activated you can call 'capFrame()' 65 | * (or capFrameR/capFrameL) to create a nice frame 66 | * around the keycaps to cover the switches. This may give 67 | * a cleaner look if this is prefered. 68 | */ 69 | skirtSelect = false; 70 | skirtX = 0; 71 | skirtY = 0; 72 | 73 | /* enables screw holes in frame (if capFrame() is called) 74 | and in the case. The screws will be placed according to 75 | the array frameScrewHoleArray[] around the case and frame. 76 | */ 77 | frameScrewsEnable = false; 78 | 79 | /* edge radius of the case 80 | * Note: be careful here, this interacts with skirtX/Y 81 | * THIS IS ONLY VALID WHEN 'skirtSelect' IS TRUE 82 | */ 83 | caseRadius=0; 84 | 85 | 86 | /* ################## calculated vars #################### */ 87 | 88 | 89 | /* debug extra for avoiding artefacts @ compilation */ 90 | extra=1; 91 | 92 | 93 | /* add or reduce some tolerance for the switch holes. 94 | * depends on your printers resolution and if you want 95 | * narrow or loose fit of switches. do not configure to 96 | * narrow switch holes. when placing switches into the holes 97 | * they will pull the case apart and bend it. this will normally 98 | * be reduced by the lid, but do not overact this. 99 | */ 100 | switchHoleTolerance = -0.2; 101 | 102 | 103 | /* ############################################## */ 104 | /* ########## LAYOUT AND KEYCAP COLORS ########## */ 105 | /* ############################################## */ 106 | /* Usage: [[column place, row place],keycap unit, color for keycap simulation] */ 107 | /* "column place" is the place of the switch hole in the column; 108 | - example: Esc, F1, F2, F3, ... 109 | 0 1 2 3 ... 110 | "row place" is the place of the switch in the row; 111 | - example: Esc, accent, TAB, CapsLock, ... 112 | */ 113 | 114 | /* ansiUS_TKL */ 115 | layout = [ 116 | //start ROW 0 Function ROW 117 | [[0,0],1,"Grey"], //Esc 118 | [[2,0],1,"Grey"], //F1 119 | [[3,0],1,"Grey"], //F2 120 | [[4,0],1,"Grey"], //F3 121 | [[5,0],1,"Grey"], //F4 122 | [[6.5,0],1,"Grey"], //F5 123 | [[7.5,0],1,"Grey"], //F6 124 | [[8.5,0],1,"Grey"], //F7 125 | [[9.5,0],1,"Grey"], //F8 126 | [[11,0],1,"Grey"], //F9 127 | [[12,0],1,"Grey"], //F10 128 | [[13,0],1,"Grey"], //F11 129 | [[14,0],1,"Grey"], //F12 130 | [[15.25,0],1,"Grey"], //PrintScreen 131 | [[16.25,0],1,"Grey"], //ScrollLock 132 | [[17.25,0],1,"Grey"], //Pause 133 | //start ROW 1 134 | [[ 0,1],1,"Grey"], //' 135 | [[1,1],1,"Grey"], //1 136 | [[2,1],1,"Grey"], //2 137 | [[3,1],1,"Grey"], //3 138 | [[4,1],1,"Grey"], //4 139 | [[5,1],1,"Grey"], //5 140 | [[6,1],1,"Grey"], //6 141 | [[7,1],1,"Grey"], //7 142 | [[8,1],1,"Grey"], //8 143 | [[9,1],1,"Grey"], //9 144 | [[10,1],1,"Grey"], //0 145 | [[11,1],1,"Grey"], //-_ 146 | [[12,1],1,"Grey"], //=+ 147 | [[13,1],2,"Grey"], //backspace 148 | [[15.25,1],1,"Grey"], //ins 149 | [[16.25,1],1,"Grey"], //pos1 150 | [[17.25,1],1,"Grey"], //PgUp 151 | //start ROW 2 152 | [[ 0,2],1.5,"Grey"], //TAB 153 | [[1.5,2],1,"Grey"], //Q 154 | [[2.5,2],1,"Grey"], //W 155 | [[3.5,2],1,"Grey"], //E 156 | [[4.5,2],1,"Grey"], //R 157 | [[5.5,2],1,"Grey"], //T 158 | [[6.5,2],1,"Grey"], //Y 159 | [[7.5,2],1,"Grey"], //U 160 | [[8.5,2],1,"Grey"], //I 161 | [[9.5,2],1,"Grey"], //O 162 | [[10.5,2],1,"Grey"], //P 163 | [[11.5,2],1,"Grey"], //[ 164 | [[12.5,2],1,"Grey"], //] 165 | [[13.5,2],1.5,"Grey"], // \ 166 | [[15.25,2],1,"Grey"], // del 167 | [[16.25,2],1,"Grey"], // end 168 | [[17.25,2],1,"Grey"], // PgDn 169 | //start ROW 3 170 | [[ 0,3],1.75,"Grey"], //CapsLock 171 | [[1.75,3],1,"Grey"], //A 172 | [[2.75,3],1,"Grey"], //S 173 | [[3.75,3],1,"Grey"], //D 174 | [[4.75,3],1,"Grey"], //F 175 | [[5.75,3],1,"Grey"], //G 176 | [[6.75,3],1,"Grey"], //H 177 | [[7.75,3],1,"Grey"], //J 178 | [[8.75,3],1,"Grey"], //K 179 | [[9.75,3],1,"Grey"], //L 180 | [[10.75,3],1,"Grey"], //; 181 | [[11.75,3],1,"Grey"], //' 182 | [[12.75,3],2.25,"Grey"], //ENTER 183 | //start ROW 4 184 | [[ 0,4],2.25,"Grey"], //LShift 185 | [[2.25,4],1,"Grey"], //Z 186 | [[3.25,4],1,"Grey"], //X 187 | [[4.25,4],1,"Grey"], //C 188 | [[5.25,4],1,"Grey"], //V 189 | [[6.25,4],1,"Grey"], //B 190 | [[7.25,4],1,"Grey"], //N 191 | [[8.25,4],1,"Grey"], //M 192 | [[9.25,4],1,"Grey"], //, 193 | [[10.25,4],1,"Grey"], //. 194 | [[11.25,4],1,"Grey"], // / 195 | [[12.25,4],2.75,"Grey"], //RShift 196 | [[16.25,4],1,"Grey"], //UP 197 | //start ROW 5 198 | [[ 0,5],1.25,"Grey"], //LCTRL 199 | [[1.25,5],1.25,"Grey"], //TUX 200 | [[2.5 ,5],1.25,"Grey"], //ALT 201 | [[3.75,5],6.25,"Grey"], //SPACE 202 | [[10 ,5],1.25,"Grey"], //COMP 203 | [[11.25,5],1.25,"Grey"], //Fn 204 | [[12.5,5],1.25,"Grey"], //Menu 205 | [[13.75 ,5],1.25,"Grey"], //RCTRL 206 | [[15.25,5],1,"Grey"], //LEFT 207 | [[16.25,5],1,"Grey"], //DOWN 208 | [[17.25,5],1,"Grey"], //RIGHT 209 | ]; 210 | 211 | /* enable placment of stabilizers on switchholes with x.5 unit in y direction 212 | * for example: true for numpad enter or numpad + 213 | * if you just want a single unit (1unit keycap) you can set this to false */ 214 | enableStabsOnHalfs = true; 215 | 216 | /* move pcb and usb cutout in x direction 217 | for better placement */ 218 | pcbShift=-13; 219 | 220 | /* cutout for micro usb plug (not the housing of the usb plug!) 221 | * change this if using mini usb 222 | */ 223 | usbCutX=8; 224 | usbCutY=wallThickness; 225 | 226 | /* Arduino Pro Micro USB Port height */ 227 | /* usbCutZ=3.4; */ 228 | 229 | /* Teensy2 USB Port height */ 230 | usbCutZ=4.5; 231 | 232 | /* space in lid for placing the controller pcb. 233 | * this example is for arduino pro micro clones. 234 | * if you use teensy2.0 or something else configure 235 | * the size of the controller pcb you use. the function 236 | * 'pcbCutout()' will add 1mm to 'pcbWidth' for some clearance. 237 | * pcbLength should be as exactly as possible. this keeps the pcb 238 | * perfectly even if pcbWidth is to much 239 | */ 240 | /* teensy2 cutout */ 241 | pcbHeight = 1.8; 242 | pcbWidth = 18.5; 243 | pcbLength = 31.4; 244 | 245 | /* arduino pro micro cutout */ 246 | //pcbHeight = 2; 247 | //pcbWidth = 18; 248 | //pcbLength = 34; 249 | 250 | /* set 'addRisers' to true or false 251 | * to calculate a lid with holes for risers 252 | * and add risers to simulation 253 | */ 254 | addRisers = true; 255 | 256 | /* keyboardRiser config 257 | * angleBaseX -> width of the riser 258 | * angleBaseY -> depth of the riser 259 | */ 260 | angleBaseY=100; 261 | angleBaseX=80; 262 | /* riser edge radius */ 263 | angleBaseRad=1; 264 | /* polygon; this is the shape of the riser */ 265 | riserPoints = [ 266 | [0,0], 267 | [angleBaseY,0], 268 | [angleBaseY,3], 269 | [0,18] 270 | ]; 271 | 272 | /* optional: move keyboard risers as needed */ 273 | xRiserR=0; 274 | xRiserL=0; 275 | yRiserAll=0; 276 | 277 | /* move connectors (round cylinders on top of risers) 278 | around. this is useful for layouts which have a narrow 279 | height, but still need risers */ 280 | riserConnectorRadius = 5; 281 | riserConnectorX = 0; 282 | riserConnectorY1 = 60; 283 | 284 | 285 | 286 | 287 | /* ####### include keyboard lib ############ */ 288 | include 289 | include 290 | 291 | /* this module gets called in 'holematrix' and adds a specific 292 | * object to the 'holematrix'. it enables placing switchholes 293 | * or other cutout objects to the model */ 294 | module extraCutoutHook() 295 | { 296 | } 297 | 298 | /* this module gets called in 'keycapMatrix()' and adds a specific 299 | * object to the keycapMatrix. keycapMatrix is needed as a cutout element 300 | * from the frame. this hook gives possibility to add more elements such 301 | * as the enter keycap. 302 | */ 303 | module extraKeycapCutoutHook() 304 | { 305 | } 306 | 307 | /* this module gets called in 'keySim()' and adds a specific 308 | * object to the 'key simulation'. it enables placing keys 309 | * or other objects to the model simulation */ 310 | module extraKeySimHook() 311 | { 312 | } 313 | 314 | 315 | /* ####### screw hole config ######## */ 316 | /* set the screw holes to a good position. 317 | * if your keyboard is bigger, you can add some 318 | * more screw holes into the keyboard case and lid. 319 | */ 320 | screwHoleArray = [ 321 | [24,lkey-0.5], //left lower row 322 | [157,lkey-0.5], 323 | [193,lkey-0.5], 324 | [328,lkey-0.5], // right lower row 325 | 326 | [24,lkey*3+wallThickness-3], //left mid row 327 | [148.5,lkey*3+wallThickness-3], 328 | [200,lkey*3+wallThickness-3], 329 | [328,lkey*3+wallThickness-3], //right mid row 330 | 331 | [24,lkey*5+wallThickness-3], //left upper row 332 | [152,lkey*5+wallThickness-3], 333 | [200,lkey*5+wallThickness-3], 334 | [328,lkey*5+wallThickness-3], //right upper row 335 | ]; 336 | 337 | /* rotate screw hole spacers */ 338 | screwSpacerRotation=0; 339 | 340 | /* move horizontal case stabilizers inside the case. 341 | * to move horizontal by lkey/2 for half switch cutout. 342 | * this enables to set x.5 values in layout array. 343 | * else use 0!! 344 | */ 345 | caseStabMov=0; 346 | 347 | /* screw holes when enabling outer case frame */ 348 | frameScrewHoleArray = [ 349 | [-skirtX/2-innerCaseRadius/2,-skirtY/2-innerCaseRadius/2], //lower row 350 | [caseWidth/4,-skirtY/2-innerCaseRadius/2], 351 | [caseWidth/2-lkey,-skirtY/2-innerCaseRadius/2], 352 | [caseWidth/2+lkey,-skirtY/2-innerCaseRadius/2], //lower row 353 | [caseWidth-caseWidth/4,-skirtY/2-innerCaseRadius/2], 354 | [caseWidth+skirtX/2+innerCaseRadius/2,-skirtY/2-innerCaseRadius/2], 355 | 356 | [-skirtX/2-innerCaseRadius/2,lkey*1.5], //lower row 357 | [caseWidth+skirtX/2+innerCaseRadius/2,lkey*1.5], 358 | 359 | [-skirtX/2-innerCaseRadius/2,caseDepth-lkey*0.75], //lower row 360 | [caseWidth/2-lkey,caseDepth-lkey*0.75], 361 | [caseWidth/4,caseDepth-lkey*0.75], 362 | [caseWidth/2+lkey,caseDepth-lkey*0.75], //lower row 363 | [caseWidth-caseWidth/4,caseDepth-lkey*0.75], 364 | [caseWidth+skirtX/2+innerCaseRadius/2,caseDepth-lkey*0.75], 365 | 366 | [-skirtX/2-innerCaseRadius/2,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2], //lower row 367 | [caseWidth/4,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2], 368 | [caseWidth/2-lkey,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2], 369 | [caseWidth/2+lkey,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2], //lower row 370 | [caseWidth-caseWidth/4,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2], 371 | [caseWidth+skirtX/2+innerCaseRadius/2,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2] 372 | ]; 373 | 374 | 375 | 376 | 377 | /* set colors for simulation, set 0 for default OpenSCAD Gui Colors */ 378 | colorCaseTop="White"; 379 | colorCaseMid="DarkGray"; 380 | colorLid="Black"; 381 | colorRiserR="Black"; 382 | colorRiserL="Black"; 383 | 384 | frameColor="Black"; 385 | 386 | /* color simulation for switches 387 | select top and bottom color */ 388 | switchColorTop = "Ivory"; 389 | switchColorBottom = "Black"; 390 | 391 | /* simulate a keycap profile with number of fragments ($fn = setKeycapFragments) 392 | which will be set to key() call. 393 | KeyV2 currently (2022-06) does not support XDA. 394 | Use DSA as they look very similar 395 | NOTE: DSA is fixed to 3rd row as KeyV2 includes row number into calculation 396 | of DSA caps 397 | NOTE: currently not all profiles are working. OEM or DCS are always simulated! */ 398 | keycapProfile = "SA"; // SA, DSA, DCS, G20, Hi-Pro, OEM 399 | setKeycapFragments = 50; 400 | 401 | /* ###################### BUILD_LINE ########################*/ 402 | /* ##########################################################*/ 403 | /* All calls after this line have to be ignored by the build script. 404 | * Do not place any calls above build line (or comment it) 405 | */ 406 | 407 | /* uncomment following line to get the keyboard simulation 408 | * with keycaps. set DoKeycapSimulation to true or false to add 409 | * or remove keycap simulation 410 | */ 411 | /* KeyboardSim(layout,doFrameSim=false,DoKeycapSimulation=false,xRotate=9.5); */ 412 | 413 | /* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */ 414 | /* ##### uncomment the keyboard part you want to print ##### */ 415 | /* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv */ 416 | 417 | /* ### complete keyboard model ### */ 418 | /* mainCase(layout); */ 419 | /* lid(); */ 420 | 421 | /* keycap frame functions. activate if skirt is enabled 422 | and you want a frame that hides the switches, which is 423 | a more classic look to none printed keyboards */ 424 | /* translate([0,0,13]) 425 | capFrame(layout); */ 426 | 427 | /* translate([0,0,13]) 428 | capFrameR(layout); */ 429 | 430 | /* translate([0,0,13]) 431 | capFrameL(layout); */ 432 | 433 | /* ### devided keyboard and lid model ### */ 434 | /* mainCaseLeft(layout); */ 435 | /* mainCaseRight(layout); */ 436 | 437 | /* lidL(); */ 438 | /* lidR(); */ 439 | 440 | /* keyboardRiser(); */ 441 | -------------------------------------------------------------------------------- /andimotoSmallTKL.scad: -------------------------------------------------------------------------------- 1 | /* andimoto_smallTKL.scad 2 | Author: andimoto@posteo.de 3 | ---------------------------- 4 | for placing assambled parts and 5 | single parts go to end of this file 6 | 7 | this file contains the layout for my smallTKL keyboard 3d model which can be devided 8 | to print on smaller printers 9 | 10 | this file includes KeyV2 files. see https://github.com/rsheldiii/KeyV2 11 | if you don't want this file to be included, just don't clone this library or 12 | set the 'DoKeycapSimulation' parameter of KeyboardSim() to false. 13 | */ 14 | 15 | /* ########## predefinitions ############ */ 16 | $fn=30; 17 | 18 | 19 | /* Thickness of entire plate which holds the switches. 20 | * this is the top of the keyboard 21 | */ 22 | plateThickness=3; 23 | /* thickness of the walls */ 24 | wallThickness=3; 25 | /* height of the case */ 26 | caseHeight=13; 27 | 28 | /* space between inner case stabilizers 29 | and the bottom/lip of the case */ 30 | innerCaseSpace = 5; 31 | 32 | //length, in units, of board 33 | width=17.25; 34 | //Height, in units, of board 35 | height=6; 36 | 37 | /* thickness of the lid. 38 | the function 'lid()' will add an 39 | extra mm to get a step for the lip 40 | see 'innerExtraLid' variable in constants */ 41 | lidThickness=3; 42 | 43 | 44 | /* ########## variables for cutting keyboard into smaller pieces ########## */ 45 | /* these are unit values; one unit is one key or switchhole 46 | * this makes the keyboard printable on nearly every printer. 47 | */ 48 | cutAfterUnits = 8; 49 | spacebarCut = 4.5; 50 | 51 | /* fRowSeparator [true/false] 52 | * Select separation of F-Row (or Row 0; key[0][1]=0) 53 | * This will move the upper row by a half unit (lkey*0.5) 54 | */ 55 | fRowSeparator=true; 56 | 57 | /* skirt selctor and skirt settings 58 | * select 'skirtSelect' as true to activate a additional skirt 59 | * around the keyboard case. The variables 'skirtX' & 'skirtY' 60 | * are configurable as you want the skirt. These values ADD the 61 | * configured amount to the side of the case. 62 | * Note: be careful here, this interacts with caseRadius 63 | * 64 | * If this is activated you can call 'capFrame()' 65 | * (or capFrameR/capFrameL) to create a nice frame 66 | * around the keycaps to cover the switches. This may give 67 | * a cleaner look if this is prefered. 68 | */ 69 | skirtSelect = false; 70 | skirtX = 0; 71 | skirtY = 0; 72 | 73 | /* enables screw holes in frame (if capFrame() is called) 74 | and in the case. The screws will be placed according to 75 | the array frameScrewHoleArray[] around the case and frame. 76 | */ 77 | frameScrewsEnable = false; 78 | 79 | /* edge radius of the case 80 | * Note: be careful here, this interacts with skirtX/Y 81 | * THIS IS ONLY VALID WHEN 'skirtSelect' IS TRUE 82 | */ 83 | caseRadius=0; 84 | 85 | 86 | /* ################## calculated vars #################### */ 87 | 88 | 89 | /* debug extra for avoiding artefacts @ compilation */ 90 | extra=1; 91 | 92 | 93 | /* add or reduce some tolerance for the switch holes. 94 | * depends on your printers resolution and if you want 95 | * narrow or loose fit of switches. do not configure to 96 | * narrow switch holes. when placing switches into the holes 97 | * they will pull the case apart and bend it. this will normally 98 | * be reduced by the lid, but do not overact this. 99 | */ 100 | switchHoleTolerance = -0.2; 101 | 102 | 103 | /* ############################################## */ 104 | /* ########## LAYOUT AND KEYCAP COLORS ########## */ 105 | /* ############################################## */ 106 | /* Usage: [[column place, row place],keycap unit, color for keycap simulation] */ 107 | /* "column place" is the place of the switch hole in the column; 108 | - example: Esc, F1, F2, F3, ... 109 | 0 1 2 3 ... 110 | "row place" is the place of the switch in the row; 111 | - example: Esc, accent, TAB, CapsLock, ... 112 | */ 113 | /* ansiUS_smallTKL */ 114 | layout = [ 115 | //start ROW 0 Function ROW 116 | [[0,0],1,"SlateGray"], //Esc 117 | [[2,0],1,"Silver"], //F1 118 | [[3,0],1,"Silver"], //F2 119 | [[4,0],1,"Silver"], //F3 120 | [[5,0],1,"Silver"], //F4 121 | [[6.5,0],1,"SlateGray"], //F5 122 | [[7.5,0],1,"SlateGray"], //F6 123 | [[8.5,0],1,"SlateGray"], //F7 124 | [[9.5,0],1,"SlateGray"], //F8 125 | [[11,0],1,"Silver"], //F9 126 | [[12,0],1,"Silver"], //F10 127 | [[13,0],1,"Silver"], //F11 128 | [[14,0],1,"Silver"], //F12 129 | [[15.25,0],1,"SlateGray"], //PrintScreen 130 | [[16.25,0],1,"SlateGray"], //PrintScreen 131 | /* [[17,0],1,"Gray"], // Del/Ins */ 132 | //start ROW 1 133 | [[ 0,1],1,"Silver"], //' 134 | [[1,1],1,"Silver"], //1 135 | [[2,1],1,"Silver"], //2 136 | [[3,1],1,"Silver"], //3 137 | [[4,1],1,"Silver"], //4 138 | [[5,1],1,"Silver"], //5 139 | [[6,1],1,"Silver"], //6 140 | [[7,1],1,"Silver"], //7 141 | [[8,1],1,"Silver"], //8 142 | [[9,1],1,"Silver"], //9 143 | [[10,1],1,"Silver"], //0 144 | [[11,1],1,"Silver"], //-_ 145 | [[12,1],1,"Silver"], //=+ 146 | [[13,1],2,"SlateGray"], //backspace 147 | [[15.25,1],1,"SlateGray"], //ins 148 | [[16.25,1],1,"SlateGray"], //pos1 149 | //start ROW 2 150 | [[ 0,2],1.5,"SlateGray"], //TAB 151 | [[1.5,2],1,"Silver"], //Q 152 | [[2.5,2],1,"Silver"], //W 153 | [[3.5,2],1,"Silver"], //E 154 | [[4.5,2],1,"Silver"], //R 155 | [[5.5,2],1,"Silver"], //T 156 | [[6.5,2],1,"Silver"], //Y 157 | [[7.5,2],1,"Silver"], //U 158 | [[8.5,2],1,"Silver"], //I 159 | [[9.5,2],1,"Silver"], //O 160 | [[10.5,2],1,"Silver"], //P 161 | [[11.5,2],1,"Silver"], //[ 162 | [[12.5,2],1,"Silver"], //] 163 | [[13.5,2],1.5,"Silver"], // \ 164 | [[15.25,2],1,"SlateGray"], // del 165 | [[16.25,2],1,"SlateGray"], // end 166 | //start ROW 3 167 | [[ 0,3],1.75,"SlateGray"], //CapsLock 168 | [[1.75,3],1,"Silver"], //A 169 | [[2.75,3],1,"Silver"], //S 170 | [[3.75,3],1,"Silver"], //D 171 | [[4.75,3],1,"Silver"], //F 172 | [[5.75,3],1,"Silver"], //G 173 | [[6.75,3],1,"Silver"], //H 174 | [[7.75,3],1,"Silver"], //J 175 | [[8.75,3],1,"Silver"], //K 176 | [[9.75,3],1,"Silver"], //L 177 | [[10.75,3],1,"Silver"], //; 178 | [[11.75,3],1,"Silver"], //' 179 | [[12.75,3],2.25,"SlateGray"], //ENTER 180 | //start ROW 4 181 | [[ 0,4],2.25,"SlateGray"], //LShift 182 | [[2.25,4],1,"Silver"], //Z 183 | [[3.25,4],1,"Silver"], //X 184 | [[4.25,4],1,"Silver"], //C 185 | [[5.25,4],1,"Silver"], //V 186 | [[6.25,4],1,"Silver"], //B 187 | [[7.25,4],1,"Silver"], //N 188 | [[8.25,4],1,"Silver"], //M 189 | [[9.25,4],1,"Silver"], //, 190 | [[10.25,4],1,"Silver"], //. 191 | [[11.25,4],1,"Silver"], // / 192 | [[12.25,4],2.75,"SlateGray"], //RShift 193 | [[15.25,4],1,"SlateGray"], //UP 194 | //start ROW 5 195 | [[ 0,5],1.25,"SlateGray"], //LCTRL 196 | [[1.25,5],1.25,"SlateGray"], //TUX 197 | [[2.5 ,5],1.25,"SlateGray"], //ALT 198 | [[3.75,5],6.25,"Silver"], //SPACE 199 | [[10 ,5],1.25,"SlateGray"], //COMP 200 | [[11.25,5],1.25,"SlateGray"], //Fn 201 | [[12.5 ,5],1.25,"SlateGray"], //RCTRL 202 | [[14.25,5],1,"SlateGray"], //LEFT 203 | [[15.25,5],1,"SlateGray"], //DOWN 204 | [[16.25,5],1,"SlateGray"], //RIGHT 205 | ]; 206 | 207 | /* enable placment of stabilizers on switchholes with x.5 unit in y direction 208 | * for example: true for numpad enter or numpad + 209 | * if you just want a single unit (1unit keycap) you can set this to false */ 210 | enableStabsOnHalfs = true; 211 | 212 | /* move pcb and usb cutout in x direction 213 | for better placement */ 214 | pcbShift=0; 215 | 216 | /* cutout for micro usb plug (not the housing of the usb plug!) 217 | * change this if using mini usb 218 | */ 219 | usbCutX=8; 220 | usbCutY=wallThickness; 221 | 222 | /* Arduino Pro Micro USB Port height */ 223 | /* usbCutZ=3.4; */ 224 | 225 | /* Teensy2 USB Port height */ 226 | usbCutZ=4.5; 227 | 228 | /* space in lid for placing the controller pcb. 229 | * this example is for arduino pro micro clones. 230 | * if you use teensy2.0 or something else configure 231 | * the size of the controller pcb you use. the function 232 | * 'pcbCutout()' will add 1mm to 'pcbWidth' for some clearance. 233 | * pcbLength should be as exactly as possible. this keeps the pcb 234 | * perfectly even if pcbWidth is to much 235 | */ 236 | /* teensy2 cutout */ 237 | pcbHeight = 1.8; 238 | pcbWidth = 18.5; 239 | pcbLength = 31.4; 240 | 241 | /* arduino pro micro cutout */ 242 | /* pcbHeight = 2; */ 243 | /* pcbWidth = 18; */ 244 | /* pcbLength = 34; */ 245 | 246 | /* set 'addRisers' to true or false 247 | * to calculate a lid with holes for risers 248 | * and add risers to simulation 249 | */ 250 | addRisers = true; 251 | 252 | /* keyboardRiser config 253 | * angleBaseX -> width of the riser 254 | * angleBaseY -> depth of the riser 255 | */ 256 | angleBaseY=90; 257 | angleBaseX=60; 258 | /* riser edge radius */ 259 | angleBaseRad=1; 260 | /* polygon; this is the shape of the riser */ 261 | riserPoints = [ 262 | [0,0], 263 | [angleBaseY,0], 264 | [angleBaseY,3], 265 | [0,18] 266 | ]; 267 | 268 | /* optional: move keyboard risers as needed */ 269 | xRiserR=0; 270 | xRiserL=0; 271 | yRiserAll=0; 272 | 273 | riserConnectorRadius = 5; 274 | riserConnectorX = 0; 275 | riserConnectorY1 = 60; 276 | 277 | 278 | 279 | 280 | /* ####### include keyboard lib ############ */ 281 | include 282 | include 283 | 284 | /* this module gets called in 'holematrix' and adds a specific 285 | * object to the 'holematrix'. it enables placing switchholes 286 | * or other cutout objects to the model */ 287 | module extraCutoutHook() 288 | { 289 | } 290 | 291 | /* this module gets called in 'keycapMatrix()' and adds a specific 292 | * object to the keycapMatrix. keycapMatrix is needed as a cutout element 293 | * from the frame. this hook gives possibility to add more elements such 294 | * as the enter keycap. 295 | */ 296 | module extraKeycapCutoutHook() 297 | { 298 | } 299 | 300 | /* this module gets called in 'keySim()' and adds a specific 301 | * object to the 'key simulation'. it enables placing keys 302 | * or other objects to the model simulation */ 303 | module extraKeySimHook() 304 | { 305 | } 306 | 307 | 308 | /* ####### screw hole config ######## */ 309 | /* set the screw holes to a good position. 310 | * if your keyboard is bigger, you can add some 311 | * more screw holes into the keyboard case and lid. 312 | */ 313 | screwHoleArray = [ 314 | [24,lkey-0.5], //left lower row 315 | [145,lkey-0.5], 316 | [190,lkey-0.5], 317 | [309.5,lkey-0.5], // right lower row 318 | 319 | [24,lkey*3+wallThickness-3], //left mid row 320 | [142.5,lkey*3+wallThickness-3], 321 | [181,lkey*3+wallThickness-3], 322 | [309.5,lkey*3+wallThickness-3], //right mid row 323 | 324 | [24,lkey*5+wallThickness-3], //left upper row 325 | [143,lkey*5+wallThickness-3], 326 | [181,lkey*5+wallThickness-3], 327 | [309.5,lkey*5+wallThickness-3], //right upper row 328 | ]; 329 | 330 | /* rotate screw hole spacers */ 331 | screwSpacerRotation=0; 332 | 333 | /* move horizontal case stabilizers inside the case. 334 | * to move horizontal by lkey/2 for half switch cutout. 335 | * this enables to set x.5 values in layout array. 336 | * else use 0!! 337 | */ 338 | caseStabMov=0; 339 | 340 | /* screw holes when enabling outer case frame */ 341 | frameScrewHoleArray = [ 342 | [-skirtX/2-innerCaseRadius/2,-skirtY/2-innerCaseRadius/2], //lower row 343 | [caseWidth/4,-skirtY/2-innerCaseRadius/2], 344 | [caseWidth/2-lkey,-skirtY/2-innerCaseRadius/2], 345 | [caseWidth/2+lkey,-skirtY/2-innerCaseRadius/2], //lower row 346 | [caseWidth-caseWidth/4,-skirtY/2-innerCaseRadius/2], 347 | [caseWidth+skirtX/2+innerCaseRadius/2,-skirtY/2-innerCaseRadius/2], 348 | 349 | [-skirtX/2-innerCaseRadius/2,lkey*1.5], //lower row 350 | [caseWidth+skirtX/2+innerCaseRadius/2,lkey*1.5], 351 | 352 | [-skirtX/2-innerCaseRadius/2,caseDepth-lkey*0.75], //lower row 353 | [caseWidth/2-lkey,caseDepth-lkey*0.75], 354 | [caseWidth/4,caseDepth-lkey*0.75], 355 | [caseWidth/2+lkey,caseDepth-lkey*0.75], //lower row 356 | [caseWidth-caseWidth/4,caseDepth-lkey*0.75], 357 | [caseWidth+skirtX/2+innerCaseRadius/2,caseDepth-lkey*0.75], 358 | 359 | [-skirtX/2-innerCaseRadius/2,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2], //lower row 360 | [caseWidth/4,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2], 361 | [caseWidth/2-lkey,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2], 362 | [caseWidth/2+lkey,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2], //lower row 363 | [caseWidth-caseWidth/4,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2], 364 | [caseWidth+skirtX/2+innerCaseRadius/2,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2] 365 | ]; 366 | 367 | 368 | 369 | 370 | /* set colors for simulation, set 0 for default OpenSCAD Gui Colors */ 371 | colorCaseTop="White"; 372 | colorCaseMid="DarkGray"; 373 | colorLid="Black"; 374 | colorRiserR="Black"; 375 | colorRiserL="Black"; 376 | 377 | frameColor="Black"; 378 | 379 | /* color simulation for switches 380 | select top and bottom color */ 381 | switchColorTop = "Ivory"; 382 | switchColorBottom = "Black"; 383 | 384 | /* simulate a keycap profile with number of fragments ($fn = setKeycapFragments) 385 | which will be set to key() call. 386 | KeyV2 currently (2022-06) does not support XDA. 387 | Use DSA as they look very similar 388 | NOTE: DSA is fixed to 3rd row as KeyV2 includes row number into calculation 389 | of DSA caps 390 | NOTE: currently not all profiles are working. OEM or DCS are always simulated! */ 391 | keycapProfile = "SA"; // SA, DSA, DCS, G20, Hi-Pro, OEM 392 | setKeycapFragments = 50; 393 | 394 | /* ###################### BUILD_LINE ########################*/ 395 | /* ##########################################################*/ 396 | /* All calls after this line have to be ignored by the build script. 397 | * Do not place any calls above build line (or comment it) 398 | */ 399 | 400 | /* uncomment following line to get the keyboard simulation 401 | * with keycaps. set DoKeycapSimulation to true or false to add 402 | * or remove keycap simulation 403 | */ 404 | /* KeyboardSim(layout,doFrameSim=false,DoKeycapSimulation=false,xRotate=9.5); */ 405 | 406 | /* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */ 407 | /* ##### uncomment the keyboard part you want to print ##### */ 408 | /* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv */ 409 | 410 | /* ### complete keyboard model ### */ 411 | /* mainCase(layout); */ 412 | /* lid(); */ 413 | 414 | /* keycap frame functions. activate if skirt is enabled 415 | and you want a frame that hides the switches, which is 416 | a more classic look to none printed keyboards */ 417 | /* translate([0,0,13]) 418 | capFrame(layout); */ 419 | 420 | /* translate([0,0,13]) 421 | capFrameR(layout); */ 422 | 423 | /* translate([0,0,13]) 424 | capFrameL(layout); */ 425 | 426 | /* ### devided keyboard and lid model ### */ 427 | mainCaseLeft(layout); 428 | /* mainCaseRight(layout); */ 429 | 430 | /* lidL(); */ 431 | /* lidR(); */ 432 | 433 | keyboardRiser(); 434 | -------------------------------------------------------------------------------- /andimoto75Q1.scad: -------------------------------------------------------------------------------- 1 | /* andimoto75Q1.scad 2 | Author: andimoto@posteo.de 3 | ---------------------------- 4 | for placing assambled parts and 5 | single parts go to end of this file 6 | 7 | this file contains the layout for my 7583 keyboard 3d model which can be devided 8 | to print on smaller printers 9 | 10 | this file includes KeyV2 files. see https://github.com/rsheldiii/KeyV2 11 | if you don't want this file to be included, just don't clone this library or 12 | set the 'DoKeycapSimulation' parameter of KeyboardSim() to false. 13 | */ 14 | 15 | /* ########## predefinitions ############ */ 16 | $fn=30; 17 | 18 | 19 | /* Thickness of entire plate which holds the switches. 20 | * this is the top of the keyboard 21 | */ 22 | plateThickness=3; 23 | /* thickness of the walls */ 24 | wallThickness=3; 25 | /* height of the case */ 26 | caseHeight=13; 27 | 28 | /* space between inner case stabilizers (no costar stabs) 29 | and the bottom/lip of the case */ 30 | innerCaseSpace = 5; 31 | 32 | //length, in units, of board 33 | width=16.25; 34 | //Height, in units, of board 35 | height=6; 36 | 37 | /* thickness of the lid. 38 | the function 'lid()' will add an 39 | extra mm to get a step for the lip 40 | see 'innerExtraLid' variable in constants */ 41 | lidThickness=3; 42 | 43 | 44 | /* ########## variables for cutting keyboard into smaller pieces ########## */ 45 | /* these are unit values; one unit is one key or switchhole 46 | * this makes the keyboard printable on nearly every printer. 47 | */ 48 | cutAfterUnits = 7.25; 49 | spacebarCut = 4.5; 50 | 51 | /* fRowSeparator [true/false] 52 | * Select separation of F-Row (or Row 0; key[0][1]=0) 53 | * This will move the upper row by a half unit (lkey*0.5) 54 | */ 55 | fRowSeparator=true; 56 | 57 | /* skirt selctor and skirt settings 58 | * select 'skirtSelect' as true to activate a additional skirt 59 | * around the keyboard case. The variables 'skirtX' & 'skirtY' 60 | * are configurable as you want the skirt. These values ADD the 61 | * configured amount to the side of the case. 62 | * Note: be careful here, this interacts with caseRadius 63 | * 64 | * If this is activated you can call 'capFrame()' 65 | * (or capFrameR/capFrameL) to create a nice frame 66 | * around the keycaps to cover the switches. This may give 67 | * a cleaner look if this is prefered. 68 | */ 69 | skirtSelect = true; 70 | skirtX = 7; 71 | skirtY = 7; 72 | 73 | /* enables screw holes in frame (if capFrame() is called) 74 | and in the case. The screws will be placed according to 75 | the array frameScrewHoleArray[] around the case and frame. 76 | */ 77 | frameScrewsEnable = true; 78 | 79 | /* edge radius of the case 80 | * Note: be careful here, this interacts with skirtX/Y 81 | * THIS IS ONLY VALID WHEN 'skirtSelect' IS TRUE 82 | */ 83 | caseRadius=3; 84 | 85 | 86 | /* ################## calculated vars #################### */ 87 | 88 | 89 | /* debug extra for avoiding artefacts @ compilation */ 90 | extra=1; 91 | 92 | 93 | /* add or reduce some tolerance for the switch holes. 94 | * depends on your printers resolution and if you want 95 | * narrow or loose fit of switches. do not configure to 96 | * narrow switch holes. when placing switches into the holes 97 | * they will pull the case apart and bend it. this will normally 98 | * be reduced by the lid, but do not overact this. 99 | */ 100 | switchHoleTolerance = -0.2; 101 | 102 | 103 | /* ############################################## */ 104 | /* ########## LAYOUT AND KEYCAP COLORS ########## */ 105 | /* ############################################## */ 106 | /* Usage: [[column place, row place],keycap unit, color for keycap simulation] */ 107 | /* "column place" is the place of the switch hole in the column; 108 | - example: Esc, F1, F2, F3, ... 109 | 0 1 2 3 ... 110 | "row place" is the place of the switch in the row; 111 | - example: Esc, accent, TAB, CapsLock, ... 112 | */ 113 | /* ansi_us_75Q1 */ 114 | layout = [ 115 | //start ROW 0 Function ROW 116 | [[0,0],1,"Red"], //Esc 117 | [[1.25,0],1,"GhostWhite"], //F1 118 | [[2.25,0],1,"GhostWhite"], //F2 119 | [[3.25,0],1,"GhostWhite"], //F3 120 | [[4.25,0],1,"GhostWhite"], //F4 121 | [[5.5,0],1,"#5883AC"], //F5 122 | [[6.5,0],1,"#5883AC"], //F6 123 | [[7.5,0],1,"#5883AC"], //F7 124 | [[8.5,0],1,"#5883AC"], //F8 125 | [[9.75,0],1,"GhostWhite"], //F9 126 | [[10.75,0],1,"GhostWhite"], //F10 127 | [[11.75,0],1,"GhostWhite"], //F11 128 | [[12.75,0],1,"GhostWhite"], //F12 129 | [[14,0],1,"#5883AC"], //ins 130 | [[15.25,0],1,"#5883AC"], // Del 131 | //start ROW 1 132 | [[ 0,1],1,"#5883AC"], //^ 133 | [[1,1],1,"GhostWhite"], //1 134 | [[2,1],1,"GhostWhite"], //2 135 | [[3,1],1,"GhostWhite"], //3 136 | [[4,1],1,"GhostWhite"], //4 137 | [[5,1],1,"GhostWhite"], //5 138 | [[6,1],1,"GhostWhite"], //6 139 | [[7,1],1,"GhostWhite"], //7 140 | [[8,1],1,"GhostWhite"], //8 141 | [[9,1],1,"GhostWhite"], //9 142 | [[10,1],1,"GhostWhite"], //0 143 | [[11,1],1,"GhostWhite"], //ß 144 | [[12,1],1,"GhostWhite"], //` 145 | [[13,1],2,"#5883AC"], //backspace 146 | [[15.25,1],1,"#5883AC"], //PgUp 147 | //start ROW 2 148 | [[ 0,2],1.5,"#5883AC"], //TAB 149 | [[1.5,2],1,"MintCream"], //Q 150 | [[2.5,2],1,"MintCream"], //W 151 | [[3.5,2],1,"MintCream"], //E 152 | [[4.5,2],1,"MintCream"], //R 153 | [[5.5,2],1,"MintCream"], //T 154 | [[6.5,2],1,"MintCream"], //Y 155 | [[7.5,2],1,"MintCream"], //U 156 | [[8.5,2],1,"MintCream"], //I 157 | [[9.5,2],1,"MintCream"], //O 158 | [[10.5,2],1,"MintCream"], //P 159 | [[11.5,2],1,"MintCream"], //[ 160 | [[12.5,2],1,"MintCream"], //] 161 | [[13.5,2],1.5,"#5883AC"], // \ 162 | [[15.25,2],1,"#5883AC"], // PgUp 163 | //start ROW 3 164 | [[ 0,3],1.75,"#5883AC"], //CapsLock 165 | [[1.75,3],1,"MintCream"], //A 166 | [[2.75,3],1,"MintCream"], //S 167 | [[3.75,3],1,"MintCream"], //D 168 | [[4.75,3],1,"MintCream"], //F 169 | [[5.75,3],1,"MintCream"], //G 170 | [[6.75,3],1,"MintCream"], //H 171 | [[7.75,3],1,"MintCream"], //J 172 | [[8.75,3],1,"MintCream"], //K 173 | [[9.75,3],1,"MintCream"], //L 174 | [[10.75,3],1,"MintCream"], //; 175 | [[11.75,3],1,"MintCream"], //' 176 | [[12.75,3],2.25,"#5883AC"], //ENTER 177 | [[15.25,3],1,"#5883AC"], //Home 178 | //start ROW 4 179 | [[ 0,4],2.25,"#5883AC"], //LShift 180 | [[2.25,4],1,"GhostWhite"], //Z 181 | [[3.25,4],1,"GhostWhite"], //X 182 | [[4.25,4],1,"GhostWhite"], //C 183 | [[5.25,4],1,"GhostWhite"], //V 184 | [[6.25,4],1,"GhostWhite"], //B 185 | [[7.25,4],1,"GhostWhite"], //N 186 | [[8.25,4],1,"GhostWhite"], //M 187 | [[9.25,4],1,"GhostWhite"], //, 188 | [[10.25,4],1,"GhostWhite"], //. 189 | [[11.25,4],1,"GhostWhite"], // - 190 | [[12.25,4],1.75,"#5883AC"], //RShift 191 | [[14.25,4.25],1,"GhostWhite"], //UP 192 | //start ROW 5 193 | [[ 0,5],1.25,"#5883AC"], //LCTRL 194 | [[1.25,5],1.25,"#5883AC"], //TUX 195 | [[2.5 ,5],1.25,"#5883AC"], //ALT 196 | [[3.75,5],6.25,"GhostWhite"], //SPACE 197 | [[10 ,5],1,"#5883AC"], //AltGr/Compose 198 | [[11,5],1,"#5883AC"], //Fn 199 | [[12,5],1,"#5883AC"], //Strg 200 | [[13.25,5.25],1,"GhostWhite"], //LEFT 201 | [[14.25,5.25],1,"GhostWhite"], //DOWN 202 | [[15.25,5.25],1,"GhostWhite"], //RIGHT 203 | ]; 204 | 205 | /* enable placment of stabilizers on switchholes with x.5 unit in y direction 206 | * for example: true for numpad enter or numpad + 207 | * if you just want a single unit (1unit keycap) you can set this to false */ 208 | enableStabsOnHalfs = true; 209 | 210 | /* move pcb and usb cutout in x direction 211 | for better placement */ 212 | pcbShift=0; 213 | 214 | /* cutout for micro usb plug (not the housing of the usb plug!) 215 | * change this if using mini usb 216 | */ 217 | usbCutX=8; 218 | usbCutY=wallThickness; 219 | 220 | /* Arduino Pro Micro USB Port height */ 221 | /* usbCutZ=3.4; */ 222 | 223 | /* Teensy2 USB Port height */ 224 | usbCutZ=4.5; 225 | 226 | /* space in lid for placing the controller pcb. 227 | * this example is for arduino pro micro clones. 228 | * if you use teensy2.0 or something else configure 229 | * the size of the controller pcb you use. the function 230 | * 'pcbCutout()' will add 1mm to 'pcbWidth' for some clearance. 231 | * pcbLength should be as exactly as possible. this keeps the pcb 232 | * perfectly even if pcbWidth is to much 233 | */ 234 | /* teensy2 cutout */ 235 | pcbHeight = 1.8; 236 | pcbWidth = 18.5; 237 | pcbLength = 31.4; 238 | 239 | /* arduino pro micro cutout */ 240 | /* pcbHeight = 2; 241 | pcbWidth = 18; 242 | pcbLength = 34; */ 243 | 244 | 245 | /* set 'addRisers' to true or false 246 | * to calculate a lid with holes for risers 247 | * and add risers to simulation 248 | */ 249 | addRisers = true; 250 | 251 | /* keyboardRiser config 252 | * angleBaseX -> width of the riser 253 | * angleBaseY -> depth of the riser 254 | */ 255 | angleBaseY=90; 256 | angleBaseX=60; 257 | /* riser edge radius */ 258 | angleBaseRad=1; 259 | /* polygon; this is the shape of the riser */ 260 | riserPoints = [ 261 | [0,0], 262 | [angleBaseY,0], 263 | [angleBaseY,2], 264 | [0,17] 265 | ]; 266 | 267 | /* optional: move keyboard risers as needed */ 268 | xRiserR=0; 269 | xRiserL=0; 270 | yRiserAll=0; 271 | 272 | /* move connectors (round cylinders on top of risers) 273 | around. this is useful for layouts which have a narrow 274 | height, but still need risers */ 275 | riserConnectorRadius = 5; 276 | riserConnectorX = 0; 277 | riserConnectorY1 = 60; 278 | 279 | 280 | 281 | 282 | /* ####### include keyboard lib ############ */ 283 | include 284 | include 285 | 286 | /* this module gets called in 'holematrix' and adds a specific 287 | * object to the 'holematrix'. it enables placing switchholes 288 | * or other cutout objects to the model */ 289 | module extraCutoutHook() 290 | { 291 | 292 | } 293 | 294 | /* this module gets called in 'keycapMatrix()' and adds a specific 295 | * object to the keycapMatrix. keycapMatrix is needed as a cutout element 296 | * from the frame. this hook gives possibility to add more elements such 297 | * as the enter keycap. 298 | */ 299 | module extraKeycapCutoutHook() 300 | { 301 | 302 | } 303 | 304 | /* this module gets called in 'keySim()' and adds a specific 305 | * object to the 'key simulation'. it enables placing keys 306 | * or other objects to the model simulation */ 307 | module extraKeySimHook() 308 | { 309 | 310 | } 311 | 312 | 313 | /* ####### screw hole config ######## */ 314 | /* set the screw holes to a good position. 315 | * if your keyboard is bigger, you can add some 316 | * more screw holes into the keyboard case and lid. 317 | */ 318 | screwHoleArray = [ 319 | [24,lkey-0.4], //left lower row 320 | [114,lkey-0.4], 321 | [170,lkey-0.4], 322 | [291.5,lkey-0.4], // right lower row 323 | 324 | [24,lkey*3+wallThickness-3], //left mid row 325 | [124,lkey*3+wallThickness-3], 326 | [162,lkey*3+wallThickness-3], 327 | [291,lkey*3+wallThickness-3], //right mid row 328 | 329 | [19,lkey*5+wallThickness-3], //left upper row 330 | [133,lkey*5+wallThickness-3], 331 | [171,lkey*5+wallThickness-3], 332 | [291,lkey*5+wallThickness-3], //right upper row 333 | ]; 334 | 335 | /* rotate screw hole spacers */ 336 | screwSpacerRotation=0; 337 | 338 | /* move horizontal case stabilizers inside the case. 339 | * to move horizontal by lkey/2 for half switch cutout. 340 | * this enables to set x.5 values in layout array. 341 | * else use 0!! 342 | */ 343 | caseStabMov=0; 344 | 345 | /* screw holes when enabling outer case frame */ 346 | frameScrewHoleArray = [ 347 | [-skirtX/2-innerCaseRadius/2,-skirtY/2-innerCaseRadius/2], //lower row 348 | [caseWidth/4,-skirtY/2-innerCaseRadius/2], 349 | [caseWidth/2-lkey,-skirtY/2-innerCaseRadius/2], 350 | [caseWidth/2+lkey,-skirtY/2-innerCaseRadius/2], //lower row 351 | [caseWidth-caseWidth/4,-skirtY/2-innerCaseRadius/2], 352 | [caseWidth+skirtX/2+innerCaseRadius/2,-skirtY/2-innerCaseRadius/2], 353 | 354 | [-skirtX/2-innerCaseRadius/2,lkey*1.5], //lower row 355 | [caseWidth+skirtX/2+innerCaseRadius/2,lkey*1.5], 356 | 357 | [-skirtX/2-innerCaseRadius/2,caseDepth-lkey*0.75], //lower row 358 | [caseWidth/2-lkey,caseDepth-lkey*0.75], 359 | [caseWidth/4,caseDepth-lkey*0.75], 360 | [caseWidth/2+lkey,caseDepth-lkey*0.75], //lower row 361 | [caseWidth-caseWidth/4,caseDepth-lkey*0.75], 362 | [caseWidth+skirtX/2+innerCaseRadius/2,caseDepth-lkey*0.75], 363 | 364 | [-skirtX/2-innerCaseRadius/2,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2], //lower row 365 | [caseWidth/4,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2], 366 | [caseWidth/2-lkey,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2], 367 | [caseWidth/2+lkey,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2], //lower row 368 | [caseWidth-caseWidth/4,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2], 369 | [caseWidth+skirtX/2+innerCaseRadius/2,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2] 370 | ]; 371 | 372 | 373 | 374 | 375 | /* set colors for simulation, set 0 for default OpenSCAD Gui Colors */ 376 | colorCaseTop="White"; 377 | colorCaseMid="DarkGray"; 378 | colorLid="Black"; 379 | colorRiserR="Black"; 380 | colorRiserL="Black"; 381 | 382 | frameColor="Black"; 383 | 384 | /* color simulation for switches 385 | select top and bottom color */ 386 | switchColorTop = "Ivory"; 387 | switchColorBottom = "Black"; 388 | 389 | /* simulate a keycap profile with number of fragments ($fn = setKeycapFragments) 390 | which will be set to key() call. 391 | KeyV2 currently (2022-06) does not support XDA. 392 | Use DSA as they look very similar 393 | NOTE: DSA is fixed to 3rd row as KeyV2 includes row number into calculation 394 | of DSA caps 395 | NOTE: currently not all profiles are working. OEM or DCS are always simulated! */ 396 | keycapProfile = "OEM"; // SA, DSA, DCS, G20, Hi-Pro, OEM 397 | setKeycapFragments = 100; 398 | 399 | /* ###################### BUILD_LINE ########################*/ 400 | /* ##########################################################*/ 401 | /* All calls after this line have to be ignored by the build script. 402 | * Do not place any calls above build line (or comment it) 403 | */ 404 | 405 | /* uncomment following line to get the keyboard simulation 406 | * with keycaps. set DoKeycapSimulation to true or false to add 407 | * or remove keycap simulation 408 | */ 409 | KeyboardSim(layout,doFrameSim=true,DoKeycapSimulation=true,xRotate=9.5); 410 | 411 | /* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */ 412 | /* ##### uncomment the keyboard part you want to print ##### */ 413 | /* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv */ 414 | 415 | /* ### complete keyboard model ### */ 416 | /* mainCase(layout); */ 417 | /* lid(); */ 418 | 419 | /* keycap frame functions. activate if skirt is enabled 420 | and you want a frame that hides the switches, which is 421 | a more classic look to none printed keyboards */ 422 | /* translate([0,0,13]) 423 | capFrame(layout); */ 424 | 425 | 426 | /* capFrameR(layout); */ 427 | 428 | /* capFrameL(layout); */ 429 | 430 | /* ### devided keyboard and lid model ### */ 431 | /* mainCaseLeft(layout); */ 432 | /* mainCaseRight(layout); */ 433 | 434 | /* lidL(); */ 435 | /* lidR(); */ 436 | 437 | /* keyboardRiser(); */ 438 | -------------------------------------------------------------------------------- /template_to_copy.scad: -------------------------------------------------------------------------------- 1 | /* template_to_copy.scad 2 | Author: andimoto@posteo.de 3 | ---------------------------- 4 | for placing assambled parts and 5 | single parts go to end of this file 6 | 7 | this file is a template which may be copied to create a new keyboard layout 8 | and to configure and place essential parts like usb cut out, screw holes or stabilizers 9 | 10 | this file includes KeyV2 files. see https://github.com/rsheldiii/KeyV2 11 | if you don't want this file to be included, just don't clone this library or 12 | set the 'DoKeycapSimulation' parameter of KeyboardSim() to false. 13 | */ 14 | 15 | /* ########## predefinitions ############ */ 16 | $fn=30; 17 | 18 | 19 | /* Thickness of entire plate which holds the switches. 20 | * this is the top of the keyboard 21 | */ 22 | plateThickness=3; 23 | /* thickness of the walls */ 24 | wallThickness=3; 25 | /* height of the case */ 26 | caseHeight=13; 27 | 28 | /* space between inner case stabilizers 29 | and the bottom/lip of the case */ 30 | innerCaseSpace = 5; 31 | 32 | //length, in units, of board 33 | width=16; 34 | //Height, in units, of board 35 | height=6; 36 | 37 | /* thickness of the lid. 38 | the function 'lid()' will add an 39 | extra mm to get a step for the lip 40 | see 'innerExtraLid' variable in constants */ 41 | lidThickness=3; 42 | 43 | 44 | /* ########## variables for cutting keyboard into smaller pieces ########## */ 45 | /* these are unit values; one unit is one key or switchhole 46 | * this makes the keyboard printable on nearly every printer. 47 | */ 48 | cutAfterUnits = 7.25; 49 | spacebarCut = 4.5; 50 | 51 | /* fRowSeparator [true/false] 52 | * Select separation of F-Row (or Row 0; key[0][1]=0) 53 | * This will move the upper row by a half unit (lkey*0.5) 54 | */ 55 | fRowSeparator=false; 56 | 57 | /* skirt selctor and skirt settings 58 | * select 'skirtSelect' as true to activate a additional skirt 59 | * around the keyboard case. The variables 'skirtX' & 'skirtY' 60 | * are configurable as you want the skirt. These values ADD the 61 | * configured amount to the side of the case. 62 | * Note: be careful here, this interacts with caseRadius 63 | * 64 | * If this is activated you can call 'capFrame()' 65 | * (or capFrameR/capFrameL) to create a nice frame 66 | * around the keycaps to cover the switches. This may give 67 | * a cleaner look if this is prefered. 68 | */ 69 | skirtSelect = false; 70 | skirtX = 5; 71 | skirtY = 5; 72 | 73 | /* enables screw holes in frame (if capFrame() is called) 74 | and in the case. The screws will be placed according to 75 | the array frameScrewHoleArray[] around the case and frame. 76 | */ 77 | frameScrewsEnable = false; 78 | 79 | /* edge radius of the case 80 | * Note: be careful here, this interacts with skirtX/Y 81 | * THIS IS ONLY VALID WHEN 'skirtSelect' IS TRUE 82 | */ 83 | caseRadius=10; 84 | 85 | 86 | /* ################## calculated vars #################### */ 87 | 88 | 89 | /* debug extra for avoiding artefacts @ compilation */ 90 | extra=1; 91 | 92 | 93 | /* add or reduce some tolerance for the switch holes. 94 | * depends on your printers resolution and if you want 95 | * narrow or loose fit of switches. do not configure to 96 | * narrow switch holes. when placing switches into the holes 97 | * they will pull the case apart and bend it. this will normally 98 | * be reduced by the lid, but do not overact this. 99 | */ 100 | switchHoleTolerance = -0.2; 101 | 102 | 103 | /* ############################################## */ 104 | /* ########## LAYOUT AND KEYCAP COLORS ########## */ 105 | /* ############################################## */ 106 | /* Usage: [[column place, row place],keycap unit, color for keycap simulation] */ 107 | /* "column place" is the place of the switch hole in the column; 108 | - example: Esc, F1, F2, F3, ... 109 | 0 1 2 3 ... 110 | "row place" is the place of the switch in the row; 111 | - example: Esc, accent, TAB, CapsLock, ... 112 | */ 113 | 114 | /* template_ansiUS_7583 */ 115 | layout = [ 116 | //start ROW 0 Function ROW 117 | [[ 0,0],1,"red"], //Esc 118 | [[ 1,0],1,"MintCream"], //F1 119 | [[ 2,0],1,"MintCream"], //F2 120 | [[ 3,0],1,"MintCream"], //F3 121 | [[ 4,0],1,"MintCream"], //F4 122 | [[ 5,0],1,"Gray"], //F5 123 | [[ 6,0],1,"Gray"], //F6 124 | [[ 7,0],1,"Gray"], //F7 125 | [[ 8,0],1,"Gray"], //F8 126 | [[ 9,0],1,"MintCream"], //F9 127 | [[10,0],1,"MintCream"], //F10 128 | [[11,0],1,"MintCream"], //F11 129 | [[12,0],1,"MintCream"], //F12 130 | [[13,0],1,"Gray"], //PrintScreen 131 | [[14,0],1,"Gray"], //PrintScreen 132 | [[15,0],1,"Gray"], // Del/Ins 133 | //start ROW 1 134 | [[ 0,1],1,"Gray"], //' 135 | [[ 1,1],1,"MintCream"], //1 136 | [[ 2,1],1,"MintCream"], //2 137 | [[ 3,1],1,"MintCream"], //3 138 | [[ 4,1],1,"MintCream"], //4 139 | [[ 5,1],1,"MintCream"], //5 140 | [[ 6,1],1,"MintCream"], //6 141 | [[ 7,1],1,"MintCream"], //7 142 | [[ 8,1],1,"MintCream"], //8 143 | [[ 9,1],1,"MintCream"], //9 144 | [[10,1],1,"MintCream"], //0 145 | [[11,1],1,"MintCream"], //-_ 146 | [[12,1],1,"MintCream"], //=+ 147 | [[13,1],2,"Gray"], //backspace 148 | [[15,1],1,"Gray"], //home 149 | //start ROW 2 150 | [[ 0,2],1.5,"Gray"], //TAB 151 | [[ 1.5,2],1,"MintCream"], //Q 152 | [[ 2.5,2],1,"MintCream"], //W 153 | [[ 3.5,2],1,"MintCream"], //E 154 | [[ 4.5,2],1,"MintCream"], //R 155 | [[ 5.5,2],1,"MintCream"], //T 156 | [[ 6.5,2],1,"MintCream"], //Y 157 | [[ 7.5,2],1,"MintCream"], //U 158 | [[ 8.5,2],1,"MintCream"], //I 159 | [[ 9.5,2],1,"MintCream"], //O 160 | [[10.5,2],1,"MintCream"], //P 161 | [[11.5,2],1,"MintCream"], //[ 162 | [[12.5,2],1,"MintCream"], //] 163 | [[13.5,2],1.5,"Gray"], // \ 164 | [[ 15,2],1,"Gray"], // PgUp 165 | //start ROW 3 166 | [[ 0,3],1.75,"Gray"], //CapsLock 167 | [[ 1.75,3],1,"MintCream"], //A 168 | [[ 2.75,3],1,"MintCream"], //S 169 | [[ 3.75,3],1,"MintCream"], //D 170 | [[ 4.75,3],1,"MintCream"], //F 171 | [[ 5.75,3],1,"MintCream"], //G 172 | [[ 6.75,3],1,"MintCream"], //H 173 | [[ 7.75,3],1,"MintCream"], //J 174 | [[ 8.75,3],1,"MintCream"], //K 175 | [[ 9.75,3],1,"MintCream"], //L 176 | [[10.75,3],1,"MintCream"], //; 177 | [[11.75,3],1,"MintCream"], //' 178 | [[12.75,3],2.25,"Aqua"], //ENTER 179 | [[ 15,3],1,"Gray"], //PgDn 180 | //start ROW 4 181 | [[ 0,4],2.25,"Gray"], //LShift 182 | [[ 2.25,4],1,"MintCream"], //Z 183 | [[ 3.25,4],1,"MintCream"], //X 184 | [[ 4.25,4],1,"MintCream"], //C 185 | [[ 5.25,4],1,"MintCream"], //V 186 | [[ 6.25,4],1,"MintCream"], //B 187 | [[ 7.25,4],1,"MintCream"], //N 188 | [[ 8.25,4],1,"MintCream"], //M 189 | [[ 9.25,4],1,"MintCream"], //, 190 | [[10.25,4],1,"MintCream"], //. 191 | [[11.25,4],1,"MintCream"], // / 192 | [[12.25,4],1.75,"Gray"], //RShift 193 | [[ 14,4],1,"Gray"], //UP 194 | [[ 15,4],1,"Gray"], //end 195 | //start ROW 5 196 | [[ 0,5],1.25,"Gray"], //LCTRL 197 | [[ 1.25,5],1.25,"Gray"], //TUX 198 | [[ 2.5 ,5],1.25,"Gray"], //ALT 199 | [[ 3.75,5],6.25,"MintCream"], //SPACE 200 | [[ 10 ,5],1.25,"Gray"], //COMP 201 | [[11.25,5],1.25,"Gray"], //Fn 202 | [[ 13,5],1,"Gray"], //LEFT 203 | [[ 14,5],1,"Gray"], //DOWN 204 | [[ 15,5],1,"Gray"], //RIGHT 205 | ]; 206 | 207 | /* enable placment of stabilizers on switchholes with x.5 unit in y direction 208 | * for example: true for numpad enter or numpad + 209 | * if you just want a single unit (1unit keycap) you can set this to false */ 210 | enableStabsOnHalfs = true; 211 | 212 | /* move pcb and usb cutout in x direction 213 | for better placement */ 214 | pcbShift=0; 215 | 216 | /* cutout for micro usb plug (not the housing of the usb plug!) 217 | * change this if using mini usb 218 | */ 219 | usbCutX=8; 220 | usbCutY=wallThickness; 221 | 222 | /* Arduino Pro Micro USB Port height */ 223 | usbCutZ=3.4; 224 | 225 | /* Teensy2 USB Port height */ 226 | /* usbCutZ=4.5; */ 227 | 228 | 229 | /* space in lid for placing the controller pcb. 230 | * this example is for arduino pro micro clones. 231 | * if you use teensy2.0 or something else configure 232 | * the size of the controller pcb you use. the function 233 | * 'pcbCutout()' will add 1mm to 'pcbWidth' for some clearance. 234 | * pcbLength should be as exactly as possible. this keeps the pcb 235 | * perfectly even if pcbWidth is to much 236 | */ 237 | /* teensy2 cutout */ 238 | pcbHeight = 1.8; 239 | pcbWidth = 18.5; 240 | pcbLength = 31.4; 241 | 242 | /* arduino pro micro cutout */ 243 | //pcbHeight = 2; 244 | //pcbWidth = 18; 245 | //pcbLength = 34;; 246 | 247 | /* set 'addRisers' to true or false 248 | * to calculate a lid with holes for risers 249 | * and add risers to simulation 250 | */ 251 | addRisers = true; 252 | 253 | /* keyboardRiser config 254 | * angleBaseX -> width of the riser 255 | * angleBaseY -> depth of the riser 256 | */ 257 | angleBaseY=90; 258 | angleBaseX=60; 259 | /* riser edge radius */ 260 | angleBaseRad=1; 261 | /* polygon; this is the shape of the riser */ 262 | riserPoints = [ 263 | [0,0], 264 | [angleBaseY,0], 265 | [angleBaseY,3], 266 | [0,18] 267 | ]; 268 | 269 | /* optional: move keyboard risers as needed */ 270 | xRiserR=0; 271 | xRiserL=0; 272 | yRiserAll=0; 273 | 274 | /* move connectors (round cylinders on top of risers) 275 | around. this is useful for layouts which have a narrow 276 | height, but still need risers */ 277 | riserConnectorRadius = 5; 278 | riserConnectorX = 0; 279 | riserConnectorY1 = 60; 280 | 281 | 282 | 283 | 284 | /* ####### include keyboard lib ############ */ 285 | include 286 | include 287 | 288 | /* this module gets called in 'holematrix' and adds a specific 289 | * object to the 'holematrix'. it enables placing switchholes 290 | * or other cutout objects to the model */ 291 | module extraCutoutHook() 292 | { 293 | } 294 | 295 | /* this module gets called in 'keycapMatrix()' and adds a specific 296 | * object to the keycapMatrix. keycapMatrix is needed as a cutout element 297 | * from the frame. this hook gives possibility to add more elements such 298 | * as the enter keycap. 299 | */ 300 | module extraKeycapCutoutHook() 301 | { 302 | } 303 | 304 | /* this module gets called in 'keySim()' and adds a specific 305 | * object to the 'key simulation'. it enables placing keys 306 | * or other objects to the model simulation */ 307 | module extraKeySimHook() 308 | { 309 | } 310 | 311 | 312 | /* ####### screw hole config ######## */ 313 | /* set the screw holes to a good position. 314 | * if your keyboard is bigger, you can add some 315 | * more screw holes into the keyboard case and lid. 316 | */ 317 | screwHoleArray = [ 318 | [24,lkey-3], //left lower row 319 | [114,lkey-3], 320 | [170,lkey-3], 321 | [285.5,lkey-3], // right lower row 322 | 323 | [24,lkey*3+wallThickness-2], //left mid row 324 | [124,lkey*3+wallThickness-2], 325 | [162,lkey*3+wallThickness-2], 326 | [285,lkey*3+wallThickness-2], //right mid row 327 | 328 | [19,lkey*5+wallThickness-2], //left upper row 329 | [133,lkey*5+wallThickness-2], 330 | [171,lkey*5+wallThickness-2], 331 | [285.5,lkey*5+wallThickness-2], //right upper row 332 | ]; 333 | 334 | /* rotate screw hole spacers */ 335 | screwSpacerRotation=0; 336 | 337 | /* move horizontal case stabilizers inside the case. 338 | * to move horizontal by lkey/2 for half switch cutout. 339 | * this enables to set x.5 values in layout array. 340 | * else use 0!! 341 | */ 342 | caseStabMov=0; 343 | 344 | /* screw holes when enabling outer case frame */ 345 | frameScrewHoleArray = [ 346 | [-skirtX/2-innerCaseRadius/2,-skirtY/2-innerCaseRadius/2], //lower row 347 | [caseWidth/4,-skirtY/2-innerCaseRadius/2], 348 | [caseWidth/2-lkey,-skirtY/2-innerCaseRadius/2], 349 | [caseWidth/2+lkey,-skirtY/2-innerCaseRadius/2], //lower row 350 | [caseWidth-caseWidth/4,-skirtY/2-innerCaseRadius/2], 351 | [caseWidth+skirtX/2+innerCaseRadius/2,-skirtY/2-innerCaseRadius/2], 352 | 353 | [-skirtX/2-innerCaseRadius/2,lkey*1.5], //lower row 354 | [caseWidth+skirtX/2+innerCaseRadius/2,lkey*1.5], 355 | 356 | [-skirtX/2-innerCaseRadius/2,caseDepth-lkey*0.75], //lower row 357 | [caseWidth/2-lkey,caseDepth-lkey*0.75], 358 | [caseWidth/4,caseDepth-lkey*0.75], 359 | [caseWidth/2+lkey,caseDepth-lkey*0.75], //lower row 360 | [caseWidth-caseWidth/4,caseDepth-lkey*0.75], 361 | [caseWidth+skirtX/2+innerCaseRadius/2,caseDepth-lkey*0.75], 362 | 363 | [-skirtX/2-innerCaseRadius/2,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2], //lower row 364 | [caseWidth/4,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2], 365 | [caseWidth/2-lkey,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2], 366 | [caseWidth/2+lkey,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2], //lower row 367 | [caseWidth-caseWidth/4,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2], 368 | [caseWidth+skirtX/2+innerCaseRadius/2,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2] 369 | ]; 370 | 371 | 372 | 373 | 374 | /* set colors for simulation, set 0 for default OpenSCAD Gui Colors */ 375 | colorCaseTop="White"; 376 | colorCaseMid="DarkGray"; 377 | colorLid="Black"; 378 | colorRiserR="Black"; 379 | colorRiserL="Black"; 380 | 381 | frameColor="Black"; 382 | 383 | /* color simulation for switches 384 | select top and bottom color */ 385 | switchColorTop = "Ivory"; 386 | switchColorBottom = "Black"; 387 | 388 | /* simulate a keycap profile with number of fragments ($fn = setKeycapFragments) 389 | which will be set to key() call. 390 | KeyV2 currently (2022-06) does not support XDA. 391 | Use DSA as they look very similar 392 | NOTE: DSA is fixed to 3rd row as KeyV2 includes row number into calculation 393 | of DSA caps 394 | NOTE: currently not all profiles are working. OEM or DCS are always simulated! */ 395 | keycapProfile = "SA"; // SA, DSA, DCS, G20, Hi-Pro, OEM 396 | setKeycapFragments = 50; 397 | 398 | /* ###################### BUILD_LINE ########################*/ 399 | /* ##########################################################*/ 400 | /* All calls after this line have to be ignored by the build script. 401 | * Do not place any calls above build line (or comment it) 402 | */ 403 | 404 | /* uncomment following line to get the keyboard simulation 405 | * with keycaps. set DoKeycapSimulation to true or false to add 406 | * or remove keycap simulation 407 | */ 408 | /* KeyboardSim(layout,doFrameSim=false,DoKeycapSimulation=false,xRotate=9.5); */ 409 | 410 | /* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */ 411 | /* ##### uncomment the keyboard part you want to print ##### */ 412 | /* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv */ 413 | 414 | /* ### complete keyboard model ### */ 415 | /* mainCase(layout); */ 416 | /* lid(); */ 417 | 418 | /* keycap frame functions. activate if skirt is enabled 419 | and you want a frame that hides the switches, which is 420 | a more classic look to none printed keyboards */ 421 | /* translate([0,0,13]) 422 | capFrame(layout); */ 423 | 424 | /* translate([0,0,13]) 425 | capFrameR(layout); */ 426 | 427 | /* translate([0,0,13]) 428 | capFrameL(layout); */ 429 | 430 | /* ### devided keyboard and lid model ### */ 431 | mainCaseLeft(layout); 432 | /* mainCaseRight(layout); */ 433 | 434 | /* lidL(); */ 435 | /* lidR(); */ 436 | 437 | /* keyboardRiser(); */ 438 | -------------------------------------------------------------------------------- /andimotoSmallTKLiso.scad: -------------------------------------------------------------------------------- 1 | /* andimoto_smallTKL_iso.scad 2 | Author: andimoto@posteo.de 3 | ---------------------------- 4 | for placing assambled parts and 5 | single parts go to end of this file 6 | 7 | this file contains the layout for my smallTKL with iso layout keyboard 3d model which can be devided 8 | to print on smaller printers 9 | 10 | this file includes KeyV2 files. see https://github.com/rsheldiii/KeyV2 11 | if you don't want this file to be included, just don't clone this library or 12 | set the 'DoKeycapSimulation' parameter of KeyboardSim() to false. 13 | */ 14 | 15 | /* ########## predefinitions ############ */ 16 | $fn=30; 17 | 18 | 19 | /* Thickness of entire plate which holds the switches. 20 | * this is the top of the keyboard 21 | */ 22 | plateThickness=3; 23 | /* thickness of the walls */ 24 | wallThickness=3; 25 | /* height of the case */ 26 | caseHeight=13; 27 | 28 | /* space between inner case stabilizers 29 | and the bottom/lip of the case */ 30 | innerCaseSpace = 5; 31 | 32 | //length, in units, of board 33 | width=17.25; 34 | //Height, in units, of board 35 | height=6; 36 | 37 | /* thickness of the lid. 38 | the function 'lid()' will add an 39 | extra mm to get a step for the lip 40 | see 'innerExtraLid' variable in constants */ 41 | lidThickness=3; 42 | 43 | 44 | /* ########## variables for cutting keyboard into smaller pieces ########## */ 45 | /* these are unit values; one unit is one key or switchhole 46 | * this makes the keyboard printable on nearly every printer. 47 | */ 48 | cutAfterUnits = 8; 49 | spacebarCut = 4.5; 50 | 51 | 52 | /* fRowSeparator [true/false] 53 | * Select separation of F-Row (or Row 0; key[0][1]=0) 54 | * This will move the upper row by a half unit (lkey*0.5) 55 | */ 56 | fRowSeparator=true; 57 | 58 | /* skirt selctor and skirt settings 59 | * select 'skirtSelect' as true to activate a additional skirt 60 | * around the keyboard case. The variables 'skirtX' & 'skirtY' 61 | * are configurable as you want the skirt. These values ADD the 62 | * configured amount to the side of the case. 63 | * Note: be careful here, this interacts with caseRadius 64 | * 65 | * If this is activated you can call 'capFrame()' 66 | * (or capFrameR/capFrameL) to create a nice frame 67 | * around the keycaps to cover the switches. This may give 68 | * a cleaner look if this is prefered. 69 | */ 70 | skirtSelect = false; 71 | skirtX = 0; 72 | skirtY = 0; 73 | 74 | /* enables screw holes in frame (if capFrame() is called) 75 | and in the case. The screws will be placed according to 76 | the array frameScrewHoleArray[] around the case and frame. 77 | */ 78 | frameScrewsEnable = false; 79 | 80 | /* edge radius of the case 81 | * Note: be careful here, this interacts with skirtX/Y 82 | * THIS IS ONLY VALID WHEN 'skirtSelect' IS TRUE 83 | */ 84 | caseRadius=1; 85 | 86 | 87 | /* ################## calculated vars #################### */ 88 | 89 | 90 | /* debug extra for avoiding artefacts @ compilation */ 91 | extra=1; 92 | 93 | 94 | /* add or reduce some tolerance for the switch holes. 95 | * depends on your printers resolution and if you want 96 | * narrow or loose fit of switches. do not configure to 97 | * narrow switch holes. when placing switches into the holes 98 | * they will pull the case apart and bend it. this will normally 99 | * be reduced by the lid, but do not overact this. 100 | */ 101 | switchHoleTolerance = -0.2; 102 | 103 | 104 | /* ############################################## */ 105 | /* ########## LAYOUT AND KEYCAP COLORS ########## */ 106 | /* ############################################## */ 107 | /* Usage: [[column place, row place],keycap unit, color for keycap simulation] */ 108 | /* "column place" is the place of the switch hole in the column; 109 | - example: Esc, F1, F2, F3, ... 110 | 0 1 2 3 ... 111 | "row place" is the place of the switch in the row; 112 | - example: Esc, accent, TAB, CapsLock, ... 113 | */ 114 | 115 | /* place extra keys here which are not aligned 116 | * with usual switchhole unit */ 117 | isoEnter = [ 118 | [[13.5,2.5],1.5,"Red"] // ENTER 119 | ]; 120 | 121 | /* smallTKL_isoDE */ 122 | layout = [ 123 | //start ROW 0 Function ROW 124 | [[0,0],1,"Red"], //Esc 125 | [[2,0],1,"LightSkyBlue"], //F1 126 | [[3,0],1,"LightSkyBlue"], //F2 127 | [[4,0],1,"LightSkyBlue"], //F3 128 | [[5,0],1,"LightSkyBlue"], //F4 129 | [[6.5,0],1,"MidnightBlue"], //F5 130 | [[7.5,0],1,"MidnightBlue"], //F6 131 | [[8.5,0],1,"MidnightBlue"], //F7 132 | [[9.5,0],1,"MidnightBlue"], //F8 133 | [[11,0],1,"LightSkyBlue"], //F9 134 | [[12,0],1,"LightSkyBlue"], //F10 135 | [[13,0],1,"LightSkyBlue"], //F11 136 | [[14,0],1,"LightSkyBlue"], //F12 137 | [[15.25,0],1,"MidnightBlue"], //PrintScreen 138 | [[16.25,0],1,"MidnightBlue"], //Pause 139 | 140 | //start ROW 1 141 | [[0,1],1,"LightSkyBlue"], //' 142 | [[1,1],1,"LightSkyBlue"], //1 143 | [[2,1],1,"LightSkyBlue"], //2 144 | [[3,1],1,"LightSkyBlue"], //3 145 | [[4,1],1,"LightSkyBlue"], //4 146 | [[5,1],1,"LightSkyBlue"], //5 147 | [[6,1],1,"LightSkyBlue"], //6 148 | [[7,1],1,"LightSkyBlue"], //7 149 | [[8,1],1,"LightSkyBlue"], //8 150 | [[9,1],1,"LightSkyBlue"], //9 151 | [[10,1],1,"LightSkyBlue"], //0 152 | [[11,1],1,"LightSkyBlue"], //-_ 153 | [[12,1],1,"LightSkyBlue"], //=+ 154 | [[13,1],2,"MidnightBlue"], //backspace 155 | [[15.25,1],1,"MidnightBlue"], //ins 156 | [[16.25,1],1,"MidnightBlue"], //pos1 157 | //start ROW 2 158 | [[ 0,2],1.5,"MidnightBlue"], //TAB 159 | [[1.5,2],1,"LightSkyBlue"], //Q 160 | [[2.5,2],1,"LightSkyBlue"], //W 161 | [[3.5,2],1,"LightSkyBlue"], //E 162 | [[4.5,2],1,"LightSkyBlue"], //R 163 | [[5.5,2],1,"LightSkyBlue"], //T 164 | [[6.5,2],1,"LightSkyBlue"], //Y 165 | [[7.5,2],1,"LightSkyBlue"], //U 166 | [[8.5,2],1,"LightSkyBlue"], //I 167 | [[9.5,2],1,"LightSkyBlue"], //O 168 | [[10.5,2],1,"LightSkyBlue"], //P 169 | [[11.5,2],1,"LightSkyBlue"], //[ 170 | [[12.5,2],1,"LightSkyBlue"], //] 171 | /* [[13.5,2.5],1.5,"Red"], // ENTER */ 172 | [[15.25,2],1,"MidnightBlue"], // del 173 | [[16.25,2],1,"MidnightBlue"], // end 174 | //start ROW 3 175 | [[ 0,3],1.75,"MidnightBlue"], //CapsLock 176 | [[1.75,3],1,"LightSkyBlue"], //A 177 | [[2.75,3],1,"LightSkyBlue"], //S 178 | [[3.75,3],1,"LightSkyBlue"], //D 179 | [[4.75,3],1,"LightSkyBlue"], //F 180 | [[5.75,3],1,"LightSkyBlue"], //G 181 | [[6.75,3],1,"LightSkyBlue"], //H 182 | [[7.75,3],1,"LightSkyBlue"], //J 183 | [[8.75,3],1,"LightSkyBlue"], //K 184 | [[9.75,3],1,"LightSkyBlue"], //L 185 | [[10.75,3],1,"LightSkyBlue"], //; 186 | [[11.75,3],1,"LightSkyBlue"], //' 187 | [[12.75,3],1,"LightSkyBlue"], //# 188 | //start ROW 4 189 | [[ 0,4],1.25,"MidnightBlue"], //LShift 190 | [[1.25,4],1,"LightSkyBlue"], // / 191 | [[2.25,4],1,"LightSkyBlue"], //Z 192 | [[3.25,4],1,"LightSkyBlue"], //X 193 | [[4.25,4],1,"LightSkyBlue"], //C 194 | [[5.25,4],1,"LightSkyBlue"], //V 195 | [[6.25,4],1,"LightSkyBlue"], //B 196 | [[7.25,4],1,"LightSkyBlue"], //N 197 | [[8.25,4],1,"LightSkyBlue"], //M 198 | [[9.25,4],1,"LightSkyBlue"], //, 199 | [[10.25,4],1,"LightSkyBlue"], //. 200 | [[11.25,4],1,"LightSkyBlue"], // / 201 | [[12.25,4],2.75,"MidnightBlue"], //RShift 202 | [[15.25,4],1,"MidnightBlue"], //UP 203 | //start ROW 5 204 | [[ 0,5],1.25,"MidnightBlue"], //LCTRL 205 | [[1.25,5],1.25,"MidnightBlue"], //TUX 206 | [[2.5 ,5],1.25,"MidnightBlue"], //ALT 207 | [[3.75,5],6.25,"LightSkyBlue"], //SPACE 208 | [[10 ,5],1.25,"MidnightBlue"], //COMP 209 | [[11.25,5],1.25,"MidnightBlue"], //Fn 210 | [[12.5 ,5],1.25,"MidnightBlue"], //RCTRL 211 | [[14.25,5],1,"MidnightBlue"], //LEFT 212 | [[15.25,5],1,"MidnightBlue"], //DOWN 213 | [[16.25,5],1,"MidnightBlue"], //RIGHT 214 | ]; 215 | 216 | /* enable placment of stabilizers on switchholes with x.5 unit in y direction 217 | * for example: true for numpad enter or numpad + 218 | * if you just want a single unit (1unit keycap) you can set this to false */ 219 | enableStabsOnHalfs = true; 220 | 221 | /* move pcb and usb cutout in x direction 222 | for better placement */ 223 | pcbShift=6; 224 | 225 | /* cutout for micro usb plug (not the housing of the usb plug!) 226 | * change this if using mini usb 227 | */ 228 | usbCutX=8; 229 | usbCutY=wallThickness; 230 | 231 | /* Arduino Pro Micro USB Port height */ 232 | /* usbCutZ=3.4; */ 233 | 234 | /* Teensy2 USB Port height */ 235 | usbCutZ=4.5; 236 | 237 | /* space in lid for placing the controller pcb. 238 | * this example is for arduino pro micro clones. 239 | * if you use teensy2.0 or something else configure 240 | * the size of the controller pcb you use. the function 241 | * 'pcbCutout()' will add 1mm to 'pcbWidth' for some clearance. 242 | * pcbLength should be as exactly as possible. this keeps the pcb 243 | * perfectly even if pcbWidth is to much 244 | */ 245 | /* teensy2 cutout */ 246 | pcbHeight = 1.8; 247 | pcbWidth = 18.5; 248 | pcbLength = 31.4; 249 | 250 | /* arduino pro micro cutout */ 251 | /* pcbHeight = 2; 252 | pcbWidth = 18; 253 | pcbLength = 34; */ 254 | 255 | 256 | /* set 'addRisers' to true or false 257 | * to calculate a lid with holes for risers 258 | * and add risers to simulation 259 | */ 260 | addRisers = true; 261 | 262 | /* keyboardRiser config 263 | * angleBaseX -> width of the riser 264 | * angleBaseY -> depth of the riser 265 | */ 266 | angleBaseY=100; 267 | angleBaseX=60; 268 | /* riser edge radius */ 269 | angleBaseRad=1; 270 | /* polygon; this is the shape of the riser */ 271 | riserPoints = [ 272 | [0,0], 273 | [angleBaseY,0], 274 | [angleBaseY,3], 275 | [0,16] 276 | ]; 277 | 278 | /* optional: move keyboard risers as needed 279 | this moves the whole risers */ 280 | xRiserR=0; 281 | xRiserL=0; 282 | yRiserAll=0; 283 | 284 | /* move connectors (round cylinders on top of risers) 285 | around. this is useful for layouts which have a narrow 286 | height, but still need risers */ 287 | riserConnectorRadius = 5; 288 | riserConnectorX = 0; 289 | riserConnectorY1 = 60; 290 | 291 | 292 | 293 | 294 | /* ####### include keyboard lib ############ */ 295 | include 296 | include 297 | 298 | /* this module gets called in 'holematrix' and adds a specific 299 | * object to the 'holematrix'. it enables placing switchholes 300 | * or other cutout objects to the model */ 301 | module extraCutoutHook() 302 | { 303 | /* custom: place isoEnter switchhole here */ 304 | for(key = isoEnter) 305 | { 306 | startx = 0; 307 | starty = caseDepth - lkey; 308 | zCase = tempHeigth; 309 | 310 | /* check for iso Enter key; should be the last row minus 3.5 311 | iso enter key belongs to the 2nd row at layout with F-Keys, or 1st 312 | row without F Keys */ 313 | /* iso enter needs a move of about 2mm into right direction */ 314 | translate([startx+lkey*key[0][0], starty-lkey*key[0][1], zCase-extra]) 315 | translate([(lkey*key[1]-holesize)/2 + 2.8,(lkey - holesize)/2, 0]) 316 | switchhole(); 317 | 318 | /* iso enter and other stabilizers than spacebar */ 319 | /* needed to add some extra mm to the costarStabilizer cutouts 320 | but different extra for each stabilizer */ 321 | translate([19.7,-5,0]) 322 | translate([startx+lkey*key[0][0], starty-lkey*key[0][1], zCase-extra]) 323 | translate([(lkey*key[1]-holesize)/2+(holesize/2)-shortStabX/2 + 2.5,(lkey - holesize)/2+costarStabYdelta+0.5, 0]) 324 | rotate([0,0,90]) costarStabilizer(); 325 | 326 | translate([-4.7,20,0]) 327 | translate([startx+lkey*key[0][0], starty-lkey*key[0][1], zCase-extra]) 328 | translate([(lkey*key[1]+holesize)/2-(holesize/2)+shortStabX/2 + 2.8,(lkey - holesize)/2+costarStabYdelta-0.5, 0]) 329 | rotate([0,0,90]) costarStabilizer(); 330 | } 331 | } 332 | 333 | /* this module gets called in 'keycapMatrix()' and adds a specific 334 | * object to the keycapMatrix. keycapMatrix is needed as a cutout element 335 | * from the frame. this hook gives possibility to add more elements such 336 | * as the enter keycap. 337 | */ 338 | module extraKeycapCutoutHook() 339 | { 340 | } 341 | 342 | /* this module gets called in 'keySim()' and adds a specific 343 | * object to the 'key simulation'. it enables placing keys 344 | * or other objects to the model simulation */ 345 | module extraKeySimHook() 346 | { 347 | startx = 0; 348 | starty = caseDepth - lkey; 349 | zCase = tempHeigth; 350 | 351 | for(key = isoEnter) 352 | { 353 | color(key[2]) 354 | translate([startx+lkey*key[0][0], starty-lkey*key[0][1], 0]) 355 | translate([(lkey*key[1]-holesize)/2+2,(lkey - holesize)/2, 0]) 356 | sa_row(key[0][1]) iso_enter() key(true); 357 | } 358 | } 359 | 360 | 361 | /* ####### screw hole config ######## */ 362 | /* set the screw holes to a good position. 363 | * if your keyboard is bigger, you can add some 364 | * more screw holes into the keyboard case and lid. 365 | */ 366 | screwHoleArray = [ 367 | [23,lkey-0.4], //left lower row 368 | [144,lkey-0.4], 369 | [186,lkey-0.4], 370 | [310,lkey-0.4], // right lower row 371 | 372 | [25,lkey*3+wallThickness-3], //left mid row 373 | [144,lkey*3+wallThickness-3], 374 | [186,lkey*3+wallThickness-3], 375 | [310,lkey*3+wallThickness-3], //right mid row 376 | 377 | [20,lkey*5+wallThickness-3], //left upper row 378 | [144,lkey*5+wallThickness-3], 379 | [186,lkey*5+wallThickness-3], 380 | [310,lkey*5+wallThickness-3], //right upper row 381 | ]; 382 | 383 | /* rotate screw hole spacers */ 384 | screwSpacerRotation=0; 385 | 386 | /* move horizontal case stabilizers inside the case. 387 | * to move horizontal by lkey/2 for half switch cutout. 388 | * this enables to set x.5 values in layout array. 389 | * else use 0!! 390 | */ 391 | caseStabMov=0; 392 | 393 | /* screw holes when enabling outer case frame */ 394 | frameScrewHoleArray = [ 395 | [-skirtX/2-innerCaseRadius/2,-skirtY/2-innerCaseRadius/2], //lower row 396 | [caseWidth/4,-skirtY/2-innerCaseRadius/2], 397 | [caseWidth/2-lkey,-skirtY/2-innerCaseRadius/2], 398 | [caseWidth/2+lkey,-skirtY/2-innerCaseRadius/2], //lower row 399 | [caseWidth-caseWidth/4,-skirtY/2-innerCaseRadius/2], 400 | [caseWidth+skirtX/2+innerCaseRadius/2,-skirtY/2-innerCaseRadius/2], 401 | 402 | [-skirtX/2-innerCaseRadius/2,lkey*1.5], //lower row 403 | [caseWidth+skirtX/2+innerCaseRadius/2,lkey*1.5], 404 | 405 | [-skirtX/2-innerCaseRadius/2,caseDepth-lkey*0.75], //lower row 406 | [caseWidth/2-lkey,caseDepth-lkey*0.75], 407 | [caseWidth/4,caseDepth-lkey*0.75], 408 | [caseWidth/2+lkey,caseDepth-lkey*0.75], //lower row 409 | [caseWidth-caseWidth/4,caseDepth-lkey*0.75], 410 | [caseWidth+skirtX/2+innerCaseRadius/2,caseDepth-lkey*0.75], 411 | 412 | [-skirtX/2-innerCaseRadius/2,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2], //lower row 413 | [caseWidth/4,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2], 414 | [caseWidth/2-lkey,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2], 415 | [caseWidth/2+lkey,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2], //lower row 416 | [caseWidth-caseWidth/4,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2], 417 | [caseWidth+skirtX/2+innerCaseRadius/2,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2] 418 | ]; 419 | 420 | 421 | 422 | 423 | /* set colors for simulation, set 0 for default OpenSCAD Gui Colors */ 424 | colorCaseTop="White"; 425 | colorCaseMid="DarkGray"; 426 | colorLid="Black"; 427 | colorRiserR="Black"; 428 | colorRiserL="Black"; 429 | 430 | frameColor="Black"; 431 | 432 | /* color simulation for switches 433 | select top and bottom color */ 434 | switchColorTop = "Ivory"; 435 | switchColorBottom = "Black"; 436 | 437 | /* simulate a keycap profile with number of fragments ($fn = setKeycapFragments) 438 | which will be set to key() call. 439 | KeyV2 currently (2022-06) does not support XDA. 440 | Use DSA as they look very similar 441 | NOTE: DSA is fixed to 3rd row as KeyV2 includes row number into calculation 442 | of DSA caps 443 | NOTE: currently not all profiles are working. OEM or DCS are always simulated! */ 444 | keycapProfile = "SA"; // SA, DSA, DCS, G20, Hi-Pro, OEM 445 | setKeycapFragments = 50; 446 | 447 | /* ###################### BUILD_LINE ########################*/ 448 | /* ##########################################################*/ 449 | /* All calls after this line have to be ignored by the build script. 450 | * Do not place any calls above build line (or comment it) 451 | */ 452 | 453 | /* uncomment following line to get the keyboard simulation 454 | * with keycaps. set DoKeycapSimulation to true or false to add 455 | * or remove keycap simulation 456 | */ 457 | /* KeyboardSim(layout,doFrameSim=false,DoKeycapSimulation=false,xRotate=9.5); */ 458 | 459 | /* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */ 460 | /* ##### uncomment the keyboard part you want to print ##### */ 461 | /* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv */ 462 | 463 | /* ### complete keyboard model ### */ 464 | /* mainCase(layout); */ 465 | /* lid(); */ 466 | 467 | /* keycap frame functions. activate if skirt is enabled 468 | and you want a frame that hides the switches, which is 469 | a more classic look to none printed keyboards */ 470 | /* translate([0,0,13]) 471 | capFrame(layout); */ 472 | 473 | /* translate([0,0,13]) 474 | capFrameR(layout); */ 475 | 476 | /* translate([0,0,13]) 477 | capFrameL(layout); */ 478 | 479 | /* ### devided keyboard and lid model ### */ 480 | /* mainCaseLeft(layout); */ 481 | mainCaseRight(layout); 482 | 483 | /* lidR(); */ 484 | /* lidL(); */ 485 | 486 | /* keyboardRiser(); */ 487 | -------------------------------------------------------------------------------- /andimoto75Q1-iso.scad: -------------------------------------------------------------------------------- 1 | /* andimoto75Q1-iso.scad 2 | Author: andimoto@posteo.de 3 | ---------------------------- 4 | for placing assambled parts and 5 | single parts go to end of this file 6 | 7 | this file contains the layout for my 7583 keyboard 3d model which can be devided 8 | to print on smaller printers 9 | 10 | this file includes KeyV2 files. see https://github.com/rsheldiii/KeyV2 11 | if you don't want this file to be included, just don't clone this library or 12 | set the 'DoKeycapSimulation' parameter of KeyboardSim() to false. 13 | */ 14 | 15 | /* ########## predefinitions ############ */ 16 | $fn=30; 17 | 18 | 19 | /* Thickness of entire plate which holds the switches. 20 | * this is the top of the keyboard 21 | */ 22 | plateThickness=3; 23 | /* thickness of the walls */ 24 | wallThickness=3; 25 | /* height of the case */ 26 | caseHeight=13; 27 | 28 | /* space between inner case stabilizers (no costar stabs) 29 | and the bottom/lip of the case */ 30 | innerCaseSpace = 5; 31 | 32 | //length, in units, of board 33 | width=16.25; 34 | //Height, in units, of board 35 | height=6; 36 | 37 | /* thickness of the lid. 38 | the function 'lid()' will add an 39 | extra mm to get a step for the lip 40 | see 'innerExtraLid' variable in constants */ 41 | lidThickness=3; 42 | 43 | 44 | /* ########## variables for cutting keyboard into smaller pieces ########## */ 45 | /* these are unit values; one unit is one key or switchhole 46 | * this makes the keyboard printable on nearly every printer. 47 | */ 48 | cutAfterUnits = 7.25; 49 | spacebarCut = 4.5; 50 | 51 | /* fRowSeparator [true/false] 52 | * Select separation of F-Row (or Row 0; key[0][1]=0) 53 | * This will move the upper row by a half unit (lkey*0.5) 54 | */ 55 | fRowSeparator=true; 56 | 57 | /* skirt selctor and skirt settings 58 | * select 'skirtSelect' as true to activate a additional skirt 59 | * around the keyboard case. The variables 'skirtX' & 'skirtY' 60 | * are configurable as you want the skirt. These values ADD the 61 | * configured amount to the side of the case. 62 | * Note: be careful here, this interacts with caseRadius 63 | * 64 | * If this is activated you can call 'capFrame()' 65 | * (or capFrameR/capFrameL) to create a nice frame 66 | * around the keycaps to cover the switches. This may give 67 | * a cleaner look if this is prefered. 68 | */ 69 | skirtSelect = true; 70 | skirtX = 7; 71 | skirtY = 7; 72 | 73 | /* enables screw holes in frame (if capFrame() is called) 74 | and in the case. The screws will be placed according to 75 | the array frameScrewHoleArray[] around the case and frame. 76 | */ 77 | frameScrewsEnable = true; 78 | 79 | /* edge radius of the case 80 | * Note: be careful here, this interacts with skirtX/Y 81 | * THIS IS ONLY VALID WHEN 'skirtSelect' IS TRUE 82 | */ 83 | caseRadius=3; 84 | 85 | 86 | /* ################## calculated vars #################### */ 87 | 88 | 89 | /* debug extra for avoiding artefacts @ compilation */ 90 | extra=1; 91 | 92 | 93 | /* add or reduce some tolerance for the switch holes. 94 | * depends on your printers resolution and if you want 95 | * narrow or loose fit of switches. do not configure to 96 | * narrow switch holes. when placing switches into the holes 97 | * they will pull the case apart and bend it. this will normally 98 | * be reduced by the lid, but do not overact this. 99 | */ 100 | switchHoleTolerance = -0.2; 101 | 102 | 103 | /* ############################################## */ 104 | /* ########## LAYOUT AND KEYCAP COLORS ########## */ 105 | /* ############################################## */ 106 | /* Usage: [[column place, row place],keycap unit, color for keycap simulation] */ 107 | /* "column place" is the place of the switch hole in the column; 108 | - example: Esc, F1, F2, F3, ... 109 | 0 1 2 3 ... 110 | "row place" is the place of the switch in the row; 111 | - example: Esc, accent, TAB, CapsLock, ... 112 | */ 113 | isoEnter = [ 114 | [[13.5,2.5],1.5,"#5883AC"] // ENTER 115 | ]; 116 | 117 | /* iso_75Q1 */ 118 | layout = [ 119 | //start ROW 0 Function ROW 120 | [[0,0],1,"Red"], //Esc 121 | [[1.25,0],1,"GhostWhite"], //F1 122 | [[2.25,0],1,"GhostWhite"], //F2 123 | [[3.25,0],1,"GhostWhite"], //F3 124 | [[4.25,0],1,"GhostWhite"], //F4 125 | [[5.5,0],1,"#5883AC"], //F5 126 | [[6.5,0],1,"#5883AC"], //F6 127 | [[7.5,0],1,"#5883AC"], //F7 128 | [[8.5,0],1,"#5883AC"], //F8 129 | [[9.75,0],1,"GhostWhite"], //F9 130 | [[10.75,0],1,"GhostWhite"], //F10 131 | [[11.75,0],1,"GhostWhite"], //F11 132 | [[12.75,0],1,"GhostWhite"], //F12 133 | [[14,0],1,"#5883AC"], //ins 134 | [[15.25,0],1,"#5883AC"], // Del 135 | //start ROW 1 136 | [[ 0,1],1,"#5883AC"], //^ 137 | [[1,1],1,"GhostWhite"], //1 138 | [[2,1],1,"GhostWhite"], //2 139 | [[3,1],1,"GhostWhite"], //3 140 | [[4,1],1,"GhostWhite"], //4 141 | [[5,1],1,"GhostWhite"], //5 142 | [[6,1],1,"GhostWhite"], //6 143 | [[7,1],1,"GhostWhite"], //7 144 | [[8,1],1,"GhostWhite"], //8 145 | [[9,1],1,"GhostWhite"], //9 146 | [[10,1],1,"GhostWhite"], //0 147 | [[11,1],1,"GhostWhite"], //ß 148 | [[12,1],1,"GhostWhite"], //` 149 | [[13,1],2,"#5883AC"], //backspace 150 | [[15.25,1],1,"#5883AC"], //PgUp 151 | //start ROW 2 152 | [[ 0,2],1.5,"#5883AC"], //TAB 153 | [[1.5,2],1,"GhostWhite"], //Q 154 | [[2.5,2],1,"GhostWhite"], //W 155 | [[3.5,2],1,"GhostWhite"], //E 156 | [[4.5,2],1,"GhostWhite"], //R 157 | [[5.5,2],1,"GhostWhite"], //T 158 | [[6.5,2],1,"GhostWhite"], //Y 159 | [[7.5,2],1,"GhostWhite"], //U 160 | [[8.5,2],1,"GhostWhite"], //I 161 | [[9.5,2],1,"GhostWhite"], //O 162 | [[10.5,2],1,"GhostWhite"], //P 163 | [[11.5,2],1,"GhostWhite"], //Ü 164 | [[12.5,2],1,"GhostWhite"], //+ 165 | [[15.25,2],1,"#5883AC"], // PgDn 166 | //start ROW 3 167 | [[ 0,3],1.75,"#5883AC"], //CapsLock 168 | [[1.75,3],1,"GhostWhite"], //A 169 | [[2.75,3],1,"GhostWhite"], //S 170 | [[3.75,3],1,"GhostWhite"], //D 171 | [[4.75,3],1,"GhostWhite"], //F 172 | [[5.75,3],1,"GhostWhite"], //G 173 | [[6.75,3],1,"GhostWhite"], //H 174 | [[7.75,3],1,"GhostWhite"], //J 175 | [[8.75,3],1,"GhostWhite"], //K 176 | [[9.75,3],1,"GhostWhite"], //L 177 | [[10.75,3],1,"GhostWhite"], //Ö 178 | [[11.75,3],1,"GhostWhite"], //Ä 179 | [[12.75,3],1,"GhostWhite"], //# 180 | //ENTER 181 | [[15.25,3],1,"#5883AC"], //Home 182 | //start ROW 4 183 | [[ 0,4],1.25,"#5883AC"], //LShift 184 | [[1.25,4],1,"#5883AC"], // / 185 | [[2.25,4],1,"GhostWhite"], //Z 186 | [[3.25,4],1,"GhostWhite"], //X 187 | [[4.25,4],1,"GhostWhite"], //C 188 | [[5.25,4],1,"GhostWhite"], //V 189 | [[6.25,4],1,"GhostWhite"], //B 190 | [[7.25,4],1,"GhostWhite"], //N 191 | [[8.25,4],1,"GhostWhite"], //M 192 | [[9.25,4],1,"GhostWhite"], //, 193 | [[10.25,4],1,"GhostWhite"], //. 194 | [[11.25,4],1,"GhostWhite"], // - 195 | [[12.25,4],1.75,"#5883AC"], //RShift 196 | [[14.25,4.25],1,"#5883AC"], //UP 197 | //[[15,4],1,"#5883AC"], //end 198 | //start ROW 5 199 | [[ 0,5],1.25,"#5883AC"], //LCTRL 200 | [[1.25,5],1.25,"#5883AC"], //TUX 201 | [[2.5 ,5],1.25,"#5883AC"], //ALT 202 | [[3.75,5],6.25,"GhostWhite"], //SPACE 203 | [[10 ,5],1,"#5883AC"], //AltGr/Compose 204 | [[11,5],1,"#5883AC"], //Fn 205 | [[12,5],1,"#5883AC"], //Strg 206 | [[13.25,5.25],1,"#5883AC"], //LEFT 207 | [[14.25,5.25],1,"#5883AC"], //DOWN 208 | [[15.25,5.25],1,"#5883AC"], //RIGHT 209 | ]; 210 | 211 | /* enable placment of stabilizers on switchholes with x.5 unit in y direction 212 | * for example: true for numpad enter or numpad + 213 | * if you just want a single unit (1unit keycap) you can set this to false */ 214 | enableStabsOnHalfs = true; 215 | 216 | /* move pcb and usb cutout in x direction 217 | for better placement */ 218 | pcbShift=0; 219 | 220 | /* cutout for micro usb plug (not the housing of the usb plug!) 221 | * change this if using mini usb 222 | */ 223 | usbCutX=8; 224 | usbCutY=wallThickness; 225 | 226 | /* Arduino Pro Micro USB Port height */ 227 | /* usbCutZ=3.4; */ 228 | 229 | /* Teensy2 USB Port height */ 230 | usbCutZ=4.5; 231 | 232 | /* space in lid for placing the controller pcb. 233 | * this example is for arduino pro micro clones. 234 | * if you use teensy2.0 or something else configure 235 | * the size of the controller pcb you use. the function 236 | * 'pcbCutout()' will add 1mm to 'pcbWidth' for some clearance. 237 | * pcbLength should be as exactly as possible. this keeps the pcb 238 | * perfectly even if pcbWidth is to much 239 | */ 240 | /* teensy2 cutout */ 241 | pcbHeight = 1.8; 242 | pcbWidth = 18.5; 243 | pcbLength = 31.4; 244 | 245 | /* arduino pro micro cutout */ 246 | /* pcbHeight = 2; 247 | pcbWidth = 18; 248 | pcbLength = 34; */ 249 | 250 | 251 | /* set 'addRisers' to true or false 252 | * to calculate a lid with holes for risers 253 | * and add risers to simulation 254 | */ 255 | addRisers = true; 256 | 257 | /* keyboardRiser config 258 | * angleBaseX -> width of the riser 259 | * angleBaseY -> depth of the riser 260 | */ 261 | angleBaseY=90; 262 | angleBaseX=60; 263 | /* riser edge radius */ 264 | angleBaseRad=1; 265 | /* polygon; this is the shape of the riser */ 266 | riserPoints = [ 267 | [0,0], 268 | [angleBaseY,0], 269 | [angleBaseY,2], 270 | [0,17] 271 | ]; 272 | 273 | /* optional: move keyboard risers as needed */ 274 | xRiserR=0; 275 | xRiserL=0; 276 | yRiserAll=0; 277 | 278 | /* move connectors (round cylinders on top of risers) 279 | around. this is useful for layouts which have a narrow 280 | height, but still need risers */ 281 | riserConnectorRadius = 5; 282 | riserConnectorX = 0; 283 | riserConnectorY1 = 60; 284 | 285 | 286 | 287 | 288 | /* ####### include keyboard lib ############ */ 289 | include 290 | include 291 | 292 | /* this module gets called in 'holematrix' and adds a specific 293 | * object to the 'holematrix'. it enables placing switchholes 294 | * or other cutout objects to the model */ 295 | module extraCutoutHook() 296 | { 297 | /* custom: place isoEnter switchhole here */ 298 | for(key = isoEnter) 299 | { 300 | startx = 0; 301 | starty = caseDepth - lkey; 302 | zCase = tempHeigth; 303 | 304 | /* check for iso Enter key; should be the last row minus 3.5 305 | iso enter key belongs to the 2nd row at layout with F-Keys, or 1st 306 | row without F Keys */ 307 | /* iso enter needs a move of about 2mm into right direction */ 308 | translate([startx+lkey*key[0][0], starty-lkey*key[0][1], zCase-extra]) 309 | translate([(lkey*key[1]-holesize)/2 + 2.8,(lkey - holesize)/2, 0]) 310 | switchhole(); 311 | 312 | /* iso enter and other stabilizers than spacebar */ 313 | /* needed to add some extra mm to the costarStabilizer cutouts 314 | but different extra for each stabilizer */ 315 | translate([19.7,-5,0]) 316 | translate([startx+lkey*key[0][0], starty-lkey*key[0][1], zCase-extra]) 317 | translate([(lkey*key[1]-holesize)/2+(holesize/2)-shortStabX/2 + 2.5,(lkey - holesize)/2+costarStabYdelta+0.5, 0]) 318 | rotate([0,0,90]) costarStabilizer(); 319 | 320 | translate([-4.7,20,0]) 321 | translate([startx+lkey*key[0][0], starty-lkey*key[0][1], zCase-extra]) 322 | translate([(lkey*key[1]+holesize)/2-(holesize/2)+shortStabX/2 + 2.8,(lkey - holesize)/2+costarStabYdelta-0.5, 0]) 323 | rotate([0,0,90]) costarStabilizer(); 324 | } 325 | } 326 | 327 | /* this module gets called in 'keycapMatrix()' and adds a specific 328 | * object to the keycapMatrix. keycapMatrix is needed as a cutout element 329 | * from the frame. this hook gives possibility to add more elements such 330 | * as the enter keycap. 331 | */ 332 | module extraKeycapCutoutHook() 333 | { 334 | /* custom: place isoEnter switchhole here */ 335 | for(key = isoEnter) 336 | { 337 | startx = 0; 338 | starty = caseDepth - lkey; 339 | zCase = tempHeigth; 340 | 341 | 342 | /* iso enter needs a separate cutout 343 | * cutout is made by placing 0.5 unit above and lower 344 | */ 345 | translate([startx+lkey*key[0][0], starty-lkey*(key[0][1]-getHalf(key[0][1])), 0]) 346 | keycapSpace(key[1]); 347 | translate([startx+lkey*key[0][0], starty-lkey*(key[0][1]+getHalf(key[0][1])), 0]) 348 | keycapSpace(key[1]); 349 | 350 | } 351 | } 352 | 353 | /* this module gets called in 'keySim()' and adds a specific 354 | * object to the 'key simulation'. it enables placing keys 355 | * or other objects to the model simulation */ 356 | module extraKeySimHook() 357 | { 358 | startx = 0; 359 | starty = caseDepth - lkey; 360 | zCase = tempHeigth; 361 | 362 | for(key = isoEnter) 363 | { 364 | color(key[2]) 365 | translate([startx+lkey*key[0][0], starty-lkey*key[0][1], 0]) 366 | translate([(lkey*key[1]-holesize)/2+2,(lkey - holesize)/2, 0]) 367 | iso_enter() key(true, $fn=setKeycapFragments); 368 | } 369 | } 370 | 371 | 372 | /* ####### screw hole config ######## */ 373 | /* set the screw holes to a good position. 374 | * if your keyboard is bigger, you can add some 375 | * more screw holes into the keyboard case and lid. 376 | */ 377 | screwHoleArray = [ 378 | [24,lkey-0.4], //left lower row 379 | [114,lkey-0.4], 380 | [170,lkey-0.4], 381 | [291.5,lkey-0.4], // right lower row 382 | 383 | [24,lkey*3+wallThickness-3], //left mid row 384 | [124,lkey*3+wallThickness-3], 385 | [162,lkey*3+wallThickness-3], 386 | [291,lkey*3+wallThickness-3], //right mid row 387 | 388 | [19,lkey*5+wallThickness-3], //left upper row 389 | [133,lkey*5+wallThickness-3], 390 | [171,lkey*5+wallThickness-3], 391 | [291,lkey*5+wallThickness-3], //right upper row 392 | ]; 393 | 394 | /* rotate screw hole spacers */ 395 | screwSpacerRotation=0; 396 | 397 | /* move horizontal case stabilizers inside the case. 398 | * to move horizontal by lkey/2 for half switch cutout. 399 | * this enables to set x.5 values in layout array. 400 | * else use 0!! 401 | */ 402 | caseStabMov=0; 403 | 404 | /* screw holes when enabling outer case frame */ 405 | frameScrewHoleArray = [ 406 | [-skirtX/2-innerCaseRadius/2,-skirtY/2-innerCaseRadius/2], //lower row 407 | [caseWidth/4,-skirtY/2-innerCaseRadius/2], 408 | [caseWidth/2-lkey,-skirtY/2-innerCaseRadius/2], 409 | [caseWidth/2+lkey,-skirtY/2-innerCaseRadius/2], //lower row 410 | [caseWidth-caseWidth/4,-skirtY/2-innerCaseRadius/2], 411 | [caseWidth+skirtX/2+innerCaseRadius/2,-skirtY/2-innerCaseRadius/2], 412 | 413 | [-skirtX/2-innerCaseRadius/2,lkey*1.5], //lower row 414 | [caseWidth+skirtX/2+innerCaseRadius/2,lkey*1.5], 415 | 416 | [-skirtX/2-innerCaseRadius/2,caseDepth-lkey*0.75], //lower row 417 | [caseWidth/2-lkey,caseDepth-lkey*0.75], 418 | [caseWidth/4,caseDepth-lkey*0.75], 419 | [caseWidth/2+lkey,caseDepth-lkey*0.75], //lower row 420 | [caseWidth-caseWidth/4,caseDepth-lkey*0.75], 421 | [caseWidth+skirtX/2+innerCaseRadius/2,caseDepth-lkey*0.75], 422 | 423 | [-skirtX/2-innerCaseRadius/2,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2], //lower row 424 | [caseWidth/4,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2], 425 | [caseWidth/2-lkey,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2], 426 | [caseWidth/2+lkey,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2], //lower row 427 | [caseWidth-caseWidth/4,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2], 428 | [caseWidth+skirtX/2+innerCaseRadius/2,caseDepth+lkey*0.5+skirtY/2+innerCaseRadius/2] 429 | ]; 430 | 431 | 432 | 433 | 434 | /* set colors for simulation, set 0 for default OpenSCAD Gui Colors */ 435 | colorCaseTop="White"; 436 | colorCaseMid="DarkGray"; 437 | colorLid="Black"; 438 | colorRiserR="Black"; 439 | colorRiserL="Black"; 440 | 441 | frameColor="Black"; 442 | 443 | /* color simulation for switches 444 | select top and bottom color */ 445 | switchColorTop = "Ivory"; 446 | switchColorBottom = "Black"; 447 | 448 | /* simulate a keycap profile with number of fragments ($fn = setKeycapFragments) 449 | which will be set to key() call. 450 | KeyV2 currently (2022-06) does not support XDA. 451 | Use DSA as they look very similar 452 | NOTE: DSA is fixed to 3rd row as KeyV2 includes row number into calculation 453 | of DSA caps 454 | NOTE: currently not all profiles are working. OEM or DCS are always simulated! */ 455 | keycapProfile = "OEM"; // SA, DSA, DCS, G20, Hi-Pro, OEM 456 | setKeycapFragments = 100; 457 | 458 | /* ###################### BUILD_LINE ########################*/ 459 | /* ##########################################################*/ 460 | /* All calls after this line have to be ignored by the build script. 461 | * Do not place any calls above build line (or comment it) 462 | */ 463 | 464 | /* uncomment following line to get the keyboard simulation 465 | * with keycaps. set DoKeycapSimulation to true or false to add 466 | * or remove keycap simulation 467 | */ 468 | KeyboardSim(layout,doFrameSim=true,DoKeycapSimulation=true,xRotate=9.5); 469 | 470 | /* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */ 471 | /* ##### uncomment the keyboard part you want to print ##### */ 472 | /* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv */ 473 | 474 | /* ### complete keyboard model ### */ 475 | /* mainCase(layout); */ 476 | /* lid(); */ 477 | 478 | /* keycap frame functions. activate if skirt is enabled 479 | and you want a frame that hides the switches, which is 480 | a more classic look to none printed keyboards */ 481 | /* translate([0,0,13]) 482 | capFrame(layout); */ 483 | 484 | 485 | /* capFrameR(layout); */ 486 | 487 | /* capFrameL(layout); */ 488 | 489 | /* ### devided keyboard and lid model ### */ 490 | /* mainCaseLeft(layout); */ 491 | /* mainCaseRight(layout); */ 492 | 493 | /* lidL(); */ 494 | /* lidR(); */ 495 | 496 | /* keyboardRiser(); */ 497 | --------------------------------------------------------------------------------