Skocz do zawartości

SafeBox, czyli sejf z ATmega328P


rubicki

Pomocna odpowiedź

Wstęp:

Na wstępie chciałbym zaznaczyć, iż jest to mój pierwszy projekt, w którym miałem możliwość wykorzystać software do projektu własnej płytki PCB i skonstruować coś co nie bazuje na płytce Arduino i nie jest plątaniną przewodów na płytce stykowej. Proszę o wyrozumiałość, a zarazem o konstruktywną krytykę i cenne wskazówki, które mogą być przydatne przy tworzeniu kolejnych projektów. Wykonany prze ze mnie projekt nie jest innowacyjny, ale dzięki niemu mogłem spróbować swoich przede wszystkim w wytrawieniu pierwszej płytki PCB.

Opis:

Wynikiem końcowym projektu jest niewielkie pudełko/sejf do przechowywania drobnych rzeczy, które można otworzyć po wpisaniu hasła, bądź przyłożeniu karty.
Sercem układu jest mikrokontroler, który można spotkać w Arduino UNO R3. Ze względu na prostotę środowiska ArduinoIDE zdecydowałem się na implementację kodu właśnie w tym programie. W związku z tym wybór padł na mikrokontroler ATmega328P  z wgranym bootloaderem dla Adruino. Takie rozwiązanie pozwoliło mi na wykorzystanie gotowych bibliotek do obsługi modułu RFID i klawiatury numerycznej. Zdecydowałem się na brak wewnętrznego źródła zasilania. Został wyprowadzony przewód USB, dzięki któremu urządzenie można podpiąć pod dowolne wyjście USB (powerbank, port USB w komputerze, ładowarka sieciowa). Urządzenie jest więc zasilane napięciem 5V DC.

Wykorzystane elementy:

Na projekt składają się wymienione wcześniej elementy, tj.:

oraz:

Budowa:

Po przetestowaniu działania urządzenia na płytce prototypowej znalazłem odpowiednie pudełko, w którym zmieści się układ i będzie stosunkowo estetycznie wszystko rozmieszczone. Wyciąłem miejsce na klawiaturę, miejsce na blokadę serwomechanizmu oraz wywierciłem otwory na oprawki na diody. W kolejnym kroku pokryłem pudełko matową farbą i wnętrze wypełniłem materiałem zbliżonym do okleiny na głośnikach i tubach basowych. Po wykonaniu płytki przystąpiłem do lutowania elementów. Klawiatura, moduł RFID, diody, serwomechanizm oraz złącze zasilania zostały połączone z płytką poprzez przewody połączeniowe z końcówką żeńską. Płytka PCB została umieszczona w górnej części pudełka na nylonowych dystansach. Pod płytką znalazło się miejsce na moduł RFID oraz klawiaturę i diody. Na koniec wyciąłem odpowiedni fragment deseczki balsowej z miejscem na serwomechanizm, aby ukryć przewody połączeniowe. Deseczkę balsową okleiłem tym samym materiałem co wnętrze pudełka.

Oprogramowanie:

Kod programu został napisany w środowisku ArduinoIDE z wykorzystaniem następujących bibliotek:

Kod programu:

#include <Servo.h>
#include <Keypad.h>
#include <Password.h>
#include <SPI.h>
#include <MFRC522.h>

//Servo
Servo servo;

//Password
Password password = Password("1234");

//RFID
const byte UID1[] = {0x70, 0xC3, 0xF9, 0x65};
const byte UID2[] = {0x35, 0xDC, 0xD7, 0x65};

const byte ROWS = 4;
const byte COLS = 3; 
char keys[ROWS][COLS] = {
  {'1', '2', '3'},
  {'4', '5', '6'},
  {'7', '8', '9'},
  {'#', '0', '*'}
};
byte rowPins[ROWS] = {4, 3, 2, 0};
byte colPins[COLS] = {8, 7, 6}; 

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

MFRC522 rfid(10, 5);
MFRC522::MIFARE_Key key;

void setup() {
  Serial.begin(9600);
  SPI.begin();
  rfid.PCD_Init();
  pinMode(A0,OUTPUT);
  pinMode(A1,OUTPUT);
  servo.attach(9);
  servo.write(0);
  keypad.addEventListener(keypadEvent);
  digitalWrite(A0,HIGH);
  digitalWrite(A1,LOW);
}

void loop() {
  keypad.getKey();

  if (rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial())
  {
    if (rfid.uid.uidByte[0] == UID1[0] && 
        rfid.uid.uidByte[1] == UID1[1] &&
        rfid.uid.uidByte[2] == UID1[2] &&
        rfid.uid.uidByte[3] == UID1[3])
        {
            servo.write(90);
            digitalWrite(A0, LOW);
            digitalWrite(A1, HIGH);

        }
    else if (rfid.uid.uidByte[0] == UID2[0] && 
             rfid.uid.uidByte[1] == UID2[1] &&
             rfid.uid.uidByte[2] == UID2[2] &&
             rfid.uid.uidByte[3] == UID2[3])
             {
                servo.write(90);
                digitalWrite(A0, LOW);
                digitalWrite(A1, HIGH);
             }        
  }
}

void keypadEvent(KeypadEvent eKey)
{
  switch (keypad.getState())
  {
    case PRESSED:
    Serial.println(eKey);

    switch (eKey)
    {
      case '#': checkPassword(); delay(1); break;
      case '*': closeBox(); delay(1); break;
      default: password.append(eKey); delay(1);
    }
  }
}

void checkPassword()
{
  if (password.evaluate())
  {
    servo.write(90);
    digitalWrite(A0, LOW);
    digitalWrite(A1, HIGH);
  }
  else
  {
    servo.write(0);
    digitalWrite(A0, HIGH);
    digitalWrite(A1, LOW);
  }
}

void closeBox()
{
  password.reset();
  servo.write(0);
  digitalWrite(A0, HIGH);
  digitalWrite(A1, LOW);
}

Działanie programu:

Aby odblokować serwomechanizm i otworzyć pudełko należy wpisać odpowiedni kod zdefiniowany w programie i zatwierdzić znakiem "*" lub przyłożyć odpowiednią kartę (zdefiniowane są dwie karty). Po odblokowaniu gaśnie dioda czerwona, zapala się dioda czerwona i serwomechanizm zmienia położenie. Aby zamknąć pudełko należy wcisnąć przycisk "#".

Podsumowanie:

Projekt uważam za prawie zakończony. Po złożeniu całego urządzenia zwróciłem uwagę na brak możliwości zmiany kodu oraz dodania nowej karty (możliwe jedynie poprzez przeprogramowanie ATmegi). Projekt płytki zapewne pozostawia sporo do życzenia, dlatego liczę na cenne wskazówki aby nie popełniać błędów w przyszłości. Za wadę uważam też brak dodatkowej filtracji zasilania (stwierdziłem, że skoro biorę zasilanie z USB to nie trzeba nic dodawać). Zaletą (albo i wadą 😉) urządzenia są małe gabaryty. Ja wykorzystuje je do przechowywania zdjęć wykonanych Instaxem. 

Załączniki:

W projekcie załączam kod programu, wykorzystane biblioteki i projekt Eagle do płytki PCB.

Zdjęcia:

1.thumb.jpg.7c2c9562cb3e7fd5b9d536ea90307152.jpg2.thumb.jpg.0771eab8f6fe2596721d590539e9f50d.jpg3.thumb.jpg.0755f10a1ff182c4d7bbdc68fb2b7b73.jpg

4.thumb.jpg.841e3c8b658731fb5cd62e0d16c89b34.jpg5.thumb.jpg.798650bdab7e8389c3e3345c68e6ba69.jpg6.thumb.jpg.65abf47800a11471f0209eb943af6e54.jpg

7.thumb.jpg.e4ab017f5964b5c1171e47134d42a823.jpg8.thumb.png.4a1f841f65680c215d5ae298cc7bcd92.png9.thumb.png.e7d40cab5aafd1f8ceeee4eaa450c760.png

 

safe_box_eagle.zip

safe_box_software.zip

Edytowano przez rubicki
  • Lubię! 2
Link do komentarza
Share on other sites

Podoba Ci się ten projekt? Zostaw pozytywny komentarz i daj znać autorowi, że zbudował coś fajnego!

Masz uwagi? Napisz kulturalnie co warto zmienić. Doceń pracę autora nad konstrukcją oraz opisem.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.