Advertisement
LeskoIam

Stepper Control

Feb 14th, 2014
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.14 KB | None | 0 0
  1. ## File: RealStepper03.py
  2. ## Date Of Creation: in 2010
  3. ## Author: ****************
  4. ## Version: 0.3
  5.  
  6. import time
  7. import os
  8.  
  9. class Stepper():
  10.     """Basic stepper motor control functions"""
  11.    
  12.     def __init__(self, port):
  13.         ## Set Up
  14.         self.port = port
  15.         self.output = 3
  16.         self.pos = 0    ## 0-200
  17.         self.mode = None
  18.         self.port.setData(self.output)
  19.         self.mysleep(2)
  20.  
  21.     def updatePos(self, p):
  22.         self.pos = (self.pos + p)%200
  23.        
  24.     def mysleep(self, t):
  25.         """More precise sleep function"""
  26.         ts = time.clock()
  27.         while ts+t >= time.clock():
  28.             pass
  29.  
  30.     def halfStep(self, d = 0):
  31.         """Make one half step in direction d
  32.  
  33.        d .... direction (0 --> left
  34.                          1 --> right)
  35.  
  36.        """
  37.         if d == 0:
  38.             if self.output == 1:
  39.                 self.output = 3
  40.             elif self.output == 3:
  41.                 self.output = 2
  42.             elif self.output == 2:
  43.                 self.output = 6
  44.             elif self.output == 6:
  45.                 self.output = 4
  46.             elif self.output == 4:
  47.                 self.output = 12
  48.             elif self.output == 12:
  49.                 self.output = 8
  50.             elif self.output == 8:
  51.                 self.output = 9
  52.             elif self.output == 9:
  53.                 self.output = 1
  54.             else:
  55.                 print "hnnj? halfStep", self.output
  56.             self.port.setData(self.output)
  57.             self.updatePos(-0.5)
  58.         elif d == 1:
  59.             if self.output == 1:
  60.                 self.output = 9
  61.             elif self.output == 9:
  62.                 self.output = 8
  63.             elif self.output == 8:
  64.                 self.output = 12
  65.             elif self.output == 12:
  66.                 self.output = 4
  67.             elif self.output == 4:
  68.                 self.output = 6
  69.             elif self.output == 6:
  70.                 self.output = 2
  71.             elif self.output == 2:
  72.                 self.output = 3
  73.             elif self.output == 3:
  74.                 self.output = 1
  75.             else:
  76.                 print "hnnj? halfStep", self.output
  77.             self.port.setData(self.output)
  78.             self.updatePos(0.5)
  79.         else:
  80.             print "Something wrong in halfStep()"
  81.         self.mode = "half"
  82.  
  83.     def torqueStep(self, d = 0):
  84.         """Make one torque step in direction d
  85.  
  86.        d .... direction (0 --> left
  87.                          1 --> right)
  88.  
  89.        """
  90.         ## Map bits from halfStep
  91.         ## Very crude implementation
  92.         ## It only corrects to one direction
  93.         if self.output in [1,2,4,8]:
  94.             if self.output == 1:
  95.                 self.output = 3
  96.             elif self.output == 2:
  97.                 self.output = 6
  98.             elif self.output == 4:
  99.                 self.output = 12
  100.             elif self.output == 8:
  101.                 self.output = 9
  102.             self.port.setData(self.output)
  103.             self.updatePos(-0.5)
  104.         if d == 0:
  105.             if self.output == 3:
  106.                 self.output = 6
  107.             elif self.output == 6:
  108.                 self.output = 12
  109.             elif self.output == 12:
  110.                 self.output = 9
  111.             elif self.output == 9:
  112.                 self.output = 3
  113.             else:
  114.                 print "hnnj? torqueStep", self.output
  115.             self.port.setData(self.output)
  116.             self.updatePos(-1)
  117.         elif d == 1:
  118.             if self.output == 3:
  119.                 self.output = 9
  120.             elif self.output == 9:
  121.                 self.output = 12
  122.             elif self.output == 12:
  123.                 self.output = 6
  124.             elif self.output == 6:
  125.                 self.output = 3
  126.             else:
  127.                 print "hnnj? torqueStep", self.output
  128.             self.port.setData(self.output)
  129.             self.updatePos(+1)
  130.         else:
  131.             print "Something wrong in torqueStep()"
  132.         self.mode = "torque"
  133.  
  134.     def steps(self, n, step = "t", speed = 0.002):
  135.         """Make n number of steps"""
  136.         if n != 0:
  137.             if n < 0:   direction = 0
  138.             elif n > 0: direction = 1
  139.             if step == "t":
  140.                 for k in xrange(abs(n)):
  141.                     self.torqueStep(direction)
  142.                     self.mysleep(speed)
  143.             elif step == "h":
  144.                 for k in xrange(abs(n)):
  145.                     self.halfStep(direction)
  146.                     self.mysleep(speed)
  147.         else: print "Cant do zero step!"
  148.            
  149.     def toPos(self, pos, speed = 0.009):
  150.         """Go to position pos
  151.  
  152.        pos in range (0,201)
  153.        
  154.        """
  155.         a, b = range(100,200+1), range(0,100+1)
  156.         a.remove(200)
  157.         a.extend(b)
  158.         allowed = a
  159.         if pos in allowed and pos != self.pos:
  160.             left, right = allowed[:allowed.index(self.pos)],\
  161.                           allowed[allowed.index(self.pos)+1:]
  162.             if pos in left:
  163.                 direction = -1
  164.                 steps = len(left)-left.index(pos)
  165.             elif pos in right:
  166.                 direction = 1
  167.                 steps = right.index(pos)+1
  168.             self.steps(steps*direction, "t", speed)
  169.  
  170.     def toPosRel(self, relPos, speed = 0.009):
  171.         """Go to position pos
  172.  
  173.        pos can be negative or positive
  174.        
  175.        """
  176.         if relPos >= 0:
  177.             goto = relPos
  178.         elif relPos < 0:
  179.             goto = 200+relPos
  180.         else:
  181.             goto = None
  182.         self.toPos(goto, speed)
  183.  
  184. class PanCamTextCommander():
  185.     """Text commander for PanCam"""
  186.  
  187.     def __init__(self, par):
  188.         self.par = par
  189.         os.system("title PanCam")
  190.         self.interface()
  191.        
  192.     def interface(self):
  193.         """Text interface"""
  194.         greting = """
  195.        Welcome to PanCam Text Commander
  196.        Here are your options:
  197.        
  198.        1 .... Manual control
  199.        2 .... Set position
  200.        3 .... Run test
  201.        q .... Quit
  202.        ...
  203.        ..
  204.        .
  205.        comming soon! :)"""
  206.         q = False
  207.         while q != True:
  208.             os.system("cls")
  209.             print greting
  210.             choice = raw_input("\nYour choice >>> ")
  211.             if len(choice) == 0:
  212.                 continue
  213.             if choice == "1":
  214.                 self.manual()
  215.             elif choice == "2":
  216.                 self.setPos()
  217.             elif choice == "3":
  218.                 self.test()
  219.             elif choice in "qQXx":
  220.                 q = True
  221.             else: pass
  222.  
  223.     def manual(self):
  224.         """Manuali control PanCam"""
  225.         q = False
  226.         while q != True:
  227.             p = raw_input("\nPos: %s\nTo pos >>> " %self.par.pos)
  228.             if len(p) == 0:
  229.                 continue#p = "a"
  230.             try:
  231.                 p = int(p)
  232.             except:
  233.                 if p in "qQXx":
  234.                     q = True
  235.                 else:
  236.                     p = self.par.pos
  237.             self.par.toPosRel(p)
  238.  
  239.     def setPos(self):
  240.         """Manuali set up the position"""
  241.         q = False
  242.         while q != True:
  243.             p = raw_input("\nPos: %s\nSet pos to >>> " %self.par.pos)
  244.             if len(p) == 0:
  245.                 q = True
  246.                 self.par.pos = 0
  247.                 print "\n\t==== Position set! ====\t"
  248.                 time.sleep(0.5)
  249.             try:
  250.                 p = int(p)
  251.             except:
  252.                 if p in "qQXx":
  253.                     q = True
  254.                 else:
  255.                     p = self.par.pos
  256.             self.par.toPosRel(p)
  257.  
  258.     def test(self):
  259.         """Tests"""
  260.         for a in range(4):
  261.             for p in [-25,25,-50,50,-75,75,-100,99,0]:
  262.             #p = random.choice(range(-100,100))
  263.                 self.par.toPosRel(p)
  264.                 print "POS:", self.par.pos
  265.                 self.par.mysleep(2)
  266.         self.par.toPosRel(0)
  267.  
  268. if __name__ == "__main__":
  269.     ## Example ##
  270.  
  271.     ## Imports
  272.     import parallel as pll
  273.     #import RealStepper03 as RS
  274.  
  275.     ## Init port
  276.     port = pll.Parallel()
  277.     ## Init Stepper
  278.     PanCam = Stepper(port)
  279.     ## Init Text Commander
  280.     textPanCam = PanCamTextCommander(PanCam)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement