![]() |
![]() |
#1 |
Местный
Регистрация: 06.03.2014
Адрес: Москва
Сообщений: 1,741
Сказал(а) 'не согласен(а)'!: 5
Сказали 'не согласен'! 9 раз(а) в 7 сообщениях
Сказал(а) спасибо: 553
Поблагодарили 2,771 раз(а) в 754 сообщениях
Репутация: репутация неоспорима (2768)
![]() |
![]()
Дело было в выходной...
Делать было нечего... Пусть и не складно, но по теме ![]() Накидал скетч управления тремя сервами с трех кнопок с отображением положения стрелки. Может и было уже, но интересно было самому поиграться, да и камрад на соседнем форуме озадачился таким девайсом для своего аналогового макета. В принципе, ничего не мешает и на цифровом его использовать, но без управления от КС. При включении - сервы выворачивает в последнее состояние (если вдруг их свернули) "Грабли" обнаружены одни, при переводе из положения 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пасибо: |
![]() |
#2 | |
Пользователь
Регистрация: 14.10.2014
Адрес: Москва
Сообщений: 732
Сказал(а) 'не согласен(а)'!: 11
Сказали 'не согласен'! 2 раз(а) в 2 сообщениях
Сказал(а) спасибо: 10,822
Поблагодарили 1,869 раз(а) в 657 сообщениях
Репутация: обеспечил(а) себе прекрасное будущее (1890)
![]() |
![]() Цитата:
Ваше решение весьма элегантно и вдобавок - экономия ![]() |
|
![]() |
![]() |
4 пользователя(ей) сказали cпасибо: |
![]() |
#3 |
Местный
Регистрация: 06.03.2009
Адрес: Питер
Сообщений: 3,659
Сказал(а) 'не согласен(а)'!: 10
Сказали 'не согласен'! 0 раз(а) в 0 сообщениях
Сказал(а) спасибо: 6,795
Поблагодарили 4,770 раз(а) в 1,807 сообщениях
Репутация: репутация неоспорима (5053)
![]() |
![]()
В качестве улучшения проекта, можно добавить режимы программирования углов поворота по кнопке. Я такое делал на модуле управления переездом. А чтобы не заморачиваться с реализацией медленного перемещения на обычных серва на стандартной библиотеке, можно использовать "медленные" сервы. Разница в цене не особая.
__________________
HO, цифра, OpenDCC, S-88N, OpenCar, BiDiB С приветом из подземки!!! |
![]() |
![]() |
8 пользователя(ей) сказали cпасибо: |
![]() |
#4 |
![]() |
![]() ![]() |
Пользователь сказал cпасибо: |
![]() |
#5 |
Местный
Регистрация: 06.03.2014
Адрес: Москва
Сообщений: 1,741
Сказал(а) 'не согласен(а)'!: 5
Сказали 'не согласен'! 9 раз(а) в 7 сообщениях
Сказал(а) спасибо: 553
Поблагодарили 2,771 раз(а) в 754 сообщениях
Репутация: репутация неоспорима (2768)
![]() |
![]()
у мня в хозяйстве все есть
![]() ![]() ---------- Сообщение добавлено в 20:18 ---------- Предыдущие сообщение было в 20:16 ---------- Проще пару цифр поменять и перезалить, чем специально сервы искать... КМК |
![]() |
![]() |
Пользователь сказал cпасибо: |
![]() |
#6 |
Местный
Регистрация: 29.06.2010
Адрес: Москва
Сообщений: 2,281
Сказал(а) 'не согласен(а)'!: 5
Сказали 'не согласен'! 2 раз(а) в 2 сообщениях
Сказал(а) спасибо: 782
Поблагодарили 2,195 раз(а) в 1,273 сообщениях
Репутация: репутация неоспорима (2211)
![]() |
![]() |
![]() |
![]() |
Пользователь сказал cпасибо: |
![]() |
#7 |
Местный
Регистрация: 06.03.2014
Адрес: Москва
Сообщений: 1,741
Сказал(а) 'не согласен(а)'!: 5
Сказали 'не согласен'! 9 раз(а) в 7 сообщениях
Сказал(а) спасибо: 553
Поблагодарили 2,771 раз(а) в 754 сообщениях
Репутация: репутация неоспорима (2768)
![]() |
![]() |
![]() |
![]() |
Пользователь сказал cпасибо: |
![]() |
#8 |
Местный
Регистрация: 29.06.2010
Адрес: Москва
Сообщений: 2,281
Сказал(а) 'не согласен(а)'!: 5
Сказали 'не согласен'! 2 раз(а) в 2 сообщениях
Сказал(а) спасибо: 782
Поблагодарили 2,195 раз(а) в 1,273 сообщениях
Репутация: репутация неоспорима (2211)
![]() |
![]() |
![]() |
![]() |
Пользователь сказал cпасибо: |
![]() |
#9 | |
Заглянувший
Регистрация: 26.01.2013
Адрес: Минск
Сообщений: 152
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 1 раз в 1 сообщении
Сказал(а) спасибо: 348
Поблагодарили 355 раз(а) в 102 сообщениях
Репутация: - очень-очень хороший человек (355)
![]() |
![]() Цитата:
|
|
![]() |
![]() |
4 пользователя(ей) сказали cпасибо: |
![]() |
#10 | |
Местный
Регистрация: 06.03.2014
Адрес: Москва
Сообщений: 1,741
Сказал(а) 'не согласен(а)'!: 5
Сказали 'не согласен'! 9 раз(а) в 7 сообщениях
Сказал(а) спасибо: 553
Поблагодарили 2,771 раз(а) в 754 сообщениях
Репутация: репутация неоспорима (2768)
![]() |
![]()
Спасибо, не знал. В примерах просто везде на ШИМ повешены сервы.
---------- Сообщение добавлено в 23:26 ---------- Предыдущие сообщение было в 23:19 ---------- Цитата:
можно и тумблера, вместо переменной CurrentPosition считывать состояние входа тумблера. я вот тут не смог найти взаимосвязи если допиливать до DCC, то кнопки тут не помеха. Если стрелка перевелась по команде, меняете в переменной текущее положение и все. Дальше от кнопки все будет работать как надо. А вот с тумблерами какраз так не выйдет. Ибо обнаружив, что тумблер находится в положении "прямо", а только что с КС стрелка перевелась в бок, ее тут же вернет в прямое положение. Думаю именно по этой причине, местные декодеры работают либо от тумблеров, либо от КС. |
|
![]() |
![]() |
![]() |
#11 |
Местный
Регистрация: 29.06.2010
Адрес: Москва
Сообщений: 2,281
Сказал(а) 'не согласен(а)'!: 5
Сказали 'не согласен'! 2 раз(а) в 2 сообщениях
Сказал(а) спасибо: 782
Поблагодарили 2,195 раз(а) в 1,273 сообщениях
Репутация: репутация неоспорима (2211)
![]() |
![]() |
![]() |
![]() |
![]() |
#12 |
Местный
Регистрация: 06.03.2014
Адрес: Москва
Сообщений: 1,741
Сказал(а) 'не согласен(а)'!: 5
Сказали 'не согласен'! 9 раз(а) в 7 сообщениях
Сказал(а) спасибо: 553
Поблагодарили 2,771 раз(а) в 754 сообщениях
Репутация: репутация неоспорима (2768)
![]() |
![]() |
![]() |
![]() |
![]() |
#13 |
Местный
Регистрация: 29.06.2010
Адрес: Москва
Сообщений: 2,281
Сказал(а) 'не согласен(а)'!: 5
Сказали 'не согласен'! 2 раз(а) в 2 сообщениях
Сказал(а) спасибо: 782
Поблагодарили 2,195 раз(а) в 1,273 сообщениях
Репутация: репутация неоспорима (2211)
![]() |
![]()
Заходим вот сюда http://wiki.rocrail.net/doku.php?id=dccpp:dccpp-en
И ищем G-ASH02. |
![]() |
![]() |
2 пользователя(ей) сказали cпасибо: |
![]() |
#14 |
Местный
Регистрация: 06.03.2014
Адрес: Москва
Сообщений: 1,741
Сказал(а) 'не согласен(а)'!: 5
Сказали 'не согласен'! 9 раз(а) в 7 сообщениях
Сказал(а) спасибо: 553
Поблагодарили 2,771 раз(а) в 754 сообщениях
Репутация: репутация неоспорима (2768)
![]() |
![]() |
![]() |
![]() |
![]() |
#15 |
Заглянувший
Регистрация: 15.01.2012
Адрес: Минск
Сообщений: 30
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 0 раз(а) в 0 сообщениях
Сказал(а) спасибо: 7
Поблагодарили 11 раз(а) в 6 сообщениях
Репутация: на пути к лучшему (11)
![]() |
![]()
Подскажите пожалуйста такую вещь. Замутил пока такую схему (пока тренируюсь, нажимаю левую кнопку, загорается правый диод и сервы поворачиваются в одну сторону, нажимаю правую - загорается правый диод и сервы поворачиваютчя в другую сторону). После поворота сервы часто гудят. Из за чего это может быть?
|
![]() |
![]() |
![]() |
#16 |
Местный
Регистрация: 06.03.2014
Адрес: Москва
Сообщений: 1,741
Сказал(а) 'не согласен(а)'!: 5
Сказали 'не согласен'! 9 раз(а) в 7 сообщениях
Сказал(а) спасибо: 553
Поблагодарили 2,771 раз(а) в 754 сообщениях
Репутация: репутация неоспорима (2768)
![]() |
![]() |
![]() |
![]() |
![]() |
#17 |
Заглянувший
Регистрация: 15.01.2012
Адрес: Минск
Сообщений: 30
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 0 раз(а) в 0 сообщениях
Сказал(а) спасибо: 7
Поблагодарили 11 раз(а) в 6 сообщениях
Репутация: на пути к лучшему (11)
![]() |
![]()
Завтра уже проверю. А delay() надо делать перед detach(), что бы сервы успели занять свое положение?
|
![]() |
![]() |
![]() |
#18 |
Местный
Регистрация: 06.03.2014
Адрес: Москва
Сообщений: 1,741
Сказал(а) 'не согласен(а)'!: 5
Сказали 'не согласен'! 9 раз(а) в 7 сообщениях
Сказал(а) спасибо: 553
Поблагодарили 2,771 раз(а) в 754 сообщениях
Репутация: репутация неоспорима (2768)
![]() |
![]() |
![]() |
![]() |
![]() |
#19 |
Заглянувший
Регистрация: 09.01.2016
Адрес: Санкт-Петербург
Сообщений: 103
Сказал(а) 'не согласен(а)'!: 3
Сказали 'не согласен'! 1 раз в 1 сообщении
Сказал(а) спасибо: 305
Поблагодарили 50 раз(а) в 29 сообщениях
Репутация: скоро придёт к известности (50)
![]() |
![]() |
![]() |
![]() |
![]() |
#20 |
Местный
Регистрация: 06.03.2014
Адрес: Москва
Сообщений: 1,741
Сказал(а) 'не согласен(а)'!: 5
Сказали 'не согласен'! 9 раз(а) в 7 сообщениях
Сказал(а) спасибо: 553
Поблагодарили 2,771 раз(а) в 754 сообщениях
Репутация: репутация неоспорима (2768)
![]() |
![]() |
![]() |
![]() |
Пользователь сказал cпасибо: |
![]() |
#21 |
Заглянувший
Регистрация: 17.06.2013
Адрес: Санкт-Петербург
Сообщений: 227
Сказал(а) 'не согласен(а)'!: 8
Сказали 'не согласен'! 4 раз(а) в 2 сообщениях
Сказал(а) спасибо: 206
Поблагодарили 329 раз(а) в 99 сообщениях
Репутация: как роза среди колючек (329)
![]() |
![]()
Зачем так человека пугаете!
И Вам тоже Доброго времени! И на 15 серв с одной платы возможно. Только, пожалуй, не с одновременным срабатыванием. Иначе, как говорят, "просядет" напряжение ![]() Не бойтесь! Главная истина: не нужно быть "электронщиком" для того, чтобы научиться играть с ардуиной и её принадлежностями (датчиками, сервомоторами и прочими компонентами) ![]() |
![]() |
![]() |
Пользователь сказал cпасибо: |
![]() |
#22 | |
Ĩ.Ĉ.Šҧрѻҫҭҩ мӥҫҭҿӄѣ Ӥ.Ҟ.Ҫ
Регистрация: 10.07.2006
Адрес: 13 верста У.Г.Ж.Д. G.Oe.HO! HOe.N.Z?
Сообщений: 1,680
Сказал(а) 'не согласен(а)'!: 382
Сказали 'не согласен'! 122 раз(а) в 111 сообщениях
Сказал(а) спасибо: 2,817
Поблагодарили 6,379 раз(а) в 2,445 сообщениях
Репутация: репутация неоспорима (7008)
![]() |
![]()
у вас разве атмега8 ?
Цитата:
|
|
![]() |
![]() |
![]() |
#23 |
Заглянувший
Регистрация: 09.01.2016
Адрес: Санкт-Петербург
Сообщений: 103
Сказал(а) 'не согласен(а)'!: 3
Сказали 'не согласен'! 1 раз в 1 сообщении
Сказал(а) спасибо: 305
Поблагодарили 50 раз(а) в 29 сообщениях
Репутация: скоро придёт к известности (50)
![]() |
![]() |
![]() |
![]() |
![]() |
#24 |
Местный
Регистрация: 14.02.2014
Адрес: Санкт-Петербург, Пушкин, Александровская
Сообщений: 1,873
Сказал(а) 'не согласен(а)'!: 108
Сказали 'не согласен'! 26 раз(а) в 22 сообщениях
Сказал(а) спасибо: 2,939
Поблагодарили 5,510 раз(а) в 1,156 сообщениях
Репутация: репутация неоспорима (5514)
![]() |
![]()
Если Вы внимательно посмотреть на предложенный скетч, то видно, что в каждый момент времени обращение идёт лишь к одной серве, и повернув её на 1 градус, "ардуина" обращается к следующей.
|
![]() |
![]() |
![]() |
#25 |
Заглянувший
Регистрация: 15.01.2012
Адрес: Минск
Сообщений: 30
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 0 раз(а) в 0 сообщениях
Сказал(а) спасибо: 7
Поблагодарили 11 раз(а) в 6 сообщениях
Репутация: на пути к лучшему (11)
![]() |
![]()
Так по идее надо просто на питание серв отдельную "шину" кинуть, а не с платы ардуино брать. Главное что бы хватило самих пинов для управления сервами, кнопками и диодами.
А такое количество плат нужно потому что у УНО - 14 выходов, Если управлять одной кнопкой, то надо пин на кнопку, 2 пина на диоды, пин на серву. Итого 4 пина на серву. В итоге 14/4 = 3.5, или 3 сервы на УНО, и 54/3 = 18 серв на Мегу. ЗЫ. У меня 2 сервы одновременно крутились. Там по идее одномоментно пустил сигнал на поворот и приступил к следующей серве. Вечером попробую видео снять. |
![]() |
![]() |
![]() |
Опции темы | |
Опции просмотра | |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Простой блок управления освещением аналогового макета на базе Ардуино Нано | morshamenn | Arduino | 12 | 27.11.2019 21:59 |
Пульт аналогового управления макетом | 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 |