今やってることについて

UEC koken Advent Calendar 2019 Day 16の記事です。

現在サークルで取り組んでいることについて、備忘録とSOSも兼ねて紹介したいと思います。

部室の鍵をFelicaで認証したい

幣サークルのドアには世間でもよく見る普通のノブがついています(外からは鍵を使って開錠・施錠、内からは取っ手を回します)。 ただ、もう少し便利で早く開錠・施錠ができるようにしたいな~と思うに至り、Suica のようなICカードをタッチするだけで開錠できるようなシステムを作りたくなりました。

完成形の計画

実装したいこと

  • ICカードを読み取ることで鍵を開錠する
  • 扉を閉めて一定時間たつと自動的に施錠される
  • 従来の鍵を用いる方法でもアナログで同様のことができるようにする
    • そのため自動で鍵を開ける機構の外側に手動で操作できる型を取り付ける

実現するとよさそうなもの

  • サーバーのデータベースと通信して認証する
  • 入退室の時間を記録したりする

必要になるもの

雑な図

こういう系の作図はあまりやらないから大体の雰囲気を

f:id:Stearin:20191218000136p:plain
配線図っぽいなにか

進捗

ラズパイの設定

セットアップ後、設定 -> Raspberry Pi の設定 からSSHなどを有効にしておきます。 VNC を有効にし設定しておくと、それ以降はVNC Viewerを使って作業できるのでディスプレイ接続が不要になります。

プロキシを設定する

Raspbian のaptやpython、pipなどでプロキシを用いる場合の設定です。 ~/.bashrcにおいて以下の記述を追加します。 <proxy_server_name>は任意のプロキシサーバ名で<port>はそのポート番号です。

export HTTP_PROXY=http://<proxy_server_name>:<port>/
export HTTPS_PROXY=http://<proxy_server_name>:<port>/
export FTP_PROXY=http://<proxy_server_name>:<port>/

このときの変数名は大文字にしておくとよさそうです。

マイクロサーボをつなぐ

PWM でサーボモーターを制御します。 以下のような動作テストのファイルを作成しsudo pythonによって実行します。

import wiringpi

wiringpi.wiringPiSetupGpio()
wiringpi.pinMode(18, wiringpi.GPIO.PWM_OUTPUT)
wiringpi.pwmSetMode(wiringpi.PWM_MODE_MS)
wiringpi.pwmSetRange(1920)
wiringpi.pwmSetClock(200)

while True:
    range = int(input())
    if range < 55 or 250 < range:
        break
    else:
        wiringpi.pwmWrite(18,range)
        print("Angle: " + str(range))

するとサーボモーターの動作角度の範囲内で、度数法の入力に合わせて回ってくれるかと思います。 ただし、11行目の数値55と250についてはモーターごとに異なる可能性があるので自分で確認し適宜変更するとよいと思います。

カードリーダーをつなぐ

セリアでmicro USB<->USBメスのOTGケーブルを購入しました。 Pythonにおいて、nfcpy をimport することでICカードを読み取れるようになります。 これでとりあえずカードをかざすとサーボが回る、という動きは達成できました。

未゜(今後の課題)

型枠

3Dプリンターで作ろうかとは思っているけど採寸もまだ

認証方法

一番手っ取り早そうなのがラズパイにデータベースを入れてそれと照合させるやり方
いまはそれで進めるつもり

発生している・していた問題など

  • サーボモーターの最大電流がわからない
    • 500mAまでなら大丈夫そうという情報があったので信じる
  • サーボモーターの現在角度が取得できない
    • あらかじめ決めた角度に回す
  • 扉が閉まった時の検知
    • 紐を利用する(どうやって取り付けるか)
    • 磁力を利用する
  • 自動と手動で開けるときの区別
  • ドアノブをひねる動きをどのようにするか
  • etc...

感想とか

  • いつも強い人に助けてもらっている
    • 本当にありがとうございます
    • いつでも救助要請してます(助けて
  • リード線を燃やした
    • ラズパイ触る前にLチカさせようとしたらプラス端子が点灯した
    • 電子工作に弱すぎた
    • 一回テストしてみるの大事
  • nanoが便利でありがたい
  • 頭が悪いのでよくなりたい
  • 金が欲しいNintendo Switchも欲しい

参考

2次元配列の0初期化

競プロ中に気づいたことをメモ

まだまだ弱い人間なので0初期化もロクに理解していない

#include<bits/stdc++.h>
using namespace std;

#define FOR(i,r,n) for(ll i = (ll)(r); i < (ll)(n); ++i)
#define REP(i,n) FOR(i,0,n)

using ll = long long int;

template < typename T >
inline void dbg(T a) {cout << a << ' ' << endl;}

ll a, b, n, ans = 0, sum = 0, cnt = 0;

int main() {
    cin >> n;
    ll tree[n][n] = { { 0 } };
    REP(i,n-1) {
        cin >> a >> b;
        tree[a-1][b-1] = 1;
    }
    for (auto && e : tree) {
        REP(i,n) { dbg(e[i]); }
    }
}

入力を以下のようにとるとき

4
1 1
2 2
3 3

AtCoderC++14(GCC 5.4.1)では以下のようになる

1 
4197637 
140722148830304 
6300464 
0 
1 
0 
0 
0 
0 
1 
0 
0 
0 
0 
0 

tree[0]の配列は{0}で初期化されない

配列をすべて0初期化したいならば

...

    ll tree[n][n] = {};

...

このように書けばよい

C++ならstd::fill(&(tree[0][0]),&(tree[n-1][n-1]),0);という方法もあるがこれは長いしめんどい

latexmxを使うときに出るplatex○○○○.flsをなんとかする

どうして

LaTeXで文書を作成するときいつもAtomを使っている。Ctrl+Alt+Bでplatexとdvipdfmxをまとめて行ってくれる上pdfビュー表示もしてくれるのでとてもありがたかった1ものの、ある時からtexファイルと同じディレクトリ内に謎のファイル"platex*.fls"が大量発生していた("*"には適当な4桁とか5桁の数字が入る)。どうやらそれはCtrl+Alt+Bを押すたびに発生するみたく、それらのファイルは自分の手で削除する必要があったので非常に五月蠅かった。

調べた

AtomではなくVSCodeのパッケージっぽいが、似たような症状が出ている人がいた。

github.com

これによると、謎のファイル発生の原因はlatexmx側にあるらしくパッケージとは関係ないらしい。ただ解決策は載っていた。

対処法

  1. AtomのパッケージLatexの設定画面を開き"Enable Shell Escape"にチェックを入れる
  2. 適当な箇所(特になければプリアンブル)に以下の記述を入れる
\input{|"rm platex*.fls"}

こうすると毎回のlatexmx実行時platex*.flsが自動的に消えてくれる。 ただし、この書き方だと先頭に"platex"、末尾に".fls"の付くファイルはごっそり消えてしまうのでもし何か残したいflsファイルがあるならば別ディレクトリに退避させる等する必要がある2。 また、Shell Escapeを有効にすると外部コマンドをファイル内の記述で実行できるようになるので取り扱いには要注意。

参考

tex2e.github.io


  1. 環境構築の仕方はいろいろなサイトで扱われているので今回は無視

  2. もっとも、必要になる機会は滅多にないだろうけど…