1
0
Fork 0

Modifications to Dactyl manuform keyboard (#3162)

* DactylManuform: Updating dvorak keymap

* Changed NAV and NUM layers to LOWER and RAISE
* Removed Mod+Key form RAISE and LOWER keys to be used as layer togglers exclusively
* Added missing keys to LOWER layers

* DactylManuform: fixed bugs in keyboard config file

* DactylManuform: Change default mouse config

The default mouse config parameters are slow and not very user friendly, this commit overrides the default
values.
wq
Signed-off-by: Sameeh Jubran <sameeh.j@gmail.com>

* Dactylmanuform: Update default keymap (qwerty) to match dvorak's

Recently devorak's layout went through some changes for changing layer toggles behavior,
adding missing keys, and fix minor bugs, this commit introduces these changes to the default keymap.

Signed-off-by: Sameeh Jubran <sameeh.j@gmail.com>

* Dactylmanuform: Add permissive hold support

Signed-off-by: Sameeh Jubran <sameeh.j@gmail.com>

* DactylManuform: Updating documentation

* Adding a picture of the keyboard
* Adding keymaps pictures

* Adding missing EEPROM files for EE_HANDS
flashing these before firmware will let the
user use either hand as master without reflashing

Signed-off-by: 20lives <lior@dotcore.co.il>
This commit is contained in:
Twentylives 2018-06-13 00:42:11 +03:00 committed by Drashna Jaelre
parent 06487daadd
commit f535c94829
7 changed files with 179 additions and 133 deletions

View File

@ -45,6 +45,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
/* number of backlight levels */
// #define BACKLIGHT_LEVELS 3
/* mouse config */
#define MOUSEKEY_INTERVAL 20
#define MOUSEKEY_DELAY 0
#define MOUSEKEY_TIME_TO_MAX 60
#define MOUSEKEY_MAX_SPEED 7
#define MOUSEKEY_WHEEL_DELAY 0
/* Set 0 if debouncing isn't needed */
#define DEBOUNCING_DELAY 5
@ -58,6 +65,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
)
/* Enables This makes it easier for fast typists to use dual-function keys */
#define PERMISSIVE_HOLD
/* ws2812 RGB LED */
#define RGB_DI_PIN D3
#define RGBLIGHT_TIMER

View File

@ -18,39 +18,14 @@
//void promicro_bootloader_jmp(bool program);
#ifndef FLIP_HALF
#define LAYOUT( \
L00, L01, L02, L03, L04, R00, R01, R02, R03, R04, \
L10, L11, L12, L13, L14, R10, R11, R12, R13, R14, \
L20, L21, L22, L23, L24, R20, R21, R22, R23, R24, \
L31, L32, R33, R34, \
L33, L34, R31, R32, \
L44, L42, R43, R41, \
L43, L41, R44, R42 \
) \
{ \
{ L00, L01, L02, L03, L04 }, \
{ L10, L11, L12, L13, L14 }, \
{ L20, L21, L22, L23, L24 }, \
{ KC_NO, L31, L32, L33, L34 }, \
{ KC_NO, L41, L42, L43, L44 }, \
\
{ R04, R03, R02, R01, R00 }, \
{ R14, R13, R12, R11, R10 }, \
{ R24, R23, R22, R21, R20 }, \
{ KC_NO, R34, R33, R32, R31 }, \
{ KC_NO, R44, R43, R42, R41 } \
}
#else
#define LAYOUT( \
L00, L01, L02, L03, L04, R00, R01, R02, R03, R04, \
L10, L11, L12, L13, L14, R10, R11, R12, R13, R14, \
L20, L21, L22, L23, L24, R20, R21, R22, R23, R24, \
L31, L32, L33, L34, \
R31, R32, R33, R34, \
L41, L42, L43, L44, \
R41, R42, R43, R44 \
L31, L32, R32, R33, \
L33, L34, R30, R31, \
L44, L43, R41, R40, \
L42, L41, R43, R42 \
) \
{ \
{ L00, L01, L02, L03, L04 }, \
@ -59,13 +34,36 @@
{ KC_NO, L31, L32, L33, L34 }, \
{ KC_NO, L41, L42, L43, L44 }, \
\
{ R00, R01, R02, R03, R04 }, \
{ R10, R11, R12, R13, R14 }, \
{ R20, R21, R22, R23, R24 }, \
{ KC_NO, R31, R32, R33, R34 }, \
{ KC_NO, R41, R42, R43, R44 } \
{ R04, R03, R02, R01, R00 }, \
{ R14, R13, R12, R11, R10 }, \
{ R24, R23, R22, R21, R20 }, \
{ KC_NO, R33, R32, R31, R30 }, \
{ KC_NO, R43, R42, R41, R40 } \
}
#else
#define LAYOUT( \
L00, L01, L02, L03, L04, R00, R01, R02, R03, R04, \
L10, L11, L12, L13, L14, R10, R11, R12, R13, R14, \
L20, L21, L22, L23, L24, R20, R21, R22, R23, R24, \
L31, L32, R32, R33, \
L33, L34, R30, R31, \
L44, L43, R41, R40, \
L42, L41, R43, R42 \
) \
{ \
{ R04, R03, R02, R01, R00 }, \
{ R14, R13, R12, R11, R10 }, \
{ R24, R23, R22, R21, R20 }, \
{ KC_NO, R33, R32, R31, R30 }, \
{ KC_NO, R43, R42, R41, R40 }, \
\
{ L00, L01, L02, L03, L04 }, \
{ L10, L11, L12, L13, L14 }, \
{ L20, L21, L22, L23, L24 }, \
{ KC_NO, L31, L32, L33, L34 }, \
{ KC_NO, L41, L42, L43, L44 } \
\
}
#endif
#endif

View File

@ -0,0 +1,2 @@
:0F000000000000000000000000000000000001F0
:00000001FF

View File

@ -0,0 +1,2 @@
:0F000000000000000000000000000000000000F1
:00000001FF

View File

@ -5,59 +5,68 @@
extern keymap_config_t keymap_config;
#define _BASE 0
#define _NAV 1
#define _NUM 2
enum custom_keycodes {
QWERTY = SAFE_RANGE,
NAV,
NUM,
};
#define _RAISE 1
#define _LOWER 2
// Fillers to make layering more clear
#define _______ KC_TRNS
#define XXXXXXX KC_NO
#define ____ KC_TRNS
#define SFT_ESC SFT_T(KC_ESC)
#define CTL_BSPC CTL_T(KC_BSPC)
#define ALT_SPC ALT_T(KC_SPC)
#define SFT_ENT SFT_T(KC_ENT)
#define KC_ML KC_MS_LEFT
#define KC_MR KC_MS_RIGHT
#define KC_MU KC_MS_UP
#define KC_MD KC_MS_DOWN
#define KC_MB1 KC_MS_BTN1
#define KC_MB2 KC_MS_BTN1
#define RAISE MO(_RAISE)
#define LOWER MO(_LOWER)
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Base (qwerty)
* ,----------------------------------, ,----------------------------------,
* | Q | W | E | R | T | | Y | U | I | O | P |
* | q | w | e | r | t | | y | u | i | o | p |
* |------+------+------+------+------| |-------------+------+------+------|
* | A | S | D | F | G | | H | J | K | L | ; |
* | a | s | d | f | g | | h | j | k | l | ; |
* |------+------+------+------+------| |------|------+------+------+------|
* | Z | X | C | V | B | | N | M | , | . | ' |
* | z | x | c | v | b | | n | m | , | . | ' |
* |------+------+------+-------------, ,-------------+------+------+------,
* | [ | ] | | - | = |
* '------+------'-------------' '-------------'------+------'
* | esc | bs | | space|enter |
* | ESC | BS | | SPACE|ENTER |
* | + | + | | + | + |
* | shift| ctrl | | alt |shift |
* | SHIFT| CTRL | | ALT |SHIFT |
* '------+------' '------+------'
* '------+------' '------+------'
* | tab | home | | end | del |
* |------+------' '------+------|
* |\(NAV)| ~ | | gui |/(NUM)|
* | TAB | HOME | | END | DEL |
* '------+------' '------+------'
* | Lower| ~ | | GUI | Raise|
* '------+------' '------+------'
*/
[_BASE] = LAYOUT( \
KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, \
KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, \
KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_QUOT, \
KC_LBRC, KC_RBRC, KC_MINS, KC_EQL, \
SFT_T(KC_ESC), CTL_T(KC_BSPC), ALT_T(KC_SPC), SFT_T(KC_ENT), \
KC_TAB, KC_HOME, KC_END, KC_DEL, \
LT(_NAV, KC_BSLS), KC_GRV, KC_LGUI, LT(_NUM, KC_SLSH) \
KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, \
KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, \
KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_QUOT, \
KC_LBRC, KC_RBRC, KC_MINS, KC_EQL, \
SFT_ESC, CTL_BSPC, ALT_SPC, SFT_ENT, \
KC_TAB, KC_HOME, KC_END, KC_DEL, \
RAISE, KC_GRV, KC_LGUI, LOWER
),
/* Navigation layer
/* Raise
* ,----------------------------------, ,----------------------------------,
* | | | mup | | | | | | up | | |
* | | | mup | | | | VOL+ | | up | | PgUp |
* |------+------+------+------+------| |-------------+------+------+------|
* | | mleft| mdown|mright| | | | left | down |right | |
* | | mleft| mdown|mright| | | MUTE | left | down |right | PgDn |
* |------+------+------+------+------| |------|------+------+------+------|
* | | | | | | | | | | | |
* | | | | | | | VOL- | / | \ | ? | | |
* |------+------+------+-------------, ,-------------+------+------+------,
* | | | | mbtn |mbtn2 |
* '------+------'-------------' '-------------'------+------'
@ -66,22 +75,22 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | | | | | |
* '------+------' '------+------'
* '------+------' '------+------'
* | tab | home | | end | del |
* | | | | | |
* '------+------' '------+------'
* |\(NAV)| ~ | | gui |/(NUM)|
* | | | | | |
* '------+------' '------+------'
*/
[_NAV] = LAYOUT( \
KC_TRNS, KC_TRNS, KC_MS_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, \
KC_TRNS, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, \
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
KC_TRNS, KC_TRNS, KC_MS_BTN1, KC_MS_BTN2, \
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
[_RAISE] = LAYOUT( \
____, ____, KC_MU, ____, ____, KC_VOLU, ____, KC_UP, ____, KC_PGUP, \
____, KC_ML, KC_MD, KC_MR, ____, KC_MUTE, KC_LEFT, KC_DOWN, KC_RIGHT, KC_PGDOWN, \
____, ____, ____, ____, ____, KC_VOLD, KC_SLSH, KC_BSLS, KC_QUES, KC_PIPE, \
____, ____, KC_MB1, KC_MB2, \
____, ____, ____, ____, \
____, ____, ____, ____, \
____, ____, ____, ____ \
),
/* Numbers layer
/* Lower
* ,----------------------------------, ,----------------------------------,
* | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 |
* |------+------+------+------+------| |-------------+------+------+------|
@ -89,26 +98,27 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* |------+------+------+------+------| |------|------+------+------+------|
* | ! | @ | # | $ | % | | ^ | & | * | ( | ) |
* |------+------+------+-------------, ,-------------+------+------+------,
* | F11 | F12 | | | |
* | F11 | F12 | | - | = |
* '------+------'-------------' '-------------'------+------'
* | | | | | |
* | | | | | |
* | | | | | |
* '------+------' '------+------'
* '------+------' '------+------'
* | tab | home | | end | del |
* | | | | | |
* '------+------' '------+------'
* |\(NAV)| ~ | | gui |/(NUM)|
* | | | | | |
* '------+------' '------+------'
*/
[_NUM] = LAYOUT( \
KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, \
KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, \
KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_UNDS, \
KC_F11, KC_F12, KC_TRNS, KC_TRNS, \
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
[_LOWER] = LAYOUT( \
KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, \
KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, \
KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, \
KC_F11, KC_F12, ____, ____, \
____, ____, ____, ____, \
____, ____, ____, ____, \
____, ____, ____, ____ \
)
};

View File

@ -5,24 +5,33 @@
extern keymap_config_t keymap_config;
#define _BASE 0
#define _NAV 1
#define _NUM 2
enum custom_keycodes {
QWERTY = SAFE_RANGE,
NAV,
NUM,
};
#define _RAISE 1
#define _LOWER 2
// Fillers to make layering more clear
#define _______ KC_TRNS
#define XXXXXXX KC_NO
#define ____ KC_TRNS
#define SFT_ESC SFT_T(KC_ESC)
#define CTL_BSPC CTL_T(KC_BSPC)
#define ALT_SPC ALT_T(KC_SPC)
#define SFT_ENT SFT_T(KC_ENT)
#define KC_ML KC_MS_LEFT
#define KC_MR KC_MS_RIGHT
#define KC_MU KC_MS_UP
#define KC_MD KC_MS_DOWN
#define KC_MB1 KC_MS_BTN1
#define KC_MB2 KC_MS_BTN1
#define RAISE MO(_RAISE)
#define LOWER MO(_LOWER)
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Base (dvorak)
* ,----------------------------------, ,----------------------------------,
* | ' | , | . | p | y | | f | g | c | r | l |
* | ' | , | . | p | y | | f | g | c | r | l |
* |------+------+------+------+------| |-------------+------+------+------|
* | a | o | e | u | i | | d | h | t | n | s |
* |------+------+------+------+------| |------|------+------+------+------|
@ -30,14 +39,14 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* |------+------+------+-------------, ,-------------+------+------+------,
* | [ | ] | | - | = |
* '------+------'-------------' '-------------'------+------'
* | esc | bs | | space|enter |
* | ESC | BS | | SPACE|ENTER |
* | + | + | | + | + |
* | shift| ctrl | | alt |shift |
* | SHIFT| CTRL | | ALT |SHIFT |
* '------+------' '------+------'
* '------+------' '------+------'
* | tab | home | | end | del |
* |------+------' '------+------|
* |\(NAV)| ~ | | gui |/(NUM)|
* | TAB | HOME | | END | DEL |
* '------+------' '------+------'
* | Lower| ~ | | GUI | Raise|
* '------+------' '------+------'
*/
@ -46,18 +55,18 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, \
KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, \
KC_LBRC, KC_RBRC, KC_MINS, KC_EQL, \
SFT_T(KC_ESC), CTL_T(KC_BSPC), ALT_T(KC_SPC), SFT_T(KC_ENT), \
KC_TAB, KC_HOME, KC_END, KC_DEL, \
LT(_NAV, KC_BSLS), KC_GRV, KC_LGUI, LT(_NUM, KC_SLSH) \
SFT_ESC, CTL_BSPC, ALT_SPC, SFT_ENT, \
KC_TAB, KC_HOME, KC_END, KC_DEL, \
RAISE, KC_GRV, KC_LGUI, LOWER
),
/* Navigation layer
/* Raise
* ,----------------------------------, ,----------------------------------,
* | | | mup | | | | | | up | | |
* | | | mup | | | | VOL+ | | up | | PgUp |
* |------+------+------+------+------| |-------------+------+------+------|
* | | mleft| mdown|mright| | | | left | down |right | |
* | | mleft| mdown|mright| | | MUTE | left | down |right | PgDn |
* |------+------+------+------+------| |------|------+------+------+------|
* | | | | | | | | | | | |
* | | | | | | | VOL- | / | \ | ? | | |
* |------+------+------+-------------, ,-------------+------+------+------,
* | | | | mbtn |mbtn2 |
* '------+------'-------------' '-------------'------+------'
@ -66,22 +75,22 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | | | | | |
* '------+------' '------+------'
* '------+------' '------+------'
* | tab | home | | end | del |
* | | | | | |
* '------+------' '------+------'
* |\(NAV)| ~ | | gui |/(NUM)|
* | | | | | |
* '------+------' '------+------'
*/
[_NAV] = LAYOUT( \
KC_TRNS, KC_TRNS, KC_MS_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, \
KC_TRNS, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, \
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
KC_TRNS, KC_TRNS, KC_MS_BTN1, KC_MS_BTN2, \
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
[_RAISE] = LAYOUT( \
____, ____, KC_MU, ____, ____, KC_VOLU, ____, KC_UP, ____, KC_PGUP, \
____, KC_ML, KC_MD, KC_MR, ____, KC_MUTE, KC_LEFT, KC_DOWN, KC_RIGHT, KC_PGDOWN, \
____, ____, ____, ____, ____, KC_VOLD, KC_SLSH, KC_BSLS, KC_QUES, KC_PIPE, \
____, ____, KC_MB1, KC_MB2, \
____, ____, ____, ____, \
____, ____, ____, ____, \
____, ____, ____, ____ \
),
/* Numbers layer
/* Lower
* ,----------------------------------, ,----------------------------------,
* | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 |
* |------+------+------+------+------| |-------------+------+------+------|
@ -89,26 +98,27 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* |------+------+------+------+------| |------|------+------+------+------|
* | ! | @ | # | $ | % | | ^ | & | * | ( | ) |
* |------+------+------+-------------, ,-------------+------+------+------,
* | F11 | F12 | | | |
* | F11 | F12 | | - | = |
* '------+------'-------------' '-------------'------+------'
* | | | | | |
* | | | | | |
* | | | | | |
* '------+------' '------+------'
* '------+------' '------+------'
* | tab | home | | end | del |
* | | | | | |
* '------+------' '------+------'
* |\(NAV)| ~ | | gui |/(NUM)|
* | | | | | |
* '------+------' '------+------'
*/
[_NUM] = LAYOUT( \
KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, \
KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, \
KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_UNDS, \
KC_F11, KC_F12, KC_TRNS, KC_TRNS, \
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
[_LOWER] = LAYOUT( \
KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, \
KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, \
KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, \
KC_F11, KC_F12, ____, ____, \
____, ____, ____, ____, \
____, ____, ____, ____, \
____, ____, ____, ____ \
)
};

View File

@ -1,7 +1,8 @@
Dactyl manuform
Dactyl Manuform
======
the [Dactyl-Manuform](https://github.com/tshort/dactyl-keyboard) is a split curved keyboard based on the design of [adereth dactyl](https://github.com/adereth/dactyl-keyboard) and thumb cluster design of the [manuform](https://geekhack.org/index.php?topic=46015.0) keyboard, the hardware is similar to the let's split keyboard. all information needed for making one is in the first link.
![Imgur](https://i.imgur.com/7y0Vbyd.jpg)
## First Time Setup
@ -31,6 +32,19 @@ dactyl_manuform_YOUR_KEYMAP_NAME.hex
For more information on customizing keymaps, take a look at the primary documentation for [Customizing Your Keymap](/docs/faq_keymap.md) in the main readme.md.
## Keymaps
Currently there are only two keymaps: Qwerty and Dvorak, feel free to make changes and contribute your keymap.
### Qwerty and Dvorak
Qwerty base layer:
![Imgur](https://i.imgur.com/Yb5e7dS.png)
Dvorak base layer:
![Imgur](https://i.imgur.com/CpuZptB.png)
Both keymaps have the same Raise and Lower layers:
Raise Layer
![Imgur](https://i.imgur.com/nOqePK5.png)
Lower Layer
![Imgur](https://i.imgur.com/WSshkYc.png)
Required Hardware
-----------------