步驟1:組件
以下是我們用于設(shè)置的組件,您可以混合/匹配各種型號。
以下組件可以可以從各種賣家那里購買,例如Aliexpress或eBay。
我們用于成功的組件如下:
Arduino MEGA(2560R3)
伺服(MG996R)
SD卡模塊(無型號)
實(shí)時時鐘( DS3231)
藍(lán)牙(hc-05)
RFID(RC522)
鍵盤4 * 4(膜基質(zhì))
LCD 16 * 2(1602A)
SD
電阻(2k和220)
LED(綠色,紅色)
開關(guān)
電位計
安裝模塊的SD卡
更完整的清單附上金額,模型和丹麥供應(yīng)商的鏈接。
第2步:它應(yīng)該如何工作
當(dāng)?shù)谝淮谓油娫磿r,門鎖通過鎖定開始,然后“空閑”,等待任何用戶輸入。
鍵盤
如果按下鍵盤,它開始按下存儲的密碼檢查按下的鍵。
如果按下錯誤的鍵,則會增加錯誤的計數(shù)器。
當(dāng)按下4位數(shù)時,它將檢查錯誤的計數(shù)器,如果超過‘ 0’液晶顯示屏打印“錯誤的P “如果按下了4個數(shù)字并且錯誤的計數(shù)器為‘0’,LCD將打印”密碼已接受“并且鎖定解鎖。
如果按”#“或在任何此過程中‘*’將重置過程和計數(shù)器值。
藍(lán)牙
如果收到藍(lán)牙數(shù)據(jù),它會讀取接收的數(shù)據(jù) - 如果此數(shù)據(jù)鎖定為“1”鎖定,它還會將“解鎖”發(fā)送回藍(lán)牙設(shè)備(Android手機(jī))
RFID
RFID模塊會掃描是否有任何附近的可讀標(biāo)簽,如果沒有它只是跳過。如果附近有可讀標(biāo)簽 - 它會讀取標(biāo)簽值并將其與我們預(yù)定義的標(biāo)簽進(jìn)行匹配,如果不匹配,則只需在LCD上打印“未授權(quán)”。如果標(biāo)簽匹配,則打印“歡迎”并解鎖門。它還會將日期和時間(包括標(biāo)簽持有者的名稱)保存到SD卡上的文本文件中。
解鎖后當(dāng)鎖定解鎖時,它會設(shè)置一個步驟,這用于檢查門何時打開/關(guān)閉,以便鎖再次接合。它基本上使用3個步驟來跟蹤它的位置,操作是通過當(dāng)前的簡單開關(guān)完成的。
成功解鎖也會點(diǎn)亮綠色指示燈,就像紅色指示燈在當(dāng)前鎖定時會點(diǎn)亮一樣。
我們在上面附上了一個流程圖,簡化了這一點(diǎn)。
步驟3:接線和電氣元件設(shè)置
我們利用Fritzing軟件繪制了我們的布線圖。
為了使Fritzing原理圖更容易,我們還制作了一個IO/Arduino超級引腳列表 - 這些都列在我們的文件中。
在上面的電氣圖中,你將找到組件之間的所有必要連接,包括布線概述。
由于我們使用了相當(dāng)多的電線和Arduino底部的雙排線,因此很難看到線點(diǎn)有了這樣的質(zhì)量,我們建議下載圖片并放大。
正如你所看到的那樣,我們只為面包板連接了一些東西,主要是電源(5 V)和GND,但這并不是反映我們使用面包板的真實(shí)世界測試設(shè)置持有除SD卡和鍵盤之外的大多數(shù)模塊,這也將在后面的步驟中顯示。
另請注意,我們正在使用電位計來控制LCD的亮度。
從左到右列出“較大”的物體/模塊:伺服,DS3231,HC-05,面包板+ Arduino,RC522,SD卡,LCD,鍵盤。
在上圖中,+導(dǎo)線為紅色為5 V,棕色為3.3 V, - (GND)導(dǎo)線為藍(lán)色。
第4步:編程Arduino
所以編程Arduino本身 - 這就是樂趣開始的地方 - 我們在代碼的不同部分附上了5張圖片。這是我們的測試設(shè)置中的代碼,我們在代碼中對串行打印進(jìn)行了大量的故障排除,它們對于查看我們遇到的問題/我們做錯了什么非常有幫助。
代碼已被壓縮更好地適應(yīng)圖片。
上面的第一張圖片是我們正在初始化和全局變量:
以下行:
1初始化軟件序列,包括設(shè)置引腳所以我們不必使用HW串口。
4初始化實(shí)時時鐘模塊
7-9定義引腳,包括RFID模塊的從選擇引腳,并創(chuàng)建實(shí)例。
12 -13定義SD卡模塊的從機(jī)選擇引腳,同時設(shè)置文件變量
16-28定義(映射)鍵盤布局,行和列,同時設(shè)置使用的引腳。
31定義用于LCD的引腳。
33-37聲明變量。
40定義伺服電機(jī)。
43我們的字符串變量包含默認(rèn)密碼。
44-45變量適用于LCD位置和鍵盤前置SSE的。
上面的第二張圖片是對鍵盤進(jìn)行編程:
3-4是用于跟蹤鍵盤上按下的內(nèi)容的變量以及“鍵”密碼。
6-12正在打印鍵按下LCD后,延遲使代碼等待幾秒鐘,然后按下按鍵消失在液晶顯示屏上。
如果按下‘*’或‘?!?,應(yīng)該會發(fā)生什么情況 - 在我們的例子中如果按下的鍵與我們預(yù)定義的密碼匹配,會發(fā)生什么情況。
如果按下的鍵與我們預(yù)定義的密碼不符,則為25-29。如果發(fā)生的話,會發(fā)生什么情況。我們達(dá)到了密碼的最大長度(4位數(shù)),我們按鍵錯誤.46-60,最后如果我們達(dá)到了最大長度且輸入沒有錯誤
第三上面的圖片是藍(lán)牙編程:這里我們檢查串口上是否有來自藍(lán)牙的數(shù)據(jù)。由于我們只是從藍(lán)牙處理一個簡單的‘1’代碼這里從序列中讀取并將其放入我們的變量中e。
4-8如果藍(lán)牙連接有‘1’會發(fā)生什么,這里我們還會將“Unlocked”發(fā)回藍(lán)牙串口。
第四張圖片以上是編程RFID:4-5我們正在檢查附近是否有卡。
8-9從卡上讀取值。
12-18將RFID值添加到我們的字符串變量。
20-21基本上使我們的變量大寫的內(nèi)容。
22我們正在檢查變量是否符合我們的預(yù)定義。
24-25選擇我們的奴隸,我們需要SD卡模塊。
27我們打開SD卡上的文件,以便接收打印數(shù)據(jù)。
如果我們的可變數(shù)據(jù)與我們預(yù)定義的任何一個匹配,我們在LCD上打印名稱,并將日期和時間以及名稱打印到SD卡上的日志。
70-72調(diào)用功能“setlocked”并將其設(shè)置為false - 解鎖鎖定。
如果標(biāo)簽值沒有,則為74-78不符合我們的預(yù)定義。
上面的第五張圖片是我們實(shí)際控制伺服的功能:如果是setL,則為3調(diào)用ocked(true)。
5-10安裝舵機(jī)并給它一個位置,基本上鎖門。
如果設(shè)置了setLocked(假),則為12連接伺服并給它一個位置去解鎖門。
步驟5:編程Android手機(jī)
我們已經(jīng)使用簡單易用的基于Web的MIT App Inventor 2來編寫Android手機(jī)。
之前沒有使用App Inventor,我們發(fā)現(xiàn)它非常簡單直接使用 - 因為它就像拼圖一樣。然而,我們確實(shí)遵循了各種基本功能指南。
第一張照片是我們簡單的應(yīng)用程序最終看起來的方式 - 正如您在右側(cè)看到的那樣,有兩個按鈕,其中一個是列表。單擊頂部的藍(lán)牙橫幅顯示手機(jī)的藍(lán)牙列表,點(diǎn)擊HC-05將手機(jī)連接到Arduino藍(lán)牙模塊。
然后是解鎖按鈕 - 它按照說法執(zhí)行操作,解鎖門,我們無法鎖門,因為如果你打開它,它會在關(guān)閉時自動鎖定。
第一行文字只顯示你是否連接 - 在實(shí)際應(yīng)用中根據(jù)連接,它是紅色或藍(lán)色。
第二個顯示鎖定的當(dāng)前狀態(tài)。
第二張圖片是我們的塊設(shè)計(拼圖) - 應(yīng)用實(shí)際上做了什么。
從左上角開始,我們基本上告訴它在點(diǎn)擊藍(lán)牙橫幅時要做什么。
第二部分是我們想要在彈出窗口中連接到所選設(shè)備。
T第三部分是我們在點(diǎn)擊解鎖按鈕時想要做的 - 我們只是發(fā)送49,因為這是用ASCII發(fā)送的,數(shù)字‘49’等于‘1’ - 所以我們實(shí)際上發(fā)送一個‘1’到Arduino。
繼續(xù)到圖片的右側(cè),我們使用時鐘計時器來更新(有點(diǎn)實(shí)時)連接文本,所以如果連接被刪除,那么文本就會顯示。/》我們也使用這個時鐘發(fā)送我們的鎖定/解鎖狀態(tài),這在啟動應(yīng)用程序時拋出“無連接的藍(lán)牙設(shè)備”的缺點(diǎn),但我們更喜歡這個狀態(tài)。
步驟6:3D打印
如前所述,我們使用了一些3D打印部件用于將伺服系統(tǒng)安裝到鎖舌上。
我們使用的打印機(jī)是Ultimaker 2+,使用0.4 mm黑色PLA。我們使用的軟件是Fusion 360編輯設(shè)計和Cura來制作它適合Ultimaker。它很簡單,由兩個組成事情,一個是死鎖附件,第二個是伺服的安裝座 - 包括一個用于LED的孔,如果需要,還有一個用于手動操作按鈕的方孔。
deadbolt附件需要三個多小時才能打印,伺服支架/外殼需要超過21個小時才能打印出來。
Hacker Shack對死鎖的3D設(shè)計及其鏈接的致謝:https://bit.ly/2YQ4c97
第7步:測試設(shè)置
因為我們都是編程Arduino的新手 - 只是因為在將所有東西焊接在一起并可能放在一起之前先測試一下是個好主意在一個漂亮的盒子里,我們利用大型面包板將大多數(shù)東西連在一起。然而,這確實(shí)使得所有接線看起來都很麻煩。
確保一切都按照我們想要的方式工作后,剩下的就是將伺服裝置安裝到3D打印機(jī)適配器并連接使用螺絲將伺服系統(tǒng)安裝到外殼上。
你可能需要使用墊片才能使它適合你的鎖舌。
由于這是我們學(xué)期的一個項目,我們實(shí)際上并沒有把東西焊在一起,因為我們我希望以后可以將我們的零件用于不同的項目 - 但是它可以使它更好看,能夠移除大量的布線。
步驟8:測試設(shè)置 - Youtube
第9步:完整代碼
//Libraries used
#include //LCD MODULE
#include //Keypad MODULE
#include《 MFRC522.h》 //RFID MODULE
#include //RFID AND SD CARD MODULES
#include //SD CARD MODULE
#include //RTC MODULE
#include //Servo MODULE
#include //Software Serial
SoftwareSerial mySerial(10, 11); //SoftSerial initialize. pin number RX, TX
//Realtime clock hardware interface initialize
DS3231 rtc(SDA, SCL);
//RFID pins same instance
#define SSRFID_PIN 53 //SS PIN for RFID //SS PIN (Slave Select)
#define RSTRFID_PIN 47 //RST PIN
MFRC522 mfrc522(SSRFID_PIN, RSTRFID_PIN); //instance
//SD Card
#define SSSD_PIN 54 //SS PIN (Slave Select)
File myFile; //File being used
//KEYPAD Grid
const byte ROWS = 4; //keypad Rows
const byte COLS = 4; //keypad Columns
//layout af keypad
char hexaKeys[ROWS][COLS] = {
{‘1’, ‘2’, ‘3’, ‘A’},
{‘4’, ‘5’, ‘6’, ‘B’},
{‘7’, ‘8’, ‘9’, ‘C’},
{‘*’, ‘0’, ‘#’, ‘D’}
};
byte rowPins[ROWS] = {31, 33, 35, 37}; //pinout Rows
byte colPins[COLS] = {39, 41, 43, 45}; //pinout Columns
Keypad keyPad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
//LCD RELATED
LiquidCrystal lcd(22, 23, 24, 25, 26, 27); //LCD pins
int redPin = 2; //Red LED Pin (No Access)
int greenPin = 3; //Green LED Pin (Access Granted)
int doorPin = 5; //Door Magnet (HIGH if door is closed)
int steps = 0; //Step counter for door + locking control
int state = 0; //Bluetooth state
//Servo (needed in setlocked function)
Servo servo_Motor;
String password = “1234”; //Keypad Default Password
int position = 0; // Variable for Cursor(LCD) and Password position(0-3 = 4)
int wrong = 0; // Variabel for wrong password
//RFID
//1A 83 57 D3 = Blue RFID Tag
//52 0B C6 1F = White Creditcard Tag
void setup() {
Serial.begin(9600); //Start the Serial Function(to communicate over USB)
rtc.begin(); //Start the Real Time Clock
mySerial.begin(9600); //Bluetooth Serial
pinMode(doorPin, INPUT_PULLUP);
//SD CARD
pinMode(46, OUTPUT); //Changes pin 46 to output mode (SS pin)
digitalWrite(46, HIGH); //Has to be high from startup since we‘re using RFID
//RFID
pinMode(53, OUTPUT); //Changes pin 53 to output mode (SS pin)
digitalWrite(53, LOW); //Has to be low from startup so RFID is used.
SPI.begin(); //Start the SPI (Serial Peripheral Interface) for RFID&SDCard
mfrc522.PCD_Init(); //Start the RFID
if (!SD.begin(46)) { //Start the SD library and Card (! for invert)
while (1);
}
Serial.println(“initialization done.”); //Troubleshoot Serial
lcd.begin(16, 2); //LCD Size
lcd.clear();
servo_Motor.attach(6); //Attach Servo to pin 6(PWM)
setLocked(true); //Locks the first time during setup
}
void loop() {
lcd.clear(); //Clears the LCD
lcd.print(“Enter Password:”); //Prints on the LCD
delay(100);
//Keypad
char pressed = keyPad.getKey(); //Variable for pressed on keypad
String key[4]; //Variable
if (pressed) //If keypad pressed
{
lcd.clear(); //Clear LCD
lcd.print(“Enter Password:”); //Print LCD
lcd.setCursor(position, 1); //Sets the cursor to our variable on the “second row”
lcd.print(pressed); //Prints the pressed key
delay(200);
if (pressed == ’*‘ || pressed == ’#‘) //If Star or Square is pressed
{
position = 0; //Reset position
setLocked(true);//Set locked
lcd.clear(); //Clear LCD
}
else if (pressed == password[position]) //Else if the pressed key matches the password position
{
key[position] = pressed; //Adds the pressed to the key variable
position++; //adds 1 to position
}
else if (pressed != password[position] ) //Else if pressed key doesnt match password position
{
wrong++; //Add 1 to wrong variable
position ++; //Add 1 to position
}
if (position == 4) //If position = 4 (password is max 4)
{
if ( wrong 》 0) //if the wrong variable is above zero
{
wrong = 0; //Reset wrong variable
position = 0; //Reset position variable
lcd.clear(); //Clear LCD
lcd.print(“WRONG”); //print
lcd.setCursor(5, 1); //sets cursor position LCD
lcd.print(“PASSWORD”); //print
delay(1000);
setLocked(true); //set locked
}
else if (position == 4 && wrong == 0) //If position is 4 and wrong variable is zero
{
position = 0; //reset position variable
wrong = 0; //reset wrong variable
lcd.clear();
lcd.print(“PASSWORD”);
lcd.setCursor(6, 1);
lcd.print(“ACCEPTED”);
delay(1000);
lcd.clear();
lcd.print(“Door Open”);
setLocked(false); //Unlocking
steps = 1; //sets step to 1
}
}
}
//Bluetooth
else if (mySerial.available() 》 0) { // Checks whether data is comming from the serial port
state = mySerial.read(); // Reads the data from the serial port
if (state == ’1‘) {
lcd.clear(); //Clear LCD
lcd.print(“Bluetooth Open”); //LCD print
setLocked(false); //unlocking
steps = 1; //sets steps so door autolock works
mySerial.println(“Unlocked”); // Send back the String “Unlocked”
}
}
//RFID
else {
//Wait for a card
if ( ! mfrc522.PICC_IsNewCardPresent()) {
return;
}
//Read Card value
if ( ! mfrc522.PICC_ReadCardSerial()) {
return;
}
String content = “”; //Variable for UID from tag
for (byte i = 0; i 《 mfrc522.uid.size; i++) {
content.concat(String(mfrc522.uid.uidByte[i] 《 0x10 ? “ 0” : “ ”));
content.concat(String(mfrc522.uid.uidByte[i], HEX));
}
//Compare RFID Tags and do XX
content.toUpperCase();
content = content.substring(1);
if ((content == “1A 83 57 D3”) || (content == “52 0B C6 1F”)) { //If variable content matches either tag
digitalWrite(53, HIGH); //SS Pin RFID HIGH to not use
digitalWrite(46, LOW); //SS pin SD Card LOW to use
myFile = SD.open(“l(fā)og.txt”, FILE_WRITE); //Opens the file on SDCARD
if (content == “1A 83 57 D3”) { //If variable matches
lcd.clear();
lcd.setCursor(3, 0);
lcd.print(“Velkommen”); //Print welcome LCD
lcd.setCursor(4, 1);
lcd.print(“Flemming”); //print name LCD
//SD START
myFile.print(rtc.getDateStr()); //Prints the RTC Date to SD card
myFile.print(“ ”); //Prints a space
myFile.print(rtc.getTimeStr()); //Prints RTC Time HH/MM/SS
myFile.print(“ ”); //Prints a space
myFile.println(“Flemming”); //Prints the name entering
myFile.close(); //Closes the file opened on the SD Card
digitalWrite(46, HIGH); //SS pin SD card High
digitalWrite(53, LOW); //SS pin RFID Low
}
if (content == “52 0B C6 1F”) {
lcd.clear();
lcd.setCursor(3, 0);
lcd.print(“Velkommen”);
lcd.setCursor(4, 1);
lcd.print(“Mikkel”);
myFile.print(rtc.getDateStr()); //Prints the RTC Date to SD card
myFile.print(“ ”); //Prints a space
myFile.print(rtc.getTimeStr()); //Prints RTC Time HH/MM/SS
myFile.print(“ ”); //Prints a space
myFile.println(“Mikkel”); //Prints the name entering
myFile.close(); //Closes the file opened on the SD Card
digitalWrite(46, HIGH); //SS pin SD card High
digitalWrite(53, LOW); //SS pin RFID Low
}
setLocked(false); //Unlocking
steps = 1; //Setting step 1
}
else { //If RFID Tag doesnt match
lcd.clear(); //Clear LCD
lcd.print(“Not Authorized”); //Print LCD
delay(2000);
}
}
//Door Magnet, closed, open, closed (For relocking)
while (steps 》 0) { //If steps is above 0
if ((steps == 1) && (digitalRead(doorPin) == HIGH )) { //If step = 1 read the doorpin if high (closed) continue
steps = 2; //Set step 2
}
if ((steps == 2) && (digitalRead(doorPin) == LOW)) { //if step = 2 read the doorpin if low (open)
steps = 3; //set step 3
}
if ((steps == 3) && (digitalRead(doorPin) == HIGH)) { //If step = 3 read the doorpin if high (closed) continue
setLocked(true); //set locked
lcd.clear(); //Clear LCD
lcd.print(“Enter Password:”); //LCD print
mySerial.println(“l(fā)ocked”); // Send back the String “l(fā)ocked”
steps = 0; //set steps = 0
}
}
} //loop end
void setLocked(int locked) //function for the doorlock
{
if (locked) //if locked is true, lock
{
digitalWrite(redPin, HIGH); //Red on
digitalWrite(greenPin, LOW); //Green off
servo_Motor.attach(6); //attach servo to pin 6
servo_Motor.write(150); //write Servo position
delay(1000);
servo_Motor.detach(); //deattach servo
}
else //if locked is false, unlock
{
digitalWrite(redPin, LOW); //Red off
digitalWrite(greenPin, HIGH); //Green on
servo_Motor.attach(6); //Attach Servo to pin 6
servo_Motor.write(0); //write servo position
delay(1000);
servo_Motor.detach(); //Deattach Servo
}
}
第10步:最后的想法
對于我們自動化的第二個學(xué)期來說,這是一個有趣的小項目。
好處:
有趣和實(shí)用的項目,我們必須嘗試使用MIT App Inventor 2構(gòu)建一個簡單的應(yīng)用程序,并使用Ultimaker 3D打印機(jī),同時擺弄圍繞面包板上的所有電線,使代碼實(shí)際工作 - 它確實(shí)給出了基于文本的編程如何工作的一些見解。
缺點(diǎn):
可能不是最安全(沒有)智能鎖 - 也不會留下最小的足跡 - 即使是Arduino和面包板都非常大。
可能的未來升級:
更改3D設(shè)計,既可以減少占地面積,也可以為Arduino騰出空間 - 這可能包括使用齒輪功能伺服器可以和Arduino一起坐在一邊。
如前所述,將電線焊接在一起,電線非常雜亂。
添加某種安全性,使其真正適合于前門。
-
Arduino
+關(guān)注
關(guān)注
187文章
6461瀏覽量
186524 -
門鎖
+關(guān)注
關(guān)注
0文章
47瀏覽量
11905
發(fā)布評論請先 登錄
相關(guān)推薦
評論