Использование мультиплексора 4x1 для управления сервоприводом
Я должен был сначала создать MUX 4x1, используя И и НЕ ворота. 4 входные линии данных (io,i1,i2,i3) были 4 ШИМ-выводами от arduino (3,5,6,9), со значениями analogWrite() как 100,150,200,250 соответственно, а линии выбора были взяты из двух ползунковых переключателей.
int i0=100;
int i1=150;
int i2=200;
int i3=250;
void setup()
{
pinMode(5, OUTPUT);
pinMode(6,OUTPUT);
pinMode(9,OUTPUT);
pinMode(3,OUTPUT);
analogWrite(3,i0);
analogWrite(5,i1);
analogWrite(6,i2);
analogWrite(9,i3);
Serial.begin(9600);
}
void loop()
{
}
Ссылка моделирования: https://www.tinkercad.com/things/cRZNvuwhZYV
Вольтметр + подключен к выходу MUX. Обе линии выбора ВЫСОКИ, поэтому выход i3 имеет значение ШИМ 250. Таким образом, напряжение должно быть (250/255)*5, то есть около 4,9 В, что и показывает счетчик. (Сервопривод присутствует, но не подключен.)
Значения вольтметра соответствуют всем 4 возможным комбинациям. Короче говоря, 4x1 MUX работает отлично.
(для меня было важно прояснить это , так как в противном случае люди могли бы подумать о реализации мультиплексора как о проблеме с моей схемой lsubsequent, а из-за грязной проводки было бы невозможно подтвердить, так ли это на самом деле. Однако, как я четко показал, проблема НЕ в MUX).
Затем я попытался управлять сервомотором с помощью этого MUX. Я подсоединил вывод сервоуправления к мультиплексному выходу:
#include<Servo.h>
Servo s1;
Servo s2;
Servo s3;
Servo s4;
int i0=100;
int i1=150;
int i2=200;
int i3=250;
void setup()
{
pinMode(3,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(9,OUTPUT);
analogWrite(3,i0);
analogWrite(5,i1);
analogWrite(6,i2);
analogWrite(9,i3);
s1.attach(3);
s2.attach(5);
s3.attach(6);
s4.attach(9);
Serial.begin(9600);
}
void loop()
{
s1.write((i0*180)/255);
s2.write((i1*180)/255);
s3.write((i2*180)/255);
s4.write((i3*180)/255);
}
Например, я думал, что если оба переключателя включены, то выход будет i3(который идет от контакта 9), так
что будут работать только s4.attach(9);
и s4.write((i3*180)/255);
. (Поскольку очевидно, что управляющий штифт в данном случае соединен с штифтом 9).
Сервопривод действительно перемещается, когда я меняю переключатели на комбинации включения-выключения,однако со значениями вольтметра происходит что-то радикальное, что говорит мне о том, что мой код возится с выходом мультиплексора. Выходное напряжение быстро колеблется между 97 и 180 мВ.
Что именно я сделал не так, и как именно я должен управлять Сервомотором?
@satan 29, 👍1
Обсуждение0
- Проблемы с пониманием минимальных и максимальных параметров серводвигателя
- Как Arduino Uno может поддерживать до 12 сервоприводов, если у него всего 6 цифровых выводов ШИМ?
- Управление сервоприводом без библиотеки сервоприводов
- Как изменить скорость нескольких сервоприводов, работающих одновременно с модулем PCA9685?
- Контакты ШИМ серводвигателей, Arduino Uno
- Управление сервоприводом с помощью ATtiny13A
- Используйте Adafruit 16-Channel 12-bit PWM/Servo Shield для переключения реле
- Проектирование роботизированной руки с помощью Arduino Uno
Честно говоря, я бы подумал, что ни один из кодов на самом деле не работает, по крайней мере, на реальном Arduino (не знаю, как tinkercad справляется с этим). Вызов
analogWrite()
или "Servo.write()многократно в" цикле()
без каких-либо замедляющих действий приведет к повторному запуску волны PWM снова и снова. Пожалуйста, попробуйте вместо этого поместить эти строки в " setup ()". Возможно, tinkercad обрабатывает " analogWrite()` и библиотеку сервоприводов по-разному., @chrislодна из главных вещей, которые вы делаете неправильно, - это использование вольтметра для измерения последовательности импульсов ... осциллограф-подходящий инструмент для этого, @jsotola
@chrisl Я изменил коды, проблема все еще сохраняется. Есть идеи, почему? и есть какие-нибудь идеи, что именно я могу сделать, чтобы правильно управлять сервоприводом?, @satan 29
@jsotola какое это будет иметь значение? (Я, конечно, вежливо спрашиваю об этом) Вольтметр показывает правильные значения для MUX, что означает, что мой MUX работает правильно, это все, что я хотел подтвердить. Когда я добавляю сервопривод, это когда вольтметр отключается, так что, вероятно, что-то не так с управлением моим сервоприводом... Я не уверен, почему использование осциллографа исправит это, @satan 29
можно ли управлять сервоприводом только одним сервообъектом?, @satan 29
Какова цель как " analogWrite ()", так и "Servo::write ()" с использованием одного и того же контакта? Вам вообще нужно первое?, @the busybee
хорошо, что функция analogWrite() служит в качестве входных данных для MUX... Возможно, вы правы в том, что использование одного и того же контакта может вызвать проблемы.. Но тогда какой код вы рекомендуете?, @satan 29