Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
15-1439457626
NailMan
2015-08-13 12:20
2016.04.24
Помогите с написанием функции для ардуинки


15-1439587804
Юрий
2015-08-15 00:30
2016.04.24
С днем рождения ! 15 августа 2015 суббота


2-1411245669
Stepan4ik
2014-09-21 00:41
2016.04.24
Function 2 значения


2-1412050405
Stepan4ik
2014-09-30 08:13
2016.04.24
Обрезать после запятой (Float)


4-1276949542
lexi
2010-06-19 16:12
2016.04.24
Проверить существование родительского процесса





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский