mattintosh note

どこかのエンジニアモドキの備忘録

Raspberry Pi で入退室記録的なものをやってみた

Felica 使って遊んでみたいなと思ったので PaSoRi を買ってみた。

f:id:mattintosh4:20170625193452j:plain

とりあえず Python の nfcpy モジュールで IDm は取得できるようになったので、SQLiteIDm のリストやら社員名簿やらを作った。本当は Python オンリーで書きたかったけど、時間がなかったので Shell から Python を呼び出すようにした。外部サービスに投げるテストとして Tocaro を利用。

f:id:mattintosh4:20170625193507p:plain

とりあえず IDm と社員番号、社員番号と名前を紐付けられるようなテーブルを作成。時間を記録するテーブルは SQLiteCURRENT_TIMESTAMP に任せる。もうひとつ、「入」と「出」を記録するテーブルを作ってフラグを更新するようにしておくといいかもしれない。(帰るときにカード通し忘れるとずっと入室したままになるので0時リセットとかも組んで)

create table FELICA_EMP (
    'IDM'       TEXT    NOT NULL UNIQUE
,   'EMP_ID'    TEXT    NOT NULL
,   'TYPE_ID'   NUMBER
);

create table EMPLOYEES (
    'EMP_ID'    NUMBER  NOT NULL UNIQUE
,   'LNAME'     TEXT    NOT NULL
,   'FNAME'     TEXT    NOT NULL
,   'E_LNAME'   TEXT    NOT NULL
,   'E_FNAME'   TEXT    NOT NULL
,   'H_LNAME'   TEXT    NOT NULL
,   'H_FNAME'   TEXT    NOT NULL
);

create table FELICA_TYPE (
    'TYPE_ID'   NUMBER  NOT NULL UNIQUE
,   'NAME'      TEXT    NOT NULL UNIQUE
);

create table TIME_CARD (
    'TIMESTAMP' DATE    NOT NULL DEFAULT CURRENT_TIMESTAMP
,   'IDM'       TEXT    NOT NULL
);

insert into FELICA_EMP  values('01010XXXXXXXXXXX',00000,1);
insert into FELICA_EMP  values('01010XXXXXXXXXXX',00000,2);
insert into FELICA_EMP  values('01140XXXXXXXXXXX',00000,3);
insert into FELICA_EMP  values('01120XXXXXXXXXXX',00000,4);

insert into EMPLOYEES   values(00000,'山田','太郎','やまだ','たろう','Yamada','Taro');

insert into FELICA_TYPE values(1,'Suica(JR)'        );
insert into FELICA_TYPE values(2,'Suica(りんかい線)');
insert into FELICA_TYPE values(3,'Suica(モノレール)');
insert into FELICA_TYPE values(4,'PASMO'            );


出勤記録的なやつ #RaspberryPi #NFC #Suica

Makoto Yoshidaさん(@mattintosh4)がシェアした投稿 -


圧電スピーカーを買ったまま使ってなかったので、ファミリー○ートの入店音を PWM で作成。音楽やってたはずなのに楽譜全然よめなくなっててびっくり。MIDI データでそのまま投げられると楽なんだけど、とりあえず八分音符で周波数ベタ書き。

#!/usr/bin/python2

import RPi.GPIO as GPIO
import time

gpio_pin = 4

GPIO.setmode(GPIO.BCM)
GPIO.setup(gpio_pin, GPIO.OUT, initial = GPIO.LOW)
p = GPIO.PWM(gpio_pin, 440)

scales = [
    369.994
,   311.127
,   220.000
,   311.127
,   329.628
,   440.000,440.000,440.000
,   329.628
,   369.994
,   329.628
,   220.000
,   311.127,311.127
]

try:
    p.start(20)
    for i in scales:
        p.ChangeFrequency(i)
        time.sleep(0.3)
    p.stop()
finally:
    GPIO.cleanup()



実用するかどうかと言われれば多分しない。というのも、SQLite とか Oracle とか使える人がいないからデータベースの管理ができないのよね。(CSV をパースしたりでもいいんだけどさ…)