Google EdgeTPU не может заставить PWM работать с Python - PullRequest
1 голос
/ 27 марта 2019

Вот мой код тестирования:

from periphery import PWM
import time

# Open PWM channel 0, pin 0
pwm = PWM(0,0)

# Set frequency to 1 kHz
pwm.frequency = 50
# Set duty cycle to 75%
pwm.duty_cycle = 0.02

pwm.enable()

print(pwm.period)
print(pwm.frequency)
print(pwm.enabled)

# Change duty cycle to 50%

pwm.duty_cycle = 0.05

pwm.close()

Проблема в этой части:

# Open PWM channel 0, pin 0
pwm = PWM(0,0)

Я вижу вывод при работе PWM(0,0) PWM(0,1) PWM(0,2)

но я получаю сообщение об ошибке при попытке выполнить следующее:

PWM(1,1)

PWM(2,2)

mendel@elusive-jet:/sys/class/pwm$ sudo python3 /usr/lib/python3/dist-packages/edgetpuvision/testPWM.py
OSError: [Errno 19] No such device

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.5/dist-packages/periphery/pwm.py", line 69, in _open
    f_export.write("%d\n" % pin)
OSError: [Errno 19] No such device

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/edgetpuvision/testPWM.py", line 5, in <module>
    pwm = PWM(1,1)
  File "/usr/local/lib/python3.5/dist-packages/periphery/pwm.py", line 44, in __init__
    self._open(channel, pin)
  File "/usr/local/lib/python3.5/dist-packages/periphery/pwm.py", line 71, in _open
    raise PWMError(e.errno, "Exporting PWM pin: " + e.strerror)
periphery.pwm.PWMError: [Errno 19] Exporting PWM pin: No such device

На основании документа, полученного от Coral и сайта библиотеки: https://coral.withgoogle.com/tutorials/devboard-gpio/

https://github.com/vsergeev/python-periphery

The

PWM(1,1)

PWM(2,2)

должно было работать без проблем, я вижу, что существуют следующие каталоги:

"\sys\class\pwm\pwmchip0"
"\sys\class\pwm\pwmchip1"
"\sys\class\pwm\pwmchip2"

В исходном коде python-периферии https://github.com/vsergeev/python-periphery/blob/master/periphery/pwm.py

он должен получить путь следующим образом:

PWM(1,1) ===> /sys/class/pwm/pwmchip1/pwm1, если pwm1 не существует, он должен вызвать export для его генерации.

Итак, мой главный вопрос:

  • Что такое channel и pin и как они используются?
  • Почему я не могу заставить ШИМ (1,1) ШИМ (2,2) работать?

Заранее спасибо.

--------------- 2019.4.2 Обновление --------------------

Я сам разобрался с предыдущим ответом (и спасибо всем, кто оказал помощь).

Но, как вы можете видеть из моего собственного ответа, я все еще не могу заставить ШИМ работать, поскольку он не выдает стабильное напряжение. (Вы можете проверить более подробно ниже).

В настоящее время я сталкиваюсь с другой проблемой, в которой выходное напряжение не является стабильным вообще. Итак, вот что я сделал для проверки:

Я настроил Raspberry Pi 3+ Model B и EdgeTPU Coral Board с 50hz ШИМ с рабочим циклом 5%. Поскольку оба устройства имеют выход GPIO 3,3 В, моя теория такова, что их выход должен быть одинаковым, но это не так.

Вот напряжение, измеренное с помощью платы Arduino UNO: Pi против EdgeTPU . (Примечание: все напряжение должно делиться на 10). Вы можете видеть четкую схему (PWM) на выходе Pi, колеблющуюся около 1.8v. но если вы посмотрите на выход EdgeTPU, вы увидите, что напряжение повсюду и оно намного ниже (1,1 В против 1,8 В).

мне явно что-то не так с выходом EdgeTPU PWM, поэтому я продолжил исследование. узнал из (ограниченного) документа , там написано

Все выводы GPIO имеют резистор 90 кОм внутри iMX8M SOC, который используется по умолчанию во время загрузки, за исключением выводов I2C, которые вместо этого имейте подтягивание до 3.3V на SOM. Тем не менее, все это может быть изменено с наложением дерева устройств, которое загружается после загрузки .

Что наводит меня на мысль, что 90k pull-down resistor может иметь более низкое выходное напряжение из-за этой формулы V=IR. Итак, я думаю изменить device tree overlay при загрузке в соответствии с инструкциями. но, угадайте что, нет никаких документов о том, как это изменить, кроме следующей строки из файла overlays.txt:

# List of device tree overlays to load. Format: overlay=<dtbo name, no extenstion> <dtbo2> ...
overlay=

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

Я также поделюсь этим вопросом с командой поддержки кораллов, чтобы узнать, получат ли они мне какой-либо ответ. (К вашему сведению, я отправил им что-то назад, когда опубликовал исходный вопрос, пока ничего от них не услышал) Даже на их сайте написано We try to respond to inquiries within one business day — but often you'll get a response even quicker, usually a few hours.) так что, пожелай мне удачи. Будет держать этот ответ обновленным, если услышите что-нибудь назад.

Вот отрывок / вопрос, который я хотел бы передать Google / Google Cloud / Google EdgeTPU / Google Coral Board команды также:

  • Почему для реализации GPIO в качестве библиотеки по умолчанию выбрана python-периферия а ШИМ?
  • Зачем выбирать Mendel Linux в качестве ОС по умолчанию, если нет сайта / документа или какого-либо другого вида, который можно найти?

Ответы [ 2 ]

1 голос
/ 02 апреля 2019

Что такое канал и вывод и как они используются?

канал отображается на микросхему драйвера в sysfs Linux (например, pwmchip0),и вывод отображается на отдельные выходы каждого канала.Каждый канал будет иметь npwm выводов.

Вы можете запустить команду pinout на своем устройстве, чтобы получить более подробную информацию о периферийных портах на 40-контактном разъеме и каналах ШИМ, к которым они подключены:

$ pinout
            3.3.V -> 1    2 <- 5V
 I2C2_SDA (i2c-1) -> 3    4 <- 5V
 I2C2_SCL (i2c-1) -> 5    6 <- GND
        UART3_TXD -> 7    8 <- UART1_TX
              GND -> 9   10 <- UART1_RX
        UART3_RXD -> 11  12 <- SAI1_TXC
 GPIO_P13 (gpio6) -> 13  14 <- GND
  PWM3 (pwmchip2) -> 15  16 <- GPIO_P16 (gpio73)
             3.3V -> 17  18 <- GPIO_P18 (gpio138)
        SPI1_MOSI -> 19  20 <- GND
        SPI1_MISO -> 21  22 <- GPIO_P22 (gpio140)
        SPI1_SCLK -> 23  24 <- SPI1_SS0
              GND -> 25  26 <- SPI1_SS1
 I2C3_SDA (i2c-2) -> 27  28 <- I2C3_SCL (i2c-2)
 GPIO_P29 (gpio7) -> 29  30 <- GND
 GPIO_P31 (gpio8) -> 31  32 <- PWM1 (pwmchip0)
  PWM2 (pwmchip1) -> 33  34 <- GND
        SAI1_TXFS -> 35  36 <- GPIO_P36 (gpio141)
GPIO_P37 (gpio77) -> 37  38 <- SAI1_RXD0
              GND -> 39  40 <- SAI1_TXD0

На этой плате только один вывод на канал (cat npwm возвращает 1), поэтому номер вывода на периферии всегда будет равен нулю.

Почему я не могу заставить PWM (1,1) PWM (2,2) работать?

В приведенном выше объяснении приведены действительные команды периферии для инициализации каждого PWM.на плате разработчика:

  • ШИМ1 (вывод 32) -> pwm = PWM(0,0)
  • ШИМ2 (вывод 33) -> pwm = PWM(1,0)
  • ШИМ3 (Контакт 15) -> pwm = PWM(2,0)
0 голосов
/ 01 апреля 2019

Ну, в конце концов, ответьте на мой вопрос после нескольких дней исследований. Вот что я нашел:

Что такое канал и пин-код и как он используется?

Ответ: Channel походит на lane, как если бы PIN был высокоуровневым, некоторые чип / пин поддерживают несколько channel некоторые нет, вы можете понять это с помощью следующей команды (например, при использовании EdgeTPU другие Linux SOC должны быть похожими): cd /sys/class/pwm затем ls должен показать несколько чип / пин, как pwmchip0 pwmchip1 pwmchip2, допустим, вы хотите знать, сколько channel/lane поддерживает pwmchip0, затем вы cd pwmchip0 и затем cat npwm это должно дать у вас есть номер, для EdgeTPU он показывает 1, что означает, что 1 канал / полоса поддерживается для pin PWM1. Вы можете сделать то же самое для pwmchip1 pwmchip2 ... pwmchip# (К вашему сведению, все контакты EdgeTPU поддерживают только 1 канал)

Почему я не могу заставить ШИМ (1,1) ШИМ (2,2) работать?

Это забавная часть, я слишком много могу сказать об этом.

Короткий Anwser: THEIR DOCUMENT IS WRONG. it should be PWM(Pin,Channel)

Long Anser : в здесь говорится, что вы должны инициализировать PWM как PWM(Channel, Pin), но, глядя на его реализацию, оно должно быть PWM(Pin, Channel) согласно коду . и еще один замечательный пример автономного модуля PWM здесь (Настоятельно рекомендуем любому пользователю EdgeTPU использовать этот модуль вместо python-periphery). У меня есть PR , чтобы обновить их документ, но я хочу сказать, что их ШИМ определенно не были проверены никакими средствами. В противном случае вводящая в заблуждение информация уже должна была быть замечена. (TBH, проект кажется мертвым, без обновления в течение года, даже не уверен, будет ли мой PR объединен или нет. Будущая работа: если мой PR по корректировке документа будет утвержден, я буду работать над тем, чтобы получить отдельный PR-модуль ШИМ в библиотека периферии питона)

Итак, все работало так, как должно быть после того, как ШИМ заработал код?

Ответ: К сожалению не Пожалуйста, проверьте мой обновленный вопрос.

...