【仕事効率化】マクロパッドを購入、作成してみました

はじめに

以下を購入、作成してみました。
ここからはじめる自作キーボードyushakobo.jp

本に作り方が詳しく書いてあるので電子工作初心者の自分でも問題なく作ることができた。はんだ付けのコツも書いてあった。


キーの割り当てをするにはPro Microにfirmwareを書き込んで・・・。
そこの部分は難しかったのでArduino IDEを使ってキーの割り当てをした。


以前Arduino Leonardoで同様のことをしたことがあったので何とかできた。
touch-sp.hatenablog.com

Arduinoスケッチ

#include "Keyboard.h"

const int rowNum = 2;
const int colNum = 3;

const int rowPin[rowNum] = { 4, 5 };
const int colPin[colNum] = { 21, 20, 19 };

bool currentState[rowNum][colNum];
bool beforeState[rowNum][colNum];

int i,j;

void key_push(int row, int col){
  if(row==0 and col==0){
    Keyboard.press(KEY_LEFT_CTRL);
    Keyboard.press(KEY_LEFT_SHIFT);
    Keyboard.press('\'');
    delay(100);
    Keyboard.releaseAll();
  }
  if(row==0 and col==1){
    Keyboard.write(KEY_LEFT_ALT);
    delay(150);
    Keyboard.write('n');
    Keyboard.write('n');
    Keyboard.write('1');
  }
  if(row==0 and col==2){
    Keyboard.write(KEY_LEFT_ALT);
    delay(150);
    Keyboard.write('n');
    Keyboard.write('c');
  }
  if(row==1 and col==0){
    Keyboard.press(KEY_LEFT_GUI);
    Keyboard.press('r');
    Keyboard.releaseAll();
    delay(100);
    Keyboard.print("calc");
    Keyboard.write(KEY_RETURN);
  }
  if(row==1 and col==1){
    Keyboard.press(KEY_LEFT_GUI);
    Keyboard.press('r');
    Keyboard.releaseAll();
    delay(100);
    Keyboard.print("SnippingTool");
    Keyboard.write(KEY_RETURN);
  }
  if(row==1 and col==2){
    Keyboard.press(KEY_LEFT_GUI);
    Keyboard.press('r');
    Keyboard.releaseAll();
    delay(100);
    Keyboard.print("excel");
    Keyboard.write(KEY_RETURN);
  }
}

void setup() {
  
  Keyboard.begin();

  for( i = 0; i < rowNum; i++){
    pinMode(rowPin[i],OUTPUT);
    digitalWrite(rowPin[i],HIGH);
  }

  for( i = 0; i < colNum; i++){
    pinMode(colPin[i],INPUT_PULLUP);
  }

  for( i = 0; i < rowNum; i++){
    for( j = 0; j < colNum; j++){
      currentState[i][j] = HIGH;
      beforeState[i][j] = HIGH;
    }
  }
}

void loop() {
  for( i = 0; i < rowNum; i++){
    digitalWrite( rowPin[i], LOW );
    for( j = 0; j < colNum; j++){
      currentState[i][j] = digitalRead(colPin[j]);
      if ( currentState[i][j] != beforeState[i][j] ){
        if ( currentState[i][j] == LOW){
          key_push(i, j);
        } 
      beforeState[i][j] = currentState[i][j];
      }
    }
    digitalWrite( rowPin[i], HIGH );
  }
}

スケッチの説明

ボタン①(Excel内でアクティブセル領域を選択する)

  if(row==0 and col==0){
    Keyboard.press(KEY_LEFT_CTRL);
    Keyboard.press(KEY_LEFT_SHIFT);
    Keyboard.press('\'');
    delay(100);
    Keyboard.releaseAll();
  }

ボタン②(アクティブセル領域選択後に折れ線グラフを挿入する)

  if(row==0 and col==1){
    Keyboard.write(KEY_LEFT_ALT);
    delay(150);
    Keyboard.write('n');
    Keyboard.write('n');
    Keyboard.write('1');
  }

ボタン③(アクティブセル領域選択後に棒グラフを挿入する)

  if(row==0 and col==2){
    Keyboard.write(KEY_LEFT_ALT);
    delay(150);
    Keyboard.write('n');
    Keyboard.write('c');
  }

ボタン④(電卓アプリを開く)

  if(row==1 and col==0){
    Keyboard.press(KEY_LEFT_GUI);
    Keyboard.press('r');
    Keyboard.releaseAll();
    delay(100);
    Keyboard.print("calc");
    Keyboard.write(KEY_RETURN);
  }

ボタン⑤(Snipping Toolを開く)

  if(row==1 and col==1){
    Keyboard.press(KEY_LEFT_GUI);
    Keyboard.press('r');
    Keyboard.releaseAll();
    delay(100);
    Keyboard.print("SnippingTool");
    Keyboard.write(KEY_RETURN);
  }

ボタン⑥(Exceを開く)

  if(row==1 and col==2){
    Keyboard.press(KEY_LEFT_GUI);
    Keyboard.press('r');
    Keyboard.releaseAll();
    delay(100);
    Keyboard.print("excel");
    Keyboard.write(KEY_RETURN);
  }

参考にさせて頂いたサイト

eucalyn.hatenadiary.jp
qiita.com

2020年8月28日追記

いろいろ試した結果以下のように使うこととした。
次のように決まったキーを連続で押すような場合、一つのボタンに割り当てられるので非常に便利。作業効率劇的アップに成功。

「Alt」→「c」→「t」→2秒待機→「Ctrl + p」→「Alt + p」→「Alt + c」→「Ctrl + c」

#include "Keyboard.h"

const int rowNum = 2;
const int colNum = 3;

const int rowPin[rowNum] = { 4, 5 };
const int colPin[colNum] = { 21, 20, 19 };

bool currentState[rowNum][colNum];
bool beforeState[rowNum][colNum];

int i,j;

void key_push(int row, int col){
  if(row==0 and col==0){
    Keyboard.press(KEY_LEFT_CTRL);
    Keyboard.press('v');
    Keyboard.releaseAll();
    delay(200);
  }
  if(row==0 and col==1){
    Keyboard.write(KEY_LEFT_ALT);
    delay(100);
    Keyboard.write('c');
    Keyboard.write('t');
    delay(2000);
    Keyboard.press(KEY_LEFT_CTRL);
    Keyboard.press('p');
    Keyboard.releaseAll();
    delay(100);
    Keyboard.press(KEY_LEFT_ALT);
    Keyboard.press('p');
    Keyboard.releaseAll();
    delay(1000);
    Keyboard.press(KEY_LEFT_ALT);
    Keyboard.press('c');
    Keyboard.releaseAll();
    delay(300);
    Keyboard.press(KEY_LEFT_CTRL);
    Keyboard.press('c');
    Keyboard.releaseAll();
  }
  if(row==0 and col==2){
    Keyboard.press(KEY_LEFT_CTRL);
    Keyboard.press('d');
    Keyboard.releaseAll();
    delay(200);
  }
  if(row==1 and col==0){
    Keyboard.press(KEY_LEFT_CTRL);
    Keyboard.press('g');
    Keyboard.releaseAll();
    delay(200);
  }
  if(row==1 and col==1){
    Keyboard.press(KEY_LEFT_CTRL);
    Keyboard.press('c');
    Keyboard.releaseAll();
    delay(200);
  }
  if(row==1 and col==2){
    Keyboard.press(KEY_LEFT_CTRL);
    Keyboard.press('n');
    Keyboard.releaseAll();
    delay(200);
  }
}

void setup() {
  
  Keyboard.begin();

  for( i = 0; i < rowNum; i++){
    pinMode(rowPin[i],OUTPUT);
    digitalWrite(rowPin[i],HIGH);
  }

  for( i = 0; i < colNum; i++){
    pinMode(colPin[i],INPUT_PULLUP);
  }

  for( i = 0; i < rowNum; i++){
    for( j = 0; j < colNum; j++){
      currentState[i][j] = HIGH;
      beforeState[i][j] = HIGH;
    }
  }
}

void loop() {
  for( i = 0; i < rowNum; i++){
    digitalWrite( rowPin[i], LOW );
    for( j = 0; j < colNum; j++){
      currentState[i][j] = digitalRead(colPin[j]);
      if ( currentState[i][j] != beforeState[i][j] ){
        if ( currentState[i][j] == LOW){
          key_push(i, j);
        } 
      beforeState[i][j] = currentState[i][j];
      }
    }
    digitalWrite( rowPin[i], HIGH );
  }
}

2022年5月31日追記

ここで作成したマクロパッドは実際非常に役に立っています。

新たに物理キーを持たないマクロパッドを作ってみました。
touch-sp.hatenablog.com