Poker Game Selector. Med fjärr!

Användarvisningsbild
inteilla
Inlägg: 6
Blev medlem: 8 februari 2019, 14:54:17

Poker Game Selector. Med fjärr!

Inlägg av inteilla »

Poker Game Selector. Med fjärr!

Så, mina polare och jag lirar poker nästan varje vecka. Och vi lirar "dealers choice", alltså så att den som har dealerknappen får välja vilken form av poker vi ska köra det kommande varvet. Problemet vi har är att folk är lite smådisträa och inte kommer ihåg vad vi spelar. Det går oftast bra ändå, men i flera år har det snackats om nån lösning på problemet.

Jag fick ett ryck och började skissa. Först var det en rätt analog lösning: En dealerknapp som indikerar valt spel, med tårtbitar lite som en trivial persuit-pjäs, eller en borrbox. Skissade i TinkerCad och byggde en mockup av kartong. Uppenbar brist: Spelare en bit iväg från knappen ser inte vad det står!
Screen Shot 2019-03-17 at 18.49.08.png
Screen Shot 2019-03-17 at 18.49.25.png


Snacket om en digital display eller liknande gick het och det var uppenbart att nån mer komplicerad (kanske rent av överkomplicerad! 8) ) lösning behövdes.

Jag började skissa på nån form av låda med lampor som kunde indikera val av spel. Inspirerad av analoga 70-tals-synthar och gamla industripaneler. ELFA hade så sjukt fina boxar (pultlåda lärde jag mig att de tydligen heter) men jag ville såklart designa nåt eget.
Screen Shot 2019-03-17 at 18.49.36.png
Screen Shot 2019-03-17 at 18.49.51.png
I TinkerCad och Photoshop skissade jag upp följande skapelse. Tanken var att styra leddarna med en Arduino, eftersom det behövdes lite logik i knapparna. Henrik som är utvecklare fick uppgiften att koda och lära sig IDE, då jag inte kan sånt. Han fick en “stubbe” kod som jag hittat online, ursprungligen för att slumpvis blinka leddar kopplade till en Arduino. Busenkelt, eller hur? Knappar på input, leddar på outputpinnar.
Screen Shot 2019-03-17 at 18.49.56.png
Screen Shot 2019-03-17 at 18.50.04.png
Kopplingsschemat kanske är inte helt snyggt och det kom att behövas en hel del revisioner. Men iallafall, nån dag senare hade vi nåt som funkade i TinkerCads simulator (Vilket bra verktyg TinkerCad är för detta också!). Sjukt peppad åkte jag igen till ELFA (10 st stoooora LED tack), till Kjell & Co (Arduino Uno, småknappar & kablage) och kopplade ihop ett "proof of concept”. Succé! Det funkade! (Alltså, två knappar för att byta LED, samt en för att slumpa fram en LED). Sen började jag löda och bygga en mockup i wellpapp.
Screen Shot 2019-03-17 at 18.50.13.png
Screen Shot 2019-03-17 at 18.50.20.png
Screen Shot 2019-03-17 at 18.50.30.png
Screen Shot 2019-03-17 at 18.50.37.png
Screen Shot 2019-03-17 at 18.50.50.png
Screen Shot 2019-03-17 at 18.50.44.png
Denna monstruösa skapelse togs till pokerkväll för användartest! Två saker blev tydliga snabbt. Den är för stor! Det behövs en fjärrkontroll. Båda saker visste jag redan :) En hel del nya idéer framkom även. Det vore kul om den hade lite ljud för sig, kanske till och med pratade?

Nu började materialvalen. Träsidor i ädelträ var givet. Men skulle själva panelerna göras i masonit, akryl eller plåt? Aluminium vore ju proffsigast såklart, men jag visste inte riktigt om jag kunde bocka själv. Rätt dyrt är det också. Gick till en plåtfirma och visade mina skisser. Fick offerten med prislappen 2500 plus moms. Japp, det är sant. 2500 för att bocka 250x700 mm aluminium några gånger. Stärkt av det faktumet sökte jag info på youtube hur man själv bockar plåt enkelt. Byggde en jigg i hobbyrummet och det gick förvånansvärt enkelt! Det låter ju inte så svårt nu, men jag var väldigt orolig att det skulle spricka eller helt enkelt inte bli snyggt nog. Men det gick fint. Aluminiumprimer och sen ett lager svart. Sörj för god ventilation.
Screen Shot 2019-03-17 at 18.50.58.png
Screen Shot 2019-03-17 at 18.51.04.png
Screen Shot 2019-03-17 at 18.51.12.png
Screen Shot 2019-03-17 at 18.51.18.png
Screen Shot 2019-03-17 at 18.51.32.png
Nu hade jag också testsågat sidorna i furu och sedan "live" i Acacia.
Screen Shot 2019-03-17 at 18.51.41.png
Screen Shot 2019-03-17 at 18.51.52.png
Screen Shot 2019-03-17 at 18.51.59.png
Nu jäklar började det ta form och jag började raskt löda på riktigt och montera in leddarna och Unon. Från Adafruit.com beställdes mysiga knappar men framför allt elektroniken till fjärrkontrollen. Adafruit har en radio-receiver och en tillhörande fjärr som jag hoppades kunna använda mig av. Spoiler: det gick!

BildBild
Bild Bild



Under tiden grejerna från USA skeppades så hade jag klurat och klurat på fjärren. Jag funderade på att använda mig av nån befintlig burk/ask att montera knappar i. Kanske en hårvaxburk? Snusdosa? Köpte några askar och testade.

Bild Bild Bild

Jag hade som sagt köpt smarriga knappar till fjärrkontrollen, men det visade sig lite för avancerat för mig att "hacka" befintligt kretskort och löda på kablar till externa knappar. Jag fick köra på plan B: en vagga för kortet och "kapsla in" knapphuvudena från miniknapparna (från Kjell & Co) i burken så att de prickar rätt över kortet. Min kompis Christoffer blev min bästa kompis nu, pga att han har en 3D-skrivare :D Jag designade en ny bredare "tryckyta", använde mig av befintlig gummiknappgrej och sen vi printade en hel del revisioner av vaggan för att få rätt höjd på allt. Extra vikt behövdes för att ge fjärren kvalitetstyngd och jag kom på den briljanta idén att använda luftgevärskulor! Geni.

Bild Bild Bild Bild

Samtidigt hade jag testat att svarva till en "manschett" av trä som burken skulle placeras i. Snyggt och i samma stil som storlådan! (Svarva inte så här hemma, det är dumt och rätt farligt)

Bild Bild Bild Bild

Här fick jag också ett ryck och ordnade mig en ordentlig arbetsbänk, tidigare har jag byggt i köket samt föreningens hobbyrum. Nu har jag äntligen lite ordning hemma! Bänkskiva i ek från Biltema, förstoringslampa från Kjell. Stol: privat.

Bild

I alla fall, här ser ni slutgiltigt innanmätet i storlådan, med receivern uppe till vänster med sin antennsladd, Kjells Uno i mitten och kablage ner till knapparna och bort till LED-raden. Rätt fint blev det om jag får säga det själv. Kablarna från Kjell med sina regnbågsfärger blev fina! Lite krympslang på det sen.

Bild

Nu hade jag även adderat en piezo-buzzer på allmän begäran och Henrik har kodat in lite toner för varje LED. Jag hade också en fin LED över, så den satte jag naturligtvis under lådan :P Akrylglas som jag "frostade" med stålull blev fint till baksidan av lådan. Man vill ju skymta lite av godsakerna inne i låddan.



Fjärren var den som tog mest tid att få rätt känsla i. När det äntligen var klart firades det med ett glas Jura! Pokerpremiär för apparaten blev en succé såklart. Fjärren funkar fint, slumpen låter hemtrevligt och allt är snyggt som sjutton. Hela kalaset har gått på runt 1500kr med all elektronik, metall, trä och tull och moms och skit. Ej inräknat inhandlade verktyg som t ex plåtborr och sticksåg. Hela pokergänget har bidragit med en slant. Tyvärr har jag inte räknat timmarna som det tagit. Men det har tagit en heeeel del :) Det som orsakade mest klurande med koden var knapparnas debounce och slumpfunktionens logik. Just nu är det buggfritt! Kodrevisioner kan komma :)

Hoppas ni gillar projektet! Det har varit väldigt kul att kombinera design, elektronik och kod!

Här kommer en sammanfattning (och koden längst ner):

POKER GAME SELECTOR
• Nästa / Föregående-knappar
• Slumpknapp med 7-15 steg i sekvens innan LED slumpas slutgiltigt. Ljud på de olika stegen i sekvensen.
• Fjärrkontroll med motsvarande knappar
• Startup-sekvens som går igenom alla LED nerifrån och upp, innan slumpvald LED tänds.
• Slumpen väljer aldrig samma val som senast spelats
• Slumpen väljer heller aldrig "Other" som spel
• Fjärrkontrollens signaler kommer in på de analoga pinnarna, som helt enkelt används som digitala
• Fjärr av snusdosa och 3D-printad vagga, med luftgevärskulor som vikt.
• Sidor av acaciaträ med möbelolja :D
• Handtag i äkta läder
• Okynnes-LED undertill

Design, koncept, skisser, mockups och bygge: Göran
Kod: Henrik
3Dprint: Christoffer
Test och idéer: Per, Mikael, Roger, Björn & Henrik


Bild Bild Bild

Kod: Markera allt

const int ledCount = 9;
const int inputCount = 6;
const int buttonNext = 2;
const int buttonPrev = 4;
const int buttonRandom = 3;
const int remoteButtonNext = 14;
const int remoteButtonPrev = 15;
const int remoteButtonRandom = 16;
const int buzzer = 17;
const int randomDelay = 200;
const int debounceDelay = 50;
const int tonePause = 60;
const int firstLed = 0;
int lastLed = ledCount - 1;
int selectedLed = 0;
int randomCountdown = 0;
int randomizeMinStepCount = 7;
int randomizeMaxStepCount = 15;
int ledPins[ledCount] = {5, 6, 7, 8, 9, 10, 11, 12, 13};
int notes[ledCount - 1] = {33, 65, 131, 262, 523, 1047, 2093, 4186};
int inputPins[inputCount] = {buttonNext, buttonPrev, buttonRandom, remoteButtonNext, remoteButtonPrev, remoteButtonRandom};
int inputState[inputCount];
int lastInputState[inputCount];
bool buttonState[inputCount];
long lastDebounceTime[inputCount];

void setup() {
  initInputs();
  initLeds();
  startSequence();
}

void loop() {
  if(isRandomizing()){
    continueRandomize();
  } else {
    readInputs();
    handleButtonPress();
  }
}

void startSequence(){
  int i;
  for(i = ledCount - 1; i >= 0; i--){
    delay(100);
    move(i);
  }
  delay(500);
  move(getRandom(false));
}

void readInputs(){
  int i;
  for(i = 0; i < inputCount; i++){
    int reading = digitalRead(inputPins[i]);
    if(reading != lastInputState[i]){
      lastDebounceTime[i] = millis();
    }
    if((millis() - lastDebounceTime[i]) > debounceDelay){
      if(reading != inputState[i]){
        inputState[i] = reading;
        if(inputState[i] == HIGH){
          buttonState[i] = true;
        }
      }
    }
    lastInputState[i] = reading;
  }
}

bool isRandomizing(){
  return randomCountdown > 0;
}

void startRandomize(){
  int countdownSpread = randomizeMaxStepCount - randomizeMinStepCount;
  int rnd = random(0, countdownSpread);
  randomCountdown = randomizeMinStepCount + rnd;
  moveRandom();
}

void continueRandomize(){
  randomCountdown -= 1;
  moveRandom();
  if(randomCountdown == 0){
    stopSound();
  }
}

void makeSound(int i){
  tone(buzzer, notes[i], tonePause);
}

void stopSound(){
  noTone(buzzer);
}

void handleButtonPress(){
  int i;
  for(i = 0; i < inputCount; i++){
    if(buttonState[i]){
      performButtonAction(i);
      buttonState[i] = false;
    }
  }
}

void performButtonAction(int i){
  int button = inputPins[i];
  if (isNextButton(button))
    moveNext();
  else if (isPrevButton(button))
    movePrev();
  else if (isRandomButton(button))
    startRandomize();
}

int isNextButton(int button){
  return button == buttonNext || button == remoteButtonNext;
}

int isPrevButton(int button){
  return button == buttonPrev || button == remoteButtonPrev;
}

int isRandomButton(int button){
  return button == buttonRandom || button == remoteButtonRandom;
}

void initInputs(){
  int i;
  for (i = 0; i < inputCount; i++){
    initInput(i);
  }
}

void initInput(int i){
  int input = inputPins[i];
  pinMode(input, INPUT);
  digitalWrite(input, LOW);
  lastInputState[i] = LOW;
  buttonState[i] = false;
  lastDebounceTime[i] = 0;
}

void initLeds(){
  int i;
  for (i = 0; i < ledCount; i++)
    pinMode(ledPins[i], OUTPUT);
    digitalWrite(ledPins[i], LOW);
}

int getRandom(bool forceNew){
  int reading = analogRead(A4);
  int rnd = reading % 8;
  return forceNew && rnd == selectedLed ? getRandom(forceNew) : rnd;
}

void moveNext(){
  int newLed = selectedLed + 1;
  if(newLed > lastLed)
    newLed = firstLed;
  move(newLed);
}

void movePrev(){
  int newLed = selectedLed - 1;
  if(newLed < firstLed)
    newLed = lastLed;
  move(newLed);
}

void moveRandom(){
  int rnd = getRandom(true);
  move(rnd);
  makeSound(rnd);
  randomizeDelay();
}

void move(int newLed){
  int oldLed = selectedLed;
  digitalWrite(ledPins[oldLed], LOW);
  digitalWrite(ledPins[newLed], HIGH);
  selectedLed = newLed;
}

void randomizeDelay(){
  delay(randomDelay);
}
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Senast redigerad av inteilla 19 mars 2019, 15:20:34, redigerad totalt 1 gång.
Användarvisningsbild
JimmyAndersson
Inlägg: 26308
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Re: Tävlingsbidrag: Poker Game Selector. Med fjärr!

Inlägg av JimmyAndersson »

Det var mycket länge sedan jag såg ett sånt här projekt på forumet!
Så omsorgsfullt gjort. Med stor nyfikenhet och glädje och "bygga själv"-vilja.
Väldigt väldokumenterat. -Och som första inlägg som ny medlem dessutom.

*Såhär* var trådarna förr. Mycket kul att jag fick se det igen! :) :tumupp:

PS: Gör fler projekt-trådar. :D
X-IL
EF Sponsor
Inlägg: 8261
Blev medlem: 3 december 2008, 07:47:20
Ort: Hallstahammar

Re: Tävlingsbidrag: Poker Game Selector. Med fjärr!

Inlägg av X-IL »

Håller med Jimmy, snyggt genomfört projekt, föredömligt dokumenterat!

Välkommen!
Användarvisningsbild
ecenier
Inlägg: 1104
Blev medlem: 13 december 2007, 17:51:42
Ort: Älvsjö
Kontakt:

Re: Tävlingsbidrag: Poker Game Selector. Med fjärr!

Inlägg av ecenier »

Riktigt kul att läsa om det här projektet. Snyggt!
:bravo:
Användarvisningsbild
baron3d
EF Sponsor
Inlägg: 1339
Blev medlem: 1 oktober 2005, 23:58:43
Ort: Torestorp

Re: Tävlingsbidrag: Poker Game Selector. Med fjärr!

Inlägg av baron3d »

:bravo: :bravo: :bravo:
Användarvisningsbild
inteilla
Inlägg: 6
Blev medlem: 8 februari 2019, 14:54:17

Re: Tävlingsbidrag: Poker Game Selector. Med fjärr!

Inlägg av inteilla »

Tack för de fina orden! :tumupp:
Användarvisningsbild
inteilla
Inlägg: 6
Blev medlem: 8 februari 2019, 14:54:17

Re: Poker Game Selector. Med fjärr!

Inlägg av inteilla »

Rösta gärna på vårt projekt i tävlingen! :D
https://elektronikforumet.com/forum/vie ... 48&t=94522
WhyNotOnMars
Inlägg: 120
Blev medlem: 24 december 2015, 11:35:17

Re: Poker Game Selector. Med fjärr!

Inlägg av WhyNotOnMars »

Snyggt! Hur är texten bredvid lysdioderna gjord?
Skriv svar