はじめに
ゲーマーではありませんが、光り物が欲しくなったので「光るマウスパッド」作ってみました。机から離れているときはチカチカしたくないので、感圧センサーをつけました。Lチカは、じわっと点灯とナイトライダー仕様の2つをミックスしました。
#ArduinoNano#Arduino Lightning Mousepad, KnightRider mode and blink mode. pic.twitter.com/wUyd7sIL21
— nori.dev.akg (@nori_dev_akg) 2019年6月17日
ハード
- 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秒経つと、消灯
/*
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