Самоделки для фотографирования "кар"
|
|
yurik_ryba | Дата: Среда, 05.09.2012, 03:27 | Сообщение # 421 |
Группа: Старичок
Сообщений: 692
Награды: 0
Статус: Offline
Город: Calgary, Canada
| С Маэстро должна эта схема работать, он тоже PWM-импульсы выдает. В принципе то на то и выходит. Либо купить готовое устройство с коннекторами и в корпусе, либо купить микросхему и потом сидеть самому это устройство создавать. И не факт что еще правильно сделаете. Очень это дело на любителя.
|
|
| |
Sergey | Дата: Среда, 05.09.2012, 09:49 | Сообщение # 422 |
Admin
Группа: Банить не буду
Сообщений: 2681
Награды: 7
Статус: Offline
Город: Владивосток
| Согласен, просто цена вопроса 50р против 500р
|
|
| |
yurik_ryba | Дата: Четверг, 06.09.2012, 03:12 | Сообщение # 423 |
Группа: Старичок
Сообщений: 692
Награды: 0
Статус: Offline
Город: Calgary, Canada
| 50 р - это малюсенькая черненькая микросхемка - и всё. Все остальное тоже будет денег стоить и труда, может и больше обойдется. У меня в местном хозяйственном паяльник самый дешевый - 30 баксов например. Для начала... А на чем собирать схему? А еще и руки вечно трясутся
Мне вот что не понятно из статьи: как эта микросхема действует на практике? Какие значения переводит в какие?
Ну вот с той штучкой по моей ссылке все ясно: Quote PWM Signal: 1ms - 2ms will give full reverse to full forward, 1.5ms is neutral, 200µs for brake mode (like neutral, but motor terminals shunted together). Допустим я маэстрой даю 1000 µs - моторчик крутится на полной скорости назад. Даешь 2000 µs - полный вперед. 1500 нейтраль, 200 - тормоз сменой полярности.
А на эту схему какие импульсы подавать? Что будет в результате?
|
|
| |
Sergey | Дата: Четверг, 06.09.2012, 19:10 | Сообщение # 424 |
Admin
Группа: Банить не буду
Сообщений: 2681
Награды: 7
Статус: Offline
Город: Владивосток
| я сейчас не дома... на саммите, на Русском... и под рукой нет схем и рисунков... Поэтому словесно напишу. Схема рассчитана на два полярных двигателя. Соответственно для каждого идёт питающий выход и по два управляющих входа. Если на один вход подать сигнал от 0 до 1024 (0-5V), двигатель будет крутится в одну сторону со скоростью соответствующей поданному сигналу, если на второй - соответственно кручение двигателя будет в другую. Для того чтб двигатель не дёргал при запуске и остановке, используется код счётчик (буду дома выложу)
|
|
| |
Polaris79 | Дата: Суббота, 15.09.2012, 01:02 | Сообщение # 425 |
Группа: Старичок
Сообщений: 418
Награды: 0
Статус: Offline
Город: Noname
| Quote (Sergey) Ребята не усложняйте себе задачу. Простым двигателем простое управление нужно делать. Достаточно простого драйвера либо готового который стоит рублей 30, либо из 4 диодов
диоды там в коллекторной цепи только чтобы обратные токи компенсировать. В принципе для одного двигателя двух транзисторов и два диода(можно в принципе и без диодов если двигло маломощное а они у нас какраз все маломощные) хватит вполне.Добавлено (15.09.2012, 01:02) --------------------------------------------- народ где вы шестеренки для серв чтобы сделать передачу понижающую берете ? Я разбираю CDприводы и видеомагнитофоны но там шестерни без фиксатора и без крепежа на штифт сервы .... приходиться извращаться с эпоксидкой и напильником - ну ооооочень удручает
|
|
| |
Sergey | Дата: Суббота, 15.09.2012, 09:49 | Сообщение # 426 |
Admin
Группа: Банить не буду
Сообщений: 2681
Награды: 7
Статус: Offline
Город: Владивосток
| На первый риг брал в хобикинг, вертолётные большую и маленькую шестерни. Маленькая как раз подходит по внутреннему диаметру на вал двигателя с редуктором, а большая уже идёт с валом. А на второй риг брал червячную предачу из запасов друга подгонял под серву.
|
|
| |
dp | Дата: Четверг, 08.11.2012, 23:18 | Сообщение # 427 |
Группа: Старичок
Сообщений: 533
Награды: 0
Статус: Offline
Город: Белгород
| Возникла у меня необходимость удаленно замыкать пин ардуины на землю, для переключениями между автоматическим и ручным управлением. Вообще вся замануха вот из чего - у меня приемник\передатчик спектрумовские (AR8000 и DX8). А с приемника только ШИМ сигнал идет - я хз как заставить ардуину понять включен определенный тумблер на пульте или нет))) Почитал, подумал, плюнул и сделал такой изврат
Слева подходит пин на включение автоматического режима (паноцикл), а справа пин на фотоспуск (ИК диод). Сама сервочка управляется стиком рудера) Вот такая жесть - может кто подскажет как программно это реализовать? Вот код который работает сейчас - тут даже есть кусок кода Сергея)))
Code #include <Servo.h> #include <multiCameraIrControl.h>
/////////////////////////////////////////////////////////////////// // Номера входов и выходов ///////////////////////////////////////////////////////////////////
int servo_gor_pin = 7; // пин для сервы горизонтального поворота камеры int servo_vert_pin = 6; // пин для сервы вертикального поворота камеры
int manual_pin = 10; // пин включающий ручное управление с пульта int manual_gor_pin = 12; // вход сигнала с приёмника для горизонтальной сервы int manual_vert_pin = 11; // вход сигнала с приёмника для вертикальной сервы
/////////////////////////////////////////////////////////////////// // Объекты программы ///////////////////////////////////////////////////////////////////
Servo servo_gor; // создаём объект для контроля сервы горизонтального поворота Servo servo_vert; Sony nex(9);
/////////////////////////////////////////////////////////////////// // Переменные программы ///////////////////////////////////////////////////////////////////
boolean servo_gor_go = LOW; int posv1 = 70; int posv2 = 100; int posv3 = 50; int posr = 92;
/////////////////////////////////////////////////////////////////// // Инициализация ///////////////////////////////////////////////////////////////////
void setup() { pinMode(servo_vert_pin, OUTPUT); pinMode(servo_gor_pin, OUTPUT); pinMode(manual_vert_pin, INPUT); pinMode(manual_gor_pin, INPUT); pinMode(manual_pin, INPUT); servo_vert.attach(servo_vert_pin); servo_gor.attach(servo_gor_pin); digitalWrite(manual_pin, HIGH); }
/////////////////////////////////////////////////////////////////// // Автоматическое управление ///////////////////////////////////////////////////////////////////
void ServoGor(boolean g) // функция поворота сервы горизонта { int p; if(g==HIGH) { servo_gor_go = HIGH; servo_gor.attach(servo_gor_pin); // подключаем серву горизонтальную for(p=1525; p<=1600; p++) { servo_gor.writeMicroseconds(p); delay(3); } } if(g==LOW) { servo_gor_go = LOW; for(p=1600; p>=1525; p--) { servo_gor.writeMicroseconds(p); delay(3); } servo_gor.detach(); //отключаем серву горизонтальную } }
void cycle() { servo_gor.write(posr); servo_vert.write(posv2); delay(800); shutter(); delay(800); servo_vert.write(posv1); delay(800); shutter(); delay(800); ServoGor(HIGH); delay(400); ServoGor(LOW); }
void shutter() { nex.shutterNow(); }
void auto_loop() { for (int i=0;i<9;i++) cycle();
servo_vert.write(posv3); delay(800); shutter(); delay(800); }
/////////////////////////////////////////////////////////////////// // Ручное управление /////////////////////////////////////////////////////////////////// void manual_loop() { digitalWrite(servo_gor_pin, digitalRead(manual_gor_pin)); digitalWrite(servo_vert_pin, digitalRead(manual_vert_pin)); } /////////////////////////////////////////////////////////////////// // Основной цикл ///////////////////////////////////////////////////////////////////
int is_manual = 0;
void loop() { if (digitalRead(manual_pin) == HIGH) { if (is_manual != 1) { // Detach servo drivers if (servo_vert.attached() == true) servo_vert.detach();
if (servo_gor.attached() == true) servo_gor.detach();
is_manual = 1; }
manual_loop(); } else { if (is_manual != 0) { if (servo_vert.attached() == false) servo_vert.attach(servo_vert_pin);
if (servo_gor.attached() == false) servo_gor.attach(servo_gor_pin);
is_manual = 0; }
auto_loop(); } } Добавлено (08.11.2012, 23:18) --------------------------------------------- А и еще - теперь сервы подергиваться стали Без ардуины норм - с ардуиной дергаются.... в чем беда? Подозреваю что есть всетаки расхождения в сигнале с приемника\ардуины
Сообщение отредактировал dp - Четверг, 08.11.2012, 23:14 |
|
| |
Sergey | Дата: Суббота, 10.11.2012, 19:53 | Сообщение # 428 |
Admin
Группа: Банить не буду
Сообщений: 2681
Награды: 7
Статус: Offline
Город: Владивосток
| Дима, ардуина читает ШИМ сигнал, для этого достаточно управляющий провод (идущий на серву) подключить к одному из свободных портов и прописать:
Code pinMode(12, INPUT); //12й пин – вход
int val; val = digitalRead(12);
Точно не помню какие значения будут выдаваться и посмотреть сейчас не смогу, так как сильно уж упакованы ардуинки в корпуса... нужно всё выпаивать чтоб поэкспериментировать... скоро должны ещё прийти тогда смогу на практике показать, где-то через недельку.
Здесь статья про цифровой вход...
|
|
| |
dp | Дата: Суббота, 10.11.2012, 20:28 | Сообщение # 429 |
Группа: Старичок
Сообщений: 533
Награды: 0
Статус: Offline
Город: Белгород
| Сергей, спасибо! В понедельник попробую, посмотрю что выдаетДобавлено (10.11.2012, 20:28) --------------------------------------------- Сергей, а нет мыслей почему сервы в ручном режиме дергаются? По коду нареканий нет? А то такое впечатление что это ардуина их дергает зачемто постоянно
|
|
| |
Sergey | Дата: Суббота, 10.11.2012, 22:09 | Сообщение # 430 |
Admin
Группа: Банить не буду
Сообщений: 2681
Награды: 7
Статус: Offline
Город: Владивосток
| Если не прописано отключение после каждой каманды, то на сервы постоянно подаётся шим, к значению которого серва и подстраивается. Если идёт ещё какой то сигнал то естественно серва дёргается между ними. Но честно нужно смотреть твою схему... я ещё до сих пор не пойму что ты задумал...
|
|
| |
dp | Дата: Воскресенье, 11.11.2012, 04:11 | Сообщение # 431 |
Группа: Старичок
Сообщений: 533
Награды: 0
Статус: Offline
Город: Белгород
| есть вот такой пульт
и такой приемник с сателитом
ну и соответственно ардуина нано и подвес с сервами Так вот схема сейчас такая - сигнальные провода с приемника заходят на ардуину и выходят на сервы В коде помечены пины С приемника идет ШИМ, соответственно ардуина тупо его транслирует на сервы, когда включено ручное управление Code // Ручное управление /////////////////////////////////////////////////////////////////// void manual_loop() { digitalWrite(servo_gor_pin, digitalRead(manual_gor_pin)); digitalWrite(servo_vert_pin, digitalRead(manual_vert_pin)); }
либо если замкнулся 10 пин - врубается автоматический цикл для панорамы.
Реализацию этого самого замыкания я показал в предыдущем сообщении)) Сначало я хотел повесить замыкание на тумблер aux1 например - у него 3 положения. Прикинул что мне как раз пойдет - 1 положение врубает паноцикл, а второй например будет отсылать каманду ИК диоду (прии ручном управлении спуск затвора). Нифига у меня не получилось - мерил напряжение на выходе приемника (земля-сигнальный провод) напруга меняется помоему 2,16\2,36v в зависимости от положения переключения тумблера. Ардуина не понимает что там включилось или выключилось. Она же вроде от трех вольт реагировать должна. А тут не получается добиться сигнала либо 0 либо 3 вольта. В этом вся фигня, поэтому пришлось извращаться с сервой на замыкание. Сейчас эта серва управляется стиком руддера - влево паноцикл, вправо - ИК диод.
Но еще больше всего добивает - это дерганье серв Сергей, посмотри у меня в коде - там в основном цикле прописано отключение или подключение серв. Что там не так? При автоматическом управлении сервы не дергаются и отрабатывают как надо.
Тут еще контроллер стабилизации есть, с ним еще подружится надо, сейчас на него серва roll заведена - крен отрабатывает
|
|
| |
Sergey | Дата: Воскресенье, 11.11.2012, 14:22 | Сообщение # 432 |
Admin
Группа: Банить не буду
Сообщений: 2681
Награды: 7
Статус: Offline
Город: Владивосток
| Пульт с обратной связью... интересная штука...
Вот так выглядит код для прерывания открытых портов для серв: Code Servo myservo; // объявляем серву int pin = 7; // назначаем порт для сервы int val; // переменная для значения угла поворота сервы //------------------ void setup() { //---- для сервы ничего здесь не пишем //---- } //------------------ void loop() // исполняющая функция (может быть базовая может быть собственная какая нибудь) { if(......)// если чего-то там, то { val = ........ // выясняем значение myservo.attach(pin); // открываем порт для сервы myservo.writeMicroseconds(val); // выполняем команду delay(30); // ждём выполнение этой команды (значение можно поставить больше или меньше зависит от характера команды) myservo.detach(); // закрываем порт для сервы } }
Но если серва разработанная то может вес камеры её проворачивать, тогда этот код уже не годится, отключение делать нельзя, серва постоянно должна держать угол. У меня сервы крутят через червячную передачу...
Ещё Дима обратите внимание что открывать порты нужно в теле исполняющих функциях, а не в инициализирующей (void setup()) как у вас.
Но если всё таки сервы проворачиваются значит от отключения портов нужно отказыватся... тогда код будет выглядеть вот так: Code Servo myservo; // объявляем серву int pin = 7; // назначаем порт для сервы int val; // переменная для значения угла поворота сервы //------------------ void setup() { //---- myservo.attach(pin); // открываем порт для сервы //---- } //------------------ void loop() // исполняющая функция (может быть базовая может быть собственная какая нибудь) { if(......)// если чего-то там, то { val = ........ // выясняем значение myservo.writeMicroseconds(val); // выполняем команду delay(30); // ждём выполнение этой команды (значение можно поставить больше или меньше зависит от характера команды) } }
ещё, лучше прописывать значения в команды отдельно: Code digitalWrite(servo_vert_pin, digitalRead(manual_vert_pin)); //не желательно
int val= digitalRead(manual_vert_pin); digitalWrite(servo_vert_pin,val); //так лучше
Quote (dp) Нифига у меня не получилось - мерил напряжение на выходе приемника (земля-сигнальный провод) напруга меняется помоему 2,16\2,36v в зависимости от положения переключения тумблера. С приёмника идёт модулированный сигнал, он потом расшифровывается и дальше уже выдаются команды в виде 1-0 или же в виде ШИМ для серв. Подключатся нужно там, где вот эти выходы для серв по три контакта на картинке у вас. Попробуйте считать значение с контакта который идёт на управление, с помощью самой ардуины. Подключите к 10 пину управляющий, а питание ардуины и контролера должно быть общим. И пропишите вот такой код: Code int pin = 10; //даём номер пина для входящего сигнала int val_1=0; int val_2=0;
void setup() { pinMode(pin, INPUT); // открываем порт, даём значение ВХОД Serial.begin(9600); // полученные даннные будем записывать в COM-порт } void loop() { val_1 = digitalRead(pin); // считываем значение в цифровом режиме val_2 = analogRead(pin); // считываем значение в аналоговом режиме Serial.print(val_1); Serial.print(" "); Serial.println(val_2); // передаём значение на монитор компьютера delay(100); }
Ну и пробуйте включать выключать тумблер на пульте. В зависимости от положения смотрите какие значения будут, а их потом нужно прописать в функции ЕСЛИ
зы Если не трудно то желательно каждую строчку в коде коментировать, это облегчит чтение кода. Не могу вот понять для чего прописанно у вас подача напряжения на 10 пин
Code int manual_pin = 10; // пин включающий ручное управление с пульта //---- void setup() { ............ ............ ............ digitalWrite(manual_pin, HIGH); - вот здесь }
А здесь :
Code void manual_loop() { digitalWrite(servo_gor_pin, digitalRead(manual_gor_pin)); digitalWrite(servo_vert_pin, digitalRead(manual_vert_pin)); } а здесь я вообще не могу понять для чего...
Вообще мне кажется нужно использовать для чтения ШИМ функцию int analogRead(pin); а не int digitalRead(pin); и потом конвертировать значение для myservo.writeMicroseconds(val); с помощью val = map(analogRead(pin), 0, 255, 500, 2200);... как то так... скорей всего здесь и скрывается дёрганье серв... Дима, мне нужна практическая проверка кодов, а сделать это я не могу сейчас нет ардуины для этого...
Дима, пока вот эти статьи почитайте... может какието решения возникнут у вас. http://robocraft.ru/blog/arduino/34.html http://robocraft.ru/blog/arduino/31.html http://robocraft.ru/blog/arduino/32.html http://robocraft.ru/blog/arduino/57.html http://robocraft.ru/blog/arduino/58.html http://robocraft.ru/blog/arduino/59.html
Все эти статьи вот от сюда http://robocraft.ru/page/summary/
|
|
| |
dp | Дата: Воскресенье, 11.11.2012, 19:00 | Сообщение # 433 |
Группа: Старичок
Сообщений: 533
Награды: 0
Статус: Offline
Город: Белгород
| Sergey, спасибо огромное за ответ! хоть не много в голове прояснятся начинает) завтра займусь ардуинкой и попробую все что вы мне написали
Quote (Sergey) Не могу вот понять для чего прописанно у вас подача напряжения на 10 пин Code int manual_pin = 10; // пин включающий ручное управление с пульта //---- void setup() { ............ ............ ............ digitalWrite(manual_pin, HIGH); - вот здесь } Ну так включаем ручное управление сразу)
Quote (Sergey) а здесь я вообще не могу понять для чего... ну как же - считываем с приемника и подаем на серву сигнал... пропишу как вы показали, так действительно лучше Прокомментирую все обязательно. Спасибо за ссылки, читаю
|
|
| |
Konstrukt0r | Дата: Воскресенье, 11.11.2012, 21:21 | Сообщение # 434 |
Группа: Банить не буду
Сообщений: 1327
Награды: 2
Статус: Offline
Город: Хабаровск
| Подскажите, как организовать питание контроллера и серв на 5 В, от батарейки на 3,7 В (та что в камере). Такой http://robototehnika.ru/e-store/catalog/250/804/ или такой http://robototehnika.ru/e-store/catalog/250/806/ Подойдут? Первый всего 200 мА выдаёт, второй - входные 2 А, на выходе около 1 А. Юрий давал ссылку на преобразователь от хоббикинга, но он довольно тяжелый.
|
|
| |
Sergey | Дата: Воскресенье, 11.11.2012, 22:04 | Сообщение # 435 |
Admin
Группа: Банить не буду
Сообщений: 2681
Награды: 7
Статус: Offline
Город: Владивосток
| Quote (dp) Code
int manual_pin = 10; // пин включающий ручное управление с пульта //---- void setup() { ............ ............ ............ digitalWrite(manual_pin, HIGH); - вот здесь }
Ну так включаем ручное управление сразу)
что именно к 10 пину подсоединено? Если бы к нему был подсоединён диод, то он горел бы в полном накале...
расшифровываем ниже приведённый код:
Code int servo_gor_pin = 7; // пин для сервы горизонтального поворота камеры int servo_vert_pin = 6; // пин для сервы вертикального поворота камеры int manual_gor_pin = 12; // вход сигнала с приёмника для горизонтальной сервы int manual_vert_pin = 11; // вход сигнала с приёмника для вертикальной сервы
void manual_loop() //функция ручного управления (согласно вашему названию) { digitalWrite(servo_gor_pin, digitalRead(manual_gor_pin)); // на пин под номером 7 подаётся значение которое было считанное с порта под номером 12 и имеет значение [b]HIGH[/b] или [b]LOW[/b], естественно это ни как не шим а просто либо 0-3V либо 3-5V... digitalWrite(servo_vert_pin, digitalRead(manual_vert_pin)); // то же самое что и вверху }
Для перенаправления должен быть вот такой код:
Code servo.attach(servo_gor_pin); //объявляем пин 7 для сервы
val = map(analogRead(manual_gor_pin),0,1023,450,2200); // конвертируем значение считанное с пина 12 к которому подключен источник сигнала. servo.writeMicroseconds(val); // и подаём это значение на серву
450 и 2200 зависят от серв, подбирать нужно опытным путёмДобавлено (11.11.2012, 22:04) ---------------------------------------------
Quote (Konstrukt0r) Подскажите, как организовать питание контроллера и серв на 5 В, от батарейки на 3,7 В (та что в камере). Миша, для контролера он подойдёт, а вот для сервы и вообще для двигателей сомневаюсь... но точно не знаю, я сними ещё не сталкивался и ни где не использовал...
|
|
| |
dp | Дата: Понедельник, 12.11.2012, 00:11 | Сообщение # 436 |
Группа: Старичок
Сообщений: 533
Награды: 0
Статус: Offline
Город: Белгород
| Ай да Сергей, ай да молодец! Quote (Sergey) естественно это ни как не шим а просто либо 0-3V либо 3-5V... Ну конечно, вот я деревянный! А к 10 пину ничего не подключено - просто когда он замыкается на землю то происходит смена режима управления.
Quote (Sergey) Для перенаправления должен быть вот такой код: Спасибо огромное! Попробую, руки уже чешутся) 450 и 2200 это как я понял крайние положения серв (0 и 180 градусов)?
Миша, а вы прям на магазинный мэйл вопрос задайте - там человек адекватный, должен оперативно ответить. Вообще я думаю что подойдут и для серв.
|
|
| |
Sergey | Дата: Понедельник, 12.11.2012, 14:32 | Сообщение # 437 |
Admin
Группа: Банить не буду
Сообщений: 2681
Награды: 7
Статус: Offline
Город: Владивосток
| Quote (dp) 450 и 2200 это как я понял крайние положения серв (0 и 180 градусов)? да именно, только вот сервы есть 180 градусов, а есть ещё 160...
Quote (dp) А к 10 пину ничего не подключено - просто когда он замыкается на землю то происходит смена режима управления. Не понял... каким это образом замыкается на землю? То есть той самой синей сервой 10 пин замыкается на землю при поданном на него напряжении в 5V? Круто... а Ардуинка ещё живая? Дима не так это делается. Этот пример такой же как замыкание с помощью кнопки, в выше упомянутых статьях об этом есть описание. Есть три варианта: два с использованием внешних подтягивающих резисторов, в этих вариантах подаётся либо плюсовой сигнал либо минусовой (замыкание на массу), и третий вариант с использованием внутреннего подтягивающего резистора, сигнал подаётся только минусовой и использование проводов желательно коротких длин. Вот схема с подачей минусового сигнала:
Code void setup() { //---- pinMode(10, INPUT); //объявляем 10 пин как вход //---- }
void loop() { val = digitalRead(10); // узнаём состояние кнопки if(val) // тоже самое что (val == HIGN) // если 10 пин замкнут {.......} // делаем какуюто каманду if(!val) // тоже что и val==LOW // если 10 пин не замкнут {.......} // делаем другую каманду }
Но у вас провода короткие так что можно обойтись без внешнего резистора, только в коде нужно прописать включение внутреннего подтягивающего резистора
Code void setup() { //---- pinMode(10, INPUT_PULLUP); //подтягивающий резистор включен для пина 10 //---- }
void loop() { val = digitalRead(10); // узнаём состояние кнопки if(val) // тоже самое что (val == HIGN) // если 10 пин замкнут {.......} // делаем какуюто каманду if(!val) // тоже что и val==LOW // если 10 пин не замкнут {.......} // делаем другую каманду } Статья
Опять же мы с вами уже обсуждали исключение этой сервы путём выяснения какой сигнал идёт при включении тумблера на пульте и подачи его на прямую к 10 пину.
|
|
| |
dp | Дата: Понедельник, 12.11.2012, 16:51 | Сообщение # 438 |
Группа: Старичок
Сообщений: 533
Награды: 0
Статус: Offline
Город: Белгород
| Sergey, спасибо ну я поставил килоомный резистор на провод который к пину идет, подозреваю что именно поэтому дуинка еще жива) Все, полез пробывать ваши советы, доложу по окончанию экспериментов!
|
|
| |
dp | Дата: Понедельник, 12.11.2012, 20:59 | Сообщение # 439 |
Группа: Старичок
Сообщений: 533
Награды: 0
Статус: Offline
Город: Белгород
| итак, докладываю о первых экспериментах думаю сначало надо разобраться с ручным управлением серв загрузил в дуину такой ваш код Code #include <Servo.h> /////////////////////////////////////////////////////////////////// // Номера входов и выходов /////////////////////////////////////////////////////////////////// int servo_vert_pin = 6; // пин для сервы вертикального поворота камеры int manual_vert_pin = 11; // вход сигнала с приёмника для вертикальной сервы int val; /////////////////////////////////////////////////////////////////// // Объекты программы /////////////////////////////////////////////////////////////////// Servo servo_vert; // создаём объект для контроля сервы вертикального поворота /////////////////////////////////////////////////////////////////// // Инициализация /////////////////////////////////////////////////////////////////// void setup() { pinMode(servo_vert_pin, OUTPUT); pinMode(manual_vert_pin, INPUT); } /////////////////////////////////////////////////////////////////// // Основной цикл /////////////////////////////////////////////////////////////////// void loop() { servo_vert.attach(servo_vert_pin); val = map(analogRead(manual_vert_pin),0,1023,540,2200); // конвертируем значение считанное с пина 11 к которому подключен источник сигнала. servo_vert.writeMicroseconds(val); // и подаём это значение на серву }
при включении серва поворачивается градусов на 20 и все, на изменение положения стика на пульте не реагирует решил тогда опросить этот вход (11 пин) по вашему же совету Опять ничего не происходит при изменении положения стика!Добавлено (12.11.2012, 20:59) --------------------------------------------- Ага, так получается что analogRead работает только с аналоговыми пинами? http://arduino.ru/Reference/AnalogRead тут пишут Quote Параметры pin: номер порта аналогового входа с которого будет производиться считывание (0..5 для большинства плат, 0..7 для Mini и Nano и 0..15 для Mega)
Но я подрубался на 2-ой пин - тоже нифига
Сообщение отредактировал dp - Понедельник, 12.11.2012, 19:38 |
|
| |
Sergey | Дата: Понедельник, 12.11.2012, 23:00 | Сообщение # 440 |
Admin
Группа: Банить не буду
Сообщений: 2681
Награды: 7
Статус: Offline
Город: Владивосток
| Дима, простите забыл что чтение происходит аналогового сигнала только с аналоговых пинов, а подача сигнала в аналоговом режиме только на цифровые ....
Ещё Дима давайте как то одну сначала команду разберем, а то не много путаница пошла... опрос я для кнопки вроде писал... но не важно... Начнём с перенаправления сигнала. Сначала выясним какой всё таки сигнал идёт с контролера на сервы.
Подключите к 0 аналоговому входу управляющий провод и пропишите вот такую штуку:
Code int val; void setup() { Serial.begin(9600); // полученные данные будем записывать в COM-порт }
void loop() { val = analogRead(0); // считываем значение с потенциометра Serial.println(val); // передаём значение на монитор компьютера }
отпишитесь о результатах.
|
|
| |
dp | Дата: Понедельник, 12.11.2012, 23:41 | Сообщение # 441 |
Группа: Старичок
Сообщений: 533
Награды: 0
Статус: Offline
Город: Белгород
| Прочитал вот здесь что надо скорость соеденения выбирать 115200 http://www.dogfight.no/2011....no.html
Подключил к нулевому пину - вот что выдает И причем всплески (706-703) произвольные, повторяются время от времени, а на изменение положения стика передатчика никак не реагирует
Сообщение отредактировал dp - Понедельник, 12.11.2012, 23:42 |
|
| |
yurik_ryba | Дата: Вторник, 13.11.2012, 05:45 | Сообщение # 442 |
Группа: Старичок
Сообщений: 692
Награды: 0
Статус: Offline
Город: Calgary, Canada
| По логике вещей, если сервы начинают дрыгаться при переходе на радиоуправление, значит помеха идет от него. Надо попробовать другие частоты, либо перепланировать конструкцию. Читал, что частенько помехи дает видеопередатчик.
Вот так примерно это выглядит
Хотя может и в ардуинском коде проблемы, не знаю даже.Добавлено (13.11.2012, 05:45) --------------------------------------------- Или вот похоже на такой баг: http://code.google.com/p/arduino/issues/detail?id=146&sort=-id
|
|
| |
dp | Дата: Среда, 14.11.2012, 06:48 | Сообщение # 443 |
Группа: Старичок
Сообщений: 533
Награды: 0
Статус: Offline
Город: Белгород
| Задал вопрос на ардуиновском форуме, вот ветка http://arduino.ru/forum....cheskim немного сумбурное начало, потом Сергей мне подсказал как правильно задать вопрос и вроде дело сдвинулось Отдельный респект вам, Сергей, что ночью пытались со мной решить эти траблы Тамошний maksim очень грамотно разложил все по полочкам, все заработало - думаю будет полезно тем кто смотрит в сторону РУ и ардуино. С утра еще все проверю, но думаю код полностью рабочий) Приложу, на всякий случай Code #include <Servo.h> #include <multiCameraIrControl.h>
/////////////////////////////////////////////////////////////////// // Номера входов и выходов ///////////////////////////////////////////////////////////////////
int servo_gor_pin = 7; // пин для сервы горизонтального поворота камеры int servo_vert_pin = 6; // пин для сервы вертикального поворота камеры
int manual_pin = 2; // пин включающий автоматическое/ручного управление и спуск затвора с пульта int manual_gor_pin = 12; // вход сигнала с приёмника для горизонтальной сервы int manual_vert_pin = 11; // вход сигнала с приёмника для вертикальной сервы
/////////////////////////////////////////////////////////////////// // Объекты программы ///////////////////////////////////////////////////////////////////
Servo servo_gor; // создаём объект для контроля сервы горизонтального поворота Servo servo_vert; Sony nex(9);
/////////////////////////////////////////////////////////////////// // Переменные программы ///////////////////////////////////////////////////////////////////
boolean servo_gor_go = LOW; int posv1 = 70; int posv2 = 100; int posv3 = 50; int posr = 92; unsigned long micros_prev = 0; volatile unsigned int time = 0;
/////////////////////////////////////////////////////////////////// // Инициализация ///////////////////////////////////////////////////////////////////
void setup() {
pinMode(servo_vert_pin, OUTPUT); pinMode(servo_gor_pin, OUTPUT); pinMode(manual_vert_pin, INPUT); pinMode(manual_gor_pin, INPUT); pinMode(manual_pin, INPUT); servo_vert.attach(servo_vert_pin); servo_gor.attach(servo_gor_pin); Serial.begin(115200); Serial.println("Starting up!");
digitalWrite(manual_pin, HIGH); attachInterrupt(0, Mode, CHANGE); }
void Mode() { if(PIND&1<<2){ micros_prev = micros(); } else{ time = micros() - micros_prev; } } /////////////////////////////////////////////////////////////////// // Автоматическое управление ///////////////////////////////////////////////////////////////////
void ServoGor(boolean g) // функция поворота сервы горизонта { int p; if(g==HIGH) { servo_gor_go = HIGH; servo_gor.attach(servo_gor_pin); // подключаем серву горизонтальную for(p=1525; p<=1600; p++) { servo_gor.writeMicroseconds(p); delay(3); } } if(g==LOW) { servo_gor_go = LOW; for(p=1600; p>=1525; p--) { servo_gor.writeMicroseconds(p); delay(3); } servo_gor.detach(); //отключаем серву горизонтальную } }
void cycle() { servo_gor.write(posr); servo_vert.write(posv2); delay(800); shutter(); delay(800); servo_vert.write(posv1); delay(800); shutter(); delay(800); ServoGor(HIGH); delay(400); ServoGor(LOW); }
void shutter() { nex.shutterNow(); }
void auto_loop() { for (int i=0;i<9;i++) cycle();
servo_vert.write(posv3); delay(800); shutter(); delay(800); }
/////////////////////////////////////////////////////////////////// // Ручное управление /////////////////////////////////////////////////////////////////// void manual_loop() { DDRD |= (1<<6) | (1<<7); // Настраиваем 6 и 7 выводы на выход while(time > 1700){ PINB&1<<4?PORTD|=1<<7:PORTD&=~(1<<7); // Если на 12 выводе 1, то на 7 вывод даем 1, иначе 0 PINB&1<<3?PORTD|=1<<6:PORTD&=~(1<<6); // Если на 11 выводе 1, то на 6 вывод даем 1, иначе 0 } } /////////////////////////////////////////////////////////////////// // Основной цикл ///////////////////////////////////////////////////////////////////
int is_manual = 0;
void loop() { if (time < 1300) shutter(); else if (time > 1700) { if (is_manual != 1) { Serial.println("Manual mode is on\r\n");
// Detach servo drivers if (servo_vert.attached() == true) servo_vert.detach();
if (servo_gor.attached() == true) servo_gor.detach(); is_manual = 1; }
manual_loop(); } else { if (is_manual != 0) { Serial.println("Automatic mode is on\r\n");
if (servo_vert.attached() == false) servo_vert.attach(servo_vert_pin);
if (servo_gor.attached() == false) servo_gor.attach(servo_gor_pin);
is_manual = 0; }
auto_loop(); } }
Здесь реализовано р/у сервами через ардуину, что дало возможность также автоматически снимать панорамы. Так же на отдельный канал пульта заведено переключение режима управления и ИК спуск для фотоаппарата.
Теперь подключу еще все это дело к стабилизирующему контроллеру и будет полная жесть
|
|
| |
lalex | Дата: Среда, 14.11.2012, 07:01 | Сообщение # 444 |
Группа: Старичок
Сообщений: 2164
Награды: 7
Статус: Offline
Город: Крым, в Москве зимую
| Уже жесть - уже страшно заходить в тему - самую активную на форуме )) пардон за троллинг, но завидно. Когда будете продавать хауноу, не забудьте нам скидки )))
|
|
| |
dp | Дата: Среда, 14.11.2012, 07:05 | Сообщение # 445 |
Группа: Старичок
Сообщений: 533
Награды: 0
Статус: Offline
Город: Белгород
| lalex, не представляете как мне страшно) Я поражаюсь что оно вообще все щас работает , тьфу-тьфу-тьфу, с моим то знанием программирования)) Хорошо, есть хорошие, умные люди, которые научить могут еще
|
|
| |
Sergey | Дата: Среда, 14.11.2012, 09:56 | Сообщение # 446 |
Admin
Группа: Банить не буду
Сообщений: 2681
Награды: 7
Статус: Offline
Город: Владивосток
| Quote (dp) Тамошний maksim да я с того Максима вообще в шоке правильно вы сказали "маньяк" в две строчки переписал практически пол партянки а я там целую петицию было начал сочинять...
|
|
| |
dp | Дата: Пятница, 16.11.2012, 05:59 | Сообщение # 447 |
Группа: Старичок
Сообщений: 533
Награды: 0
Статус: Offline
Город: Белгород
| Так там код довольно сильно подправился Вот полностью рабочий вариант. Code #include <Servo.h> #include <multiCameraIrControl.h>
/////////////////////////////////////////////////////////////////// // Номера входов и выходов ///////////////////////////////////////////////////////////////////
int servo_gor_pin = 7; // пин для сервы горизонтального поворота камеры int servo_vert_pin = 6; // пин для сервы вертикального поворота камеры
int manual_photo_pin = 3; //пин включающий ИК (канал AUX1 на передатчике) int manual_pin = 2; // пин включающий автоматическое/ручное управление (канал AUX2 на передатчике)
int manual_gor_pin = 12; // вход сигнала с приёмника для горизонтальной сервы int manual_vert_pin = 11; // вход сигнала с приёмника для вертикальной сервы
/////////////////////////////////////////////////////////////////// // Объекты программы ///////////////////////////////////////////////////////////////////
Servo servo_gor; // создаём объект для контроля сервы горизонтального поворота Servo servo_vert; //создаём объект для контроля сервы вертикального поворота Nikon nex(9); // ИК диод для управления затвором
/////////////////////////////////////////////////////////////////// // Переменные программы ///////////////////////////////////////////////////////////////////
boolean servo_gor_go = LOW; int posv1 = 70; //позиции вертикальной сервы int posv2 = 100; int posv3 = 50; int posr = 92; unsigned long micros_prev = 0; ////канал AUX2 volatile unsigned int time = 1900; unsigned long micros_prev1 = 0; ////канал AUX1 volatile unsigned int time1 = 1900;
/////////////////////////////////////////////////////////////////// // Инициализация ///////////////////////////////////////////////////////////////////
void setup() { pinMode(servo_vert_pin, OUTPUT); pinMode(servo_gor_pin, OUTPUT); pinMode(manual_vert_pin, INPUT); pinMode(manual_gor_pin, INPUT); pinMode(manual_pin, INPUT); pinMode(manual_photo_pin, INPUT); servo_vert.attach(servo_vert_pin); servo_gor.attach(servo_gor_pin); digitalWrite(manual_pin, HIGH); ///AUX2 attachInterrupt(0, Mode, CHANGE); digitalWrite(manual_photo_pin, HIGH); ////AUX1 attachInterrupt(1, Mode1, CHANGE); delay(2000); }
void Mode() ////чтение канала AUX2 (переключение между авто\ручным управлением) { if(PIND&1<<2){ micros_prev = micros(); } else{ time = micros() - micros_prev; } }
void Mode1() ////чтение канала AUX1 (спуск затвора) { if(PIND&1<<3){ micros_prev1 = micros(); } else{ time1 = micros() - micros_prev1; } }
/////////////////////////////////////////////////////////////////// // Автоматическое управление ///////////////////////////////////////////////////////////////////
void ServoGor(boolean g) // функция поворота сервы горизонта { int p; if(g==HIGH) { servo_gor_go = HIGH; servo_gor.attach(servo_gor_pin); // подключаем серву горизонтальную for(p=1525; p<=1600; p++) { servo_gor.writeMicroseconds(p); delay(3); } } if(g==LOW) { servo_gor_go = LOW; for(p=1600; p>=1525; p--) { servo_gor.writeMicroseconds(p); delay(3); } servo_gor.detach(); //отключаем серву горизонтальную } }
void cycle() //панорамный цикл { while(time < 1700){ servo_gor.write(posr); servo_vert.write(posv2); delay(800); shutter(); delay(800); servo_vert.write(posv1); delay(800); shutter(); delay(800); ServoGor(HIGH); delay(400); ServoGor(LOW); } }
void shutter() // спуск затвора { nex.shutterNow(); }
void auto_loop() //полный цикл автоматического управления { for (int i=0;i<9;i++) cycle(); if(time < 1700){ servo_vert.write(posv3); //съемка надира delay(800); shutter(); delay(800); } }
/////////////////////////////////////////////////////////////////// // Ручное управление ///////////////////////////////////////////////////////////////////
void manual_loop() //цикл ручного управления сервами с передатчика {
DDRD |= (1<<6) | (1<<7); // Настраиваем 6 и 7 выводы на выход boolean flag = 0; while(time > 1700){ if(time1 < 1700){ if(!flag){ nex.shutterNow(); flag = 1; } } else flag = 0; PINB&1<<4?PORTD|=1<<7:PORTD&=~(1<<7); // Если на 12 выводе 1, то на 7 вывод даем 1, иначе 0 PINB&1<<3?PORTD|=1<<6:PORTD&=~(1<<6); // Если на 11 выводе 1, то на 6 вывод даем 1, иначе 0 } } /////////////////////////////////////////////////////////////////// // Основной цикл /////////////////////////////////////////////////////////////////// void loop() { if (time > 1700) { servo_vert.detach(); servo_gor.detach(); manual_loop(); servo_vert.attach(servo_vert_pin); servo_gor.attach(servo_gor_pin); } else auto_loop(); } Добавлено (16.11.2012, 05:59) --------------------------------------------- Блин, какая-то ерунда по питанию - от USB все идеально работает, а от аккума с беком на ручном управлении дрожание серв опять появляется. Но это уже явно не софтово, потому что от компа все путем работает. Сегодня перепаял всю цепь питания, проверил все шнуры, относил бек с аккумом подальше, на сколько позволял провод - нихера
|
|
| |
yurik_ryba | Дата: Пятница, 16.11.2012, 06:55 | Сообщение # 448 |
Группа: Старичок
Сообщений: 692
Награды: 0
Статус: Offline
Город: Calgary, Canada
| Значит не хватает тока, по моему это уже очевидно.
|
|
| |
dp | Дата: Пятница, 16.11.2012, 06:58 | Сообщение # 449 |
Группа: Старичок
Сообщений: 533
Награды: 0
Статус: Offline
Город: Белгород
| Да в автоматическом управлении все же путем! Панорамы фигачет на ура Добавлено (16.11.2012, 06:58) --------------------------------------------- Такое впечатление что на узле приемник-ардуина какие-то наводки идут
|
|
| |
yurik_ryba | Дата: Пятница, 16.11.2012, 07:03 | Сообщение # 450 |
Группа: Старичок
Сообщений: 692
Награды: 0
Статус: Offline
Город: Calgary, Canada
| А р/у можно на другой канал/частоту перенастроить?
|
|
| |