05.03.2017, 19:10 | #1 | |
Местный
Регистрация: 06.03.2014
Адрес: Москва
Сообщений: 1,741
Сказал(а) 'не согласен(а)'!: 5
Сказали 'не согласен'! 9 раз(а) в 7 сообщениях
Сказал(а) спасибо: 553
Поблагодарили 2,794 раз(а) в 755 сообщениях
:
0 за это сообщение 0 Всего Репутация: репутация неоспорима (2791)
|
Управление сервами от кнопок (для аналогового макета)
Дело было в выходной...
Делать было нечего... Пусть и не складно, но по теме Накидал скетч управления тремя сервами с трех кнопок с отображением положения стрелки. Может и было уже, но интересно было самому поиграться, да и камрад на соседнем форуме озадачился таким девайсом для своего аналогового макета. В принципе, ничего не мешает и на цифровом его использовать, но без управления от КС. При включении - сервы выворачивает в последнее состояние (если вдруг их свернули) "Грабли" обнаружены одни, при переводе из положения 0 (угол не важен, при любых раскладах, когда запускается поворот на увеличение угла) сначала идет небольшой отскок назад. Как говорил один мой знакомый: "Это баг, которы вовсе не баг, потому что в скрипах все правильно". Грешу на сервы... Сори, комменты кривые, особенно с реверсом, но думаю мысль понятна. Смысл тот же, что у местного ServoMotion. Код:
//подключаемые библиотеки #include <EEPROM.h> #include <Bounce2.h> #include <Servo.h> //переменные конфигурации int servoAngles[][2]={{0,90},{0,90},{0,90}}; // углы отклонения сервоприводов {"прямо", "в бок"} byte servoReverce[]={0,0,0}; //реверс углов сервоприводов (если в положении "прямо" угол задан во втором элементе предыдущего массива, то поставить 1.) int servoSpeed[]={10,10,10}; //скорость вращения сервопривода. указано количество миллисекунд поаорота на 1 градус //переменные определяюще ножки подключения int normalLed[]={8,10,12}; //ножки подключения светодиода показывающего прямое положение стрелки int routeLed[]={9,11,13}; //ножки подключения светодиода показывающего положение стрелки "в бок" int servoPins[]={3,5,6}; //ножки подключения провода управления сервопривода int buttonPins[]={2,4,7}; //ножки подключения кнопок переключения //переменные используемые при повороте сервопривода byte CurrentPosition[]={0,0,0}; //текущее положение сервопривода. 0=прямо, 1=в бок. int currentAngle[]={0,0,0};//текущий угол поворота сервопривода unsigned long nextTime[]={0,0,0};// время следующего поворота на 1 градус unsigned long currentTime; //текущее время byte dir;// направление поворота сервопривода //объекты сервоприводов и антидребезка кнопок const int servos=sizeof(servoPins)/sizeof(int); Servo servoServos[servos]; Bounce servoBouncer[servos]; void setup() { for(int i=0;i<servos;i++){ pinMode(buttonPins[i], INPUT); servoBouncer[i] = Bounce(); servoBouncer[i].attach(buttonPins[i]); servoBouncer[i].interval(5); pinMode(normalLed[i], OUTPUT); pinMode(routeLed[i], OUTPUT); if(EEPROM.read(i) > 1){ EEPROM.update(i,0); } CurrentPosition[i]=EEPROM.read(i); digitalWrite(normalLed[i], !CurrentPosition[i]); digitalWrite(routeLed[i], CurrentPosition[i]); servoServos[i].attach(servoPins[i]); if(servoReverce[i]){ servoServos[i].write(servoAngles[i][!CurrentPosition[i]]); currentAngle[i]=servoAngles[i][!CurrentPosition[i]]; } else { servoServos[i].write(servoAngles[i][CurrentPosition[i]]); currentAngle[i]=servoAngles[i][CurrentPosition[i]]; } } delay(1000); for(int i=0;i<servos;i++){ servoServos[i].detach(); } } void loop() { currentTime=millis(); for(int i=0;i<servos;i++){ if(nextTime[i]>0 && nextTime[i]<currentTime){ if(currentAngle[i]>=servoAngles[i][0] && currentAngle[i]<=servoAngles[i][1]){ nextTime[i]=currentTime+servoSpeed[i]; if(servoReverce[i]){ dir=!CurrentPosition[i]; } else { dir=CurrentPosition[i]; } if(dir){ currentAngle[i]++; } else { currentAngle[i]--; } if(servoAngles[i][1]/currentAngle[i] == 2 || servoAngles[i][1]/currentAngle[i] == 2.5 ){ digitalWrite(normalLed[i], !CurrentPosition[i]); digitalWrite(routeLed[i], CurrentPosition[i]); } servoServos[i].write(currentAngle[i]); } else{ nextTime[i]=0; servoServos[i].detach(); } } if(servoBouncer[i].update()){ if(servoBouncer[i].read()==LOW){ CurrentPosition[i]=!CurrentPosition[i]; EEPROM.update(i,CurrentPosition[i]); nextTime[i]=currentTime; if(servoReverce[i]){ currentAngle[i]=servoAngles[i][CurrentPosition[i]]; } else { currentAngle[i]=servoAngles[i][!CurrentPosition[i]]; } servoServos[i].attach(servoPins[i]); } } } } Можно и Arduino Pro Mini использовать, по ногам вроде как совпадает она с Uno. Видео работы. |
|
|
15 пользователя(ей) сказали cпасибо: |
05.03.2017, 19:38 | #2 | |
Пользователь
Регистрация: 14.10.2014
Адрес: Москва
Сообщений: 744
Сказал(а) 'не согласен(а)'!: 11
Сказали 'не согласен'! 2 раз(а) в 2 сообщениях
Сказал(а) спасибо: 11,362
Поблагодарили 1,955 раз(а) в 682 сообщениях
:
0 за это сообщение 0 Всего Репутация: обеспечил(а) себе прекрасное будущее (1976)
|
Цитата:
Ваше решение весьма элегантно и вдобавок - экономия , так как местный стрелочный декодер стоит 1200 руб, а Arduino Uno на e-bay - почти в 4 раза меньше. Но я вот уже набрал себе нужное количество местных декодеров... И жаба не душит. Работают они неплохо. |
|
|
4 пользователя(ей) сказали cпасибо: |
05.03.2017, 19:53 | #3 | ||
Местный
Регистрация: 06.03.2009
Адрес: Питер
Сообщений: 3,693
Сказал(а) 'не согласен(а)'!: 10
Сказали 'не согласен'! 0 раз(а) в 0 сообщениях
Сказал(а) спасибо: 6,942
Поблагодарили 4,844 раз(а) в 1,822 сообщениях
:
0 за это сообщение 0 Всего Репутация: репутация неоспорима (5127)
|
В качестве улучшения проекта, можно добавить режимы программирования углов поворота по кнопке. Я такое делал на модуле управления переездом. А чтобы не заморачиваться с реализацией медленного перемещения на обычных серва на стандартной библиотеке, можно использовать "медленные" сервы. Разница в цене не особая.
__________________
HO, цифра, OpenDCC, S-88N, OpenCar, BiDiB С приветом из подземки!!! |
||
|
8 пользователя(ей) сказали cпасибо: |
05.03.2017, 20:09 | #4 |
Пользователь сказал cпасибо: |
05.03.2017, 20:18 | #5 |
Местный
Регистрация: 06.03.2014
Адрес: Москва
Сообщений: 1,741
Сказал(а) 'не согласен(а)'!: 5
Сказали 'не согласен'! 9 раз(а) в 7 сообщениях
Сказал(а) спасибо: 553
Поблагодарили 2,794 раз(а) в 755 сообщениях
:
0 за это сообщение 0 Всего Репутация: репутация неоспорима (2791)
|
у мня в хозяйстве все есть но камраду за безнадобностью местный декодер да КС у него нет.чтобы настроить его. а по дефолту у него скорость с углами для HO
---------- Сообщение добавлено в 20:18 ---------- Предыдущие сообщение было в 20:16 ---------- Проще пару цифр поменять и перезалить, чем специально сервы искать... КМК |
|
Пользователь сказал cпасибо: |
05.03.2017, 20:20 | #6 |
Местный
Регистрация: 29.06.2010
Адрес: Москва
Сообщений: 2,838
Сказал(а) 'не согласен(а)'!: 6
Сказали 'не согласен'! 2 раз(а) в 2 сообщениях
Сказал(а) спасибо: 974
Поблагодарили 2,653 раз(а) в 1,570 сообщениях
:
0 за это сообщение 1 Всего Репутация: репутация неоспорима (2679)
|
|
|
Пользователь сказал cпасибо: |
05.03.2017, 20:50 | #7 |
Местный
Регистрация: 06.03.2014
Адрес: Москва
Сообщений: 1,741
Сказал(а) 'не согласен(а)'!: 5
Сказали 'не согласен'! 9 раз(а) в 7 сообщениях
Сказал(а) спасибо: 553
Поблагодарили 2,794 раз(а) в 755 сообщениях
:
0 за это сообщение 0 Всего Репутация: репутация неоспорима (2791)
|
|
|
Пользователь сказал cпасибо: |
05.03.2017, 20:58 | #8 |
Местный
Регистрация: 29.06.2010
Адрес: Москва
Сообщений: 2,838
Сказал(а) 'не согласен(а)'!: 6
Сказали 'не согласен'! 2 раз(а) в 2 сообщениях
Сказал(а) спасибо: 974
Поблагодарили 2,653 раз(а) в 1,570 сообщениях
:
0 за это сообщение 1 Всего Репутация: репутация неоспорима (2679)
|
|
|
Пользователь сказал cпасибо: |
05.03.2017, 22:10 | #9 | |
Заглянувший
Регистрация: 26.01.2013
Адрес: Минск
Сообщений: 204
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 1 раз в 1 сообщении
Сказал(а) спасибо: 458
Поблагодарили 454 раз(а) в 135 сообщениях
:
0 за это сообщение 0 Всего Репутация: - луч света в тёмном царстве (454)
|
Цитата:
|
|
|
4 пользователя(ей) сказали cпасибо: |
05.03.2017, 23:26 | #10 | |
Местный
Регистрация: 06.03.2014
Адрес: Москва
Сообщений: 1,741
Сказал(а) 'не согласен(а)'!: 5
Сказали 'не согласен'! 9 раз(а) в 7 сообщениях
Сказал(а) спасибо: 553
Поблагодарили 2,794 раз(а) в 755 сообщениях
:
0 за это сообщение 0 Всего Репутация: репутация неоспорима (2791)
|
Спасибо, не знал. В примерах просто везде на ШИМ повешены сервы.
---------- Сообщение добавлено в 23:26 ---------- Предыдущие сообщение было в 23:19 ---------- Цитата:
можно и тумблера, вместо переменной CurrentPosition считывать состояние входа тумблера. я вот тут не смог найти взаимосвязи если допиливать до DCC, то кнопки тут не помеха. Если стрелка перевелась по команде, меняете в переменной текущее положение и все. Дальше от кнопки все будет работать как надо. А вот с тумблерами какраз так не выйдет. Ибо обнаружив, что тумблер находится в положении "прямо", а только что с КС стрелка перевелась в бок, ее тут же вернет в прямое положение. Думаю именно по этой причине, местные декодеры работают либо от тумблеров, либо от КС. |
|
|
06.03.2017, 03:21 | #11 |
Местный
Регистрация: 29.06.2010
Адрес: Москва
Сообщений: 2,838
Сказал(а) 'не согласен(а)'!: 6
Сказали 'не согласен'! 2 раз(а) в 2 сообщениях
Сказал(а) спасибо: 974
Поблагодарили 2,653 раз(а) в 1,570 сообщениях
:
0 за это сообщение 1 Всего Репутация: репутация неоспорима (2679)
|
|
|
06.03.2017, 10:15 | #12 |
Местный
Регистрация: 06.03.2014
Адрес: Москва
Сообщений: 1,741
Сказал(а) 'не согласен(а)'!: 5
Сказали 'не согласен'! 9 раз(а) в 7 сообщениях
Сказал(а) спасибо: 553
Поблагодарили 2,794 раз(а) в 755 сообщениях
:
0 за это сообщение 0 Всего Репутация: репутация неоспорима (2791)
|
|
|
06.03.2017, 10:56 | #13 |
Местный
Регистрация: 29.06.2010
Адрес: Москва
Сообщений: 2,838
Сказал(а) 'не согласен(а)'!: 6
Сказали 'не согласен'! 2 раз(а) в 2 сообщениях
Сказал(а) спасибо: 974
Поблагодарили 2,653 раз(а) в 1,570 сообщениях
:
0 за это сообщение 1 Всего Репутация: репутация неоспорима (2679)
|
Заходим вот сюда http://wiki.rocrail.net/doku.php?id=dccpp:dccpp-en
И ищем G-ASH02. |
|
2 пользователя(ей) сказали cпасибо: |
06.03.2017, 11:32 | #14 |
Местный
Регистрация: 06.03.2014
Адрес: Москва
Сообщений: 1,741
Сказал(а) 'не согласен(а)'!: 5
Сказали 'не согласен'! 9 раз(а) в 7 сообщениях
Сказал(а) спасибо: 553
Поблагодарили 2,794 раз(а) в 755 сообщениях
:
0 за это сообщение 0 Всего Репутация: репутация неоспорима (2791)
|
|
|
13.03.2017, 00:16 | #15 |
Заглянувший
Регистрация: 15.01.2012
Адрес: Минск
Сообщений: 30
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 0 раз(а) в 0 сообщениях
Сказал(а) спасибо: 7
Поблагодарили 12 раз(а) в 7 сообщениях
:
0 за это сообщение 0 Всего Репутация: на пути к лучшему (12)
|
Подскажите пожалуйста такую вещь. Замутил пока такую схему (пока тренируюсь, нажимаю левую кнопку, загорается правый диод и сервы поворачиваются в одну сторону, нажимаю правую - загорается правый диод и сервы поворачиваютчя в другую сторону). После поворота сервы часто гудят. Из за чего это может быть?
|
|
13.03.2017, 01:00 | #16 |
Местный
Регистрация: 06.03.2014
Адрес: Москва
Сообщений: 1,741
Сказал(а) 'не согласен(а)'!: 5
Сказали 'не согласен'! 9 раз(а) в 7 сообщениях
Сказал(а) спасибо: 553
Поблагодарили 2,794 раз(а) в 755 сообщениях
:
0 за это сообщение 0 Всего Репутация: репутация неоспорима (2791)
|
|
|
13.03.2017, 01:25 | #17 |
Заглянувший
Регистрация: 15.01.2012
Адрес: Минск
Сообщений: 30
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 0 раз(а) в 0 сообщениях
Сказал(а) спасибо: 7
Поблагодарили 12 раз(а) в 7 сообщениях
:
0 за это сообщение 0 Всего Репутация: на пути к лучшему (12)
|
Завтра уже проверю. А delay() надо делать перед detach(), что бы сервы успели занять свое положение?
|
|
13.03.2017, 01:32 | #18 |
Местный
Регистрация: 06.03.2014
Адрес: Москва
Сообщений: 1,741
Сказал(а) 'не согласен(а)'!: 5
Сказали 'не согласен'! 9 раз(а) в 7 сообщениях
Сказал(а) спасибо: 553
Поблагодарили 2,794 раз(а) в 755 сообщениях
:
0 за это сообщение 0 Всего Репутация: репутация неоспорима (2791)
|
|
|
13.03.2017, 14:21 | #19 |
Заглянувший
Регистрация: 09.01.2016
Адрес: Санкт-Петербург
Сообщений: 103
Сказал(а) 'не согласен(а)'!: 3
Сказали 'не согласен'! 1 раз в 1 сообщении
Сказал(а) спасибо: 305
Поблагодарили 50 раз(а) в 29 сообщениях
:
0 за это сообщение 0 Всего Репутация: скоро придёт к известности (50)
|
|
|
13.03.2017, 14:56 | #20 |
Местный
Регистрация: 06.03.2014
Адрес: Москва
Сообщений: 1,741
Сказал(а) 'не согласен(а)'!: 5
Сказали 'не согласен'! 9 раз(а) в 7 сообщениях
Сказал(а) спасибо: 553
Поблагодарили 2,794 раз(а) в 755 сообщениях
:
0 за это сообщение 0 Всего Репутация: репутация неоспорима (2791)
|
|
|
Пользователь сказал cпасибо: |
13.03.2017, 15:08 | #21 |
Заглянувший
Регистрация: 17.06.2013
Адрес: Санкт-Петербург
Сообщений: 227
Сказал(а) 'не согласен(а)'!: 8
Сказали 'не согласен'! 4 раз(а) в 2 сообщениях
Сказал(а) спасибо: 206
Поблагодарили 329 раз(а) в 99 сообщениях
:
0 за это сообщение 0 Всего Репутация: как роза среди колючек (329)
|
Зачем так человека пугаете!
И Вам тоже Доброго времени! И на 15 серв с одной платы возможно. Только, пожалуй, не с одновременным срабатыванием. Иначе, как говорят, "просядет" напряжение Не бойтесь! Главная истина: не нужно быть "электронщиком" для того, чтобы научиться играть с ардуиной и её принадлежностями (датчиками, сервомоторами и прочими компонентами) |
|
Пользователь сказал cпасибо: |
13.03.2017, 15:16 | #22 | |
Ĩ.Ĉ.Š.ҧрѻҫҭҩ мӥҫҭҿӄѣӤ.Ҟ.Ҫ
Регистрация: 10.07.2006
Адрес: 13 верста У.Г.Ж.Д. HOe.N.Z? . . G.Oe.HO!
Сообщений: 2,432
Сказал(а) 'не согласен(а)'!: 466
Сказали 'не согласен'! 136 раз(а) в 123 сообщениях
Сказал(а) спасибо: 3,326
Поблагодарили 7,264 раз(а) в 2,868 сообщениях
:
0 за это сообщение 0 Всего Репутация: репутация неоспорима (7893)
|
у вас разве атмега8 ?
Цитата:
|
|
|
13.03.2017, 15:17 | #23 |
Заглянувший
Регистрация: 09.01.2016
Адрес: Санкт-Петербург
Сообщений: 103
Сказал(а) 'не согласен(а)'!: 3
Сказали 'не согласен'! 1 раз в 1 сообщении
Сказал(а) спасибо: 305
Поблагодарили 50 раз(а) в 29 сообщениях
:
0 за это сообщение 0 Всего Репутация: скоро придёт к известности (50)
|
|
|
13.03.2017, 15:20 | #24 |
Местный
Регистрация: 14.02.2014
Адрес: Санкт-Петербург, Пушкин, Александровская
Сообщений: 1,968
Сказал(а) 'не согласен(а)'!: 118
Сказали 'не согласен'! 26 раз(а) в 22 сообщениях
Сказал(а) спасибо: 3,182
Поблагодарили 5,756 раз(а) в 1,222 сообщениях
:
0 за это сообщение 0 Всего Репутация: репутация неоспорима (5777)
|
Если Вы внимательно посмотреть на предложенный скетч, то видно, что в каждый момент времени обращение идёт лишь к одной серве, и повернув её на 1 градус, "ардуина" обращается к следующей.
|
|
13.03.2017, 15:22 | #25 |
Заглянувший
Регистрация: 15.01.2012
Адрес: Минск
Сообщений: 30
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 0 раз(а) в 0 сообщениях
Сказал(а) спасибо: 7
Поблагодарили 12 раз(а) в 7 сообщениях
:
0 за это сообщение 0 Всего Репутация: на пути к лучшему (12)
|
Так по идее надо просто на питание серв отдельную "шину" кинуть, а не с платы ардуино брать. Главное что бы хватило самих пинов для управления сервами, кнопками и диодами.
А такое количество плат нужно потому что у УНО - 14 выходов, Если управлять одной кнопкой, то надо пин на кнопку, 2 пина на диоды, пин на серву. Итого 4 пина на серву. В итоге 14/4 = 3.5, или 3 сервы на УНО, и 54/3 = 18 серв на Мегу. ЗЫ. У меня 2 сервы одновременно крутились. Там по идее одномоментно пустил сигнал на поворот и приступил к следующей серве. Вечером попробую видео снять. |
|
Опции темы | |
Опции просмотра | |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Простой блок управления освещением аналогового макета на базе Ардуино Нано | morshamenn | Arduino | 13 | 10.12.2022 22:51 |
Пульт аналогового управления макетом | SergiyW | Электрика и DCC | 46 | 10.05.2016 00:00 |
Управление траверсером | Crown | Электрика и DCC | 34 | 13.11.2012 22:35 |
Управление на ик лучах | GOGA | Электрика и DCC | 38 | 29.12.2008 00:56 |
Цифровое управление | Илья | Электрика и DCC | 26 | 15.07.2008 19:52 |