積極的にメモっていく姿勢

題名詐欺。更新頻度の低さが売り。

セキュリティおもちゃを作ることにしている

謝罪会見

IoTLT Advent Calendar 2019 の 7 日目の記事になるはずでした...... こころがしんでいたので記事公開まで至らず,ずるずる来てしまったのですがここに来て公開に到達しました🙇💦 (公開時 12/11(水) これは機械の力で 12/07 に公開したせっていになっているだけだ!だまされるな)

qiita.com  
自分は都会じゃないところでも勉強会をやっていこうネタで生活しているので,今回は調子に乗って Advent Calendar を作ってしまいました.みなさまのご協力もあってなんと 50 枠が埋まり,18 都道府県の情報が集まってきています.日本は捨てたもんじゃないですね.

adventar.org

adventar.org

さて,タイトルにもあるとおりモノをチマチマチマチマ作っているのですが,そのきっかけになったスライドがこちらです.

www.slideshare.net

そうなんです.IoT LT なんです.自分はこれが IoT LT 初参加でした.

iotlt.connpass.com

自分がやっている(いた)勉強会の FuraIT にもお越しくださっていた山川先生にお誘いいただいて,開催前夜の 22:00 くらいから構想を練ったものです.ちなみに前日は LOCAL DEVELOPER DAY'19 というイベントで自分が登壇していまして,その懇親会で席が隣になったことがすべての発端です.

local.connpass.com

いい加減作品に入ろうと思います.今はブレッドボードで組んでいる段階で,なんかはんだづけしたくなってきたので,もうそろそろ動きもいい感じだしくみ上げようかなと思っています.

直流安定化電源

Arduino が見えますが,これは Arduino と全く同じ組成の直流安定化電源です.繰り返します.これは直流安定化電源です.
 
この写真は大将先輩にお許しをいただいて IoT LT 北日本でお披露目したときの様子です.なんとブレッドボードのまま,全国各地を旅しています.松山空港では手荷物検査に「何やら細長い金属のようなものが......」とジャンパワイヤが引っかかってしまいました.羽田も千歳も旭川も釧路も福岡も松山も通過しているのに松山で引っかかりました.(松山は2度通過していますが,なんと3回目の正直で引っかかってしまったわけですね)
 
この回路がやりたいことは「認証の3要素を文字が分からなくても感覚でわかってもらいたい」ということです.幼稚園にあって遊びに使ってもらえればいいのかなみたいなそんな感覚です.

https://www.netone.co.jp/tag/%E8%AA%8D%E8%A8%BC%E3%81%AE3%E8%A6%81%E7%B4%A0www.netone.co.jp

知識認証

ここではフルカラーLEDを3つ使って,色のパターンで認証できるようにしました.また,一発だと面白くないので,5回も記憶してくれるようにしてあります.出来上がったものを見たら,ただの色あてゲームですねこれ.なんていうんですか?サイモンですか?

カードが光る順番を覚えて当てるゲーム「Classic Simon」 - 週刊アスキー

ちょっと違いましたね(謝罪)
 
このフルカラー LED 知識認証おもちゃで学習してほしいのは

- 隠さないと他のひとも開けられちゃうね
- 忘れちゃうと開けられないね
- 簡単だと当てられちゃうね

というパスワードと全く同じ要素を体験してもらいたいために実装します.
 
ここで,工夫したことはフルカラーLEDを3つダイナミックドライブで動作させていることです.別に3つくらいなら直接やってもいいんでしょうけど,ポート数が多く必要になるため,ここは節約しておかないとなと思ったためです.(というか手元にあって,あー使えるなくらいの感覚で PIC16F88 でやり始めたから足りなくなるわこれ,となったというのが正しいです.)

akizukidenshi.com

I/O が 16 個しかないのでジリ貧です.(よかった PIC12F629 とかじゃなくて)
 
ごり押しでフルカラーLEDを3つつけようと思ったらこんな感じになります.

9 つも I/O をつぶしてしまう.環境にやさしくないためグレタさんにも怒られてしまいます.やだ

画像下部の赤い 9 本をそのまま GPIO に喰わせる形になります.ちなみに使っているフルカラーLEDは OSTA71A1D-A ですので,以下の記事を参考に抵抗値は決定しています.(あとは見た目でなんかちょうどよくするとか,明るさを下げたいとかと言うときに再計算はしますが,基本的にはこのまま採用しています.)

blog.eldhrimnir.com

ということで,ポートが節約できるような回路構成に組みなおすとこうなります.

6こになった.トランジスタが増えた.

いやもっと気合入れてシフトレジスタにしてもよかったのですが,この数ならこれでいいかなと思ってこうしました.シフトレジスタを使う方がちょっとコードも複雑になるかな?というのもあります.
 
また,デマルチプレクサを使うという手もあるのですが,ここではめんどくさかったので使いませんでした.でも,もう一つ作っている別のものには使ったので,そのうちブログにでもまとめておきます.
 
めんどいとか言いつつトランジスタ出してきてんじゃねえか,と言われますとそこはどうしてもシンク電流で駆動したいということと A1015 がいっぱいあったので使ったのです.そのため,色を制御する側も負論理になっています.
 

    TRISA = 0x10; // (Freq 1)(LED Dynamic 3)(Open 1)(LED RGB 111)
    ....
    while(1) {
        // led dynamic drive
        for(i = 0; i < 3; ++i) {
            PORTA = ledDynamic[i] | ~onPattern[i] & 0x07;
            __delay_ms(5);
        }
    ....

ざっとコードからダイナミックドライブのところを取り出すとこんな感じです.今回は PORTA の下位 3 bit でフルカラー LED の色を決めて,下から 5 6 7 bit 目の 3 bit でどのフルカラー LED を点けるかということをやっています.ledDynamic と onPattern の中にはこの PORTA に喰わせるべきビットパターンを他の処理のところで入れておいて,ここではあくまでも表示するだけです.
 
めちゃくちゃテキトーですが,これをメインループの中でやっています.ただ,これから後続の処理が増えて重たくなってくると,一つだけ点灯する時間がその処理分だけ長くなって均衡が崩れますので,そのうち割り込みに移すと思います.気持ち的になんか光ると進んだ感じするじゃないですか.......それをもう使ってしまったということでもあるのですが.
 
自分が初めて触ったときは MPLAB 8.xx とかで,Windows 限定だったのですが時代は移り替わり MPLAB X は NetBeans をベースに作られていて,Windows 以外の OS でも動いてくれるようになりました.しかも,今に至っては Web IDE も動作してくれるので,もう OS とか本当に関係ない感じになってきました.

https://www.microchip.com/mplab/mplab-x-idewww.microchip.com

https://www.microchip.com/mplab/mplab-xpresswww.microchip.com

Arduino も Web IDE ありますもんね.もうそういう時代ですか.便利になりました.

あれ 7 セグあるだろどうなってんだ

実は文字が読めなくても使えるとか言いつつ,隣に 7 セグメント LED があることに違和感を覚えた方もいらっしゃるのではないでしょうか.私もその一人です.
 
5 回の知識認証を突破しないとお前にプリンはやらないぜ的なシステムにしようと思ったら,数字が見えないととても不便であることに気づいて,足してしまったのです.これがマウントです.文字がまだ読めない幼児に対して「数字読めた方がいいじゃん」とかいって持っている知識でマウントする現代人の闇そのものです.
 
この 7 セグに関しては,なんと PIC16F88 をもう一つ作って 7 セグメント LED ドライバとしてその一生を終えてもらうことにしたのです.かわいそうに.

#include <xc.h>

#define _XTAL_FREQ 8000000

void init(void) {
    OSCCON = 0x72;  // INTOSC 8MHz
    ANSEL  = 0x00;  // AN not used
    
    TRISA = 0x00;
    TRISB = 0x00;
    PORTA = 0x0f;
    PORTB = 0x00;
}

void main(void) {
    unsigned char nseg[8] = {
        0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x38, 0x00
    };
    
    init();
    
    while(1) {
        PORTB = ~nseg[PORTA & 0x07];
        __delay_ms(10);
    }
    
    return;
}

まだまだいろんなことができるのに,他の PIC から飛んできた 2 進数を元に決められたパターンを吐くことしかできないかわいそうな PIC16F88 ...... しかしこれで思ったのは,市販のドライバだと表示できないパターンを組み込めるので,これはこれでいいなと思ったりしました.メインのプログラムがだいぶすっきりしました.かわいそうだけど,この方法は続けていこうと思います.(予算面でもだいぶ富豪)  
また,個人的におすすめなのは DIP の抵抗アレイくんです.

eleshop.jp

最近だと SOP とかが多いような気がしますが,この子は DIP なのでブレッドボードでも使えます.自分は Common のあるものは集合抵抗,こういった分離して働いてくれるものは抵抗アレイと呼び分けているのですが,正式にはどんな感じになっているのでしょうか.(知見をください)
 
といった金で解決パターンで 7 セグメント LED についてもポート数を削減することができました.本来であれば 7 ポートを用意しなければ今回の形での実装は難しいと思いますが 8 パターン以下だったので 3 ポートだけ使って 7 セグ専用 PIC に指令を送っています.これで 4 ポート節約です.
 
ここまで書いてこの記事はほとんど終わったも同然です.

所有物認証

つまり鍵に代わる何かをおもちゃにすればよいのですが,これを電子回路でやりたい.と思いながら電子回路シミュレータで人生を溶かしていたのですが,

www.falstad.com

人生が溶けている

......ん?

これは完全に🔑では?🤔

そうなんですよ.555 タイマーで作った矩形波を出力する発振回路は実質🔑なんですね?(錯乱)
 
いや,まじめな話.555 はともかくとして,組み合わせる抵抗とコンデンサの値によって発信周波数が決まるわけで,この組み合わせこそが鍵🔑というわけです.

www.zea.jp

ここのとおり計算すると,波形のパラメータがわかるわけですが,幼稚園に入る前の子にこの計算をさせるわけではなく,あくまでも抵抗とコンデンサを大事になくさないように持っていてもらうということになります.つまり,この部分については,取り外し可能な回路を作って,毎回セットしてもらうというのが良いような気がしています.  
これで学習してもらいたいのは,

- なくすと開けられないよ
- 盗まれると開けられちゃうよ
- 頑張ったら同じものが作れちゃうよ

ということです.完全に鍵と同じ注意点になりました.(しました)
 

生体認証

どうやって簡単にすればいいのか,本格的に頭を悩ませたものですが,

wiki.seeedstudio.com

アァカッチャッタ...... 買ってしまいました.すごいですね.急にむずくね?
 
とはいえまだちゃんと触っていません.しかし,どうやって子供に指紋が本人にしか持ち得ない特徴であると説明するのか?というところで,お互いに指を見比べあうなんて動きが一番わかりやすいのですが,そうするとおもちゃがどうやって指を見ているのか、というところを表現しにくくなってしまいます.
 
もうちょっと何とかアピールしたいなと思って,構想段階にあるのは ssh-keygen を叩いたときに出てくるアレを液晶か何かに表示すればいいのかな?と思っていたりします.みんなの指でやってみよう!→わぁちがうみたいな流れをイメージしています.
 

体力が切れた

ということで,IoT LT Advent Calendar 7 日目になるはずだった記事を終了します.これはチマチマチマチマ作って完成させようと思っていますので,数年後を楽しみにしていてください.  
最後にぼくを IoT LT に誘い込んでくださった 3 人の罪深い恩人をリンクで雑に紹介して終了とします.本当にありがとうございました🙇💦

https://twitter.com/gishi_yamatwitter.com

https://mobile.twitter.com/T_taisyoumobile.twitter.com

https://mobile.twitter.com/n0bisukemobile.twitter.com