Raspberry Pi - ZeroDivisionError: деление с плавающей запятой на ноль - adafruit pca9685

Я борюсь со своей малиной. Терминал выводит, что есть деление на ноль с плавающей запятой, но я ничего не делю в коде. Я уже сбросил весь Пи и все переустановил. Первый запуск после сброса был успешным, но после этого каждый запуск показывает ошибку ниже.

Было бы здорово, если бы вы могли мне помочь! Спасибо!

Traceback (most recent call last):
  File "robot2.py", line 43, in <module>
    kit.servo[servo1].angle = length1
  File "/usr/local/lib/python3.6/site-packages/adafruit_servokit.py", line 150, in __getitem__
    servo = adafruit_motor.servo.Servo(self.kit._pca.channels[servo_channel])
  File "/usr/local/lib/python3.6/site-packages/adafruit_motor/servo.py", line 103, in __init__
    super().__init__(pwm_out, min_pulse=min_pulse, max_pulse=max_pulse)
  File "/usr/local/lib/python3.6/site-packages/adafruit_motor/servo.py", line 45, in __init__
    self.set_pulse_width_range(min_pulse, max_pulse)
  File "/usr/local/lib/python3.6/site-packages/adafruit_motor/servo.py", line 49, in set_pulse_width_range
    self._min_duty = int((min_pulse * self._pwm_out.frequency) / 1000000 * 0xffff)
  File "/usr/local/lib/python3.6/site-packages/adafruit_pca9685.py", line 71, in frequency
    return self._pca.frequency
  File "/usr/local/lib/python3.6/site-packages/adafruit_pca9685.py", line 145, in frequency
    return self.reference_clock_speed / 4096 / self.prescale_reg
ZeroDivisionError: float division by zero

Traceback (most recent call last):
  File "robot2.py", line 43, in <module>
    kit.servo[servo1].angle = length1
  File "/usr/local/lib/python3.6/site-packages/adafruit_servokit.py", line 150, in __getitem__
    servo = adafruit_motor.servo.Servo(self.kit._pca.channels[servo_channel])
  File "/usr/local/lib/python3.6/site-packages/adafruit_motor/servo.py", line 103, in __init__
    super().__init__(pwm_out, min_pulse=min_pulse, max_pulse=max_pulse)
  File "/usr/local/lib/python3.6/site-packages/adafruit_motor/servo.py", line 45, in __init__
    self.set_pulse_width_range(min_pulse, max_pulse)
  File "/usr/local/lib/python3.6/site-packages/adafruit_motor/servo.py", line 49, in set_pulse_width_range
    self._min_duty = int((min_pulse * self._pwm_out.frequency) / 1000000 * 0xffff)
  File "/usr/local/lib/python3.6/site-packages/adafruit_pca9685.py", line 71, in frequency
    return self._pca.frequency
  File "/usr/local/lib/python3.6/site-packages/adafruit_pca9685.py", line 145, in frequency
    return self.reference_clock_speed / 4096 / self.prescale_reg
ZeroDivisionError: float division by zero

Traceback (most recent call last):
  File "robot2.py", line 43, in <module>
    kit.servo[servo1].angle = length1
  File "/usr/local/lib/python3.6/site-packages/adafruit_servokit.py", line 150, in __getitem__
    servo = adafruit_motor.servo.Servo(self.kit._pca.channels[servo_channel])
  File "/usr/local/lib/python3.6/site-packages/adafruit_motor/servo.py", line 103, in __init__
    super().__init__(pwm_out, min_pulse=min_pulse, max_pulse=max_pulse)
  File "/usr/local/lib/python3.6/site-packages/adafruit_motor/servo.py", line 45, in __init__
    self.set_pulse_width_range(min_pulse, max_pulse)
  File "/usr/local/lib/python3.6/site-packages/adafruit_motor/servo.py", line 49, in set_pulse_width_range
    self._min_duty = int((min_pulse * self._pwm_out.frequency) / 1000000 * 0xffff)
  File "/usr/local/lib/python3.6/site-packages/adafruit_pca9685.py", line 71, in frequency
    return self._pca.frequency
  File "/usr/local/lib/python3.6/site-packages/adafruit_pca9685.py", line 145, in frequency
    return self.reference_clock_speed / 4096 / self.prescale_reg
ZeroDivisionError: float division by zero

Traceback (most recent call last):
  File "robot2.py", line 43, in <module>
    kit.servo[servo1].angle = length1
  File "/usr/local/lib/python3.6/site-packages/adafruit_servokit.py", line 150, in __getitem__
    servo = adafruit_motor.servo.Servo(self.kit._pca.channels[servo_channel])
  File "/usr/local/lib/python3.6/site-packages/adafruit_motor/servo.py", line 103, in __init__
    super().__init__(pwm_out, min_pulse=min_pulse, max_pulse=max_pulse)
  File "/usr/local/lib/python3.6/site-packages/adafruit_motor/servo.py", line 45, in __init__
    self.set_pulse_width_range(min_pulse, max_pulse)
  File "/usr/local/lib/python3.6/site-packages/adafruit_motor/servo.py", line 49, in set_pulse_width_range
    self._min_duty = int((min_pulse * self._pwm_out.frequency) / 1000000 * 0xffff)
  File "/usr/local/lib/python3.6/site-packages/adafruit_pca9685.py", line 71, in frequency
    return self._pca.frequency
  File "/usr/local/lib/python3.6/site-packages/adafruit_pca9685.py", line 145, in frequency
    return self.reference_clock_speed / 4096 / self.prescale_reg
ZeroDivisionError: float division by zero

person Luis G    schedule 02.03.2020    source источник
comment
Возможно, что self.prescale_reg в adafruit_pca9685.py должно быть равно нулю. Это файл, который вы написали сами?   -  person Chris    schedule 03.03.2020
comment
self._min_duty = int((min_pulse * self._pwm_out.frequency) / 1000000 * 0xffff выглядит подозрительно. 1000000 * 0xffff может переполнять размер вашей переменной и возвращать 0.   -  person Brian    schedule 03.03.2020
comment
@Chris Спасибо за ваш ответ! Я использую текущую библиотеку Adafruit. Это абсолютно подозрительно, потому что сейчас не работает даже самый простой пример кода из этой Библиотеки. Какие-либо предложения?   -  person Luis G    schedule 03.03.2020
comment
@ Брайан, как я могу это исправить =   -  person Luis G    schedule 03.03.2020
comment
@ Брайан, на Питоне?! Или вы имели в виду, что результат умножения больше числителя?   -  person 0andriy    schedule 03.03.2020


Ответы (1)


Как отмечали другие, ошибка связана с кодом библиотеки и не была обнаружена с помощью try, чтобы превратить ее в понятное сообщение об ошибке. Вы можете сказать это, только проверив реализацию другой библиотеки, но ошибочное значение в self.prescale_reg на самом деле является значением, считанным с контроллера по шине i2c.

Подобный случай упоминается на форумах Adafruit: RaspberryPi Stepper HAT - пример кода не работает, который был диагностирован как конфликт между двумя программами, использующими запущенный GPIO.

Я бы дважды проверил физическое подключение i2c к устройству контроллера, чтобы убедиться, что оно отвечает при сканировании шины i2c с помощью i2cdetect (пример в Adafruit Learn: 16-канальный серводрайвер Adafruit с Raspberry Pi: настройка Pi для I2C) и убедитесь, что у вас нет другого конфликтующего использования контактов GPIO для i2c в вашем коде.

person KevinJWalters    schedule 14.06.2020