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

PPM-encoder на Ардуинке (pro mini mega328)

Тема в разделе "Наши другие увлечения", создана пользователем Олег Меньшиков, 20 янв 2017.

Реклама. Купить это место.
Метки:
  1. Олег Меньшиков

    Олег Меньшиков Студент

    Регистрация:
    21 апр 2015
    Сообщения:
    71
    Город:
    Анапа
    Имя:
    Олег Меньшиков
    Есть задумка (даже, своего рода, необходимость) смастерить PPM-энкодер на ардуинке.
    1. Стоимость ардуинки (которых у меня есть чуть больше десятка) в разы ниже чем готовый сумматор.
    2. Т.к. я столкнулся с этой проблемой, то желательно сделать проект максимально повторяемым и наиболее доступным (авось, ещё кому пригодиться).
    3. Собираю самолёт, думать он будет PixHawkом, а он принимает PPM. Приёмник PPM не выдаёт, вот и сижу необлётаный.

    Искал в тырнете, нашёл вот такие статьи:
    http://www.parkflyer.ru/ru/blogs/view_entry/13577/
    http://forum.rcdesign.ru/f123/thread264377.html
    https://www.rcgroups.com/forums/showthread.php?1808432-Arduino-ppm-signal-reader-and-generator
    И так далее...
    Что-то не подходит, а то, что подходит, но, увы, не работает.
    Нужна помощь единомышленников...
     
  2. raefa

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

    Регистрация:
    3 янв 2015
    Сообщения:
    4.324
    Город:
    Zhigulevsk
    Имя:
    Александр
    1. [​IMG] Сегодня, в 14:02 - raefa
      Олег Меньшиков, а такое решение не нравится? https://github.com/ArduPilot/ardupilot/tree/master/Tools/ArduPPM
    2. [​IMG] Сегодня, в 14:15 - Олег Меньшиков
      Да. Здесь. Смотрю код (не очень в этом разбираюсь). Нужно узнать на какие пины приходит PWM, загрузить прошивку и попробовать
    3. [​IMG] Сегодня, в 14:19 - Олег Меньшиков
      Ошибка компиляции для платы Pro mini, такая же история для Nano
     
  3. raefa

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

    Регистрация:
    3 янв 2015
    Сообщения:
    4.324
    Город:
    Zhigulevsk
    Имя:
    Александр
    Надо подумать. А какой софт используется под эти все попытки?
     
  4. Олег Меньшиков

    Олег Меньшиков Студент

    Регистрация:
    21 апр 2015
    Сообщения:
    71
    Город:
    Анапа
    Имя:
    Олег Меньшиков
    Код вставляю в среду разработки Arduino 1.6.12
    Или не так вопрос понял?
     
  5. raefa

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

    Регистрация:
    3 янв 2015
    Сообщения:
    4.324
    Город:
    Zhigulevsk
    Имя:
    Александр
    Ну например в моей ссылке (на github) надо Atmel AVR Studio 4.0. Ну или заливать готовый хекс в 328. Тогад останется только сначала фьюзы выставить.
     
  6. raefa

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

    Регистрация:
    3 янв 2015
    Сообщения:
    4.324
    Город:
    Zhigulevsk
    Имя:
    Александр
    По твоим ссылкам 1 и 2 должно работать без проблем, а 3 - это уже другое что-то по назначению. Только они делают PPM-SUMM. Ты учел, что вроде надо перемычку где-то на Inputs (может быть не точно)? Или для Pixhawk оно по другому делается (не помню)?
     
  7. Олег Меньшиков

    Олег Меньшиков Студент

    Регистрация:
    21 апр 2015
    Сообщения:
    71
    Город:
    Анапа
    Имя:
    Олег Меньшиков
    По первой ссылке не работает
    Ругается вот на это:

    ISR(PCINT2_vect) {
    pwm_in();
    }

    пишет:
    exit status 1
    'pwm_in' was not declared in this scope
     
  8. raefa

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

    Регистрация:
    3 янв 2015
    Сообщения:
    4.324
    Город:
    Zhigulevsk
    Имя:
    Александр
    А если попробовать старую версию среды Arduino, а лучше ту, которая была в 2012 году.
     
  9. Олег Меньшиков

    Олег Меньшиков Студент

    Регистрация:
    21 апр 2015
    Сообщения:
    71
    Город:
    Анапа
    Имя:
    Олег Меньшиков
    Попробую.
    Сейчас устанавливаю Atmel AVR Studio 7
     
  10. Xichnik55

    Xichnik55 Старший научный сотрудник

    Регистрация:
    10 сен 2015
    Сообщения:
    665
    Город:
    Омск
    Имя:
    Иван
    Декодер PPM с RC-аппаратуры на Arduino

    Задача:
    Имеется пульт системы радиоуправления и/или приемник с выходом CPPM. Хотим получить массив значений ширины импульса для каждого канала.

    Использованное оборудование:
    • Система р/у - Турнига 9х или любая другая JR-совместимая.
    • Шилд - нужен только для удобства подключения. Можете обойтись и без него, пожертвовав удобством.
    • МК - клон Arduino на базе ATmega168(вполне подойдет и такая плата или любой другой клон).
    • ВЧ-модуль FrSky
    • Приемник FrSky D8R-XP
    ПО:
    • Arduino IDE 1.0.2
    • Библиотека PinChangeInt для удобства работы с прерываниями. Я пробовал и без нее - результат тот же, а с ней нагляднее. Потеря памяти меня устроила.

    Подключение:
    [​IMG]

    • Питание МК берем с USB.
    • На приемнике замыкаем перемычкой контакты S третьего и четвертого каналов. Тогда на первом канале он выдает CPPM, а на втором RSSI. Подключение Вашего приемника может отличаться (см. документацию на приемник). Мой был не перепрошитый, обычный, только что из магазина… Длинна пакета 18мс. В случае подключения к передатчику соединяем «землю» и сигнал с PPM и GND согласно рисунку.
    [​IMG]
    • Первый канал приемник соединяем с пятым пином МК при помощи обычного 3х-шнура (как у сервы). Опять же удобство шилда - без каких бы то ни было проблем приемник получает питание с МК.

    Все провода стандартные и ничего паять и обжимать не надо - спасибо шилду.

    Алгоритм:
    Вешаем на входной пин прерывание на изменение уровня.
    В прерывании первым делом проверяем состояние пина. Все действия выполняем только для состояния 0: Вычисляем разницу во времени с предыдущим импульсом. Если она больше 3500 мкс (синхропауза), то сохраняем номер текущего канала как количество каналов и сбрасываем номер текущего канала в 0. Иначе полученную разницу записываем в текущий канал и переходим к следующему каналу.
    Вывод результата сделан на комп через последовательный порт. Туда же по ходу дела выводим RSSI с приемника.

    Скетч: скачать

    #include <PinChangeInt.h>

    #define PPM_PIN 5
    #define MAX_PPM_CHANNELS 25

    volatile uint16_t temp_time;
    volatile uint16_t up_time;
    volatile uint16_t d_time;

    volatile uint16_t ChannelsCount;
    volatile uint16_t Channel[MAX_PPM_CHANNELS];
    volatile uint8_t Curr_Channel;

    void setup()
    {
    digitalWrite(19, HIGH); // включить резистор на выводе аналогового входа 0
    pinMode(13, OUTPUT);
    ChannelsCount==0xff;
    Curr_Channel=0;
    Serial.begin(9600);
    Serial.println("Start");
    TCCR1B = 0; //stop timer
    TCCR1A = 0;
    TCNT1 = 0; //setup
    TCCR1A = 0;
    up_time = 0;
    TCCR1B = 0<<CS12 | 1<<CS11 | 0<<CS10;//0x1A; //start timer with 1/8
    PCintPort::attachInterrupt(PPM_PIN, CalcPPM, CHANGE);
    }

    uint16_t Rssi;
    void loop()
    {
    delay(50);
    Rssi = analogRead(5);
    delay(50);
    Serial.println("RSSI="+String(Rssi));
    Serial.println("Channels="+String(ChannelsCount));
    for(uint8_t i=0;i<ChannelsCount;i++)
    Serial.println("Channel[="+String(i)+"]="+String(Channel));
    digitalWrite(13, !digitalRead(13));

    }

    void CalcPPM()
    {
    temp_time = TCNT1;
    if (!PCintPort::pinState)
    {
    if (up_time>temp_time) d_time=(0xffff-up_time+temp_time)>>1;
    d_time = (temp_time-up_time)>>1;
    up_time = temp_time;
    if (d_time>3500)
    {
    //Sync
    ChannelsCount=Curr_Channel;
    Curr_Channel = 0;
    }
    else
    {
    //Channel
    Channel[Curr_Channel]=d_time;
    Curr_Channel++;
    }
    }

    }
     
  11. Олег Меньшиков

    Олег Меньшиков Студент

    Регистрация:
    21 апр 2015
    Сообщения:
    71
    Город:
    Анапа
    Имя:
    Олег Меньшиков
    Хорошая статья, но не совсем то что мне нужно. Я хочу сделать PPM сумматор каналов от приемника, т.е. все 8 каналов от приемника объединить в PPM.
    Что-то типа такого:
    http://fpvhobby.ru/dalnoboynye-sist...tuyushchie-dlya-lrs/ppm-encoder-expertrc.html
    --- Сообщения объединены, 20 янв 2017 ---
    Только готовый стОит 800 рублей, а ардуинка на том же процессоре 60 рублей :)
     
  12. An_private

    An_private Старший научный сотрудник

    Регистрация:
    6 июн 2016
    Сообщения:
    595
    Город:
    Санкт-Петербург
    Имя:
    Андрей Коробейников
    В понедельник гляну, если не забуду. Там код простой как гвоздь. Под нано делать?

    Не надо. Весь код ArduPPM под WinAVR. И там еще до фига лишнего (так как там обслуживается USB на том же процессоре).
     
    raefa нравится это.
  13. An_private

    An_private Старший научный сотрудник

    Регистрация:
    6 июн 2016
    Сообщения:
    595
    Город:
    Санкт-Петербург
    Имя:
    Андрей Коробейников
    raefa нравится это.
  14. Олег Меньшиков

    Олег Меньшиков Студент

    Регистрация:
    21 апр 2015
    Сообщения:
    71
    Город:
    Анапа
    Имя:
    Олег Меньшиков
    Большое спасибо. В воскресенье буду пробовать. Это как раз то что нужно.
    О результатах расскажу.
     
  15. WLear

    WLear Абитуриент

    Регистрация:
    14 янв 2015
    Сообщения:
    10
    Город:
    Краснодар
    Имя:
    Владимир Лир
    Если еще не поздно - я буквально на прошлой неделе слепил PWM to PPM энкодер на Ардуино про мини. Код брал тут:
    https://github.com/davidbuzz/BuzzsArduinoCode/tree/master/buzz_8pwm_to_ppm328
    Распиновка:
    tx0-rx1-2-3-4-5-6-7 - каналы PWM с 1 по 8
    10 контакт - выход PPM
    ну и +5, GND - соответственно.
     
    raefa нравится это.
  16. Олег Меньшиков

    Олег Меньшиков Студент

    Регистрация:
    21 апр 2015
    Сообщения:
    71
    Город:
    Анапа
    Имя:
    Олег Меньшиков
    Сделал парочку. Не работает ни тот ни тот.
    Всё, вроде как, делал правильно.
    Первую часть кода скопировал и вставил в первую вкладку. Вторую часть во вторую вкладку, назвал ppm_enkoder.h. Компиляция прошла без ошибок. Загрузка тоже норма.
    Может первую вкладку нужно назвать как-то особенно или это не имеет значения?
    Владимир, а у Вас как работает? Индикация на плате ардуино есть какая-то?
     

    Вложения:

  17. An_private

    An_private Старший научный сотрудник

    Регистрация:
    6 июн 2016
    Сообщения:
    595
    Город:
    Санкт-Петербург
    Имя:
    Андрей Коробейников
    должен называться ppm_encoder.h (через C). И он должен обязательно быть сохранён в ту же папку, что и основной скетч.
     
  18. Олег Меньшиков

    Олег Меньшиков Студент

    Регистрация:
    21 апр 2015
    Сообщения:
    71
    Город:
    Анапа
    Имя:
    Олег Меньшиков
    Да, так и есть, через "с". ( это я здесь опечатался).
    Сейчас всё удалю и попробую всё заново
     
  19. WLear

    WLear Абитуриент

    Регистрация:
    14 янв 2015
    Сообщения:
    10
    Город:
    Краснодар
    Имя:
    Владимир Лир
    Я делал просто, скачал все, что есть по ссылке себе в папочку, потом просто ткнул два раза на файлик с расширением ino - у меня автоматом загрузилась среда Ардуино и оттуда прошил контроллер. потом подпаялся к приемнику и все заработало - только были перепутаны каналы, по моему первый и второй - не стал переназначать - тупо перепаял проводочки. :)
    Да, я тоже делал несколько экспериментов с прошивками - нормально заработала та, что я привел...
     
  20. Олег Меньшиков

    Олег Меньшиков Студент

    Регистрация:
    21 апр 2015
    Сообщения:
    71
    Город:
    Анапа
    Имя:
    Олег Меньшиков
    Завтра буду пробовать.
    На всякий случай заказал на Али экспрессе бубен для точной настройки аппаратуры :)
     
Реклама. Купить это место.