Editing PIC based Stepper Motor Dancing Analog Clock

Jump to navigation Jump to search

Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.

The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then save the changes below to finish undoing the edit.

Latest revision Your text
Line 9: Line 9:
  
 
This is an analog clock, with real hands driven by stepper motors.  A clock for the confused dyslexics amoung us, for more informatinon on Dyslexia see DAM ( Mothers Against  Dyslexia ). Because stepper motors are quite powerful the clock could be made quite large, 3 feet in diameter is probably within reach still using inexpensive ( salvage ) stepper motors.  The project description includes eagle files for the circuits and a BoostC project with source code for the PIC.
 
This is an analog clock, with real hands driven by stepper motors.  A clock for the confused dyslexics amoung us, for more informatinon on Dyslexia see DAM ( Mothers Against  Dyslexia ). Because stepper motors are quite powerful the clock could be made quite large, 3 feet in diameter is probably within reach still using inexpensive ( salvage ) stepper motors.  The project description includes eagle files for the circuits and a BoostC project with source code for the PIC.
 
 
News:
 
* May '09  C code was missing from archive, this has been fixed.
 
 
* Comming Soon:  I have a second physical version of the clock that looks much nicer, including real clock hands.  Code has been improved a lot as well.  ( code updated in new download below )
 
  
 
[[Image:ClockFace.png  | Clock Face ]]
 
[[Image:ClockFace.png  | Clock Face ]]
Line 22: Line 16:
 
*2 Stepper Motors -- probably can be salvaged from printers or 5 1/4 disk drives ( where I got mine )
 
*2 Stepper Motors -- probably can be salvaged from printers or 5 1/4 disk drives ( where I got mine )
 
*PIC16F877 processor  -- Others can be used, but this guy has a lot of IO, quite a bit is used for the clock
 
*PIC16F877 processor  -- Others can be used, but this guy has a lot of IO, quite a bit is used for the clock
*Low side Driver Chip -- but any transistors with reasonable beta and enough current handling capacity could be substuited.
+
*Low sid Driver Chip -- but any transistors with reasonable beta and enough current handling capacity could be substuited.
 
*Case -- With a bit more work than I have done you could have a really nice case.  I am working on an oak one now
 
*Case -- With a bit more work than I have done you could have a really nice case.  I am working on an oak one now
 
*Clock Face --  Some good artwork here could make a really good looking clock, anyone willing to send me an high quality graphics file?
 
*Clock Face --  Some good artwork here could make a really good looking clock, anyone willing to send me an high quality graphics file?
 
*Circuit Board --  Right now mine is built mostly on a proto board, but I have designed but not tested printed circuit boards suitable for single sided, toner transfer, fabrication.
 
*Circuit Board --  Right now mine is built mostly on a proto board, but I have designed but not tested printed circuit boards suitable for single sided, toner transfer, fabrication.
 +
  
 
=== What it Looks Like ===  
 
=== What it Looks Like ===  
Line 371: Line 366:
  
 
=== Program ===
 
=== Program ===
 
==== Overview ====
 
  
 
Nothing very fancy here.  The 60 Hz input is fed to the port x interrupt.  This lets the PIC keep time.  The hands are not moved during the interrupt instead flags requesting hand movement are set and the main loop moves the hands.
 
Nothing very fancy here.  The 60 Hz input is fed to the port x interrupt.  This lets the PIC keep time.  The hands are not moved during the interrupt instead flags requesting hand movement are set and the main loop moves the hands.
Line 378: Line 371:
 
Invalid states for the mode can easily happen with a rotory switch when the wiper is not fully in position.  Because of this not all possible states on the mode input are used.
 
Invalid states for the mode can easily happen with a rotory switch when the wiper is not fully in position.  Because of this not all possible states on the mode input are used.
  
The stepper control is half step.  The activation of the coils is determined by an array which hold the 8 different activations of the coils.  My stepper motor has 200 full steps ( 400 half steps ) per revolution.  You should be able to adjust the code for different steppers. Much of the steppeer code is very similiar to that in [[Stepper Motor Tester]] which may or may not have a better explanation of the code which drives the stepper motor.
+
The stepper control is half step.  The activation of the coils is determined by an array which hold the 8 different activations of the coils.  My stepper motor has 200 full steps ( 400 half steps ) per revolution.  You should be able to adjust the code for different steppers.
 +
 
  
 
For the serial interface code see [[Serial Communications Library -- BoostC and 16F877A]]
 
For the serial interface code see [[Serial Communications Library -- BoostC and 16F877A]]
  
I have tried to have pretty good comments in the code, any comments on the comments ( helpfull one please ) let me know.
+
==== Compiling ====
 +
The zip file contains the entire source bootst project.  Unzip into a directory and open in source boost.  Set the target to 16F877A and change the linker options ( Settings -> options -> linker  "-v  -swcs 6 2" ) My compiler reports something like:
  
==== Compiling ====
+
Memory Usage Report
The zip file contains the entire source bootst project.  Unzip into a directory and open in source boost.  There are some additional notes at the top of the main source file.  Follow the instructions there, they will tell you about any compiler and/or linker options, and report on memory usage from a recent compile of mine.  The compile should run without error. 
 
  
If you do not wish to compile you can use the precompiled hex version also included in the zip archive.
+
*RAM available:368 bytes, used:154 bytes (41.9%), free:214 bytes (58.1%),
 +
*Heap size:214 bytes, Heap max single alloc:95 bytes
 +
*ROM available:8192 words, used:4156 words (50.8%), free:4036 words (49.2%)
  
 
=== Building the Clock ===
 
=== Building the Clock ===
Line 402: Line 398:
 
=== Running the Clock ===
 
=== Running the Clock ===
  
==== Without the Serial Interface ====
+
Before plugging it in set the hands to 12 oclock and and 0 minutes ( if the hands are accessable ).
  
*Before plugging it in set the hands to 12 oclock and and 0 minutes ( if the hands are accessable, else skip this ).
+
Plug in.  The hands should spin a bit and then stop.  The clock will be set to 12:00 and will immediately start running.  But the hands may not be initialized or adjusted to the correct zero positions.  To adjust them change the mode switch to Adj Hour Hand  and manipulate the up down switch untill the hour hand moves to 12:00 ( this does not change the internal time of the clock ), switch to Adj Minute Hand
  
*Plug in.  The hands should spin a bit and then stop. 
+
If you are using the serial interface: ( to use the serial interface you will need a cable, and perhaps a level shifter (( the Stepper Tester [[Stepper Motor Tester]] has a max232 level shifter, this circuit does not, you can get a level shifter as a seperate component or even built into a cable )) )
  
*The clock will be set to 12:00 and will immediately start running.  But the hands may not be initialized or adjusted to the correct zero positions.  To adjust them change the mode switch to Adj Hour Hand  and manipulate the up down switch untill the hour hand moves to 12:00 ( this does not change the internal time of the clock ), switch to Adj Minute Hand and adjust it to 0 minutes.
+
Enter the serial mode by connecting a 9600 8n1 with a terminal emulator see [[PC-Microcontroller Communications#Serial_Communications_from_a_PC_to_Microcontrollers]]
  
*Switch the clock back to run, the hands may move a bit, the time is very near 12:00 ( unless it took you a long time to adjust the hands ).
+
The clock should send debugging information about once a minute ( maybe ).  It will also inform you of the changing of modes with the mode switch.
 
 
*Switch to set hour to set the correct hour.
 
  
*Switch to set minute to set the correct minute.
+
Then send an ! to the clock, the clock should respond with "Stopped; turn on serial mode"
  
*Switch to run and enjoy.
+
Command table
  
==== With the Serial Interface ====
 
  
This interface is not necessary but can be very useful for playing around with the clock, or debugging new version of the code.
 
To use the serial interface you will need a cable, and perhaps a level shifter ( the Stepper Tester [[Stepper Motor Tester]] has a max232 level shifter, this circuit does not, you can get a level shifter as a seperate component or even built into a cable ).  You will also need a serial terminal, generally a program for your PC.  For information on a good terminal program see [[PC-Microcontroller Communications#Serial_Communications_from_a_PC_to_Microcontrollers]]
 
 
Notes on terminal program set up.
 
 
*Baud rate should be 19.2K 8N1
 
*Most terminal programs can be set to treat a carriage return as a carriage return line feed. Do it.
 
Some terminal programs will not transmit in lower case ( all our commands are lower case ) unless specially set to do so. Set it to allow lower case.
 
 
The clock should send debugging information about once a minute ( maybe ).  It will also inform you of the changing of modes with the mode switch.
 
 
Then send an ! to the clock, the clock should respond with "Stopped; turn on serial mode" and you can then use the commands in the following table.
 
 
Command table:
 
  
 
{| class="wikitable"
 
{| class="wikitable"
Line 446: Line 425:
 
|-valign="top"
 
|-valign="top"
 
|Hn<cr>
 
|Hn<cr>
|set clock to hour n ( n is one or two digits ) and move the hands, but no dancing.
+
|set clock to hour n ( n is one or two digits ) and move the hands
 
<!-------------------------------->
 
<!-------------------------------->
 
|-valign="top"
 
|-valign="top"
 
|Mn<cr>
 
|Mn<cr>
|set clock to minute n ( n is one or two digits ) and move the hands, but no dancing.
+
|set clock to minute n ( n is one or two digits ) and move the hands
 
<!-------------------------------->
 
<!-------------------------------->
 
|-valign="top"
 
|-valign="top"
 
|R<cr>
 
|R<cr>
 
|Report on clock status
 
|Report on clock status
<!-------------------------------->
 
|-valign="top"
 
|Dn<cr>
 
|Dance the clock to hour n ( n is one or two digits ).  Only move thg hour hand.  Use to review debug the dance.
 
<!-------------------------------->
 
|-valign="top"
 
|A<cr>
 
|Adjust the hands to their 0 positions ( 12:00 ).  If they are not correctly line up use the J and Y commands below
 
<!-------------------------------->
 
|-valign="top"
 
|Yn<cr>
 
|( Y is above the H ) adjust the hour hand by an amount n, where n is a signed number from about -100 to 100.
 
<!-------------------------------->
 
|-valign="top"
 
|Jn<cr>
 
|( J is above the M ) adjust the minute hand by an amount n, where n is a signed number from about -100 to 100.
 
<!--------------------------------
 
|-valign="top"
 
|<cr>
 
|
 
<!--------------------------------
 
|-valign="top"
 
|<cr>
 
|
 
<!--------------------------------
 
|-valign="top"
 
|<cr>
 
|
 
 
<!-------------------------------->
 
<!-------------------------------->
 
|-valign="top"
 
|-valign="top"
Line 521: Line 472:
  
 
=== Download ===
 
=== Download ===
Note there may be a serious error in the schematic for the clock board.  You can jumper around it if you have already made the board, else wait for version X. ( may be fixed in version 2 below, but I need to check. )
+
 
Download includes the boostc project ( .c, .h, and ._c files ) some of the graphics, movie, and eagle files [http://home.comcast.net/~russ_hensel/OC/DDClock/DDClock_v2.zip Download Version 2] Questions? email me until then see [[russ_hensel]]
+
Here is a location for some of the graphics, movie, and eagle files [http://home.comcast.net/~russ_hensel/OC/DClock/DClock_v1.zip Download Version 1] More comming, email me until then see [[russ_hensel]]
  
 
=== Comment, Questions, Contributions? ===
 
=== Comment, Questions, Contributions? ===
  
 
Email me [[russ_hensel]], or use the talk page for this topic.  All feedback is welcome.
 
Email me [[russ_hensel]], or use the talk page for this topic.  All feedback is welcome.
 
[[category:projects]][[category:Serial Communications]][[category:Microcontroller]][[category:PIC]]
 
[[category: clock]]
 

Please note that all contributions to OpenCircuits may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see OpenCircuits:Copyrights for details). Do not submit copyrighted work without permission!

Cancel Editing help (opens in new window)