├── .gitignore ├── .gitmodules ├── LICENSE ├── Makefile ├── README.md ├── documents ├── advanced-config.md ├── enclosure.md ├── imgs │ ├── assembly-instructions │ │ ├── check-encoders.JPG │ │ ├── check-switches.JPG │ │ ├── led-cut.JPG │ │ ├── required-parts.JPG │ │ ├── step-1-1.JPG │ │ ├── step-1-2.JPG │ │ ├── step-1-3.JPG │ │ ├── step-2-1.JPG │ │ ├── step-2-2.JPG │ │ ├── step-3.JPG │ │ ├── step-4.JPG │ │ ├── step-5-1.JPG │ │ ├── step-5-2.JPG │ │ ├── step-6.JPG │ │ ├── step-7-1.JPG │ │ ├── step-7-2.JPG │ │ └── step-8.JPG │ ├── header.JPG │ └── multiple-boards.JPG ├── keyboard-assembly.md ├── macro.md ├── pcba.md └── via.md ├── firmware ├── binaries │ ├── hub20_default.bin │ ├── hub20_macro.bin │ └── hub20_via.bin └── hub20 │ ├── bootloader_defs.h │ ├── chconf.h │ ├── config.h │ ├── halconf.h │ ├── hub20.c │ ├── hub20.h │ ├── info.json │ ├── keymaps │ ├── default │ │ └── keymap.c │ ├── macro │ │ ├── keymap.c │ │ └── rules.mk │ └── via │ │ ├── keymap.c │ │ └── rules.mk │ ├── mcuconf.h │ ├── readme.md │ └── rules.mk ├── hardware ├── 0.1 │ ├── .gitignore │ ├── Hub20-cache.lib │ ├── Hub20.kicad_pcb │ ├── Hub20.pro │ ├── Hub20.sch │ ├── fp-lib-table │ ├── sym-lib-table │ └── usb.sch ├── 0.2 │ ├── .gitignore │ ├── Hub20-cache.lib │ ├── Hub20.kicad_pcb │ ├── Hub20.pro │ ├── Hub20.sch │ ├── fp-lib-table │ ├── sym-lib-table │ └── usb.sch ├── 1.0.1 │ ├── .gitignore │ ├── Hub20-cache.lib │ ├── Hub20.kicad_pcb │ ├── Hub20.pro │ ├── Hub20.sch │ ├── fp-lib-table │ ├── sym-lib-table │ └── usb.sch └── 1.0 │ ├── .gitignore │ ├── Hub20-bottom.pos │ ├── Hub20-cache.lib │ ├── Hub20.kicad_pcb │ ├── Hub20.pro │ ├── Hub20.sch │ ├── Hub20.xml │ ├── bom │ └── ibom.html │ ├── fp-lib-table │ ├── sym-lib-table │ └── usb.sch ├── mechanicals ├── 1.0 │ ├── Hub20-bottom.dxf │ ├── Hub20-mid.dxf │ ├── Hub20-riser.dxf │ ├── Hub20-top.dxf │ ├── bottom-plate-gerbers.zip │ └── plate-gerbers.zip └── plate │ ├── .gitignore │ ├── Hub20.kicad_pcb │ ├── Hub20.pro │ ├── Hub20.sch │ ├── fp-lib-table │ ├── sym-lib-table │ └── usb.sch ├── production ├── 1.0 │ ├── Hub20-Acrylic.zip │ ├── assembly.html │ ├── bom.csv │ ├── fab-notes.txt │ ├── gerbers.zip │ ├── photo.JPG │ ├── plate-gerbers.zip │ ├── pnp.pos │ └── render.jpg └── test-scripts │ ├── hub20_prod.bin │ ├── hub20_test.bin │ └── prog.py └── software ├── hub20-example.ahk ├── hub20-template.ahk └── via-hub20.json /.gitignore: -------------------------------------------------------------------------------- 1 | # For PCBs designed using KiCad: http://www.kicad-pcb.org/ 2 | # Format documentation: http://kicad-pcb.org/help/file-formats/ 3 | 4 | # Temporary files 5 | *.000 6 | *.bak 7 | *.bck 8 | *.kicad_pcb-bak 9 | *.sch-bak 10 | *~ 11 | _autosave-* 12 | *.tmp 13 | *-save.pro 14 | *-save.kicad_pcb 15 | fp-info-cache 16 | 17 | # Netlist files (exported from Eeschema) 18 | *.net 19 | 20 | # Autorouter files (exported from Pcbnew) 21 | *.dsn 22 | *.ses 23 | 24 | # Gerbers 25 | *.drl 26 | *.grb 27 | *.gbl 28 | *.gbo 29 | *.gpb 30 | *.gbs 31 | *.gml 32 | *.gtl 33 | *.gto 34 | *.gtp 35 | *.gts 36 | *.gbr 37 | 38 | # 3D Models 39 | *.step 40 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "josh-kicad-lib"] 2 | path = josh-kicad-lib 3 | url = git@github.com:joshajohnson/josh-kicad-lib.git 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | CERN Open Hardware Licence Version 2 - Strongly Reciprocal 2 | 3 | 4 | Preamble 5 | 6 | CERN has developed this licence to promote collaboration among 7 | hardware designers and to provide a legal tool which supports the 8 | freedom to use, study, modify, share and distribute hardware designs 9 | and products based on those designs. Version 2 of the CERN Open 10 | Hardware Licence comes in three variants: CERN-OHL-P (permissive); and 11 | two reciprocal licences: CERN-OHL-W (weakly reciprocal) and this 12 | licence, CERN-OHL-S (strongly reciprocal). 13 | 14 | The CERN-OHL-S is copyright CERN 2020. Anyone is welcome to use it, in 15 | unmodified form only. 16 | 17 | Use of this Licence does not imply any endorsement by CERN of any 18 | Licensor or their designs nor does it imply any involvement by CERN in 19 | their development. 20 | 21 | 22 | 1 Definitions 23 | 24 | 1.1 'Licence' means this CERN-OHL-S. 25 | 26 | 1.2 'Compatible Licence' means 27 | 28 | a) any earlier version of the CERN Open Hardware licence, or 29 | 30 | b) any version of the CERN-OHL-S, or 31 | 32 | c) any licence which permits You to treat the Source to which 33 | it applies as licensed under CERN-OHL-S provided that on 34 | Conveyance of any such Source, or any associated Product You 35 | treat the Source in question as being licensed under 36 | CERN-OHL-S. 37 | 38 | 1.3 'Source' means information such as design materials or digital 39 | code which can be applied to Make or test a Product or to 40 | prepare a Product for use, Conveyance or sale, regardless of its 41 | medium or how it is expressed. It may include Notices. 42 | 43 | 1.4 'Covered Source' means Source that is explicitly made available 44 | under this Licence. 45 | 46 | 1.5 'Product' means any device, component, work or physical object, 47 | whether in finished or intermediate form, arising from the use, 48 | application or processing of Covered Source. 49 | 50 | 1.6 'Make' means to create or configure something, whether by 51 | manufacture, assembly, compiling, loading or applying Covered 52 | Source or another Product or otherwise. 53 | 54 | 1.7 'Available Component' means any part, sub-assembly, library or 55 | code which: 56 | 57 | a) is licensed to You as Complete Source under a Compatible 58 | Licence; or 59 | 60 | b) is available, at the time a Product or the Source containing 61 | it is first Conveyed, to You and any other prospective 62 | licensees 63 | 64 | i) as a physical part with sufficient rights and 65 | information (including any configuration and 66 | programming files and information about its 67 | characteristics and interfaces) to enable it either to 68 | be Made itself, or to be sourced and used to Make the 69 | Product; or 70 | ii) as part of the normal distribution of a tool used to 71 | design or Make the Product. 72 | 73 | 1.8 'Complete Source' means the set of all Source necessary to Make 74 | a Product, in the preferred form for making modifications, 75 | including necessary installation and interfacing information 76 | both for the Product, and for any included Available Components. 77 | If the format is proprietary, it must also be made available in 78 | a format (if the proprietary tool can create it) which is 79 | viewable with a tool available to potential licensees and 80 | licensed under a licence approved by the Free Software 81 | Foundation or the Open Source Initiative. Complete Source need 82 | not include the Source of any Available Component, provided that 83 | You include in the Complete Source sufficient information to 84 | enable a recipient to Make or source and use the Available 85 | Component to Make the Product. 86 | 87 | 1.9 'Source Location' means a location where a Licensor has placed 88 | Covered Source, and which that Licensor reasonably believes will 89 | remain easily accessible for at least three years for anyone to 90 | obtain a digital copy. 91 | 92 | 1.10 'Notice' means copyright, acknowledgement and trademark notices, 93 | Source Location references, modification notices (subsection 94 | 3.3(b)) and all notices that refer to this Licence and to the 95 | disclaimer of warranties that are included in the Covered 96 | Source. 97 | 98 | 1.11 'Licensee' or 'You' means any person exercising rights under 99 | this Licence. 100 | 101 | 1.12 'Licensor' means a natural or legal person who creates or 102 | modifies Covered Source. A person may be a Licensee and a 103 | Licensor at the same time. 104 | 105 | 1.13 'Convey' means to communicate to the public or distribute. 106 | 107 | 108 | 2 Applicability 109 | 110 | 2.1 This Licence governs the use, copying, modification, Conveying 111 | of Covered Source and Products, and the Making of Products. By 112 | exercising any right granted under this Licence, You irrevocably 113 | accept these terms and conditions. 114 | 115 | 2.2 This Licence is granted by the Licensor directly to You, and 116 | shall apply worldwide and without limitation in time. 117 | 118 | 2.3 You shall not attempt to restrict by contract or otherwise the 119 | rights granted under this Licence to other Licensees. 120 | 121 | 2.4 This Licence is not intended to restrict fair use, fair dealing, 122 | or any other similar right. 123 | 124 | 125 | 3 Copying, modifying and Conveying Covered Source 126 | 127 | 3.1 You may copy and Convey verbatim copies of Covered Source, in 128 | any medium, provided You retain all Notices. 129 | 130 | 3.2 You may modify Covered Source, other than Notices, provided that 131 | You irrevocably undertake to make that modified Covered Source 132 | available from a Source Location should You Convey a Product in 133 | circumstances where the recipient does not otherwise receive a 134 | copy of the modified Covered Source. In each case subsection 3.3 135 | shall apply. 136 | 137 | You may only delete Notices if they are no longer applicable to 138 | the corresponding Covered Source as modified by You and You may 139 | add additional Notices applicable to Your modifications. 140 | Including Covered Source in a larger work is modifying the 141 | Covered Source, and the larger work becomes modified Covered 142 | Source. 143 | 144 | 3.3 You may Convey modified Covered Source (with the effect that You 145 | shall also become a Licensor) provided that You: 146 | 147 | a) retain Notices as required in subsection 3.2; 148 | 149 | b) add a Notice to the modified Covered Source stating that You 150 | have modified it, with the date and brief description of how 151 | You have modified it; 152 | 153 | c) add a Source Location Notice for the modified Covered Source 154 | if You Convey in circumstances where the recipient does not 155 | otherwise receive a copy of the modified Covered Source; and 156 | 157 | d) license the modified Covered Source under the terms and 158 | conditions of this Licence (or, as set out in subsection 159 | 8.3, a later version, if permitted by the licence of the 160 | original Covered Source). Such modified Covered Source must 161 | be licensed as a whole, but excluding Available Components 162 | contained in it, which remain licensed under their own 163 | applicable licences. 164 | 165 | 166 | 4 Making and Conveying Products 167 | 168 | You may Make Products, and/or Convey them, provided that You either 169 | provide each recipient with a copy of the Complete Source or ensure 170 | that each recipient is notified of the Source Location of the Complete 171 | Source. That Complete Source is Covered Source, and You must 172 | accordingly satisfy Your obligations set out in subsection 3.3. If 173 | specified in a Notice, the Product must visibly and securely display 174 | the Source Location on it or its packaging or documentation in the 175 | manner specified in that Notice. 176 | 177 | 178 | 5 Research and Development 179 | 180 | You may Convey Covered Source, modified Covered Source or Products to 181 | a legal entity carrying out development, testing or quality assurance 182 | work on Your behalf provided that the work is performed on terms which 183 | prevent the entity from both using the Source or Products for its own 184 | internal purposes and Conveying the Source or Products or any 185 | modifications to them to any person other than You. Any modifications 186 | made by the entity shall be deemed to be made by You pursuant to 187 | subsection 3.2. 188 | 189 | 190 | 6 DISCLAIMER AND LIABILITY 191 | 192 | 6.1 DISCLAIMER OF WARRANTY -- The Covered Source and any Products 193 | are provided 'as is' and any express or implied warranties, 194 | including, but not limited to, implied warranties of 195 | merchantability, of satisfactory quality, non-infringement of 196 | third party rights, and fitness for a particular purpose or use 197 | are disclaimed in respect of any Source or Product to the 198 | maximum extent permitted by law. The Licensor makes no 199 | representation that any Source or Product does not or will not 200 | infringe any patent, copyright, trade secret or other 201 | proprietary right. The entire risk as to the use, quality, and 202 | performance of any Source or Product shall be with You and not 203 | the Licensor. This disclaimer of warranty is an essential part 204 | of this Licence and a condition for the grant of any rights 205 | granted under this Licence. 206 | 207 | 6.2 EXCLUSION AND LIMITATION OF LIABILITY -- The Licensor shall, to 208 | the maximum extent permitted by law, have no liability for 209 | direct, indirect, special, incidental, consequential, exemplary, 210 | punitive or other damages of any character including, without 211 | limitation, procurement of substitute goods or services, loss of 212 | use, data or profits, or business interruption, however caused 213 | and on any theory of contract, warranty, tort (including 214 | negligence), product liability or otherwise, arising in any way 215 | in relation to the Covered Source, modified Covered Source 216 | and/or the Making or Conveyance of a Product, even if advised of 217 | the possibility of such damages, and You shall hold the 218 | Licensor(s) free and harmless from any liability, costs, 219 | damages, fees and expenses, including claims by third parties, 220 | in relation to such use. 221 | 222 | 223 | 7 Patents 224 | 225 | 7.1 Subject to the terms and conditions of this Licence, each 226 | Licensor hereby grants to You a perpetual, worldwide, 227 | non-exclusive, no-charge, royalty-free, irrevocable (except as 228 | stated in subsections 7.2 and 8.4) patent license to Make, have 229 | Made, use, offer to sell, sell, import, and otherwise transfer 230 | the Covered Source and Products, where such licence applies only 231 | to those patent claims licensable by such Licensor that are 232 | necessarily infringed by exercising rights under the Covered 233 | Source as Conveyed by that Licensor. 234 | 235 | 7.2 If You institute patent litigation against any entity (including 236 | a cross-claim or counterclaim in a lawsuit) alleging that the 237 | Covered Source or a Product constitutes direct or contributory 238 | patent infringement, or You seek any declaration that a patent 239 | licensed to You under this Licence is invalid or unenforceable 240 | then any rights granted to You under this Licence shall 241 | terminate as of the date such process is initiated. 242 | 243 | 244 | 8 General 245 | 246 | 8.1 If any provisions of this Licence are or subsequently become 247 | invalid or unenforceable for any reason, the remaining 248 | provisions shall remain effective. 249 | 250 | 8.2 You shall not use any of the name (including acronyms and 251 | abbreviations), image, or logo by which the Licensor or CERN is 252 | known, except where needed to comply with section 3, or where 253 | the use is otherwise allowed by law. Any such permitted use 254 | shall be factual and shall not be made so as to suggest any kind 255 | of endorsement or implication of involvement by the Licensor or 256 | its personnel. 257 | 258 | 8.3 CERN may publish updated versions and variants of this Licence 259 | which it considers to be in the spirit of this version, but may 260 | differ in detail to address new problems or concerns. New 261 | versions will be published with a unique version number and a 262 | variant identifier specifying the variant. If the Licensor has 263 | specified that a given variant applies to the Covered Source 264 | without specifying a version, You may treat that Covered Source 265 | as being released under any version of the CERN-OHL with that 266 | variant. If no variant is specified, the Covered Source shall be 267 | treated as being released under CERN-OHL-S. The Licensor may 268 | also specify that the Covered Source is subject to a specific 269 | version of the CERN-OHL or any later version in which case You 270 | may apply this or any later version of CERN-OHL with the same 271 | variant identifier published by CERN. 272 | 273 | 8.4 This Licence shall terminate with immediate effect if You fail 274 | to comply with any of its terms and conditions. 275 | 276 | 8.5 However, if You cease all breaches of this Licence, then Your 277 | Licence from any Licensor is reinstated unless such Licensor has 278 | terminated this Licence by giving You, while You remain in 279 | breach, a notice specifying the breach and requiring You to cure 280 | it within 30 days, and You have failed to come into compliance 281 | in all material respects by the end of the 30 day period. Should 282 | You repeat the breach after receipt of a cure notice and 283 | subsequent reinstatement, this Licence will terminate 284 | immediately and permanently. Section 6 shall continue to apply 285 | after any termination. 286 | 287 | 8.6 This Licence shall not be enforceable except by a Licensor 288 | acting as such, and third party beneficiary rights are 289 | specifically excluded. 290 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | VERSION?=0.1 2 | NAME?= 3 | DESIGNER?=Josh Johnson 4 | 5 | prod-files: 6 | make gerb 7 | make pnp 8 | make bom 9 | 10 | new: 11 | git submodule update --init --recursive --progress 12 | cd josh-kicad-lib && git checkout master && git pull 13 | cd josh-kicad-lib && bash setup.sh "$(VERSION)" "$(NAME)" "$(DESIGNER)" 14 | 15 | gerb: 16 | python3 scripts/plot_gerbers.py hardware/$(VERSION)/*.kicad_pcb 17 | 18 | bom: 19 | cd hardware/$(VERSION) && python3 ../../scripts/josh_bom.py *.xml bom/BOM.csv 20 | 21 | pnp: 22 | cd hardware/$(VERSION) && python3 "$(HOME)/.kicad_plugins/InteractiveHtmlBom/generate_interactive_bom.py" *.kicad_pcb 23 | 24 | panel: 25 | python3 scripts/panel.py hardware/$(VERSION)/panel/*.kicad_pcb 26 | 27 | panel-gerb: 28 | python3 scripts/plot_gerbers.py hardware/$(VERSION)/panel/output.* 29 | 30 | init: 31 | rm -rf .git 32 | git init 33 | git submodule add git@github.com:joshajohnson/josh-kicad-lib.git 34 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Hub20 2 | 3 | ![Hub20](documents/imgs/header.JPG) 4 | 5 | Hub20 is a numpad with a bunch of features you never knew you needed. They include: 6 | 7 | - Left and Right handed layouts supported, along with a 4x5 1U grid enabling it to be used as a macropad. 8 | - Two rotary encoders, enabling intuitive controls for a wide range of tools including CAD and photo / video editing. 9 | - Inbuilt USB 2.0 Hub with Type-C connectors, allowing connection to other keyboards, memory sticks, wireless receivers and more! 10 | - VIA and QMK compatibility, including a "macro" mode enabling the keys to be remapped on a host computer. 11 | - 27 addressable RGB leds, including one under each key. 12 | 13 | If this project looks familiar, it's because it contains all the best parts of [Hub16](https://github.com/joshajohnson/Hub16), with a few added extras. 14 | 15 | ## Project Status 16 | 17 | Hardware is finalised and kits can be purchased from [Tindie](https://www.tindie.com/products/joshajohnson/hub20-programmable-macro-numberpad/). 18 | 19 | ![Hub20](documents/imgs/multiple-boards.JPG) 20 | 21 | ## Getting Started Guide 22 | 23 | - [Keyboard Assembly](documents/keyboard-assembly.md) 24 | - [VIA Keymap Configuration](documents/via.md) 25 | - [Macro Configuration](documents/macro.md) 26 | 27 | ## Detailed Info 28 | 29 | - [Advanced Firmware / Software Configuration](documents/advanced-config.md) 30 | - [PCB SMT Assembly Guide](documents/pcba.md) 31 | - [Enclosure Manufacturing](documents/enclosure.md) 32 | 33 | ### Repo Contents 34 | 35 | - `documents` contains all documentation and images for the project. 36 | - `firmware` contains both the source and precompiled binaries for Hub20. 37 | - `hardware` contains the KiCad design files for the keyboard. 38 | - `josh-kicad-lib` is my personal KiCad parts library which contains many of the parts used. 39 | - `scripts` contains a number of scripts used in the PCB design process. 40 | - `mechanicals` contain the plate and case design for Hub20. 41 | - `production` contains all the files required to produce the PCB. It also contains test scripts and jigs. 42 | - `software` contains all the VIA config, along with template script to use Hub20 as a macropad with software on your computer. 43 | 44 | ### Notes on the USB Hub 45 | 46 | The hub is a four port USB 2.0 Hub with Type-C connectors, aimed at allowing connection of keyboards, mice, memory sticks, wireless receivers, and other small devices (including a second Hub20!) to your computer. 47 | 48 | Due to cost and space constraints, the hub has some limitations. The hub **is not**: 49 | 50 | - USB 3.x, Power Delivery, Thunderbolt, DisplayPort, etc compatible. 51 | - Designed to charge your phone quickly. Only 100mA is guaranteed per port. 52 | - Designed to work with power hungry devices such as spinning hard drives. 53 | - Guaranteed to provide full USB 2.0 speeds and performance on all ports. 54 | 55 | Might you be able to charge your phone whilst copying files at full speed of a spinning hard drive over a long cable? Maybe. However Hub20 is a numpad first, USB hub second, so if you are looking for a high performance device I'd suggest picking up a dedicated USB hub and just using Hub20 as a numpad. 56 | 57 | If you have any questions or comments please get in touch. I can be found on Discord as `_joshajohnson#9451`, [Twitter](https://twitter.com/_joshajohnson), email, or leave an issue or pull request on this repo. 58 | -------------------------------------------------------------------------------- /documents/advanced-config.md: -------------------------------------------------------------------------------- 1 | # Advanced Firmware and Software Configuration 2 | 3 | This section details how Hub20 works, and how you can modify it to suit your needs. 4 | 5 | If you are simply looking for into on how to get up and running, the [VIA](via.md) and [Macro](macro.md) documentation may be better suited. 6 | 7 | ## Summary 8 | 9 | The macro functionality of Hub20 is quite unique, as it moves control over what key is detected by the host computer from the keyboard to the computer itself, which enables a whole new level of control. Examples of functionality enabled by this include: 10 | 11 | - Dynamically assigning keys pressed depending on open application, e.g. encoder changing zoom in Photoshop, but zooming timeline in Premiere. 12 | - Accessing low level functions, such as directly bringing a given application to the foreground without tabbing through open windows. 13 | - Running shell commands without opening a shell and playing back key sequences. 14 | - Any other feature that your software (AutoHotKey, Karabiner-Elements, Autokey) provides an interface for. 15 | 16 | ## Theory of Operation 17 | 18 | - Hub20 works by presenting a uniquely identifiable key to your computer, which can be intercepted by a intermediate layer of software on your computer, and can then be processed as required. 19 | - This works by "wrapping" a normal key press with a modifier key to create a unique key, just like pressing SHIFT changes the key shown on your screen when pressed in conjunction with a key on your keyboard. 20 | - However, as CTRL, SHIFT, ALT etc are commonly used they would not be very helpful to generate a unique key, so we instead use F13 - F24 as most keyboards do not have these, but are still valid keycodes. 21 | - To achieve this, when you press a key, Hub20 first sends a modifier key (e.g. F23) before pressing down the key you touched. Upon release of your key, it releases the modifier, allowing the computer to pick up that Hub20 has pressed a key. 22 | - **NOTE** macOS instead uses the VID:PID of your device to uniquely identify Hub20, however the high level concept outlined above still applies. 23 | 24 | ## Firmware Configuration 25 | 26 | The default configuration can be easily changed, allowing for further customisation of the board. Examples of what can be done include: 27 | 28 | - Holding down a key / encoder button results in different keys being sent when rotating the encoder, effectively doubling (or tripling etc) the number of encoders on the board. 29 | - Extending the number of macro keys by having multiple layers of unique keys, accessed by the bottom row of keys being dedicated to shifting layers. 30 | - Building the macro configuration with VIA enabled, allowing LEDs to be customised from the VIA GUI instead of tapping keys to change the mode and colour. 31 | 32 | Key sections of the code and their function are outlined below: 33 | 34 | | Section | Description | 35 | | ------- | ----------- | 36 | | `#define KC_WRAP` | If you have more than one Hub20 connected, change the wrapping function key to differentiate boards. | 37 | | `const uint16_t PROGMEM keymaps` | This section is where the keymaps live, and if you want to alter the behaviour of a key this is the place to do it. | 38 | | `void encoder_update_user` | Want to change what rotating an encoder does? If so this is the place to look. | 39 | | `bool process_record_user` | Every time a non [quantum](https://docs.qmk.fm/#/keycodes?id=quantum-keycodes) key is pressed, it will be run throught this section, and is the place to implement custom functions such as sending custom strings, turning on / off a mouse shaker, or any custom action you want when a key is pressed. | 40 | | `void td_ctrl` | To work around the limitations of `process_record_user` this function is required to ensure the layer toggle key is wrapped when sent to the host computer. If you don't want to use tap dance, or are okay having a dedicated key to toggling layers, this can be removed. | 41 | 42 | ## Software Configuration 43 | 44 | Due to the different software being required for each OS, and the varying levels of options each tool provides, it's challenging to make any specific recommendations for ways to customise the software running on your host PC. With this said, I would strongly suggest looking at the `hub20-example.ahk` script which is an obfuscated version of what I use at work every day, along with the documentation of your chosen scripting tool to see what is possible, and think how it may help your day to day workflow. Below are some examples of what people have used their Hub16 / Hub20 to automate: 45 | 46 | - Running complex shortcuts with a single key. 47 | - Placing common shortcuts (enlarge / shrink) on the encoders to ease adjustment. 48 | - Pulling a specific windows to the foreground with a single tap. 49 | - Dedicated keys for video conference muting, sharing screens etc. 50 | - Automating filling out of repetitive forms (e.g. the Auspost customs declaration...) 51 | - Having emoticons or emoji a single keystroke away. (•◡•) / 52 | - Alternate input for racing / flight simulators. 53 | 54 | If you come up with a novel use case, I'd be very interested to hear about it so please get in touch! 55 | -------------------------------------------------------------------------------- /documents/enclosure.md: -------------------------------------------------------------------------------- 1 | # Enclosure Manufacturing 2 | 3 | There are a number of ways the enclosure can be manufactured, and these options are outlined below: 4 | 5 | All case files can be found in `mechanicals/1.0`. 6 | 7 | By default, the enclosure has the below stackup: 8 | 9 | ``` 10 | --- PCB Plate, 1.6mm 11 | --- Acrylic Upper, 4mm 12 | --- Hub20 PCB, 1.6mm 13 | --- Acrylic Mid, 4mm 14 | --- Acrylic Lower, 3mm 15 | - Acrylic Incline, 3-4mm (optional) 16 | ``` 17 | 18 | You can however make a number of substitutions: 19 | 20 | - Swap PCB plate for 3mm acrylic, and move upper 4mm acrylic to 3mm - note some switches may have reduced insertion depth into the PCB. 21 | - Replace acrylic lower with FR4 PCB. 22 | - 3d print parts instead of laser cutting or utilising PCBs for mechanical elements. 23 | - Design your own! .step file can be exported from KiCad into you mCad tool of choice. 24 | -------------------------------------------------------------------------------- /documents/imgs/assembly-instructions/check-encoders.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joshajohnson/Hub20/f781e843167f94afac979929ccd29d1ee586b9fa/documents/imgs/assembly-instructions/check-encoders.JPG -------------------------------------------------------------------------------- /documents/imgs/assembly-instructions/check-switches.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joshajohnson/Hub20/f781e843167f94afac979929ccd29d1ee586b9fa/documents/imgs/assembly-instructions/check-switches.JPG -------------------------------------------------------------------------------- /documents/imgs/assembly-instructions/led-cut.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joshajohnson/Hub20/f781e843167f94afac979929ccd29d1ee586b9fa/documents/imgs/assembly-instructions/led-cut.JPG -------------------------------------------------------------------------------- /documents/imgs/assembly-instructions/required-parts.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joshajohnson/Hub20/f781e843167f94afac979929ccd29d1ee586b9fa/documents/imgs/assembly-instructions/required-parts.JPG -------------------------------------------------------------------------------- /documents/imgs/assembly-instructions/step-1-1.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joshajohnson/Hub20/f781e843167f94afac979929ccd29d1ee586b9fa/documents/imgs/assembly-instructions/step-1-1.JPG -------------------------------------------------------------------------------- /documents/imgs/assembly-instructions/step-1-2.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joshajohnson/Hub20/f781e843167f94afac979929ccd29d1ee586b9fa/documents/imgs/assembly-instructions/step-1-2.JPG -------------------------------------------------------------------------------- /documents/imgs/assembly-instructions/step-1-3.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joshajohnson/Hub20/f781e843167f94afac979929ccd29d1ee586b9fa/documents/imgs/assembly-instructions/step-1-3.JPG -------------------------------------------------------------------------------- /documents/imgs/assembly-instructions/step-2-1.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joshajohnson/Hub20/f781e843167f94afac979929ccd29d1ee586b9fa/documents/imgs/assembly-instructions/step-2-1.JPG -------------------------------------------------------------------------------- /documents/imgs/assembly-instructions/step-2-2.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joshajohnson/Hub20/f781e843167f94afac979929ccd29d1ee586b9fa/documents/imgs/assembly-instructions/step-2-2.JPG -------------------------------------------------------------------------------- /documents/imgs/assembly-instructions/step-3.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joshajohnson/Hub20/f781e843167f94afac979929ccd29d1ee586b9fa/documents/imgs/assembly-instructions/step-3.JPG -------------------------------------------------------------------------------- /documents/imgs/assembly-instructions/step-4.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joshajohnson/Hub20/f781e843167f94afac979929ccd29d1ee586b9fa/documents/imgs/assembly-instructions/step-4.JPG -------------------------------------------------------------------------------- /documents/imgs/assembly-instructions/step-5-1.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joshajohnson/Hub20/f781e843167f94afac979929ccd29d1ee586b9fa/documents/imgs/assembly-instructions/step-5-1.JPG -------------------------------------------------------------------------------- /documents/imgs/assembly-instructions/step-5-2.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joshajohnson/Hub20/f781e843167f94afac979929ccd29d1ee586b9fa/documents/imgs/assembly-instructions/step-5-2.JPG -------------------------------------------------------------------------------- /documents/imgs/assembly-instructions/step-6.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joshajohnson/Hub20/f781e843167f94afac979929ccd29d1ee586b9fa/documents/imgs/assembly-instructions/step-6.JPG -------------------------------------------------------------------------------- /documents/imgs/assembly-instructions/step-7-1.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joshajohnson/Hub20/f781e843167f94afac979929ccd29d1ee586b9fa/documents/imgs/assembly-instructions/step-7-1.JPG -------------------------------------------------------------------------------- /documents/imgs/assembly-instructions/step-7-2.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joshajohnson/Hub20/f781e843167f94afac979929ccd29d1ee586b9fa/documents/imgs/assembly-instructions/step-7-2.JPG -------------------------------------------------------------------------------- /documents/imgs/assembly-instructions/step-8.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joshajohnson/Hub20/f781e843167f94afac979929ccd29d1ee586b9fa/documents/imgs/assembly-instructions/step-8.JPG -------------------------------------------------------------------------------- /documents/imgs/header.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joshajohnson/Hub20/f781e843167f94afac979929ccd29d1ee586b9fa/documents/imgs/header.JPG -------------------------------------------------------------------------------- /documents/imgs/multiple-boards.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joshajohnson/Hub20/f781e843167f94afac979929ccd29d1ee586b9fa/documents/imgs/multiple-boards.JPG -------------------------------------------------------------------------------- /documents/keyboard-assembly.md: -------------------------------------------------------------------------------- 1 | # Assembly Instructions 2 | 3 | Before assembling the board, ensure you have all of the required parts. 4 | 5 | * Top cover / Plate PCB 6 | * Assembled keyboard PCB 7 | * Laser cut acrylic - 4 pieces 8 | * 2 * Rotary encoders (20mm recommended) 9 | * 2 * Rotary encoder knobs 10 | * 4 * 4mm M2 cap head bolts (bare-bones 8 * 4mm) 11 | * 4 * 8mm M2 cap head bolts (plus 2 * 10mm M2 if using bottom riser) 12 | * 4 * 8mm female threaded standoffs (bare-bones 10mm) 13 | * 4 * Rubber feet (optional) 14 | * 17-20 * Cherry MX Key Switches (not shown) (3 pin switches required for 2U keys) 15 | * 17-20 * 1U Cherry MX Keycaps (not shown) 16 | * 0-3 * Screw In Stabilisers (not shown) 17 | 18 | You will also require the following: 19 | 20 | * Soldering iron and solder 21 | * 1.5mm allen key 22 | * Dielectric Grease (to lube stabilisers) 23 | 24 | If you are assembling the bare-bones version, follow the below steps but omit the acrylic parts. 25 | 26 | Please ensure you remove the protective paper off all acrylic parts before starting. 27 | If there are rough edges on the PCB, feel free to smooth down with sandpaper or a file. 28 | 29 | ![Parts Required](imgs/assembly-instructions/required-parts.JPG) 30 | 31 | ### Step 0: Check PCB 32 | 33 | Whilst we do our best to ensure the PCBs work, there may be issues that slip through QC or the boards may be damaged in freight. As such you should test the PCB before continuing. 34 | 35 | Boards come preloaded with VIA for testing, and using their "Key Tester -> Test Matrix" option is the easiest way to ensure the board works. `If VIA does not automatically detect your HUb20, follow ` [these](via.md) `instructions to load the config file so the board can be detected.` 36 | 37 | **Check the key switches by using tweezers to short the key switch pins together.** 38 | ![Checking Keys](imgs/assembly-instructions/check-switches.JPG) 39 | 40 | **Check the encoders by placing encoder against pins and rotating.** 41 | You may need to angle the encoder down to ensure it has good contact. Also test the encoder switch by shorting the two pins towards the top of the PCB. 42 | 43 | ![Checking Encoders](imgs/assembly-instructions/check-encoders.JPG) 44 | 45 | **Check the USB hub by connecting a device to each port, with cable orientated in both orientations.** 46 | You should see a your device appear on each port. 47 | 48 | ### **If there are any issues getting the above to work, please get in touch before proceeding to assemble the board.** 49 | 50 | ### Step 1: Solder Encoders 51 | 52 | The first step in assembling your Hub20 is to solder the rotary encoders. Ensuring the pins are straight, insert the rotary encoders and tack in two pins on opposite corners. 53 | ![Tacking encoder](imgs/assembly-instructions/step-1-1.JPG) 54 | 55 | Before soldering in the remaining pins, ensure the encoder is perpendicular. If adjustments are required, heat one of the solder joints and gently push the encoder until it is seated. Repeat until you are satisfied with how the encoders look. (Hint: you shouldn't be able to see the encoder hiding on the other side of the board!) 56 | ![Checking encoder is square](imgs/assembly-instructions/step-1-2.JPG) 57 | 58 | With your encoders in nice and square, solder the rest of the pins. I'd suggest soldering all of the smaller pins and checking everything is still square before soldering in the mechanical legs as they make it very hard to move the encoder. 59 | ![Soldering all pins](imgs/assembly-instructions/step-1-3.JPG) 60 | 61 | ### Step 2: Install Stabilisers 62 | 63 | Stabilisers are required for all of the "2U" switches, as they prevent the keys from wobbling. Before installing, I highly recommend you [lubricate your stabilisers](https://youtu.be/cD5Zj-ZgMLA) as otherwise they will rattle. If you don't want to go through the hassle of the above video, just make sure you [lube the wires](https://youtu.be/cD5Zj-ZgMLA?t=185) as this is the largest contributor to noise. 64 | 65 | Depending on if you configure the board as a left or right numpad (or a 4x5 grid, in which case you can skip this) you will need to place the stabilisers in different locations. Left image is for the left numpad config, right image is for the right numpad configuration. 66 | 67 | ![Stabiliser locations](imgs/assembly-instructions/step-2-1.JPG) 68 | 69 | When installing the stabilisers, ensure you use the non-conductive washers which are included. This prevents the screws from contacting with the PCB and causing shorts or damaging traces. 70 | 71 | ![Ensure you use non-conductive washers](imgs/assembly-instructions/step-2-2.JPG) 72 | 73 | ### Step 3: Assemble upper case 74 | 75 | With the encoders soldered and stabilisers installed, the next step is to thread the standoffs into the shorter screws through the top plate. Just do this up touch tight, as we may need to loosen it later. 76 | ![Bottom plate assembly](imgs/assembly-instructions/step-3.JPG) 77 | 78 | ### Step 4: Add "O" shaped spacer 79 | 80 | Add the "O" shaped spacer, ensuring the cutouts are towards the bottom as they provide clearance for the stabilisers. 81 | ![Adding U shaped spacer](imgs/assembly-instructions/step-4.JPG) 82 | 83 | ### Step 5: Place PCB into case, and solder switches 84 | 85 | Place the PCB into the case, followed by a switch in each corner to hold it in place. 86 | ![Placing PCB](imgs/assembly-instructions/step-5-1.JPG) 87 | 88 | Tack one pin from each switch in place to keep everything together, and check for gaps along the side of the case. If there are gaps, press the case together whilst heating the soldered pin and the case should squish together. Once everything is flush, add the remaining keys and solder. 89 | ![Checking edges are aligned](imgs/assembly-instructions/step-5-2.JPG) 90 | 91 | ### Step 6: Add "U" shaped spacer 92 | 93 | Place the remaining "U" shaped acrylic spacer on top of the PCB, ensuring the open end faces towards the USB connectors. 94 | ![Placing PCB](imgs/assembly-instructions/step-6.JPG) 95 | 96 | ### Step 7: Add bottom plate and remaining screws 97 | 98 | When installing the bottom plate, if you choose to use the small riser you will need to use the 10mm bolts instead of the 8mm bolts that are used at the bottom of the case. It can help to have the standoff flush to the acrylic to get the bolt started (please pretend the standoff is flush in this photo, I couldn't get a good photo of it...). 99 | ![Spacer sitting flush](imgs/assembly-instructions/step-7-1.JPG) 100 | 101 | After installing the bottom plate and screws, snug all of the bolts up and your Hub20 is now assembled! 102 | ![Bottom plates assembled](imgs/assembly-instructions/step-7-2.JPG) 103 | 104 | ### Step 8: Add keycaps and encoder knobs 105 | 106 | Finally, fit your keycaps of choice and the encoder knobs, and you are done! Enjoy :D 107 | ![Adding knobs and keycaps](imgs/assembly-instructions/step-8.JPG) 108 | 109 | ## Disabling Power LED 110 | 111 | If you find the power LED annoying and would like to disable it, cut the jumper near the USB ports. The easiest way to do this is to run a knife down the thin black gap between the two large pads. The LED can be re-enabled by soldering the jumper shut. 112 | 113 | ![Cutting trace for power LED](imgs/assembly-instructions/led-cut.JPG) 114 | -------------------------------------------------------------------------------- /documents/macro.md: -------------------------------------------------------------------------------- 1 | # Macro Configuration 2 | 3 | Hub20 can also be used with software on your computer to enable powerful, context aware macros to be run. 4 | 5 | This works by sending uniquely identifiable keys to your computer which are picked up by software, which can then map those keys as required. As such, this requires the correct firmware to be loaded onto Hub20, and software to be installed on your computer. 6 | 7 | ## Firmware 8 | 9 | Hub20 does not ship with the macro firmware preinstalled, but is easily flashed onto your board. 10 | 11 | MechMerlin has [a great video](https://youtu.be/VR53Wo9Z960) on the process, so I will highlight the Hub20 specific configurations / settings. 12 | 13 | - When selecting the file to flash, use `firmware/binaries/hub20_macro.bin`. 14 | - There is no need to select the microcontroller before flashing the board. 15 | - The reset button can be found between the USB connectors on the back of the board, or by holding down the top right button and depressing the left encoder. 16 | 17 | The default configuration for the keyboard is shown below: 18 | 19 | ``` 20 | ------------------ 21 | | ENC1 ENC2 | ENC1:Clockwise: u 22 | | a b c d* | ENC1:Anticlockwise: v 23 | | e f g h | ENC2:Button: w 24 | | i j k l | ENC2:Clockwise: x 25 | | m n o p | ENC2:Anticlockwise: y 26 | | q r s t | ENC2:Button: z 27 | ------------------ 28 | ``` 29 | 30 | \* Once flashing the macro layout you may notice that holding or tapping the top right key quickly may not result in a key being sent. This because if you double tap that key, it will bring you to a configuration layer on the keyboard which allows you to control the LEDs and reset the keyboard. Double tapping the same key will return you to the base layer. The keymap for this configuration is shown below: 31 | 32 | ``` 33 | Reset, _______, 34 | RGB On/Off, RGB Prev, RGB Next, Home, 35 | _______, Bright +, BRIGHT -, _______, 36 | _______, Hue +, Hub -, _______, 37 | _______, Sat +, Sat -, _______, 38 | _______, _______, _______, _______, 39 | 40 | ``` 41 | 42 | ## Software 43 | 44 | ### Windows 45 | 46 | - Download and install [AutoHotKey](https://www.autohotkey.com/). 47 | - Copy the example script from `software/hub20-template.ahk` into a folder of your choice. 48 | - For the script to run at startup, I strongly suggest placing a shortcut to the above file in `%APPDATA%/Roaming/Microsoft/Windows/Start Menu/Programs/Start-up`. 49 | - Configure the script to suit your use case, ensuring to restart the AHK script after each change, otherwise it will not use the latest changes. 50 | 51 | ### macOS 52 | 53 | - Install [Karabiner-Elements](https://karabiner-elements.pqrs.org/docs/getting-started/installation/). 54 | - Copy the example script from `software/karabiner-hub20.json` to your local `~.config/karabiner` folder. 55 | - Configure keybindings as required. 56 | 57 | ### Linux 58 | 59 | - Whilst it's slightly more painful and buggy to configure and use on Linux, the below is the best configuration I've got to work. PRs are very much welcome for improvements to this. 60 | - Install AutoKey from [here](https://github.com/autokey/autokey/wiki/Installing#debian-and-derivatives), as the apt-get version is broken. 61 | - Create a file in your home directory with the name `.Xmodmap` and the following contents 62 | 63 | ``` bash 64 | keycode 202 = Hyper_R 65 | add mod3 = Hyper_R 66 | ``` 67 | 68 | - Update xmodmap with `xmodmap ~/.Xmodmap` and then confirm that `mod3` has been updated by entering `xmodmap` in your shell and looking for `mod3 Hyper_R (0xca)`. 69 | - Then add it to your ```~./bashrc```, as this will allow the keyboard to work **only after a shell is opened by the user**. A PR to resolve this would be very welcomed. 70 | - Load the AutoKey files found in `software/hub16` and it should work. 71 | - Note: you may need to make a new folder from within Autokey, then copy your files in as it is particular about locating new files. 72 | - You will also need to configure AutoKey to start at boot, which can be done from `Edit -> Preferences`. 73 | - For volume and media control as configured in my example code, [playerctl](https://github.com/altdesktop/playerctl) and ```alsa-utils``` must be installed. 74 | -------------------------------------------------------------------------------- /documents/pcba.md: -------------------------------------------------------------------------------- 1 | # PCB SMT Assembly Guide 2 | 3 | I highly recommend assembling this board using solder paste, a stencil, and a reflow oven. If you don't have access to a reflow oven, a hot air gun will also get the job done. 4 | 5 | - Gerbers can be found in `production/1.0-prod/gerbers.zip` folder, and can be uploaded to your favourite PCB manufacturer. 6 | - Most PCB houses will generate the solderpaste stencil from your copper layer, which can cause issues. As such I recommend uploading the stencil separately to ensure the apertures are as per the design files. 7 | - The bill of materials can be found at `production/1.0-prod/bom.csv` and contains part numbers for all components on the board. DigiKey and LCSC part numbers are provided where available, however some parts such at the USB connectors, reverse mount LEDs, and USB hub may only be available at one or neither of the suppliers. 8 | - The "Human PnP" file is located at `production/1.0-prod/assembly.html`, and will be very helpful in assembling the board. 9 | 10 | With the board assembled and reflowed, it is time to power it up and flash the firmware. 11 | 12 | - Before powering up, measure between 5V, 3V3 and GND to ensure there are no shorts. The capacitors either side of the linear regulator are an easy place to measure. 13 | - Upon plugging the board in, you should see the PWR led turn on, and the USB hub enumerate. The STM32 microcontroller will not be detected at this time. 14 | - To flash the firmware, run `make hub20:default:flash` from within your `qmk_firmware` folder. Reset the board using the reset button, and you should see `dfu-util` flash the board. 15 | - Confirm all keys work by shorting the switch contacts with tweezers and looking for an output from the board, and confirm the USB hub works by plugging a device into each port and checking for enumeration. Ensure you flip the USB connector and test all the ports with it in the other orientation as well. 16 | 17 | If the board does not work, common issues include: 18 | 19 | - Shorts / opens on the QFN and USB footprints. 20 | - Crystal for the USB hub not being soldered down correctly. 21 | - Diodes being installed backwards. 22 | - LEDs damaged due to moisture ingress / excessive heat during reflow. 23 | - Shorts on the resistor networks. 24 | -------------------------------------------------------------------------------- /documents/via.md: -------------------------------------------------------------------------------- 1 | # VIA Keymap Configuration 2 | 3 | `Hub20 was recently merged into VIA, so it should be automatically detected. If for some reason it is not, the below info should allow you to manually load the config file.` 4 | 5 | - Open the settings tab in VIA, and enable "Show Design Tab". 6 | - On the design tab, click "load" and select the [hub20.json](../software/via-hub20.json) file. 7 | - To download the json file, click through to the above link, select raw, copy all of the next into notepad or a similar text editor, and save as hub20.json. 8 | - Hub20 should now be detected by VIA. 9 | 10 | VIA is a great way to graphically configure your keyboard without going through the hassle of configuring build environments and poking around in the code. 11 | 12 | ## Install VIA 13 | 14 | To use VIA, first [download and install](https://caniusevia.com/) the configuration software, and then plug in your keyboard. It should detect and show a graphic of Hub20 on your screen. 15 | 16 | **Note: Hub20 ships with VIA by default, however if you have flashed a custom firmware on it you will need to ensure a VIA compatible keymap is on your board before continuing.** 17 | 18 | ## Configure Keys 19 | 20 | From within VIA, you can easily configure keys as required. It allows not only the typical keys found on your keyboard, but media keys, macros, layer shifting to enable different functions per key, and even keys to control the LEDs installed in Hub20. It does not however allow you to configure the rotary encoder behaviour. 21 | 22 | Due to the multiple layouts Hub20 allows, VIA allows you to toggle on / off the 2U keys required for it to be a left hand numpad. This can be done from the `layouts` tab in the top left of the screen. To configure Hub20 as a right hand numpad, enable split plus / enter / zero, and change the keymap as required. For the 2U keys, simply assign the same key to both keys in the pair. 23 | 24 | ## Configure Encoders 25 | 26 | By default, the encoders are configured to volume up / down (left) and media next / prev (right). 27 | 28 | Unfortunately, due to limitations in VIA the encoders are not visible or configurable. The best workaround at this time is to build a new VIA keymap with the encoder functions altered to suit your use case, flash this onto the board, and then configure the remainder of the keys in VIA. This can be done by following the below instructions: 29 | 30 | - Follow the QMK [getting started guide](https://docs.qmk.fm/#/newbs_getting_started) to install the toolchain and configure your build environment. 31 | - If you are reading this, the Hub20 firmware is not yet merged into QMK. Copy the `hub20` folder in `firmware` to `qmk_firmware/keyboards/hub20` before continuing. 32 | - Open the `qmk_firmware/keyboards/hub20/keymaps/via/keymap.c` file in your preferred text editor. 33 | - Locate the function `encoder_update_user`, and update the keycodes in `tap_code(KC_xxx)` to one from the [keycodes list](https://docs.qmk.fm/#/keycodes?id=basic-keycodes). If you use keycode not on the basic list, you may need to replace `tap_code` with `tap_code16`. 34 | - With the changes made, save your new keymap, build, and flash the keymap to Hub20 with `make hub20:via:flash` run from the `qmk_firmware` directory. 35 | - You should now see the encoders functioning as desired, and you can configure the remainder or your keyboard using VIA. 36 | -------------------------------------------------------------------------------- /firmware/binaries/hub20_default.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joshajohnson/Hub20/f781e843167f94afac979929ccd29d1ee586b9fa/firmware/binaries/hub20_default.bin -------------------------------------------------------------------------------- /firmware/binaries/hub20_macro.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joshajohnson/Hub20/f781e843167f94afac979929ccd29d1ee586b9fa/firmware/binaries/hub20_macro.bin -------------------------------------------------------------------------------- /firmware/binaries/hub20_via.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joshajohnson/Hub20/f781e843167f94afac979929ccd29d1ee586b9fa/firmware/binaries/hub20_via.bin -------------------------------------------------------------------------------- /firmware/hub20/bootloader_defs.h: -------------------------------------------------------------------------------- 1 | /* Address for jumping to bootloader on STM32 chips. */ 2 | /* It is chip dependent, the correct number can be looked up here (page 175): 3 | * http://www.st.com/web/en/resource/technical/document/application_note/CD00167594.pdf 4 | * This also requires a patch to chibios: 5 | * /tmk_core/tool/chibios/ch-bootloader-jump.patch 6 | */ 7 | #define STM32_BOOTLOADER_ADDRESS 0x1FFFC800 8 | -------------------------------------------------------------------------------- /firmware/hub20/config.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2020 joshajohnson 3 | 4 | This program is free software: you can redistribute it and/or modify 5 | it under the terms of the GNU General Public License as published by 6 | the Free Software Foundation, either version 2 of the License, or 7 | (at your option) any later version. 8 | 9 | This program is distributed in the hope that it will be useful, 10 | but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | GNU General Public License for more details. 13 | 14 | You should have received a copy of the GNU General Public License 15 | along with this program. If not, see . 16 | */ 17 | 18 | #pragma once 19 | 20 | /* USB Device descriptor parameter */ 21 | #define VENDOR_ID 0x6A6A // JJ 22 | #define PRODUCT_ID 0x4414 // H20 23 | #define DEVICE_VER 0x0001 24 | #define MANUFACTURER joshajohnson 25 | #define PRODUCT Hub20 26 | #define DESCRIPTION Numpad with integrated USB Hub and rotary encoders 27 | 28 | /* key matrix */ 29 | #define MATRIX_ROWS 6 30 | #define MATRIX_COLS 4 31 | 32 | #define MATRIX_ROW_PINS { A13, B14, A10, A0, A2, A1 } 33 | #define MATRIX_COL_PINS { A6, A7, B7, B6 } 34 | 35 | /* COL2ROW, ROW2COL*/ 36 | #define DIODE_DIRECTION COL2ROW 37 | 38 | /* Rotary Encoder Things */ 39 | // #define ENCODER_DIRECTION_FLIP 40 | #define ENCODERS_PAD_A { B12, A8 } 41 | #define ENCODERS_PAD_B { B13, A9 } 42 | 43 | #define RGB_DI_PIN B15 44 | #define RGBLED_NUM 27 45 | #define RGBLIGHT_HUE_STEP 8 46 | #define RGBLIGHT_SAT_STEP 8 47 | #define RGBLIGHT_VAL_STEP 8 48 | #define RGBLIGHT_LIMIT_VAL 255 /* The maximum brightness level */ 49 | #define RGBLIGHT_SLEEP /* If defined, the RGB lighting will be switched off when the host goes to sleep */ 50 | // /*== all animations enable ==*/ 51 | #define RGBLIGHT_ANIMATIONS 52 | // /*== or choose animations ==*/ 53 | // #define RGBLIGHT_EFFECT_BREATHING 54 | // #define RGBLIGHT_EFFECT_RAINBOW_MOOD 55 | // #define RGBLIGHT_EFFECT_RAINBOW_SWIRL 56 | // #define RGBLIGHT_EFFECT_SNAKE 57 | // #define RGBLIGHT_EFFECT_KNIGHT 58 | // #define RGBLIGHT_EFFECT_CHRISTMAS 59 | // #define RGBLIGHT_EFFECT_STATIC_GRADIENT 60 | // #define RGBLIGHT_EFFECT_RGB_TEST 61 | // #define RGBLIGHT_EFFECT_ALTERNATING 62 | // /*== customize breathing effect ==*/ 63 | // /*==== (DEFAULT) use fixed table instead of exp() and sin() ====*/ 64 | // #define RGBLIGHT_BREATHE_TABLE_SIZE 256 // 256(default) or 128 or 64 65 | // /*==== use exp() and sin() ====*/ 66 | // #define RGBLIGHT_EFFECT_BREATHE_CENTER 1.85 // 1 to 2.7 67 | // #define RGBLIGHT_EFFECT_BREATHE_MAX 255 // 0 to 255 68 | 69 | /* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ 70 | #define DEBOUNCE 5 71 | 72 | /* Tap delay for tap vs hold */ 73 | #define TAPPING_TERM 200 74 | 75 | /* Slow down key press speed to ensure computer picks it up */ 76 | #define TAP_CODE_DELAY 20 77 | 78 | /* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ 79 | #define LOCKING_SUPPORT_ENABLE 80 | /* Locking resynchronize hack */ 81 | #define LOCKING_RESYNC_ENABLE 82 | 83 | /* disable these deprecated features by default */ 84 | #ifndef LINK_TIME_OPTIMIZATION_ENABLE 85 | #define NO_ACTION_MACRO 86 | #define NO_ACTION_FUNCTION 87 | #endif 88 | -------------------------------------------------------------------------------- /firmware/hub20/halconf.h: -------------------------------------------------------------------------------- 1 | /* 2 | ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */ 16 | 17 | /** 18 | * @file templates/halconf.h 19 | * @brief HAL configuration header. 20 | * @details HAL configuration file, this file allows to enable or disable the 21 | * various device drivers from your application. You may also use 22 | * this file in order to override the device drivers default settings. 23 | * 24 | * @addtogroup HAL_CONF 25 | * @{ 26 | */ 27 | 28 | #ifndef HALCONF_H 29 | #define HALCONF_H 30 | 31 | #define _CHIBIOS_HAL_CONF_ 32 | #define _CHIBIOS_HAL_CONF_VER_7_0_ 33 | 34 | #include "mcuconf.h" 35 | 36 | /** 37 | * @brief Enables the PAL subsystem. 38 | */ 39 | #if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) 40 | #define HAL_USE_PAL TRUE 41 | #endif 42 | 43 | /** 44 | * @brief Enables the ADC subsystem. 45 | */ 46 | #if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) 47 | #define HAL_USE_ADC FALSE 48 | #endif 49 | 50 | /** 51 | * @brief Enables the CAN subsystem. 52 | */ 53 | #if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) 54 | #define HAL_USE_CAN FALSE 55 | #endif 56 | 57 | /** 58 | * @brief Enables the cryptographic subsystem. 59 | */ 60 | #if !defined(HAL_USE_CRY) || defined(__DOXYGEN__) 61 | #define HAL_USE_CRY FALSE 62 | #endif 63 | 64 | /** 65 | * @brief Enables the DAC subsystem. 66 | */ 67 | #if !defined(HAL_USE_DAC) || defined(__DOXYGEN__) 68 | #define HAL_USE_DAC FALSE 69 | #endif 70 | 71 | /** 72 | * @brief Enables the GPT subsystem. 73 | */ 74 | #if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) 75 | #define HAL_USE_GPT FALSE 76 | #endif 77 | 78 | /** 79 | * @brief Enables the I2C subsystem. 80 | */ 81 | #if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) 82 | #define HAL_USE_I2C TRUE 83 | #endif 84 | 85 | /** 86 | * @brief Enables the I2S subsystem. 87 | */ 88 | #if !defined(HAL_USE_I2S) || defined(__DOXYGEN__) 89 | #define HAL_USE_I2S FALSE 90 | #endif 91 | 92 | /** 93 | * @brief Enables the ICU subsystem. 94 | */ 95 | #if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) 96 | #define HAL_USE_ICU FALSE 97 | #endif 98 | 99 | /** 100 | * @brief Enables the MAC subsystem. 101 | */ 102 | #if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) 103 | #define HAL_USE_MAC FALSE 104 | #endif 105 | 106 | /** 107 | * @brief Enables the MMC_SPI subsystem. 108 | */ 109 | #if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) 110 | #define HAL_USE_MMC_SPI FALSE 111 | #endif 112 | 113 | /** 114 | * @brief Enables the PWM subsystem. 115 | */ 116 | #if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) 117 | #define HAL_USE_PWM TRUE 118 | #endif 119 | 120 | /** 121 | * @brief Enables the RTC subsystem. 122 | */ 123 | #if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) 124 | #define HAL_USE_RTC FALSE 125 | #endif 126 | 127 | /** 128 | * @brief Enables the SDC subsystem. 129 | */ 130 | #if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) 131 | #define HAL_USE_SDC FALSE 132 | #endif 133 | 134 | /** 135 | * @brief Enables the SERIAL subsystem. 136 | */ 137 | #if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) 138 | #define HAL_USE_SERIAL FALSE 139 | #endif 140 | 141 | /** 142 | * @brief Enables the SERIAL over USB subsystem. 143 | */ 144 | #if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) 145 | #define HAL_USE_SERIAL_USB FALSE 146 | #endif 147 | 148 | /** 149 | * @brief Enables the SIO subsystem. 150 | */ 151 | #if !defined(HAL_USE_SIO) || defined(__DOXYGEN__) 152 | #define HAL_USE_SIO FALSE 153 | #endif 154 | 155 | /** 156 | * @brief Enables the SPI subsystem. 157 | */ 158 | #if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) 159 | #define HAL_USE_SPI TRUE 160 | #endif 161 | 162 | /** 163 | * @brief Enables the TRNG subsystem. 164 | */ 165 | #if !defined(HAL_USE_TRNG) || defined(__DOXYGEN__) 166 | #define HAL_USE_TRNG FALSE 167 | #endif 168 | 169 | /** 170 | * @brief Enables the UART subsystem. 171 | */ 172 | #if !defined(HAL_USE_UART) || defined(__DOXYGEN__) 173 | #define HAL_USE_UART FALSE 174 | #endif 175 | 176 | /** 177 | * @brief Enables the USB subsystem. 178 | */ 179 | #if !defined(HAL_USE_USB) || defined(__DOXYGEN__) 180 | #define HAL_USE_USB TRUE 181 | #endif 182 | 183 | /** 184 | * @brief Enables the WDG subsystem. 185 | */ 186 | #if !defined(HAL_USE_WDG) || defined(__DOXYGEN__) 187 | #define HAL_USE_WDG FALSE 188 | #endif 189 | 190 | /** 191 | * @brief Enables the WSPI subsystem. 192 | */ 193 | #if !defined(HAL_USE_WSPI) || defined(__DOXYGEN__) 194 | #define HAL_USE_WSPI FALSE 195 | #endif 196 | 197 | /*===========================================================================*/ 198 | /* PAL driver related settings. */ 199 | /*===========================================================================*/ 200 | 201 | /** 202 | * @brief Enables synchronous APIs. 203 | * @note Disabling this option saves both code and data space. 204 | */ 205 | #if !defined(PAL_USE_CALLBACKS) || defined(__DOXYGEN__) 206 | #define PAL_USE_CALLBACKS FALSE 207 | #endif 208 | 209 | /** 210 | * @brief Enables synchronous APIs. 211 | * @note Disabling this option saves both code and data space. 212 | */ 213 | #if !defined(PAL_USE_WAIT) || defined(__DOXYGEN__) 214 | #define PAL_USE_WAIT FALSE 215 | #endif 216 | 217 | /*===========================================================================*/ 218 | /* ADC driver related settings. */ 219 | /*===========================================================================*/ 220 | 221 | /** 222 | * @brief Enables synchronous APIs. 223 | * @note Disabling this option saves both code and data space. 224 | */ 225 | #if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) 226 | #define ADC_USE_WAIT TRUE 227 | #endif 228 | 229 | /** 230 | * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. 231 | * @note Disabling this option saves both code and data space. 232 | */ 233 | #if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) 234 | #define ADC_USE_MUTUAL_EXCLUSION TRUE 235 | #endif 236 | 237 | /*===========================================================================*/ 238 | /* CAN driver related settings. */ 239 | /*===========================================================================*/ 240 | 241 | /** 242 | * @brief Sleep mode related APIs inclusion switch. 243 | */ 244 | #if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) 245 | #define CAN_USE_SLEEP_MODE TRUE 246 | #endif 247 | 248 | /** 249 | * @brief Enforces the driver to use direct callbacks rather than OSAL events. 250 | */ 251 | #if !defined(CAN_ENFORCE_USE_CALLBACKS) || defined(__DOXYGEN__) 252 | #define CAN_ENFORCE_USE_CALLBACKS FALSE 253 | #endif 254 | 255 | /*===========================================================================*/ 256 | /* CRY driver related settings. */ 257 | /*===========================================================================*/ 258 | 259 | /** 260 | * @brief Enables the SW fall-back of the cryptographic driver. 261 | * @details When enabled, this option, activates a fall-back software 262 | * implementation for algorithms not supported by the underlying 263 | * hardware. 264 | * @note Fall-back implementations may not be present for all algorithms. 265 | */ 266 | #if !defined(HAL_CRY_USE_FALLBACK) || defined(__DOXYGEN__) 267 | #define HAL_CRY_USE_FALLBACK FALSE 268 | #endif 269 | 270 | /** 271 | * @brief Makes the driver forcibly use the fall-back implementations. 272 | */ 273 | #if !defined(HAL_CRY_ENFORCE_FALLBACK) || defined(__DOXYGEN__) 274 | #define HAL_CRY_ENFORCE_FALLBACK FALSE 275 | #endif 276 | 277 | /*===========================================================================*/ 278 | /* DAC driver related settings. */ 279 | /*===========================================================================*/ 280 | 281 | /** 282 | * @brief Enables synchronous APIs. 283 | * @note Disabling this option saves both code and data space. 284 | */ 285 | #if !defined(DAC_USE_WAIT) || defined(__DOXYGEN__) 286 | #define DAC_USE_WAIT TRUE 287 | #endif 288 | 289 | /** 290 | * @brief Enables the @p dacAcquireBus() and @p dacReleaseBus() APIs. 291 | * @note Disabling this option saves both code and data space. 292 | */ 293 | #if !defined(DAC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) 294 | #define DAC_USE_MUTUAL_EXCLUSION TRUE 295 | #endif 296 | 297 | /*===========================================================================*/ 298 | /* I2C driver related settings. */ 299 | /*===========================================================================*/ 300 | 301 | /** 302 | * @brief Enables the mutual exclusion APIs on the I2C bus. 303 | */ 304 | #if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) 305 | #define I2C_USE_MUTUAL_EXCLUSION TRUE 306 | #endif 307 | 308 | /*===========================================================================*/ 309 | /* MAC driver related settings. */ 310 | /*===========================================================================*/ 311 | 312 | /** 313 | * @brief Enables the zero-copy API. 314 | */ 315 | #if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) 316 | #define MAC_USE_ZERO_COPY FALSE 317 | #endif 318 | 319 | /** 320 | * @brief Enables an event sources for incoming packets. 321 | */ 322 | #if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) 323 | #define MAC_USE_EVENTS TRUE 324 | #endif 325 | 326 | /*===========================================================================*/ 327 | /* MMC_SPI driver related settings. */ 328 | /*===========================================================================*/ 329 | 330 | /** 331 | * @brief Delays insertions. 332 | * @details If enabled this options inserts delays into the MMC waiting 333 | * routines releasing some extra CPU time for the threads with 334 | * lower priority, this may slow down the driver a bit however. 335 | * This option is recommended also if the SPI driver does not 336 | * use a DMA channel and heavily loads the CPU. 337 | */ 338 | #if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) 339 | #define MMC_NICE_WAITING TRUE 340 | #endif 341 | 342 | /*===========================================================================*/ 343 | /* SDC driver related settings. */ 344 | /*===========================================================================*/ 345 | 346 | /** 347 | * @brief Number of initialization attempts before rejecting the card. 348 | * @note Attempts are performed at 10mS intervals. 349 | */ 350 | #if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) 351 | #define SDC_INIT_RETRY 100 352 | #endif 353 | 354 | /** 355 | * @brief Include support for MMC cards. 356 | * @note MMC support is not yet implemented so this option must be kept 357 | * at @p FALSE. 358 | */ 359 | #if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) 360 | #define SDC_MMC_SUPPORT FALSE 361 | #endif 362 | 363 | /** 364 | * @brief Delays insertions. 365 | * @details If enabled this options inserts delays into the MMC waiting 366 | * routines releasing some extra CPU time for the threads with 367 | * lower priority, this may slow down the driver a bit however. 368 | */ 369 | #if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) 370 | #define SDC_NICE_WAITING TRUE 371 | #endif 372 | 373 | /** 374 | * @brief OCR initialization constant for V20 cards. 375 | */ 376 | #if !defined(SDC_INIT_OCR_V20) || defined(__DOXYGEN__) 377 | #define SDC_INIT_OCR_V20 0x50FF8000U 378 | #endif 379 | 380 | /** 381 | * @brief OCR initialization constant for non-V20 cards. 382 | */ 383 | #if !defined(SDC_INIT_OCR) || defined(__DOXYGEN__) 384 | #define SDC_INIT_OCR 0x80100000U 385 | #endif 386 | 387 | /*===========================================================================*/ 388 | /* SERIAL driver related settings. */ 389 | /*===========================================================================*/ 390 | 391 | /** 392 | * @brief Default bit rate. 393 | * @details Configuration parameter, this is the baud rate selected for the 394 | * default configuration. 395 | */ 396 | #if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) 397 | #define SERIAL_DEFAULT_BITRATE 38400 398 | #endif 399 | 400 | /** 401 | * @brief Serial buffers size. 402 | * @details Configuration parameter, you can change the depth of the queue 403 | * buffers depending on the requirements of your application. 404 | * @note The default is 16 bytes for both the transmission and receive 405 | * buffers. 406 | */ 407 | #if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) 408 | #define SERIAL_BUFFERS_SIZE 16 409 | #endif 410 | 411 | /*===========================================================================*/ 412 | /* SERIAL_USB driver related setting. */ 413 | /*===========================================================================*/ 414 | 415 | /** 416 | * @brief Serial over USB buffers size. 417 | * @details Configuration parameter, the buffer size must be a multiple of 418 | * the USB data endpoint maximum packet size. 419 | * @note The default is 256 bytes for both the transmission and receive 420 | * buffers. 421 | */ 422 | #if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) 423 | #define SERIAL_USB_BUFFERS_SIZE 1 424 | #endif 425 | 426 | /** 427 | * @brief Serial over USB number of buffers. 428 | * @note The default is 2 buffers. 429 | */ 430 | #if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__) 431 | #define SERIAL_USB_BUFFERS_NUMBER 2 432 | #endif 433 | 434 | /*===========================================================================*/ 435 | /* SPI driver related settings. */ 436 | /*===========================================================================*/ 437 | 438 | /** 439 | * @brief Enables synchronous APIs. 440 | * @note Disabling this option saves both code and data space. 441 | */ 442 | #if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) 443 | #define SPI_USE_WAIT TRUE 444 | #endif 445 | 446 | /** 447 | * @brief Enables circular transfers APIs. 448 | * @note Disabling this option saves both code and data space. 449 | */ 450 | #if !defined(SPI_USE_CIRCULAR) || defined(__DOXYGEN__) 451 | #define SPI_USE_CIRCULAR FALSE 452 | #endif 453 | 454 | 455 | /** 456 | * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. 457 | * @note Disabling this option saves both code and data space. 458 | */ 459 | #if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) 460 | #define SPI_USE_MUTUAL_EXCLUSION TRUE 461 | #endif 462 | 463 | /** 464 | * @brief Handling method for SPI CS line. 465 | * @note Disabling this option saves both code and data space. 466 | */ 467 | #if !defined(SPI_SELECT_MODE) || defined(__DOXYGEN__) 468 | #define SPI_SELECT_MODE SPI_SELECT_MODE_PAD 469 | #endif 470 | 471 | /*===========================================================================*/ 472 | /* UART driver related settings. */ 473 | /*===========================================================================*/ 474 | 475 | /** 476 | * @brief Enables synchronous APIs. 477 | * @note Disabling this option saves both code and data space. 478 | */ 479 | #if !defined(UART_USE_WAIT) || defined(__DOXYGEN__) 480 | #define UART_USE_WAIT FALSE 481 | #endif 482 | 483 | /** 484 | * @brief Enables the @p uartAcquireBus() and @p uartReleaseBus() APIs. 485 | * @note Disabling this option saves both code and data space. 486 | */ 487 | #if !defined(UART_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) 488 | #define UART_USE_MUTUAL_EXCLUSION FALSE 489 | #endif 490 | 491 | /*===========================================================================*/ 492 | /* USB driver related settings. */ 493 | /*===========================================================================*/ 494 | 495 | /** 496 | * @brief Enables synchronous APIs. 497 | * @note Disabling this option saves both code and data space. 498 | */ 499 | #if !defined(USB_USE_WAIT) || defined(__DOXYGEN__) 500 | #define USB_USE_WAIT TRUE 501 | #endif 502 | 503 | /*===========================================================================*/ 504 | /* WSPI driver related settings. */ 505 | /*===========================================================================*/ 506 | 507 | /** 508 | * @brief Enables synchronous APIs. 509 | * @note Disabling this option saves both code and data space. 510 | */ 511 | #if !defined(WSPI_USE_WAIT) || defined(__DOXYGEN__) 512 | #define WSPI_USE_WAIT TRUE 513 | #endif 514 | 515 | /** 516 | * @brief Enables the @p wspiAcquireBus() and @p wspiReleaseBus() APIs. 517 | * @note Disabling this option saves both code and data space. 518 | */ 519 | #if !defined(WSPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) 520 | #define WSPI_USE_MUTUAL_EXCLUSION TRUE 521 | #endif 522 | 523 | #endif /* HALCONF_H */ 524 | 525 | /** @} */ 526 | -------------------------------------------------------------------------------- /firmware/hub20/hub20.c: -------------------------------------------------------------------------------- 1 | /* Copyright 2020 joshajohnson 2 | * 3 | * This program is free software: you can redistribute it and/or modify 4 | * it under the terms of the GNU General Public License as published by 5 | * the Free Software Foundation, either version 2 of the License, or 6 | * (at your option) any later version. 7 | * 8 | * This program is distributed in the hope that it will be useful, 9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | * GNU General Public License for more details. 12 | * 13 | * You should have received a copy of the GNU General Public License 14 | * along with this program. If not, see . 15 | */ 16 | 17 | #include "hub20.h" 18 | 19 | -------------------------------------------------------------------------------- /firmware/hub20/hub20.h: -------------------------------------------------------------------------------- 1 | /* Copyright 2020 joshajohnson 2 | * 3 | * This program is free software: you can redistribute it and/or modify 4 | * it under the terms of the GNU General Public License as published by 5 | * the Free Software Foundation, either version 2 of the License, or 6 | * (at your option) any later version. 7 | * 8 | * This program is distributed in the hope that it will be useful, 9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | * GNU General Public License for more details. 12 | * 13 | * You should have received a copy of the GNU General Public License 14 | * along with this program. If not, see . 15 | */ 16 | 17 | #pragma once 18 | 19 | #include "quantum.h" 20 | 21 | #define ___ KC_NO 22 | 23 | /* This is a shortcut to help you visually see your layout. 24 | * 25 | * The first section contains all of the arguments representing the physical 26 | * layout of the board and position of the keys. 27 | * 28 | * The second converts the arguments into a two-dimensional array which 29 | * represents the switch matrix. 30 | */ 31 | 32 | #define LAYOUT_all( \ 33 | K01, K02, \ 34 | K10, K11, K12, K13, \ 35 | K20, K21, K22, K23, \ 36 | K30, K31, K32, K33, \ 37 | K40, K41, K42, K43, \ 38 | K50, K51, K52, K53 \ 39 | ) \ 40 | { \ 41 | { ___, K01, K02, ___, }, \ 42 | { K10, K11, K12, K13, }, \ 43 | { K20, K21, K22, K23, }, \ 44 | { K30, K31, K32, K33, }, \ 45 | { K40, K41, K42, K43, }, \ 46 | { K50, K51, K52, K53, }, \ 47 | } 48 | -------------------------------------------------------------------------------- /firmware/hub20/info.json: -------------------------------------------------------------------------------- 1 | { 2 | "keyboard_name": "Hub20", 3 | "keyboard_folder": "hub20", 4 | "url": "https://github.com/joshajohnson/hub20", 5 | "maintainer": "joshajohnson", 6 | "width": 4, 7 | "height": 6, 8 | "layouts": { 9 | "LAYOUT_all": { 10 | "layout": [ 11 | {"label":"Mute", "x":0.5, "y":0}, 12 | {"label":"Play / Pause", "x":2.5, "y":0}, 13 | {"label":"-", "x":0, "y":1}, 14 | {"label":"*", "x":1, "y":1}, 15 | {"label":"/", "x":2, "y":1}, 16 | {"label":"Numlock", "x":3, "y":1}, 17 | {"label":"+", "x":0, "y":2}, 18 | {"label":"7", "x":1, "y":2}, 19 | {"label":"8", "x":2, "y":2}, 20 | {"label":"9", "x":3, "y":2}, 21 | {"label":"+", "x":0, "y":3}, 22 | {"label":"4", "x":1, "y":3}, 23 | {"label":"5", "x":2, "y":3}, 24 | {"label":"6", "x":3, "y":3}, 25 | {"label":"Enter", "x":0, "y":4}, 26 | {"label":"1", "x":1, "y":4}, 27 | {"label":"2", "x":2, "y":4}, 28 | {"label":"3", "x":3, "y":4}, 29 | {"label":"Enter", "x":0, "y":5}, 30 | {"label":".", "x":1, "y":5}, 31 | {"label":"0", "x":2, "y":5}, 32 | {"label":"0", "x":3, "y":5} 33 | ] 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /firmware/hub20/keymaps/default/keymap.c: -------------------------------------------------------------------------------- 1 | /* Copyright 2020 joshajohnson 2 | * 3 | * This program is free software: you can redistribute it and/or modify 4 | * it under the terms of the GNU General Public License as published by 5 | * the Free Software Foundation, either version 2 of the License, or 6 | * (at your option) any later version. 7 | * 8 | * This program is distributed in the hope that it will be useful, 9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | * GNU General Public License for more details. 12 | * 13 | * You should have received a copy of the GNU General Public License 14 | * along with this program. If not, see . 15 | */ 16 | #include QMK_KEYBOARD_H 17 | 18 | #define MO_NLCK LT(1, KC_NLCK) // Numlock on tap, layer change on hold 19 | 20 | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 21 | [0] = LAYOUT_all( \ 22 | KC_MUTE, KC_MPLY, 23 | KC_PMNS, KC_PAST, KC_PSLS, MO_NLCK, \ 24 | KC_PPLS, KC_P7, KC_P8, KC_P9, \ 25 | KC_PPLS, KC_P4, KC_P5, KC_P6, \ 26 | KC_PENT, KC_P1, KC_P2, KC_P3, \ 27 | KC_PENT, KC_PDOT, KC_P0, KC_P0 \ 28 | ), 29 | [1] = LAYOUT_all( \ 30 | RESET, _______, 31 | RGB_TOG, RGB_RMOD, RGB_MOD, _______, \ 32 | _______, RGB_VAD, RGB_VAI, _______, \ 33 | _______, RGB_HUD, RGB_HUI, _______, \ 34 | _______, RGB_SAD, RGB_SAI, _______, \ 35 | _______, _______, _______, _______ \ 36 | ), 37 | [2] = LAYOUT_all( \ 38 | _______, _______, 39 | _______, _______, _______, _______, \ 40 | _______, _______, _______, _______, \ 41 | _______, _______, _______, _______, \ 42 | _______, _______, _______, _______, \ 43 | _______, _______, _______, _______ \ 44 | ), 45 | [3] = LAYOUT_all( \ 46 | _______, _______, 47 | _______, _______, _______, _______, \ 48 | _______, _______, _______, _______, \ 49 | _______, _______, _______, _______, \ 50 | _______, _______, _______, _______, \ 51 | _______, _______, _______, _______ \ 52 | ) 53 | }; 54 | 55 | void encoder_update_user(uint8_t index, bool clockwise) { 56 | if (index == 0) { /* Left Encoder */ 57 | if (clockwise) { 58 | tap_code(KC_VOLU); 59 | } else { 60 | tap_code(KC_VOLD); 61 | } 62 | } else if (index == 1) { /* Right Encoder */ 63 | if (clockwise) { 64 | tap_code(KC_MNXT); 65 | } else { 66 | tap_code(KC_MPRV); 67 | } 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /firmware/hub20/keymaps/macro/keymap.c: -------------------------------------------------------------------------------- 1 | /* Copyright 2020 joshajohnson 2 | * 3 | * This program is free software: you can redistribute it and/or modify 4 | * it under the terms of the GNU General Public License as published by 5 | * the Free Software Foundation, either version 2 of the License, or 6 | * (at your option) any later version. 7 | * 8 | * This program is distributed in the hope that it will be useful, 9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | * GNU General Public License for more details. 12 | * 13 | * You should have received a copy of the GNU General Public License 14 | * along with this program. If not, see . 15 | */ 16 | #include QMK_KEYBOARD_H 17 | 18 | // Function key we are 'wrapping' usual key presses in 19 | #define KC_WRAP KC_F23 20 | 21 | // Keyboard Layers 22 | enum keyboard_layers{ 23 | _BASE = 0, 24 | _CTRL 25 | }; 26 | 27 | // Tap Dance stuff 28 | void td_ctrl (qk_tap_dance_state_t *state, void *user_data); 29 | 30 | enum tap_dance { 31 | CTRL = 0, 32 | BASE = 1 33 | }; 34 | 35 | qk_tap_dance_action_t tap_dance_actions[] = { 36 | // Tap once for standard key, twice to toggle layers 37 | [CTRL] = ACTION_TAP_DANCE_FN(td_ctrl), 38 | [BASE] = ACTION_TAP_DANCE_LAYER_MOVE(_______, _BASE) 39 | }; 40 | 41 | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 42 | [_BASE] = LAYOUT_all( \ 43 | KC_W, KC_Z, 44 | KC_A, KC_B, KC_C, TD(CTRL), \ 45 | KC_E, KC_F, KC_G, KC_H, \ 46 | KC_I, KC_J, KC_K, KC_L, \ 47 | KC_M, KC_N, KC_O, KC_P, \ 48 | KC_Q, KC_R, KC_S, KC_T \ 49 | ), 50 | [_CTRL] = LAYOUT_all( \ 51 | RESET, _______, 52 | RGB_TOG, RGB_RMOD, RGB_MOD, TD(BASE), \ 53 | _______, RGB_VAD, RGB_VAI, _______, \ 54 | _______, RGB_HUD, RGB_HUI, _______, \ 55 | _______, RGB_SAD, RGB_SAI, _______, \ 56 | _______, _______, _______, _______ \ 57 | ) 58 | }; 59 | 60 | // Keyboard is setup to 'wrap' the pressed key with an unused Fxx key, 61 | // allowing for easy differentiation from a real keyboard. 62 | void encoder_update_user(uint8_t index, bool clockwise) { 63 | if (index == 0) { /* Left Encoder */ 64 | if (clockwise) { 65 | register_code(KC_WRAP); 66 | tap_code(KC_U); 67 | unregister_code(KC_WRAP); 68 | } else { 69 | register_code(KC_WRAP); 70 | tap_code(KC_V); 71 | unregister_code(KC_WRAP); 72 | } 73 | } else if (index == 1) { /* Right Encoder */ 74 | if (clockwise) { 75 | register_code(KC_WRAP); 76 | tap_code(KC_X); 77 | unregister_code(KC_WRAP); 78 | } else { 79 | register_code(KC_WRAP); 80 | tap_code(KC_Y); 81 | unregister_code(KC_WRAP); 82 | } 83 | } 84 | } 85 | 86 | // Below stolen from TaranVH (https://github.com/TaranVH/2nd-keyboard/blob/master/HASU_USB/F24/keymap.c) 87 | // Shoutout to drashna on the QMK discord for basically writing this for me.... :P 88 | bool process_record_user(uint16_t keycode, keyrecord_t *record) { 89 | static uint8_t f23_tracker; 90 | switch (keycode) { 91 | // Wrap sent keys in KC_WRAP 92 | case KC_A ... KC_F22: 93 | case KC_EXECUTE ... KC_EXSEL: 94 | if (record->event.pressed) { 95 | register_code(KC_WRAP); 96 | f23_tracker++; 97 | register_code(keycode); 98 | } else { 99 | unregister_code(keycode); 100 | f23_tracker--; 101 | if (!f23_tracker) { 102 | unregister_code(KC_WRAP); 103 | } 104 | } 105 | return false; 106 | break; 107 | } 108 | return true; 109 | } 110 | 111 | // Below works around TD() not running key press through process_record_user 112 | void td_ctrl (qk_tap_dance_state_t *state, void *user_data) { 113 | if (state->count == 1) { 114 | register_code(KC_WRAP); 115 | tap_code(KC_D); 116 | unregister_code(KC_WRAP); 117 | } else if (state->count == 2) { 118 | layer_move(_CTRL); 119 | } 120 | } 121 | -------------------------------------------------------------------------------- /firmware/hub20/keymaps/macro/rules.mk: -------------------------------------------------------------------------------- 1 | TAP_DANCE_ENABLE = yes 2 | -------------------------------------------------------------------------------- /firmware/hub20/keymaps/via/keymap.c: -------------------------------------------------------------------------------- 1 | /* Copyright 2020 joshajohnson 2 | * 3 | * This program is free software: you can redistribute it and/or modify 4 | * it under the terms of the GNU General Public License as published by 5 | * the Free Software Foundation, either version 2 of the License, or 6 | * (at your option) any later version. 7 | * 8 | * This program is distributed in the hope that it will be useful, 9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | * GNU General Public License for more details. 12 | * 13 | * You should have received a copy of the GNU General Public License 14 | * along with this program. If not, see . 15 | */ 16 | #include QMK_KEYBOARD_H 17 | 18 | #define MO_NLCK LT(1, KC_NLCK) 19 | 20 | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 21 | [0] = LAYOUT_all( \ 22 | KC_MUTE, KC_MPLY, 23 | KC_PMNS, KC_PAST, KC_PSLS, MO_NLCK, \ 24 | KC_PPLS, KC_P7, KC_P8, KC_P9, \ 25 | KC_PPLS, KC_P4, KC_P5, KC_P6, \ 26 | KC_PENT, KC_P1, KC_P2, KC_P3, \ 27 | KC_PENT, KC_PDOT, KC_P0, KC_P0 \ 28 | ), 29 | [1] = LAYOUT_all( \ 30 | RESET, _______, 31 | RGB_TOG, RGB_RMOD, RGB_MOD, _______, \ 32 | _______, RGB_VAD, RGB_VAI, _______, \ 33 | _______, RGB_HUD, RGB_HUI, _______, \ 34 | _______, RGB_SAD, RGB_SAI, _______, \ 35 | _______, _______, _______, _______ \ 36 | ), 37 | [2] = LAYOUT_all( \ 38 | _______, _______, 39 | _______, _______, _______, _______, \ 40 | _______, _______, _______, _______, \ 41 | _______, _______, _______, _______, \ 42 | _______, _______, _______, _______, \ 43 | _______, _______, _______, _______ \ 44 | ), 45 | [3] = LAYOUT_all( \ 46 | _______, _______, 47 | _______, _______, _______, _______, \ 48 | _______, _______, _______, _______, \ 49 | _______, _______, _______, _______, \ 50 | _______, _______, _______, _______, \ 51 | _______, _______, _______, _______ \ 52 | ) 53 | }; 54 | 55 | void encoder_update_user(uint8_t index, bool clockwise) { 56 | if (index == 0) { /* Left Encoder */ 57 | if (clockwise) { 58 | tap_code(KC_VOLU); 59 | } else { 60 | tap_code(KC_VOLD); 61 | } 62 | } else if (index == 1) { /* Right Encoder */ 63 | if (clockwise) { 64 | tap_code(KC_MNXT); 65 | } else { 66 | tap_code(KC_MPRV); 67 | } 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /firmware/hub20/keymaps/via/rules.mk: -------------------------------------------------------------------------------- 1 | VIA_ENABLE = yes 2 | -------------------------------------------------------------------------------- /firmware/hub20/mcuconf.h: -------------------------------------------------------------------------------- 1 | /* 2 | ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */ 16 | 17 | #ifndef _MCUCONF_H_ 18 | #define _MCUCONF_H_ 19 | 20 | /* 21 | * STM32F0xx drivers configuration. 22 | * The following settings override the default settings present in 23 | * the various device driver implementation headers. 24 | * Note that the settings for each driver only have effect if the whole 25 | * driver is enabled in halconf.h. 26 | * 27 | * IRQ priorities: 28 | * 3...0 Lowest...Highest. 29 | * 30 | * DMA priorities: 31 | * 0...3 Lowest...Highest. 32 | */ 33 | 34 | #define STM32F0xx_MCUCONF 35 | // #define STM32F070xB 36 | 37 | /* 38 | * HAL driver system settings. 39 | */ 40 | #define STM32_NO_INIT FALSE 41 | #define STM32_PVD_ENABLE FALSE 42 | #define STM32_PLS STM32_PLS_LEV0 43 | #define STM32_HSI_ENABLED TRUE 44 | #define STM32_HSI14_ENABLED TRUE 45 | #define STM32_HSI48_ENABLED FALSE 46 | #define STM32_LSI_ENABLED TRUE 47 | #define STM32_HSE_ENABLED FALSE 48 | #define STM32_LSE_ENABLED FALSE 49 | #define STM32_SW STM32_SW_PLL 50 | #define STM32_PLLSRC STM32_PLLSRC_HSI_DIV2 51 | #define STM32_PREDIV_VALUE 1 52 | #define STM32_PLLMUL_VALUE 12 53 | #define STM32_HPRE STM32_HPRE_DIV1 54 | #define STM32_PPRE STM32_PPRE_DIV1 55 | #define STM32_ADCSW STM32_ADCSW_HSI14 56 | #define STM32_ADCPRE STM32_ADCPRE_DIV4 57 | #define STM32_MCOSEL STM32_MCOSEL_NOCLOCK 58 | #define STM32_ADCPRE STM32_ADCPRE_DIV4 59 | #define STM32_ADCSW STM32_ADCSW_HSI14 60 | #define STM32_USBSW STM32_USBSW_HSI48 61 | #define STM32_CECSW STM32_CECSW_HSI 62 | #define STM32_I2C1SW STM32_I2C1SW_HSI 63 | #define STM32_USART1SW STM32_USART1SW_PCLK 64 | #define STM32_RTCSEL STM32_RTCSEL_LSI 65 | 66 | /* 67 | * ADC driver system settings. 68 | */ 69 | #define STM32_ADC_USE_ADC1 FALSE 70 | #define STM32_ADC_ADC1_DMA_PRIORITY 2 71 | #define STM32_ADC_IRQ_PRIORITY 2 72 | #define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 2 73 | 74 | /* 75 | * EXT driver system settings. 76 | */ 77 | #define STM32_EXT_EXTI0_1_IRQ_PRIORITY 3 78 | #define STM32_EXT_EXTI2_3_IRQ_PRIORITY 3 79 | #define STM32_EXT_EXTI4_15_IRQ_PRIORITY 3 80 | #define STM32_EXT_EXTI16_IRQ_PRIORITY 3 81 | #define STM32_EXT_EXTI17_IRQ_PRIORITY 3 82 | 83 | /* 84 | * GPT driver system settings. 85 | */ 86 | #define STM32_GPT_USE_TIM1 FALSE 87 | #define STM32_GPT_USE_TIM2 FALSE 88 | #define STM32_GPT_USE_TIM3 FALSE 89 | #define STM32_GPT_USE_TIM14 FALSE 90 | #define STM32_GPT_TIM1_IRQ_PRIORITY 2 91 | #define STM32_GPT_TIM2_IRQ_PRIORITY 2 92 | #define STM32_GPT_TIM3_IRQ_PRIORITY 2 93 | #define STM32_GPT_TIM14_IRQ_PRIORITY 2 94 | 95 | /* 96 | * I2C driver system settings. 97 | */ 98 | #define STM32_I2C_USE_I2C1 TRUE 99 | #define STM32_I2C_USE_I2C2 FALSE 100 | #define STM32_I2C_BUSY_TIMEOUT 50 101 | #define STM32_I2C_I2C1_IRQ_PRIORITY 3 102 | #define STM32_I2C_I2C2_IRQ_PRIORITY 3 103 | #define STM32_I2C_USE_DMA TRUE 104 | #define STM32_I2C_I2C1_DMA_PRIORITY 1 105 | #define STM32_I2C_I2C2_DMA_PRIORITY 1 106 | #define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7) 107 | #define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6) 108 | #define STM32_I2C_DMA_ERROR_HOOK(i2cp) osalSysHalt("DMA failure") 109 | 110 | /* 111 | * ICU driver system settings. 112 | */ 113 | #define STM32_ICU_USE_TIM1 FALSE 114 | #define STM32_ICU_USE_TIM2 FALSE 115 | #define STM32_ICU_USE_TIM3 FALSE 116 | #define STM32_ICU_TIM1_IRQ_PRIORITY 3 117 | #define STM32_ICU_TIM2_IRQ_PRIORITY 3 118 | #define STM32_ICU_TIM3_IRQ_PRIORITY 3 119 | 120 | /* 121 | * PWM driver system settings. 122 | */ 123 | #define STM32_PWM_USE_ADVANCED FALSE 124 | #define STM32_PWM_USE_TIM1 FALSE 125 | #define STM32_PWM_USE_TIM2 FALSE 126 | #define STM32_PWM_USE_TIM3 TRUE 127 | #define STM32_PWM_TIM1_IRQ_PRIORITY 3 128 | #define STM32_PWM_TIM2_IRQ_PRIORITY 3 129 | #define STM32_PWM_TIM3_IRQ_PRIORITY 3 130 | 131 | /* 132 | * SERIAL driver system settings. 133 | */ 134 | #define STM32_SERIAL_USE_USART1 FALSE 135 | #define STM32_SERIAL_USE_USART2 FALSE 136 | #define STM32_SERIAL_USART1_PRIORITY 3 137 | #define STM32_SERIAL_USART2_PRIORITY 3 138 | 139 | /* 140 | * SPI driver system settings. 141 | */ 142 | #define STM32_SPI_USE_SPI1 FALSE 143 | #define STM32_SPI_USE_SPI2 TRUE 144 | #define STM32_SPI_SPI1_DMA_PRIORITY 1 145 | #define STM32_SPI_SPI2_DMA_PRIORITY 1 146 | #define STM32_SPI_SPI1_IRQ_PRIORITY 2 147 | #define STM32_SPI_SPI2_IRQ_PRIORITY 2 148 | #define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4) 149 | #define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5) 150 | #define STM32_SPI_DMA_ERROR_HOOK(spip) osalSysHalt("DMA failure") 151 | 152 | /* 153 | * ST driver system settings. 154 | */ 155 | #define STM32_ST_IRQ_PRIORITY 2 156 | #define STM32_ST_USE_TIMER 2 157 | 158 | /* 159 | * UART driver system settings. 160 | */ 161 | #define STM32_UART_USE_USART1 FALSE 162 | #define STM32_UART_USE_USART2 FALSE 163 | #define STM32_UART_USART1_IRQ_PRIORITY 3 164 | #define STM32_UART_USART2_IRQ_PRIORITY 3 165 | #define STM32_UART_USART1_DMA_PRIORITY 0 166 | #define STM32_UART_USART2_DMA_PRIORITY 0 167 | #define STM32_UART_DMA_ERROR_HOOK(uartp) osalSysHalt("DMA failure") 168 | 169 | /* 170 | * USB driver system settings. 171 | */ 172 | #define STM32_USB_USE_USB1 TRUE 173 | #define STM32_USB_LOW_POWER_ON_SUSPEND FALSE 174 | #define STM32_USB_USB1_LP_IRQ_PRIORITY 3 175 | 176 | #endif /* _MCUCONF_H_ */ 177 | -------------------------------------------------------------------------------- /firmware/hub20/readme.md: -------------------------------------------------------------------------------- 1 | # Hub20 2 | 3 | Hub20 is a 20 key macro pad with an inbuilt USB 2.0 hub and dual rotary encoders. It can be configured to be a left / right hand numberpad, along with a 4x5 1u layout. 4 | 5 | For more information regarding the keyboard, please visit the [Hub20 Website](https://www.joshajohnson.com/hub20-keyboard/) or [GitHub Repo](https://github.com/joshajohnson/Hub20). 6 | 7 | * Keyboard Maintainer: [Josh Johnson](https://github.com/joshajohnson) 8 | * Hardware Supported: Hub20 PCB (STM32F072) 9 | * Hardware Availability: [Josh Johnson](https://www.joshajohnson.com/hub20-keyboard/) 10 | 11 | Make example for this keyboard (after setting up your build environment): 12 | 13 | make hub20:default 14 | 15 | See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). 16 | -------------------------------------------------------------------------------- /firmware/hub20/rules.mk: -------------------------------------------------------------------------------- 1 | # MCU name 2 | MCU = STM32F072 3 | 4 | BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration 5 | MOUSEKEY_ENABLE = yes # Mouse keys 6 | EXTRAKEY_ENABLE = yes # Audio control and System control 7 | CONSOLE_ENABLE = yes # Console for debug 8 | COMMAND_ENABLE = yes # Commands for debug and configuration 9 | SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend 10 | NKRO_ENABLE = yes # USB Nkey Rollover 11 | CUSTOM_MATRIX = no # Custom matrix file 12 | ENCODER_ENABLE = yes # Rotary Encoder support 13 | TAP_DANCE_ENABLE = no # Support for tap dancing 14 | RGBLIGHT_ENABLE = yes # Underglow 15 | 16 | # Enter lower-power sleep mode when on the ChibiOS idle thread 17 | OPT_DEFS += -DCORTEX_ENABLE_WFI_IDLE=TRUE 18 | -------------------------------------------------------------------------------- /hardware/0.1/.gitignore: -------------------------------------------------------------------------------- 1 | # For PCBs designed using KiCad: http://www.kicad-pcb.org/ 2 | # Format documentation: http://kicad-pcb.org/help/file-formats/ 3 | 4 | # Temporary files 5 | *.000 6 | *.bak 7 | *.bck 8 | *.kicad_pcb-bak 9 | *.sch-bak 10 | *~ 11 | _autosave-* 12 | *.tmp 13 | *-save.pro 14 | *-save.kicad_pcb 15 | fp-info-cache 16 | 17 | # Netlist files (exported from Eeschema) 18 | *.net 19 | 20 | # Autorouter files (exported from Pcbnew) 21 | *.dsn 22 | *.ses 23 | 24 | # Exported BOM files 25 | *.xml 26 | *.csv 27 | 28 | # Gerbers 29 | *.zip 30 | gerbers/* 31 | -------------------------------------------------------------------------------- /hardware/0.1/Hub20.pro: -------------------------------------------------------------------------------- 1 | update=Sun 05 Jul 2020 14:21:55 2 | version=1 3 | last_client=kicad 4 | [general] 5 | version=1 6 | RootSch= 7 | BoardNm= 8 | [cvpcb] 9 | version=1 10 | NetIExt=net 11 | [eeschema] 12 | version=1 13 | LibDir= 14 | [eeschema/libraries] 15 | [pcbnew] 16 | version=1 17 | PageLayoutDescrFile= 18 | LastNetListRead= 19 | CopperLayerCount=4 20 | BoardThickness=1.6 21 | AllowMicroVias=0 22 | AllowBlindVias=0 23 | RequireCourtyardDefinitions=0 24 | ProhibitOverlappingCourtyards=1 25 | MinTrackWidth=0.15 26 | MinViaDiameter=0.5 27 | MinViaDrill=0.25 28 | MinMicroViaDiameter=0.2 29 | MinMicroViaDrill=0.09999999999999999 30 | MinHoleToHole=0.25 31 | TrackWidth1=0.25 32 | TrackWidth2=0.2 33 | TrackWidth3=0.25 34 | TrackWidth4=0.3 35 | TrackWidth5=0.4 36 | ViaDiameter1=0.5 37 | ViaDrill1=0.25 38 | ViaDiameter2=0.6 39 | ViaDrill2=0.3 40 | ViaDiameter3=0.8 41 | ViaDrill3=0.4 42 | dPairWidth1=0.25 43 | dPairGap1=0.2 44 | dPairViaGap1=0.25 45 | SilkLineWidth=0.15 46 | SilkTextSizeV=1 47 | SilkTextSizeH=1 48 | SilkTextSizeThickness=0.15 49 | SilkTextItalic=0 50 | SilkTextUpright=1 51 | CopperLineWidth=0.2 52 | CopperTextSizeV=1.5 53 | CopperTextSizeH=1.5 54 | CopperTextThickness=0.3 55 | CopperTextItalic=0 56 | CopperTextUpright=1 57 | EdgeCutLineWidth=0.09999999999999999 58 | CourtyardLineWidth=0.05 59 | OthersLineWidth=0.15 60 | OthersTextSizeV=1 61 | OthersTextSizeH=1 62 | OthersTextSizeThickness=0.15 63 | OthersTextItalic=0 64 | OthersTextUpright=1 65 | SolderMaskClearance=0 66 | SolderMaskMinWidth=0 67 | SolderPasteClearance=0 68 | SolderPasteRatio=-0 69 | [pcbnew/Layer.F.Cu] 70 | Name=F.Cu 71 | Type=0 72 | Enabled=1 73 | [pcbnew/Layer.In1.Cu] 74 | Name=In1.Cu 75 | Type=0 76 | Enabled=1 77 | [pcbnew/Layer.In2.Cu] 78 | Name=In2.Cu 79 | Type=0 80 | Enabled=1 81 | [pcbnew/Layer.In3.Cu] 82 | Name=In3.Cu 83 | Type=0 84 | Enabled=0 85 | [pcbnew/Layer.In4.Cu] 86 | Name=In4.Cu 87 | Type=0 88 | Enabled=0 89 | [pcbnew/Layer.In5.Cu] 90 | Name=In5.Cu 91 | Type=0 92 | Enabled=0 93 | [pcbnew/Layer.In6.Cu] 94 | Name=In6.Cu 95 | Type=0 96 | Enabled=0 97 | [pcbnew/Layer.In7.Cu] 98 | Name=In7.Cu 99 | Type=0 100 | Enabled=0 101 | [pcbnew/Layer.In8.Cu] 102 | Name=In8.Cu 103 | Type=0 104 | Enabled=0 105 | [pcbnew/Layer.In9.Cu] 106 | Name=In9.Cu 107 | Type=0 108 | Enabled=0 109 | [pcbnew/Layer.In10.Cu] 110 | Name=In10.Cu 111 | Type=0 112 | Enabled=0 113 | [pcbnew/Layer.In11.Cu] 114 | Name=In11.Cu 115 | Type=0 116 | Enabled=0 117 | [pcbnew/Layer.In12.Cu] 118 | Name=In12.Cu 119 | Type=0 120 | Enabled=0 121 | [pcbnew/Layer.In13.Cu] 122 | Name=In13.Cu 123 | Type=0 124 | Enabled=0 125 | [pcbnew/Layer.In14.Cu] 126 | Name=In14.Cu 127 | Type=0 128 | Enabled=0 129 | [pcbnew/Layer.In15.Cu] 130 | Name=In15.Cu 131 | Type=0 132 | Enabled=0 133 | [pcbnew/Layer.In16.Cu] 134 | Name=In16.Cu 135 | Type=0 136 | Enabled=0 137 | [pcbnew/Layer.In17.Cu] 138 | Name=In17.Cu 139 | Type=0 140 | Enabled=0 141 | [pcbnew/Layer.In18.Cu] 142 | Name=In18.Cu 143 | Type=0 144 | Enabled=0 145 | [pcbnew/Layer.In19.Cu] 146 | Name=In19.Cu 147 | Type=0 148 | Enabled=0 149 | [pcbnew/Layer.In20.Cu] 150 | Name=In20.Cu 151 | Type=0 152 | Enabled=0 153 | [pcbnew/Layer.In21.Cu] 154 | Name=In21.Cu 155 | Type=0 156 | Enabled=0 157 | [pcbnew/Layer.In22.Cu] 158 | Name=In22.Cu 159 | Type=0 160 | Enabled=0 161 | [pcbnew/Layer.In23.Cu] 162 | Name=In23.Cu 163 | Type=0 164 | Enabled=0 165 | [pcbnew/Layer.In24.Cu] 166 | Name=In24.Cu 167 | Type=0 168 | Enabled=0 169 | [pcbnew/Layer.In25.Cu] 170 | Name=In25.Cu 171 | Type=0 172 | Enabled=0 173 | [pcbnew/Layer.In26.Cu] 174 | Name=In26.Cu 175 | Type=0 176 | Enabled=0 177 | [pcbnew/Layer.In27.Cu] 178 | Name=In27.Cu 179 | Type=0 180 | Enabled=0 181 | [pcbnew/Layer.In28.Cu] 182 | Name=In28.Cu 183 | Type=0 184 | Enabled=0 185 | [pcbnew/Layer.In29.Cu] 186 | Name=In29.Cu 187 | Type=0 188 | Enabled=0 189 | [pcbnew/Layer.In30.Cu] 190 | Name=In30.Cu 191 | Type=0 192 | Enabled=0 193 | [pcbnew/Layer.B.Cu] 194 | Name=B.Cu 195 | Type=0 196 | Enabled=1 197 | [pcbnew/Layer.B.Adhes] 198 | Enabled=1 199 | [pcbnew/Layer.F.Adhes] 200 | Enabled=1 201 | [pcbnew/Layer.B.Paste] 202 | Enabled=1 203 | [pcbnew/Layer.F.Paste] 204 | Enabled=1 205 | [pcbnew/Layer.B.SilkS] 206 | Enabled=1 207 | [pcbnew/Layer.F.SilkS] 208 | Enabled=1 209 | [pcbnew/Layer.B.Mask] 210 | Enabled=1 211 | [pcbnew/Layer.F.Mask] 212 | Enabled=1 213 | [pcbnew/Layer.Dwgs.User] 214 | Enabled=1 215 | [pcbnew/Layer.Cmts.User] 216 | Enabled=1 217 | [pcbnew/Layer.Eco1.User] 218 | Enabled=1 219 | [pcbnew/Layer.Eco2.User] 220 | Enabled=1 221 | [pcbnew/Layer.Edge.Cuts] 222 | Enabled=1 223 | [pcbnew/Layer.Margin] 224 | Enabled=1 225 | [pcbnew/Layer.B.CrtYd] 226 | Enabled=1 227 | [pcbnew/Layer.F.CrtYd] 228 | Enabled=1 229 | [pcbnew/Layer.B.Fab] 230 | Enabled=1 231 | [pcbnew/Layer.F.Fab] 232 | Enabled=1 233 | [pcbnew/Layer.Rescue] 234 | Enabled=0 235 | [pcbnew/Netclasses] 236 | [pcbnew/Netclasses/Default] 237 | Name=Default 238 | Clearance=0.2 239 | TrackWidth=0.25 240 | ViaDiameter=0.5 241 | ViaDrill=0.25 242 | uViaDiameter=0.3 243 | uViaDrill=0.1 244 | dPairWidth=0.25 245 | dPairGap=0.2 246 | dPairViaGap=0.25 247 | [pcbnew/Netclasses/1] 248 | Name=Power 249 | Clearance=0.2 250 | TrackWidth=0.3 251 | ViaDiameter=0.6 252 | ViaDrill=0.3 253 | uViaDiameter=0.3 254 | uViaDrill=0.1 255 | dPairWidth=0.25 256 | dPairGap=0.2 257 | dPairViaGap=0.25 258 | -------------------------------------------------------------------------------- /hardware/0.1/fp-lib-table: -------------------------------------------------------------------------------- 1 | (fp_lib_table 2 | (lib (name josh-buttons-switches)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-buttons-switches.pretty)(options "")(descr "")) 3 | (lib (name josh-connectors)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-connectors.pretty)(options "")(descr "")) 4 | (lib (name josh-dfn-qfn)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-dfn-qfn.pretty)(options "")(descr "")) 5 | (lib (name josh-led)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-led.pretty)(options "")(descr "")) 6 | (lib (name josh-logos)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-logos.pretty)(options "")(descr "")) 7 | (lib (name josh-mechanical)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-mechanical.pretty)(options "")(descr "")) 8 | (lib (name josh-oscillators)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-oscillators.pretty)(options "")(descr "")) 9 | (lib (name josh-passives-smt)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-passives-smt.pretty)(options "")(descr "")) 10 | (lib (name josh-rf)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-rf.pretty)(options "")(descr "")) 11 | (lib (name josh-soic-sot-etc)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-soic-sot-etc.pretty)(options "")(descr "")) 12 | (lib (name josh-test-point)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-test-point.pretty)(options "")(descr "")) 13 | (lib (name josh-display)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-display.pretty)(options "")(descr "")) 14 | (lib (name josh-keyboard)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-keyboard.pretty)(options "")(descr "")) 15 | ) 16 | -------------------------------------------------------------------------------- /hardware/0.1/sym-lib-table: -------------------------------------------------------------------------------- 1 | (sym_lib_table 2 | (lib (name josh-ic)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-ic.lib)(options "")(descr "")) 3 | (lib (name josh-led)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-led.lib)(options "")(descr "")) 4 | (lib (name josh-logic)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-logic.lib)(options "")(descr "")) 5 | (lib (name josh-mechnanical)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-mechnanical.lib)(options "")(descr "")) 6 | (lib (name josh-memory)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-memory.lib)(options "")(descr "")) 7 | (lib (name josh-oscillator)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-oscillator.lib)(options "")(descr "")) 8 | (lib (name josh-passive)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-passive.lib)(options "")(descr "")) 9 | (lib (name josh-power)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-power.lib)(options "")(descr "")) 10 | (lib (name josh-rf)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-rf.lib)(options "")(descr "")) 11 | (lib (name josh-connector)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-connector.lib)(options "")(descr "")) 12 | (lib (name josh-display)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-display.lib)(options "")(descr "")) 13 | (lib (name josh-keyboard)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-keyboard.lib)(options "")(descr "")) 14 | ) 15 | -------------------------------------------------------------------------------- /hardware/0.2/.gitignore: -------------------------------------------------------------------------------- 1 | # For PCBs designed using KiCad: http://www.kicad-pcb.org/ 2 | # Format documentation: http://kicad-pcb.org/help/file-formats/ 3 | 4 | # Temporary files 5 | *.000 6 | *.bak 7 | *.bck 8 | *.kicad_pcb-bak 9 | *.sch-bak 10 | *~ 11 | _autosave-* 12 | *.tmp 13 | *-save.pro 14 | *-save.kicad_pcb 15 | fp-info-cache 16 | 17 | # Netlist files (exported from Eeschema) 18 | *.net 19 | 20 | # Autorouter files (exported from Pcbnew) 21 | *.dsn 22 | *.ses 23 | 24 | # Exported BOM files 25 | *.xml 26 | *.csv 27 | 28 | # Gerbers 29 | *.zip 30 | gerbers/* 31 | -------------------------------------------------------------------------------- /hardware/0.2/Hub20.pro: -------------------------------------------------------------------------------- 1 | update=Sat 22 Aug 2020 11:27:24 2 | version=1 3 | last_client=kicad 4 | [general] 5 | version=1 6 | RootSch= 7 | BoardNm= 8 | [cvpcb] 9 | version=1 10 | NetIExt=net 11 | [eeschema] 12 | version=1 13 | LibDir= 14 | [eeschema/libraries] 15 | [pcbnew] 16 | version=1 17 | PageLayoutDescrFile= 18 | LastNetListRead= 19 | CopperLayerCount=2 20 | BoardThickness=1.6 21 | AllowMicroVias=0 22 | AllowBlindVias=0 23 | RequireCourtyardDefinitions=0 24 | ProhibitOverlappingCourtyards=1 25 | MinTrackWidth=0.15 26 | MinViaDiameter=0.6 27 | MinViaDrill=0.3 28 | MinMicroViaDiameter=0.2 29 | MinMicroViaDrill=0.09999999999999999 30 | MinHoleToHole=0.25 31 | TrackWidth1=0.25 32 | TrackWidth2=0.2 33 | TrackWidth3=0.25 34 | TrackWidth4=0.3 35 | TrackWidth5=0.5 36 | ViaDiameter1=0.6 37 | ViaDrill1=0.3 38 | ViaDiameter2=0.6 39 | ViaDrill2=0.3 40 | ViaDiameter3=0.8 41 | ViaDrill3=0.4 42 | dPairWidth1=0.25 43 | dPairGap1=0.2 44 | dPairViaGap1=0.25 45 | SilkLineWidth=0.15 46 | SilkTextSizeV=1 47 | SilkTextSizeH=1 48 | SilkTextSizeThickness=0.15 49 | SilkTextItalic=0 50 | SilkTextUpright=1 51 | CopperLineWidth=0.2 52 | CopperTextSizeV=1.5 53 | CopperTextSizeH=1.5 54 | CopperTextThickness=0.3 55 | CopperTextItalic=0 56 | CopperTextUpright=1 57 | EdgeCutLineWidth=0.09999999999999999 58 | CourtyardLineWidth=0.05 59 | OthersLineWidth=0.15 60 | OthersTextSizeV=1 61 | OthersTextSizeH=1 62 | OthersTextSizeThickness=0.15 63 | OthersTextItalic=0 64 | OthersTextUpright=1 65 | SolderMaskClearance=0 66 | SolderMaskMinWidth=0 67 | SolderPasteClearance=0 68 | SolderPasteRatio=-0 69 | [pcbnew/Layer.F.Cu] 70 | Name=F.Cu 71 | Type=0 72 | Enabled=1 73 | [pcbnew/Layer.In1.Cu] 74 | Name=In1.Cu 75 | Type=0 76 | Enabled=0 77 | [pcbnew/Layer.In2.Cu] 78 | Name=In2.Cu 79 | Type=0 80 | Enabled=0 81 | [pcbnew/Layer.In3.Cu] 82 | Name=In3.Cu 83 | Type=0 84 | Enabled=0 85 | [pcbnew/Layer.In4.Cu] 86 | Name=In4.Cu 87 | Type=0 88 | Enabled=0 89 | [pcbnew/Layer.In5.Cu] 90 | Name=In5.Cu 91 | Type=0 92 | Enabled=0 93 | [pcbnew/Layer.In6.Cu] 94 | Name=In6.Cu 95 | Type=0 96 | Enabled=0 97 | [pcbnew/Layer.In7.Cu] 98 | Name=In7.Cu 99 | Type=0 100 | Enabled=0 101 | [pcbnew/Layer.In8.Cu] 102 | Name=In8.Cu 103 | Type=0 104 | Enabled=0 105 | [pcbnew/Layer.In9.Cu] 106 | Name=In9.Cu 107 | Type=0 108 | Enabled=0 109 | [pcbnew/Layer.In10.Cu] 110 | Name=In10.Cu 111 | Type=0 112 | Enabled=0 113 | [pcbnew/Layer.In11.Cu] 114 | Name=In11.Cu 115 | Type=0 116 | Enabled=0 117 | [pcbnew/Layer.In12.Cu] 118 | Name=In12.Cu 119 | Type=0 120 | Enabled=0 121 | [pcbnew/Layer.In13.Cu] 122 | Name=In13.Cu 123 | Type=0 124 | Enabled=0 125 | [pcbnew/Layer.In14.Cu] 126 | Name=In14.Cu 127 | Type=0 128 | Enabled=0 129 | [pcbnew/Layer.In15.Cu] 130 | Name=In15.Cu 131 | Type=0 132 | Enabled=0 133 | [pcbnew/Layer.In16.Cu] 134 | Name=In16.Cu 135 | Type=0 136 | Enabled=0 137 | [pcbnew/Layer.In17.Cu] 138 | Name=In17.Cu 139 | Type=0 140 | Enabled=0 141 | [pcbnew/Layer.In18.Cu] 142 | Name=In18.Cu 143 | Type=0 144 | Enabled=0 145 | [pcbnew/Layer.In19.Cu] 146 | Name=In19.Cu 147 | Type=0 148 | Enabled=0 149 | [pcbnew/Layer.In20.Cu] 150 | Name=In20.Cu 151 | Type=0 152 | Enabled=0 153 | [pcbnew/Layer.In21.Cu] 154 | Name=In21.Cu 155 | Type=0 156 | Enabled=0 157 | [pcbnew/Layer.In22.Cu] 158 | Name=In22.Cu 159 | Type=0 160 | Enabled=0 161 | [pcbnew/Layer.In23.Cu] 162 | Name=In23.Cu 163 | Type=0 164 | Enabled=0 165 | [pcbnew/Layer.In24.Cu] 166 | Name=In24.Cu 167 | Type=0 168 | Enabled=0 169 | [pcbnew/Layer.In25.Cu] 170 | Name=In25.Cu 171 | Type=0 172 | Enabled=0 173 | [pcbnew/Layer.In26.Cu] 174 | Name=In26.Cu 175 | Type=0 176 | Enabled=0 177 | [pcbnew/Layer.In27.Cu] 178 | Name=In27.Cu 179 | Type=0 180 | Enabled=0 181 | [pcbnew/Layer.In28.Cu] 182 | Name=In28.Cu 183 | Type=0 184 | Enabled=0 185 | [pcbnew/Layer.In29.Cu] 186 | Name=In29.Cu 187 | Type=0 188 | Enabled=0 189 | [pcbnew/Layer.In30.Cu] 190 | Name=In30.Cu 191 | Type=0 192 | Enabled=0 193 | [pcbnew/Layer.B.Cu] 194 | Name=B.Cu 195 | Type=0 196 | Enabled=1 197 | [pcbnew/Layer.B.Adhes] 198 | Enabled=1 199 | [pcbnew/Layer.F.Adhes] 200 | Enabled=1 201 | [pcbnew/Layer.B.Paste] 202 | Enabled=1 203 | [pcbnew/Layer.F.Paste] 204 | Enabled=1 205 | [pcbnew/Layer.B.SilkS] 206 | Enabled=1 207 | [pcbnew/Layer.F.SilkS] 208 | Enabled=1 209 | [pcbnew/Layer.B.Mask] 210 | Enabled=1 211 | [pcbnew/Layer.F.Mask] 212 | Enabled=1 213 | [pcbnew/Layer.Dwgs.User] 214 | Enabled=1 215 | [pcbnew/Layer.Cmts.User] 216 | Enabled=1 217 | [pcbnew/Layer.Eco1.User] 218 | Enabled=1 219 | [pcbnew/Layer.Eco2.User] 220 | Enabled=1 221 | [pcbnew/Layer.Edge.Cuts] 222 | Enabled=1 223 | [pcbnew/Layer.Margin] 224 | Enabled=1 225 | [pcbnew/Layer.B.CrtYd] 226 | Enabled=1 227 | [pcbnew/Layer.F.CrtYd] 228 | Enabled=1 229 | [pcbnew/Layer.B.Fab] 230 | Enabled=1 231 | [pcbnew/Layer.F.Fab] 232 | Enabled=1 233 | [pcbnew/Layer.Rescue] 234 | Enabled=0 235 | [pcbnew/Netclasses] 236 | [pcbnew/Netclasses/Default] 237 | Name=Default 238 | Clearance=0.2 239 | TrackWidth=0.25 240 | ViaDiameter=0.6 241 | ViaDrill=0.3 242 | uViaDiameter=0.3 243 | uViaDrill=0.1 244 | dPairWidth=0.25 245 | dPairGap=0.2 246 | dPairViaGap=0.25 247 | [pcbnew/Netclasses/1] 248 | Name=Power 249 | Clearance=0.2 250 | TrackWidth=0.3 251 | ViaDiameter=0.6 252 | ViaDrill=0.3 253 | uViaDiameter=0.3 254 | uViaDrill=0.1 255 | dPairWidth=0.25 256 | dPairGap=0.2 257 | dPairViaGap=0.25 258 | -------------------------------------------------------------------------------- /hardware/0.2/fp-lib-table: -------------------------------------------------------------------------------- 1 | (fp_lib_table 2 | (lib (name josh-buttons-switches)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-buttons-switches.pretty)(options "")(descr "")) 3 | (lib (name josh-connectors)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-connectors.pretty)(options "")(descr "")) 4 | (lib (name josh-dfn-qfn)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-dfn-qfn.pretty)(options "")(descr "")) 5 | (lib (name josh-led)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-led.pretty)(options "")(descr "")) 6 | (lib (name josh-logos)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-logos.pretty)(options "")(descr "")) 7 | (lib (name josh-mechanical)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-mechanical.pretty)(options "")(descr "")) 8 | (lib (name josh-oscillators)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-oscillators.pretty)(options "")(descr "")) 9 | (lib (name josh-passives-smt)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-passives-smt.pretty)(options "")(descr "")) 10 | (lib (name josh-rf)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-rf.pretty)(options "")(descr "")) 11 | (lib (name josh-soic-sot-etc)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-soic-sot-etc.pretty)(options "")(descr "")) 12 | (lib (name josh-test-point)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-test-point.pretty)(options "")(descr "")) 13 | (lib (name josh-display)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-display.pretty)(options "")(descr "")) 14 | (lib (name josh-keyboard)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-keyboard.pretty)(options "")(descr "")) 15 | ) 16 | -------------------------------------------------------------------------------- /hardware/0.2/sym-lib-table: -------------------------------------------------------------------------------- 1 | (sym_lib_table 2 | (lib (name josh-ic)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-ic.lib)(options "")(descr "")) 3 | (lib (name josh-led)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-led.lib)(options "")(descr "")) 4 | (lib (name josh-logic)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-logic.lib)(options "")(descr "")) 5 | (lib (name josh-mechnanical)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-mechnanical.lib)(options "")(descr "")) 6 | (lib (name josh-memory)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-memory.lib)(options "")(descr "")) 7 | (lib (name josh-oscillator)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-oscillator.lib)(options "")(descr "")) 8 | (lib (name josh-passive)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-passive.lib)(options "")(descr "")) 9 | (lib (name josh-power)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-power.lib)(options "")(descr "")) 10 | (lib (name josh-rf)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-rf.lib)(options "")(descr "")) 11 | (lib (name josh-connector)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-connector.lib)(options "")(descr "")) 12 | (lib (name josh-display)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-display.lib)(options "")(descr "")) 13 | (lib (name josh-keyboard)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-keyboard.lib)(options "")(descr "")) 14 | ) 15 | -------------------------------------------------------------------------------- /hardware/1.0.1/.gitignore: -------------------------------------------------------------------------------- 1 | # For PCBs designed using KiCad: http://www.kicad-pcb.org/ 2 | # Format documentation: http://kicad-pcb.org/help/file-formats/ 3 | 4 | # Temporary files 5 | *.000 6 | *.bak 7 | *.bck 8 | *.kicad_pcb-bak 9 | *.sch-bak 10 | *~ 11 | _autosave-* 12 | *.tmp 13 | *-save.pro 14 | *-save.kicad_pcb 15 | fp-info-cache 16 | 17 | # Netlist files (exported from Eeschema) 18 | *.net 19 | 20 | # Autorouter files (exported from Pcbnew) 21 | *.dsn 22 | *.ses 23 | 24 | # Exported BOM files 25 | *.xml 26 | *.csv 27 | 28 | # Gerbers 29 | *.zip 30 | gerbers/* 31 | -------------------------------------------------------------------------------- /hardware/1.0.1/Hub20.pro: -------------------------------------------------------------------------------- 1 | update=Mon 22 Mar 2021 22:59:20 2 | version=1 3 | last_client=kicad 4 | [general] 5 | version=1 6 | RootSch= 7 | BoardNm= 8 | [cvpcb] 9 | version=1 10 | NetIExt=net 11 | [eeschema] 12 | version=1 13 | LibDir= 14 | [eeschema/libraries] 15 | [pcbnew] 16 | version=1 17 | PageLayoutDescrFile= 18 | LastNetListRead= 19 | CopperLayerCount=2 20 | BoardThickness=1.6 21 | AllowMicroVias=0 22 | AllowBlindVias=0 23 | RequireCourtyardDefinitions=0 24 | ProhibitOverlappingCourtyards=1 25 | MinTrackWidth=0.15 26 | MinViaDiameter=0.6 27 | MinViaDrill=0.3 28 | MinMicroViaDiameter=0.2 29 | MinMicroViaDrill=0.09999999999999999 30 | MinHoleToHole=0.25 31 | TrackWidth1=0.25 32 | TrackWidth2=0.2 33 | TrackWidth3=0.25 34 | TrackWidth4=0.3 35 | TrackWidth5=0.4 36 | ViaDiameter1=0.6 37 | ViaDrill1=0.3 38 | ViaDiameter2=0.6 39 | ViaDrill2=0.3 40 | ViaDiameter3=0.8 41 | ViaDrill3=0.4 42 | dPairWidth1=0.25 43 | dPairGap1=0.2 44 | dPairViaGap1=0.25 45 | SilkLineWidth=0.15 46 | SilkTextSizeV=1 47 | SilkTextSizeH=1 48 | SilkTextSizeThickness=0.15 49 | SilkTextItalic=0 50 | SilkTextUpright=1 51 | CopperLineWidth=0.2 52 | CopperTextSizeV=1.5 53 | CopperTextSizeH=1.5 54 | CopperTextThickness=0.3 55 | CopperTextItalic=0 56 | CopperTextUpright=1 57 | EdgeCutLineWidth=0.09999999999999999 58 | CourtyardLineWidth=0.05 59 | OthersLineWidth=0.15 60 | OthersTextSizeV=1 61 | OthersTextSizeH=1 62 | OthersTextSizeThickness=0.15 63 | OthersTextItalic=0 64 | OthersTextUpright=1 65 | SolderMaskClearance=0 66 | SolderMaskMinWidth=0 67 | SolderPasteClearance=0 68 | SolderPasteRatio=-0 69 | [pcbnew/Layer.F.Cu] 70 | Name=F.Cu 71 | Type=0 72 | Enabled=1 73 | [pcbnew/Layer.In1.Cu] 74 | Name=In1.Cu 75 | Type=0 76 | Enabled=0 77 | [pcbnew/Layer.In2.Cu] 78 | Name=In2.Cu 79 | Type=0 80 | Enabled=0 81 | [pcbnew/Layer.In3.Cu] 82 | Name=In3.Cu 83 | Type=0 84 | Enabled=0 85 | [pcbnew/Layer.In4.Cu] 86 | Name=In4.Cu 87 | Type=0 88 | Enabled=0 89 | [pcbnew/Layer.In5.Cu] 90 | Name=In5.Cu 91 | Type=0 92 | Enabled=0 93 | [pcbnew/Layer.In6.Cu] 94 | Name=In6.Cu 95 | Type=0 96 | Enabled=0 97 | [pcbnew/Layer.In7.Cu] 98 | Name=In7.Cu 99 | Type=0 100 | Enabled=0 101 | [pcbnew/Layer.In8.Cu] 102 | Name=In8.Cu 103 | Type=0 104 | Enabled=0 105 | [pcbnew/Layer.In9.Cu] 106 | Name=In9.Cu 107 | Type=0 108 | Enabled=0 109 | [pcbnew/Layer.In10.Cu] 110 | Name=In10.Cu 111 | Type=0 112 | Enabled=0 113 | [pcbnew/Layer.In11.Cu] 114 | Name=In11.Cu 115 | Type=0 116 | Enabled=0 117 | [pcbnew/Layer.In12.Cu] 118 | Name=In12.Cu 119 | Type=0 120 | Enabled=0 121 | [pcbnew/Layer.In13.Cu] 122 | Name=In13.Cu 123 | Type=0 124 | Enabled=0 125 | [pcbnew/Layer.In14.Cu] 126 | Name=In14.Cu 127 | Type=0 128 | Enabled=0 129 | [pcbnew/Layer.In15.Cu] 130 | Name=In15.Cu 131 | Type=0 132 | Enabled=0 133 | [pcbnew/Layer.In16.Cu] 134 | Name=In16.Cu 135 | Type=0 136 | Enabled=0 137 | [pcbnew/Layer.In17.Cu] 138 | Name=In17.Cu 139 | Type=0 140 | Enabled=0 141 | [pcbnew/Layer.In18.Cu] 142 | Name=In18.Cu 143 | Type=0 144 | Enabled=0 145 | [pcbnew/Layer.In19.Cu] 146 | Name=In19.Cu 147 | Type=0 148 | Enabled=0 149 | [pcbnew/Layer.In20.Cu] 150 | Name=In20.Cu 151 | Type=0 152 | Enabled=0 153 | [pcbnew/Layer.In21.Cu] 154 | Name=In21.Cu 155 | Type=0 156 | Enabled=0 157 | [pcbnew/Layer.In22.Cu] 158 | Name=In22.Cu 159 | Type=0 160 | Enabled=0 161 | [pcbnew/Layer.In23.Cu] 162 | Name=In23.Cu 163 | Type=0 164 | Enabled=0 165 | [pcbnew/Layer.In24.Cu] 166 | Name=In24.Cu 167 | Type=0 168 | Enabled=0 169 | [pcbnew/Layer.In25.Cu] 170 | Name=In25.Cu 171 | Type=0 172 | Enabled=0 173 | [pcbnew/Layer.In26.Cu] 174 | Name=In26.Cu 175 | Type=0 176 | Enabled=0 177 | [pcbnew/Layer.In27.Cu] 178 | Name=In27.Cu 179 | Type=0 180 | Enabled=0 181 | [pcbnew/Layer.In28.Cu] 182 | Name=In28.Cu 183 | Type=0 184 | Enabled=0 185 | [pcbnew/Layer.In29.Cu] 186 | Name=In29.Cu 187 | Type=0 188 | Enabled=0 189 | [pcbnew/Layer.In30.Cu] 190 | Name=In30.Cu 191 | Type=0 192 | Enabled=0 193 | [pcbnew/Layer.B.Cu] 194 | Name=B.Cu 195 | Type=0 196 | Enabled=1 197 | [pcbnew/Layer.B.Adhes] 198 | Enabled=1 199 | [pcbnew/Layer.F.Adhes] 200 | Enabled=1 201 | [pcbnew/Layer.B.Paste] 202 | Enabled=1 203 | [pcbnew/Layer.F.Paste] 204 | Enabled=1 205 | [pcbnew/Layer.B.SilkS] 206 | Enabled=1 207 | [pcbnew/Layer.F.SilkS] 208 | Enabled=1 209 | [pcbnew/Layer.B.Mask] 210 | Enabled=1 211 | [pcbnew/Layer.F.Mask] 212 | Enabled=1 213 | [pcbnew/Layer.Dwgs.User] 214 | Enabled=1 215 | [pcbnew/Layer.Cmts.User] 216 | Enabled=1 217 | [pcbnew/Layer.Eco1.User] 218 | Enabled=1 219 | [pcbnew/Layer.Eco2.User] 220 | Enabled=1 221 | [pcbnew/Layer.Edge.Cuts] 222 | Enabled=1 223 | [pcbnew/Layer.Margin] 224 | Enabled=1 225 | [pcbnew/Layer.B.CrtYd] 226 | Enabled=1 227 | [pcbnew/Layer.F.CrtYd] 228 | Enabled=1 229 | [pcbnew/Layer.B.Fab] 230 | Enabled=1 231 | [pcbnew/Layer.F.Fab] 232 | Enabled=1 233 | [pcbnew/Layer.Rescue] 234 | Enabled=0 235 | [pcbnew/Netclasses] 236 | [pcbnew/Netclasses/Default] 237 | Name=Default 238 | Clearance=0.2 239 | TrackWidth=0.25 240 | ViaDiameter=0.6 241 | ViaDrill=0.3 242 | uViaDiameter=0.3 243 | uViaDrill=0.1 244 | dPairWidth=0.25 245 | dPairGap=0.2 246 | dPairViaGap=0.25 247 | [pcbnew/Netclasses/1] 248 | Name=Power 249 | Clearance=0.2 250 | TrackWidth=0.3 251 | ViaDiameter=0.6 252 | ViaDrill=0.3 253 | uViaDiameter=0.3 254 | uViaDrill=0.1 255 | dPairWidth=0.25 256 | dPairGap=0.2 257 | dPairViaGap=0.25 258 | -------------------------------------------------------------------------------- /hardware/1.0.1/fp-lib-table: -------------------------------------------------------------------------------- 1 | (fp_lib_table 2 | (lib (name josh-buttons-switches)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-buttons-switches.pretty)(options "")(descr "")) 3 | (lib (name josh-connectors)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-connectors.pretty)(options "")(descr "")) 4 | (lib (name josh-dfn-qfn)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-dfn-qfn.pretty)(options "")(descr "")) 5 | (lib (name josh-led)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-led.pretty)(options "")(descr "")) 6 | (lib (name josh-logos)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-logos.pretty)(options "")(descr "")) 7 | (lib (name josh-mechanical)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-mechanical.pretty)(options "")(descr "")) 8 | (lib (name josh-oscillators)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-oscillators.pretty)(options "")(descr "")) 9 | (lib (name josh-passives-smt)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-passives-smt.pretty)(options "")(descr "")) 10 | (lib (name josh-rf)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-rf.pretty)(options "")(descr "")) 11 | (lib (name josh-soic-sot-etc)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-soic-sot-etc.pretty)(options "")(descr "")) 12 | (lib (name josh-test-point)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-test-point.pretty)(options "")(descr "")) 13 | (lib (name josh-display)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-display.pretty)(options "")(descr "")) 14 | (lib (name josh-keyboard)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-keyboard.pretty)(options "")(descr "")) 15 | ) 16 | -------------------------------------------------------------------------------- /hardware/1.0.1/sym-lib-table: -------------------------------------------------------------------------------- 1 | (sym_lib_table 2 | (lib (name josh-ic)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-ic.lib)(options "")(descr "")) 3 | (lib (name josh-led)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-led.lib)(options "")(descr "")) 4 | (lib (name josh-logic)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-logic.lib)(options "")(descr "")) 5 | (lib (name josh-mechnanical)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-mechnanical.lib)(options "")(descr "")) 6 | (lib (name josh-memory)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-memory.lib)(options "")(descr "")) 7 | (lib (name josh-oscillator)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-oscillator.lib)(options "")(descr "")) 8 | (lib (name josh-passive)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-passive.lib)(options "")(descr "")) 9 | (lib (name josh-power)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-power.lib)(options "")(descr "")) 10 | (lib (name josh-rf)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-rf.lib)(options "")(descr "")) 11 | (lib (name josh-connector)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-connector.lib)(options "")(descr "")) 12 | (lib (name josh-display)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-display.lib)(options "")(descr "")) 13 | (lib (name josh-keyboard)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-keyboard.lib)(options "")(descr "")) 14 | ) 15 | -------------------------------------------------------------------------------- /hardware/1.0/.gitignore: -------------------------------------------------------------------------------- 1 | # For PCBs designed using KiCad: http://www.kicad-pcb.org/ 2 | # Format documentation: http://kicad-pcb.org/help/file-formats/ 3 | 4 | # Temporary files 5 | *.000 6 | *.bak 7 | *.bck 8 | *.kicad_pcb-bak 9 | *.sch-bak 10 | *~ 11 | _autosave-* 12 | *.tmp 13 | *-save.pro 14 | *-save.kicad_pcb 15 | fp-info-cache 16 | 17 | # Netlist files (exported from Eeschema) 18 | *.net 19 | 20 | # Autorouter files (exported from Pcbnew) 21 | *.dsn 22 | *.ses 23 | 24 | # Exported BOM files 25 | *.xml 26 | *.csv 27 | 28 | # Gerbers 29 | *.zip 30 | gerbers/* 31 | -------------------------------------------------------------------------------- /hardware/1.0/Hub20-bottom.pos: -------------------------------------------------------------------------------- 1 | s### Module positions - created on Sun Sep 27 17:48:54 2020 ### 2 | ### Printed by Pcbnew version kicad 5.1.6-c6e7f7d~87~ubuntu20.04.1 3 | ## Unit = mm, Angle = deg. 4 | ## Side : bottom 5 | # Ref Val Package PosX PosY Rot Side 6 | C1 100n C_0603_1608Metric -108.0000 -69.2000 270.0000 bottom 7 | C4 100n C_0603_1608Metric -128.6000 -66.2000 90.0000 bottom 8 | C5 100n C_0603_1608Metric -147.5000 -66.2125 90.0000 bottom 9 | C6 100n C_0603_1608Metric -107.1125 -87.5000 180.0000 bottom 10 | C7 100n C_0603_1608Metric -165.0000 -69.2000 270.0000 bottom 11 | C8 100n C_0603_1608Metric -164.3125 -87.4000 180.0000 bottom 12 | C9 100n C_0603_1608Metric -123.8000 -70.5000 270.0000 bottom 13 | C10 1u C_0603_1608Metric -107.1875 -47.7000 0.0000 bottom 14 | C11 100n C_0603_1608Metric -147.6000 -85.3000 90.0000 bottom 15 | C12 100n C_0603_1608Metric -163.8000 -95.0000 90.0000 bottom 16 | C13 100n C_0603_1608Metric -122.8125 -98.5000 180.0000 bottom 17 | C14 10u C_0603_1608Metric -107.7000 -42.6000 180.0000 bottom 18 | C15 100n C_0603_1608Metric -164.6000 -66.8000 0.0000 bottom 19 | C16 100n C_0603_1608Metric -126.9000 -88.2000 270.0000 bottom 20 | C17 100n C_0603_1608Metric -146.0000 -107.2875 270.0000 bottom 21 | C18 4u7 C_0603_1608Metric -153.1000 -72.0000 0.0000 bottom 22 | C19 1u C_0603_1608Metric -107.3875 -53.1000 0.0000 bottom 23 | C20 10u C_0603_1608Metric -153.1000 -75.0000 0.0000 bottom 24 | C21 100n C_0603_1608Metric -109.5000 -104.3875 90.0000 bottom 25 | C22 100n C_0603_1608Metric -164.9000 -146.0000 270.0000 bottom 26 | C23 100n C_0603_1608Metric -166.8000 -104.2875 90.0000 bottom 27 | C24 100n C_0603_1608Metric -163.7000 -132.8125 90.0000 bottom 28 | C25 100n C_0603_1608Metric -126.9000 -107.3000 270.0000 bottom 29 | C26 100n C_0603_1608Metric -126.3000 -146.0875 270.0000 bottom 30 | C27 100n C_0603_1608Metric -164.2000 -125.6000 180.0000 bottom 31 | C28 1u C_0603_1608Metric -132.4625 -92.3500 180.0000 bottom 32 | C29 100n C_0603_1608Metric -145.2000 -125.5000 180.0000 bottom 33 | C30 100n C_0603_1608Metric -109.5000 -142.4000 90.0000 bottom 34 | C31 100n C_0603_1608Metric -126.1125 -125.6000 180.0000 bottom 35 | C32 1u C_0603_1608Metric -141.1000 -101.5000 0.0000 bottom 36 | C33 100n C_0603_1608Metric -107.1125 -125.5000 180.0000 bottom 37 | C34 1u C_0603_1608Metric -148.2500 -97.6000 0.0000 bottom 38 | C35 100n C_0603_1608Metric -125.6000 -132.8000 90.0000 bottom 39 | C36 100n C_0603_1608Metric -141.1100 -99.9900 0.0000 bottom 40 | C37 100n C_0603_1608Metric -145.2000 -144.6000 180.0000 bottom 41 | C38 100n C_0603_1608Metric -144.5000 -86.2125 90.0000 bottom 42 | C39 100n C_0603_1608Metric -142.6000 -137.3000 270.0000 bottom 43 | C40 100n C_0603_1608Metric -143.8000 -99.6000 270.0000 bottom 44 | C41 10u C_0603_1608Metric -134.5125 -53.3000 180.0000 bottom 45 | C42 100n C_0603_1608Metric -134.4875 -56.3500 0.0000 bottom 46 | C43 100n C_0603_1608Metric -141.6000 -48.4000 90.0000 bottom 47 | C44 15p C_0603_1608Metric -148.7000 -51.1000 0.0000 bottom 48 | C45 15p C_0603_1608Metric -152.1000 -53.6125 90.0000 bottom 49 | C46 100n C_0603_1608Metric -144.8000 -51.5000 90.0000 bottom 50 | C47 100n C_0603_1608Metric -145.1000 -57.7000 0.0000 bottom 51 | C48 100n C_0603_1608Metric -132.4375 -90.8000 180.0000 bottom 52 | C49 100n C_0603_1608Metric -148.2625 -96.1000 0.0000 bottom 53 | C50 100n C_0603_1608Metric -119.0000 -56.2000 90.0000 bottom 54 | C51 100n C_0603_1608Metric -158.1000 -56.3125 90.0000 bottom 55 | C52 100n C_0603_1608Metric -124.2000 -56.2000 90.0000 bottom 56 | C53 100n C_0603_1608Metric -163.3000 -56.3000 90.0000 bottom 57 | C54 1u C_0603_1608Metric -145.1000 -59.2000 0.0000 bottom 58 | C55 1u C_0603_1608Metric -146.3000 -51.5000 90.0000 bottom 59 | C56 100n C_0603_1608Metric -137.8875 -58.9000 180.0000 bottom 60 | C57 1u C_0603_1608Metric -137.8875 -60.4000 180.0000 bottom 61 | C58 100n C_0603_1608Metric -134.4000 -42.6000 0.0000 bottom 62 | C59 100n C_0603_1608Metric -148.0000 -42.6000 180.0000 bottom 63 | C60 100n C_0603_1608Metric -174.4000 -42.6000 0.0000 bottom 64 | D1 1N4148 D_SOD-123 -149.2000 -75.9000 180.0000 bottom 65 | D2 WS2812B LED_WS2812B_PLCC4_5.0x5.0mm_P3.2mm -160.1000 -131.1000 90.0000 bottom 66 | D3 WS2812B LED_WS2812B_PLCC4_5.0x5.0mm_P3.2mm -141.0000 -131.1000 90.0000 bottom 67 | D4 1N4148 D_SOD-123 -118.0000 -60.1500 90.0000 bottom 68 | D5 1N4148 D_SOD-123 -111.8000 -76.8000 90.0000 bottom 69 | D6 1N4148 D_SOD-123 -118.0000 -98.2000 90.0000 bottom 70 | D7 1N4148 D_SOD-123 -112.1000 -114.9000 90.0000 bottom 71 | D8 1N4148 D_SOD-123 -118.0000 -136.3000 90.0000 bottom 72 | D9 WS2812B LED_WS2812B_PLCC4_5.0x5.0mm_P3.2mm -122.0000 -131.1000 90.0000 bottom 73 | D10 1N4148 D_SOD-123 -126.2000 -68.5500 90.0000 bottom 74 | D11 1N4148 D_SOD-123 -137.0000 -79.2000 90.0000 bottom 75 | D12 1N4148 D_SOD-123 -126.1000 -95.9000 90.0000 bottom 76 | D13 1N4148 D_SOD-123 -137.0000 -117.3000 90.0000 bottom 77 | D14 1N4148 D_SOD-123 -139.4000 -137.4000 90.0000 bottom 78 | D15 WS2812B LED_WS2812B_PLCC4_5.0x5.0mm_P3.2mm -122.0000 -93.1000 90.0000 bottom 79 | D16 1N4148 D_SOD-123 -121.4000 -42.9500 90.0000 bottom 80 | D17 WS2812B LED_WS2812B_PLCC4_5.0x5.0mm_P3.2mm -122.1000 -64.4000 90.0000 bottom 81 | D18 1N4148 D_SOD-123 -156.1000 -68.6500 90.0000 bottom 82 | D19 1N4148 D_SOD-123 -156.0000 -79.2000 90.0000 bottom 83 | D20 1N4148 D_SOD-123 -156.0000 -98.3000 90.0000 bottom 84 | D21 1N4148 D_SOD-123 -156.1000 -117.3000 90.0000 bottom 85 | D22 1N4148 D_SOD-123 -156.1000 -135.1000 90.0000 bottom 86 | D23 WS2812B LED_WS2812B_PLCC4_5.0x5.0mm_P3.2mm -160.2000 -64.4000 90.0000 bottom 87 | D24 1N4148 D_SOD-123 -160.9000 -43.1000 90.0000 bottom 88 | D25 1N4148 D_SOD-123 -175.1000 -60.1500 90.0000 bottom 89 | D26 1N4148 D_SOD-123 -169.3000 -76.8000 90.0000 bottom 90 | D27 1N4148 D_SOD-123 -175.2000 -98.2000 90.0000 bottom 91 | D28 1N4148 D_SOD-123 -169.1000 -114.9000 90.0000 bottom 92 | D29 1N4148 D_SOD-123 -177.0000 -136.3000 90.0000 bottom 93 | D30 WS2812B LED_WS2812B_PLCC4_5.0x5.0mm_P3.2mm -160.1000 -93.3000 90.0000 bottom 94 | D32 LED LED_0603_1608Metric -141.1200 -42.4000 180.0000 bottom 95 | F1 1A Fuse_0805_2012Metric -107.4625 -44.3000 0.0000 bottom 96 | F2 500mA Fuse_0805_2012Metric -134.6000 -44.3000 0.0000 bottom 97 | F3 500mA Fuse_0805_2012Metric -147.8000 -44.3000 180.0000 bottom 98 | F4 500mA Fuse_0805_2012Metric -174.6000 -44.3000 0.0000 bottom 99 | FB1 600R Ferrite_Bead_0603 -107.2000 -46.1000 0.0000 bottom 100 | FB2 600R Ferrite_Bead_0603 -134.5000 -54.8000 0.0000 bottom 101 | FB3 600R Ferrite_Bead_0603 -134.8000 -46.0000 0.0000 bottom 102 | FB4 600R Ferrite_Bead_0603 -147.6000 -46.0500 180.0000 bottom 103 | FB5 600R Ferrite_Bead_0603 -174.8000 -46.0000 0.0000 bottom 104 | Q1 DTC123J SOT-23 -149.8000 -73.0000 90.0000 bottom 105 | Q2 BSS138 SOT-23 -163.4000 -112.2000 270.0000 bottom 106 | R2 5K1 R_0603_1608Metric -118.2625 -40.6000 180.0000 bottom 107 | R3 5K1 R_0603_1608Metric -118.2500 -42.1500 180.0000 bottom 108 | R4 100K R_0603_1608Metric -153.1000 -73.5000 0.0000 bottom 109 | R5 10K R_0603_1608Metric -163.4000 -109.7000 0.0000 bottom 110 | R6 10K R_0603_1608Metric -163.4000 -114.7000 0.0000 bottom 111 | R7 10K R_0603_1608Metric -130.2000 -52.5500 180.0000 bottom 112 | R8 10K R_0603_1608Metric -130.1625 -59.4000 180.0000 bottom 113 | R9 10K R_0603_1608Metric -130.1500 -57.8500 180.0000 bottom 114 | R10 649R R_0603_1608Metric -151.8875 -51.1000 0.0000 bottom 115 | R14 5K1 R_0603_1608Metric -142.2000 -44.9500 270.0000 bottom 116 | RN1 10K R_Array_Convex_4x0603 -121.6000 -56.1000 90.0000 bottom 117 | RN2 10K R_Array_Convex_4x0603 -160.7000 -56.2000 90.0000 bottom 118 | RN3 10K R_Array_Convex_4x0603 -130.1500 -55.2000 180.0000 bottom 119 | SW1 EVQPUL Panasonic_EVQPUL_EVQPUC -141.1000 -35.3000 180.0000 bottom 120 | U1 AP2112K-3.3 SOT-23-5 -107.5000 -50.4000 270.0000 bottom 121 | U2 USBLC6-2SC6 SOT-23-6 -111.0000 -44.1000 270.0000 bottom 122 | U3 STM32F072C8Tx LQFP-48_7x7mm_P0.5mm -141.1000 -92.9000 90.0000 bottom 123 | U5 CY7C65632-28LTXCT QFN-28-1EP_5x5mm_P0.5mm_EP3.35x3.35mm_ThermalVias -140.5000 -54.8000 270.0000 bottom 124 | U6 USBLC6-2SC6 SOT-23-6 -131.1000 -44.1000 270.0000 bottom 125 | U7 USBLC6-2SC6 SOT-23-6 -151.3000 -44.2000 270.0000 bottom 126 | U8 USBLC6-2SC6 SOT-23-6 -171.1000 -44.3000 270.0000 bottom 127 | Y1 12MHz Crystal_SMD_3225-4Pin_3.2x2.5mm -149.2000 -53.6000 0.0000 bottom 128 | ## End 129 | -------------------------------------------------------------------------------- /hardware/1.0/Hub20.pro: -------------------------------------------------------------------------------- 1 | update=Sat 22 Aug 2020 11:27:24 2 | version=1 3 | last_client=kicad 4 | [general] 5 | version=1 6 | RootSch= 7 | BoardNm= 8 | [cvpcb] 9 | version=1 10 | NetIExt=net 11 | [eeschema] 12 | version=1 13 | LibDir= 14 | [eeschema/libraries] 15 | [pcbnew] 16 | version=1 17 | PageLayoutDescrFile= 18 | LastNetListRead= 19 | CopperLayerCount=2 20 | BoardThickness=1.6 21 | AllowMicroVias=0 22 | AllowBlindVias=0 23 | RequireCourtyardDefinitions=0 24 | ProhibitOverlappingCourtyards=1 25 | MinTrackWidth=0.15 26 | MinViaDiameter=0.6 27 | MinViaDrill=0.3 28 | MinMicroViaDiameter=0.2 29 | MinMicroViaDrill=0.09999999999999999 30 | MinHoleToHole=0.25 31 | TrackWidth1=0.25 32 | TrackWidth2=0.2 33 | TrackWidth3=0.25 34 | TrackWidth4=0.3 35 | TrackWidth5=0.5 36 | ViaDiameter1=0.6 37 | ViaDrill1=0.3 38 | ViaDiameter2=0.6 39 | ViaDrill2=0.3 40 | ViaDiameter3=0.8 41 | ViaDrill3=0.4 42 | dPairWidth1=0.25 43 | dPairGap1=0.2 44 | dPairViaGap1=0.25 45 | SilkLineWidth=0.15 46 | SilkTextSizeV=1 47 | SilkTextSizeH=1 48 | SilkTextSizeThickness=0.15 49 | SilkTextItalic=0 50 | SilkTextUpright=1 51 | CopperLineWidth=0.2 52 | CopperTextSizeV=1.5 53 | CopperTextSizeH=1.5 54 | CopperTextThickness=0.3 55 | CopperTextItalic=0 56 | CopperTextUpright=1 57 | EdgeCutLineWidth=0.09999999999999999 58 | CourtyardLineWidth=0.05 59 | OthersLineWidth=0.15 60 | OthersTextSizeV=1 61 | OthersTextSizeH=1 62 | OthersTextSizeThickness=0.15 63 | OthersTextItalic=0 64 | OthersTextUpright=1 65 | SolderMaskClearance=0 66 | SolderMaskMinWidth=0 67 | SolderPasteClearance=0 68 | SolderPasteRatio=-0 69 | [pcbnew/Layer.F.Cu] 70 | Name=F.Cu 71 | Type=0 72 | Enabled=1 73 | [pcbnew/Layer.In1.Cu] 74 | Name=In1.Cu 75 | Type=0 76 | Enabled=0 77 | [pcbnew/Layer.In2.Cu] 78 | Name=In2.Cu 79 | Type=0 80 | Enabled=0 81 | [pcbnew/Layer.In3.Cu] 82 | Name=In3.Cu 83 | Type=0 84 | Enabled=0 85 | [pcbnew/Layer.In4.Cu] 86 | Name=In4.Cu 87 | Type=0 88 | Enabled=0 89 | [pcbnew/Layer.In5.Cu] 90 | Name=In5.Cu 91 | Type=0 92 | Enabled=0 93 | [pcbnew/Layer.In6.Cu] 94 | Name=In6.Cu 95 | Type=0 96 | Enabled=0 97 | [pcbnew/Layer.In7.Cu] 98 | Name=In7.Cu 99 | Type=0 100 | Enabled=0 101 | [pcbnew/Layer.In8.Cu] 102 | Name=In8.Cu 103 | Type=0 104 | Enabled=0 105 | [pcbnew/Layer.In9.Cu] 106 | Name=In9.Cu 107 | Type=0 108 | Enabled=0 109 | [pcbnew/Layer.In10.Cu] 110 | Name=In10.Cu 111 | Type=0 112 | Enabled=0 113 | [pcbnew/Layer.In11.Cu] 114 | Name=In11.Cu 115 | Type=0 116 | Enabled=0 117 | [pcbnew/Layer.In12.Cu] 118 | Name=In12.Cu 119 | Type=0 120 | Enabled=0 121 | [pcbnew/Layer.In13.Cu] 122 | Name=In13.Cu 123 | Type=0 124 | Enabled=0 125 | [pcbnew/Layer.In14.Cu] 126 | Name=In14.Cu 127 | Type=0 128 | Enabled=0 129 | [pcbnew/Layer.In15.Cu] 130 | Name=In15.Cu 131 | Type=0 132 | Enabled=0 133 | [pcbnew/Layer.In16.Cu] 134 | Name=In16.Cu 135 | Type=0 136 | Enabled=0 137 | [pcbnew/Layer.In17.Cu] 138 | Name=In17.Cu 139 | Type=0 140 | Enabled=0 141 | [pcbnew/Layer.In18.Cu] 142 | Name=In18.Cu 143 | Type=0 144 | Enabled=0 145 | [pcbnew/Layer.In19.Cu] 146 | Name=In19.Cu 147 | Type=0 148 | Enabled=0 149 | [pcbnew/Layer.In20.Cu] 150 | Name=In20.Cu 151 | Type=0 152 | Enabled=0 153 | [pcbnew/Layer.In21.Cu] 154 | Name=In21.Cu 155 | Type=0 156 | Enabled=0 157 | [pcbnew/Layer.In22.Cu] 158 | Name=In22.Cu 159 | Type=0 160 | Enabled=0 161 | [pcbnew/Layer.In23.Cu] 162 | Name=In23.Cu 163 | Type=0 164 | Enabled=0 165 | [pcbnew/Layer.In24.Cu] 166 | Name=In24.Cu 167 | Type=0 168 | Enabled=0 169 | [pcbnew/Layer.In25.Cu] 170 | Name=In25.Cu 171 | Type=0 172 | Enabled=0 173 | [pcbnew/Layer.In26.Cu] 174 | Name=In26.Cu 175 | Type=0 176 | Enabled=0 177 | [pcbnew/Layer.In27.Cu] 178 | Name=In27.Cu 179 | Type=0 180 | Enabled=0 181 | [pcbnew/Layer.In28.Cu] 182 | Name=In28.Cu 183 | Type=0 184 | Enabled=0 185 | [pcbnew/Layer.In29.Cu] 186 | Name=In29.Cu 187 | Type=0 188 | Enabled=0 189 | [pcbnew/Layer.In30.Cu] 190 | Name=In30.Cu 191 | Type=0 192 | Enabled=0 193 | [pcbnew/Layer.B.Cu] 194 | Name=B.Cu 195 | Type=0 196 | Enabled=1 197 | [pcbnew/Layer.B.Adhes] 198 | Enabled=1 199 | [pcbnew/Layer.F.Adhes] 200 | Enabled=1 201 | [pcbnew/Layer.B.Paste] 202 | Enabled=1 203 | [pcbnew/Layer.F.Paste] 204 | Enabled=1 205 | [pcbnew/Layer.B.SilkS] 206 | Enabled=1 207 | [pcbnew/Layer.F.SilkS] 208 | Enabled=1 209 | [pcbnew/Layer.B.Mask] 210 | Enabled=1 211 | [pcbnew/Layer.F.Mask] 212 | Enabled=1 213 | [pcbnew/Layer.Dwgs.User] 214 | Enabled=1 215 | [pcbnew/Layer.Cmts.User] 216 | Enabled=1 217 | [pcbnew/Layer.Eco1.User] 218 | Enabled=1 219 | [pcbnew/Layer.Eco2.User] 220 | Enabled=1 221 | [pcbnew/Layer.Edge.Cuts] 222 | Enabled=1 223 | [pcbnew/Layer.Margin] 224 | Enabled=1 225 | [pcbnew/Layer.B.CrtYd] 226 | Enabled=1 227 | [pcbnew/Layer.F.CrtYd] 228 | Enabled=1 229 | [pcbnew/Layer.B.Fab] 230 | Enabled=1 231 | [pcbnew/Layer.F.Fab] 232 | Enabled=1 233 | [pcbnew/Layer.Rescue] 234 | Enabled=0 235 | [pcbnew/Netclasses] 236 | [pcbnew/Netclasses/Default] 237 | Name=Default 238 | Clearance=0.2 239 | TrackWidth=0.25 240 | ViaDiameter=0.6 241 | ViaDrill=0.3 242 | uViaDiameter=0.3 243 | uViaDrill=0.1 244 | dPairWidth=0.25 245 | dPairGap=0.2 246 | dPairViaGap=0.25 247 | [pcbnew/Netclasses/1] 248 | Name=Power 249 | Clearance=0.2 250 | TrackWidth=0.3 251 | ViaDiameter=0.6 252 | ViaDrill=0.3 253 | uViaDiameter=0.3 254 | uViaDrill=0.1 255 | dPairWidth=0.25 256 | dPairGap=0.2 257 | dPairViaGap=0.25 258 | -------------------------------------------------------------------------------- /hardware/1.0/fp-lib-table: -------------------------------------------------------------------------------- 1 | (fp_lib_table 2 | (lib (name josh-buttons-switches)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-buttons-switches.pretty)(options "")(descr "")) 3 | (lib (name josh-connectors)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-connectors.pretty)(options "")(descr "")) 4 | (lib (name josh-dfn-qfn)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-dfn-qfn.pretty)(options "")(descr "")) 5 | (lib (name josh-led)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-led.pretty)(options "")(descr "")) 6 | (lib (name josh-logos)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-logos.pretty)(options "")(descr "")) 7 | (lib (name josh-mechanical)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-mechanical.pretty)(options "")(descr "")) 8 | (lib (name josh-oscillators)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-oscillators.pretty)(options "")(descr "")) 9 | (lib (name josh-passives-smt)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-passives-smt.pretty)(options "")(descr "")) 10 | (lib (name josh-rf)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-rf.pretty)(options "")(descr "")) 11 | (lib (name josh-soic-sot-etc)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-soic-sot-etc.pretty)(options "")(descr "")) 12 | (lib (name josh-test-point)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-test-point.pretty)(options "")(descr "")) 13 | (lib (name josh-display)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-display.pretty)(options "")(descr "")) 14 | (lib (name josh-keyboard)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-keyboard.pretty)(options "")(descr "")) 15 | ) 16 | -------------------------------------------------------------------------------- /hardware/1.0/sym-lib-table: -------------------------------------------------------------------------------- 1 | (sym_lib_table 2 | (lib (name josh-ic)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-ic.lib)(options "")(descr "")) 3 | (lib (name josh-led)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-led.lib)(options "")(descr "")) 4 | (lib (name josh-logic)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-logic.lib)(options "")(descr "")) 5 | (lib (name josh-mechnanical)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-mechnanical.lib)(options "")(descr "")) 6 | (lib (name josh-memory)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-memory.lib)(options "")(descr "")) 7 | (lib (name josh-oscillator)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-oscillator.lib)(options "")(descr "")) 8 | (lib (name josh-passive)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-passive.lib)(options "")(descr "")) 9 | (lib (name josh-power)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-power.lib)(options "")(descr "")) 10 | (lib (name josh-rf)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-rf.lib)(options "")(descr "")) 11 | (lib (name josh-connector)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-connector.lib)(options "")(descr "")) 12 | (lib (name josh-display)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-display.lib)(options "")(descr "")) 13 | (lib (name josh-keyboard)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-keyboard.lib)(options "")(descr "")) 14 | ) 15 | -------------------------------------------------------------------------------- /mechanicals/1.0/Hub20-bottom.dxf: -------------------------------------------------------------------------------- 1 | 0 2 | SECTION 3 | 2 4 | HEADER 5 | 9 6 | $INSUNITS 7 | 70 8 | 4 9 | 9 10 | $ACADVER 11 | 1 12 | AC1014 13 | 9 14 | $HANDSEED 15 | 5 16 | FFFF 17 | 0 18 | ENDSEC 19 | 0 20 | SECTION 21 | 2 22 | TABLES 23 | 0 24 | TABLE 25 | 2 26 | VPORT 27 | 5 28 | 8 29 | 100 30 | AcDbSymbolTable 31 | 0 32 | ENDTAB 33 | 0 34 | TABLE 35 | 2 36 | LTYPE 37 | 5 38 | 5 39 | 100 40 | AcDbSymbolTable 41 | 0 42 | LTYPE 43 | 5 44 | 14 45 | 100 46 | AcDbSymbolTableRecord 47 | 100 48 | AcDbLinetypeTableRecord 49 | 2 50 | BYBLOCK 51 | 70 52 | 0 53 | 0 54 | LTYPE 55 | 5 56 | 15 57 | 100 58 | AcDbSymbolTableRecord 59 | 100 60 | AcDbLinetypeTableRecord 61 | 2 62 | BYLAYER 63 | 70 64 | 0 65 | 0 66 | ENDTAB 67 | 0 68 | TABLE 69 | 2 70 | LAYER 71 | 5 72 | 2 73 | 100 74 | AcDbSymbolTable 75 | 70 76 | 2 77 | 0 78 | LAYER 79 | 5 80 | 50 81 | 100 82 | AcDbSymbolTableRecord 83 | 100 84 | AcDbLayerTableRecord 85 | 2 86 | 0 87 | 70 88 | 0 89 | 6 90 | CONTINUOUS 91 | 0 92 | ENDTAB 93 | 0 94 | TABLE 95 | 2 96 | STYLE 97 | 5 98 | 3 99 | 100 100 | AcDbSymbolTable 101 | 70 102 | 1 103 | 0 104 | STYLE 105 | 5 106 | 11 107 | 100 108 | AcDbSymbolTableRecord 109 | 100 110 | AcDbTextStyleTableRecord 111 | 2 112 | STANDARD 113 | 70 114 | 0 115 | 0 116 | ENDTAB 117 | 0 118 | TABLE 119 | 2 120 | VIEW 121 | 5 122 | 6 123 | 100 124 | AcDbSymbolTable 125 | 70 126 | 0 127 | 0 128 | ENDTAB 129 | 0 130 | TABLE 131 | 2 132 | UCS 133 | 5 134 | 7 135 | 100 136 | AcDbSymbolTable 137 | 70 138 | 0 139 | 0 140 | ENDTAB 141 | 0 142 | TABLE 143 | 2 144 | APPID 145 | 5 146 | 9 147 | 100 148 | AcDbSymbolTable 149 | 70 150 | 2 151 | 0 152 | APPID 153 | 5 154 | 12 155 | 100 156 | AcDbSymbolTableRecord 157 | 100 158 | AcDbRegAppTableRecord 159 | 2 160 | ACAD 161 | 70 162 | 0 163 | 0 164 | ENDTAB 165 | 0 166 | TABLE 167 | 2 168 | DIMSTYLE 169 | 5 170 | A 171 | 100 172 | AcDbSymbolTable 173 | 70 174 | 1 175 | 0 176 | ENDTAB 177 | 0 178 | TABLE 179 | 2 180 | BLOCK_RECORD 181 | 5 182 | 1 183 | 100 184 | AcDbSymbolTable 185 | 70 186 | 1 187 | 0 188 | BLOCK_RECORD 189 | 5 190 | 1F 191 | 100 192 | AcDbSymbolTableRecord 193 | 100 194 | AcDbBlockTableRecord 195 | 2 196 | *MODEL_SPACE 197 | 0 198 | BLOCK_RECORD 199 | 5 200 | 1B 201 | 100 202 | AcDbSymbolTableRecord 203 | 100 204 | AcDbBlockTableRecord 205 | 2 206 | *PAPER_SPACE 207 | 0 208 | ENDTAB 209 | 0 210 | ENDSEC 211 | 0 212 | SECTION 213 | 2 214 | BLOCKS 215 | 0 216 | BLOCK 217 | 5 218 | 20 219 | 100 220 | AcDbEntity 221 | 100 222 | AcDbBlockBegin 223 | 2 224 | *MODEL_SPACE 225 | 0 226 | ENDBLK 227 | 5 228 | 21 229 | 100 230 | AcDbEntity 231 | 100 232 | AcDbBlockEnd 233 | 0 234 | BLOCK 235 | 5 236 | 1C 237 | 100 238 | AcDbEntity 239 | 100 240 | AcDbBlockBegin 241 | 2 242 | *PAPER_SPACE 243 | 0 244 | ENDBLK 245 | 5 246 | 1D 247 | 100 248 | AcDbEntity 249 | 100 250 | AcDbBlockEnd 251 | 0 252 | ENDSEC 253 | 0 254 | SECTION 255 | 2 256 | ENTITIES 257 | 0 258 | LWPOLYLINE 259 | 5 260 | 100 261 | 100 262 | AcDbEntity 263 | 8 264 | 0 265 | 100 266 | AcDbPolyline 267 | 90 268 | 8 269 | 70 270 | 1 271 | 43 272 | 0.0 273 | 10 274 | -97.450000000000017 275 | 20 276 | 36.537500000000009 277 | 10 278 | -180.44999999999999 279 | 20 280 | 36.537499999999994 281 | 42 282 | -0.4142135623730942 283 | 10 284 | -183.44999999999999 285 | 20 286 | 39.537499999999994 287 | 10 288 | -183.44999999999999 289 | 20 290 | 157.5625 291 | 42 292 | -0.41421356237309503 293 | 10 294 | -180.44999999999999 295 | 20 296 | 160.56250000000003 297 | 10 298 | -97.450000000000017 299 | 20 300 | 160.56250000000003 301 | 42 302 | -0.41421356237309503 303 | 10 304 | -94.450000000000003 305 | 20 306 | 157.5625 307 | 10 308 | -94.450000000000003 309 | 20 310 | 39.537500000000001 311 | 42 312 | -0.41421356237309503 313 | 0 314 | CIRCLE 315 | 5 316 | 101 317 | 100 318 | AcDbEntity 319 | 8 320 | 0 321 | 100 322 | AcDbCircle 323 | 10 324 | -180.44999999999999 325 | 20 326 | 39.537500000000001 327 | 30 328 | 0 329 | 40 330 | 1.1000000000000001 331 | 210 332 | 0 333 | 220 334 | 0 335 | 230 336 | 1 337 | 0 338 | CIRCLE 339 | 5 340 | 102 341 | 100 342 | AcDbEntity 343 | 8 344 | 0 345 | 100 346 | AcDbCircle 347 | 10 348 | -97.450000000000017 349 | 20 350 | 39.537500000000001 351 | 30 352 | 0 353 | 40 354 | 1.1000000000000001 355 | 210 356 | 0 357 | 220 358 | 0 359 | 230 360 | 1 361 | 0 362 | CIRCLE 363 | 5 364 | 103 365 | 100 366 | AcDbEntity 367 | 8 368 | 0 369 | 100 370 | AcDbCircle 371 | 10 372 | -97.450000000000017 373 | 20 374 | 157.53749999999999 375 | 30 376 | 0 377 | 40 378 | 1.1000000000000001 379 | 210 380 | 0 381 | 220 382 | 0 383 | 230 384 | 1 385 | 0 386 | CIRCLE 387 | 5 388 | 104 389 | 100 390 | AcDbEntity 391 | 8 392 | 0 393 | 100 394 | AcDbCircle 395 | 10 396 | -180.44999999999999 397 | 20 398 | 157.53749999999999 399 | 30 400 | 0 401 | 40 402 | 1.1000000000000001 403 | 210 404 | 0 405 | 220 406 | 0 407 | 230 408 | 1 409 | 0 410 | ENDSEC 411 | 0 412 | SECTION 413 | 2 414 | OBJECTS 415 | 0 416 | DICTIONARY 417 | 5 418 | C 419 | 100 420 | AcDbDictionary 421 | 3 422 | ACAD_GROUP 423 | 350 424 | D 425 | 3 426 | ACAD_MLINESTYLE 427 | 350 428 | 17 429 | 0 430 | DICTIONARY 431 | 5 432 | D 433 | 100 434 | AcDbDictionary 435 | 0 436 | DICTIONARY 437 | 5 438 | 1A 439 | 330 440 | C 441 | 100 442 | AcDbDictionary 443 | 0 444 | DICTIONARY 445 | 5 446 | 17 447 | 100 448 | AcDbDictionary 449 | 0 450 | ENDSEC 451 | 0 452 | EOF 453 | -------------------------------------------------------------------------------- /mechanicals/1.0/Hub20-mid.dxf: -------------------------------------------------------------------------------- 1 | 0 2 | SECTION 3 | 2 4 | HEADER 5 | 9 6 | $INSUNITS 7 | 70 8 | 4 9 | 9 10 | $ACADVER 11 | 1 12 | AC1014 13 | 9 14 | $HANDSEED 15 | 5 16 | FFFF 17 | 0 18 | ENDSEC 19 | 0 20 | SECTION 21 | 2 22 | TABLES 23 | 0 24 | TABLE 25 | 2 26 | VPORT 27 | 5 28 | 8 29 | 100 30 | AcDbSymbolTable 31 | 0 32 | ENDTAB 33 | 0 34 | TABLE 35 | 2 36 | LTYPE 37 | 5 38 | 5 39 | 100 40 | AcDbSymbolTable 41 | 0 42 | LTYPE 43 | 5 44 | 14 45 | 100 46 | AcDbSymbolTableRecord 47 | 100 48 | AcDbLinetypeTableRecord 49 | 2 50 | BYBLOCK 51 | 70 52 | 0 53 | 0 54 | LTYPE 55 | 5 56 | 15 57 | 100 58 | AcDbSymbolTableRecord 59 | 100 60 | AcDbLinetypeTableRecord 61 | 2 62 | BYLAYER 63 | 70 64 | 0 65 | 0 66 | ENDTAB 67 | 0 68 | TABLE 69 | 2 70 | LAYER 71 | 5 72 | 2 73 | 100 74 | AcDbSymbolTable 75 | 70 76 | 2 77 | 0 78 | LAYER 79 | 5 80 | 50 81 | 100 82 | AcDbSymbolTableRecord 83 | 100 84 | AcDbLayerTableRecord 85 | 2 86 | 0 87 | 70 88 | 0 89 | 6 90 | CONTINUOUS 91 | 0 92 | ENDTAB 93 | 0 94 | TABLE 95 | 2 96 | STYLE 97 | 5 98 | 3 99 | 100 100 | AcDbSymbolTable 101 | 70 102 | 1 103 | 0 104 | STYLE 105 | 5 106 | 11 107 | 100 108 | AcDbSymbolTableRecord 109 | 100 110 | AcDbTextStyleTableRecord 111 | 2 112 | STANDARD 113 | 70 114 | 0 115 | 0 116 | ENDTAB 117 | 0 118 | TABLE 119 | 2 120 | VIEW 121 | 5 122 | 6 123 | 100 124 | AcDbSymbolTable 125 | 70 126 | 0 127 | 0 128 | ENDTAB 129 | 0 130 | TABLE 131 | 2 132 | UCS 133 | 5 134 | 7 135 | 100 136 | AcDbSymbolTable 137 | 70 138 | 0 139 | 0 140 | ENDTAB 141 | 0 142 | TABLE 143 | 2 144 | APPID 145 | 5 146 | 9 147 | 100 148 | AcDbSymbolTable 149 | 70 150 | 2 151 | 0 152 | APPID 153 | 5 154 | 12 155 | 100 156 | AcDbSymbolTableRecord 157 | 100 158 | AcDbRegAppTableRecord 159 | 2 160 | ACAD 161 | 70 162 | 0 163 | 0 164 | ENDTAB 165 | 0 166 | TABLE 167 | 2 168 | DIMSTYLE 169 | 5 170 | A 171 | 100 172 | AcDbSymbolTable 173 | 70 174 | 1 175 | 0 176 | ENDTAB 177 | 0 178 | TABLE 179 | 2 180 | BLOCK_RECORD 181 | 5 182 | 1 183 | 100 184 | AcDbSymbolTable 185 | 70 186 | 1 187 | 0 188 | BLOCK_RECORD 189 | 5 190 | 1F 191 | 100 192 | AcDbSymbolTableRecord 193 | 100 194 | AcDbBlockTableRecord 195 | 2 196 | *MODEL_SPACE 197 | 0 198 | BLOCK_RECORD 199 | 5 200 | 1B 201 | 100 202 | AcDbSymbolTableRecord 203 | 100 204 | AcDbBlockTableRecord 205 | 2 206 | *PAPER_SPACE 207 | 0 208 | ENDTAB 209 | 0 210 | ENDSEC 211 | 0 212 | SECTION 213 | 2 214 | BLOCKS 215 | 0 216 | BLOCK 217 | 5 218 | 20 219 | 100 220 | AcDbEntity 221 | 100 222 | AcDbBlockBegin 223 | 2 224 | *MODEL_SPACE 225 | 0 226 | ENDBLK 227 | 5 228 | 21 229 | 100 230 | AcDbEntity 231 | 100 232 | AcDbBlockEnd 233 | 0 234 | BLOCK 235 | 5 236 | 1C 237 | 100 238 | AcDbEntity 239 | 100 240 | AcDbBlockBegin 241 | 2 242 | *PAPER_SPACE 243 | 0 244 | ENDBLK 245 | 5 246 | 1D 247 | 100 248 | AcDbEntity 249 | 100 250 | AcDbBlockEnd 251 | 0 252 | ENDSEC 253 | 0 254 | SECTION 255 | 2 256 | ENTITIES 257 | 0 258 | CIRCLE 259 | 5 260 | 100 261 | 100 262 | AcDbEntity 263 | 8 264 | 0 265 | 100 266 | AcDbCircle 267 | 10 268 | -182.69999999999999 269 | 20 270 | 153.58750000000001 271 | 30 272 | 0 273 | 40 274 | 1.6000000000000014 275 | 210 276 | 0 277 | 220 278 | 0 279 | 230 280 | 1 281 | 0 282 | CIRCLE 283 | 5 284 | 101 285 | 100 286 | AcDbEntity 287 | 8 288 | 0 289 | 100 290 | AcDbCircle 291 | 10 292 | -182.69999999999999 293 | 20 294 | 35.587499999999999 295 | 30 296 | 0 297 | 40 298 | 1.6000000000000014 299 | 210 300 | 0 301 | 220 302 | 0 303 | 230 304 | 1 305 | 0 306 | CIRCLE 307 | 5 308 | 102 309 | 100 310 | AcDbEntity 311 | 8 312 | 0 313 | 100 314 | AcDbCircle 315 | 10 316 | -99.700000000000003 317 | 20 318 | 35.587499999999999 319 | 30 320 | 0 321 | 40 322 | 1.6000000000000014 323 | 210 324 | 0 325 | 220 326 | 0 327 | 230 328 | 1 329 | 0 330 | CIRCLE 331 | 5 332 | 103 333 | 100 334 | AcDbEntity 335 | 8 336 | 0 337 | 100 338 | AcDbCircle 339 | 10 340 | -99.700000000000003 341 | 20 342 | 153.58750000000001 343 | 30 344 | 0 345 | 40 346 | 1.6000000000000014 347 | 210 348 | 0 349 | 220 350 | 0 351 | 230 352 | 1 353 | 0 354 | LWPOLYLINE 355 | 5 356 | 104 357 | 100 358 | AcDbEntity 359 | 8 360 | 0 361 | 100 362 | AcDbPolyline 363 | 90 364 | 60 365 | 70 366 | 1 367 | 43 368 | 0.0 369 | 10 370 | -179.88699999999997 371 | 20 372 | 78.727195256117838 373 | 42 374 | -0.15664015019402264 375 | 10 376 | -179.70000000000002 377 | 20 378 | 78.144931570147335 379 | 10 380 | -179.69999999999999 381 | 20 382 | 35.587499999999999 383 | 42 384 | -0.99999999999999989 385 | 10 386 | -185.69999999999999 387 | 20 388 | 35.587499999999999 389 | 10 390 | -185.69999999999999 391 | 20 392 | 153.61250000000001 393 | 42 394 | -0.41421356237309503 395 | 10 396 | -182.69999999999999 397 | 20 398 | 156.61250000000001 399 | 10 400 | -99.700000000000003 401 | 20 402 | 156.61250000000001 403 | 42 404 | -0.41421356237309503 405 | 10 406 | -96.700000000000017 407 | 20 408 | 153.61250000000001 409 | 10 410 | -96.700000000000003 411 | 20 412 | 35.587499999999999 413 | 42 414 | -0.99999999999999989 415 | 10 416 | -102.70000000000002 417 | 20 418 | 35.587499999999999 419 | 10 420 | -102.70000000000002 421 | 20 422 | 77.824257580454443 423 | 42 424 | -0.17754470554104512 425 | 10 426 | -102.46300000000002 427 | 20 428 | 78.470656064363553 429 | 42 430 | 0.36664689955139873 431 | 10 432 | -102.46300000000002 433 | 20 434 | 83.641843935636473 435 | 42 436 | -0.17754470554103516 437 | 10 438 | -102.70000000000002 439 | 20 440 | 84.288242419545583 441 | 10 442 | -102.70000000000002 443 | 20 444 | 101.63675758045443 445 | 42 446 | -0.17754470554103516 447 | 10 448 | -102.46300000000002 449 | 20 450 | 102.28315606436354 451 | 42 452 | 0.36664689955140017 453 | 10 454 | -102.46300000000002 455 | 20 456 | 107.45434393563649 457 | 42 458 | -0.17754470554103516 459 | 10 460 | -102.70000000000002 461 | 20 462 | 108.1007424195456 463 | 10 464 | -102.70000000000002 465 | 20 466 | 115.92425758045444 467 | 42 468 | -0.17754470554103516 469 | 10 470 | -102.46300000000002 471 | 20 472 | 116.57065606436355 473 | 42 474 | 0.36664689955139823 475 | 10 476 | -102.46300000000002 477 | 20 478 | 121.74184393563647 479 | 42 480 | -0.17754470554103516 481 | 10 482 | -102.70000000000002 483 | 20 484 | 122.38824241954558 485 | 10 486 | -102.70000000000002 487 | 20 488 | 139.73675758045442 489 | 42 490 | -0.17754470554102691 491 | 10 492 | -102.46300000000002 493 | 20 494 | 140.38315606436356 495 | 42 496 | 0.36664689955139551 497 | 10 498 | -102.46299999999998 499 | 20 500 | 145.55434393563644 501 | 42 502 | -0.17754470554102061 503 | 10 504 | -102.70000000000002 505 | 20 506 | 146.20074241954558 507 | 10 508 | -102.70000000000002 509 | 20 510 | 147.61250000000001 511 | 42 512 | 0.41421356237308815 513 | 10 514 | -105.70000000000002 515 | 20 516 | 150.61250000000001 517 | 10 518 | -105.95616666750084 519 | 20 520 | 150.61250000000001 521 | 42 522 | -0.25098845235327966 523 | 10 524 | -106.78868333400068 525 | 20 526 | 151.05850000000001 527 | 42 528 | 0.53572501061765554 529 | 10 530 | -113.44881666599933 531 | 20 532 | 151.05850000000001 533 | 42 534 | -0.2509884523532836 535 | 10 536 | -114.28133333249917 537 | 20 538 | 150.61250000000001 539 | 10 540 | -129.76866666750081 541 | 20 542 | 150.61250000000001 543 | 42 544 | -0.25098845235327966 545 | 10 546 | -130.60118333400067 547 | 20 548 | 151.05850000000001 549 | 42 550 | 0.53572501061765709 551 | 10 552 | -137.26131666599935 553 | 20 554 | 151.05850000000001 555 | 42 556 | -0.25098845235328227 557 | 10 558 | -138.0938333324992 559 | 20 560 | 150.61250000000001 561 | 10 562 | -144.05616666750083 563 | 20 564 | 150.61250000000001 565 | 42 566 | -0.25098845235327966 567 | 10 568 | -144.88868333400066 569 | 20 570 | 151.05850000000001 571 | 42 572 | 0.5357250106176582 573 | 10 574 | -151.54881666599937 575 | 20 576 | 151.05849999999998 577 | 42 578 | -0.25098845235329748 579 | 10 580 | -152.3813333324992 581 | 20 582 | 150.61249999999998 583 | 10 584 | -167.86866666750083 585 | 20 586 | 150.61250000000001 587 | 42 588 | -0.25098845235331874 589 | 10 590 | -168.70118333400063 591 | 20 592 | 151.05850000000001 593 | 42 594 | 0.53572501061765909 595 | 10 596 | -175.36131666599937 597 | 20 598 | 151.05850000000001 599 | 42 600 | -0.25098845235328276 601 | 10 602 | -176.19383333249917 603 | 20 604 | 150.61249999999998 605 | 10 606 | -176.69999999999993 607 | 20 608 | 150.61249999999998 609 | 42 610 | 0.41421356237309681 611 | 10 612 | -179.69999999999999 613 | 20 614 | 147.61250000000001 615 | 10 616 | -179.69999999999999 617 | 20 618 | 145.88006842985268 619 | 42 620 | -0.15664015019399466 621 | 10 622 | -179.88699999999997 623 | 20 624 | 145.29780474388215 625 | 42 626 | 0.32116033423636869 627 | 10 628 | -179.887 629 | 20 630 | 140.63969525611788 631 | 42 632 | -0.15664015019400204 633 | 10 634 | -179.69999999999999 635 | 20 636 | 140.05743157014732 637 | 10 638 | -179.69999999999996 639 | 20 640 | 122.06756842985268 641 | 42 642 | -0.15664015019398841 643 | 10 644 | -179.88699999999997 645 | 20 646 | 121.48530474388217 647 | 42 648 | 0.32116033423636869 649 | 10 650 | -179.887 651 | 20 652 | 116.82719525611788 653 | 42 654 | -0.15664015019400204 655 | 10 656 | -179.69999999999999 657 | 20 658 | 116.24493157014733 659 | 10 660 | -179.69999999999999 661 | 20 662 | 107.78006842985269 663 | 42 664 | -0.15664015019399466 665 | 10 666 | -179.88699999999997 667 | 20 668 | 107.19780474388217 669 | 42 670 | 0.32116033423636869 671 | 10 672 | -179.887 673 | 20 674 | 102.53969525611788 675 | 42 676 | -0.15664015019400204 677 | 10 678 | -179.69999999999999 679 | 20 680 | 101.95743157014734 681 | 10 682 | -179.69999999999996 683 | 20 684 | 83.96756842985269 685 | 42 686 | -0.15664015019398841 687 | 10 688 | -179.88699999999997 689 | 20 690 | 83.385304743882187 691 | 42 692 | 0.32116033423637258 693 | 0 694 | ENDSEC 695 | 0 696 | SECTION 697 | 2 698 | OBJECTS 699 | 0 700 | DICTIONARY 701 | 5 702 | C 703 | 100 704 | AcDbDictionary 705 | 3 706 | ACAD_GROUP 707 | 350 708 | D 709 | 3 710 | ACAD_MLINESTYLE 711 | 350 712 | 17 713 | 0 714 | DICTIONARY 715 | 5 716 | D 717 | 100 718 | AcDbDictionary 719 | 0 720 | DICTIONARY 721 | 5 722 | 1A 723 | 330 724 | C 725 | 100 726 | AcDbDictionary 727 | 0 728 | DICTIONARY 729 | 5 730 | 17 731 | 100 732 | AcDbDictionary 733 | 0 734 | ENDSEC 735 | 0 736 | EOF 737 | -------------------------------------------------------------------------------- /mechanicals/1.0/Hub20-riser.dxf: -------------------------------------------------------------------------------- 1 | 0 2 | SECTION 3 | 2 4 | HEADER 5 | 9 6 | $INSUNITS 7 | 70 8 | 4 9 | 9 10 | $ACADVER 11 | 1 12 | AC1014 13 | 9 14 | $HANDSEED 15 | 5 16 | FFFF 17 | 0 18 | ENDSEC 19 | 0 20 | SECTION 21 | 2 22 | TABLES 23 | 0 24 | TABLE 25 | 2 26 | VPORT 27 | 5 28 | 8 29 | 100 30 | AcDbSymbolTable 31 | 0 32 | ENDTAB 33 | 0 34 | TABLE 35 | 2 36 | LTYPE 37 | 5 38 | 5 39 | 100 40 | AcDbSymbolTable 41 | 0 42 | LTYPE 43 | 5 44 | 14 45 | 100 46 | AcDbSymbolTableRecord 47 | 100 48 | AcDbLinetypeTableRecord 49 | 2 50 | BYBLOCK 51 | 70 52 | 0 53 | 0 54 | LTYPE 55 | 5 56 | 15 57 | 100 58 | AcDbSymbolTableRecord 59 | 100 60 | AcDbLinetypeTableRecord 61 | 2 62 | BYLAYER 63 | 70 64 | 0 65 | 0 66 | ENDTAB 67 | 0 68 | TABLE 69 | 2 70 | LAYER 71 | 5 72 | 2 73 | 100 74 | AcDbSymbolTable 75 | 70 76 | 2 77 | 0 78 | LAYER 79 | 5 80 | 50 81 | 100 82 | AcDbSymbolTableRecord 83 | 100 84 | AcDbLayerTableRecord 85 | 2 86 | 0 87 | 70 88 | 0 89 | 6 90 | CONTINUOUS 91 | 0 92 | ENDTAB 93 | 0 94 | TABLE 95 | 2 96 | STYLE 97 | 5 98 | 3 99 | 100 100 | AcDbSymbolTable 101 | 70 102 | 1 103 | 0 104 | STYLE 105 | 5 106 | 11 107 | 100 108 | AcDbSymbolTableRecord 109 | 100 110 | AcDbTextStyleTableRecord 111 | 2 112 | STANDARD 113 | 70 114 | 0 115 | 0 116 | ENDTAB 117 | 0 118 | TABLE 119 | 2 120 | VIEW 121 | 5 122 | 6 123 | 100 124 | AcDbSymbolTable 125 | 70 126 | 0 127 | 0 128 | ENDTAB 129 | 0 130 | TABLE 131 | 2 132 | UCS 133 | 5 134 | 7 135 | 100 136 | AcDbSymbolTable 137 | 70 138 | 0 139 | 0 140 | ENDTAB 141 | 0 142 | TABLE 143 | 2 144 | APPID 145 | 5 146 | 9 147 | 100 148 | AcDbSymbolTable 149 | 70 150 | 2 151 | 0 152 | APPID 153 | 5 154 | 12 155 | 100 156 | AcDbSymbolTableRecord 157 | 100 158 | AcDbRegAppTableRecord 159 | 2 160 | ACAD 161 | 70 162 | 0 163 | 0 164 | ENDTAB 165 | 0 166 | TABLE 167 | 2 168 | DIMSTYLE 169 | 5 170 | A 171 | 100 172 | AcDbSymbolTable 173 | 70 174 | 1 175 | 0 176 | ENDTAB 177 | 0 178 | TABLE 179 | 2 180 | BLOCK_RECORD 181 | 5 182 | 1 183 | 100 184 | AcDbSymbolTable 185 | 70 186 | 1 187 | 0 188 | BLOCK_RECORD 189 | 5 190 | 1F 191 | 100 192 | AcDbSymbolTableRecord 193 | 100 194 | AcDbBlockTableRecord 195 | 2 196 | *MODEL_SPACE 197 | 0 198 | BLOCK_RECORD 199 | 5 200 | 1B 201 | 100 202 | AcDbSymbolTableRecord 203 | 100 204 | AcDbBlockTableRecord 205 | 2 206 | *PAPER_SPACE 207 | 0 208 | ENDTAB 209 | 0 210 | ENDSEC 211 | 0 212 | SECTION 213 | 2 214 | BLOCKS 215 | 0 216 | BLOCK 217 | 5 218 | 20 219 | 100 220 | AcDbEntity 221 | 100 222 | AcDbBlockBegin 223 | 2 224 | *MODEL_SPACE 225 | 0 226 | ENDBLK 227 | 5 228 | 21 229 | 100 230 | AcDbEntity 231 | 100 232 | AcDbBlockEnd 233 | 0 234 | BLOCK 235 | 5 236 | 1C 237 | 100 238 | AcDbEntity 239 | 100 240 | AcDbBlockBegin 241 | 2 242 | *PAPER_SPACE 243 | 0 244 | ENDBLK 245 | 5 246 | 1D 247 | 100 248 | AcDbEntity 249 | 100 250 | AcDbBlockEnd 251 | 0 252 | ENDSEC 253 | 0 254 | SECTION 255 | 2 256 | ENTITIES 257 | 0 258 | LWPOLYLINE 259 | 5 260 | 100 261 | 100 262 | AcDbEntity 263 | 8 264 | 0 265 | 100 266 | AcDbPolyline 267 | 90 268 | 8 269 | 70 270 | 1 271 | 43 272 | 0.0 273 | 10 274 | -191.15000000000003 275 | 20 276 | 66.549999999999997 277 | 42 278 | -0.41421356237309503 279 | 10 280 | -188.15000000000001 281 | 20 282 | 69.549999999999997 283 | 10 284 | -105.15000000000001 285 | 20 286 | 69.549999999999997 287 | 42 288 | -0.41421356237309503 289 | 10 290 | -102.15000000000001 291 | 20 292 | 66.549999999999997 293 | 10 294 | -102.15000000000002 295 | 20 296 | 54.549999999999997 297 | 42 298 | -0.41421356237309503 299 | 10 300 | -105.15000000000001 301 | 20 302 | 51.550000000000011 303 | 10 304 | -188.15000000000001 305 | 20 306 | 51.549999999999997 307 | 42 308 | -0.41421356237309503 309 | 10 310 | -191.15000000000003 311 | 20 312 | 54.549999999999997 313 | 0 314 | CIRCLE 315 | 5 316 | 101 317 | 100 318 | AcDbEntity 319 | 8 320 | 0 321 | 100 322 | AcDbCircle 323 | 10 324 | -105.15000000000001 325 | 20 326 | 54.549999999999997 327 | 30 328 | 0 329 | 40 330 | 1.1000000000000001 331 | 210 332 | 0 333 | 220 334 | 0 335 | 230 336 | 1 337 | 0 338 | CIRCLE 339 | 5 340 | 102 341 | 100 342 | AcDbEntity 343 | 8 344 | 0 345 | 100 346 | AcDbCircle 347 | 10 348 | -188.15000000000001 349 | 20 350 | 54.549999999999997 351 | 30 352 | 0 353 | 40 354 | 1.1000000000000001 355 | 210 356 | 0 357 | 220 358 | 0 359 | 230 360 | 1 361 | 0 362 | ENDSEC 363 | 0 364 | SECTION 365 | 2 366 | OBJECTS 367 | 0 368 | DICTIONARY 369 | 5 370 | C 371 | 100 372 | AcDbDictionary 373 | 3 374 | ACAD_GROUP 375 | 350 376 | D 377 | 3 378 | ACAD_MLINESTYLE 379 | 350 380 | 17 381 | 0 382 | DICTIONARY 383 | 5 384 | D 385 | 100 386 | AcDbDictionary 387 | 0 388 | DICTIONARY 389 | 5 390 | 1A 391 | 330 392 | C 393 | 100 394 | AcDbDictionary 395 | 0 396 | DICTIONARY 397 | 5 398 | 17 399 | 100 400 | AcDbDictionary 401 | 0 402 | ENDSEC 403 | 0 404 | EOF 405 | -------------------------------------------------------------------------------- /mechanicals/1.0/Hub20-top.dxf: -------------------------------------------------------------------------------- 1 | 0 2 | SECTION 3 | 2 4 | HEADER 5 | 9 6 | $INSUNITS 7 | 70 8 | 4 9 | 9 10 | $ACADVER 11 | 1 12 | AC1014 13 | 9 14 | $HANDSEED 15 | 5 16 | FFFF 17 | 0 18 | ENDSEC 19 | 0 20 | SECTION 21 | 2 22 | TABLES 23 | 0 24 | TABLE 25 | 2 26 | VPORT 27 | 5 28 | 8 29 | 100 30 | AcDbSymbolTable 31 | 0 32 | ENDTAB 33 | 0 34 | TABLE 35 | 2 36 | LTYPE 37 | 5 38 | 5 39 | 100 40 | AcDbSymbolTable 41 | 0 42 | LTYPE 43 | 5 44 | 14 45 | 100 46 | AcDbSymbolTableRecord 47 | 100 48 | AcDbLinetypeTableRecord 49 | 2 50 | BYBLOCK 51 | 70 52 | 0 53 | 0 54 | LTYPE 55 | 5 56 | 15 57 | 100 58 | AcDbSymbolTableRecord 59 | 100 60 | AcDbLinetypeTableRecord 61 | 2 62 | BYLAYER 63 | 70 64 | 0 65 | 0 66 | ENDTAB 67 | 0 68 | TABLE 69 | 2 70 | LAYER 71 | 5 72 | 2 73 | 100 74 | AcDbSymbolTable 75 | 70 76 | 2 77 | 0 78 | LAYER 79 | 5 80 | 50 81 | 100 82 | AcDbSymbolTableRecord 83 | 100 84 | AcDbLayerTableRecord 85 | 2 86 | 0 87 | 70 88 | 0 89 | 6 90 | CONTINUOUS 91 | 0 92 | ENDTAB 93 | 0 94 | TABLE 95 | 2 96 | STYLE 97 | 5 98 | 3 99 | 100 100 | AcDbSymbolTable 101 | 70 102 | 1 103 | 0 104 | STYLE 105 | 5 106 | 11 107 | 100 108 | AcDbSymbolTableRecord 109 | 100 110 | AcDbTextStyleTableRecord 111 | 2 112 | STANDARD 113 | 70 114 | 0 115 | 0 116 | ENDTAB 117 | 0 118 | TABLE 119 | 2 120 | VIEW 121 | 5 122 | 6 123 | 100 124 | AcDbSymbolTable 125 | 70 126 | 0 127 | 0 128 | ENDTAB 129 | 0 130 | TABLE 131 | 2 132 | UCS 133 | 5 134 | 7 135 | 100 136 | AcDbSymbolTable 137 | 70 138 | 0 139 | 0 140 | ENDTAB 141 | 0 142 | TABLE 143 | 2 144 | APPID 145 | 5 146 | 9 147 | 100 148 | AcDbSymbolTable 149 | 70 150 | 2 151 | 0 152 | APPID 153 | 5 154 | 12 155 | 100 156 | AcDbSymbolTableRecord 157 | 100 158 | AcDbRegAppTableRecord 159 | 2 160 | ACAD 161 | 70 162 | 0 163 | 0 164 | ENDTAB 165 | 0 166 | TABLE 167 | 2 168 | DIMSTYLE 169 | 5 170 | A 171 | 100 172 | AcDbSymbolTable 173 | 70 174 | 1 175 | 0 176 | ENDTAB 177 | 0 178 | TABLE 179 | 2 180 | BLOCK_RECORD 181 | 5 182 | 1 183 | 100 184 | AcDbSymbolTable 185 | 70 186 | 1 187 | 0 188 | BLOCK_RECORD 189 | 5 190 | 1F 191 | 100 192 | AcDbSymbolTableRecord 193 | 100 194 | AcDbBlockTableRecord 195 | 2 196 | *MODEL_SPACE 197 | 0 198 | BLOCK_RECORD 199 | 5 200 | 1B 201 | 100 202 | AcDbSymbolTableRecord 203 | 100 204 | AcDbBlockTableRecord 205 | 2 206 | *PAPER_SPACE 207 | 0 208 | ENDTAB 209 | 0 210 | ENDSEC 211 | 0 212 | SECTION 213 | 2 214 | BLOCKS 215 | 0 216 | BLOCK 217 | 5 218 | 20 219 | 100 220 | AcDbEntity 221 | 100 222 | AcDbBlockBegin 223 | 2 224 | *MODEL_SPACE 225 | 0 226 | ENDBLK 227 | 5 228 | 21 229 | 100 230 | AcDbEntity 231 | 100 232 | AcDbBlockEnd 233 | 0 234 | BLOCK 235 | 5 236 | 1C 237 | 100 238 | AcDbEntity 239 | 100 240 | AcDbBlockBegin 241 | 2 242 | *PAPER_SPACE 243 | 0 244 | ENDBLK 245 | 5 246 | 1D 247 | 100 248 | AcDbEntity 249 | 100 250 | AcDbBlockEnd 251 | 0 252 | ENDSEC 253 | 0 254 | SECTION 255 | 2 256 | ENTITIES 257 | 0 258 | LWPOLYLINE 259 | 5 260 | 100 261 | 100 262 | AcDbEntity 263 | 8 264 | 0 265 | 100 266 | AcDbPolyline 267 | 90 268 | 56 269 | 70 270 | 1 271 | 43 272 | 0.0 273 | 10 274 | -102.70000000000002 275 | 20 276 | 77.824257580454443 277 | 42 278 | -0.17754470554104512 279 | 10 280 | -102.46300000000002 281 | 20 282 | 78.470656064363553 283 | 42 284 | 0.36664689955139712 285 | 10 286 | -102.46300000000002 287 | 20 288 | 83.641843935636473 289 | 42 290 | -0.17754470554103516 291 | 10 292 | -102.70000000000002 293 | 20 294 | 84.288242419545583 295 | 10 296 | -102.70000000000002 297 | 20 298 | 101.63675758045443 299 | 42 300 | -0.17754470554103516 301 | 10 302 | -102.46300000000002 303 | 20 304 | 102.28315606436354 305 | 42 306 | 0.3666468995513969 307 | 10 308 | -102.46300000000002 309 | 20 310 | 107.45434393563649 311 | 42 312 | -0.17754470554103516 313 | 10 314 | -102.70000000000002 315 | 20 316 | 108.1007424195456 317 | 10 318 | -102.69999999999999 319 | 20 320 | 115.92425758045444 321 | 42 322 | -0.17754470554103813 323 | 10 324 | -102.46299999999999 325 | 20 326 | 116.57065606436355 327 | 42 328 | 0.36664689955139745 329 | 10 330 | -102.46300000000002 331 | 20 332 | 121.74184393563647 333 | 42 334 | -0.17754470554103516 335 | 10 336 | -102.70000000000002 337 | 20 338 | 122.38824241954558 339 | 10 340 | -102.70000000000002 341 | 20 342 | 139.73675758045442 343 | 42 344 | -0.17754470554102691 345 | 10 346 | -102.46300000000002 347 | 20 348 | 140.38315606436356 349 | 42 350 | 0.36664689955139551 351 | 10 352 | -102.46299999999998 353 | 20 354 | 145.55434393563644 355 | 42 356 | -0.17754470554102061 357 | 10 358 | -102.70000000000002 359 | 20 360 | 146.20074241954558 361 | 10 362 | -102.70000000000002 363 | 20 364 | 147.61250000000001 365 | 42 366 | 0.41421356237308815 367 | 10 368 | -105.70000000000002 369 | 20 370 | 150.61250000000001 371 | 10 372 | -105.95616666750087 373 | 20 374 | 150.61250000000001 375 | 42 376 | -0.25098845235329736 377 | 10 378 | -106.78868333400069 379 | 20 380 | 151.05850000000001 381 | 42 382 | 0.53572501061765354 383 | 10 384 | -113.44881666599933 385 | 20 386 | 151.05850000000001 387 | 42 388 | -0.25098845235328227 389 | 10 390 | -114.28133333249919 391 | 20 392 | 150.61250000000001 393 | 10 394 | -129.76866666750081 395 | 20 396 | 150.61250000000004 397 | 42 398 | -0.25098845235327694 399 | 10 400 | -130.60118333400064 401 | 20 402 | 151.05850000000001 403 | 42 404 | 0.53572501061766065 405 | 10 406 | -137.2613166659994 407 | 20 408 | 151.05850000000001 409 | 42 410 | -0.25098845235329748 411 | 10 412 | -138.09383333249923 413 | 20 414 | 150.61250000000001 415 | 10 416 | -144.0561666675008 417 | 20 418 | 150.61249999999998 419 | 42 420 | -0.25098845235329348 421 | 10 422 | -144.88868333400066 423 | 20 424 | 151.05849999999998 425 | 42 426 | 0.5357250106176602 427 | 10 428 | -151.54881666599937 429 | 20 430 | 151.05850000000001 431 | 42 432 | -0.25098845235331263 433 | 10 434 | -152.38133333249917 435 | 20 436 | 150.61249999999998 437 | 10 438 | -167.86866666750083 439 | 20 440 | 150.61250000000001 441 | 42 442 | -0.25098845235331874 443 | 10 444 | -168.70118333400063 445 | 20 446 | 151.05850000000001 447 | 42 448 | 0.53572501061765421 449 | 10 450 | -175.36131666599937 451 | 20 452 | 151.05850000000001 453 | 42 454 | -0.25098845235328276 455 | 10 456 | -176.19383333249917 457 | 20 458 | 150.61249999999998 459 | 10 460 | -176.69999999999993 461 | 20 462 | 150.61249999999998 463 | 42 464 | 0.41421356237310375 465 | 10 466 | -179.69999999999999 467 | 20 468 | 147.61250000000001 469 | 10 470 | -179.69999999999999 471 | 20 472 | 145.88006842985268 473 | 42 474 | -0.1566401501940074 475 | 10 476 | -179.887 477 | 20 478 | 145.29780474388212 479 | 42 480 | 0.32116033423636242 481 | 10 482 | -179.887 483 | 20 484 | 140.63969525611788 485 | 42 486 | -0.15664015019400204 487 | 10 488 | -179.69999999999999 489 | 20 490 | 140.05743157014732 491 | 10 492 | -179.69999999999999 493 | 20 494 | 122.06756842985268 495 | 42 496 | -0.15664015019400115 497 | 10 498 | -179.887 499 | 20 500 | 121.48530474388212 501 | 42 502 | 0.32116033423636814 503 | 10 504 | -179.887 505 | 20 506 | 116.82719525611788 507 | 42 508 | -0.15664015019400204 509 | 10 510 | -179.69999999999999 511 | 20 512 | 116.24493157014733 513 | 10 514 | -179.69999999999999 515 | 20 516 | 107.78006842985269 517 | 42 518 | -0.1566401501940074 519 | 10 520 | -179.887 521 | 20 522 | 107.19780474388214 523 | 42 524 | 0.32116033423636242 525 | 10 526 | -179.887 527 | 20 528 | 102.53969525611788 529 | 42 530 | -0.15664015019400204 531 | 10 532 | -179.69999999999999 533 | 20 534 | 101.95743157014734 535 | 10 536 | -179.69999999999996 537 | 20 538 | 83.96756842985269 539 | 42 540 | -0.15664015019399591 541 | 10 542 | -179.88699999999997 543 | 20 544 | 83.385304743882145 545 | 42 546 | 0.3211603342363763 547 | 10 548 | -179.88699999999994 549 | 20 550 | 78.727195256117867 551 | 42 552 | -0.15664015019402036 553 | 10 554 | -179.69999999999999 555 | 20 556 | 78.144931570147349 557 | 10 558 | -179.69999999999999 559 | 20 560 | 38.587500000000006 561 | 42 562 | 0.4142135623730937 563 | 10 564 | -176.69999999999999 565 | 20 566 | 35.587500000000006 567 | 10 568 | -105.70000000000002 569 | 20 570 | 35.587499999999999 571 | 42 572 | 0.41421356237309076 573 | 10 574 | -102.70000000000002 575 | 20 576 | 38.587500000000006 577 | 0 578 | CIRCLE 579 | 5 580 | 101 581 | 100 582 | AcDbEntity 583 | 8 584 | 0 585 | 100 586 | AcDbCircle 587 | 10 588 | -99.700000000000003 589 | 20 590 | 35.587499999999999 591 | 30 592 | 0 593 | 40 594 | 1.6000000000000014 595 | 210 596 | 0 597 | 220 598 | 0 599 | 230 600 | 1 601 | 0 602 | CIRCLE 603 | 5 604 | 102 605 | 100 606 | AcDbEntity 607 | 8 608 | 0 609 | 100 610 | AcDbCircle 611 | 10 612 | -182.69999999999999 613 | 20 614 | 35.587499999999999 615 | 30 616 | 0 617 | 40 618 | 1.6000000000000014 619 | 210 620 | 0 621 | 220 622 | 0 623 | 230 624 | 1 625 | 0 626 | CIRCLE 627 | 5 628 | 103 629 | 100 630 | AcDbEntity 631 | 8 632 | 0 633 | 100 634 | AcDbCircle 635 | 10 636 | -182.69999999999999 637 | 20 638 | 153.58750000000001 639 | 30 640 | 0 641 | 40 642 | 1.6000000000000014 643 | 210 644 | 0 645 | 220 646 | 0 647 | 230 648 | 1 649 | 0 650 | CIRCLE 651 | 5 652 | 104 653 | 100 654 | AcDbEntity 655 | 8 656 | 0 657 | 100 658 | AcDbCircle 659 | 10 660 | -99.700000000000003 661 | 20 662 | 153.58750000000001 663 | 30 664 | 0 665 | 40 666 | 1.6000000000000014 667 | 210 668 | 0 669 | 220 670 | 0 671 | 230 672 | 1 673 | 0 674 | LWPOLYLINE 675 | 5 676 | 105 677 | 100 678 | AcDbEntity 679 | 8 680 | 0 681 | 100 682 | AcDbPolyline 683 | 90 684 | 8 685 | 70 686 | 1 687 | 43 688 | 0.0 689 | 10 690 | -99.700000000000003 691 | 20 692 | 156.61250000000001 693 | 42 694 | -0.41421356237309503 695 | 10 696 | -96.700000000000017 697 | 20 698 | 153.61250000000001 699 | 10 700 | -96.700000000000017 701 | 20 702 | 35.587499999999999 703 | 42 704 | -0.41421356237309503 705 | 10 706 | -99.700000000000003 707 | 20 708 | 32.587500000000006 709 | 10 710 | -182.69999999999999 711 | 20 712 | 32.587499999999991 713 | 42 714 | -0.41421356237309503 715 | 10 716 | -185.69999999999999 717 | 20 718 | 35.587499999999999 719 | 10 720 | -185.69999999999999 721 | 20 722 | 153.61250000000001 723 | 42 724 | -0.41421356237309503 725 | 10 726 | -182.69999999999999 727 | 20 728 | 156.61250000000001 729 | 0 730 | ENDSEC 731 | 0 732 | SECTION 733 | 2 734 | OBJECTS 735 | 0 736 | DICTIONARY 737 | 5 738 | C 739 | 100 740 | AcDbDictionary 741 | 3 742 | ACAD_GROUP 743 | 350 744 | D 745 | 3 746 | ACAD_MLINESTYLE 747 | 350 748 | 17 749 | 0 750 | DICTIONARY 751 | 5 752 | D 753 | 100 754 | AcDbDictionary 755 | 0 756 | DICTIONARY 757 | 5 758 | 1A 759 | 330 760 | C 761 | 100 762 | AcDbDictionary 763 | 0 764 | DICTIONARY 765 | 5 766 | 17 767 | 100 768 | AcDbDictionary 769 | 0 770 | ENDSEC 771 | 0 772 | EOF 773 | -------------------------------------------------------------------------------- /mechanicals/1.0/bottom-plate-gerbers.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joshajohnson/Hub20/f781e843167f94afac979929ccd29d1ee586b9fa/mechanicals/1.0/bottom-plate-gerbers.zip -------------------------------------------------------------------------------- /mechanicals/1.0/plate-gerbers.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joshajohnson/Hub20/f781e843167f94afac979929ccd29d1ee586b9fa/mechanicals/1.0/plate-gerbers.zip -------------------------------------------------------------------------------- /mechanicals/plate/.gitignore: -------------------------------------------------------------------------------- 1 | # For PCBs designed using KiCad: http://www.kicad-pcb.org/ 2 | # Format documentation: http://kicad-pcb.org/help/file-formats/ 3 | 4 | # Temporary files 5 | *.000 6 | *.bak 7 | *.bck 8 | *.kicad_pcb-bak 9 | *.sch-bak 10 | *~ 11 | _autosave-* 12 | *.tmp 13 | *-save.pro 14 | *-save.kicad_pcb 15 | fp-info-cache 16 | 17 | # Netlist files (exported from Eeschema) 18 | *.net 19 | 20 | # Autorouter files (exported from Pcbnew) 21 | *.dsn 22 | *.ses 23 | 24 | # Exported BOM files 25 | *.xml 26 | *.csv 27 | 28 | # Gerbers 29 | *.zip 30 | gerbers/* 31 | -------------------------------------------------------------------------------- /mechanicals/plate/Hub20.pro: -------------------------------------------------------------------------------- 1 | update=Sun 05 Jul 2020 14:21:55 2 | version=1 3 | last_client=kicad 4 | [general] 5 | version=1 6 | RootSch= 7 | BoardNm= 8 | [cvpcb] 9 | version=1 10 | NetIExt=net 11 | [eeschema] 12 | version=1 13 | LibDir= 14 | [eeschema/libraries] 15 | [pcbnew] 16 | version=1 17 | PageLayoutDescrFile= 18 | LastNetListRead= 19 | CopperLayerCount=4 20 | BoardThickness=1.6 21 | AllowMicroVias=0 22 | AllowBlindVias=0 23 | RequireCourtyardDefinitions=0 24 | ProhibitOverlappingCourtyards=1 25 | MinTrackWidth=0.15 26 | MinViaDiameter=0.5 27 | MinViaDrill=0.25 28 | MinMicroViaDiameter=0.2 29 | MinMicroViaDrill=0.09999999999999999 30 | MinHoleToHole=0.25 31 | TrackWidth1=0.25 32 | TrackWidth2=0.2 33 | TrackWidth3=0.25 34 | TrackWidth4=0.3 35 | TrackWidth5=0.4 36 | ViaDiameter1=0.5 37 | ViaDrill1=0.25 38 | ViaDiameter2=0.6 39 | ViaDrill2=0.3 40 | ViaDiameter3=0.8 41 | ViaDrill3=0.4 42 | dPairWidth1=0.25 43 | dPairGap1=0.2 44 | dPairViaGap1=0.25 45 | SilkLineWidth=0.15 46 | SilkTextSizeV=1 47 | SilkTextSizeH=1 48 | SilkTextSizeThickness=0.15 49 | SilkTextItalic=0 50 | SilkTextUpright=1 51 | CopperLineWidth=0.2 52 | CopperTextSizeV=1.5 53 | CopperTextSizeH=1.5 54 | CopperTextThickness=0.3 55 | CopperTextItalic=0 56 | CopperTextUpright=1 57 | EdgeCutLineWidth=0.09999999999999999 58 | CourtyardLineWidth=0.05 59 | OthersLineWidth=0.15 60 | OthersTextSizeV=1 61 | OthersTextSizeH=1 62 | OthersTextSizeThickness=0.15 63 | OthersTextItalic=0 64 | OthersTextUpright=1 65 | SolderMaskClearance=0 66 | SolderMaskMinWidth=0 67 | SolderPasteClearance=0 68 | SolderPasteRatio=-0 69 | [pcbnew/Layer.F.Cu] 70 | Name=F.Cu 71 | Type=0 72 | Enabled=1 73 | [pcbnew/Layer.In1.Cu] 74 | Name=In1.Cu 75 | Type=0 76 | Enabled=1 77 | [pcbnew/Layer.In2.Cu] 78 | Name=In2.Cu 79 | Type=0 80 | Enabled=1 81 | [pcbnew/Layer.In3.Cu] 82 | Name=In3.Cu 83 | Type=0 84 | Enabled=0 85 | [pcbnew/Layer.In4.Cu] 86 | Name=In4.Cu 87 | Type=0 88 | Enabled=0 89 | [pcbnew/Layer.In5.Cu] 90 | Name=In5.Cu 91 | Type=0 92 | Enabled=0 93 | [pcbnew/Layer.In6.Cu] 94 | Name=In6.Cu 95 | Type=0 96 | Enabled=0 97 | [pcbnew/Layer.In7.Cu] 98 | Name=In7.Cu 99 | Type=0 100 | Enabled=0 101 | [pcbnew/Layer.In8.Cu] 102 | Name=In8.Cu 103 | Type=0 104 | Enabled=0 105 | [pcbnew/Layer.In9.Cu] 106 | Name=In9.Cu 107 | Type=0 108 | Enabled=0 109 | [pcbnew/Layer.In10.Cu] 110 | Name=In10.Cu 111 | Type=0 112 | Enabled=0 113 | [pcbnew/Layer.In11.Cu] 114 | Name=In11.Cu 115 | Type=0 116 | Enabled=0 117 | [pcbnew/Layer.In12.Cu] 118 | Name=In12.Cu 119 | Type=0 120 | Enabled=0 121 | [pcbnew/Layer.In13.Cu] 122 | Name=In13.Cu 123 | Type=0 124 | Enabled=0 125 | [pcbnew/Layer.In14.Cu] 126 | Name=In14.Cu 127 | Type=0 128 | Enabled=0 129 | [pcbnew/Layer.In15.Cu] 130 | Name=In15.Cu 131 | Type=0 132 | Enabled=0 133 | [pcbnew/Layer.In16.Cu] 134 | Name=In16.Cu 135 | Type=0 136 | Enabled=0 137 | [pcbnew/Layer.In17.Cu] 138 | Name=In17.Cu 139 | Type=0 140 | Enabled=0 141 | [pcbnew/Layer.In18.Cu] 142 | Name=In18.Cu 143 | Type=0 144 | Enabled=0 145 | [pcbnew/Layer.In19.Cu] 146 | Name=In19.Cu 147 | Type=0 148 | Enabled=0 149 | [pcbnew/Layer.In20.Cu] 150 | Name=In20.Cu 151 | Type=0 152 | Enabled=0 153 | [pcbnew/Layer.In21.Cu] 154 | Name=In21.Cu 155 | Type=0 156 | Enabled=0 157 | [pcbnew/Layer.In22.Cu] 158 | Name=In22.Cu 159 | Type=0 160 | Enabled=0 161 | [pcbnew/Layer.In23.Cu] 162 | Name=In23.Cu 163 | Type=0 164 | Enabled=0 165 | [pcbnew/Layer.In24.Cu] 166 | Name=In24.Cu 167 | Type=0 168 | Enabled=0 169 | [pcbnew/Layer.In25.Cu] 170 | Name=In25.Cu 171 | Type=0 172 | Enabled=0 173 | [pcbnew/Layer.In26.Cu] 174 | Name=In26.Cu 175 | Type=0 176 | Enabled=0 177 | [pcbnew/Layer.In27.Cu] 178 | Name=In27.Cu 179 | Type=0 180 | Enabled=0 181 | [pcbnew/Layer.In28.Cu] 182 | Name=In28.Cu 183 | Type=0 184 | Enabled=0 185 | [pcbnew/Layer.In29.Cu] 186 | Name=In29.Cu 187 | Type=0 188 | Enabled=0 189 | [pcbnew/Layer.In30.Cu] 190 | Name=In30.Cu 191 | Type=0 192 | Enabled=0 193 | [pcbnew/Layer.B.Cu] 194 | Name=B.Cu 195 | Type=0 196 | Enabled=1 197 | [pcbnew/Layer.B.Adhes] 198 | Enabled=1 199 | [pcbnew/Layer.F.Adhes] 200 | Enabled=1 201 | [pcbnew/Layer.B.Paste] 202 | Enabled=1 203 | [pcbnew/Layer.F.Paste] 204 | Enabled=1 205 | [pcbnew/Layer.B.SilkS] 206 | Enabled=1 207 | [pcbnew/Layer.F.SilkS] 208 | Enabled=1 209 | [pcbnew/Layer.B.Mask] 210 | Enabled=1 211 | [pcbnew/Layer.F.Mask] 212 | Enabled=1 213 | [pcbnew/Layer.Dwgs.User] 214 | Enabled=1 215 | [pcbnew/Layer.Cmts.User] 216 | Enabled=1 217 | [pcbnew/Layer.Eco1.User] 218 | Enabled=1 219 | [pcbnew/Layer.Eco2.User] 220 | Enabled=1 221 | [pcbnew/Layer.Edge.Cuts] 222 | Enabled=1 223 | [pcbnew/Layer.Margin] 224 | Enabled=1 225 | [pcbnew/Layer.B.CrtYd] 226 | Enabled=1 227 | [pcbnew/Layer.F.CrtYd] 228 | Enabled=1 229 | [pcbnew/Layer.B.Fab] 230 | Enabled=1 231 | [pcbnew/Layer.F.Fab] 232 | Enabled=1 233 | [pcbnew/Layer.Rescue] 234 | Enabled=0 235 | [pcbnew/Netclasses] 236 | [pcbnew/Netclasses/Default] 237 | Name=Default 238 | Clearance=0.2 239 | TrackWidth=0.25 240 | ViaDiameter=0.5 241 | ViaDrill=0.25 242 | uViaDiameter=0.3 243 | uViaDrill=0.1 244 | dPairWidth=0.25 245 | dPairGap=0.2 246 | dPairViaGap=0.25 247 | [pcbnew/Netclasses/1] 248 | Name=Power 249 | Clearance=0.2 250 | TrackWidth=0.3 251 | ViaDiameter=0.6 252 | ViaDrill=0.3 253 | uViaDiameter=0.3 254 | uViaDrill=0.1 255 | dPairWidth=0.25 256 | dPairGap=0.2 257 | dPairViaGap=0.25 258 | -------------------------------------------------------------------------------- /mechanicals/plate/Hub20.sch: -------------------------------------------------------------------------------- 1 | EESchema Schematic File Version 4 2 | EELAYER 30 0 3 | EELAYER END 4 | $Descr A3 16535 11693 5 | encoding utf-8 6 | Sheet 1 1 7 | Title "Hub20" 8 | Date "2020-07-04" 9 | Rev "0.1" 10 | Comp "Josh Johnson" 11 | Comment1 "" 12 | Comment2 "" 13 | Comment3 "" 14 | Comment4 "" 15 | $EndDescr 16 | $Comp 17 | L Mechanical:MountingHole H3 18 | U 1 1 5EF4D892 19 | P 11450 10850 20 | F 0 "H3" H 11550 10896 50 0000 L CNN 21 | F 1 "M3" H 11550 10805 50 0000 L CNN 22 | F 2 "MountingHole:MountingHole_3.2mm_M3" H 11450 10850 50 0001 C CNN 23 | F 3 "~" H 11450 10850 50 0001 C CNN 24 | 1 11450 10850 25 | 1 0 0 -1 26 | $EndComp 27 | $Comp 28 | L Mechanical:MountingHole H4 29 | U 1 1 5EF4F9B8 30 | P 11450 11050 31 | F 0 "H4" H 11550 11096 50 0000 L CNN 32 | F 1 "M3" H 11550 11005 50 0000 L CNN 33 | F 2 "MountingHole:MountingHole_3.2mm_M3" H 11450 11050 50 0001 C CNN 34 | F 3 "~" H 11450 11050 50 0001 C CNN 35 | 1 11450 11050 36 | 1 0 0 -1 37 | $EndComp 38 | $Comp 39 | L Mechanical:MountingHole H1 40 | U 1 1 5EF4FC8A 41 | P 11450 10450 42 | F 0 "H1" H 11550 10496 50 0000 L CNN 43 | F 1 "M3" H 11550 10405 50 0000 L CNN 44 | F 2 "MountingHole:MountingHole_3.2mm_M3" H 11450 10450 50 0001 C CNN 45 | F 3 "~" H 11450 10450 50 0001 C CNN 46 | 1 11450 10450 47 | 1 0 0 -1 48 | $EndComp 49 | Text Notes 11150 10200 0 50 ~ 0 50 | Mounting Holes 51 | $Comp 52 | L Mechanical:MountingHole H2 53 | U 1 1 5EF4FEC8 54 | P 11450 10650 55 | F 0 "H2" H 11550 10696 50 0000 L CNN 56 | F 1 "M3" H 11550 10605 50 0000 L CNN 57 | F 2 "MountingHole:MountingHole_3.2mm_M3" H 11450 10650 50 0001 C CNN 58 | F 3 "~" H 11450 10650 50 0001 C CNN 59 | 1 11450 10650 60 | 1 0 0 -1 61 | $EndComp 62 | $EndSCHEMATC 63 | -------------------------------------------------------------------------------- /mechanicals/plate/fp-lib-table: -------------------------------------------------------------------------------- 1 | (fp_lib_table 2 | (lib (name josh-buttons-switches)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-buttons-switches.pretty)(options "")(descr "")) 3 | (lib (name josh-connectors)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-connectors.pretty)(options "")(descr "")) 4 | (lib (name josh-dfn-qfn)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-dfn-qfn.pretty)(options "")(descr "")) 5 | (lib (name josh-led)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-led.pretty)(options "")(descr "")) 6 | (lib (name josh-logos)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-logos.pretty)(options "")(descr "")) 7 | (lib (name josh-mechanical)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-mechanical.pretty)(options "")(descr "")) 8 | (lib (name josh-oscillators)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-oscillators.pretty)(options "")(descr "")) 9 | (lib (name josh-passives-smt)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-passives-smt.pretty)(options "")(descr "")) 10 | (lib (name josh-rf)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-rf.pretty)(options "")(descr "")) 11 | (lib (name josh-soic-sot-etc)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-soic-sot-etc.pretty)(options "")(descr "")) 12 | (lib (name josh-test-point)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-test-point.pretty)(options "")(descr "")) 13 | (lib (name josh-display)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-display.pretty)(options "")(descr "")) 14 | (lib (name josh-keyboard)(type KiCad)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-keyboard.pretty)(options "")(descr "")) 15 | ) 16 | -------------------------------------------------------------------------------- /mechanicals/plate/sym-lib-table: -------------------------------------------------------------------------------- 1 | (sym_lib_table 2 | (lib (name josh-ic)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-ic.lib)(options "")(descr "")) 3 | (lib (name josh-led)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-led.lib)(options "")(descr "")) 4 | (lib (name josh-logic)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-logic.lib)(options "")(descr "")) 5 | (lib (name josh-mechnanical)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-mechnanical.lib)(options "")(descr "")) 6 | (lib (name josh-memory)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-memory.lib)(options "")(descr "")) 7 | (lib (name josh-oscillator)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-oscillator.lib)(options "")(descr "")) 8 | (lib (name josh-passive)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-passive.lib)(options "")(descr "")) 9 | (lib (name josh-power)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-power.lib)(options "")(descr "")) 10 | (lib (name josh-rf)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-rf.lib)(options "")(descr "")) 11 | (lib (name josh-connector)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-connector.lib)(options "")(descr "")) 12 | (lib (name josh-display)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-display.lib)(options "")(descr "")) 13 | (lib (name josh-keyboard)(type Legacy)(uri ${KIPRJMOD}/../../josh-kicad-lib/josh-keyboard.lib)(options "")(descr "")) 14 | ) 15 | -------------------------------------------------------------------------------- /production/1.0/Hub20-Acrylic.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joshajohnson/Hub20/f781e843167f94afac979929ccd29d1ee586b9fa/production/1.0/Hub20-Acrylic.zip -------------------------------------------------------------------------------- /production/1.0/bom.csv: -------------------------------------------------------------------------------- 1 | Qty,Reference(s),Value,Footprint,MPN,DigiKey,LCSC,Manufacturer,DNP,Notes,Substitue Allowed? 2 | 44,"C1, C11, C12, C13, C15, C16, C17, C21, C22, C23, C24, C25, C26, C27, C29, C30, C31, C33, C35, C36, C37, C38, C39, C4, C40, C42, C43, C46, C47, C48, C49, C5, C50, C51, C52, C53, C56, C58, C59, C6, C60, C7, C8, C9",100n,Capacitor_SMD:C_0603_1608Metric,CL10B104KB8NNNC,1276-1000-1-ND,C1591,Samsung Electro-Mechanics,,,Y - X5R or better 3 | 8,"C10, C19, C28, C32, C34, C54, C55, C57",1u,Capacitor_SMD:C_0603_1608Metric,CL10A105MP8NNNC ,1276-1866-1-ND ,C29936,Samsung Electro-Mechanics,,,Y - X5R or better 4 | 3,"C14, C20, C41",10u,Capacitor_SMD:C_0603_1608Metric,CL10A106MP8NNNC,1276-1871-1-ND,C85713,Samsung Electro-Mechanics,,,Y - X5R or better 5 | 1,C18,4u7,Capacitor_SMD:C_0603_1608Metric,CL10A475MP8NNNC,1276-1905-1-ND,C307473,Samsung Electro-Mechanics,,,Y - X5R or better 6 | 2,"C44, C45",15p,Capacitor_SMD:C_0603_1608Metric,CL10C150JB8NNNC,1276-1296-2-ND,C1644,Samsung Electro-Mechanics,,,Y - NP0 / C0G 7 | 1,D1,1N4148,Diode_SMD:D_SOD-123,1N4148W-7-F,1N4148W-FDICT-ND,C83528,Diodes Inc,,,Y - Any 1N4148 8 | 22,"D10, D11, D12, D13, D14, D16, D18, D19, D20, D21, D22, D24, D25, D26, D27, D28, D29, D4, D5, D6, D7, D8",1N4148,Diode_SMD:D_SOD-123,1N4148W-7-F,1N4148W-FDICT-ND,C83528,Diodes Inc,,,Y - Any 1N4148 9 | 7,"D15, D17, D2, D23, D3, D30, D9",WS2812B,LED_SMD:LED_WS2812B_PLCC4_5.0x5.0mm_P3.2mm,WS2812B,1528-1104-ND,C114586,Worldsemi,,Must be black,N 10 | 20,"D31, D33, D34, D35, D36, D37, D38, D39, D40, D41, D42, D43, D44, D45, D46, D47, D48, D49, D50, D51",SK6812MINI-E,josh-keyboard:DUMMY_SK6812MINI-E,SK6812MINI-E,,,Shenzhen LED Colour,,Similar to: https://www.alibaba.com/product-detail/Best-selling-SK6812-MINI-E-1500pcs_62354369359.html,N 11 | 1,D32,LED,LED_SMD:LED_0603_1608Metric,OSK40603C1E,,C268294,OptoSupply,,,Y - Any Pink / Purple 12 | 1,F1,1A,josh-passives-smt:Fuse_0805_2012Metric,0805L100WR,F2774CT-ND,C80270,Littelfuse,,,Y - 1A hold / >1.5A trip 13 | 3,"F2, F3, F4",500mA,josh-passives-smt:Fuse_0805_2012Metric,0805L050WR,F2772CT-ND,C207022,Littelfuse,,,Y - 500mA hold / 1A trip 14 | 5,"FB1, FB2, FB3, FB4, FB5",600R,josh-passives-smt:Ferrite_Bead_0603,BLM18KG601SN1D, 490-5258-1-ND ,C85833,Murata,,,"Y - 600R, > 1A current" 15 | 4,"H1, H2, H3, H4",M3,MountingHole:MountingHole_3.2mm_M3,,,,,DNP,, 16 | 4,"J1, J2, J3, J4",USB_C_Receptacle_USB2.0,josh-connectors:USB_C_U262-161N-4BVC11,U262-161N-4BVC11,,C319148,XKB Enterprise,,Cannot source from DigiKey,Y - Footprint / pinout compatiable 17 | 1,JP1,LED,Jumper:SolderJumper-2_P1.3mm_Bridged_RoundedPad1.0x1.5mm,,,,,DNP,, 18 | 1,LOGO1,Josh-Details,josh-logos:josh-details,,,,,DNP,, 19 | 1,LOGO2,Board-Title,josh-logos:board-title,,,,,DNP,, 20 | 1,LOGO3,Josh-Logo,josh-logos:josh-johnson-logo-11x2,,,,,DNP,, 21 | 1,LOGO5,OSHW,josh-logos:OSHW-Logo2_9.8x8mm_Mask,,,,,DNP,, 22 | 2,"MX1, MX2",2U,josh-keyboard:MXOnly-2U-NoLED-3PIN,,,,,DNP,, 23 | 4,"MX3, MX4, MX5, MX6",2U,josh-keyboard:MXOnly-2U-ReversedStabilizers-NoLED-3PIN,,,,,DNP,, 24 | 1,Q1,DTC123J,Package_TO_SOT_SMD:SOT-23,DTC123JKAT146,DTC123JKAT146CT-ND,C111724,ROHM Semicon,,,Y - Any DTC123J 25 | 1,Q2,BSS138,Package_TO_SOT_SMD:SOT-23,BSS138,BSS138CT-ND,C52895,ON Semiconductor,,,Y - Any BSS138 26 | 1,R10,649R,Resistor_SMD:R_0603_1608Metric,MCR03ERTF6490 ,RHM649CFCT-ND ,C403314,Rohm Semiconductor,,LCSC: Substitute PN,Y - Same spec 27 | 3,"R14, R2, R3",5K1,Resistor_SMD:R_0603_1608Metric,CR0603-JW-512ELF ,118-CR0603-JW-512ELFCT-ND ,C14677,Bourns,,LCSC: Substitute PN,Y - Same spec 28 | 1,R4,100K,Resistor_SMD:R_0603_1608Metric,CR0603-JW-104ELF,CR0603-JW-104ELFCT-ND,C100048,Bourns,,LCSC: Substitute PN,Y - Same spec 29 | 5,"R5, R6, R7, R8, R9",10K,Resistor_SMD:R_0603_1608Metric,CR0603-JW-103ELF ,CR0603-JW-103ELFCT-ND ,C144116,Bourns,,LCSC: Substitute PN,Y - Same spec 30 | 2,"RN1, RN2",10K,Resistor_SMD:R_Array_Convex_4x0603,RAVF164DJT10K0,RAVF164DJT10K0CT-ND,C107374,Bourns,,LCSC: Substitute PN,Y - Same spec 31 | 1,RN3,10K,Resistor_SMD:R_Array_Convex_4x0603,RAVF164DJT10K0,RAVF164DJT10K0CT-ND,C107374,Bourns,,LCSC: Substitute PN,Y - Same spec 32 | 1,SW1,EVQPUL,josh-buttons-switches:Panasonic_EVQPUL_EVQPUC,EVQ-PUL02K,P10853SCT-ND,C397351,Panasonic,,LCSC: Substitute PN,Y - Same footprint 33 | 20,"SW10, SW11, SW12, SW14, SW15, SW16, SW17, SW18, SW19, SW2, SW20, SW21, SW22, SW23, SW3, SW4, SW5, SW6, SW8, SW9",MX_RGB,josh-keyboard:MX_KEYSWITCH_RGB,,,,,DNP,, 34 | 2,"SW13, SW7",EC11,josh-buttons-switches:RotaryEncoder_Alps_EC11E-Switch_Vertical_H20mm_CircularMountingHoles,PEC11L-4120F-S0020,PEC11L-4120F-S0020-ND,,Bourns,DNP,Similar to: https://www.aliexpress.com/item/32839106848.html,Y - 20 pulse per revolution 35 | 1,U1,AP2112K-3.3,Package_TO_SOT_SMD:SOT-23-5, AP2112K-3.3TRG1,AP2112K-3.3TRG1DICT-ND,C51118,Diodes Incorporated,,,N 36 | 4,"U2, U6, U7, U8",USBLC6-2SC6,Package_TO_SOT_SMD:SOT-23-6,USBLC6-2SC6,497-5235-1-ND ,C7519,STMicroelectronics,,,N 37 | 1,U3,STM32F072C8Tx,Package_QFP:LQFP-48_7x7mm_P0.5mm,STM32F072C8T6,497-17359-1-ND,C80488,STMicroelectronics,,,N 38 | 1,U5,CY7C65632-28LTXCT,josh-dfn-qfn:QFN-28-1EP_5x5mm_P0.5mm_EP3.35x3.35mm_ThermalVias,CY7C65632-28LTXCT,428-3156-1-ND,C466886,Cypress Semiconductor,,,N 39 | 1,Y1,12MHz,josh-oscillators:Crystal_SMD_3225-4Pin_3.2x2.5mm,ABM8-12.000MHZ-12-B1U-T,535-14962-6-ND,C164041,Abracon LLC,,LCSC: Substitute PN,"Y - 12 MHz, 10/12pF" 40 | -------------------------------------------------------------------------------- /production/1.0/fab-notes.txt: -------------------------------------------------------------------------------- 1 | PCB Fabrication 2 | 3 | PCB is two layers, FR4 material, finished thickness 1.6mm. 4 | Matte black soldermask, white silkscreen. All vias to be tented. 5 | Lead free HASL surface finish. 6 | No manufacturer markings (logo / UL / date code / RoHS etc) are to be placed on the board. 7 | All boards are to be 100% electically tested. 8 | PCB's are to be panelised with mouse bites, in a way which ensures smooth edges on all sides after depanelisation. 9 | Production gerbers are to be approved by Josh before fabrication begins. 10 | 11 | Assembly Instructions 12 | 13 | PCBs are to be assembled using a lead free process. 14 | BOM items with "DNP" are not to be purchased or assembled. 15 | Substutions are allowed where noted on BOM, ensuring parts meet specifications. 16 | Boards are to be depanlised, edges smoothed, and placed individually in resealable ESD bags. 17 | 18 | If there are any discrepancies or questions during the process, please stop work and ask Josh. -------------------------------------------------------------------------------- /production/1.0/gerbers.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joshajohnson/Hub20/f781e843167f94afac979929ccd29d1ee586b9fa/production/1.0/gerbers.zip -------------------------------------------------------------------------------- /production/1.0/photo.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joshajohnson/Hub20/f781e843167f94afac979929ccd29d1ee586b9fa/production/1.0/photo.JPG -------------------------------------------------------------------------------- /production/1.0/plate-gerbers.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joshajohnson/Hub20/f781e843167f94afac979929ccd29d1ee586b9fa/production/1.0/plate-gerbers.zip -------------------------------------------------------------------------------- /production/1.0/pnp.pos: -------------------------------------------------------------------------------- 1 | ### Module positions - created on Mon Sep 14 19:52:57 2020 ### 2 | ### Printed by Pcbnew version kicad 5.1.6-c6e7f7d~87~ubuntu20.04.1 3 | ## Unit = mm, Angle = deg. 4 | ## Side : bottom 5 | # Ref Val Package PosX PosY Rot Side 6 | C1 100n C_0603_1608Metric -108.0000 -69.2000 270.0000 bottom 7 | C4 100n C_0603_1608Metric -128.6000 -66.2000 90.0000 bottom 8 | C5 100n C_0603_1608Metric -147.5000 -66.2125 90.0000 bottom 9 | C6 100n C_0603_1608Metric -107.1125 -87.5000 180.0000 bottom 10 | C7 100n C_0603_1608Metric -165.0000 -69.2000 270.0000 bottom 11 | C8 100n C_0603_1608Metric -164.3125 -87.4000 180.0000 bottom 12 | C9 100n C_0603_1608Metric -123.8000 -70.5000 270.0000 bottom 13 | C10 1u C_0603_1608Metric -107.1875 -47.7000 0.0000 bottom 14 | C11 100n C_0603_1608Metric -147.6000 -85.3000 90.0000 bottom 15 | C12 100n C_0603_1608Metric -163.8000 -95.0000 90.0000 bottom 16 | C13 100n C_0603_1608Metric -122.8125 -98.5000 180.0000 bottom 17 | C14 10u C_0603_1608Metric -107.7000 -42.6000 180.0000 bottom 18 | C15 100n C_0603_1608Metric -164.6000 -66.8000 0.0000 bottom 19 | C16 100n C_0603_1608Metric -126.9000 -88.2000 270.0000 bottom 20 | C17 100n C_0603_1608Metric -146.0000 -107.2875 270.0000 bottom 21 | C18 4u7 C_0603_1608Metric -153.1000 -72.0000 0.0000 bottom 22 | C19 1u C_0603_1608Metric -107.3875 -53.1000 0.0000 bottom 23 | C20 10u C_0603_1608Metric -153.1000 -75.0000 0.0000 bottom 24 | C21 100n C_0603_1608Metric -109.5000 -104.3875 90.0000 bottom 25 | C22 100n C_0603_1608Metric -164.9000 -146.0000 270.0000 bottom 26 | C23 100n C_0603_1608Metric -166.8000 -104.2875 90.0000 bottom 27 | C24 100n C_0603_1608Metric -163.7000 -132.8125 90.0000 bottom 28 | C25 100n C_0603_1608Metric -126.9000 -107.3000 270.0000 bottom 29 | C26 100n C_0603_1608Metric -126.3000 -146.0875 270.0000 bottom 30 | C27 100n C_0603_1608Metric -164.2000 -125.6000 180.0000 bottom 31 | C28 1u C_0603_1608Metric -132.4625 -92.3500 180.0000 bottom 32 | C29 100n C_0603_1608Metric -145.2000 -125.5000 180.0000 bottom 33 | C30 100n C_0603_1608Metric -109.5000 -142.4000 90.0000 bottom 34 | C31 100n C_0603_1608Metric -126.1125 -125.6000 180.0000 bottom 35 | C32 1u C_0603_1608Metric -141.1000 -101.5000 0.0000 bottom 36 | C33 100n C_0603_1608Metric -107.1125 -125.5000 180.0000 bottom 37 | C34 1u C_0603_1608Metric -148.2500 -97.6000 0.0000 bottom 38 | C35 100n C_0603_1608Metric -125.6000 -132.8000 90.0000 bottom 39 | C36 100n C_0603_1608Metric -141.1100 -99.9900 0.0000 bottom 40 | C37 100n C_0603_1608Metric -145.2000 -144.6000 180.0000 bottom 41 | C38 100n C_0603_1608Metric -144.5000 -86.2125 90.0000 bottom 42 | C39 100n C_0603_1608Metric -142.6000 -137.3000 270.0000 bottom 43 | C40 100n C_0603_1608Metric -143.8000 -99.6000 270.0000 bottom 44 | C41 10u C_0603_1608Metric -134.5125 -53.3000 180.0000 bottom 45 | C42 100n C_0603_1608Metric -134.4875 -56.3500 0.0000 bottom 46 | C43 100n C_0603_1608Metric -141.6000 -48.4000 90.0000 bottom 47 | C44 15p C_0603_1608Metric -148.7000 -51.1000 0.0000 bottom 48 | C45 15p C_0603_1608Metric -152.1000 -53.6125 90.0000 bottom 49 | C46 100n C_0603_1608Metric -144.8000 -51.5000 90.0000 bottom 50 | C47 100n C_0603_1608Metric -145.1000 -57.7000 0.0000 bottom 51 | C48 100n C_0603_1608Metric -132.4375 -90.8000 180.0000 bottom 52 | C49 100n C_0603_1608Metric -148.2625 -96.1000 0.0000 bottom 53 | C50 100n C_0603_1608Metric -119.0000 -56.2000 90.0000 bottom 54 | C51 100n C_0603_1608Metric -158.1000 -56.3125 90.0000 bottom 55 | C52 100n C_0603_1608Metric -124.2000 -56.2000 90.0000 bottom 56 | C53 100n C_0603_1608Metric -163.3000 -56.3000 90.0000 bottom 57 | C54 1u C_0603_1608Metric -145.1000 -59.2000 0.0000 bottom 58 | C55 1u C_0603_1608Metric -146.3000 -51.5000 90.0000 bottom 59 | C56 100n C_0603_1608Metric -137.8875 -58.9000 180.0000 bottom 60 | C57 1u C_0603_1608Metric -137.8875 -60.4000 180.0000 bottom 61 | C58 100n C_0603_1608Metric -134.4000 -42.6000 0.0000 bottom 62 | C59 100n C_0603_1608Metric -148.0000 -42.6000 180.0000 bottom 63 | C60 100n C_0603_1608Metric -174.4000 -42.6000 0.0000 bottom 64 | D1 1N4148 D_SOD-123 -149.2000 -75.9000 180.0000 bottom 65 | D2 WS2812B LED_WS2812B_PLCC4_5.0x5.0mm_P3.2mm -160.1000 -131.1000 90.0000 bottom 66 | D3 WS2812B LED_WS2812B_PLCC4_5.0x5.0mm_P3.2mm -141.0000 -131.1000 90.0000 bottom 67 | D4 1N4148 D_SOD-123 -118.0000 -60.1500 90.0000 bottom 68 | D5 1N4148 D_SOD-123 -111.8000 -76.8000 90.0000 bottom 69 | D6 1N4148 D_SOD-123 -118.0000 -98.2000 90.0000 bottom 70 | D7 1N4148 D_SOD-123 -112.1000 -114.9000 90.0000 bottom 71 | D8 1N4148 D_SOD-123 -118.0000 -136.3000 90.0000 bottom 72 | D9 WS2812B LED_WS2812B_PLCC4_5.0x5.0mm_P3.2mm -122.0000 -131.1000 90.0000 bottom 73 | D10 1N4148 D_SOD-123 -126.2000 -68.5500 90.0000 bottom 74 | D11 1N4148 D_SOD-123 -137.0000 -79.2000 90.0000 bottom 75 | D12 1N4148 D_SOD-123 -126.1000 -95.9000 90.0000 bottom 76 | D13 1N4148 D_SOD-123 -137.0000 -117.3000 90.0000 bottom 77 | D14 1N4148 D_SOD-123 -139.4000 -137.4000 90.0000 bottom 78 | D15 WS2812B LED_WS2812B_PLCC4_5.0x5.0mm_P3.2mm -122.0000 -93.1000 90.0000 bottom 79 | D16 1N4148 D_SOD-123 -121.4000 -42.9500 90.0000 bottom 80 | D17 WS2812B LED_WS2812B_PLCC4_5.0x5.0mm_P3.2mm -122.1000 -64.4000 90.0000 bottom 81 | D18 1N4148 D_SOD-123 -156.1000 -68.6500 90.0000 bottom 82 | D19 1N4148 D_SOD-123 -156.0000 -79.2000 90.0000 bottom 83 | D20 1N4148 D_SOD-123 -156.0000 -98.3000 90.0000 bottom 84 | D21 1N4148 D_SOD-123 -156.1000 -117.3000 90.0000 bottom 85 | D22 1N4148 D_SOD-123 -156.1000 -135.1000 90.0000 bottom 86 | D23 WS2812B LED_WS2812B_PLCC4_5.0x5.0mm_P3.2mm -160.2000 -64.4000 90.0000 bottom 87 | D24 1N4148 D_SOD-123 -160.9000 -43.1000 90.0000 bottom 88 | D25 1N4148 D_SOD-123 -175.1000 -60.1500 90.0000 bottom 89 | D26 1N4148 D_SOD-123 -169.3000 -76.8000 90.0000 bottom 90 | D27 1N4148 D_SOD-123 -175.2000 -98.2000 90.0000 bottom 91 | D28 1N4148 D_SOD-123 -169.1000 -114.9000 90.0000 bottom 92 | D29 1N4148 D_SOD-123 -177.0000 -136.3000 90.0000 bottom 93 | D30 WS2812B LED_WS2812B_PLCC4_5.0x5.0mm_P3.2mm -160.1000 -93.3000 90.0000 bottom 94 | D32 LED LED_0603_1608Metric -141.1200 -42.4000 180.0000 bottom 95 | F1 1A Fuse_0805_2012Metric -107.4625 -44.3000 0.0000 bottom 96 | F2 500mA Fuse_0805_2012Metric -134.6000 -44.3000 0.0000 bottom 97 | F3 500mA Fuse_0805_2012Metric -147.8000 -44.3000 180.0000 bottom 98 | F4 500mA Fuse_0805_2012Metric -174.6000 -44.3000 0.0000 bottom 99 | FB1 600R Ferrite_Bead_0603 -107.2000 -46.1000 0.0000 bottom 100 | FB2 600R Ferrite_Bead_0603 -134.5000 -54.8000 0.0000 bottom 101 | FB3 600R Ferrite_Bead_0603 -134.8000 -46.0000 0.0000 bottom 102 | FB4 600R Ferrite_Bead_0603 -147.6000 -46.0500 180.0000 bottom 103 | FB5 600R Ferrite_Bead_0603 -174.8000 -46.0000 0.0000 bottom 104 | Q1 DTC123J SOT-23 -149.8000 -73.0000 90.0000 bottom 105 | Q2 BSS138 SOT-23 -163.4000 -112.2000 270.0000 bottom 106 | R2 5K1 R_0603_1608Metric -118.2625 -40.6000 180.0000 bottom 107 | R3 5K1 R_0603_1608Metric -118.2500 -42.1500 180.0000 bottom 108 | R4 100K R_0603_1608Metric -153.1000 -73.5000 0.0000 bottom 109 | R5 10K R_0603_1608Metric -163.4000 -109.7000 0.0000 bottom 110 | R6 10K R_0603_1608Metric -163.4000 -114.7000 0.0000 bottom 111 | R7 10K R_0603_1608Metric -130.2000 -52.5500 180.0000 bottom 112 | R8 10K R_0603_1608Metric -130.1625 -59.4000 180.0000 bottom 113 | R9 10K R_0603_1608Metric -130.1500 -57.8500 180.0000 bottom 114 | R10 649R R_0603_1608Metric -151.8875 -51.1000 0.0000 bottom 115 | R14 5K1 R_0603_1608Metric -142.2000 -44.9500 270.0000 bottom 116 | RN1 10K R_Array_Convex_4x0603 -121.6000 -56.1000 90.0000 bottom 117 | RN2 10K R_Array_Convex_4x0603 -160.7000 -56.2000 90.0000 bottom 118 | RN3 10K R_Array_Convex_4x0603 -130.1500 -55.2000 180.0000 bottom 119 | SW1 EVQPUL Panasonic_EVQPUL_EVQPUC -141.1000 -35.3000 180.0000 bottom 120 | U1 AP2112K-3.3 SOT-23-5 -107.5000 -50.4000 270.0000 bottom 121 | U2 USBLC6-2SC6 SOT-23-6 -111.0000 -44.1000 270.0000 bottom 122 | U3 STM32F072C8Tx LQFP-48_7x7mm_P0.5mm -141.1000 -92.9000 90.0000 bottom 123 | U5 CY7C65632-28LTXCT QFN-28-1EP_5x5mm_P0.5mm_EP3.35x3.35mm_ThermalVias -140.5000 -54.8000 270.0000 bottom 124 | U6 USBLC6-2SC6 SOT-23-6 -131.1000 -44.1000 270.0000 bottom 125 | U7 USBLC6-2SC6 SOT-23-6 -151.3000 -44.2000 270.0000 bottom 126 | U8 USBLC6-2SC6 SOT-23-6 -171.1000 -44.3000 270.0000 bottom 127 | Y1 12MHz Crystal_SMD_3225-4Pin_3.2x2.5mm -149.2000 -53.6000 0.0000 bottom 128 | ## End 129 | -------------------------------------------------------------------------------- /production/1.0/render.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joshajohnson/Hub20/f781e843167f94afac979929ccd29d1ee586b9fa/production/1.0/render.jpg -------------------------------------------------------------------------------- /production/test-scripts/hub20_prod.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joshajohnson/Hub20/f781e843167f94afac979929ccd29d1ee586b9fa/production/test-scripts/hub20_prod.bin -------------------------------------------------------------------------------- /production/test-scripts/hub20_test.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joshajohnson/Hub20/f781e843167f94afac979929ccd29d1ee586b9fa/production/test-scripts/hub20_test.bin -------------------------------------------------------------------------------- /production/test-scripts/prog.py: -------------------------------------------------------------------------------- 1 | #!/bin/python3 2 | 3 | # Script to program and test Hub20 4 | 5 | import os 6 | import time 7 | import argparse 8 | from colorama import Fore 9 | 10 | def qmk(): 11 | # Flash QMK 12 | qmk = "dfu-util -d 0483:df11 -a 0 -s 0x08000000:leave -D hub20_prod.bin" 13 | retval = os.system(qmk) 14 | 15 | def test_fw(): 16 | # Flash Test Firmware 17 | test = "dfu-util -d 0483:df11 -a 0 -s 0x08000000:leave -D hub20_test.bin" 18 | retval = os.system(test) 19 | 20 | def read_firmware(): 21 | # Read entire firmware, including VIA EEPROM emulation 22 | read = "dfu-util -d 0483:df11 -a 0 -s 0x08000000:131072 -U firmware.bin" 23 | retval = os.system(read) 24 | 25 | def write_firmware(): 26 | # Write entire firmware, including VIA EEPROM emulation 27 | write = "dfu-util -d 0483:df11 -a 0 -s 0x08000000:leave -D firmware.bin" 28 | retval = os.system(write) 29 | 30 | def test(): 31 | # Test Device 32 | chars_reqd = "abcdefghijklmnopqrstuvwxyz" 33 | chars_input = input("Check LEDs are functioning, then press all the keys!: ") 34 | chars_remain = "" 35 | 36 | while True: 37 | 38 | for char in chars_reqd: 39 | if char in chars_input: 40 | chars_remain = chars_remain.replace(char, "") 41 | elif char not in chars_remain: 42 | chars_remain = chars_remain + char 43 | 44 | if len(chars_remain) == 0: 45 | print("ALL KEYS WORKING") 46 | break 47 | 48 | chars_reqd = chars_remain 49 | chars_input = input("Need to press {}: ".format(chars_remain)) 50 | 51 | if __name__ == "__main__": 52 | 53 | parser = argparse.ArgumentParser() 54 | parser.add_argument("-f", "--test_fw", action='store_true') 55 | parser.add_argument("-t", "--test", action='store_true') 56 | parser.add_argument("-q", "--qmk", action='store_true') 57 | parser.add_argument("-r", "--read_eeprom", action='store_true') 58 | parser.add_argument("-w", "--write_eeprom", action='store_true') 59 | args = parser.parse_args() 60 | 61 | if args.test_fw: 62 | retval = input("Reset Hub20, then press enter to continue") 63 | test_fw() 64 | if args.test: 65 | test() 66 | if args.qmk: 67 | retval = input("Reset Hub20, then press enter to continue") 68 | qmk() 69 | if args.read_eeprom: 70 | read_firmware() 71 | if args.write_eeprom: 72 | write_firmware() 73 | 74 | print(f'{Fore.GREEN}###################') 75 | print(f'{Fore.GREEN}ALL STEPS PASSED!!!') 76 | print(f'{Fore.GREEN}###################') -------------------------------------------------------------------------------- /software/hub20-example.ahk: -------------------------------------------------------------------------------- 1 | #NoEnv 2 | #InstallKeybdHook 3 | #UseHook On 4 | #SingleInstance force ;only one instance of this script may run at a time 5 | #MaxHotkeysPerInterval 2000 6 | SetTitleMatchMode, 2 ; Partial title string matching 7 | 8 | ;Hub20 9 | ;------------------ 10 | ;| ENC1 ENC2 | ENC1:Clockwise: u 11 | ;| a b c d | ENC1:Anticlockwise: v 12 | ;| e f g h | ENC2:Button: w 13 | ;| i j k l | ENC2:Clockwise: x 14 | ;| m n o p | ENC2:Anticlockwise: y 15 | ;| q r s t | ENC2:Button: z 16 | ;------------------ 17 | 18 | ; Remember to uncomment lines before using them, and restart the script each time! 19 | 20 | #if (getKeyState("F23", "P")) 21 | F23::return 22 | 23 | ;------------------------------------------------------------------------------ 24 | ; Row 0 25 | ;------------------------------------------------------------------------------ 26 | 27 | ;u::{} 28 | 29 | ;v::{} 30 | 31 | ;w::{} 32 | 33 | ;x::{} 34 | 35 | ;y::{} 36 | 37 | ;z::{} 38 | 39 | ;------------------------------------------------------------------------------ 40 | ; Row 1 41 | ;------------------------------------------------------------------------------ 42 | 43 | ;a::{} 44 | 45 | ;b::{} 46 | 47 | ;c::{} 48 | 49 | ;d::{} 50 | 51 | ;------------------------------------------------------------------------------ 52 | ; Row 2 53 | ;------------------------------------------------------------------------------ 54 | 55 | e:: 56 | { ; Update URL, keeping ID number 57 | Send {control down}{l}{control up} ; Get URL Bar 58 | Sleep, 50 59 | Send {right} ; End of URL 60 | Sleep, 50 61 | Send {control down}{left}{control up} ; Move left of number 62 | Send {control down}{shift down}{home}{shift up}{control up} ; Select URL other than ID 63 | Send www.url-before-number.com/number= ; Update with URL 64 | Send {enter} 65 | return 66 | 67 | } 68 | 69 | f:: 70 | { 71 | 72 | Send ¯\\\_(ツ)_/¯ 73 | return 74 | } 75 | 76 | g:: 77 | { 78 | Run C:\Program Files (x86)\Google\Chrome\Application\chrome.exe https://website.com 79 | return 80 | } 81 | 82 | h:: 83 | { ; Login into application 84 | if WinActive("application name"){ 85 | Send area {enter} 86 | Sleep, 1500 87 | Send team {enter} 88 | Sleep, 1500 89 | Send username {tab}{tab} 90 | } 91 | 92 | ; Activate application 93 | if WinExist("application name") 94 | WinActivate 95 | else if WinExist("launcher name") 96 | WinActivate 97 | else 98 | Run, C:\ProgramData\Microsoft\Windows\path-to-application 99 | return 100 | 101 | } 102 | 103 | ;------------------------------------------------------------------------------ 104 | ; Row 3 105 | ;------------------------------------------------------------------------------ 106 | 107 | ;i::{} 108 | 109 | ;j::{} 110 | 111 | k:: 112 | { 113 | Run C:\Program Files (x86)\Google\Chrome\Application\chrome.exe https://another-website.com 114 | return 115 | } 116 | 117 | l:: 118 | { 119 | ; If Excel Active, open sceen 120 | if WinActive("ahk_exe EXCEL.EXE") 121 | Send {control down}{o}{control up} 122 | ; If Excel not active, activate excel 123 | else if WinExist("ahk_exe EXCEL.EXE") 124 | WinActivate 125 | else 126 | Run, EXCEL.EXE 127 | return 128 | } 129 | 130 | ;------------------------------------------------------------------------------ 131 | ; Row 4 132 | ;------------------------------------------------------------------------------ 133 | 134 | m:: 135 | { ; Replace text to fix website 404 136 | Send {control down}{l}{control up} 137 | Send {right} 138 | Send {control down}{left}{left}{left}{left}{left}{control up} 139 | Send {control down}{shift down}{right}{control up}{shift up} 140 | Send new-text/ 141 | Send {enter} 142 | return 143 | } 144 | 145 | ;n::{} 146 | 147 | o:: 148 | { ; Pull Webex Teams to front / open if closed 149 | if WinActive("Webex Teams") 150 | return 151 | else if WinExist("Webex Teams") 152 | WinActivate 153 | return 154 | } 155 | 156 | p:: 157 | { 158 | ; If outlook Active, new email 159 | if WinActive("ahk_exe OUTLOOK.EXE") 160 | Send {control down}{n}{control up} 161 | ; If Outlook not active, activate outlook 162 | else if WinExist("ahk_exe OUTLOOK.EXE") 163 | WinActivate 164 | else 165 | Run, OUTLOOK.EXE 166 | return 167 | 168 | } 169 | 170 | ;------------------------------------------------------------------------------ 171 | ; Row 5 172 | ;------------------------------------------------------------------------------ 173 | 174 | ;q::{} 175 | 176 | ;r::{} 177 | 178 | ;s::{} 179 | 180 | ;t::{} -------------------------------------------------------------------------------- /software/hub20-template.ahk: -------------------------------------------------------------------------------- 1 | #NoEnv 2 | #InstallKeybdHook 3 | #UseHook On 4 | #SingleInstance force ;only one instance of this script may run at a time 5 | #MaxHotkeysPerInterval 2000 6 | SetTitleMatchMode, 2 ; Partial title string matching 7 | 8 | ;Hub20 9 | ;------------------ 10 | ;| ENC1 ENC2 | ENC1:Clockwise: u 11 | ;| a b c d | ENC1:Anticlockwise: v 12 | ;| e f g h | ENC2:Button: w 13 | ;| i j k l | ENC2:Clockwise: x 14 | ;| m n o p | ENC2:Anticlockwise: y 15 | ;| q r s t | ENC2:Button: z 16 | ;------------------ 17 | 18 | ; Remember to uncomment lines before using them, and restart the script each time! 19 | 20 | ; Run the below when in KiCad 21 | #if (getKeyState("F23", "P")) and if WinActive("ahk_exe kicad.exe") 22 | F23::return 23 | 24 | ;------------------------------------------------------------------------------ 25 | ; Row 0 26 | ;------------------------------------------------------------------------------ 27 | 28 | ;u::{} 29 | 30 | ;v::{} 31 | 32 | ;w::{} 33 | 34 | ;x::{} 35 | 36 | ;y::{} 37 | 38 | ;z::{} 39 | 40 | ;------------------------------------------------------------------------------ 41 | ; Row 1 42 | ;------------------------------------------------------------------------------ 43 | 44 | ;a::{} 45 | 46 | ;b::{} 47 | 48 | ;c::{} 49 | 50 | ;d::{} 51 | 52 | ;------------------------------------------------------------------------------ 53 | ; Row 2 54 | ;------------------------------------------------------------------------------ 55 | 56 | ;e::{} 57 | 58 | ;f::{} 59 | 60 | ;g::{} 61 | 62 | ;h::{} 63 | 64 | ;------------------------------------------------------------------------------ 65 | ; Row 3 66 | ;------------------------------------------------------------------------------ 67 | 68 | ;i::{} 69 | 70 | ;j::{} 71 | 72 | ;k::{} 73 | 74 | ;l::{} 75 | 76 | ;------------------------------------------------------------------------------ 77 | ; Row 4 78 | ;------------------------------------------------------------------------------ 79 | 80 | ;m::{} 81 | 82 | ;n::{} 83 | 84 | ;o::{} 85 | 86 | ;p::{} 87 | 88 | ;------------------------------------------------------------------------------ 89 | ; Row 5 90 | ;------------------------------------------------------------------------------ 91 | 92 | ;q::{} 93 | 94 | ;r::{} 95 | 96 | ;s::{} 97 | 98 | ;t::{} 99 | 100 | ; Otherwise, run the below 101 | #if (getKeyState("F23", "P")) 102 | F23::return 103 | 104 | ;------------------------------------------------------------------------------ 105 | ; Row 0 106 | ;------------------------------------------------------------------------------ 107 | 108 | ;u::{} 109 | 110 | ;v::{} 111 | 112 | ;w::{} 113 | 114 | ;x::{} 115 | 116 | ;y::{} 117 | 118 | ;z::{} 119 | 120 | ;------------------------------------------------------------------------------ 121 | ; Row 1 122 | ;------------------------------------------------------------------------------ 123 | 124 | ;a::{} 125 | 126 | ;b::{} 127 | 128 | ;c::{} 129 | 130 | ;d::{} 131 | 132 | ;------------------------------------------------------------------------------ 133 | ; Row 2 134 | ;------------------------------------------------------------------------------ 135 | 136 | ;e::{} 137 | 138 | ;f::{} 139 | 140 | ;g::{} 141 | 142 | ;h::{} 143 | 144 | ;------------------------------------------------------------------------------ 145 | ; Row 3 146 | ;------------------------------------------------------------------------------ 147 | 148 | ;i::{} 149 | 150 | ;j::{} 151 | 152 | ;k::{} 153 | 154 | ;l::{} 155 | 156 | ;------------------------------------------------------------------------------ 157 | ; Row 4 158 | ;------------------------------------------------------------------------------ 159 | 160 | ;m::{} 161 | 162 | ;n::{} 163 | 164 | ;o::{} 165 | 166 | ;p::{} 167 | 168 | ;------------------------------------------------------------------------------ 169 | ; Row 5 170 | ;------------------------------------------------------------------------------ 171 | 172 | ;q::{} 173 | 174 | ;r::{} 175 | 176 | ;s::{} 177 | 178 | ;t::{} -------------------------------------------------------------------------------- /software/via-hub20.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Hub20", 3 | "vendorId": "0x6A6A", 4 | "productId": "0x4414", 5 | "lighting": "qmk_rgblight", 6 | "matrix": { 7 | "rows": 6, 8 | "cols": 4 9 | }, 10 | "layouts": { 11 | "labels": [ 12 | "Split Plus", 13 | "Split Enter", 14 | "Split Zero" 15 | ], 16 | "keymap": [ 17 | [ 18 | { 19 | "x": 1.75 20 | }, 21 | "0,1", 22 | { 23 | "x": 1 24 | }, 25 | "0,2" 26 | ], 27 | [ 28 | { 29 | "x": 1.25 30 | }, 31 | "1,0", 32 | "1,1", 33 | "1,2", 34 | "1,3" 35 | ], 36 | [ 37 | "2,0\n\n\n0,1", 38 | { 39 | "x": 0.25, 40 | "c": "#777777", 41 | "h": 2 42 | }, 43 | "2,0\n\n\n0,0", 44 | { 45 | "c": "#cccccc" 46 | }, 47 | "2,1", 48 | "2,2", 49 | "2,3" 50 | ], 51 | [ 52 | "3,0\n\n\n0,1", 53 | { 54 | "x": 1.25 55 | }, 56 | "3,1", 57 | "3,2", 58 | "3,3" 59 | ], 60 | [ 61 | "4,0\n\n\n1,1", 62 | { 63 | "x": 0.25, 64 | "c": "#777777", 65 | "h": 2 66 | }, 67 | "4,0\n\n\n1,0", 68 | { 69 | "c": "#cccccc" 70 | }, 71 | "4,1", 72 | "4,2", 73 | "4,3" 74 | ], 75 | [ 76 | "5,0\n\n\n1,1", 77 | { 78 | "x": 1.25 79 | }, 80 | "5,1", 81 | { 82 | "c": "#777777", 83 | "w": 2 84 | }, 85 | "5,2\n\n\n2,0" 86 | ], 87 | [ 88 | { 89 | "y": 0.25, 90 | "x": 3.25, 91 | "c": "#cccccc" 92 | }, 93 | "5,2\n\n\n2,1", 94 | "5,3\n\n\n2,1" 95 | ] 96 | ] 97 | } 98 | } 99 | --------------------------------------------------------------------------------