Fysiek-Digitale Kluis

by lucasdejager309 in Circuits > Arduino

245 Views, 1 Favorites, 0 Comments

Fysiek-Digitale Kluis

IMG_20220607_155028972.jpg
IMG_20220607_155046083.jpg

Voor dit project heb ik een kluis gemaakt die naast fysieke objecten ook digitale objecten kan bewaren. Naast opslagruimte heeft de kluis ook 16GB opslag die alleen toegankelijk zijn door middel van een USB-kabel wanneer de juiste pincode is ingevoerd.

Toen ik ging brainstormen voor dit project, vond ik het belangrijk om het concept uitvoerbaar te houden voor een complete beginner. Ik had mij vorig jaar al eerder aan een Arduino project gebrand, maar koos toen voor een zeer ambitieus project. Deze keer wilde ik meer rekening houden met mijn gebrek aan ervaring in elektrotechniek. Het grootste gedeelte van de onderdelen die ik heb gebruikt voor dit project zijn te vinden in de starterkit waarmee de Arduino kwam.

Ik was vanaf het begin al gefascineerd met de potentiometer als manier van input, en wilde deze graag in mijn project verwerken. Ik wilde graag iets maken waar het fysieke en het digitale samenkomen. Deze kluis waarbij je fysiek toegang tot bestanden wordt weerhouden vond ik een heel mooi concept. Het analoge gevoel van een kluis met een draaiknop staat mooi in contrast met de digitale aard van de inhoud.

Supplies

Elektronische componenten:

Materialen voor de behuizing:

  • Multiplex (100 cm*200 cm)
  • Schroeven
  • Spijkertjes
  • Pianoscharnier (min. 15cm)
  • Metalen verbindingsplaat

Gereedschap:

  • Soldeerbout met soldeertin
  • Boormachine
  • Kruiskopschroevendraaier
  • Hamer
  • Striptang
  • Lijmpistool
  • Decoupeerzaag
  • Bovenfrees
  • Cirkelzaag

Testen

IMG_20220412_155201364_2.jpg
IMG_20220430_165634547.jpg
setup.jpg
demonstratie ittt arduino draaiknop
IMG_20220506_110042425.jpg

Ik had al vrij snel een idee wat ik wilde maken, het idee van de kluis sprak mij erg aan en ik had een duidelijk concept wat voor mijn gevoel erg haalbaar was.

Voordat ik het volledige systeem in elkaar zette wilde ik eerst een goed begrip van alle losse onderdelen, en voerde ik experimenten uit met de onderdelen op het breadboard. Vooral het displayen van de code en input op het 7-segment display vergte wat geklungel met de code. Ook bleek mijn display anders dan die in de meeste tutorials, met 8 pins in plaats van de reguliere 6. Door trial-en-error ben ik er uiteindelijk op de juiste configuratie uitgekomen.

De LED-strip zou pas later aankomen, en ik heb deze pas kunnen testen wanneer deze al geinstalleerd was in de kluis. Ik kwam er achter dat het strobing effect wat ik voor ogen had wanneer de kluis open zou zijn niet mogelijk was. Ik heb ervoor gekozen om de LED-strip te houden, maar niet te laten veranderen van kleur. Dit gaf uiteindelijk alsnog het gewenste effect.

Constructie Kluis

IMG_20220607_134100283_HDR.jpg
IMG_20220607_134222788.jpg
IMG_20220607_132916117.jpg
IMG_20220607_134144749.jpg
IMG_20220607_161845081.jpg

De constructie van de kast een simpele constructie van triplex platen, vastgezet met schroeven. Ik heb in de foto's de dimensies aangegeven. De platen zijn overal een halve centimeter dik

De constructie van de kast een simpele constructie van triplex platen, vastgezet met schroeven. Ik heb in de foto's de dimensies aangegeven. De platen zijn overal een halve centimeter dik

De deur is verbonden met de kast door middel van een pianoscharnier.

In de deur is een uitsparing gemaakt met de bovenfrees zodat de potentiometer door de deur heen kan. Voor de potentiometer is een gat van 0.5 cm door de deur geboord. 

Ook is er een gat gezaagd met de decoupeerzaag voor de 7-segment display, die exact even groot is als de display. Hierna is met een vijl het gat bijgewerkt totdat de display hier precies in paste. 

Tegen de rechterwand is de servo met lijm op een blokje hout geplaatst die de servo bewegingsruimte geeft. Wanneer de kluis op slot gaat, komt de arm van de servo omhoog in de grendel die aan de deur bevestigt is. Deze is gemaakt van een afgezaagd stukje verbindingsplaat die met een schroef aan de deur is bevestigt.

In het interieur van de kluis is op 2.5 cm van de linkerwand een muur geplaatst. Deze schuift los de kast in, en wordt in plaats gehouden door 4 balkjes op de bodem en het plafond van de kluis bevestigt. Deze balkjes zijn 1.5 cm breed, 0.5 cm hoog en net zoals de muur 19 cm lang. Dit schot verbergt de Arduino en bedrading aan de linkerkant, maar omdat deze eruit geschoven kan worden is de arduino nog gemakkelijk toegankelijk. Op deze muur is de LED-strip aangebracht met dubbelzijdige tape.

Op deze muur is ook het plankje bevestigt voor de USB stick. De plank is met 2 schroeven vastgezet aan de muur, en de female-to-female connector is op het plankje vastgelijmd.

In het plafond zijn 2 gaten van 0.5 cm geboord voor de bedrading van de drukknoppen bovenop de kluis. Deze knoppen zijn op een afgezaagd stukje printplaat gesoldeerd, en met kleine spijkertjes vastgezet op de kast.

Bedrading

schematic_bb.png
IMG-20220518-WA0007.jpg
IMG_20220518_151211927.jpg
IMG-20220518-WA0015.jpg
IMG_20220610_155113919.jpg

De bedrading ligt voor het grootste gedeelte los achter de muur, maar waar de kabels in het zicht komen zijn deze met lijm tegen de wand geplakt. Om de bedrading bij elkaar te houden zijn tie wraps gebruikt. Om de gesoldeerde draden te beschermen is er gebruik gemaakt van krimpkousen.

Vooral de bedrading van het 7-segment display bleek erg fragiel. het display is op een printplaat gesoldeerd, die tegen de binnenkant van de deur is gelijmd. De bedrading is tegen de deur geplakt om te voorkomen dat het openen en sluiten van de deur draden lostrekt van de printplaat.

De bedrading is naast het display vrij simpel. Het is handig om tijdens de constructie de draden van het display te markeren, zodat je weet welke in welke output van de Arduino horen.

Code

#include <Servo.h>#include <FastLED.h>//pins gebruikt door 7-segment displayint pinA = 2;int pinB = 3;int pinC = 4;int pinD = 5;int pinE = 6;int pinF = 7;int pinG = 8;int D1 = 9;int D2 = 10;int D3 = 11;int D4 = 12;//pin voor potentiometerint potPin = A0; //pins gebruikt door drukknoppenint resetButtonPin = A4;int selectButtonPin = A3;//pincode String requiredCode = "3941";//posities gebruikt door servoServo servo;const int locked = 90;const int unlocked = 0;//variabelenbool isLocked = true;bool selectPressed = false;int potVal = 0;String currentCode = "";#define NUM_LEDS 11 //hoeveelheid leds in de strip#define DATA_PIN A1 //pin gebruikt door ledstripCRGB leds[NUM_LEDS]; //array met alle ledsvoid setup() {  setupDisplayPins();    servo.attach(A5);  servo.write(locked);    pinMode(selectButtonPin, INPUT);  pinMode(resetButtonPin, INPUT);  FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);}void setupDisplayPins() {  pinMode(pinA, OUTPUT);  pinMode(pinB, OUTPUT);  pinMode(pinC, OUTPUT);  pinMode(pinD, OUTPUT);  pinMode(pinE, OUTPUT);  pinMode(pinF, OUTPUT);  pinMode(pinG, OUTPUT);  pinMode(D1, OUTPUT);  pinMode(D2, OUTPUT);  pinMode(D3, OUTPUT);  pinMode(D4, OUTPUT);}void loop() {  //update het nummer geselecteerd door de potentiometer  potVal = analogRead(potPin);  int selectedNumber = floor(((float)(1023 - potVal) / 1024) * 10);  //leest de waardes van de drukknoppen  int selectButtonValue = digitalRead(selectButtonPin);  int resetButtonValue = digitalRead(resetButtonPin);  //logica code invoer  updateCode(selectedNumber, selectButtonValue, resetButtonValue);  //debug  Serial.println((String)selectedNumber + " " + currentCode);  //7-segment display  displayString(currentCode + (String)selectedNumber);  //wanneer de deur dicht zit  if (isLocked) {    if (currentCode == requiredCode) {      //zet state naar unlocked      isLocked = false;      servo.write(unlocked);      //doe de lichtjes aan      fill_solid( leds, NUM_LEDS, CRGB::Red);      FastLED.show();    }  }   //wanneer de deur open is  else {    if (resetButtonValue == HIGH) {      //zet state naar locked      isLocked = true;      servo.write(locked);      //doe lichtjes uit      fill_solid( leds, NUM_LEDS, CRGB(0,0,0));      FastLED.show();    }  }}//logica code invoervoid updateCode(int selectedNumber, int selectButtonValue, int resetButtonValue) {  //voegt geselecteerde nummer toe aan code  if (selectButtonValue == HIGH && !selectPressed && currentCode.length() < 4) {    currentCode += (String)selectedNumber;    selectPressed = true;  }  //reset de code  if ((selectButtonValue == LOW && selectPressed == true) || resetButtonValue == HIGH) {    selectPressed = false;    displayString("");  }  if (resetButtonValue == HIGH) {    currentCode = "";    displayString(currentCode);  }}//laat karakters uit de code zien op displayvoid displayString(String string) {  if (string.length() > 0) {    displayNumber(1, string.charAt(0));  }  if (string.length() > 1) {    displayNumber(2, string.charAt(1));  }  if (string.length() > 2) {    displayNumber(3, string.charAt(2));  }  if (string.length() > 3) {    displayNumber(4, string.charAt(3));  }}//waardes van alle pins per nummervoid displayNumber(int digit, char number) {  switch (digit) {    case 1:      digitalWrite(D1, HIGH);      digitalWrite(D2, LOW);      digitalWrite(D3, LOW);      digitalWrite(D4, LOW);      break;    case 2:      digitalWrite(D1, LOW);      digitalWrite(D2, HIGH);      digitalWrite(D3, LOW);      digitalWrite(D4, LOW);      break;    case 3:      digitalWrite(D1, LOW);      digitalWrite(D2, LOW);      digitalWrite(D3, HIGH);      digitalWrite(D4, LOW);      break;    case 4:      digitalWrite(D1, LOW);      digitalWrite(D2, LOW);      digitalWrite(D3, LOW);      digitalWrite(D4, HIGH);      break;    default:      break;  }  switch (number) {    case '0':      digitalWrite(pinA, LOW);      digitalWrite(pinB, LOW);      digitalWrite(pinC, LOW);      digitalWrite(pinD, LOW);      digitalWrite(pinE, LOW);      digitalWrite(pinF, LOW);      digitalWrite(pinG, HIGH);      break;    case '1':      digitalWrite(pinA, HIGH);      digitalWrite(pinB, LOW);      digitalWrite(pinC, LOW);      digitalWrite(pinD, HIGH);      digitalWrite(pinE, HIGH);      digitalWrite(pinF, HIGH);      digitalWrite(pinG, HIGH);      break;    case '2':      digitalWrite(pinA, LOW);      digitalWrite(pinB, LOW);      digitalWrite(pinC, HIGH);      digitalWrite(pinD, LOW);      digitalWrite(pinE, LOW);      digitalWrite(pinF, HIGH);      digitalWrite(pinG, LOW);      break;    case '3':      digitalWrite(pinA, LOW);      digitalWrite(pinB, LOW);      digitalWrite(pinC, LOW);      digitalWrite(pinD, LOW);      digitalWrite(pinE, HIGH);      digitalWrite(pinF, HIGH);      digitalWrite(pinG, LOW);      break;    case '4':      digitalWrite(pinA, HIGH);      digitalWrite(pinB, LOW);      digitalWrite(pinC, LOW);      digitalWrite(pinD, HIGH);      digitalWrite(pinE, HIGH);      digitalWrite(pinF, LOW);      digitalWrite(pinG, LOW);      break;    case '5':      digitalWrite(pinA, LOW);      digitalWrite(pinB, HIGH);      digitalWrite(pinC, LOW);      digitalWrite(pinD, LOW);      digitalWrite(pinE, HIGH);      digitalWrite(pinF, LOW);      digitalWrite(pinG, LOW);      break;    case '6':      digitalWrite(pinA, LOW);      digitalWrite(pinB, HIGH);      digitalWrite(pinC, LOW);      digitalWrite(pinD, LOW);      digitalWrite(pinE, LOW);      digitalWrite(pinF, LOW);      digitalWrite(pinG, LOW);      break;    case '7':      digitalWrite(pinA, LOW);      digitalWrite(pinB, LOW);      digitalWrite(pinC, LOW);      digitalWrite(pinD, HIGH);      digitalWrite(pinE, HIGH);      digitalWrite(pinF, HIGH);      digitalWrite(pinG, HIGH);      break;    case '8':      digitalWrite(pinA, LOW);      digitalWrite(pinB, LOW);      digitalWrite(pinC, LOW);      digitalWrite(pinD, LOW);      digitalWrite(pinE, LOW);      digitalWrite(pinF, LOW);      digitalWrite(pinG, LOW);      break;    case '9':      digitalWrite(pinA, LOW);      digitalWrite(pinB, LOW);      digitalWrite(pinC, LOW);      digitalWrite(pinD, LOW);      digitalWrite(pinE, HIGH);      digitalWrite(pinF, LOW);      digitalWrite(pinG, LOW);      break;    default:      break;  }  delay(2);}

Conclusie

demonstratie kluis

Dit project was een gigantische leerervaring voor mij. Voordat ik met dit project begon wist ik niks over maker-cultuur, de werking van 7-segment displays, kon ik niet solderen, en keek ik erg op tegen dit project. Dit project was een goede oefening in realistische doelen zetten en werken met wat je hebt. Ik ben erg blij met het feit dat ik het project van initiƫle schets tot eindproduct heb uitgevoerd, en dat dit eindproduct ook exact zo werkt als dat ik gepland had. Ik voel me een stuk comfortabeler met de Arduino omgeving en middelen, en weet nu ook dat ik deze kan toepassen in komende projecten.