1. Уважаемый Гость! При написании вопросов в раздел форума [ArduCopter] Вопросы, проблемы и решения обязательно придерживаться шаблона сообщения, оговоренного в правилах раздела! Если сообщение не будет оформлено должным образом, то и ответ на вопрос будет с наименьшим приоритетом. Старайтесь дать максимально полную информацию по вашей проблеме, чтобы можно было более детально рассматривать вопрос!
    Скрыть объявление
  2. Уважаемый Гость! Хотите получать кэшбэк с покупок в online-магазинах? Сервис "Zozi.ru" дает такую возможность!
    Скрыть объявление
  3. Друзья! Для нашего ресурса необходим дополнительный объем пространства в облаке Dropbox. Подробнее.
    Скрыть объявление

Видеосъёмка с тележки

Тема в разделе "Видео и фото полетушек/покатушек", создана пользователем Игорюшка Владимирович, 11 дек 2015.

Реклама. Купить это место.
  1. Игорюшка Владимирович

    Игорюшка Владимирович Кандидат наук

    Регистрация:
    8 апр 2015
    Сообщения:
    1.176
    Город:
    г Орёл
    Имя:
    Игорь
    Ну вы, барин, и задачи ставите ! Я таких-то словов ещё не слышал.
    Сейчас пытаюсь научить ар-душку входной ШИМ понимать - через пульс() не получается - дрожит серва - на мониторе вход пляшет на пару% ...
    Да и диапазон регулирования в сервотестере не могу привязать к 180*сам


    #include <Servo.h>

    #define POT_MAX_ANGLE 180.0 // макс. угол поворота потенциометра

    Servo myServo;

    int pin = 7;// шим

    unsigned long duration;
    unsigned long duration0;
    unsigned long duration1;
    unsigned long duration2;
    unsigned long duration3;
    unsigned long duration4;

    void setup()
    {
    // прикрепляем (англ. attach) нашу серву к 9-му пину.
    myServo.attach(9);

    pinMode(pin, INPUT);// шим

    Serial.begin(9600);
    Serial.println("PPM \ Angle");
    }

    void loop()
    {
    // Фильтр среднее арифметическое от пяти замеров пульса

    duration0 = pulseIn(pin, HIGH);// шим
    duration1 = pulseIn(pin, HIGH)+ duration0;// шим
    duration2 = pulseIn(pin, HIGH)+ duration1;// шим
    duration3 = pulseIn(pin, HIGH)+ duration2;// шим
    duration4 = pulseIn(pin, HIGH)+ duration3;
    duration = duration4 / 5;


    int val = duration-870;
    int angle = int(val / 1024.0 * POT_MAX_ANGLE);

    // углы от 0° до 180°. Ограничиваем угол соответствующе
    angle = constrain(angle, 5, 175);
    myServo.write(angle);

    Serial.print(duration);Serial.print("\t");

    Serial.print(angle);Serial.print("\t");

    Serial.println(val);

    delay(100);

    }
     
  2. raefa

    raefa Главнокомандующий Команда форума

    Регистрация:
    3 янв 2015
    Сообщения:
    4.324
    Город:
    Zhigulevsk
    Имя:
    Александр
    О нее... Код не хочу читать... Можете посмотреть мой код по "Умной подсветке", может что подскажет. Там есть и PulseIn и "PulseOut"... А лучше начать с встроенных примеров. Все работоспособно и не требует особого вникания по началу.
     
  3. Игорюшка Владимирович

    Игорюшка Владимирович Кандидат наук

    Регистрация:
    8 апр 2015
    Сообщения:
    1.176
    Город:
    г Орёл
    Имя:
    Игорь
    http://forum.apmcopter.ru/threads/podsvetka-s-rezhimom-stroboskopa.294/page-2
    Это здесь?
    --- Сообщения объединены, 5 май 2016 ---
    А это и есть ... "дайджест-компиляция" примеров - потому и выкладывать стыдно :rolleyes:.
     
  4. raefa

    raefa Главнокомандующий Команда форума

    Регистрация:
    3 янв 2015
    Сообщения:
    4.324
    Город:
    Zhigulevsk
    Имя:
    Александр
  5. Игорюшка Владимирович

    Игорюшка Владимирович Кандидат наук

    Регистрация:
    8 апр 2015
    Сообщения:
    1.176
    Город:
    г Орёл
    Имя:
    Игорь
    Ой, мальчики !! Мне новые фенЮчки приехали !
    - Сколько волка не корми, а кто не спрятался - домой не приходи !! :whistling:
    Счаз рразберусь, откудова ноги растут и всё выкладу - ничего не ута - Ю !.;)
     
  6. Игорюшка Владимирович

    Игорюшка Владимирович Кандидат наук

    Регистрация:
    8 апр 2015
    Сообщения:
    1.176
    Город:
    г Орёл
    Имя:
    Игорь
    Первый раз, но ещё раз :
    Изображение 015.jpg
    Решил таки добавить сантиметры в индикацию пройденного расстояния.;)
    Подключение (вдруг ещё найдутся сума-с-шедшие - это самый дешОвый, но не самый лучший вариант индикации)
    https://www.youtube.com/watch?v=9mpydTBuWts

    Теперь надо .... звук добавить .... :rolleyes: :D
     
  7. Игорюшка Владимирович

    Игорюшка Владимирович Кандидат наук

    Регистрация:
    8 апр 2015
    Сообщения:
    1.176
    Город:
    г Орёл
    Имя:
    Игорь
    Реверсный регуль тоже перепрограммиовал - в стоке задняя скорость 25% ... :)
     
  8. LampGraph

    LampGraph Кандидат наук

    Регистрация:
    16 ноя 2015
    Сообщения:
    1.229
    Город:
    Абакан
    Имя:
    Вячеслав
    Меги все можно программировать с помощью Arduino. Заливаете из примеров прошивку Arduino ISP, подключаете по букварю и вперед! Пока балуетесь с маленькими мегами, насчет программатора можно не заморачиваться.
    Когда захотите большего, можно купить программатор USBASP или собрать. Дело не хитрое, но полезное. Но так как он криво работает с мегами потолще, типа 2560. А так как мы с вами на этом форуме, рано или поздно вы столкнетесь с 2560, так что лучше STK500. Он стоит своих денег. Я спустя пару лет войны с жабой все-таки купил. Жаба активно настаивала собрать его самому, но лень победила...
     
  9. Игорюшка Владимирович

    Игорюшка Владимирович Кандидат наук

    Регистрация:
    8 апр 2015
    Сообщения:
    1.176
    Город:
    г Орёл
    Имя:
    Игорь
    Сегодня лысые А328 пришли 3шт., а программатор USBASP взял у ребят. Сейчас буду репу морщить как бутлодер залить. У меня получилось на А8 (даже блинк заработал), а вот купленная на барахле "последняя" 328 выдавала ошибку. То ли я её, то ли они меня ... :D
    Но на самоделку STK500 у меня глаз не хватит ...:oops:
    ... Сейчас думаю, как с приёмника ШИМ считать ...:cautious:
     
  10. LampGraph

    LampGraph Кандидат наук

    Регистрация:
    16 ноя 2015
    Сообщения:
    1.229
    Город:
    Абакан
    Имя:
    Вячеслав
    А здесь советую сразу начать копать глубже. На самом деле это не так сложно как кажется на первый взгляд.
    В данном конкретном случае вам нужны прерывания (interrupts).
    В чем проблема:
    pulseIn работает на циклах while. Как это выглядит:

    когда вызываем функцию, она запускает цикл while и в нем ждет пока не сменится состояние порта на нужное нам. Например нам нужен HIGH, а сейчас LOW. Она ждет пока будет снова HIGH.
    Если же сейчас HIGH, она ждет пока будет LOW, а потом опять ждет HIGH.
    Когда состояние порта сменилось на нужное, она запоминает текущее машинное время (время старта), запускает следующий цикл while и ждет следующего изменения.
    Когда состояние порта сменилось, она запоминает текущее машинное время (время окончания).
    Считает разницу во времени - это и есть длина импульса.
    Дальше проц делает другие задачи пока снова не встретит эту функцию.
    Так вот, если состояние порта сменится в то время когда проц делает другие задачи, мы его пропустим, так как следующий вызов pulseIn будет ждать пока сигнал обновится.
    Частота считывания сигнала зависит от всей программы так как работает только когда вызывается функция.
    Отсюда и дрожание сервы и погрешность.
    Прерывания работают так:
    Проц занимается своими делами, тут бамс, состояние порта поменялось. В этот самый момент (практический) останавливается работа проца, что бы он ни делал и вызывается функция обработки прерываний. В эту функцию, ложим проверку: Если стало HIGH (а мы считываем длительность высокого импульса) - запоминаем начальное время, ставим флаг. Если LOW, то если флаг установлен - вычитаем из текущего времени время начала и запоминаем результат. Все. Получили длительность импульса на порядок точнее и вовремя. В основном цикле только обрабатываем его и делаем другие дела.
    Плюс прерываний в том, что проц видит изменение сигнала ни когда дойдет очередь до проверки, а сразу же как только оно произошло.

    Про прерывания на робокрафте.
    Исходный код pulsein


    Там не шим, там PPM. Если бы нужно было считать шим - можно было бы использовать аналоговый вход, а тут нам нужно получить длину импульсов.
     
  11. LampGraph

    LampGraph Кандидат наук

    Регистрация:
    16 ноя 2015
    Сообщения:
    1.229
    Город:
    Абакан
    Имя:
    Вячеслав
    Буквально только что с Александром у немцев нашли код считывания длины импульса с помощью прерываний:
    Код:
    ISR (INT0_vect)
    {
      if ((PIND & 4)==4)     // check 3th bit of PORTD (pin 4) got HIGH
      {
         TCCR1B = 0;            // stop timer1
        TCNT1 = 0;             // reset timer1
        TCCR1B = 1;            // start 16bit timer1 - no prescale
      }
      else if ((PIND & 4)==0 )
      {    // check 3th bit of PORTD (pin 4) got LOW
        TCCR1B = 0;         // stop timer1
        value = TCNT1;     // get Timer Value
      }
    }
    Это функция обработки прерывания. Что она делает:
    При срабатывании прерывания она проверяет уровень входа. Если высокий - обнуляет и запускает таймер. Если низкий - останавливает таймер и запоминает значение. Это и есть длина импульса. Зная частоту контроллера можно либо настроить таймер так что бы значение было в миллисекундах либо конвертировать значение в миллисекунды. Либо оставить как есть и оперировать сырыми данными.
     
  12. Игорюшка Владимирович

    Игорюшка Владимирович Кандидат наук

    Регистрация:
    8 апр 2015
    Сообщения:
    1.176
    Город:
    г Орёл
    Имя:
    Игорь
    Простите... а они различаются как ? Если можно - члено-раздельно-попа-дробнее. А то у меня уже репка пухнет от перРрывний.
    Дело в том, что №2 и №3 (те, которые позволяют прерываниями поЛзоваться у АрдУшки на 238 - уже заняты энкодером, а надо ещё три канала с приёмника "считать", чтобы делать "оперативно-предварительные" настройки" углов и вкл-выкл режимов.
    Я сегодня (мож) видео выкл-ду (мышь сдохнула :mad: - заряжается !!!! :D)
    --- Сообщения объединены, 16 май 2016 ---
    "Опыты" с сервой и регулями убедили меня что им ... одинаково приятно отчего управляться -
    от приёмника (моего - другие не знаю), от сервотестера или от ШИМовыходов Унки ...
    И тут случилось страшное - оказывается - могут быть нью-анусы ?!:confused:
     
  13. 5yoda5

    5yoda5 Master Команда форума

    Регистрация:
    29 янв 2015
    Сообщения:
    7.137
    Город:
    Реж
    Имя:
    Тимур
    Наверное Вячеслав имеет ввиду, что с приемника идет комбинированный сигнал (PPM) а не сигнал одного канала (PWM).
    А ШИМ - это широтно импульсная модуляция. Вроде речь о том же, но чуть-чуть не так. Это как сказать - "это напряжение? - нет, это фаза". :D
    Я уже потерял нить, какой у вас используется приемник, есть ли в нем СРРМ.
    Вот, посмотрите неплохую статейку, и вот хорошая картинка оттуда:
    [​IMG]
     
  14. Игорюшка Владимирович

    Игорюшка Владимирович Кандидат наук

    Регистрация:
    8 апр 2015
    Сообщения:
    1.176
    Город:
    г Орёл
    Имя:
    Игорь
    УжОс летящий в ночи ... :eek:
    --- Сообщения объединены, 16 май 2016 ---
    У меня от восемь каналов от СХ-20 (Кванум Нова), а что внутри ... мало кто знает :D
     
  15. LampGraph

    LampGraph Кандидат наук

    Регистрация:
    16 ноя 2015
    Сообщения:
    1.229
    Город:
    Абакан
    Имя:
    Вячеслав
    ШИМ Задается скважностью
    Важно именно отношение. По сути абсолютная длительность не важна и она может меняться в зависимости от частоты.
    PPM Задается длиной импульса.
    .
    --- Сообщения объединены, 16 май 2016 ---
    Не совсем так. Даже в одном канале PPM. Просто в одном канале он очень похож на PWM (ШИМ - это то же самое, только русское), но все-таки подчиняется строгим временным рамкам (Длительность импульсов, интервалы).
    Когда мы калибруем аппаратуру в APM мы видим числовые значения - эти значения как раз и есть время импульсов (или расстояний между импульсами, это смотря с какой стороны смотреть).
    Еще одно не маловажное отличие: 100% PWM на осциллографе выглядит как сплошная линия. Максимальное значение в PPM на осциллографе не будет сплошной, потому как пакеты разделяются.
     
  16. Игорюшка Владимирович

    Игорюшка Владимирович Кандидат наук

    Регистрация:
    8 апр 2015
    Сообщения:
    1.176
    Город:
    г Орёл
    Имя:
    Игорь
    Надо почитать - подумать, как это отАрдуинить - нет (наверное) смысла из-за "обезноживания" второй камень и сеть городить .
     
  17. LampGraph

    LampGraph Кандидат наук

    Регистрация:
    16 ноя 2015
    Сообщения:
    1.229
    Город:
    Абакан
    Имя:
    Вячеслав
    А вы используйте такую хитрость:
    К пину на котором срабатывают прерывания подключите энкодер через диод, и параллельно подключите его к свободной ноге (но уже без диода). И к тому же пину пустите PPM. Что получится: в обработчике прерываний ставим условие. Если на втором пине к которому подключен энкодер есть сигнал - значит обрабатываем вход с энкодера. Если же нет - значит это PPM. Диод нужен что бы на сигнальный пин влиял только энкодер и не влиял PPM.
    Одновременно обрабатывать энкодер и считывать PPM ведь не надо?
     
  18. Игорюшка Владимирович

    Игорюшка Владимирович Кандидат наук

    Регистрация:
    8 апр 2015
    Сообщения:
    1.176
    Город:
    г Орёл
    Имя:
    Игорь
    Гипотетически - нет. Но из-за "супер оптики" энкодера в моём исполнении :) он и так критичен к обо-ротам, а если к нему ещё и ППМ подмешивать - поплывёт.
    Думается, всё же лепить отдельную горбушку. Взрослые маЛишки сказали, что есть варианты, но - боюсь, мне они не по зубЬям....
    Собственно, сейчас работает от аналоговых входов - от двух резисторов.
    Если решать проблему "по-совковому", можно оптопары поставить в качестве связи, даже не заморачиваясь с шинами и протоколами обмена.
    Надо сначала все сопли привести в порядок и попробовать поставить на телегу - что скажет. :thumbsup:
    А заставить второй камень ценой 100 рублей (места жалко) обслуживать ППМ и сливать "на готовое"
    будет проСЧе - телега пока отработается, всплывут косяки ...

    ****
    Спасибо всем за помощь !
    Без вас бы телега и ноне была бы ... "там". :rolleyes:
    Переходим к прототипированию хлама.
     
  19. Игорюшка Владимирович

    Игорюшка Владимирович Кандидат наук

    Регистрация:
    8 апр 2015
    Сообщения:
    1.176
    Город:
    г Орёл
    Имя:
    Игорь
    Сколько волка не корми, а гусь свинье ближе к телу...
    01.jpg

    Теперь надо придумать блок питания, т.к. 300мА оказалось мало-вато....
     
  20. 5yoda5

    5yoda5 Master Команда форума

    Регистрация:
    29 янв 2015
    Сообщения:
    7.137
    Город:
    Реж
    Имя:
    Тимур
    Я согласен с вами, если исходить из строгих представлений и официальных терминов, то это так.
    Но мы тут все - моделисты, и среди моделистов принято считать (для ясности) что PPM - это комбинированный сигнал (полный фрейм с информацией обо всех каналах), а PWM - это информация только по одному каналу, тоже полный фрейм, но пик только одного канала. И ширина этого пика как раз определяет значение по каналу. Но 100% значение в канале не будет равно прямой линии на осциллографе (как вы справедливо заметили), а будет равно 20 мс минус синхропауза и поделить на 8 (именно в этой последовательности, а не по правилам математики) - именно такой ширины будут 100% пики, остальное время - ноль.

    Не будем любить Игорю голову, пусть почитает статью по моей ссылке и поймет рисунок, который я привел. А если у Игоря найдется осциллограф - то его приемник
    можно подключить к нему и наглядно посмотреть, что происходит, когда дергаешь стики и щелкаешь тумблеры. А как назвать тот пик в отдельно взятом канале - PWM (как считают многие моделисты), или PPM (как возможно корректнее, но тогда может быть путаница с CPPM) - пусть решает сам.

    Просто на многих инструкциях производитель пишет PPM, там где надо писать CPPM, и никогда не пишет PPM когда речь идет про единичный канал (я не видел по крайней мере).
     
Реклама. Купить это место.