Форум: "Прочее";
Текущий архив: 2016.04.24;
Скачать: [xml.tar.bz2];
ВнизПомогите с написанием функции для ардуинки Найти похожие ветки
← →
NailMan © (2015-08-13 12:20) [0]Привет!
Делаю тут для своей модели паралета полетный контроллер с логгером(куча данных телеметрии). Возникла нужда преобразовать полученное с компаса значение азимута в текстовую аббривиатуру N, NE и т.п. В Паскале/Дельфи это мне понятно как сделать, а вот в адуиновом Срр не понимаю.
Вот что сделал для начала
String GetHeadingDirection(const float head)
{
String s = "";
if ( 0 < head < 11.25 ) {s="N"; goto exit1;}
if ( 11.26 < head < 33.75 ) {s="NNE"; goto exit1;}
if ( 33.76 < head < 56.25 ) {s="NE"; goto exit1;}
if ( 56.26 < head < 78.25 ) {s="ENE"; goto exit1;}
if ( 78.26 < head < 101.25 ) {s="E"; goto exit1;}
if ( 101.26 < head < 123.75 ) {s="ESE"; goto exit1;}
if ( 123.76 < head < 146.25 ) {s="SE"; goto exit1; }
if ( 146.26 < head < 168.75 ) {s="SSE"; goto exit1; }
if ( 168.26 < head < 191.25 ) {s="S"; goto exit1;; }
if ( 191.26 < head < 213.75 ) {s="SSW"; goto exit1; }
if ( 213.76 < head < 236.25 ) {s="SW"; goto exit1; }
if ( 236.26 < head < 258.75 ) {s="WSW"; goto exit1; }
if ( 258.76 < head < 281.25 ) {s="W"; goto exit1; }
if ( 281.26 < head < 303.75 ) {s="WNW"; goto exit1; }
if ( 303.76 < head < 326.25 ) {s="NW"; goto exit1;; }
if ( 326.26 < head < 348.75 ) {s="NNW"; goto exit1; }
if ( 348.76 < head < 359.99 ) {s="N"; goto exit1;}
exit1:
return s;
}
Результат выводится на один из OLED дисплечиков на макетке с моим девайсом. Данные с датчика считываются 2 раза в секунду(в таймере) и там же вызывается эта функция. В основном цикле все только рендерится выводя это на экранчик.
Итог работы функции - цифровое значение направления азимута показывается нормальное, а текстовая аббривиатура всегда "N". В паскале была возможность в условии прописать If X in [yy..zz], но в том С-подобном языке для Ардуин такого нет. Switch case есть, но там только значения возможны, а не условия.
← →
Inovet © (2015-08-13 12:35) [1]И это работает? Вообще в нормальном Си++ надо так, считаем что класс String где-то там определён
String GetHeadingDirection(const float head)
{
String s = ""; // Присвоение пустой строки скорее всего лишнее
// обрати внимание на исправленные границы диапазонов
if ( head >= 0 && head < 11.26 ) s="N";
else if ( head >= 11.26 && head < 33.76 ) s="NNE";
else if ( head >= 33.76 && head < 56.26 ) s="NE";
/* и так далее
if ( 56.26 < head < 78.25 ) {s="ENE"; goto exit1;}
if ( 78.26 < head < 101.25 ) {s="E"; goto exit1;}
if ( 101.26 < head < 123.75 ) {s="ESE"; goto exit1;}
if ( 123.76 < head < 146.25 ) {s="SE"; goto exit1; }
if ( 146.26 < head < 168.75 ) {s="SSE"; goto exit1; }
if ( 168.26 < head < 191.25 ) {s="S"; goto exit1;; }
if ( 191.26 < head < 213.75 ) {s="SSW"; goto exit1; }
if ( 213.76 < head < 236.25 ) {s="SW"; goto exit1; }
if ( 236.26 < head < 258.75 ) {s="WSW"; goto exit1; }
if ( 258.76 < head < 281.25 ) {s="W"; goto exit1; }
if ( 281.26 < head < 303.75 ) {s="WNW"; goto exit1; }
if ( 303.76 < head < 326.25 ) {s="NW"; goto exit1;; }
if ( 326.26 < head < 348.75 ) {s="NNW"; goto exit1; }
if ( 348.76 < head < 359.99 ) {s="N"; goto exit1;}
*/
else s = "???";
return s;
}
← →
Inovet © (2015-08-13 12:37) [2]Форматирование не поставил
String GetHeadingDirection(const float head)
{
String s = ""; // Присвоение пустой строки скорее всего лишнее
// обрати внимание на исправленные границы диапазонов
if ( head >= 0 && head < 11.26 ) s="N";
else if ( head >= 11.26 && head < 33.76 ) s="NNE";
else if ( head >= 33.76 && head < 56.26 ) s="NE";
/* и так далее
if ( 56.26 < head < 78.25 ) {s="ENE"; goto exit1;}
if ( 78.26 < head < 101.25 ) {s="E"; goto exit1;}
if ( 101.26 < head < 123.75 ) {s="ESE"; goto exit1;}
if ( 123.76 < head < 146.25 ) {s="SE"; goto exit1; }
if ( 146.26 < head < 168.75 ) {s="SSE"; goto exit1; }
if ( 168.26 < head < 191.25 ) {s="S"; goto exit1;; }
if ( 191.26 < head < 213.75 ) {s="SSW"; goto exit1; }
if ( 213.76 < head < 236.25 ) {s="SW"; goto exit1; }
if ( 236.26 < head < 258.75 ) {s="WSW"; goto exit1; }
if ( 258.76 < head < 281.25 ) {s="W"; goto exit1; }
if ( 281.26 < head < 303.75 ) {s="WNW"; goto exit1; }
if ( 303.76 < head < 326.25 ) {s="NW"; goto exit1;; }
if ( 326.26 < head < 348.75 ) {s="NNW"; goto exit1; }
if ( 348.76 < head < 359.99 ) {s="N"; goto exit1;}
*/
else s = "???";
return s;
}
← →
Inovet © (2015-08-13 12:43) [3]А ещё можно сделать табличное преобразование, но здесь и так нормально.
← →
DVM © (2015-08-13 12:45) [4]Не проще ли было завести массив структур с двумя углами и стрелковым значением направления. А потом в цикле по нему проходить?
← →
DVM © (2015-08-13 12:47) [5]Строковым , автозамена будь она не ладна
← →
Inovet © (2015-08-13 12:59) [6]Ещё проверки можно оптимизированть половинным сравнением. Набросок, всё расписывать не стал
if (h >= 0.0 && h < 180.0)
if (h < 90.0)
if (h < 45.0)
if (h < 22.5)
if (h < 11.25) s = "N";
else s = "NNE";
else
if (h < 33.75) s = "что-то";
else s = "что-то"
else
else
if (h < 135.0)
else
else if (h >= 180 && < 360)
else s = "???";
← →
Inovet © (2015-08-13 13:26) [7]> [2] Inovet © (13.08.15 12:37)
> // обрати внимание на исправленные границы диапазонов
Сдвинул +0.01. Смысл такой - не должно быть ни единой дырки, а у тебя они есть. Т.е. надо проверять одну границу строго, вторую с включением значения, не забывай, что это плавающая точка и все эти цифери только приближонные значения. Левое проверяем на больше или равно, правое на меньше.
0,0, 11.25
11.25, 22,5
22,5, 33,75
...
348.75, 360
А вообще таблично преобразовать самое то. Значение с датчика делим на 11,25, берём целую часть - это и будет индекс в таблице со строками.
← →
NailMan © (2015-08-13 14:17) [8]Всем спасибо!
сделал комбинированно - проверку на N сделал If-ами с обоих сторон от нуля/360, остальные значения сделал таблично.
Теперь определяет как положено!
← →
Inovet © (2015-08-13 16:09) [9]> [8] NailMan © (13.08.15 14:17)
> остальные значения сделал таблично
Ещё момент. Массив под таблицу надо делать либо глобальный, либо локальный но с модификатором static, иначе он будет инициализироваться при каждом входе в функцию.
← →
NailMan © (2015-08-14 02:21) [10]Эт понятно - я почти все переменные и константы глобально сделал - экономия килобайтов и даже байтов, даже несмотря на то что использую для конечного будущего девайса большую ардуину мегу. пока все в ОЗУ 47% из 8кб занимает - это дофига подключенных библиотек(дисплеи через i2c, 10DOF датчик, термо/влажность, таймеры, магнетометр и т.п.) - потом мож пооптимизировать чего придется, хотя мега по сравнению с другими вместительна и можно не париться. Еще Блютуз(на мобилу чтоб шла отладочная телеметрия) и ЖПС подключать надо.
← →
brother © (2015-08-14 06:28) [11]можно полное название девайса? + откуда брали софт для программирования? свой коптер если буду делать, то может пригодиться.
← →
NailMan © (2015-08-14 10:17) [12]Дак все ж доступно на ебае и в сети!
Компоненты своего девайса на ебае брал в куче разных мест
Сама Ардуина Мега 2560. На такой меге есть готовые проекты для мозга коптера(типа ардупилота)
http://www.ebay.com/itm/400935362320?_trksid=p2060353.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT
экранчик oled на i2c шину. Очень удобно для отладки. У меня 2 таких на модели будут стоять для отображения телеметрии и контроля бортовых показателей
http://www.ebay.com/itm/181325480424?_trksid=p2060353.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT
Синепуп модуль. Я его для вывода диагностической телеметрии на мабилу или планшет(тоже удобно) применяю
http://www.ebay.com/itm/Wireless-Serial-6-Pin-Bluetooth-RF-Transceiver-Module-HC-05-RS232-TOP-/161314776475?hash=item258f1c259b
Степдаун преобразователь для питания от АКБ до 5В
http://www.ebay.com/itm/Mini-3A-DC-DC-Converter-Adjustable-Step-down-Power-Supply-Module-replace-LM2596s-/310683416079?hash=item48562cb60f
ЖПС модуль
http://www.ebay.com/itm/Ublox-NEO-6M-GPS-Module-Aircraft-Flight-Controller-For-Arduino-MWC-IMU-APM2-/200911914297?hash=item2ec7488539
10DOF модул датчиков (3-осевой гиро, 3-осевой акселерометр, 3-осевой магнетометр, высокоточный барометр и термодатчик)
http://www.ebay.com/sch/sis.html?_nkw=10DOF+IMU+MPU6050+HMC5883L+BMP085+Gyroscope+Acceleration+Compass+Module+Arduino&_id=400597388161&&_trksid=p2060353.m2749.l2658
Я еще кучу всякого использую. К примеру полетный контроллер что я делать ща буду на базе всего этого железа еще пишет на SD карту лог в CSV формате. Модуль реализован шилдом(ставится на Ардуину вторым этажом). Там же сделать и RTC-модуль. Правда пока его подключить не удалось - он на i2c шине как и экранчики и 10DOF и при подключении к ней мега виснет. Что то я там на шилде видать не модифицировал.
Среда разаботки как и описание контроллера Arduino доступна на arduino.ru. Библиотеи достаются в гугле по номерами датчиков и проч. Если надо могу свою коллекцию дать. В каждой библиотеке обычно есть примеры использования. Знающему и даже не знающему программирование на С/pascal легко делать вполне серьезные вещи. Даже кухарка сможет ;-)
← →
Inovet © (2015-08-14 10:38) [13]Подумал щас. Там же 16 значений, индекс вычислять надо так
(h + 11.25) / 22,5
← →
brother © (2015-08-14 10:45) [14]огромное спасибо!
← →
brother © (2015-08-14 17:31) [15]+ вопрос, а апу зацепить к нему просто?
← →
NailMan © (2015-08-14 17:44) [16]Что есть АПУ? Поконкретней бы
← →
brother © (2015-08-14 18:55) [17]например
http://www.hobbyking.com/hobbyking/store/__8992__Turnigy_9X_9Ch_Transmitter_w_Module_8ch_Receiver_Mode_2_v2_Firmware_.htm l
← →
NailMan © (2015-08-15 14:42) [18]Смотря что надо сделать. Под эту турнигу на форуме и в бложиках rcdesign.ru есть куча ардуиновых модов. Вплоть до голосовой озвучки переключателей. Ну и кастомные прошивки(наши отечественные) дающие функционал взрослых пультов. А так для ардуины цепляется библиотека Servo и вперед. Я так и буду делать управление через флайт-контроллер на Меге. Пока 4 канала с пульта будут приходить на разные функции и 2 канала PPM будут управляемы самой Мегой(запуск запасного парашюта и еще кой чего). Безграничные возможности одним словом
← →
brother © (2015-08-15 15:09) [19]апа физически как цепляется? програмно настраиваем на нужные каналы ввода/вывода (они на меге где?)?
← →
NailMan © (2015-08-17 21:18) [20]ну я говорю - смотря что надо получить о меги. Если мы говорим о мозге коптера, то к ней на дигитал входы подключается приемник, а пульт находится далеко на земле. Все входные каналы обрабатываются как PPM(вид PWM) сигнал и обрабатывается лоигкой коптера. На выходы(тоже цифровые) мега генерирует PPM-сигналы на регуляторы моторов(ESC). Другие входы(i2c шина, цифровые входы) используются также для датчиков, блоков датчиков и проч. Аналоговые входы используют в основном для съема напряжения с АКБ(побаночно и/или общий) через делители напряжения,ну и т.д.
Мегу поизучай на http://arduino.ru/Hardware/ArduinoBoardMega2560
Там есть некоторые ограничения по цифроваым выходам. Где то есть аппаратные прерывания, где то нет. Плюс с питанием надо аккуратно и мудро поступить. МНе на флайт-контроллер модели придется делать 2 рега - оба линейных(5В) на питание приемника/меги и питание силовой цепи(оптоизолированной) зажигания двиагателя. Хотя нога 5В входа на меге хиловата, можно покупной рег импульсный на мегу кинуть на 8-9В отрегулировав.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2016.04.24;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.002 c