Pinclock - en klocka för flipperfantaster

Berätta om dina pågående projekt.
Användarvisningsbild
cyberemil
Inlägg: 206
Blev medlem: 28 augusti 2005, 17:30:57
Ort: Johannishus

Pinclock - en klocka för flipperfantaster

Inlägg av cyberemil »

För ungefär ett år sedan så fick jag (ännu en) galen idé.
Gamla flipperspel använder ju som bekant poänghjul, ett hjul med siffrorna 0-9 på, som roteras fram med en solenoid, en siffra i taget.

Hur kul vore det inte att använda dessa till att bygga en klocka?

Så det kommer den här tråden att handla om.
Jag började med att leta rätt på fyra stycken rullar, skickade ett mail till Arne på Flipperskroten och han plockade fram fyra sånahär till mig:
21615858-origpic-afdfa0.jpg
500 spänn med frakt, så det slog jag till på.

Dessa blev sedan liggandes i en låda i ett halvår eller så, tappade sugen lite, och fick lite annat att göra.
Men rätt som det var så plockade jag fram dem igen och började mäta upp dem, för att kunna räkna ut hur stor lådan skulle behöva vara.
Jag ville inte ha lådan större än absolut nödvändigt, men samtidigt efterlikna en gammal backbox.
rulle.jpg
En rulle grovt uppritad i sketchup.

När jag hade måtten på rullarna kunde jag börja rita upp lådan, också den i sketchup.
Pinclock.jpg
Pinclock2.jpg
Skulle köpt 12mm MDF, men den var slut just den dagen som jag hade bestämt mig för att börja bygga, så det fick bli 12mm plywood istället(kvaliten på den var dock inte den bästa, men det får duga).
IMG_0189.JPG
Bitarna utsågade med sänksåg, samt spår utfrästa med överhandsfräs(lite vingligt blev det allt).
IMG_0191.JPG
Limning - Snett blir det, måste mäta bättre nästa gång :) Men det får duga till detta.
IMG_0192.JPG
Sågat till en bit av biltemas 2mm plastglas till fronten.
Kanske är dags att köpa sig en ramtving?

Printade en monteringspryl för kretskortet och sekund-lamporna som ska sitta i mitten.
IMG_0211.JPG
Testade att koppla upp en rulle till ett av solenoidkorten jag byggt till flipperspelsbygget
Tråkig video
Som syns i videon så kör jag den på runt 18V, perfekt, för då kan jag använda en gammal laptopladdare i slutprodukten.

Funderade ett tag på att bara köpa en arduino och slänga in i lådan, men det är ju roligare att rita egna kort, så så fick det bli:
pinclock-1.jpg
board.png
En liten förklaring kanske är på sin plats...
Rullarna matas som sagt fram en siffra i taget, så om man pulsar soilenoiden en gång, så tickar rullen fram en siffra. För att hålla koll på vilken siffra som visas, så finns det ju två varianter, antingen en switch per siffra, eller bara en switch på siffran 0.
Jag valde det senare alternativet, av två anledningar:
1 - Bara tre av rullarna hade "extrakortet" där alla switcharna fanns.
2 - Sparar ingångar

För att veta vilka siffror som visas får man alltså göra såhär:
Om siffran inte är 0, så får man pulsa solenoiden till den blir 0.
Därefter gå vidare till nästa siffra tills alla fyra är nollade.
Sedan kan vi börja "mata på" vad klockan faktiskt är.

Korten beställda hos itead 16 dec 2014, och jag fick dem igår, så då var det bara att börja bygga :)
IMG_0278.JPG
Stötte på patrull med RTC-kretsen...
Hade tidigare labbat med en liten RTC-modul för breadboard med DS1307, så jag designade in en sån på kortet, och köpte komponenter.
Körde in adafruits testkod, men får inget fel när batteriet inte är anslutet.Lyckas heller inte sätta klockan, och datum är helt fel(typ 2100:141:12)(?)
Klockan räknar dock upp sekunder.
Har installerat om datorn sedan jag testade på labbplattan, så jag monterar tillbaka allting dit och testar med RTC-modulen och samma kod, och då funkar allt.(??)

Kollade alla mina kopplingar osv, men hittar inget fel, så jag lödde helt enkelt bort DS1307-kretsen ifrån modulen, och lödde dit den på mitt kort istället, och nu funkar allt!

Den enda förklaringen jag kan tänka mig är att det är skräpkretsar jag har lyckats köpa(förmodligen från ebay).

Koden då?
Till att börja med vill jag säga att jag inte är någon hejare på programmering, så min kod är säkert allt annat än optimal, så jag tar gärna emot synpunkter, tips och allmänna klagomål :)
Jag använder mig av https://github.com/adafruit/RTClib

Kod: Markera allt

#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;

const int digits = 4;                        // How many digits are in the clock
const boolean zeromark[]  = {2,3,4,5};       // What pins are the zero switches connected to?
const int solenoid[]  = {6,7,9,8};           // What pins are the solenoids connected to?
const int seconds_pin = 10;                  // What pin are the second lamps connected to?

const int solenoid_ontime = 20;              // How long should the solenoid be active?
const int solenoid_offtime = 100;            // How long should the solenoid be inactive?

int hours_now;                               // Variable to hold the current hours read out from the RTC
int minutes_now;                             // Variable to hold the current minutes read out from the RTC
int seconds_now;                             // Variable to hold the current seconds read out from the RTC
int oldminutes;                              // Variable for when the digits were last updated


int hours_tens;                              // Variable for the breakdown of the current hours      H
int hours_ones;                              // Variable for the breakdown of the current hours      H
int minutes_tens;                            // Variable for the breakdown of the current minutes    M
int minutes_ones;                            // Variable for the breakdown of the current minutes    M

int digit0;                                  // Variable for holding what the digits are acctually showing, hours tens
int digit1;                                  // Variable for holding what the digits are acctually showing, hours ones
int digit2;                                  // Variable for holding what the digits are acctually showing, minutes tens
int digit3;                                  // Variable for holding what the digits are acctually showing, minutes ones


void setup() { 
  Serial.begin(57600);                                     // Serial is not needed, but a nice way to debug
  Wire.begin();
  RTC.begin();
  
  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    //RTC.adjust(DateTime(__DATE__, __TIME__));
  }
  
  pinMode(10, OUTPUT);                                      // Set up the seconds pin
  
  for(int i=0; i<digits; i++){
    pinMode(zeromark[i], INPUT_PULLUP);                     // Set up the rest of the input pins, with internal pull up
  }
  for(int i=0; i<digits; i++){
    pinMode(solenoid[i], OUTPUT);                           // Set up all the output pins
  }  
  
  for(int i=0; i<digits; i++){                             // Repeat for every digit, one at a time
	while (digitalRead(zeromark[i]) == HIGH){          // If digit is not 0, pulse the solenoid until it reaches 0
          Serial.print("Digit is not 0. Pulsing solenoid ");
          Serial.println(i);
	  digitalWrite(solenoid[i],HIGH);
          delay(solenoid_ontime);
          digitalWrite(solenoid[i],LOW);
          delay(solenoid_offtime);
	}	
  }

// Now we have a known state, where all digits show 0
// Now we have to update the digits with the correct time	
  DateTime now = RTC.now();                         // Get the time
  Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(' ');
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();
  hours_now = now.hour();                           // Put the current hours into hours_now
  minutes_now = now.minute();                       // Put the current minutes into minutes_now
  
  hours_tens = hours_now / 10;                      // Divide by 10 to get the first digit
  hours_ones = hours_now % 10;                      // Modulo to get the last digit
  minutes_tens = minutes_now / 10;                  // And the same for the minutes
  minutes_ones = minutes_now % 10;
  
  pulsesolenoid(0,hours_tens);                      // Pulse the solenoids in order, wth the amount of pulses set from the clock
  pulsesolenoid(1,hours_ones);
  pulsesolenoid(2,minutes_tens);
  pulsesolenoid(3,minutes_ones);
  
  digit0 = hours_tens;                              // Update the digit variables with what they are acctually showing
  digit1 = hours_ones;
  digit2 = minutes_tens;
  digit3 = minutes_ones;
  
  
  
  oldminutes = minutes_now;                         // Set oldminutes to when we last updated the clock
  delay(1000);                                      // Small delay just to separate the setup from the main loop
  }

void loop() {
    DateTime now = RTC.now();                       // Get the time
    hours_now = now.hour();                         // Get the hours
    minutes_now = now.minute();                     // Get the minutes
    seconds_now = now.second();                     // Get the seconds
    
    hours_tens = hours_now / 10;                    // Divide by 10 to get the first digit
    hours_ones = hours_now % 10;                    // Modulo to get the last digit
    minutes_tens = minutes_now / 10;                // And the same for the minutes
    minutes_ones = minutes_now % 10;

    if(minutes_now != oldminutes){                  // Check if it's time to advance the minutes.  
      advance();
      oldminutes = minutes_now;
    }
    
    if ( (seconds_now % 2) == 0) {                  // If seconds are an odd number, turn on the lamps...
      digitalWrite(seconds_pin, HIGH);
    }
    else{                                           // ... otherwise, turn them off
      digitalWrite(seconds_pin, LOW);
    }    
}




void pulsesolenoid(int solenoid_number, int times){
  Serial.print("Pulsing solenoid ");
  Serial.print(solenoid_number);
  Serial.print(" ");
  Serial.print(times);
  Serial.println(" times.");

  for (int i=0; i<times; i++){
	  digitalWrite(solenoid[solenoid_number],HIGH);
          delay(solenoid_ontime);
          digitalWrite(solenoid[solenoid_number],LOW);
          delay(solenoid_offtime);
  }
}


void advance(){
  Serial.println("Advancing time one minute");
  if(digit3 == 9){                                // If last digit is 9, we need to advance both ones and tens reel by one...
    if(digit2 == 5){                              // ...except if the minutes tens reel shows 5 (XX:59), then we need to pulse hours ones once, minutes tens five times, and minutes ones once.
      if(digit1 == 9){                            // ...and except if hours ones reel shows 9, then pulse hours tens once, hours ones once, minutes tens five times, minutes ones once.
        pulsesolenoid(0,1);
        pulsesolenoid(1,1);
        pulsesolenoid(2,5);
        pulsesolenoid(3,1);
      }
      else if(digit0 == 2 && digit1 == 3){        // ...and if the time is 23:59 then we need to andvance all the reels by 8, 7, 5 and 1. (This will make a lot of noise, and take some time)   
        pulsesolenoid(0,8);
        pulsesolenoid(1,7);
        pulsesolenoid(2,5);
        pulsesolenoid(3,1);
      }
      else{      
      pulsesolenoid(1,1);
      pulsesolenoid(2,5);
      pulsesolenoid(3,1);
      }
    }
    else{
      pulsesolenoid(2,1);
      pulsesolenoid(3,1);
    }
  }
  else{
    pulsesolenoid(3,1);
  }
  
  digit0 = hours_tens;                           // Update the time shown on the reels for the next time it's time to advance.
  digit1 = hours_ones;
  digit2 = minutes_tens;
  digit3 = minutes_ones;
  Serial.print("Time shown is now: ");
  Serial.print(digit0);
  Serial.print(digit1);
  Serial.print(":");
  Serial.print(digit2);
  Serial.println(digit3);
}
Ett problem var att rullarna har siffrorna 0-9.
För enkla sekunder är det jättebra, men för första siffran i timmar är allt annat än 0-2 onödigt, så det är därför det är så mycket if-else i advance.

Nu är det dags att montera ihop allt
IMG_0283.JPG
IMG_0284.JPG
Lamporna lyste lite för mycket åt sidorna, så det löste jag så här:
IMG_0291.JPG
Och så här blev slutresultatet
IMG_0289.JPG
Bilden är ihopslängd i inkscape, och blev lite tråkig, men jag kom inte på något motiv, förslag?

Och såklart en film :)
http://youtu.be/tTz0llkBHWw

Phew, det tog ett par timmar att skriva det här inlägget, fixa till bilder och filmer :)

Och ja, den låter väldigt mycket :lol:
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
pstrand
Inlägg: 373
Blev medlem: 6 november 2010, 09:51:33
Skype: p.a.strand
Ort: Ljungsbro

Re: Pinclock - en klocka för flipperfantaster

Inlägg av pstrand »

Tjusigt! :tumupp:
Användarvisningsbild
stenD
Inlägg: 1355
Blev medlem: 23 september 2010, 21:53:35
Ort: Ljusfallshammar

Re: Pinclock - en klocka för flipperfantaster

Inlägg av stenD »

5 stjärnor !
robertholmberg
Inlägg: 21
Blev medlem: 17 april 2012, 09:39:41

Re: Pinclock - en klocka för flipperfantaster

Inlägg av robertholmberg »

Coolt, men varför rullade den runt där några sekunder innan den slog om till 16:18?
Användarvisningsbild
cyberemil
Inlägg: 206
Blev medlem: 28 augusti 2005, 17:30:57
Ort: Johannishus

Re: Pinclock - en klocka för flipperfantaster

Inlägg av cyberemil »

Oj, det glömde jag skriva, och det framgår inte av videon ser jag nu...
Jag bryter spänningen till den för att starta om den, så den nollar alla siffrorna, sen hoppar den fram till aktuell tid, och sen ökar den på minuterna med ett.
Användarvisningsbild
UgloBuglo
Inlägg: 165
Blev medlem: 13 september 2013, 09:30:35
Ort: Göteborg

Re: Pinclock - en klocka för flipperfantaster

Inlägg av UgloBuglo »

Riktigt snyggt! :bravo:
En sån kanske man skulle leta fram delar till i flipperskrot-lådorna.
Användarvisningsbild
Lennart Aspenryd
Tidigare Lasp
Inlägg: 12607
Blev medlem: 1 juli 2011, 19:09:09
Ort: Helsingborg

Re: Pinclock - en klocka för flipperfantaster

Inlägg av Lennart Aspenryd »

Mycket snyggt. Kul att du tog dig tid att fullfölja din idé.
X-IL
EF Sponsor
Inlägg: 8479
Blev medlem: 3 december 2008, 07:47:20
Ort: Hallstahammar

Re: Pinclock - en klocka för flipperfantaster

Inlägg av X-IL »

Snyggt bygge!

Har en liten fråga om hur din RTC beter sig. När du satt tiden, om du då drar strömmen i säg en timme, kommer den att starta om där du var sist eller tickar den på när strömmen är bruten?

Jag har testat två kort med ds1307 och båda beter sig så att den går tillbaka till den gamla inställda tiden, men det kanske är så alla RTC:er fungerar?

EDIT: Tror jag kommit på vad jag gör för klanteri, glöm min fråga.
Användarvisningsbild
stenD
Inlägg: 1355
Blev medlem: 23 september 2010, 21:53:35
Ort: Ljusfallshammar

Re: Pinclock - en klocka för flipperfantaster

Inlägg av stenD »

och om man lyssnar på filmen med ljudet påslaget förstår man att man kan göra en väckarklocka av den också utan extra högtalare :)
Användarvisningsbild
GeekJoan
Admin
Inlägg: 11145
Blev medlem: 26 maj 2003, 15:59:27
Ort: Solna

Re: Pinclock - en klocka för flipperfantaster

Inlägg av GeekJoan »

Coolt, den där skulle vi ha på jobbet. =)

Såg att hjulen var lite gulnade. Det fixade jag så här på ett spel:
fs.jpg
Printade ut vinyldekaler i rätt längd med nya fina siffror på.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
cyberemil
Inlägg: 206
Blev medlem: 28 augusti 2005, 17:30:57
Ort: Johannishus

Re: Pinclock - en klocka för flipperfantaster

Inlägg av cyberemil »

Glömde lite saker ser jag nu, som lite diptrace- och sketchupfiler:
Pinclock_diptrace.zip
Pinclock_sketchup.zip
Pinclock.svg
(Borde det inte gå att ladda upp .dip .dch och .skp direkt utan att behöva zippa?)

GeekJoan: Är det... svart tusch som någon har målat i siffrorna med tidigare?
Såna remsor kanske man skulle fixa, när nu resten blev så pass bra ändå...
Har du några över eller kan/vill fixa så är jag intresserad :)
Vad är det för typsnitt?

Om någon vill ha ett mönsterkort så bara säg till så kan jag skicka, har ju 9 st över som ändå bara blir liggandes...
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
Icecap
Inlägg: 26632
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Pinclock - en klocka för flipperfantaster

Inlägg av Icecap »

Fullständigt onödigt projekt - men fan vad kul!!!

En hög med tummar upp - men aldrig att jag skulle vilja ha en sådan klocka.

Du hade i övrigt varit tjänat med en DS323x RTC, den är väldig noga. Med en DS1307 ska du själv trimma kristallkretsen för att få den i närheten av exakt.
Användarvisningsbild
ensten
EF Sponsor
Inlägg: 3759
Blev medlem: 19 oktober 2004, 15:55:20
Ort: Hudiksvall

Re: Pinclock - en klocka för flipperfantaster

Inlägg av ensten »

Snyggt, kul och innovativt! Grattis! :bravo:
Jag har bara en liten synpunkt (och det är ju givetvis en smaksak), och det är att den rätt unika och i mina ögon intressanta mekaniken borde synas.

Edit> Innovativt stavas tydligen med två "n". :vissla:
Användarvisningsbild
GeekJoan
Admin
Inlägg: 11145
Blev medlem: 26 maj 2003, 15:59:27
Ort: Solna

Re: Pinclock - en klocka för flipperfantaster

Inlägg av GeekJoan »

cyberemil skrev:GeekJoan: Är det... svart tusch som någon har målat i siffrorna med tidigare?
Såna remsor kanske man skulle fixa, när nu resten blev så pass bra ändå...
Har du några över eller kan/vill fixa så är jag intresserad :)
Vad är det för typsnitt?

Om någon vill ha ett mönsterkort så bara säg till så kan jag skicka, har ju 9 st över som ändå bara blir liggandes...
Ja, någon har försökt fylla i siffrorna med tuch...
Jo, jag kan nog ha några över. Men det är inte säkert dom kommer passa för olika modeller har olika diameter på hjulen.
Maila mig din adress så löser jag det, får du prova.
geekjoan@gmail.com
Användarvisningsbild
)ExecutoR(
Inlägg: 258
Blev medlem: 11 juni 2008, 09:18:31
Ort: Hälsingland

Re: Pinclock - en klocka för flipperfantaster

Inlägg av )ExecutoR( »

När du ändå har 0-10 på alla hjul, och det är så jäkla ballt när den resettar till 0 och sen räknar upp borde du ha fler funktioner man kan växla mellan. Datum borde vara enkelt att visa till exempel.
Skriv svar