Справочници, схемотехника, теория > Програмиране на микроконтролери, програматори, цифрови проекти

GPS-автопилот - алгоритъм

<< < (25/35) > >>

valex:

--- Цитат на: valex в Февруари 23, 2020, 03:07:04 pm ---За по-мощни неща с Arduino  може да се ползват платки NUCLEO
https://www.digikey.bg/products/en/development-boards-kits-programmers/evaluation-boards-embedded-mcu-dsp/786?k=NUCLEO
Имат пинове съвместими с Arduino и допълнителни. Подържат се от софтуера.
https://www.st.com/resource/en/data_brief/nucleo-f429zi.pdf
Ползвал съм NUCLEO F429ZI за проби.
А има и такива Arduino вършачки малко по-скъпи :(
https://www.udoo.org/udoo-x86/

--- Край на цитат ---

EDM electronics:
НАНО-то удовлетворява на 99% всички любителски проекти, програмирането е супер лесно. Ако говорим за професионална работа, то ардуино няма място - горе видеото показва защо.

Вчера си направих експеримент да ускоря ардуиното с обикновен блинк. Замених функциите на digitalWrite(HIGH)  digitalWrite(LOW) с директен запис на изхода на порта PORTB |= (1<<7);  PORTB &= ~(1<<7); и скоростта нарасна 2 пъти - от 8 uS на функция стана 4 uS, а записа в паметта намаля също 2 пъти.

Има библиотеки с алтернативни основни функции на Ардуино, които записи за идентични на "С", но са лесно четими, като ардуинските. Ускорението с тях е от 2 пъти нагоре и толкова по-малко памет.
Подобни гимнастики обаче не са нужни в 99% от случаите. Но използвайки такава библиотека реално може да се удвои най-малко флаш пространството и бързината на всяко ардуино.

Ако ми затрябва нещо по-мощно от НАНО, ще ползвам МЕГА, защото е компактно и се лепи на платка. С по-мощни проекти не бих са захванал, но и не виждам какво.
Ардуино НАНО търпи над 1200-1500 реда скеч заедно с накачулените библиотеки. Това е много нещо...

Автопилота ще се побере предостатъчно в НАНО с всичките му екстри за поне 3 маршрута, дисплей, енкодер, и датчици. Ако остане място за котвата - добре, ако ли не най-удобно, лесно и компактно ще е, да ползвам още едно НАНО.

EDM electronics:
В момента работя над записа и четене в EEPROM.
Паметта е само 1 KB и стига за 2 маршрута и запис на 2ка точки /ширина и дължина/ с дължина на всеки запис по 32 бита или това прави 2 отделни маршрута по 60 точки. Има и опция 3-ти маршрут от 120 точки, като 1-ви и 2-ри се изтриват и не се ползват.

Изтриването направих с цикъл за всеки отделен маршрут по адреси. Записа се прави на всяка двойка точки /ширина и дължина/ с единичен клик на бутона на енкодера. Влизане в меню програмиране със задържане на бутона и излизане отново със задържане. Натиснат и въртене ляво-дясно избирам един от трите маршрута. Това е за изтриването и записа.

Четенето от първата записана точка до последната е лесно. Срещам трудност при четене, когато се намирам някъде по средата на маршрута или не в началото или края. Маршрута може да е права линия или кръг.

Трябва да направя така, че да пускам маршрута и когато се намирам по средата му. Да прочита целия запис от избрания маршрут /колкото точки са записани, да сравнява тези точки с точката на моментното местонахождение, да определи най-близката точка, като разстояние от формулата, за да тръгне оттам.
Въпросът е как да намеря най-близката записана точка в паметта от текущото местонахождение?
Който иска, може, да помага - предложения?

juliang:

--- Цитат на: EDM electronics в Февруари 24, 2020, 02:37:14 pm ---Въпросът е как да намеря най-близката записана точка в паметта от текущото местонахождение?

--- Край на цитат ---
Питагор... към него се обърни... Е, ще трябва да смяташ разстоянието от всички точки до текущата.

За ЕЕПРОМ-а имай две неща пред вид: първо записа и четенето оттам са бавни (записа много, четенето не толкова), и второ - паметта е с определен брой цикли на запис, така че избягвай да записваш в нея неща всяка секунда примерно...

EDM electronics:

--- Цитат на: juliang в Февруари 24, 2020, 06:10:11 pm ---Питагор... към него се обърни... Е, ще трябва да смяташ разстоянието от всички точки до текущата.

За ЕЕПРОМ-а имай две неща пред вид: първо записа и четенето оттам са бавни (записа много, четенето не толкова), и второ - паметта е с определен брой цикли на запис, така че избягвай да записваш в нея неща всяка секунда примерно...

--- Край на цитат ---
Тези неща с броя цикли на флаша, ако не се знаят, то накъде...... При мен записа е ръчен с натискане на бутона. Докато се изчерпи лимита ще минат стотици години.

Питагор не е нужен, нали dmitarp направи основното в проекта - формулите за разстоянието между две съседни точки и ъгъла на отсечката им спрямо севера - те си работят идеално и те ще смятат разстоянието.

Що се отнася до записа и четенето в ЕЕПРОМ:
Ардуино има много хубава библиотека за запис, четене и ъпдейт - т.е. запис само когато има разлика между числото в клетката и записваемото число, та се работи много лесно и удобно. Има дори отделни функции, когато става въпрос за числа със и без плаваща запетая.

Ъпдейт-записът може да са направи обаче и с функция запис под условие, ако записа не е равен на записваемото число. По подобен начин смятам да направя нещата с STM32, защото там ардуинската библиотека ЕЕПРОМ не работи, дори няма отделена такава, а трябва да се конфигурира от флаша.

Аз решение за горната задача имам, но исках да чуя и чуждото мнение. Хич не е проста задача - да прочетеш записа на точките в паметта, да ги сравниш спрямо текущата позиция и да избереш най-късата "клечка" - това да е отправната точка. И после трябва да зададеш, дали да тръгнеш наляво или надясно, т.е. да сумира точките или изважда.

В ардуино езикът има една много хубава функцийка:
sensVal = min(sensVal, 100); // проверяем если sensVal больше 100, то senseVal будет присвоено 100

Та ще се пусне един цикъл - четене от паметта на съответния запаметен маршрут, което ще започне от 1-ва точка и стигне до последна по броя записи - максимално 60. Последователно по горната функция ще отхвърля по-дългата "клечка" и остатакъ ще заема мястото на цифрата 100. После цикъла продължава, докато накрая остане най-късата клечка. Но на всеки прочит ще се следи номера на точката, а той отговаря на съответния адрес. Като знаем номера ще се дава команда да започне четенето от паметта от тази точка напред или назад, т.е. опция реверс.

Функцията min() може да бъде заменена с условие и сравнение със знак < или >  и изпълнение на условието - запис в променлива на по-близката точка.

Точният алгоритъм съм го написал на хартия в блоково изпъление, остава да го напиша в скеча, но има доста мислене.

Та ако има други предложения и ако сте разбрали какво се иска, целия съм в "слух"?

Това е скицата за запис на маршрутите, 1-вия започва от 64-и адрес до 543 и 2-рия от 544 до 1023:

--- Код: ---// Запис на маршрут--------------------------------------------------------------

if (enc1.isClick() && flag_1 == 0 && flag_2 == 1) {      // условие

flag_1 = 0;

if (Route  == 0)  {                                                // брояч на маршрута
Route_1++;                                                          // брояч на запаметени точки
if (addressW2 >= 535) addressW2 = 535;          // ограничаваме до 543-8=535
addressW2 = 56 + Route_1 * 8;                          // променлива word address = 0;
addressL2 = addressW2 + 4;                               // ограничeно до 543
EEPROM.put (addressW2, W2);
EEPROM.put (addressL2, L2);
delay (10);
}
if (Route  == 1)  {
Route_2++;                                                        // брояч на запаметени точки
addressW2 = 536 + Route_2 * 8;               
addressL2 = addressW2 + 4;
EEPROM.put (addressW2, W2);
EEPROM.put (addressL2, L2);
delay (10);
}
if (Route  == 2)  {
Route_3++;                                                      // брояч на запаметени точки
addressW2 = 56 + Route_3 * 8;                      // променлива word address = 0;
addressL2 = addressW2 + 4;
EEPROM.put (addressW2, W2);
EEPROM.put (addressL2, L2);
delay (10);
}

}
--- Край на кода ---

Навигация

[0] Списък на темите

[#] Следваща страница

[*] Предходна страница

Премини на пълна версия