может быть тебе о си подумать? на асме написать кодер и декодер, да еще с дисплеем настроек - не так просто..
плюс на асме нужна будет библиотека 32ух битной арифметики... да и вообще работы на асме там много.. (можешь глянуть в файлах проект minicoder) Виталий (аka ВитГо)
может быть тебе о си подумать? на асме написать кодер и декодер, да еще с дисплеем настроек - не так просто..
не знаю даже..... прям убил меня вопросом.
на сколько я знаю, ассемблер занимает очень много времени! (кропотливого труда) но программы написанные на ассемблере намного "лучше" программ написанных на СИ (меньше весят, более корректны, содержат меньше ошибок) Все ошибки лучше исправлять на ассемблере ( такое мнение сложилось у меня не из личного опыта, а из мнений высказанных на различных форумах и не только связанных с МК ) немного теории и практики с ассемблером у меня есть, а вот про СИ я ни чего не знаю... вот по этому и говорю, что не знаю...
какой МК мне необходимо приобрести? AtMega 16? AtMega 32? AtMega 64? не успеваю за своими мыслями......
в формате ppm доступно обычно не более 8 каналов, наверное нет смысла делать меньше..
далее какой функционал нужно получить ?
кстати, такой вопрос: а что вообще об управлении моделями ты знаешь ? каким образом примерно генерится сигнал? что такое микширование? что такое полетные режимы?
что из этого ты хочешь сделать ? Виталий (аka ВитГо)
там есть первая версия кодера от Жени Болецкого (aka focus) она на меге16, написана на СИ исходники генерации сигнала очень просты, попробуй разобраться...
в принципе архивы там должны остаться, если не найдешь - пиши - я попробую в своих архивах поискать (я как то разбирался в 2009 году когда свой первый кодер писал)
для многих поделок того, первого кодера Жени будет достаточно... можно будет оттолкнуться от нее, что то оптимизировать что то переписать (меню там ужас!)
в принципе если писать на асме то конечно код будет короче, но в этом случае нужно прикинуть какой функционал ты сможешь сделать на асме... причем саму генерацию ppm на асме можно сделать без проблем, а вот сделать на нем интерфейс общения с пользователем - это уже задача которую приходиться писать больеш по времени чем все остальное (то же у меня сейчас в VCoder2 - пишу именно интерфейс взаимодействия, генерация самого сигнала займет максимум дней 4-5... с интерфейсом хорошо если за три недели разделаюсь) Виталий (аka ВитГо)
кстати, проект miniCoder можешь взять ! там нужно как раз сменить дисплей (я его писал на алфавитно-цифровой 16х2 - но он слишком большой и дорогой) - туда от нокии как раз дисплей просто проситься...
придется правда еще переписать меню - оно сейчас на двухстрочный экран заточено... в остальном он почти законцен, осталось написать полетный экран, добавить экспоненты, может еще чтото по мелочи.. там даже написана генерация сигнала а-ля HK6 для подключения к симулятору через t6sim Виталий (аka ВитГо)
кстати, такой вопрос: а что вообще об управлении моделями ты знаешь ? каким образом примерно генерится сигнал? что такое микширование? что такое полетные режимы?
в детстве ходил в авиа-ракето модельный кружок, строил там в основном модели ракет. Так же делал планеры и пару резиномоторов. Управляемых самолетов я не строил. Об управлении моделями я в принципе ни чего толкового не знаю. Знаю какие органы управления полетом есть у самолетов и вертолетов, а так же квадрокоптеров больше наверно ни чего и не знаю...
Цитата (ВитГо)
попробуй почитать тему Самодельный передатчик. Часть 1 с rcdesign
читал обе эти части.. прочитаю еще разок - освежу в памяти
Цитата (ВитГо)
кстати, проект miniCoder можешь взять !
если я правильно понял, то - что miniCoder, что проекты с rcdesign заточены под готовый "заводской" приемник ?
Цитата (ВитГо)
что из этого ты хочешь сделать ?
я еще сам не знаю... мне бы главное научиться самое простое, что можно сделать это или авто модель или судо модель = 1 сервопривод и 1 двигатель (но детали придется покупать) еще один, не совсем простой, вариант - это сделать управление (приемник+передатчик) для того вертолета который у меня уже есть еще один простой вариант - это квадрокоптер ( опять же детали придется покупать ) а в дальнейшем планирую собрать приличный самолет.
Цитата (ВитГо)
в принципе если писать на асме, то конечно код будет короче, но в этом случае нужно прикинуть какой функционал ты сможешь сделать на асме... причем саму генерацию ppm на асме можно сделать без проблем, а вот сделать на нем интерфейс общения с пользователем - это уже задача которую приходиться писать больШЕ по времени, чем все остальное
А для чего нужно это меню? Устанавливать различные "режимы" полетов? для чего они ? вот тут я ни чего не знаю..........
у нас в городе есть магазин ПИЛОТАЖ http://www.pilotage-rc.ru/shopinfo.html?dis=81 но в нем все ОЧЕНЬ ДОРОГО!!! лучше наверно заказывать от куда нибудь.. не успеваю за своими мыслями......
если я правильно понял, то - что miniCoder, что проекты с rcdesign заточены под готовый "заводской" приемник ?
не совсем так, они заточены под стандартный сигнал PPM что это дает ?
а это дает возможность не изготавливать радиотракт самому а использовать уже готовый плюсы готового радиотракта - это применение спец. микросхем который и намного дальнобойнее самодельных, и одновременно работают на той частоте для которой были спроектированы (то есть на поле не помешают другим моделистам).. плюс радиотракты бывают с обратной связью (то есть с модели на пульт идет передача например уровня принимаемого сигнала, напруга силовой батареи, gps координаты и т.д.) объять все необъятное не возможно - иначе тебе сначала придется делать кодер каналов, потом радитракт, потом сервы.. - так ты долго будешь собирать то что можно купить за 600 рублей на хоббикинге (китайский магазин для моделистов)
поэтому многие проекты радиотракт используют стандартный: PPM сигнал, до 8 каналов включительно...
далее берут например такую аппаратуру http://www.hobbyking.com/hobbyki....2_.html и из нее используют корпус со стиками, передатчик и приемник.. генерацию ppm пишут сами на своем железе..
на выходе аппаратура способная бить на 800 метров - в реальности обычные модели самолетов с метровым размахом крыла через 300 метров уже почти не видно.. ну а если смотреть направление FPV (полет от первого лица) - полеты по камере - то там ставят спец. передатчики видео с модели, и на модель передают модулями с мощностью до 2 вт (обычно 10-100 мвт)
причем важно что если ты напишешь ppm генерацию сигнала, то ты сможешь применять и другие модули радиоканала, например, http://www.hobbyking.com/hobbyki....ST.html это популярный сейчас FrSky - там есть модули с телеметрией
причем регуляторы оборотов обычно в себе содержат стабилизатор на 5 в - который питает и сам приемник и сервы подключенные к нему..
поэтому важно решить для себя - готов ли ты (и можешь ли ты) сделать то что по вышеуказанным ссылка стоит копейки .. ? если большого смысла не видишь - то есть смысл использовать стандартный сигнал PPM... с твоими радиомодулями - ты должен смочь его передать, придется правда написать дешифратор приемника еще - но обязательно приемник сигнала PPM который генерит стандартный PWM сигнал для того чтобы к твоему приемнику\дешифратору можно было подключить стандартное оборудование (что по ссылкам)
Цитата (uwrtey)
самое простое, что можно сделать это или авто модель или судо модель = 1 сервопривод и 1 двигатель (но детали придется покупать) еще один, не совсем простой, вариант - это сделать управление (приемник+передатчик) для того вертолета который у меня уже есть
я думаю ты на примере дискретного управления убедился - что количество реализуемых каналов не столь важно... что одну команду передавать, что 40 - код не сильно усложняется (фактически меняется только счетчик в цикле приема) :-)) сигнал PPM допускает 8 аналоговых каналов - вот на 8 и делай...! в принципе можно попробовать оживить верт (но там придется помудрить с гиростабилизацией) - у меня как то был соосный верт без гироскопа - даже на нем можно летать (хотя конечно гемор :-))) опять таки если очень захочется то есть стандартный гироскоп, который использует стандартные сигналы http://www.hobbyking.com/hobbyki....cation= (листай ниже)
Цитата (uwrtey)
еще один простой вариант - это квадрокоптер ( опять же детали придется покупать )
я бы очень поостерегся назвать квадрокоптер простым :-))) это один из самых сложноуправляемых ЛА... фактически управляет им контроллер у которого на борту и 3х осевой гироскоп и 3х осевой аксельометр, и бародатчик для определения высоты... и регуляторы оборотов у него обычно более быстродействующие нежели с PWM управлением.. настройка квадрокоптера - тоже не простое занятие... в общем не зря на квадрокоптер есть хорошие и плохие платы управления (первые стоят около 300 баксов, а последние 50)
Цитата (uwrtey)
а в дальнейшем планирую собрать приличный самолет.
для начала приличный не нужен :-) потому что удел первых трех-четырех моделей - быть разбитыми в пух и прах :-))) путь от такого
Я ,например, могу передавать на модель 6 байт команд. 2 пропорциональные, 1 дискретный, 3 служебных(резерв). А вот формирование додумать не могу(как считают расходы,границы и пр).Где про это почитать?
ну все таки для начала я бы покурил готовый код смотрите вложение: это первый кодер фокуса, все предельно просто и достаточно понятно (ну кроме меню, там он намудрил)
по границам:
в моделизме есть два вида сигналов управления: PPM и PWM первый это сигнал содержащий в себе информацию о всех каналах управления (до 8, период повторения пакета от 20 до 22,5 мс)
ширина канальных импульсов от 1 до 2 мс...
PWM - это фактически выделенный один импульс канала шириной от 1 до 2 мс с периодом повторения 20-22,5 мс
PWM сигналы выходят с дешифратора приемника и идут на сервы, регуляторы хода и т.д.
может быть это кажется и не очень удобным - но это стандарт, и если его придерживаться то наше оборудование будет совместимо с другим
далее, расходы на серву,
минимум 1000 мкс (1 мс) максимум 2000 мкс (2 мс) я пробовал сервы. аналоговые отрабатывают изменения с шагом в 4-7 мкс цифровые уже берут и 2 мкс !!! получается что минимальное разрешение которое желательно достичь это 512 приращений от минимума до максимума.. - таким образом одного байта для управления одним каналом уже мало.. - переходим на int (2 байта)
далее, у каналов управления в виде серв есть совершенно конкретные ограничения, например ход сервы шасси обычно не более 100 градусов, а это изменения от 1000 мкс до 1750 мкс.. поэтому нужна возможность программно уменьшать минимум и максимум канального импульса - иначе серва свернет себе башку (на это у них сил всегда хватает) в Vcodere я делал настройку крайних точек каналов с точностью до 1 мкс - в принципе это избыточно, вполне хватает с точностью до 4-5 мкс - вот тут хватает одного байта для настройки каждой точки, измеряем в процентах min=1000 мкс mid (центр)=1500 мкс max=2000 мкс
соответственно это расходы min=-100% mid=0% max=100%
1 %=(2000-1000)/200=5мкс (100 итераций в минус + 100 итераций в плюс - это упрощенно но работает правильно)
математику настройки проще сделать от центра берем центр канала 1500 мкс и применяем к нему точку, в зависимости от знака либо прибавляем к центру либо вычитаем например min=-100% значит 1500 мкс (центр) - 100% (значение min) * 5 мкс (это 1%)=1000 мкс
для максимума max=75% (например! у нас например это серва шасси и у нее ход не полный) значит 1500 + 75 * 5=1850 мкс
еще нужна обязательно настройка центра канала он у нас конечно 1500мкс, но на деле обычно то тяги чуть более длинные\короткие то еще что нить.. и центр чуть смещается... используя "наш" метод мы легко посчитаем центр канала mid=-5% (например) значит 1500 - 5*5=1475 мкс
надеюсь про статическую настройку точек каналов понятно?
микширование это преобразование некоторого значения органа управления в значение выходного канала с заданными параметрами (инверсия, расходы)
например у нас ручка управления, она на AVR даст до 10 бит разрешения (от 0 до 1023), и нам нужно ее значение преобразовать в значение канала (например канал настроенный выше: min=1000, mid=1475, max=1850 мкс)
здесь важно что и у ручки управления есть центр ! его мы определяем во время калибровки органа управления ибо не всегда центр стика (в который он стоит под воздействием возвратных пружин) совпадает с центром значения АЦП ! например у нас ручка после калибровки дала значения: min=23 mid=560 max=950 (это абсолютно реально !)
и нам нужно чтобы значения стика преобразовались в значение канала с 50% ограничением (то есть полное отклонение стика вызвало только 50% изменение значения канала) - это нужно например при настройки таких ЛА как летающее крыло, да и у самолетов зачастую не всегда нужны полные расходы, иногда нужны и меньшие (например для учебного самолета нафиг не нужны полные иначе он будет слишком резкий в управлении)
теперь берем значения ручки управления: uch (это я так называю органы управления user channel) = 700
мы сравниваем значение uch с центром uch_mid который равен 560 700>560 процент микширования у нас (50%) > 0 значит мы будем преобразовывать значение ручки управления от центра к максимуму !!
для микширования мы должны как бы пересчитать шкалы uch и канала
диапазон изменения канала от центра до максимума ch_rate=ch_max - ch_mid=1850-1475=375 диапазон изменения органа управления от центра до максимума uch_rate=uch_max-uch_mid=950-560=390
теперь простая алгебра (которая при переходе на целочисленку вынесет мозг, но это позже)
здесь: ch_val - это значение которое нужно прибавить к каналу (по умолчанию канал в центре), прибавляем потому что процент микширования положительный (иначе бы вычитали) ch_rate - расход соответствующего диапазона канала (в нашем случае ch_max-ch_mid) uch - значение с АЦП ручки управления uch_mid - калибровочное значение центра ручки управления mix - процент микширования, в нашем случае 50 uch_rate - расход соответствующего диапазона ручки управления 100 - это необходимый делитель для mix чтобы получить 50% (то есть множитель 0.5)
посчитаем? ch_val=(375 * (700-560) * 50) / (390 *100) = 67 значит к значению канала 1475 - это наш центр, в результате отклонения ручки нужно прибавить 67 мкс = 1542 мкс
попробуйте взять другое значение процента микширования и границы каналов и положение ручки и поиграться с формулой ! Виталий (аka ВитГо)
вот кстати набросал вам калькулятор канала на экселе.. так математика работает в VCoder'e - это я сам выводил... у фокуса брал только общие принципы микширования...
в желтые поля вводите свои значения в синем результат который нужно прибавить к текущему значению канала (стартовое значение канала = ch_mid !!!)
в принципе каждый микшер отрабатывая прибавляет к значению канала свое полученное в вычислениях (складывает с учетом знака !)
unsigned long int chval; // значение канала источника unsigned long int chmin, chmid, chmax; // точки канала источника unsigned long int dchmin, dchmid, dchmax; // точка канала получателя unsigned long int soursesc, destsc; // размер шкалы источника и получателя unsigned long int res; // результирующее значение для шкалы получателя
unsigned char signres; // знак результата микширования
signed char mixproc; // процент микширования канала unsigned char mixuch; // номер UCH содержащего процент микширования
for (i=mixstart;i<mixend;i++) { // перебираем в цикле микшеры каналов
// проверяем - если микшер включен... if (rmodel.FMODE[FMODE_NUM].MIXER[i].MIX_TYPE.ACTIVE==1) {
//проверяем используется ли в микшере выключатель if (rmodel.FMODE[FMODE_NUM].MIXER[i].MIX_TYPE.MIX_SW==1) { // используется выключатель
sw=rmodel.FMODE[FMODE_NUM].MIXER[i].MIX_TYPE.UCH_SW+7; if (UCH_VALUES[sw]==1) { //выключатель включен // накладываем инверсию if (rmodel.FMODE[FMODE_NUM].MIXER[i].MIX_TYPE.SW_INV==0) swon=1; else swon=0; } else { // выключатель выключен // накладываем инверсию if (rmodel.FMODE[FMODE_NUM].MIXER[i].MIX_TYPE.SW_INV==0) swon=0; else swon=1; } } else { // выключатель не используется swon=1; } } else swon=0;
if (swon==1) { // микшер включен всегда или выключателем...
destinch=rmodel.FMODE[FMODE_NUM].MIXER[i].CH_NUM.CH_DEST; // канал получатель dchmid=rmodel.FMODE[FMODE_NUM].LCH_MIDLE[destinch]; // среднее значение канала dchmin=rmodel.CHANNELS.CH_EPL[destinch]; // минимальное значение канального импульса dchmax=rmodel.CHANNELS.CH_EPR[destinch]; // максимальное значение канального импульса
soursech=rmodel.FMODE[FMODE_NUM].MIXER[i].CH_NUM.CH_SOURSE; // номер канала источника // загружаем значения канала источника if (rmodel.FMODE[FMODE_NUM].MIXER[i].MIX_TYPE.SOURSE_TYPE==1) { // наш канал LCH chval=OLD_LCH_LEN[soursech]; // LCH_LEN[soursech]; // берем значение канала chmid=rmodel.FMODE[FMODE_NUM].LCH_MIDLE[soursech]; // среднее значение канала chmin=rmodel.CHANNELS.CH_EPL[soursech]; // минимальное значение канального импульса chmax=rmodel.CHANNELS.CH_EPR[soursech]; // максимальное значение канального импульса } else { // наш канал UCH chval=UCH_VALUES[soursech]; // берем значение UCH if (soursech<7) { // имеем дело с аналоговым UCH chmid=UCHmid[soursech]; // среднее значение chmin=UCHmin[soursech]; // минимальное значение chmax=UCHmax[soursech]; // максимальное значение } else { // имеем дело с дискретным UCH if (soursech==7) { // выключатель FMODE (трехпозиционный) chmin=0; chmid=0; chmax=1; chval=1; } else { // остальные выключатели chmid=0; chmin=0; chmax=1; } }
} // теперь получим коэффициент микширования канала if (rmodel.FMODE[FMODE_NUM].MIXER[i].MIX_TYPE.PROC_SOURSE==1) { // процент микширования берем из UCH mixuch=rmodel.FMODE[FMODE_NUM].MIXER[i].MIX_VAL & 0x0F; if (mixuch==7) mixproc=100; else mixproc=UCH_VAL_PROC[mixuch]; // берем процент микширования из канала
// инверсия значения микширования если в этом есть необходимость if ((rmodel.FMODE[FMODE_NUM].MIXER[i].MIX_VAL & 0x10)!=0) { mixproc=-mixproc; } } else { // процент микширования фиксированный mixproc=rmodel.FMODE[FMODE_NUM].MIXER[i].MIX_VAL; }
// !!!!!!!!!!!!!!!!!! НОВАЯ ПРОЦЕДУРА РЕВЕРСА КАНАЛА
if (rmodel.CHANNELS.LCH_REV[destinch]==1) { // реверс канала !! mixproc=-mixproc; } // !!!!!!!!!!!!!!!!!!
// теперь микшируем
// определяем размерность шкал if (chval>chmid) { // если значение в правой части шкалы soursesc=chmax-chmid; // размер шкалы справа - источник chval=chval-chmid; if (mixproc>0) { destsc=dchmax-dchmid; // размер шкалы справа - получатель signres=1; } else { destsc=dchmid-dchmin; // размер шкалы слева - получатель signres=0; mixproc=-mixproc; }
} else { chval=chmid-chval; soursesc=chmid-chmin; // размер шкалы слева
if (mixproc<0) { destsc=dchmax-dchmid; // размер шкалы справа signres=1; mixproc=-mixproc; } else { destsc=dchmid-dchmin; // размер шкалы слева signres=0; } }
res=(destsc*chval*mixproc)/(soursesc*100); // рассчитываем значение новой шкалы // chval1=destinch; if (signres==1) LCH_LEN[destinch]=LCH_LEN[destinch]+(unsigned int)res; else LCH_LEN[destinch]=LCH_LEN[destinch]+-(unsigned int)res; } } }
прикиньте сколько работы если писать на ассемблере :-)))
хотя на асме я тоже писал подобное микширование , смотреть в проекте miniCoder модуль model_calculator вложил его чтобы чисто "по понтоваться"
для работы этого модуля нужна библиотека 32ух битной математики... тоже писал сам, в принципе получилось хорошо и функционально, как использовать можно глянуть в model_calculator
не совсем так, они заточены под стандартный сигнал PPM что это дает ?
а это дает возможность не изготавливать радиотракт самому а использовать уже готовый плюсы готового радиотракта - это применение спец. микросхем который и намного дальнобойнее самодельных, и одновременно работают на той частоте для которой были спроектированы (то есть на поле не помешают другим моделистам)..
что за "радиотракт" такой? это специализированные радиомодули что ли ?
Цитата
на выходе аппаратура способная бить на 800 метров - в реальности обычные модели самолетов с метровым размахом крыла через 300 метров уже почти не видно..
на сколько я знаю, те модули, которые я использовал в дискретной системе управления, способны бить на километр в прямой видимости. ( на практике, с плохими антеннами и через железобетонную стену у меня брали на 100 метров)
самодельные радиомодули я даже не собираюсь строить! там мало просто спаять, там согласовывать все нужно и настраивать аппаратуру с помощью дорогого оборудования... проще купить...
согласен, готов купить... а радиомодули, которые я использовал в предыдущем проекте не подойдут ?
Цитата
ну и конечно применение стандартных способов передачи позволяет использовать стандартные же сервомашинки (оцени цены на некоторые дешевые)
согласен, и сервомашинки то же проще купить, чем самому городить....
Цитата
причем регуляторы оборотов обычно в себе содержат стабилизатор на 5 в - который питает и сам приемник и сервы подключенные к нему..
можно и купить, а можно собрать....
Цитата
поэтому важно решить для себя - готов ли ты (и можешь ли ты) сделать то что по вышеуказанным ссылка стоит копейки .. ? если большого смысла не видишь - то есть смысл использовать стандартный сигнал PPM... с твоими радиомодулями - ты должен смочь его передать, придется правда написать дешифратор приемника еще - но обязательно приемник сигнала PPM который генерит стандартный PWM сигнал для того чтобы к твоему приемнику\дешифратору можно было подключить стандартное оборудование (что по ссылкам)
.... а-а, ... я кажется начинаю понимать о чем ты толкуешь... ты предлагаешь использовать готовый декодер ? ты предлагаешь только кодер передатчика переделать ? не успеваю за своими мыслями......