自作キーボード【素 Shiro】ラズパイで使う

自作キーボードの素 Shiroを買ったので、組み立ててラズパイで使ってみます。

ラズパイでは普段キーボードを使わずに、ちょっとした操作のみこのキーボードで使える用に設定していきます。

https://github.com/ShinoharaTa/keyboards/blob/master/Shiro/manual/build_guide_ja.md

QMK-firmware ラズパイでやる

説明

この↓説明を読む

https://github.com/MakotoKurauchi/helix/blob/master/Doc/firmware_jp.md
QMK Firmware Docs
The full documentation of the open-source firmware

ラズパイなどLinux やってみる

GitHub - qmk/qmk_firmware: Open-source keyboard firmware for Atmel AVR and Arm USB families
Open-source keyboard firmware for Atmel AVR and Arm USB families - GitHub - qmk/qmk_firmware: Open-source keyboard firmware for Atmel AVR and Arm USB families

(Windowsの場合はF:\Appli=/mnt/f/Appliに[Shift]+右クリックでLinuxシェルを開くで開いて作業する。)

qmk インストール

 python3 -m pip install qmk
 qmk --version
Warning: Your Python version is out of date! Some subcommands may not work!
Please upgrade to Python 3.7 or later.
Error: Your Python is too old! Please upgrade to Python 3.7 or later.


ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
launchpadlib 1.10.6 requires testresources, which is not installed.

sudo apt install python3-testresources

Python アップグレード

Python3.65と古かったのでアップグレードする。

sudo apt-get install python3.7
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 1
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 2
sudo update-alternatives --config python3
alternative python3 (/usr/bin/python3 を提供) には 2 個の選択肢があります。
  選択肢    パス              優先度  状態
------------------------------------------------------------
* 0            /usr/bin/python3.7   2         自動モード
  1            /usr/bin/python3.6   1         手動モード
  2            /usr/bin/python3.7   2         手動モード
python3 -V
Python 3.7.5

qmk_install.sh

cd script
git clone https://github.com/qmk/qmk_firmware.git
cd qmk_firmware
util/qmk_install.sh
まだ足りないみたい。以下をやる
make git-submodule

Ubuntuの場合はPillowがどーのとエラーが出るのでアップグレードした。

python3 -m pip install --upgrade pip
python3 -m pip install --upgrade pillow

これで各キーボードのHexファイルがダウンロードされるみたい。

make shiro:check
make shiro:check:avrdude
#Detecting USB port, reset your controller now.と出たら裏のリセットボタンを押す

うまくいかない時

Ubuntu18でqmk_firmwareのセットアップ - Qiita
ProMicroに付属のピンヘッダーをはんだ付けしないコンスルーの向きを確認する使用機器Pro MicroPro Microは、sparkfun社のArduino Leonardo互換の赤色…
sudo apt remove modemmanager
sudo chmod 777 /dev/ttyACM0   #別のシェルからやる、make shiro:check:avrdudeやったらすぐに実行する

この状態で、キーを押すとD1D2などが入力される。

make shiro:default
make shiro:default:avrdude
#Detecting USB port, reset your controller now.と出たら裏のリセットボタンを押す

数値がうまく入力できない?↓

この keymap.c ファイルだとCURしか使えない?みたい。

キーマップカスタマイズ

カスタマイズ

cd ~/script/qmk_firmware/keyboards/shiro/keymaps/default

この中のファイルconfig.h keymap.c readme.mdの3つあるうちの keymap.c を編集する。

$cat keymap.c
#include QMK_KEYBOARD_H

enum layer_number {
  _NUMBER = 0,
  _CURSOL,
  _MOUSE
};

#define NUMBER TO(_NUMBER)
#define CURSOL TO(_CURSOL)
#define MOUSE  TO(_MOUSE)

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  [_NUMBER] = LAYOUT(
    NUMBER,   CURSOL,   MOUSE,
    KC_P7,    KC_P8,    KC_P9,
    KC_P4,    KC_P5,    KC_P6,
    KC_P1,    KC_P2,    KC_P3,
    KC_P0,    KC_BSPC,  KC_ENT
  ),
  [_CURSOL] = LAYOUT(
    NUMBER,   CURSOL,   MOUSE,
    KC_HOME,  KC_UP,    KC_PGUP,
    KC_LEFT,  KC_ESC,   KC_RIGHT,
    KC_END,   KC_DOWN,  KC_PGDN,
    KC_DEL,   KC_BSPC,  KC_ENT
  ),
  [_MOUSE] = LAYOUT(
    NUMBER,   CURSOL,   MOUSE,
    KC_CUT,   KC_COPY,  KC_PSTE,
    KC_UNDO,  KC_FIND,  KC_AGIN,
    XXXXXXX,  XXXXXXX,  XXXXXXX,
    KC_DEL,   KC_BSPC,  KC_ENT
  ),
};

Defaultディレクトリをコピー

カスタマイズする前にDefaultディレクトリごとコピーしておく。

cp -R ~/script/qmk_firmware/keyboards/shiro/keymaps/default ~/script/qmk_firmware/keyboards/shiro/keymaps/default.back

keymap.c 編集したら再度書き込む

Mouseの部分をWebiopiのリレースイッチのオン・オフのボタンとして使う用に設定する。

defaultフォルダではなく、別にtestなどのフォルダを作ってkeymap.cを編集するほうが良いみたい。

編集したらもう一度書き込む。

cd ~/script/qmk_firmware
make shiro:test
make shiro:test:avrdude
#Detecting USB port, reset your controller now.と出たら裏のリセットボタンを押す

Macroでできるみたい

QMK Firmware Docs
The full documentation of the open-source firmware

コマンドでWebiopiを操作する

curlで操作する

sudo apt-get install php-curl

これでうまくいった。

#オフ
curl -X POST http://192.168.31.53:8000/GPIO/6/value/1
#オン
curl -X POST http://192.168.31.53:8000/GPIO/6/value/0

Terminal起動

[Ctrl]+[ALT]+[t]キーの同時押しで起動するからコレを組み込む。

[Shift]+[Ctrl]+[q]で終了、キーを離した時に終了する。

GPIOの状態を確認する

Raspi4にはうまくいかなかった。Raspi3にはある。

Pigpiodを有効にする Raspi4ではダメだった・・・

sudo raspi-config

5,Interfacing Options > Remote GPIOをオンにする。

Raspi-config

Raspi4だと以下のように表示される・・・Raspi3はできたみたい。

Failed to get unit file state for pigpiod.service: No such file or directory

起動しても↓エラーになる。

 $ sudo systemctl enable pigpiod
Failed to enable unit: Unit file pigpiod.service does not exist.

Wiringpi インストール

どうやらgpioコマンドはWiringpiのものらしい。

sudo apt-get install wiringpi
 $ gpio readall 以下のようなエラーになる。
Oops - unable to determine board type... model: 17
以下を実行
wget https://project-downloads.drogon.net/wiringpi-latest.deb
sudo dpkg -i wiringpi-latest.deb

以下のようにコマンド使えるようになった。

gpio -h
gpio: Usage: gpio -v
       gpio -h
       gpio [-g|-1] ...

BCMがGPIO番号。Vがオン(0)・オフ(1)の状態。↓以下の表では5・6・19(ラズパイ時計)がオン(0)になっている状態。

 $ gpio readall
 +-----+-----+---------+------+---+---Pi 4B--+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 |     |     |    3.3v |      |   |  1 || 2  |   |      | 5v      |     |     |
 |   2 |   8 |   SDA.1 | ALT0 | 1 |  3 || 4  |   |      | 5v      |     |     |
 |   3 |   9 |   SCL.1 | ALT0 | 1 |  5 || 6  |   |      | 0v      |     |     |
 |   4 |   7 | GPIO. 7 |   IN | 1 |  7 || 8  | 1 | IN   | TxD     | 15  | 14  |
 |     |     |      0v |      |   |  9 || 10 | 1 | IN   | RxD     | 16  | 15  |
 |  17 |   0 | GPIO. 0 |   IN | 0 | 11 || 12 | 1 | IN   | GPIO. 1 | 1   | 18  |
 |  27 |   2 | GPIO. 2 |   IN | 0 | 13 || 14 |   |      | 0v      |     |     |
 |  22 |   3 | GPIO. 3 |   IN | 0 | 15 || 16 | 0 | IN   | GPIO. 4 | 4   | 23  |
 |     |     |    3.3v |      |   | 17 || 18 | 0 | IN   | GPIO. 5 | 5   | 24  |
 |  10 |  12 |    MOSI | ALT0 | 0 | 19 || 20 |   |      | 0v      |     |     |
 |   9 |  13 |    MISO | ALT0 | 0 | 21 || 22 | 0 | IN   | GPIO. 6 | 6   | 25  |
 |  11 |  14 |    SCLK | ALT0 | 0 | 23 || 24 | 1 | OUT  | CE0     | 10  | 8   |
 |     |     |      0v |      |   | 25 || 26 | 1 | OUT  | CE1     | 11  | 7   |
 |   0 |  30 |   SDA.0 |   IN | 1 | 27 || 28 | 1 | IN   | SCL.0   | 31  | 1   |
 |   5 |  21 | GPIO.21 |  OUT | 0 | 29 || 30 |   |      | 0v      |     |     |
 |   6 |  22 | GPIO.22 |  OUT | 0 | 31 || 32 | 1 | OUT  | GPIO.26 | 26  | 12  |
 |  13 |  23 | GPIO.23 |  OUT | 1 | 33 || 34 |   |      | 0v      |     |     |
 |  19 |  24 | GPIO.24 |  OUT | 0 | 35 || 36 | 1 | OUT  | GPIO.27 | 27  | 16  |
 |  26 |  25 | GPIO.25 |   IN | 0 | 37 || 38 | 1 | OUT  | GPIO.28 | 28  | 20  |
 |     |     |      0v |      |   | 39 || 40 | 1 | OUT  | GPIO.29 | 29  | 21  |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+---Pi 4B--+---+------+---------+-----+-----+

Pinoutというものもある。

 $ pinout
,--------------------------------.
| oooooooooooooooooooo J8     +====
| 1ooooooooooooooooooo      P | USB
|  Wi                     ooo +====
|  Fi  Pi Model 3B+ V1.3  ooE    |
|        ,----.               +====
| |D|    |SoC |               | USB
| |S|    |    |               +====
| |I|    `----'                  |
|                   |C|     +======
|                   |S|     |   Net
| pwr        |HDMI| |I||A|  +======
`-| |--------|    |----|V|-------'

Revision           : a020d3
SoC                : BCM2837
RAM                : 1024Mb
Storage            : MicroSD
USB ports          : 4 (excluding power)
Ethernet ports     : 1
Wi-fi              : True
Bluetooth          : True
Camera ports (CSI) : 1
Display ports (DSI): 1

J8:
   3V3  (1) (2)  5V
 GPIO2  (3) (4)  5V
 GPIO3  (5) (6)  GND
 GPIO4  (7) (8)  GPIO14
   GND  (9) (10) GPIO15
GPIO17 (11) (12) GPIO18
GPIO27 (13) (14) GND
GPIO22 (15) (16) GPIO23
   3V3 (17) (18) GPIO24
GPIO10 (19) (20) GND
 GPIO9 (21) (22) GPIO25
GPIO11 (23) (24) GPIO8
   GND (25) (26) GPIO7
 GPIO0 (27) (28) GPIO1
 GPIO5 (29) (30) GND
 GPIO6 (31) (32) GPIO12
GPIO13 (33) (34) GND
GPIO19 (35) (36) GPIO16
GPIO26 (37) (38) GPIO20
   GND (39) (40) GPIO21

For further information, please refer to https://pinout.xyz/

スゲェ、わかりやすく表示してくれる♪

Pinの状態取得・出力

これをキーボードに組み込もう。

$ gpio -g read 5
0
$ gpio -g write 5 1
$ gpio -g read 5
1
$ gpio -g write 5 0
$ gpio -g read 5
0

Terminal起動・Gpio状態取得・GPIO出力・Terminal閉じる

  • Terminal起動:[Ctrl]+[ALT]+[t]キーの同時押
  • GPIOの状態取得:gpio -g read 5
  • GPIO出力:gpio -g write 5 1・gpio -g write 5 0
  • Terminal終了:[Shift]+[Ctrl]+[q]

キーに直接キーコンビネーションを入力する場合

  [_NUMBER] = LAYOUT( 
    NUMBER,   CURSOL,   MOUSE,
    KC_7,    KC_8,    KC_9,
    KC_4,    KC_5,    KC_6,
    KC_1,    KC_2,    KC_3,
    LALT(LCTL(KC_T)),    KC_BSPC,  KC_ENT
  ),

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {のキーの部分に直接入力する場合は、LALT(LCTL(KC_T))などで可能。

関数に書く場合はメンドウ

bool process_record_user(uint16_t keycode, keyrecord_t *record) {

の関数に書く場合はLALT(LCTL(KC_T))だとエラーになる。

LALT(LCTL(KC_T))の場合は↓このようにやる。

        register_code(KC_LALT);
        register_code(KC_LCTL);
        register_code(KC_T);

QMKは複雑なワンキーでキー操作はできないようなので、ラズパイ側でキーボードショートカットキーを設定する。

キーボードショートカットを使ってやる

bashスクリプト

以下のようにgpoi.shでオンの時はオフ、オフの時はオンのコマンドを実行する。

#!/bin/bash

#PIN=5 /bin/bash /home/pi/script/gpio.sh このように入力・PINに番号指定
#コレ↑だと最初に引数が来てるのでコマンド送信できない
# bash gpio.sh 12のようにする。$1=12

echo "PIN: $1"
GIP=`/usr/bin/gpio -g read $1`
echo "GIP: $GIP"


if [ -n "$1" ]; then
	if [ $GIP -gt 0 ]; then
		GIO=0
	else
		GIO=1
	fi
	echo "GIO: $GIO"

	if [ -n "$GIO" ]; then
		gpon=`/usr/bin/gpio -g write $1 $GIO`
		echo "gpio -g write $1 $GIO"
		echo $gpon
	fi
fi

キーバインディング カスタマイズ lxde-pi-rc.xml

$ sudo vim /etc/xdg/openbox/lxde-pi-rc.xml

chainQuitKeyの下に追加した。

<keybind key="C-A-2">
  <action name="Execute">
     <command>/bin/bash /home/pi/script/gpio.sh 12</command>
  </action>
</keybind>
<keybind key="C-A-7">
  <action name="Execute">
     <command>/bin/bash /home/pi/script/gpio.sh 16</command>
  </action>
</keybind>
<keybind key="C-A-0">
  <action name="Execute">
     <command>/bin/bash /home/pi/script/gpio.sh 20</command>
  </action>
</keybind>
<keybind key="C-A-1">
  <action name="Execute">
     <command>/bin/bash /home/pi/script/gpio.sh 21</command>
  </action>
</keybind>
<keybind key="C-A-5">
  <action name="Execute">
     <command>/bin/bash /home/pi/script/gpio.sh 5</command>
  </action>
</keybind>
<keybind key="C-A-6">
  <action name="Execute">
     <command>/bin/bash /home/pi/script/gpio.sh 6</command>
  </action>
</keybind>
<keybind key="C-A-3">
  <action name="Execute">
     <command>/bin/bash /home/pi/script/gpio.sh 13</command>
  </action>
</keybind>
<keybind key="C-A-9">
  <action name="Execute">
     <command>/bin/bash /home/pi/script/gpio.sh 19</command>
  </action>
</keybind>

keymap.c

enum custom_keycodes {
  COMNUM = SAFE_RANGE,
  COMPASS,
  NUM2,
  NUM7,
  NUM0,
  NUM1,
  NUM5,
  NUM6,
  NUM3,
  NUM9,
  TEMDEL
};

enum layer_number {
  _NUMBER = 0,
  _CURSOL,
  _MOUSE
};

#define NUMBER TO(_NUMBER)
#define CURSOL TO(_CURSOL)
#define MOUSE  TO(_MOUSE)

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  #_MOUSEを先頭に持ってきて、デフォルトのキーにする。
  [_MOUSE] = LAYOUT( 
    NUMBER,   CURSOL,   MOUSE,
    COMNUM,  COMPASS,  KC_PSTE,
    NUM2,  NUM7,  NUM0,
    NUM1,  NUM5,  NUM6,
    NUM3,   NUM9,  TEMDEL
  ),
  [_NUMBER] = LAYOUT( 
    NUMBER,   CURSOL,   MOUSE,
    KC_7,    KC_8,    KC_9,
    KC_4,    KC_5,    KC_6,
    KC_1,    KC_2,    KC_3,
    KC_0,    KC_BSPC,  KC_ENT
  ),
  [_CURSOL] = LAYOUT( 
    NUMBER,   CURSOL,   MOUSE,
    KC_HOME,  KC_UP,    KC_PGUP,
    KC_LEFT,  KC_ESC,   KC_RIGHT,
    KC_END,   KC_DOWN,  KC_PGDN,
    KC_DEL,   KC_BSPC,  KC_ENT
  ), 
};

bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  switch(keycode){
    case COMNUM:
      if(record->event.pressed){
        SEND_STRING("364364");
      }
      break;
    case COMPASS:
      if(record->event.pressed){
        //pressed
      SEND_STRING("daishikyuimasugu");
      }
      break;
    case NUM2:
      if(record->event.pressed){
        register_code(KC_LALT);
        register_code(KC_LCTL);
        register_code(KC_2);
        unregister_code(KC_LALT);
        unregister_code(KC_LCTL);
        unregister_code(KC_2);
      }
      break;
    case NUM7:
      if(record->event.pressed){
        register_code(KC_LALT);
        register_code(KC_LCTL);
        register_code(KC_7);
        unregister_code(KC_LALT);
        unregister_code(KC_LCTL);
        unregister_code(KC_7);
      }
      break;
    case NUM0:
      if(record->event.pressed){
        register_code(KC_LALT);
        register_code(KC_LCTL);
        register_code(KC_0);
        unregister_code(KC_LALT);
        unregister_code(KC_LCTL);
        unregister_code(KC_0);
      }
      break;
    case NUM1:
      if(record->event.pressed){
        register_code(KC_LALT);
        register_code(KC_LCTL);
        register_code(KC_1);
        unregister_code(KC_LALT);
        unregister_code(KC_LCTL);
        unregister_code(KC_1);
      }
      break;
    case NUM5:
      if(record->event.pressed){
        register_code(KC_LALT);
        register_code(KC_LCTL);
        register_code(KC_5);
        unregister_code(KC_LALT);
        unregister_code(KC_LCTL);
        unregister_code(KC_5);
      }
      break;
    case NUM6:
      if(record->event.pressed){
        register_code(KC_LALT);
        register_code(KC_LCTL);
        register_code(KC_6);
        unregister_code(KC_LALT);
        unregister_code(KC_LCTL);
        unregister_code(KC_6);
      }
      break;
    case NUM3:
      if(record->event.pressed){
        register_code(KC_LALT);
        register_code(KC_LCTL);
        register_code(KC_3);
        unregister_code(KC_LALT);
        unregister_code(KC_LCTL);
        unregister_code(KC_3);
      }
      break;
    case NUM9:
      if(record->event.pressed){
        register_code(KC_LALT);
        register_code(KC_LCTL);
        register_code(KC_9);
        unregister_code(KC_LALT);
        unregister_code(KC_LCTL);
        unregister_code(KC_9);
      }
      break;
    case TEMDEL:
      if(record->event.pressed){
        register_code(KC_LSFT);
        register_code(KC_LCTL);
        register_code(KC_Q);
        unregister_code(KC_LSFT);
        unregister_code(KC_LCTL);
        unregister_code(KC_Q);
      }
      break;
  }

  return true;
}

これでうまくいった。

ただ・・・ログインしている状態じゃないと??キーが適用できない(泣)

ついでにRaspi3のスライダーをRaspi4で操作しようとしたけど未解決。

Windows10でやる

Hexダウンロード

説明ページ↓

https://github.com/qmk/qmk_firmware/tree/master/keyboards/shiro

コレ↓ダウンロード

https://qmk.fm/compiled/shiro_default.hex

Windows インストール

Releases · qmk/qmk_toolbox
A Toolbox companion for QMK Firmware. Contribute to qmk/qmk_toolbox development by creating an account on GitHub.

ここからqmk_toolbox_install.exeをダウンロードしてインストールする。

インストール後ドライバーもインストールされた。

qmk_toolbox

Hexファイルをダウンロードして、Auto-Flashをチェック、素SHIROをPCと接続して裏面のリセットボタンを押すと書き込み始まる。

ここで書き込んだキーボード配列はラズパイでは使えなかった。と思ったけどそんなことはなかった・・・

JONファイルを出力できるWebアプリ QMK Configurator

キーを視覚的にセットできるQMK ConfiguratorというWebアプリがあります。

こちらはJSONファイルを出力できますが、JSONファイルなのでこのままでは使えず?keymap.cファイルダウンロードできないみたい。

HexファイルはFirmwareからダウンロード可能でした。

FULL SOURCEはqmk_firmwareの中身をすべてダウンロードしちゃう。keymap.cはデフォルトでカスタマイズしたファイルはダウンロードできなかった。

コメント

タイトルとURLをコピーしました