Skocz do zawartości
rubicki

SafeBox, czyli sejf z ATmega328P

Pomocna odpowiedź

Napisano (edytowany)

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

Udostępnij ten post


Link to post
Share on other sites

@rubicki, właśnie zaakceptowałem opis. Dziękuję za przedstawienie ciekawego projektu, zachęcam do prezentowania kolejnych DIY oraz aktywności na naszym forum 😉

  • Lubię! 2

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Napisz odpowiedź...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...