|
Управление с радиопульта
|
|
| Вячеслав | Дата: Вторник, 25.02.2014, 00:03 | Сообщение # 1 |
 3.5 Вольт
Группа: Пользователи
Сообщений: 13
Репутация: 20
Статус: Offline
| Здравствуйте товарищи! Поздравляю с прошедшим праздником! Не знаю как победить скетч для управления колесной платформой с пульта. Схема классическая При нажатии на кнопку ПДУ приемник выдает +5В на соответствующем пине, при нажатии на определенную кнопку платформа должна совершать маневр, если кнопка не нажата платформа должна стоять. Сходу соорудил скетч через оператора if...else, но работает только первая кнопка. Подозреваю что нужно использовать swich...case но не смог найти как его правильно использовать. Может есть что то другое более понятное. внизу составленный нерабочий скетч. Исправте пожалуйста кому не лень хотя бы на две кнопки. дальше сам поди справлюсь! Спасибо! Цитатаint IN1 = 1;//пульт 1// int IN2 = 2;//пульт 2// int IN3 = 3;//пульт 3// int IN4 = 4;//пульт 4// int IN5 = 5;//пульт 5// int IN6 = 6;//пульт 6// int IN8 = 8;//двигатель 1а// int IN9 = 9;//двигатель 1б// int IN10 = 10;//двигатель 2а// int IN11 = 11;//двигатель 2б// void setup() { pinMode(IN1, INPUT); pinMode(IN2, INPUT); pinMode(IN3, INPUT); pinMode(IN4, INPUT); pinMode(IN5, INPUT); pinMode(IN6, INPUT); pinMode(IN8, OUTPUT); pinMode(IN9, OUTPUT); pinMode(IN10, OUTPUT); pinMode(IN11, OUTPUT); } void loop() { if (digitalRead(IN1) == HIGH) { digitalWrite(IN8, LOW);//левое вперед// digitalWrite(IN9, HIGH); digitalWrite(IN10, HIGH);//правое вперед// digitalWrite(IN11, LOW); } else { digitalWrite (IN8, LOW); digitalWrite (IN9, LOW); digitalWrite (IN10, LOW); digitalWrite (IN11, LOW); } if (digitalRead(IN2) == HIGH) { digitalWrite(IN8, HIGH);//левое назад// digitalWrite(IN9, LOW); digitalWrite(IN10, LOW);//правое назад// digitalWrite(IN11, HIGH); } else { digitalWrite (IN8, LOW); digitalWrite (IN9, LOW); digitalWrite (IN10, LOW); digitalWrite (IN11, LOW); }}
Сообщение отредактировал Вячеслав - Вторник, 25.02.2014, 00:06 |
| |
| |
| Serg | Дата: Вторник, 25.02.2014, 13:35 | Сообщение # 2 |
|
Ампер
Группа: Модераторы
Сообщений: 510
Репутация: 28
Статус: Offline
| Правильный у вас код, а вот схема с ошибкой. Дело в том, что при включении Arduin на входах In1 In2 может оказаться как логический ноль, так и логическая единица. Что бы этого не произошло, нужно входы соединять с плюсом или минусом питания через резистор 10 Ком. В вашем случае на обоих входах всегда логическая единица, поэтому программа выполняется с ошибками. Через внутренние цепи радиоприемника поступает небольшое напряжение, поэтому if (digitalRead(IN1) == HIGH будет выполняться всегда, независимо, когда и сколько раз нажали кнопку пульта. Решение очень простое -входы Arduino соединить с землей через резисторы 10 Ком, тем самым обеспечив if (digitalRead(IN1) == LOW в перерывах между нажатиями кнопок пульта. А вообще для этой схемы применение Arduino совсем не обязательно. Можно просто подавать сигналы с приемника сразу на драйвер через два развязывающих диода.
|
| |
| |
| Вячеслав | Дата: Вторник, 25.02.2014, 18:20 | Сообщение # 3 |
 3.5 Вольт
Группа: Пользователи
Сообщений: 13
Репутация: 20
Статус: Offline
| Serg, Дома попробую без 1,2 пина, а вот схему на диодах даже не представляю, там же нужна смена полюсов на двигателе.
|
| |
| |
| Serg | Дата: Вторник, 25.02.2014, 19:51 | Сообщение # 4 |
|
Ампер
Группа: Модераторы
Сообщений: 510
Репутация: 28
Статус: Offline
| Вячеслав, Цитата Вячеслав (  ) попробую без 1,2 пина А зачем без них пробовать?
Цитата Вячеслав (  ) там же нужна смена полюсов полюса будет менять драйвер.
|
| |
| |
| Вячеслав | Дата: Среда, 26.02.2014, 00:24 | Сообщение # 5 |
 3.5 Вольт
Группа: Пользователи
Сообщений: 13
Репутация: 20
Статус: Offline
| Serg, Цитата Serg (  ) А зачем без них пробовать? Что бы исключить неопределенность на 1 и 2 порту. к тому же еще резисторов нет(. Но все равно ничего не получилось. Без ардуины пробовал пока получается что то неопределенное. Продолжу завтра.
|
| |
| |
| Serg | Дата: Среда, 26.02.2014, 00:27 | Сообщение # 6 |
|
Ампер
Группа: Модераторы
Сообщений: 510
Репутация: 28
Статус: Offline
| Цитата Вячеслав (  ) Но все равно ничего не получилось А что должно было получится?
|
| |
| |
| Вячеслав | Дата: Среда, 26.02.2014, 12:34 | Сообщение # 7 |
 3.5 Вольт
Группа: Пользователи
Сообщений: 13
Репутация: 20
Статус: Offline
| Serg, Переподключил схему без 1,2 порта. Из скетча тоже убрал все что с ними связано.выходящий сигнал был который идет на драйвер но он 2,3 вольта по тестеру и двигатель не ,,заводится,,Если сегодня ничего не выйдет нарисую схему по подробнее.
|
| |
| |
| Вячеслав | Дата: Понедельник, 03.03.2014, 23:47 | Сообщение # 8 |
 3.5 Вольт
Группа: Пользователи
Сообщений: 13
Репутация: 20
Статус: Offline
| Вновь занялся данной темой. Изобразил схему подключения подробнее. Пульт пока убрал, поставил кнопки, переписал скетч.
int IN5 = 5;//Кнопка 1//int IN6 = 6;//Кнопка 2// int IN8 = 8;//двигатель 1а// int IN9 = 9;//двигатель 1б// int IN10 = 10;//двигатель 2а// int IN11 = 11;//двигатель 2б// void setup() { pinMode(IN5, INPUT); pinMode(IN6, INPUT); pinMode(IN8, OUTPUT); pinMode(IN9, OUTPUT); pinMode(IN10, OUTPUT); pinMode(IN11, OUTPUT); } void loop() { if (digitalRead(IN5) == HIGH) { digitalWrite(IN8, LOW);//левое вперед// digitalWrite(IN9, HIGH); digitalWrite(IN10, HIGH);//правое вперед// digitalWrite(IN11, LOW); } else { digitalWrite (IN8, LOW); digitalWrite (IN9, LOW); digitalWrite (IN10, LOW); digitalWrite (IN11, LOW); } if (digitalRead(IN6) == HIGH) { digitalWrite(IN8, LOW);//левое назад// digitalWrite(IN9, HIGH); digitalWrite(IN10, HIGH);//правое назад// digitalWrite(IN11, LOW); } else { digitalWrite (IN8, LOW); digitalWrite (IN9, LOW); digitalWrite (IN10, LOW); digitalWrite (IN11, LOW); }} но механизм не включается, все таки думаю что то со скетчем. Подскажите что где не так.
|
| |
| |
| Serg | Дата: Вторник, 04.03.2014, 00:07 | Сообщение # 9 |
|
Ампер
Группа: Модераторы
Сообщений: 510
Репутация: 28
Статус: Offline
| Цитата Вячеслав (  ) но механизм не включается что за механизм? Зачем одинаковые действия на разные кнопки?
Проверьте сам драйвер без платы Arduino- подайте на управляющие входы напряжение от источника питания через резисторы 1-10 кОм.
|
| |
| |
| Вячеслав | Дата: Вторник, 04.03.2014, 01:21 | Сообщение # 10 |
 3.5 Вольт
Группа: Пользователи
Сообщений: 13
Репутация: 20
Статус: Offline
| Serg, Драйвер работает, проверял с пульта без ардуино вперед назад перемещается. Дело не в одинаковых действиях, а в том что когда в схеме две кнопки и в скетче прописаны две двигатели не включаются. когда задействована одна int IN5 = 5;//Кнопка 1// int IN8 = 8;//двигатель 1а// int IN9 = 9;//двигатель 1б// int IN10 = 10;//двигатель 2а// int IN11 = 11;//двигатель 2б// void setup() { pinMode(IN5, INPUT); pinMode(IN8, OUTPUT); pinMode(IN9, OUTPUT); pinMode(IN10, OUTPUT); pinMode(IN11, OUTPUT); } void loop() { if (digitalRead(IN5) == HIGH) { digitalWrite(IN8, LOW);//левое вперед// digitalWrite(IN9, HIGH); digitalWrite(IN10, HIGH);//правое вперед// digitalWrite(IN11, LOW); } else { digitalWrite (IN8, LOW); digitalWrite (IN9, LOW); digitalWrite (IN10, LOW); digitalWrite (IN11, LOW); }} работает.
Теперь об управлении без ардуино. Куда вставлять развязывающий диод так и не понял. Вперед назад все работает, как подключить кнопки на разворот платформы так и не ясно. Но язык инженера чертеж. Вставьте в схему диоды куда надо. Спасибо!
Сообщение отредактировал Вячеслав - Вторник, 04.03.2014, 01:22 |
| |
| |
| Serg | Дата: Вторник, 04.03.2014, 13:56 | Сообщение # 11 |
|
Ампер
Группа: Модераторы
Сообщений: 510
Репутация: 28
Статус: Offline
|
Может я не совсем правильно указал подключение диодов к драйверу- я не в курсе, какая ножка за что отвечает. Весь смысл в одновременной подаче напряжения с приемника на пары выводов драйвера, что бы обеспечить необходимое направление вращения двигателей при движении и поворотах.
|
| |
| |
| Вячеслав | Дата: Вторник, 04.03.2014, 14:23 | Сообщение # 12 |
 3.5 Вольт
Группа: Пользователи
Сообщений: 13
Репутация: 20
Статус: Offline
| Serg, Схема подключения ясна Спасибо. Она у меня тоже вырисовывалаль, но меня смутило куда пойдёт минус. Дома попробую.
|
| |
| |
| nipercop | Дата: Пятница, 28.03.2014, 01:24 | Сообщение # 13 |
 1.5 Вольт
Группа: Пользователи
Сообщений: 1
Репутация: 0
Статус: Offline
| Здравствуйте! Вячеслав, у вас изначально логическое построение кода не верно! А именно там где находится второй else он фактически выполняется тогда когда кнопка IN6 не нажата, соответственно когда вы нажимаете IN5, вы пускаете ток И тот час же вы отрубаете подачу тока во втором else. А вот так все будет верно: Код if (digitalRead(IN5) == HIGH) { //колеса вперед } else if (digitalRead(IN6) == HIGH) { //колеса назад } else { //колеса стоп } Я так то ни разу с ардуино не игрался, но в программировании отлично.
Ищем новые решения...=р
|
| |
| |