Tarot Spirit Box Radio
by MaxineDomertschikow in Circuits > Arduino
95 Views, 1 Favorites, 0 Comments
Tarot Spirit Box Radio
Dit project is gebaseerd op een object uit een spel waaraan ik werk. Het moet een Spiritbox voorstellen, waarmee je contact legt met geesten en demonen die jouw toekomst vertellen. Ik wilde dit doen door er een soort radio gekruist met een oude hand-held spelcomputer van te maken.
Om het apparaat te gebruiken selecteer je eerst een kanaal. In dit geval zijn er 3 kanalen die corresponderen met het verleden, het heden en de toekomst. Vervolgens plaats je je vinger op de sensor, "de spookjes" geven je dan informatie over je verleden, heden of toekomst, met behulp van de namen van tarot kaarten.
Supplies
Materiaal
- Arduino Uno
- LCD 20x4 met I2C
- Wires male-female
- Wires female-female
- piezo buzzer
- pin headers
- licht-sensor LDR
- schakelpotmeter
- weerstand 10k
- breadboard printplaat
- powerbank
- 3mm dik mdf houtplaat (voor lasersnijden )
- seconde-lijm
- elektrische isolatie tape
Software
- Inkscape
Prototype En Bedrading
De eerste stap van dit project was het maken en testen van een protoype. Dit deed ik door de onderdelen aan te sluiten aan een breadboard. Hierdoor kon ik snel veranderingen maken en itereren aan het concept.
Na enkele versies bleek dat het het leukst was als de gebruiker meer invloed had op de radio dan enkel het activeren van de muziek en lcd via de ldr sensor. Daarom is de potmeter toegevoegd. Deze wordt gebruikt om het gevoel van het scrollen door radio-stations te immiteren.
Na een aantal iteraties lukte het me om de bedrading zo efficiƫnt mogelijk te houden. De LDR sensor en potmeter zijn verbonden aan de analoge A0 en A3. Bij de LDR sensor wordt na de verbinding met de A3 ook een 10k weerstand toegevoegd die de sensor aan de grond verbindt.
Het LCD scherm is het ingewikkeldst omdat deze normaal veel uitgangen heeft die verbonden moeten worden. Dit wordt gelukkig versimpeld met de I2C backpack. Deze zorgen ervoor dat er slechts 4 pinnen verbonden hoeven te worden. Een verbinding met de grond, een verbinding met de 5v, een verbinding met de analoge pin A4 en een verbinding met de analoge pin A5.
De buzzer wordt simpel verbonden aan pin 3 en de grond.
De voeding komt vanuit een powerbank die aan de arduino wordt aangesloten.
In het uiteindelijke product zijn de onderdelen verbonden via een breadboard printplaat waarop de headers en de weerstaand gesoldeerd zijn.
De Code
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
//hier worden de verschillende pins verbonden aan de juiste intput/output.
int buzzerPin = 3;
int potMeter = A0;
int ldrMeter = A3;
//Deze worden uiteindelijk gebruikt om willekeurige nummers te genereren.
long pastRand;
long presentRand;
long futureRand;
//Deze flag helpen later met het selecteren van de juiste kanalen.
boolean pastFlag = false;
boolean presentFlag = false;
boolean futureFlag = false;
boolean tempFlag = false;
void setup()
{
int ldrTemp = 0;
int potTemp = 0;
Serial.begin(9600);
randomSeed(analogRead(0));
pinMode(buzzerPin, OUTPUT);
pinMode (potMeter, INPUT);
pinMode (ldrMeter, INPUT);
//Hier wordt het LCD scherm voorbereid.
//De eerste tekst, "memento", wordt gerschreven om te testen of het scherm werkt en juist is verbonden. Zodra de gebruiker aan de potmeter draait gaat het over naar de tekst van de kanalen.
lcd.init();
lcd.backlight();
lcd.setCursor(4, 1);
lcd.print("MEMENTO");
}
void loop() {
int potTemp = analogRead(potMeter);
int ldrTemp = analogRead(ldrMeter);
//De volgende it-statements bepalen welk kanaal geselecteerd is en dus ook welke tekste op het scherm geschreven wordt,
//De gebruiker kiest het kanaal door de potmeter te verstellen.
//future
if(potTemp > 1 && potTemp < 325 && futureFlag == false)
{
lcd.clear();
lcd.setCursor(0,1);
lcd.print("103.2 A5m0Deu5 FM");
lcd.setCursor(0, 2);
lcd.print("she speaks future");
pastFlag = false;
presentFlag = false;
futureFlag = true;
}
//present
if(potTemp>330 && potTemp<660 && presentFlag == false)
{
lcd.clear();
lcd.setCursor(0,1);
lcd.print("103.0 Forneus Radio");
lcd.setCursor(0, 2);
lcd.print("she speaks present");
pastFlag = false;
presentFlag = true;
futureFlag = false;
}
//past
if(potTemp > 665 && potTemp < 1024 && pastFlag == false)
{
lcd.clear();
lcd.setCursor(0,1);
lcd.print("102.8 Berith FM");
lcd.setCursor(0, 2);
lcd.print("she speaks past");
pastFlag = true;
presentFlag = false;
futureFlag = false;
}
//Zodra de LDR bedekt wordt, wordt er gekeken naar welk kanaal op dat moment geselecteerd is. Gebaseerd daarop wordt een van de drie mogelijk nummer generators aangezet.
//hieruit ontstaan een nummer dat later correspondeerd aan verschillende teksten en liedjes die verschillen per nummer generator.
//past channel
if( tempFlag == false && pastFlag == true && ldrTemp < 200)
{
tempFlag = true;
pastRand = random(1,3);
Serial.println(pastRand);
}
//present channel
if( tempFlag == false && presentFlag == true && ldrTemp < 200)
{
tempFlag = true;
presentRand = random(1,3);
Serial.println(presentRand);
}
//future channel
if( tempFlag == false && futureFlag == true && ldrTemp < 200)
{
tempFlag = true;
futureRand = random(1,3);
Serial.println(futureRand);
}
//De volgende if-statements controlleren welk nummer gegenereerd is en of het verleden, heden of de toekomst geselecteerd moet worden.
//voor dit project heb ik gekozen het bij 3 resultaten per kanaal te houden. Het is gemakkelijk om meer toe te voegen.
//Ik heb het kleiner gehouden omdat het daardoor een stuk overzichtelijker is.
//past texts
if( pastRand == 1 && tempFlag == true)
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("previously playing");
lcd.setCursor(5, 2);
lcd.print("DEATH");
songPast();
tempFlag = false;
pastRand = 0;
}
if( pastRand == 2 && tempFlag == true)
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("previously playing");
lcd.setCursor(5, 2);
lcd.print("The World");
songPast();
tempFlag = false;
pastRand = 0;
}
if( pastRand == 3 && tempFlag == true)
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("previously playing");
lcd.setCursor(5, 2);
lcd.print("The Fool");
songPast();
tempFlag = false;
pastRand = 0;
}
//present texts
if( presentRand == 1 && tempFlag == true)
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("now playing");
lcd.setCursor(5, 2);
lcd.print("DEATH");
songPresent();
tempFlag = false;
presentRand = 0;
}
if( presentRand == 2 && tempFlag == true)
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("now playing");
lcd.setCursor(5, 2);
lcd.print("The World");
songPresent();
tempFlag = false;
presentRand = 0;
}
if( presentRand == 3 && tempFlag == true)
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("now playing");
lcd.setCursor(5, 2);
lcd.print("The Fool");
songPresent();
tempFlag = false;
presentRand = 0;
}
//future texts
if( futureRand == 1 && tempFlag == true)
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("next up");
lcd.setCursor(5, 2);
lcd.print("DEATH");
futureSong();
tempFlag = false;
futureRand = 0;
}
if( futureRand == 2 && tempFlag == true)
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("next up");
lcd.setCursor(5, 2);
lcd.print("The World");
futureSong();
tempFlag = false;
futureRand = 0;
}
if( futureRand == 3 && tempFlag == true)
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("next up");
lcd.setCursor(5, 2);
lcd.print("The Fool");
futureSong();
tempFlag = false;
futureRand = 0;
}
}
//Hieronder zijn de verschillende noten van de deuntjes. Ieder kanaal heeft zo zijn eigen deuntje dat afgespeeld wordt als de LDR wordt bedekt.
void songPast()
{
tone(buzzerPin, 349);
delay(1000);
noTone(buzzerPin);
tone(buzzerPin, 294);
delay(1000);
noTone(buzzerPin);
tone(buzzerPin, 554);
delay(500);
noTone(buzzerPin);
tone(buzzerPin, 587);
delay(500);
noTone(buzzerPin);
}
void songPresent()
{
tone(buzzerPin, 440);
delay(1000);
noTone(buzzerPin);
tone(buzzerPin, 349);
delay(1000);
noTone(buzzerPin);
tone(buzzerPin, 880);
delay(500);
noTone(buzzerPin);
tone(buzzerPin, 932);
delay(500);
noTone(buzzerPin);
}
void futureSong()
{
tone(buzzerPin, 392);
delay(1000);
noTone(buzzerPin);
tone(buzzerPin, 330);
delay(1000);
noTone(buzzerPin);
tone(buzzerPin, 587);
delay(500);
noTone(buzzerPin);
tone(buzzerPin, 554);
delay(500);
noTone(buzzerPin);
}
Design
Ik wilde dat het radiootje leek op een mix tussen een oude tape-recorder en een hand-hald spelcomputer. Hiervoor heb ik enkele ontwerp schetsen gemaakt een heb ik met behulp van de 3d-modeling software Blender en een resin-printer een test-behuizing gemaakt. Deze bleek helaas veel te groot en zwaar te zijn voor dit project. Ook was er te weinig ruimte voor de bedrading. Daarom heb ik uiteindelijk ervoor gekozen om de behuizing, met behulp van een laser-snijder, uit hout te maken.
De Behuizing
De uiteindelijke behuizing is gemaakt door 3mm dik mdf hout te snijden met een laser-snijder. Voor het laser-snij patroon heb ik gebruikt gemaakt van de software InkScape. De gesneden stukken zijn vervolgens met secondelijm aan elkaar vast gelijmd.
Resultaat En Reflectie
Het eindresultaat is een klein kastje, waarmee de gebruiker tussen een paar kanalen kan scrollen. Afhangende van het kanaal, krijgt de gebruiker informatie over hun verleden, heden of toekomst.
Ik ben tevreden over dit project, maar zie wel in dat er meer mogelijk was. Het maken en testen van de 3d-geprintte test heeft veel tijd gekost, daarnaast heb ik het solderen van de onderdelen dusdanig lang uitgesteld dat ik uiteindelijk in tijdsnood ben gekomen. Als ik dit project opnieuw zou maken zou ik het op een andere manier aanpakken. Nu werkte ik veel meer met de electronika dan het uiteindelijke product, waardoor het radiootje wel werkt, maar niet zo mooi uitziet als had gekund.