Gepost door Jeroen Vreuls op dinsdag 14 februari 2023
Ik was al een hele tijd van plan om eens een klok te maken, op internet kom je van alles tegen qua elektronische klokken. Grote tableaus met oplichtende tekst erin, klokken met oplichtende wijzerplaten, de standaard digitale klokken, enzovoort.
Ik wilde eigenlijk een combinatie maken van elektronisch en mechanisch, na wat denken en schetsjes maken kreeg ik gaandeweg een idee hoe het moest worden.
Ik ben begonnen met het uitwerken van een tekening voor de tandwielen, het mechanische gedeelte dus.
Volgens de berekening kwam ik uit op tien tandwielen. De tandwielverhouding is wel iets anders dan van een gewone klok. Alleen de verhouding tussen de minutenwijzer en urenwijzer is hetzelfde, die moet 1 op 12 zijn. Omdat we een stappenmotor gaan gebruiken voor het verstellen van de wijzers maakt de eerste vertraging niet zoveel uit, als je maar op hele getallen uitkomt qua tanden is het goed. Als je naar de eerste vertraging kijkt, zie je een tandwiel met 12 tanden op de stappenmotor en 60 tanden op de tussenas. Dat geeft bij elkaar een vertraging van 60 : 12 = 5. De volgende vertraging is een tandwiel met 12 tanden op de tussenas en 36 tanden op de minuten as, dat geeft een vertraging van 36 : 12 = 3. De totale vertraging tussen de stappenmotor en de minuten as is dus 3 X 5 = 1 op 15.
We gaan de klok één keer per minuut verstellen, dat moet in één uur dus 60 maal gebeuren. Voor de stappenmotor gebruik ik een motor met 0.9 graden per stap, dat zijn dus 400 stappen per omwenteling. De stappenmotor ga ik bedienen met micro stappen, de stappenmotordriver staat op 1/32 stap. Dan krijgen we dus 32 X 400 = 12800 stappen per omwenteling van de stappenmotor. Nu hadden we een vertraging van 1 op 15, als we nu 15 vermenigvuldigen met 12800 dan krijgen we 15 X 12800 = 192000 stappen voor één omwenteling van de minutenwijzer. Als we die 192000 delen door 60 krijgen we 192000 : 60 = 3200 stappen voor één minuut. De stappenmotor draait dus iedere minuut een kwart rondje.
Nu hebben we de minuten werkend en gaan we naar de uren kijken. Eigenlijk weten we dat al, dat moet één twaalfde deel zijn. Als de minutenwijzer één maal rond is moet de uren wijzer één twaalfde deel verdraaien. Dat kan met één tandwielcombinatie, maar dan wordt het wel erg groot. Ik heb dat met twee tandwielcombinaties gedaan. Eenmaal met een tandwiel vertraging van 1 op 4 en eenmaal met een tandwiel combinatie van 1 op 3, samen wordt het dan 4 X 3 = 12.
Op de tekening zie je nog twee keer tandwielen staan, dat is gedaan om de zelfde draairichting van de wijzers te krijgen en om de afstand te overbruggen tussen de tandwielen.
De tandwielen zijn volgens deze tabel geprint. De tandgrootte is module 1.5.
Als we bijvoorbeeld even kijken naar het tandwiel met 60 tanden, dan zien we dat de diameter (A) 93 mm is en de pitch (B) is 90 mm. De maten D, F en G zijn respectievelijk 27, 23 en 12 mm.
In de tabel kun je ook de maten van de andere tandwielen vinden. De tandwielen zijn geprint zonder gat, die heb ik op de draaibank erin gemaakt. Het printen van een gat is nooit helemaal precies, dus vandaar. De assen zijn van 4 mm messing, dat is overal te koop, de as voor de uren is van aluminium. Dat is een stukje buis met een buitendiameter van 6 mm en een binnendiameter van 4 mm, dat past dus precies over de minuten as. De lagers zijn gemaakt van kunststof, die zijn ook op de draaibank gemaakt.
De tandwielen zijn in drie lagen opgebouwd in de klok. Op de eerste laag zie je de stappenmotor en het grote tandwiel, 12 en 60 tanden. De pijlen op de tandwielen geven de draairichting aan. Op het tandwiel met 60 tanden is weer een tandwiel met 12 tanden bevestigd.Op de tweede laag zie je dat het tandwiel met 12 tanden het minuten tandwiel met 36 tanden aandrijft. Het minuten tandwiel drijft via een tandwiel met 12 tanden het tandwiel aan met 48 tanden, op dat tandwiel zit weer een tandwiel met 12 tanden.
Eigenlijk zijn er dus twee tussenassen, de eerste is de tussen as tussen de stappenmotor en het minuten tandwiel. En de tweede tussenas is de as tussen het minuten tandwiel en het uren tandwiel.
Als laatste hebben we de derde laag, daar zitten drie tandwielen op met 12 tanden en het uren tandwiel met 36 tanden.
De kleine tandwielen zijn er eigenlijk alleen om de juiste draairichting te krijgen en om de afstand te overbruggen naar het uren tandwiel.
Eigenlijk was de draairichting al goed, zoals je kunt zien aan de pijlen. Maar de afstand tussen het kleine en grote tandwiel was te groot. En dat kon niet anders omdat je met de steek van de tandwielen te maken hebt, daar ben je nu eenmaal aan gebonden. Je hebt te maken met een bepaalde tandwielverhouding voor de vertraging en daar horen verschillende diameters bij voor de tandwielen.
De delen waar de tandwielen tussen komen zijn van 12 mm multiplex gemaakt, de diameter van de delen zijn rond 170 mm. Deze delen zijn uit een vierkante plaat gemaakt op de freesbank, daar zijn ook de gaten op geboord voor de assen waar de tandwielen op zitten.
Later zijn er nog stukken uitgefreesd om de tandwielen beter zichtbaar te maken.
We gaan nu naar de wijzerplaat kijken. Ik wilde geen wijzerplaat met alleen maar cijfers erop, het moest iets speciaals worden. Ik had een keer ergens een klok gezien waar de cijfers dolfijnen waren, 12 dolfijnen in een andere vorm gaven de uren aan. En toen moest ik gelijk denken aan de 12 provincies die Nederland telt.
En dit is het geworden:
Dat is nog heel wat werk geweest, daar heb ik me lelijk in vergist. Ik heb op internet plaatjes gezocht van de provincies, maar daar stond tekst in en dat is geen gezicht natuurlijk.
Plus dat er copyright op zat en ik kon ook geen andere kleur ervan maken. Ik heb al de provincies overtrokken in sPlan en verschaalt naar wat ik nodig had, heb er wel nog cijfers bij gezet.
Het geheel is afgedrukt op fotopapier en geseald. De achterkant van de seal hoes bevat lijm, zo krijg je dus een soort sticker die je makkelijk ergens op kunt plakken.
Even een voorbeeld hoe zo'n provincie eruit ziet. Als voorbeeld heb ik Limburg genomen.
Je kunt zien dat het heel wat puntjes zijn, het voordeel hiervan is wel dat je het omtrokken gedeelte iedere kleur kunt geven die je maar wil in sPlan. Je moet dan wel polygon gebruiken, want dan krijg je een lijn zonder begin en eind en die kun je dan weer inkleuren.
De grootste diameter is dus 170 mm, daar moest ik een stolp voor weten te vinden. Gelukkig zijn die dingen er te kust en te keur, je kunt het zo gek niet verzinnen of er is wel een stolp te vinden. Ik heb een stolp opgezocht van rond 200 mm en 400 mm hoog. De stolp staat op een houten voet.
Dit is wel zo'n beetje het mechanische gedeelte.
Zoals ik verteld had gaan we een stappenmotor gebruiken. Daar heb je een stappenmotordriver voor nodig om de motor goed te laten werken. Ik heb daar een DRV8825 voor gebruikt.
Het is een compleet printje dat ik op de hoofdprint kan drukken.
De klok bestaat niet alleen uit een uurwerk en een wijzerplaat, maar heeft ook een display waar de datum, jaar en tijd op af te lezen is. Ik heb daarvoor een RTC gebruikt en wel het type DS1307, deze zit ook op de hoofdprint.
De hoofdprint is getekend met Sprint-Layout. Als controller maak ik gebruik van een PIC16F887, dat is een controller van Microchip. Er zitten ook vier drukknoppen op de print om de klok op tijd te zetten en versnelt vooruit te zetten. De printen frees ik altijd zelf, daar gebruik ik een Prototyper voor.
Alle onderdelen zijn nu wel zo'n beetje klaar en zo ziet dat er uit.
Op de hoofdprint kun je de drukknoppen zien zitten, de stappenmotordriver DRV8825, de controller en links van de controller zie je de RTC zitten met de back-up batterij. Er zijn ook drie aansluitingen aanwezig: één voor de stappenmotor, één voor het display en één voor het programmeren van de controller.
Hier kun je ook zien hoe de tussenplaten geworden zijn, dat zijn de drie platen met de stukken eruit gefreesd. De twee helemaal boven op de foto en de gene onder de wijzerplaat.
Verder zie je de tandwielen, stappenmotor, afstandsbussen en de netvoeding. De netvoeding is 12 V DC en 1 A, dat is ruim voldoende om de klok goed te laten werken.
In de grondplaat en de motorplaat zie je twee sleuven zitten, daar komt het display tussen te zitten. Op de derde tussenplaat (rechtsboven) zie je twee assen zitten, daar komen de twee keer tandwielen op. Een stukje van de pennen vallen in de bovenste plaat die onder de wijzerplaat zit.
We gaan nu naar de software kijken. Het programma is gemaakt in Proton Basic, zoals ik altijd doe.
'* Name : BESTURING ZELFBOUW KLOK MET DS1307.
'* Author : H. van Zwieten
'* Notice : Copyright (c) 2022 H.v.Z.
'* : All Rights Reserved
'* Date : 5-2-2022
'* Version : 1.0
'* Notes :
Device 16F887 ; Processor type
Xtal 10 ; Crystal 10Mhz
Asm ; Config settings
CONFIG_REQ
__CONFIG _CONFIG1, HS_OSC & WDT_OFF & DEBUG_OFF & FCMEN_OFF & LVP_OFF & IESO_OFF & BOR_OFF & CPD_OFF & CP_OFF & MCLRE_OFF & PWRTE_ON
__CONFIG _CONFIG2, WRT_OFF & BOR40V
EndAsm
All_Digital true ; Alle poorten digitaal
Declare LCD_RSPin PORTD.2 ; Reset display poort D.2
Declare LCD_ENPin PORTD.3 ; Enable display poort D.3
Declare LCD_DTPin PORTD.4 ; Data display poort D.4 t/m D.7
Declare LCD_Lines 4 ; Vier lijns display
Declare SCL_Pin PORTC.3 ; I2C klok pin
Declare SDA_Pin PORTC.4 ; I2C data pin
Declare I2C_SLOW_BUS 1 ; I2C bus op 100KHz
Symbol FREQUENTIE = 200 ; Stap frequentie min 200
Symbol FREQ_GELIJK_ZETTEN = 50 ; Stap frequentie klok gelijk zetten
Symbol STAP_WAARDE = 3200 ; Aantal micro stappen 3200
Symbol DIR_DRIVER = PORTB.3 ; Uitgang richting stappenmotor driver
Symbol PULS_DRIVER = PORTB.4 ; Uitgang puls voor stappenmotor driver
Symbol ENABLE_DRIVER = PORTB.5 ; Uitgang enable stappenmotor driver
Symbol SECONDE_LED = PORTC.2 ; Uitgang seconde led
Symbol MODE_KNOP = PORTA.0 ; Ingang select uur, minuut, seconde
Symbol KNOP_OP = PORTA.1 ; Ingang optellen uur, minuut, seconde
Symbol KNOP_NEER = PORTA.2 ; Ingang aftellen uur, minuut, seconde
Symbol GELIJK_ZETTEN = PORTA.3 ; Ingang klok gelijk zetten
Dim SECONDE As Byte ; Variabele seconde
Dim MINUUT As Byte ; Variabele minuut
Dim UUR As Byte ; Variabele uur
Dim WEEKDAG As Byte ; Variabele weekdag
Dim DAG As Byte ; Variabele dag
Dim MAAND As Byte ; Variabele maand
Dim JAAR As Byte ; Variabele jaar
Dim DUMMY As Byte ; Variabele dummy
Dim MODE As Byte ; Variabele mode
Dim X As Word ; Variabele puls teller
Cls ; Wis display
DelayMS 500 ; Pauze 0.5 sec
Clear ; Wis geheugen
;543210 ; Hulpregel poort A
PORTA = %000000 ; Maak poort A laag
TRISA = %111111 ; Poort_A I/O
;543210 ; Hulpregel poort B
PORTB = %000000 ; Maak poort B laag
TRISB = %000000 ; Poort_B I/O
;76543210 ; Hulpregel poort C
PORTC = %00000000 ; Maak poort C laag
TRISC = %00000000 ; Poort_C I/O
;76543210 ; Hulpregel poort D
PORTD = %00000000 ; Maak poort D laag
TRISD = %00000000 ; Poort_D I/O
;210 ; Hulpregel poort E
PORTE = %000 ; Maak poort E laag
TRISE = %000 ; Poort_E I/O
;------------------------------------
; LEZEN EN SCHRIJVEN NAAR DE DS1307.
;------------------------------------
BStart ; Bus start
BusIn %11010001,0,[SECONDE] ; Lees seconde + bit7 (is osc. aan/uit)
DelayMS 10 ; Wacht 10ms
Clear SECONDE.7 ; Zet oscillator aan
BusOut %11010000,[SECONDE] ; Schrijf naar rtc
DelayMS 10 ; Wacht 10ms
BusIn %11010001,2,[UUR] ; Lees uur
DelayMS 10 ; Wacht 10ms
Clear UUR.6 ; Select 24 uur klok
BusOut %11010000,2,[UUR] ; Schrijf naar rtc
BStop ; Bus stop
;-----------------------------------------------
; PROGRAMMA BESTURING ZELFBOUW KLOK MET DS1307.
;-----------------------------------------------
ENABLE_DRIVER = 1
PULS_DRIVER = 0
DIR_DRIVER = 1
;-------------------------
; LEES RTC ALS MODE 0 IS.
;-------------------------
RUN:
If MODE = 0 Then
BStart
BusIn %11010001,0,[SECONDE,MINUUT,UUR,WEEKDAG,DAG,MAAND,JAAR]
BStop
DUMMY = SECONDE & %01110000
GoSub BEREKEN_WAARDE
SECONDE = SECONDE & %00001111
SECONDE = SECONDE + DUMMY
DUMMY = MINUUT & %11110000
GoSub BEREKEN_WAARDE
MINUUT = MINUUT & %00001111
MINUUT = MINUUT + DUMMY
DUMMY = UUR & %00110000
GoSub BEREKEN_WAARDE
UUR = UUR & %00001111
UUR = UUR + DUMMY
DUMMY = DAG & %11110000
GoSub BEREKEN_WAARDE
DAG = DAG & %00001111
DAG = DAG + DUMMY
DUMMY = MAAND & %11110000
GoSub BEREKEN_WAARDE
MAAND = MAAND & %00001111
MAAND = MAAND + DUMMY
DUMMY = JAAR & %11110000
GoSub BEREKEN_WAARDE
JAAR = JAAR & %00001111
JAAR = JAAR + DUMMY
End If
;--------------------------------------------------------
; PRINT TEKST, UUR, MINUUT, SECONDE, DAG, MAAND EN JAAR.
;--------------------------------------------------------
Print At 1,1,"STOLPKLOK"
Print At 2,1,"H.v.Z. PRODUCT"
Print At 3,1,"TIJD:",Dec2 UUR,":",Dec2 MINUUT,":",Dec2 SECONDE
Print At 4,1,"DATUM:",Dec2 DAG,"-",Dec2 MAAND,"-20",Dec2 JAAR
;-----------------------------------------------------------
; UREN, MINUTEN, SECONDEN, DAG, MAAND EN JAAR GELIJKZETTEN.
;-----------------------------------------------------------
If MODE_KNOP = 1 Then
DelayMS 10
Inc MODE
If MODE > 6 Then
MODE = 0
GoSub SCHRIJF_RTC
End If
Repeat
Until MODE_KNOP = 0
End If
;--------------------
; DAG GELIJK ZETTEN.
;--------------------
If MODE > 0 Then
DelayMS 300
Select Case MODE
Case 1
Print At 4,7," "
DelayMS 300
If KNOP_OP = 1 Then
DelayMS 10
Inc DAG
If DAG > 31 Then
DAG = 1
EndIf
EndIf
If KNOP_NEER = 1 Then
DelayMS 10
Dec DAG
If DAG < 1 Then
DAG = 31
EndIf
EndIf
;----------------------
; MAAND GELIJK ZETTEN.
;----------------------
Case 2
Print At 4,10," "
DelayMS 300
If KNOP_OP = 1 Then
DelayMS 10
Inc MAAND
If MAAND > 12 Then
MAAND = 1
EndIf
EndIf
If KNOP_NEER = 1 Then
DelayMS 10
Dec MAAND
If MAAND < 1 Then
MAAND = 12
EndIf
EndIf
;---------------------
; JAAR GELIJK ZETTEN.
;---------------------
Case 3
Print At 4,15," "
DelayMS 300
If KNOP_OP = 1 Then
DelayMS 10
Inc JAAR
If JAAR > 99 Then
JAAR = 0
EndIf
EndIf
If KNOP_NEER = 1 Then
DelayMS 10
Dec JAAR
If JAAR < 1 Then
JAAR = 99
EndIf
EndIf
;--------------------
; UUR GELIJK ZETTEN.
;--------------------
Case 4
Print At 3,6," "
DelayMS 300
If KNOP_OP = 1 Then
DelayMS 10
Inc UUR
If UUR > 23 Then
UUR = 0
End If
End If
If KNOP_NEER = 1 Then
DelayMS 10
Dec UUR
If UUR > 254 Then
UUR = 23
End If
End If
;-----------------------
; MINUUT GELIJK ZETTEN.
;-----------------------
Case 5
Print At 3,9," "
DelayMS 300
If KNOP_OP = 1 Then
DelayMS 10
Inc MINUUT
If MINUUT > 59 Then
MINUUT = 0
End If
End If
If KNOP_NEER = 1 Then
DelayMS 10
Dec MINUUT
If MINUUT > 254 Then
MINUUT = 59
End If
End If
;------------------------
; SECONDE OP NUL ZETTEN.
;------------------------
Case 6
Print At 3,12," "
DelayMS 300
If KNOP_OP = 1 Or KNOP_NEER = 1 Then
DelayMS 10
SECONDE = 0
End If
End Select
End If
;##################################
;--------------------------------
; HIER DE REST VAN HET PROGRAMMA.
;--------------------------------
;##################################
;-----------------------------------------
; ALS WAAR GA DAN NAAR WIJZER VERDRAAIEN.
; ALS WAAR GA DAN NAAR KLOK GELIJKZETTEN.
; IEDERE SECONDEN KNIPPERT DE LED.
;-----------------------------------------
ENABLE_DRIVER = 1
If SECONDE = 59 Then
GoSub VERDRAAIEN
EndIf
If GELIJK_ZETTEN = 1 Then
GoSub KLOK_GELIJK_ZETTEN
EndIf
SECONDE_LED = ~SECONDE
GoTo RUN
;----------------------------
; WAARDE BEREKENEN VOOR RTC.
;----------------------------
BEREKEN_WAARDE:
DUMMY = (DUMMY/16)*10
Return
;--------------------------
; SCHRIJF WAARDE NAAR RTC.
;--------------------------
SCHRIJF_RTC:
DUMMY = SECONDE / 10
DUMMY = DUMMY * 16
SECONDE = SECONDE // 10
SECONDE = SECONDE | DUMMY
DUMMY = MINUUT / 10
DUMMY = DUMMY * 16
MINUUT = MINUUT // 10
MINUUT = MINUUT | DUMMY
DUMMY = UUR / 10
DUMMY = DUMMY * 16
UUR = UUR // 10
UUR = UUR | DUMMY
DUMMY = DAG / 10
DUMMY = DUMMY * 16
DAG = DAG // 10
DAG = DAG | DUMMY
DUMMY = MAAND / 10
DUMMY = DUMMY * 16
MAAND = MAAND // 10
MAAND = MAAND | DUMMY
DUMMY = JAAR / 10
DUMMY = DUMMY * 16
JAAR = JAAR // 10
JAAR = JAAR | DUMMY
BStart
BusOut %11010000,0,[SECONDE,MINUUT,UUR,WEEKDAG,DAG,MAAND,JAAR]
BStop
Return
;-----------------------------
; WIJZER 1 MINUUT VERDRAAIEN.
;-----------------------------
VERDRAAIEN:
ENABLE_DRIVER = 0
DIR_DRIVER = 1
For X = 1 To STAP_WAARDE Step 1
PULS_DRIVER = 1
DelayUS FREQUENTIE
PULS_DRIVER = 0
DelayUS FREQUENTIE
Next X
Return
GoTo VERDRAAIEN
;------------------------------
; KLOK HANDMATIG GELIJKZETTEN.
;------------------------------
KLOK_GELIJK_ZETTEN:
ENABLE_DRIVER = 0
DIR_DRIVER = 1
If GELIJK_ZETTEN = 1 Then
PULS_DRIVER = 1
DelayUS FREQ_GELIJK_ZETTEN
PULS_DRIVER = 0
DelayUS FREQ_GELIJK_ZETTEN
EndIf
If GELIJK_ZETTEN = 0 Then
Return
EndIf
GoTo KLOK_GELIJK_ZETTEN
End
Zoals je boven in het programma kunt zien staat de stapwaarde op 3200 stappen per minuut, zoals we uitgerekend hadden in het begin. De RTC werkt via het I²C protocol.
Daaronder staat hoe de klok gelijk gezet kan worden, dat staat onder Case 1
tot en met Case 6
. Dan krijgen we het stukje waar iedere seconde de wijzer één minuut moet verdraaien.
Dan hebben we nog de drukknop voor het gelijk zetten of het verdraaien van de wijzer. En helemaal bovenaan staan de printopdrachten voor het display, voor de rest is het programma alleen om de RTC uit te lezen, dat is de meeste code.
Voor de rest moet je het programma maar eens rustig doorlopen, daar moet wel uit te komen zijn lijkt mij.
Hieronder zie je de klok gemonteerd.
Op de minutenwijzer staat ook nog een wereldbol, die draait met de minuten mee. Had eigenlijk met de uren gemoeten, maar dan had ik zoveel moeten aanpassen en dat ging helaas niet meer. Misschien zet ik daar nog eens iets anders op.
Misschien zijn er meer mensen die zoiets willen gaan maken. En ook al heb je geen draaibank en freesbank tot je beschikking, met een boormachine en een decoupeerzaag en figuurzaag kom je een heel eind. De assen en de lagers kun je ook in de meeste modelbouwzaken kopen en de tandwielen ook. Dus dat moet het probleem niet zijn.
Dit artikel is geschreven door Lambiek.