2014-04-28 40 views
0

我目前正在研究必须穿越迷宫的机器人。 对于机器人我使用的是TMC222步进控制器,该软件是用Python编码的。TMC222步进电机控制器,电机繁忙功能

我需要一个可以告诉我电机何时忙的功能,以便机器人在电机运行时抓住所有其他活动。

我的想法是检查电机上的当前位置并将其与目标位置进行比较,但我还没有得到它的工作。

我当前的尝试:

 def isRunning(self): 
     print("IS RUNNING TEST") 

     fullstatus=self.getFullStatus2() 

     #print("FULL STATUS: " + str(fullstatus[0]) + " 2 " + str(fullstatus[1])) 

     actLeft=fullstatus[0][1]<<8 | fullstatus[0][2]<<0 
     actRight=fullstatus[1][1]<<8 | fullstatus[1][2]<<0 

     tarLeft=fullstatus[0][3]<<8 | fullstatus[0][4]<<0 
     tarRight=fullstatus[1][3]<<8 | fullstatus[1][4]<<0 

     value = (actLeft==tarLeft) and (actRight==tarRight) 

     value = not value 
#  print("isbusy="+str(value)) 
     print 'ActPos = ' + str(actLeft) 
     print 'TarPos = ' + str(tarLeft) 

     return value 

回答

0

这将是有益的,看看你的getFullStatus2()代码为好,因为这是我不清楚你是如何得到一个多维输出。

一般而言,可以从两个8位字节构成一个16位的“字”就像它具有:

Word = HB << 8 | LB << 0 

凡HB和LB是高(位15-8)和低(比特7-0)字节。

这就是说,有多种方法来检测电机堵转。理想的方法是当外部压力开关碰到墙壁时关闭。另一种方法是监视电机的电流,当电机面对电阻时(加速或失速时),电流会升高。

由于看起来这些都不可能,所以我仍然使用不同的方法,随着时间的推移监控电机的位置(推测来自某种编码器)。

假设你有一个函数get_position(),它返回一个无符号的16位整数。你应该可以写下类似的东西:

class MotorPosition(object): 
    def __init__(self): 
     readings = [] 

    def poll(self): 
     p = get_position() 
     self.readings.append(readings) 

     # If the list is now too long, remove the oldest entries 
     if len(self.readings) > 5: 
      self.readings.pop(0) 

    def get_deltas(): 
     deltas = [] 
     for x,y in zip(self.readings[1:4], self.readings[0:3]): 
      d = x - y 
      # Wraparound detection 
      if (d < -THRESHOLD): d += 65536 
      elif(d > THRESHOLD): d -= 65536 
      deltas.append(d) 
     return deltas 

    def get_average_delta(): 
     deltas = self.get_deltas() 
     return sum(deltas)/float(len(deltas)) 

请注意,这假定你正在轮询编码器速度不够快,频率一致。

然后,您可以监测平均增量(从get_average_delta()),如果降到某个值以下,则认为电机停转。

假设:

  • This是数据表你使用
  • 你I²C代码控制器正常工作