Introduction: CSGO Bomb PROP

Voor dit project van school (HKU locatie IBB, opleiding Game Art) voor het vak ITTT (If This Than That) moest ik een "ding" maken met de arduino Uno. Het project moest reageren op input waardoor het dus output creeërde (if this than that). Ik wilde iets game related maken (omdat de opleiding natuurlijk met games te maken heeft) en wilde een prop maken van een game.

Uiteindelijk ben ik uitgekomen op de bom van CSGO. Ik wilde eerst de bom aan kunnen zetten d.m.v. een killswitch (tuimelschakelaar). Helaas kreeg ik deze op geen enkele manier goed aan de praat door de code dus ik ben overgestapt op een knop en heb de killswitch er voor de sier op gezet.

De bom werkt nu als volgt:

Je zoekt met de Potmeter de juiste waarde (moet frequentie voorstellen) om de bom op scherp te stellen. In de code kan je dit veranderen d.m.v. de waardes te veranderen. In mijn geval is dat tussen de 400 en 700. Wanneer je op de juiste waarde zit kan je op de knop drukken, hierdoor gaat het lampje knipperen en staat de bom "op scherp".

Nu de bom op scherp staat kan je de code invoeren op de keypad. Deze werkt niet als de bom nog niet op scherp staat. Ook de code kun je zelf aanpassen maar in dit project is mijn code 186AB56.

Als je deze hebt ingevoerd telt er een timer van 30 naar nul met een buzzer en een lampje die steeds sneller piepen.

Supplies

  • LCD 16x2 scherm : https://www.conrad.nl/nl/p/joy-it-com-lcd-16x2-displaymodule-6-6-cm-2-6-inch-16-x-4-pixel-geschikt-voor-serie-arduino-met-achtergrondverlichting-1656369.html?utm_source=google&utm_medium=surfaces&utm_campaign=shopping-feed&utm_content=free-google-shopping-clicks&utm_term=1656369&adcampaign=google&tid=17210340624_pla-1656369&gad_source=1&gclid=CjwKCAiArfauBhApEiwAeoB7qKtAjO6GP0-4lGeClN5ijrKW0yfJYjNTepbulTB0gEp-ziTGdU7V4hoCG0cQAvD_BwE
  • Keypad
  • Knop
  • Bedrading
  • Pot-meter
  • Arduino Uno
  • 3 Weerstandjes
  • Buzzer
  • Led-lampje


Behuizing:

  • Karton
  • Duct tape
  • Bruine tape naar keuze
  • Zwarte verf

Gereedschap:

  • Soldeerbout
  • Tin

Step 1: Oriëntatie

Voor de opdracht moesten we wel iets maken wat origineel genoeg was. Dit betekende dat je wel een tutorial mocht volgen maar je niet precies moest volgen wat er werd gezegd / dingen toevoegen / dingen veranderen. Hierdoor ging ik op zoek naar wat er al bestond aan tutorials. Ik kwam vervolgens deze video tegen: https://www.youtube.com/watch?v=CwImS9wPHOk&t=101s met uitleg over hoe je deze prop bom maakte.


Nu had ik een basis waarop ik verder moest boorduren zodat het origineel genoeg was. Dus wat ik heb gedaan is de functie van het "scherpstellen" van de bom toegevoegd. Zonder dit te doen zou het niet mogelijk moeten zijn de bom te activeren. Dit wilde ik doen door middel van een tuimelschakelaar (wat dus uiteindelijk niet gelukt is en vervangen is met een knop) en een Potmeter. Hier had ik dus ook een tutorial voor nodig. Dus ik ben op youtube gaan zoeken naar alles wat te maken had met wat ik wilde maken omdat ik een artist ben en geen developer. Hierdoor had ik vrij weinig verstand van coderen. Als je zelf ook moeite hebt hiermee heb ik hieronder een lijst met alle filmpjes die ik heb gebruikt en hopelijk begrijp je zo de code die ik heb geschreven beter:

  • https://www.youtube.com/watch?v=azBmL9qMK-8&t=145s (FOR loops)
  • https://www.youtube.com/watch?v=vl1-R6NsejM (scherm en keypad)
  • https://www.youtube.com/watch?v=DbUrUQvcsMg (keypad)
  • https://www.youtube.com/watch?v=t9DEAreCD3g (potmeter)
  • https://www.youtube.com/watch?v=qn8SP93L3iQ (millis function)
  • https://www.youtube.com/watch?v=K8AnlUT0ng0 (buzzer)
  • https://www.youtube.com/watch?v=aMato4olzi8 (Push button)

Step 2: Code Maken

Mocht je gelijk ook alvast alles aan willen sluiten terwijl je de code schrijft (dit komt ook nog bij stap 4 terug waar alles exact heen moet) dan kan je volgens de afbeelding alles aansluiten. Nu ik alle youtube videos had gemaakt was ik inmiddels aan de slag gegaan. Door trial and error ben ik uiteindelijk op de code gekomen die ik nu gebruik. De code is ontstaan door een combinatie van de bovenstaande filmpjes en een klein beetje google werk en eigen kennis. Hieronder staat de code met uitleg erbij wat nou precies wat doet en waarvoor is. Er is nog een bijlage toegevoegd van de code zonder de uitleg.

//SCHERM variabelen/benodigdheden

#include <Wire.h>

#include <LiquidCrystal_I2C.h>


//KEYPAD Variabelen/benodigdheden

#include <Keypad.h>


#define Password_Length 8

char Data[Password_Length];

char Master[Password_Length] = "186AB56";


int COUNTDOWN = 30;


byte data_count = 0;


char customKey;


const byte ROWS = 4;

const byte COLS = 4;


char hexaKeys[ROWS][COLS] = {

 {'1', '2', '3', 'A'},

 {'4', '5', '6', 'B'},

 {'7', '8', '9', 'C'},

 {'*', '0', '#', 'D'}

};


byte rowPins[ROWS] = {9, 8, 7, 6};

byte colPins[COLS] = {5, 4, 3, 2};


Keypad customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);


//SCHERM omschrijving type. De "0x27" is het adres nummer. Dit kan voor iedereen anders zijn. Om te kijken wat voor adres jou scherm heeft kan je naar deze link gaan: https://playground.arduino.cc/Main/I2cScanner/ en in je arduino zetten. Upload de code en laat hem runnen. Deze geeft vervolgens in je Serial Monitor aan welk adres je hebt. Vervang daarna de "0x27" met het adres dat je als feedback van de arduino terug hebt gekregen.


LiquidCrystal_I2C lcd(0x27, 16, 2);


//LED EN BUZZER variabelen/benodigdheden

int led_Pin = 12;

int led_Pin_2 = 11;

int KnopAan = false;


int Delay_Tijd_Lampje = 1000;

int Delay_Tijd_Buzzer = 1000;

int Delay_Buzzer = Delay_Tijd_Buzzer / 30;

int Delay_Bonus = 0;


long tijd_Lampje_Aan = millis();

long tijd_Lampje_Uit = millis();

long tijd_Buzzer_Aan = millis();

long tijd_Buzzer_Uit = millis();


//intervals voor wanneer de taak gebeurd

long interval_Lampje_Aan = 2000;

long interval_Lampje_Uit = interval_Lampje_Aan + Delay_Tijd_Lampje;

long interval_Buzzer_Aan = 3000;

long interval_Buzzer_Uit = interval_Buzzer_Aan + Delay_Tijd_Buzzer;


//POTMETER variabelen/benodigdheden

bool Signaal_Aan = false;

bool executed = false;


 void setup(){

  Serial.begin(9600);


  pinMode(led_Pin,OUTPUT);

  pinMode(2,INPUT);


  //SCHERM

  lcd.backlight();

  lcd.init();

 }


  void loop(){

   //KEYPAD schrijft "Enter password" bovenaan en typt de nummers die je intypt zolang de bom "op scherp staat" d.m.v. het op "true" zetten van de knop en het "signaal" dat je terug krijgt van de Potmeter. Als je daarna het juiste wachtwoord in typt zal hij "Void TIMER" aanroepen. Als de code fout is dan krijg je te zien dat het incorrect is. Daarna krijg je weer de kans de code juist in te voeren.


   lcd.setCursor(0, 0);

   lcd.print("Enter Password:");


   customKey = customKeypad.getKey();


   if(KnopAan == true && Signaal_Aan == true){


   if (customKey){

    Data[data_count] = customKey;

    lcd.setCursor(data_count, 1);

    lcd.print(Data[data_count]);

    data_count++;

   }


   if(data_count == Password_Length - 1){

    lcd.clear();


    if (!strcmp(Data, Master)) {

     //Password is correct

     if(COUNTDOWN > 0) {

      TIMER();

      }

      else{

       lcd.clear();

       clearData();

      }

    }

    else {

     lcd.print("Incorrect");

     delay(1000);

     //Alles verwijderen

     lcd.clear();

     clearData();

    }

   }


   }


   //LED EN BUZZER variabele die begint in 1000 tics per seconde begint te tellen vanaf het moment dat de code aan gaat.

   long startTime = millis();

   //POTMETER krijgt de feedback terug van de arduino wat de waarde is van de potmeter en print deze vervolgens in de Serial Monitor. Deze moet tussen de 400 en 700 zijn en dan is de variabele "SignaalP_Aan" true. Dan kun je de keypad gebruiken.

   int sensorValue = analogRead(A0);


   //Serial.println(sensorValue);


   //delay(1);


   if(sensorValue > 400 && sensorValue < 700){

    Signaal_Aan = true;

   }

   else{

    Signaal_Aan = false;

   }


   if(!executed && Signaal_Aan == true){

    Signaal(startTime);

    executed = true;

   }


   //LED EN BUZZER als je de knop indrukt word de variabele omgezet naar "true" en kun je de keypad gebruiken. Ook begint het lampje te knipperen.

   if(digitalRead(10) == HIGH) {

    KnopAan = true;

    tijd_Lampje_Aan = startTime;

    tijd_Lampje_Uit = startTime;

    tijd_Buzzer_Aan = startTime;

    tijd_Buzzer_Uit = startTime;

   }


   if(startTime - tijd_Lampje_Aan > interval_Lampje_Aan && KnopAan == true && Signaal_Aan == true){

     Led1Aan();

     tijd_Lampje_Aan = startTime;

   }


   if(startTime - tijd_Lampje_Uit > interval_Lampje_Uit && KnopAan == true && Signaal_Aan == true){

     Led1Uit();

     tijd_Lampje_Uit = startTime - (1 * Delay_Tijd_Lampje);

   }


  }  


   void Led1Aan(){

     digitalWrite(led_Pin_2,HIGH);

   }


   void Led1Uit(){

     digitalWrite(led_Pin_2,LOW);

   }


   void BuzzerAan(){

     tone(led_Pin,(460 - (0.5 * COUNTDOWN)));

   }


   void BuzzerUit(){

     noTone(led_Pin);

   }


   void Signaal(int X){

    tijd_Lampje_Aan = X;

    tijd_Lampje_Uit = X;

    tijd_Buzzer_Aan = X;

    tijd_Buzzer_Uit = X;

   }


   void clearData() {

    while (data_count != 0) {

     Data[data_count--] = 0;

    }

    return;

   }

//Wanneer de code juist is ingevoerd zal de timer af gaan lopen en alles aanroepen wat hier voor nodig is.


   void TIMER(){

     lcd.print("Correct");

     delay(1000);

     lcd.clear();


    for(int i = 30; i>0; i--){

     lcd.clear();

     lcd.setCursor(0, 0);

     lcd.print("Countdown:");

     lcd.setCursor(0, 1);

     lcd.print(i);

     BuzzerAan();

     Led1Aan();

     delay(Delay_Tijd_Buzzer);

     BuzzerUit();

     Led1Uit();

     delay(Delay_Bonus);


     COUNTDOWN = COUNTDOWN - 1;

     Delay_Tijd_Buzzer = Delay_Tijd_Buzzer - Delay_Buzzer;

     Delay_Bonus = Delay_Bonus + Delay_Buzzer;


     if(COUNTDOWN == 0){

      lcd.clear();

      lcd.setCursor(0, 0);

      lcd.print("BOOM");

      delay(10000);

     }

    } 

   }

Step 3: Behuizing Maken

De bom zelf is in game ook "hand made" wat betekent dat een paar uitstekende draadjes en de kleine "foutjes" perfect zijn en dit maakt iedere prop uniek.

VERPLICHT:

  • Begin met 3 rechthoekige boxen te maken van karton ter grootte van ongeveer de schaal van de foto (kijk hoe groot het scherm en de keypad is en meet aan de hand daarvan ongeveer de grootte van de boxen karton). Tape de 3 boxen INDIVIDUEEL helemaal in met het gekozen bruine tape tot het karton eronder niet meer zichtbaar is.
  • Tape de 3 boxen zowel onder als boven van elkaar vast met duct tape.
  • Maak 2 casings voor onder de keypad en het scherm zodat (bij het scherm) de kabels er onderdoor kunnen lopen en het meer lijkt op hoe het ook in CSGO er uit ziet.

OPTIONEEL:

  • Maak een casing voor de "afstandsbediening" aan de zijkant. Dit kan je verwerken in de 3 boxen karton zelf, maar met de casing aan de zijkant is het hetzelfde als in de game.
  • Snij de achterkant open om de arduino met alle bedrading in te verwerken. Met het formaat dat ik heb gebruikt past het helaas er niet helemaal in dus leg het tijdens het displayen op een doos (iets groter dan de bom zelf) met een gat in het midden en laat hier de arduino en bekabeling in kwijt.


Step 4: Alles Op Zijn Plaats Zetten En Final Touches

Nu is het tijd om het allemaal nog mooi en functioneel te maken. Zet de onderdelen op de plekken zoals te zien is op de afbeelding. Hoe je dit exact laat kloppen qua bedrading is een klusje. Maar afhankelijk van waar je exact wat kwijt wilt hebben is de bedrading natuurlijk anders. Soldeer alles wat je op het breadboard hebt gezet op een soldeer plaatje.

TIP!

Zorg er voor VOORDAT je alles uit je breadboard haalt alle kabeltjes eventueel te labelen zodat je weet welk kabeltje waar hoort.


Step 5: Wat Heb Ik Geleerd?

Ik ben aan het einde van dit project een stuk wijzer geworden over hoe arduino precies werkt en wat je er mee kan bereiken. Ik heb ook arduino gehad op de middelbare school maar toen begreep ik er nooit echt veel van. Ook ben ik wijzer geworden in hoe codering in het algemeen werkt. Vooral de werking van de verschillende soorten loops en wat je hier mee kan bereiken.