3D Printed Animated Dalek

Rick100

Senior Member
This might not be considered a robot project but it's close. It is a 3D printed Dalek that plays sound bites and animates it arms and head while it plays them. A button press triggers the sound bite. The lights also blink periodically . It is controlled by a Picaxe 14M2. The sound is from a DV-SV17F sound module. I learned about the sound module on this forum from erco. My code is derived from his example code. I also used his leds across the speaker output idea for a modulated lighting effect. Thanks erco. The motor is turned on and off through a mosfet. It is powered by 3 AA batteries. The project has 4 leds. Two 3mm leds wired in series are blinked periodically by the Picaxe. Two other 1206 SMD leds are modulated from the speaker output. One SMD led and one 3mm led are glued into each of the little lights in the dome. It's a hack but I like the effect. The SMD parts were used because of limited room in the lights on top the head. The project started when a friend asked if I could make a Dalek with blinking lights.

I designed the circuit board in EasyEDA Pro which is free. I made the circuit board on my 3018 CNC using isolation routing. All the files are on Thingiverse including zip files that hold the EasyeEDA design file and Gerber files.

Here is a link to the Youtube video of build:

Here is a shorter demo video:

I muted the sound when the sound bites are playing because of copyright concerns. I didn't mute the sound on a couple of earlier videos on building it if you want to know what it sounds like.

All the files are on Thingiverse but I'll post the code and schematic here.
SCH_Schematic1_1-P1_2025-07-12.png


Rich (BB code):
'Dalek Picaxe program

'DY-SV17F MP3Player


#Picaxe 14M2
#no_data

symbol TX        = C.4           ;transmit commands to player leg 3
symbol BUSY_PIN  = pinB.1        ;busy pin from player leg 12

symbol MOTOR_POWER = C.1         ;leg 6

symbol PUSH_Button = pinB.2         ;the push button switch leg 11
symbol HEAD_LEDS = B.5           ;leds on head leg 8



symbol BAUD_FREQ = M8
symbol BAUD      = T9600_8    ;baud rate for dfplayer

symbol FILES_COUNT = 24

symbol FLASH_RATE = 30

symbol arg       = w1            ;b3:b2
symbol arg.lsb   = b2
symbol arg.msb   = b3

symbol checksum = w2             ;b5:b4
symbol checksum.lsb = b4

symbol counter   = b6
symbol led_interval = b7

   pullup %00011100  'enable pullup on B.4 , B.3 , B.2 for pb switch
   low MOTOR_POWER   'make pin output and turn off power to player
   

   gosub setUpPlayer
   arg = 1
   gosub playFile 'play file 1 on startup

   if PUSH_BUTTON = 0 then 'if button is held down at power on then play all the files
      gosub playAll
      endif

   counter = 1
   led_interval = 0
main:    'main loop for checking push button and playing file
   do while PUSH_BUTTON = 1   'wait in this loop for button press
      if led_interval = FLASH_RATE then
         low HEAD_LEDS  'leds on
         led_interval = 0
      endif
      inc led_interval
      nap 3 'save power for 144 mSeconds
      high HEAD_LEDS 'leds off
   loop
   
   arg = counter
   gosub motorOn
   gosub playfile
   gosub motorOff
   inc counter
   if counter > FILES_COUNT then
      counter = 1 'reset the counter
      endif
   goto main
   
playAll:
   for counter = 1 to Files_COUNT
      arg = counter
      gosub playFile
      pause 2000
      next
   pause 1000
   return

'----------------------subroutines----------------------
motorOn:
   high MOTOR_POWER
   return
motorOff:
   low MOTOR_POWER
   return

setUpPlayer:
   setFreq BAUD_FREQ
   pause 10
   serout TX,BAUD,($AA,$1A,$01,$02,$C7)'SET eq 2 ROCK loudest
   gosub waitBusy
   serout TX,BAUD,($AA,$13,$01,30,$DC )' volume 30
   gosub waitBusy
   setFreq MDEFAULT
   return

playFile:
   ; play the file in arg
   ; the checksum is the 8 lowest bits of 5 bytes
   checksum = $AA + $07 + $02 + arg.msb + arg.lsb  ;add the bytes that make up the checksum
   setFreq BAUD_FREQ
   pause 10
   serOut TX, BAUD, ( $AA, $07, $02,arg.msb, arg.lsb, checksum.lsb )
   arg = 0
   gosub waitBusy
   setFreq MDEFAULT
   return
 waitBusy:
   pause 500   ; give time for busy pin to be valid
   do While BUSY_PIN = 1   ' busy pin is high when playing
      pause 100
      loop
   return
 
Last edited:
Back
Top