write_analog в microPython на BBC micro: бит ничего не делает
У меня есть простая строка micro:bit javascript, которая работает, но та же самая строка в microPython - нет.
У меня есть потенциометр, подключенный к микро-биту, и показания потенциометра отправляются на вывод, прикрепленный к светодиоду, чтобы контролировать яркость светодиода. Код JavaScript
pins.analogWritePin(AnalogPin.P1, pins.analogReadPin(AnalogPin.P0))
который является результатом блочного кода, работает нормально, и яркость светодиода изменяется при изменении потенциометра.
Но используя аналогичную линию microPython
pin1.write_analog(pin0.read_analog())
не меняет интенсивность светодиода.
Есть идеи о том, что здесь происходит?
2 ответа
Ваша строка с микропифонным кодом в порядке. В отдельности мне удается выполнить одно чтение и одну запись, и в результате пропорционально затемнить светодиод, подключенный к контакту 1 и заземлению, один раз. Но есть контекст для рассмотрения.
Вы выполняете строку несколько раз в узком цикле без сна (и без других трудоемких операций)? Как это?
#This will not work
from microbit import *
while True:
pin1.write_analog(pin2.read_analog())
Когда я проверяю вышеупомянутое, светодиод не тускнеет. Это решается простым добавлением в цикл цикла, скажем, 50-100 миллисекунд.
#This will work
from microbit import *
while True:
pin1.write_analog(pin2.read_analog())
sleep(50)
Обратите внимание, что это то же самое, что и решение выше от аналога пользователя.
pin1.write_analog(v)
фактически не устанавливает аналоговое напряжение на выводе, он имитирует его с помощью ШИМ-сигнала, который является высоким для процента от его цикла, пропорционален желаемому "аналоговому" напряжению и низким для остальной части цикла.
Я подозреваю, что вы не позволяете этому сигналу завершить цикл перед вызовом write_analog()
на этом снова, и поэтому вы никогда не увидите целую форму волны. Вполне возможно, что сигнал ШИМ начинается снова с высокой снова каждый раз write_analog()
называется - не знаю. Если это так, это будет означать, что вы видите форму волны, которая постоянно устанавливается на высоком уровне, так что всего 3,3 В константа. Не то, что вы хотите.
Отключение между вызовами одного и того же analog_write() даст вам тусклость, которую вы ожидаете. (В качестве альтернативы, найдите другой способ избежать частого вызова analog_write().)
Возможно, ваша версия JavaScript не имеет этой проблемы, потому что она выполняется достаточно медленно, чтобы позволить сигналу ШИМ повториться, прежде чем вы измените его снова.
Обратите внимание, что вы можете ускорить сигнал ШИМ, задав ему период 1 мс:pin1.set_analog_period(1)
, В моем тестировании это несколько улучшило ситуацию, но это не такое хорошее решение, как просто оставить больше времени между вызовами write_analog
, Вам все равно нужно оставить хотя бы 1 мс между вызовами.
Вот документация по микропроцессорам: битовые выводы ввода-вывода и ШИМ http://microbit-micropython.readthedocs.io/en/latest/pin.html
Я получил следующий микропифон, работающий на микро: бит. Я подключил контакт 0 к резисторной перемычке с потенциометром с одной стороны, чтобы я мог изменять напряжение на контакте 0. Я подключил контакт 1 к светодиоду с резистором, последовательно соединенным с землей. Я также измерил напряжение на контакте 0 и 1 с помощью мультиметра Fluke, и они хорошо совпадают. Я вижу, как изменяется интенсивность светодиода при регулировке потенциометра.
from microbit import *
while True:
pin1.write_analog(pin0.read_analog())
sleep(100)