ESP32! 電子工作って楽しいよね。
今回はESP32とM5Stack RFID unit2、ATtiny85を使って
カードをかざすとPCロックを解除して、カードを離すとPCロックをするモジュールを作ったのでやり方を書き溜め。
RFID-RC522の記事はそこそこあるんだけど、電波法的に怖い。
電子工作ってすごい楽しんだけど、あまりネット上に情報がないんだよね。苦戦したことが多かったので残しておきたい。
Rustを使って電子工作がしたかったんだけど、Arduino IDEが便利すぎて開発速度が違いすぎたのでRustは断念。
Arduino IDEは必要なのでダウンロードする。
IDEが役に立った人はちょっとでもいいのでArduino に寄付してあげてね。電子工作するうえで本当に便利なので。
さて、実際にモジュールを繋いだ時の完成図はこんな感じ。
とりあえず動くところがみたかったので見た目は気にしないでくれ。
ちなみに、カードホルダーは3Dプリンターでつくったよ。
ESP32とRFID UnitはI2C通信で、ESP32とAttiny85の通信もI2Cを使ってるよ。
実際にやっていることはすごいことしていなくて、MFRC522_I2C のライブラリを呼び出しているだけなんだよね。あとはピンを繋ぐだけでできます(笑)
使ったもの
ATTinyユニットである必要はないんだけどね。
ESP32 DEVKIT V1
3年ぐらい前に沢山買ったったやつ。
ATTINY85 Micro USB
今回キーボード入力用に使うマイコン
M5Stack用WS1850S搭載 RFID 2ユニット
RFIDを読み取るためのユニット
電波法的に安心できるのがこれくらいなので、みんなこれ使うんじゃない?
NFCカード
RFIDユニットで読み取るためのカード
ケーブル類
ケーブル類は複数必要。はんだ付けはめんどくさいのでワイヤーでつなぐだけでとりあえず動作できるので今回はそうしました。
ロック解除の流れ
- RFIDユニットに設定したカードをかざす
- ESP32がRFIDユニットの値を受け取って、ATTinyユニットにopen命令を送る
- ATTinyがopen命令を受け取ったら、パスワードを入力してEnterキーを押す
画面ロックの流れ
- RFIDユニットからカードを離す
- ESP32がカードが離れたことを検知して、ATTinyユニットにclose命令を送る
- ATtinyがclose命令を受け取ったら、Winコマンド+lを入力する
ESP32側
ESP32側はやることが2つある。
- RFID Unitから値を受け取る
- Attinyに値を送る
なのでポイントはWireを2つ使用すること。
今回はWire1.begin(32, 25); の部分がAttiny用にWireを割り当てているところです。
ESP32は2つのI2C通信ができるが便利。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
#include <SPI.h> #include "MFRC522_I2C.h" #include <Wire.h> #define SLAVE_ADDR 0x50 byte nuidPICC[4]; const char closeC[] = "lock"; const char openC[] = "open"; MFRC522 mfrc522(0x28); void setup() { Wire.begin(); mfrc522.PCD_Init(); delay(4); Wire1.begin(32, 25); onRFID = 0; } void loop() { if (!mfrc522.PICC_IsNewCardPresent() && !mfrc522.PICC_IsNewCardPresent()) { if (onRFID != 0) { onRFID = 0; Wire1.beginTransmission(SLAVE_ADDR); for (int i = 0; i < strlen(closeC); i++) { Wire1.write(closeC[i]); } Wire1.endTransmission(); } return; } else { if (!mfrc522.PICC_ReadCardSerial()) { delay(50); return; } String hexString = convertHex(mfrc522.uid.uidByte, mfrc522.uid.size); if (hexString.equals("NFCカードのユニークID")) { if (onRFID == 1) { } else { onRFID = 1; Wire1.beginTransmission(SLAVE_ADDR); for (int i = 0; i < strlen(openC); i++) { Wire1.write(openC[i]); } Wire1.endTransmission(); delay(1000); } } } } String convertHex(byte *buffer, byte bufferSize) { String hexstring = ""; for (byte i = 0; i < bufferSize; i++) { if (buffer[i] < 0x10) { hexstring += '0'; } hexstring += String(buffer[i], HEX); } return hexstring; } String HexString2ASCIIString(String hexstring) { String t = "", sub = "", r; char buf[3]; for (int i = 0; i < hexstring.length(); i += 2) { sub = hexstring.substring(i,i+2); sub.toCharArray(buf,3); char b = (char)strtol(buf,0,16); if (b == '\0') break; t += b; } return t; } |
ATtiny側
ATTiny側は、ESP32から文字列を受け取って、その内容によってキーボード入力を行う。
自宅のPCで使う用なのでパスワードはハードコードしてるよ。
ATTinyについては参考になるサイトがあったので、TinyWireSのライブラリは読んでない(笑)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
#include "DigiKeyboard.h" #include "TinyWireS.h" #define SLAVE_ADDR 0x50 #define KEY_DELETE 76 void receiveEvent(uint8_t howMany) { digitalWrite(1, HIGH); char sendText[256]; memset(sendText, 0, sizeof(sendText)); for (int i = 0; i < howMany; i++) { sendText[i] = TinyWireS.receive(); } int lock_output = strcmp(sendText, "lock"); if (lock_output == 0) { DigiKeyboard.sendKeyStroke(0); DigiKeyboard.sendKeyStroke(KEY_L, MOD_GUI_LEFT); } int open_output = strcmp(sendText, "open"); if (open_output == 0) { delay(1000); DigiKeyboard.println("OpenPassword"); DigiKeyboard.sendKeyStroke(KEY_ENTER); } digitalWrite(1, LOW); } void setup() { digitalWrite(0, HIGH); // turn the LED on (HIGH is the voltage level) digitalWrite(1, HIGH); TinyWireS.begin(SLAVE_ADDR); TinyWireS.onReceive(receiveEvent); delay(1000); digitalWrite(0, LOW); digitalWrite(1, LOW); } void loop() { TinyWireS_stop_check(); DigiKeyboard.delay(100); } |
質問があったら気軽にしてね。
わかる範囲なら答えるよー。