属性错误:RPi.GPIO.PWM没有属性'ChangeDutyCycle'

时间:2016-03-05 18:50:00

标签: python raspberry-pi gpio pwm

所以我正在使用树莓派B +制作一个小机器人,一切都进展得很顺利,但我收到的这个错误信息似乎无法解决..

属性错误:RPi.GPIO.PWM没有属性'ChangeDutyCycle'

以下是您可能需要了解的两件事:D - 在我把它作为一个类之前,代码工作得很好,ChangeDutyCycle确实存在 - 如果我将鼠标置于'不允许'即ie给ChangeDutyCycle一个小于0或大于100的值,则错误会改变并变为'ChangeDutyCycle不能接受小于0或大于100的值'(所以首先你告诉我没有这样的功能,然后告诉我它不能有一些值?:roll:)

所以我现在有点疯狂了。 注意:我是python的初学者,老实说,在我看来,它似乎是一个糟糕的java版本,但RPi GPIO似乎已经针对这种语言进行了优化,所以我正在尝试它,所以如果你看到任何其他的错误或坏事,请告诉我:D

现在的代码:

我的'主',我从pygame窗口(鼠标位置)输入

#!/usr/bin/python
# -*- coding: utf-8 -*-

import pygame
import RPi.GPIO as GPIO
from pygame.locals import *
from control import control 
print('Path :', pygame.__file__)

def main():
   pygame.init()
   screen = pygame.display.set_mode((200,200))

   ctrl = control()

   bg = pygame.Surface(screen.get_size())
   bg = bg.convert()
   bg.fill((250,250,250))

   font = pygame.font.Font(None, 36)
   text = font.render("Hello", 1, (10,10,10,))
   textpos = text.get_rect()
   textpos.centerx = bg.get_rect().centerx
   bg.blit(text, textpos)

   screen.blit(bg, (0,0))
   pygame.display.flip()
   try:
      while 1:   
         for event in pygame.event.get():
            bg.fill((250, 250, 250))
            if event.type == QUIT:
               return
            pos = pygame.mouse.get_pos()
            x = pos[0]-100
            y = -(pos[1]-200)-100
            text = font.render(str(x)+' '+str(y), 1, (10,10,10,))
            ctrl.updateEngine(x,y)
            bg.blit(text,textpos)


         screen.blit(bg, (0,0))
         pygame.display.flip()

   except KeyboardInterrupt:
      return   

   finally:
     ctrl.cleanup()

if __name__ == '__main__': main()

我的班级有控制电机的功能,control.py:

import RPi.GPIO as GPIO
from time import sleep
import sys
import Tkinter as tk

class control:

   def __init__(self):

      import RPi.GPIO as GPIO

      GPIO.setmode(GPIO.BCM)

      GPIO.setup(3, GPIO.OUT)# set GPIO 25 as output for white led  
      GPIO.setup(18, GPIO.OUT)# set GPIO 24 as output for red led  
      GPIO.setup(2, GPIO.OUT)
      GPIO.setup(17, GPIO.OUT)


      self.Rb = GPIO.PWM(2, 100)
      self.Lf = GPIO.PWM(18, 100)
      self.Lb = GPIO.PWM(17, 100)
      self.Rf = GPIO.PWM(3, 100)


      self.Rb.start(0)
      self.Rf.start(0)
      self.Lb.start(0)
      self.Lf.start(0)

  def cleanup(self):
      self.Rb.stop()
      self.Rf.stop()
      self.Lb.stop()
      self.Lf.stop()

  def updateEngine(self, x, y):
      self.clear()
      if y>15 and (x>15 or x<-15) :
         self.Rf.ChangeDutyCucle(y-15-x)
         self.Lf.ChangeDutyCycle(y-15+x)

      elif y<-15 and (x>15 or x<-15) :
         self.Rb.ChangeDutyCycle(-15-y-x)
         self.Lb.ChangeDutyCycle(-15-y+x)

   def clear(self):
      self.Rf.ChangeDutyCycle(0)
      self.Rb.ChangeDutyCycle(0)
      self.Lf.ChangeDutyCycle(0)
      self.Lb.ChangeDutyCycle(0)

因此错误发生在control.py,updateEngine方法中。 另外你会注意到我导入了相同包装(RPi.GPIO)3倍的惊人数量,因为我不知道在哪里导入它! :)

任何帮助都会得到慷慨接受:)

1 个答案:

答案 0 :(得分:0)

我将问题追溯到一个错字:我的updateEngine函数调用了self.Rf.ChangeDutyCucle,它应该是self.Rf.ChangeDutyCycle