LoginSignup
3
0

More than 3 years have passed since last update.

はじめに

ゲーマーではありませんが、光り物が欲しくなったので「光るマウスパッド」作ってみました。机から離れているときはチカチカしたくないので、感圧センサーをつけました。Lチカは、じわっと点灯とナイトライダー仕様の2つをミックスしました。

ハード

  • ArduinoNano(Amazon)
  • LED × 6(秋月)
  • 抵抗 220Ω × 6、10KΩ × 1
  • 感圧センサー(Amazon)
  • ユニバーサル基板
  • ワイヤー
  • L字ピンヘッダ、ピンソケット (6ピン)
  • アクリル板 (ヨドバシ)
  • マウスパッド(Amazon)

マウスパッドを入れて2,500円ぐらいでしょうか。
ArduinoNano だと PWM が 6つなので、LED は 6つにしてます。
電池駆動は無理なので、どうせ電源いるので Nano にしました。
Nano でも中華互換機なら 400円程度ですので。
まだNanoがむき出しですので、継続運用できそうならケースを考えます。

ソフト

プログラム仕様
* 感圧センサーでを読み取って手を置いたら、じわっと点灯
* 感圧センサーでを読み取って手を離したら、じわっと消灯
* 手を離して10秒経つと、ナイトライダーモード
* さらに手を離して60秒経つと、消灯

LightningMousePad.ino
/*
  Lighhtning MousePad

  Harware
    Arduino Nano
    LED 6
    Register 6
    pressure sensor 1
*/

#define PRESS_SENSOR  A1
#define LED_SIZE 6
#define LOOP_SIZE (LED_SIZE - 1) * 2

#define FIRST_WEIGHT  700     // on your setting
#define ONHAND_WEIGHT  600    // on your setting
#define KNIGHT_RIDER_DELAY 200
#define WAIT_MODE_TIME 5     // 10 sec
#define SLEEP_MODE_TIME 60   // 60 sec

byte leds[LED_SIZE] = {3, 5, 6, 9, 10, 11}; // Digital Pin (PWM)

void setup()
{
  for (byte i = 0; i < LED_SIZE; i++)
  {
    pinMode(leds[i], OUTPUT);
    digitalWrite(leds[i], LOW);
  }
  pinMode(PRESS_SENSOR, INPUT);
}

void loop()
{
    static bool onhand = false;
    static uint32_t sleep = 0;

    int val = 0, vald;
    int ana = analogRead(PRESS_SENSOR);
    if(ana < ONHAND_WEIGHT) {
      if(!onhand)
      {
        for( val = 0; val < 81 ; ++val ){
          vald = getDutyCycle(val);
          for (byte i = 0; i < LED_SIZE; i++)
          {
            analogWrite(leds[i], vald);
          }
          delay(5);
        }
        onhand = true;
      }
      sleep = millis();
    }
    else if(ana > (FIRST_WEIGHT - 10) && onhand)
    {
      for( val = 81; -1 < val ; --val ){
        vald = getDutyCycle(val);
        for (byte i = 0; i < LED_SIZE; i++)
        {
          analogWrite(leds[i], vald);
        }
        delay(5);
      }
      onhand = false;
      sleep = millis();
    }
    else if(millis() - sleep > ((uint16_t)SLEEP_MODE_TIME) * 1000) {
      // sleep, led off
      for (byte i = 0; i < LED_SIZE; i++)
      {
        analogWrite(leds[i], 0);
      }
      delay(500);
    }
    else if(millis() - sleep > ((uint16_t)WAIT_MODE_TIME) * 1000) {
      KnightRider();
    }

    delay(10);
}

void KnightRider()
{
  static byte led_luma[LED_SIZE];

  for (byte repeat = 0; repeat < LOOP_SIZE; repeat++)
  {
    byte led_now = (repeat < LED_SIZE) ? repeat : LOOP_SIZE - repeat;
    for (byte i = 0; i < LED_SIZE; i++)
    {
      led_luma[i] /= 2;
    }
    led_luma[led_now] = 50;
    for (byte i = 0; i < LED_SIZE; i++)
    {
      analogWrite(leds[i], led_luma[i]);
    }
    delay(KNIGHT_RIDER_DELAY);
  }
}

int getDutyCycle(int val)
{
    double x = (double)val * 255.0 / 100.0;
    return (int)floor(x + 0.5);
}


回路図

ほぼLチカ回路なので説明は不要かと。あと感圧センサーは分圧するぐらいです。

A1/R10KΩ/GND は Nano の下を通ってます。L字ピンヘッダがユニバーサル基板の下から出て、ピンクのピンソケットに繋げてます。ピンソケットにしないと加工しづらいので。

アクリル板の方はこんな感じ。だいぶ貧素でイカの骨みたいですが、意外とキレイに光ります。どうせマウスパッドで隠れるので問題なしです。

分かりづらいですが、↑アクリル板の表にVCC線、裏にGND線を通してます。
感圧センサは、手を置く位置に表面に貼り付けます。

アクリル板は 2mm か 3mm がいいと思います。私は 3mm だと少し厚みが出るので2mmにしました。値段も3mmは高いです。あと縁(フチ)の加工をしたほうが良いか迷います。当初はフチを斜め∠にするために少し大きめにカットしたのですが、これでも十分なのでまだ加工してません。

終わりに

やっぱりアクリル板とか使いだすと、IoTだかDIYだか分からなくなってくる(あるある)。買ったほうが安い(Amazon)と思ったら負け。感圧で動きが付けられるのは他には無い!ナイトライダーモードはLEDが6つだとツラけど、これでも十分さ。マウスパッドとアクリル板をケチればもう少しお安くなるかも(塩ビ板にするとか)。

みなさんも「光るマウスパッド」を自作してはいかかでしょう?その際はぜひご一報を。

SpecialThanks

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0