MENU
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Модератор форума: Konstrukt0r, Sergey  
Самоделки для фотографирования "кар"
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 баксов например. Для начала... А на чем собирать схему?
А еще и руки вечно трясутся biggrin

Мне вот что не понятно из статьи: как эта микросхема действует на практике? Какие значения переводит в какие?

Ну вот с той штучкой по моей ссылке все ясно:
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
Город: Владивосток
На первый риг брал в хобикинг, вертолётные большую и маленькую шестерни. Маленькая как раз подходит по внутреннему диаметру на вал двигателя с редуктором, а большая уже идёт с валом. А на второй риг брал червячную предачу из запасов друга smile подгонял под серву.
 
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)
---------------------------------------------
А и еще - теперь сервы подергиваться стали sad Без ардуины норм - с ардуиной дергаются.... в чем беда? Подозреваю что есть всетаки расхождения в сигнале с приемника\ардуины

Прикрепления: 0436187.jpg (125.0 Kb) · 5965356.jpg (91.0 Kb)


Сообщение отредактировал 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 заведена - крен отрабатывает wacko
 
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)
а здесь я вообще не могу понять для чего...

ну как же - считываем с приемника и подаем на серву сигнал... пропишу как вы показали, так действительно лучше
Прокомментирую все обязательно.
Спасибо за ссылки, читаю smile
 
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 пину.
Прикрепления: 7445011.jpg (7.3 Kb)
 
dpДата: Понедельник, 12.11.2012, 16:51 | Сообщение # 438
Группа: Старичок
Сообщений: 533
Награды: 0
Статус: Offline
Город: Белгород
Sergey, спасибо biggrin ну я поставил килоомный резистор на провод который к пину идет, подозреваю что именно поэтому дуинка еще жива)
Все, полез пробывать ваши советы, доложу по окончанию экспериментов!
 
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 и все, на изменение положения стика на пульте не реагирует sad
решил тогда опросить этот вход (11 пин) по вашему же совету

Опять ничего не происходит при изменении положения стика!

Добавлено (12.11.2012, 20:59)
---------------------------------------------
Ага, так получается что analogRead работает только с аналоговыми пинами?
http://arduino.ru/Reference/AnalogRead тут пишут

Quote
Параметры
pin: номер порта аналогового входа с которого будет производиться считывание (0..5 для большинства плат, 0..7 для Mini и Nano и 0..15 для Mega)


Но я подрубался на 2-ой пин - тоже нифига
Прикрепления: 8209687.png (20.1 Kb)


Сообщение отредактировал 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) произвольные, повторяются время от времени, а на изменение положения стика передатчика никак не реагирует wacko
Прикрепления: 4521143.png (9.8 Kb)


Сообщение отредактировал 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
немного сумбурное начало, потом Сергей мне подсказал как правильно задать вопрос и вроде дело сдвинулось smile Отдельный респект вам, Сергей, что ночью пытались со мной решить эти траблы smile
Тамошний 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();
   }
}


Здесь реализовано р/у сервами через ардуину, что дало возможность также автоматически снимать панорамы.
Так же на отдельный канал пульта заведено переключение режима управления и ИК спуск для фотоаппарата.

Теперь подключу еще все это дело к стабилизирующему контроллеру и будет полная жесть smile
 
lalexДата: Среда, 14.11.2012, 07:01 | Сообщение # 444
Группа: Старичок
Сообщений: 2164
Награды: 7
Статус: Offline
Город: Крым, в Москве зимую
Уже жесть - уже страшно заходить в тему - самую активную на форуме ))
пардон за троллинг, но завидно. Когда будете продавать хауноу, не забудьте нам скидки )))
 
dpДата: Среда, 14.11.2012, 07:05 | Сообщение # 445
Группа: Старичок
Сообщений: 533
Награды: 0
Статус: Offline
Город: Белгород
lalex, не представляете как мне страшно) Я поражаюсь что оно вообще все щас работает , тьфу-тьфу-тьфу, с моим то знанием программирования)) Хорошо, есть хорошие, умные люди, которые научить могут еще smile
 
SergeyДата: Среда, 14.11.2012, 09:56 | Сообщение # 446
Admin
Группа: Банить не буду
Сообщений: 2681
Награды: 7
Статус: Offline
Город: Владивосток
Quote (dp)
Тамошний maksim
да я с того Максима вообще в шоке smile правильно вы сказали "маньяк" smile в две строчки переписал практически пол партянки smile а я там целую петицию было начал сочинять...
 
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
А р/у можно на другой канал/частоту перенастроить?
 
Поиск: