Custom Tattoo Machine Power Supply (2024)

Things used in this project

Hardware components

Microchip pic16f88
×1
Maxim Integrated DS1868
×1
Texas Instruments INA138
×1
Custom Tattoo Machine Power Supply (1)
555 Timers
×1
Custom Tattoo Machine Power Supply (2)
Linear Regulator with Adjustable Output
×1

Story

When a tattoo artist friend of mine and I were talking about some of the things she wish her tattoo machine power supply did, and some of the things she wish it could do, that sparked an idea to custom build her one.

The way a tattoo machine power supply works is that it provides a DC voltage to a tattoo machine which is essentially an electromagnet that turns on and off rapidly. I explained it thoroughly in a video I created for this project:

The artist I was making this for was complaining that when she needs to tattoo multiple colors, she needed to have multiple machines on the go, all mechanically tuned different from each other. Current power supplies offered would only have one output (some would have multiple settings, but she wanted separate physical outputs). She also disliked the fact that most power supplies forced you to use a foot pedal to turn the machine on or off. And lastly she also wanted to be able to listen to music while tattooing someone, so she wanted a bluetooth speaker.

So the machine I built her, got rid of the pedal, replacing it with a large push button on the top of the unit. I also added multiple outputs, and a bluetooth speaker to it.

I learned a lot about making from panels in this project. I ended up making the front panel using plexyglass. I painted the back of it black and used a cnc mill to mill the image in reverse and filled it in with white paint. This ended up working great. If you want more info on this unit visit my web page at https://www.MRelectronics.net/tattoopowersupply

Read more

Schematics

Main Schematic

This is the main controller board for the tattoo power supply. A pic16F88 is at the heart of it.

File missing, please reupload.

Main Board Schematic

Designed in eagle

Custom Tattoo Machine Power Supply (3)

Code

  • Tattoo machine power supply code

Tattoo machine power supply code

C/C++

'****************************************************************'* Name : UNTITLED.BAS *'* Author : Matthew Reid *'* Notice : Copyright (c) 2013 [select VIEW...EDITOR OPTIONS] *'* : All Rights Reserved *'* Date : 9/14/2013 *'* Version : 1.0 *'* Notes : *'* : external oscillator *'****************************************************************include "modedefs.bas"#CONFIG__config _CONFIG1, _EXTCLK & _WDT_OFF & _MCLR_OFF & _BODEN_OFF & _LVP_OFF#ENDCONFIGtrisb = %10101001trisa = %11000011OSCCON = %00001000CMCON = $07' disable comparatorsANSEL = %00000001 '--------a to d stuff---------------Define ADC_BITS 10 ' Set number of bits in result Define ADC_CLOCK 3 ' Set clock source (3=rc) Define ADC_SAMPLEUS 50 ' Set sampling time in uS adval Var Wordcounter var byte: counter = 0ADCON0.7 = 1 '------------------------ '-------------- digi pot stuffplus var porta.6minus var porta.1Rst var porta.4:Rst = 0clk var porta.3:Clk=0 dq var porta.2:Dq=0I var byte Wiper0 var byteWiper1 var bytech1_pot var bytech2_pot var byte 'read eeprom previously saved valuesread 5, ch1_potread 6, ch2_pot'150 = 10.21 volts , 50 = 4.27Wiper0= 50Wiper1=50'-----------------------------Define OSC 16'vout input to microvout var portb.5'channel change stuffch1 var portb.1: ch1 =1ch2 var portb.2: ch2=0sel var portb.0current_channel var bit'read current channel from eepromread 7, current_channellast var bit'timing measurement variablespulsehigh var wordpulsehigh1 var wordpulselow var wordpulselow1 var wordduty var wordfreq var word: freq = 100dummy var wordsignalinput var portb.3t1on var t1con.0gosub intro_screengosub cleartimergosub set_potmainloop: 'minus 2 to wiper variable by pressing plusif minus = 0 then 'checks which channel unit is currently on if current_channel = 0 then 'keep integer from rolling over if ch1_pot>5 then ch1_pot= ch1_pot -2 endif else if ch2_pot>5 then ch2_pot= ch2_pot -2 endif endif 'write values into eeprom write 5, ch1_pot write 6, ch2_potendif 'add 1 to wiper variable by pressing plusif plus = 0 then if current_channel = 0 then 'keep integer from rolling over if ch1_pot<250 then ch1_pot= ch1_pot +2 endif else if ch2_pot<250 then ch2_pot= ch2_pot +2 endif endif 'write values into eeprom write 5, ch1_pot write 6, ch2_potendifgosub set_pot'the following code waits for a square wave, it is set up so if the vout is 'on, and all the buttons are untouched it will properly get square wave, 'other wise it exits while loop. pressing plus or minus exits the loopwhile signalinput=1 && vout=1 && plus = 1 && minus = 1 : wendwhile signalinput=0 && vout=1 && plus = 1 && minus = 1 : wendt1on=1while signalinput=1 && vout=1 && plus = 1 && minus = 1 : wendt1on=0 pulsehigh.highbyte=tmr1hpulsehigh.lowbyte=tmr1lpulsehigh= pulsehigh/4gosub cleartimerwhile signalinput=0 && vout=1 && plus = 1 && minus = 1 : wendwhile signalinput=1&& vout=1 && plus = 1 && minus = 1 : wendt1on=1while signalinput=0 && vout=1 && plus = 1 && minus = 1 : wendt1on=0 pulselow.highbyte=tmr1hpulselow.lowbyte=tmr1lpulselow= pulselow/4gosub cleartimer'if there is power display duty and freq, if not display zeroif vout=1 then if plus = 1 && minus = 1 then 'need this otherwise freq and duty are set incorrectly pulsehigh1=pulsehigh/100 pulselow1=pulselow/100 duty=pulsehigh/(pulselow1+pulsehigh1) freq= 10000/(((pulselow+pulsehigh)/100)) endifelseduty=0freq=0endif 'only updates LCD every 6 loops to allow for smoother displayif counter = 6 then serout PORTB.4,N9600,[$fe,$c0] 'put curser on second line serout PORTB.4,N9600,[#freq, " CPS "]  serout PORTB.4,N9600,[$fe,$c8]  serout PORTB.4,N9600,["Duty ",#duty,"% "]    gosub get_ad  if current_channel = 0 then serout PORTB.4,N9600,[$fe,$80]  serout PORTB.4,N9600,["CH 1"]  ch1=1 ch2=0 else serout PORTB.4,N9600,[$fe,$80]  serout PORTB.4,N9600,["CH 2"]  ch1=0 ch2=1 endif    counter = 0  elsecounter = counter + 1endifgosub set_channelGoto mainloop cleartimer:tmr1l = 0tmr1h = 0returnset_channel: 'make sure power is off before switching banksif vout=0 then 'push button has pull ups, checks for high to low transition if sel = 0 && last= 1 then current_channel= ~current_channel 'read current channel from eeprom write 7, current_channel endif last = selendifreturnget_ad:ADCIN 0, adval adval=adval*4286dummy= div32 10000dummy= dummy+129serout PORTB.4,N9600,[$fe,$86]serout PORTB.4,N9600,[#(dummy/1000),".", #((dummy//1000)/10)]serout PORTB.4,N9600,[$fe,$8a]serout PORTB.4,N9600,[" VOLTS "] counter = 0  returnintro_screen:'intro screenpause 1000serout PORTB.4,N9600,[$fe,$1] 'clear everythingserout PORTB.4,N9600,[$1b,$2a,255] ' set LCD backlightserout PORTB.4,N9600,[$fe,$1] serout PORTB.4,N9600,[" BLAKE WOOD "] serout PORTB.4,N9600,[$fe,$c0] serout PORTB.4,N9600,[" INK "] pause 500serout PORTB.4,N9600,[$fe,$80] serout PORTB.4,N9600,["* BLAKE WOOD *"] serout PORTB.4,N9600,[$fe,$c0] serout PORTB.4,N9600,["* INK *"] pause 500serout PORTB.4,N9600,[$fe,$80] serout PORTB.4,N9600,["** BLAKE WOOD **"] serout PORTB.4,N9600,[$fe,$c0] serout PORTB.4,N9600,["** INK **"] pause 500serout PORTB.4,N9600,[$fe,$80] serout PORTB.4,N9600,["***BLAKE WOOD***"] serout PORTB.4,N9600,[$fe,$c0] serout PORTB.4,N9600,["*** INK ****"] pause 500serout PORTB.4,N9600,[$fe,$80] serout PORTB.4,N9600,["***BLAKE WOOD***"] serout PORTB.4,N9600,[$fe,$c0] serout PORTB.4,N9600,["**** INK *****"] pause 500serout PORTB.4,N9600,[$fe,$80] serout PORTB.4,N9600,["***BLAKE WOOD***"] serout PORTB.4,N9600,[$fe,$c0] serout PORTB.4,N9600,["***** INK ******"] pause 500serout PORTB.4,N9600,[$fe,$80] serout PORTB.4,N9600,["***BLAKE WOOD***"] serout PORTB.4,N9600,[$fe,$c0] serout PORTB.4,N9600,["******INK *******"] pause 500serout PORTB.4,N9600,[$fe,$80] serout PORTB.4,N9600,["***BLAKE WOOD***"] serout PORTB.4,N9600,[$fe,$c0] serout PORTB.4,N9600,["******INK********"] pause 500serout PORTB.4,N9600,[$fe,$1] returnset_pot:if current_channel = 0 thenwiper1= ch1_potelsewiper1=ch2_potendif pause 1 'start transition Rst = 1 pause 1  'stack select Dq=1 pause 1 Clk=1 pause 1 Clk=0 pause 1 'first wiper  For i = 0 to 7  'dq= ~dq Dq=wiper0.7 'wiper0 = wiper0<<1  if i = 0 then dq = wiper0.7 elseif i = 1 then  dq = wiper0.6 elseif i = 2 then  dq = wiper0.5 elseif i = 3 then  dq = wiper0.4 elseif i = 4 then  dq = wiper0.3 elseif i = 5 then  dq = wiper0.2 elseif i = 6 then  dq = wiper0.1 else  dq = wiper0.0 endif  Clk=1 pause 1 Clk=0 pause 1 Next i 'second wiper For i = 0 to 7   if i = 0 then dq = wiper1.7 elseif i = 1 then  dq = wiper1.6 elseif i = 2 then  dq = wiper1.5 elseif i = 3 then  dq = wiper1.4 elseif i = 4 then  dq = wiper1.3 elseif i = 5 then  dq = wiper1.2 elseif i = 6 then  dq = wiper1.1 else  dq = wiper1.0 endif  Clk=1 pause 1 Clk=0 pause 1 Next i  'end transition and set resistance Rst = 0 pause 1return

Credits

Matt Reid

2 projects • 4 followers

I make electronics! Based in Toronto Canadawww.MRelectronics.net

Comments

Custom Tattoo Machine Power Supply (2024)
Top Articles
Latest Posts
Recommended Articles
Article information

Author: Tuan Roob DDS

Last Updated:

Views: 6181

Rating: 4.1 / 5 (42 voted)

Reviews: 89% of readers found this page helpful

Author information

Name: Tuan Roob DDS

Birthday: 1999-11-20

Address: Suite 592 642 Pfannerstill Island, South Keila, LA 74970-3076

Phone: +9617721773649

Job: Marketing Producer

Hobby: Skydiving, Flag Football, Knitting, Running, Lego building, Hunting, Juggling

Introduction: My name is Tuan Roob DDS, I am a friendly, good, energetic, faithful, fantastic, gentle, enchanting person who loves writing and wants to share my knowledge and understanding with you.