Raspberry Piでタイムレコーダーを作ろう!

この投稿は PyLadies Japan Advent Calendar 2020 の19日目の記事です。

平日はゲーム30分までというのが娘との約束ですが、最近なんとなく30分以上やっているのに、まだ10分しかやってないといいはります。ただ、私も時間をちゃんとみているわけでもなく、なんとなくたくさんやっている気がするだけなのかもしれません。娘がしれっとうそを言っているのか、または本当にそう思っているのかもしれません。

それならみえる化しようじゃないか!とラズパイで作ってみました。

必要なもの

  • Raspberry pi (今回 3を使用しました)
  • LED、タクトスイッチ、抵抗(LEDとラズパイを繋ぐ際に使用します)、ブレッドボード、ジャンパワイヤ
    • タクトスイッチ、LED、ともに10円くらいで買えますので、気軽に作れますね。

動作環境

  • python3
  • sqlite3(データベース)

では早速作ってみよう!

step1

LDE、タクトスイッチをRaspberry Piと繋ぎます。

タクトスイッチは電源とGPIOボードを直接繋いでも、値が不安定となり正しく動作しません。そのため通常抵抗を挟むのですが(プルアップ抵抗、プルダウン抵抗)、ラズパイのGPIOには抵抗を挟むことなしにプルアップ・ダウン抵抗を実現するしくみがあるのでそれを使います! そのため抵抗を挟まない配線にしています。

部品 接続先
スイッチの上の足 1番ピン(3.3v)
スイッチの下の足 12番ピン(ポート18)
LEDのカソード(マイナス) 34番ピン(GND)
LEDのアノード(プラス) 抵抗を経由して40番ピン(ポート21)

f:id:electricSheep:20201219150237j:plain

step2

ゲーム開始時間と終了時間の記録に、sqlite3を使用します。sqlite3は軽量のRDBMSでDBが1つのファイルなので扱いやすいです。 csvでもよかったのですが、せっかくなので試しに使ってみました。

ラズパイにsqlite3をインストールし、開始時間、終了時間を格納するテーブルを作成します。

sqliteのインストール

  $ sudo su
  root@raspberrypi:/home/pi# apt-get install sqlite3

テーブルの作成・データinsert ・確認

pi@raspberrypi:~/timerecoder $ sqlite3 timerecoder.db
sqlite> CREATE TABLE recorder (id INTEGER PRIMARY KEY, start_time TEXT NOT NULL, end_time TEXT NOT NULL);

# 試しにデータをinsertして確認してみます。
sqlite> insert into recorder values (1, '2020-12-19 11:35:50', '2020-12-19 11:45:50');
sqlite> select * from recorder ;
1|2020-12-19 11:35:50|2020-12-19 11:45:50

step3

あとはプログラムを作成! スイッチを押したら、LEDを点灯させて、開始時間を記録。 再度押したら終了時間を記録して、LEDを消灯します。

注意点としては、以下くらいです。

  • タクトスイッチは、ラズパイのプルダウン抵抗を利用する。
    • GPIOを入力として使用する場合、setupメソッドのpull_up_down引数でプルアップ抵抗、プルダウン抵抗を指定出来ます。この設定を有効にしておくと、回路が繋がっていない状態でもGPIOの値はGPIO.LOW)に固定されるため、回路が安定します。
 # プルダウン抵抗を利用する
GPIO.setup(SWITCH, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

とりあえず動くというソースはこちらにのせています。 GitHub - masakos/raspimoku

さて、できあがって早速娘にこういうの作ったからゲームやる時ボタン押してね!といったところ、

「え、すごい!これ作ったの!」

といったあと、

「でも、これタイマーでよくない!?タイマーで30分セットすればよくない!?」

と大きな声で3回くらいいわれました。

....

なるほど....

タイマー買うの面倒でしょ!

こっちは記録もできるんだ!

ということで、実践してもらいます。

本当は前もって作成して、実際にデータをとって可視化まで行きたかったのすが、急遽本日作ったため、本日から取り始めて改めて可視化の部分の実装と結果を報告したいと思います!果たして毎日何分やってるのかなー。