iiv
Свой-
Постов
2 895 -
Зарегистрирован
-
Посещение
-
Победитель дней
3
Весь контент iiv
-
Спасибо большое за комментарий! Особо секретного конечно же там ничего нет, есть разве что приватные данные, которые юзер не хочет в открытую разглашать. Юзер в основном планируется довольно далеким от программирования и системного администрирования, например, строитель или прораб. Так как в современных браузерах, особенно в мобильниках, по умолчанию отключен http и все перенаправляется на https, возникает проблема, что я должен поддержать https в моем веб интерфейсе, но если юзер зашел без интернета, по DHCP или за файерволом, я никак не смогу туда прикрутить какой-нибудь стандартный LetsEncript'овский сертификат, и, из-за этого-то весь сыр бор.
-
Спасибо, jcxz да, точно! Хотя как мне кажется, функциональность аппаратуры на столько проста, и, одновременно сложна, что если аппаратура включена, то она должна работать и слать много данных по веб интерфейсу (и уровень батарейкии можно на веб интерфейсе поточнее посмотреть), а если съем закончили, то не зачем аппаратуру держать включенной, все данные уже будут в веб интерфейсе пользователя и он там сам их будет обрабатывать. Вот с SSL сертификатами - я реально запутался. Как я понимаю из множества ссылок в интернете: https://security.stackexchange.com/questions/231293/self-signed-certificates-in-embedded-iot-device https://security.stackexchange.com/questions/230921/certificates-and-keys-for-mass-production-devices https://security.stackexchange.com/questions/121561/best-practices-to-implement-https-in-embedded-devices/121573#121573 если моя аппаратура каждый раз будет получать по DHCP какой-то первый попавшийся IP адрес и часто попадать в разные руки с разными пользователями, шанс получить и удобно расположить кем-то известным подписанный сертификат, чтоб браузер не ругался, у меня стабильно стремится к нулю. То есть я хочу хотя бы: 1. хотя бы чтобы соединение пользователя с моей аппаратурой шло по зашифрованному протоколу, 2. а лучше, чтобы у пользователя не возникали сообщения, что де "сертификат подписан неизвестно кем, уходим отсюда!"
-
Численная реализация МНК
iiv ответил amaora тема в Математика и Физика
Что вам запрещает сделать сингулярное вашей Rx, тогда в моих формулах вместо Rx будет стоять диагональная матрица D, и у вас будет полный контроль точности при вычислении этих формул: \( b = V (D + \epsilon D^{-1})^{-1} U^T s \) и никаких ошибок у вас не набежит. Без сингулярного только квадрат как я написал, или ранк ревеалинг с отбросами векторов на основе критерия, схожего с регуляризацией по Тихонову, но, боюсь, что с последним будет очень много танцев с бубнами. -
Спасибо большое, jcxz за комментарий! Да, впопыхах писал, и не стал уточнять. По сути - конечно именно такой вариант планировался, возможно дополнительно будет еще светодиод, по цвету которого можно будет понять состояние работы (работает, ожидает, заряжается, выключен, заряд батареи вот-вот закончится). Конкретно сейчас - это аппрат, который просто делает 3Д сканирование окружающей среды на несколько метров и сбрабывает результаты сканирования на веб интерфейс смартфона. То есть после того, как со смартфона на аппарат зашли по веб интерфейсу - реально ничего больше не нужно, а советы где еще посканировать, чтобы уточнить - можно дать только через смартфон.
-
Еще вопрос вдогонку... Скажите, пожалуйста, а как бороться с SSL сертификатами? Вопрос в том, что даже самопально сгенеренный сертификат выдает сообщение в браузере "уходим отсюда", а получить какой-то сертификат по типу Let's Encriptа вроде нельзя, если мой аппарат живет в чей-то локальной сетке. Или принято на это забивать?
-
esp32-s3 - у него пинов немного больше, а конкретно ESP32-S3-WROOM-1U-N16R8
-
Я не знаю как правильно классифицировать. Хочу в ближайшее время вывести наконец-то три устройства на рынок. Первое - как раз именно такое и про него как раз идет обсуждение, про остальные - пока еще рано говорить. Если говорить про первое устройство, то: сама железка с одной единственной кнопкой включения и батарейкой на борту с обычной 5В зарядкой по USB. Сами команды работы по большей части очень простые - стартовать или остановиться, и как-то криво-косо уже все функционируют, а вот результат работы - 3Д step файл, который, очевидно, удобно отображать хотя бы на смартфоне с поддержкой WebGL. На борту, кроме передающей esp32, имеется еще около 20 контроллеров и нужна возможность апдейта всех этих прошивок. Выбор esp32 обусловлен в первую очередь стоимостью и простотой. Конечная стоимость для заказчиков этой аппаратуры наверное будет существенно меньше килобакса, но какой именно она будет - пока инвесторы не решили.
-
Спасибо большое, alexunder! да, классно, но совсем впритык по скорости оцифровки и потом если считать 24 канала по 200ксемплов и пусть даже 12 бит, то это всяко 60Мбитс/с по SPI или уже на каком-то параллельном интерфейсе делать. А это все должно быть в портативном варианте, так как данные в прямом смысле на лету, и ставить свисток + линукс - уже будет сложно. Пока кручу tms, послезавтра придет нуклео, STM32cube к нему уже поставил, предполагаю, что на STMе удастся все на лету обработать, особенно если там еще кордик в DMA есть.
-
Численная реализация МНК
iiv ответил amaora тема в Математика и Физика
я боюсь, что до конца не понял нотацию матлаба, поэтому запишу обычными формулами: у вас есть без регуляризации \(b = R_x^{-1} s\), теперь это будет в виде \( b = (R_x^T R_x + \epsilon I)^{-1} R_x^T s \) По поводу выбора регуляризационного параметра. Если вы взяли решение \( b_0 \) при нуле и при очень маленьком значении эпсилон этого параметра \( b_{\epsilon} \) и при удвоенном значении эпсилон этого параметра \( b_{2\epsilon} \) , и сравнили по норме и \( || b_{2\epsilon} - b_0 ||_2 > 2 || b_{\epsilon} - b_0 ||_2 \), тогда регуляризатор нужен, и обычно его оптимум достигается при таком эпсилон, когда это неравенство перестает быть верным, хотя и иногда немного раньше. Как угадать это эпсилон без перебора не дорого - готового решения нет. Если Вы можете для вашей \( R_x \) вычислить сингулярное разложение, то тогда такой поиск будет Вам стоить \( O(N^3 + kN)\), где N размерность \( R_x \), а k - двоичный логарифм машинной точности, если не можете, то \( O(kN^3)\). -
Спасибо большое, xvr и _pv за советы! Клево, что Station/AP-coexistence mode - да, это может многое решить! Про синезуб - да, там понятно, что все очень не весело, просто я думал, что для совсем простой функции - передача пароля и ИПшника браузера есть что-то совсем стандартное, но, раз нет, то и ну его, Station/AP-coexistence mode должно все решить.
-
Спасибо большое, mantech и _pv за советы! я не пользовал долгосрочно их, но пока не висло. Спасибо большое, что про это сказали, учту! да, верно! Я именно из-за этого думал, что через блютуз как-то эту информацию и все явки-пароли протаскивать. Раздавать свою сетку, ИМХО, очень не удобно. Сматрфон одновременно может подсоединиться только к одной сетке, и, если мой аппарат будет раздавать свою сетку, то в нем, очевидно не будет интернета, а без интернета пользователь сейчас жить не может. У меня самого есть два таких аппарата - соляр-система, и какая-то детская леталка - ужасно не удобно - ведь если ты от интернета себя отключил, у тебя уже и вотсап не работает, и еще куча всего, то есть ты можешь залезть в сетку на несколько минут, чтобы настройки поправить, но долговременно пользовать сеткой без интернета будет очень не удобно. В моем случае все еще усугубляется тем, что я планирую, если все пойдет хорошо, чтобы мой веб интерфейс с разрешения пользователя мог бы послать какие-то данные на наш сервер для дальнейшей, возможно подписочной, обработке.
-
Спасибо большое, _pv за ответ! Тогда мне нужна будет кнопка сброса настроек. Грубо говоря, после первого подключения юзер ввел пароль и этот пароль теперь у меня будет храниться внутри аппарата и, по идее, если связь плохая, мне надо просто пытаться реконнектиться, а не выбрасывать снова свою сетку. Может я конечно дую на воду, но если это - действительно стандарт - то буду так делать.
-
Добрый день, у меня есть простое переносное устройство с WiFi+Bluetooth на основе esp32. В корпусе устройства не будет ни дисплея, ни кнопок - только выключатель питания и зарядка по USB с наглухо вмонтированной батарейкой. Сам аппарат должен будет общяться со внешним устройством смартфоном/планшетом/лаптопом через веб интерфейс. У меня возникает не понимание как я дам esp32 название WiFi сетки и ее пароль, чтобы потом esp32 получило свой динамический адрес, а пользователь на внешнем устройстве смог бы быстро понять куда кликаться. Я предполагаю, что как раз именно для этого я должен попользовать Bluetooth но не смог из гугла понять как это принято делать. То есть как я понимаю, мне надо по Bluetooth передать с внешнего устройства на esp32 имя и пароль беспроводной сетки, а назад юзер должен получить IP адрес куда ему надо пойти. Не через com port же он ручками это будет делать, наверное есть какой-то удобный общепринятый способ, подскажите, пожалуйста! Спасибо!
-
Спасибо! Да, за пару часов, как Вы об этом написали, я это тоже увидел. Да, кордик у меня пользуется, правда самописный. Надеюсь, что аппаратно реализованный будет быстрее. Спасибо! Да, такие платы свои есть, но все они - АЦП + плиска с кучей заморочек, поэтому оно все или не быстро запускаемое, или не переносное, а надо чтоб легкой была и потребляла почти ничего. Короче пока tms уже есть, NUCLEO придет в среду, и, думаю, что гипотезу я смогу на днях проверить.
-
Спасибо большое, adnega за советы! да, она у меня уже есть, после минуты сборки со всего трафика данных (а это 200КС/с * 24 * 60 * 2 байта = 1ГБайт) получается несколько КБайт корреляционных коэффициентов, которые можно хоть компортом наружу передать. Я уже эту математику отладил на teensy 4.1 и esp32 на вымышленных данных, но если на teensy 4.1 по DMA можно оцифровывать только два канала, пусть даже с 2.5МГц, то на esp32 - в интернетах пишут, что де на каждом АЦП можно по-честному перебирать все входы и их там по 10 на 1МС/с, и два оцифровщика. Хоть и пишут, что это можно, но сам пока я это еще не запустил - то есть демки какие-то запускаются, а вот оцифровать то, что надо - еще не получается, поэтому возник вопрос попробовать на чем-то, что содержало бы эти оцифровщики прямо на борту МК. Пока пришла олимесковская борда с tms320 и планирую по вашему совету прикупить NUCLEO-G474RE, но, просто с tms320 и stm32 до этого ни разу не работал, и поэтому в эту сторону еще не смотрел.
-
Спасибо большое adnega за совет! Верно, полностью с Вами соглашусь! В моем случае мне надо без относительно скорости АЦПшек около 60-100МФлопс на одинарной точности. Обычно это есть у всех или почти у всех. С NUCLEO-G474RE - прикольно - да, тут можно и оверсемплинг при необходимости сделать для повышения точности, хотя при сигнале в 50КГц оцифровывать его на 800КГц - особо оверсамплинком и не побарствуешь. С NUCLEO-G474RE - тоже идея. На всякий случай решил ее тоже заказать, что если на олимексе не смогу быстро проверить то, что хочу. у меня какой-то от олимекса прошивальщик был для tms-ов, я им какой-то демо пример прошил, хотя пока еще не смог понять все прелести этого процессора. Короче на крайняк - у меня есть в загашнике софт для esp32 на DIG ADC, и, как я понимаю, хоть и в доке на esp32-s3 пишут, что только 100кС/с на канал, но через DIG ADC там все честные 1х2 МС/с будет и мне должно совсем в притык, но хватить, а в esp32 всяко на плавающей арифметике при любом раскладе я свои 100МФлопс получу (до 450+МФлопс я уже на ней получал).
-
спасибо большое, _pv! С олимексовской девбордой это решение самым простым кажется, по крайней мере я что-то да смог тут уже сегодня запустить.
-
Спасибо большое, jcxz, что доходчиво объяснили возможности этого камня! Да, XMC4800 - как оказалось, довольно продвинутый процессор, хотя мануалы как-то не сильно располагают к быстрому освоению, но буду пробовать, наверное проходимо.
-
Круто, спасибо! Мне собственно именно эта информация и нужна была! Если XMC4700 или XMC4800 внутри DMA сам может мультиплексить сигналы - это именно то, что я хочу.
-
Спасибо большое всем за дельные советы! Да, я готов делать так, что "входы поочерёдно к АЦП подключаться будут", но чтобы это можно было бы сделать во время DMA - то есть если у МК есть два АЦП и каждый по 2.5МС/с, то если на каждый можно навесить 12 замультиплексиных ножек и одним DMA на каждый АЦП зачитать скажем, 12*128 семплов, то это будет как раз то, что надо. В тех МК, на которых я уже программировал (esp32, nxp 1062) хоть и мультиплексоры каналов есть, на DMA можно выбрать только один канал.
-
Добрый день, надо быстро проверить гипотезу, по которой надо одновременно оцифровывать 8, может 16, а может и 24 канала одновременно, и на каждом канале будет сигнал примерно 50кГц, то есть надо где-то 150-200КГц на канал. Хочется без бубнов это все в DMA. Я такое умею только через внешний оцифровщик + плиска, но тут и с разводкой проваландаюсь, и программированием. Хочется простой МК, и чтоб с первого раза все поехало. Вроде требования не запредельные. На тех МК, что умею, есть или только двухканальный DMA, без права одновременного семплинга с больше двух каналов (teensy 4.1), или только все ручками. Мне важен DMA, так как я хочу потом эти данные сразу друг с другом коррелировать и сохранять только корреляционные коэффициенты. Скажите, пожалуйста, стоит ли на каком-то STM32 пробовать, или PIC32, или еще на чем-то? Целевая функция - потратить минимум времени на разработку платы и программирование сбора этих данных. Спасибо!
-
Во-первых, всех с наступившим Новым Годом и пусть он будет луше предыдущих! Позвольте, пожалуйста, продолжить тему. Пришли на днях ИК лазерные диоды на 808нм / 200миливатт и 980нм / 50миливатт в TO56 корпусе. Я думал, что смогу посветить этим диодом на эту пластинку, и получить сеточку, но не тут-то было. Лазер он хоть и монохроматический получается, но светит с поверхности соприкосновения двух материалов самого диода и от него свет рассеивается как-бы широкой линией. Под рукой какая-то линза была, но то ли навесным я не смог все зафиксировать, то ли тут что-то надо делать более глобально, но сетку в ИК диапазоне я таки не смог получить, хоть даже и пытался поставить всякие волноводы от лазера до диффракциоонной решетки. Вопросов два, цель - одна - мне нужна сетка со структурированным светом в ИК (любом из 800-1000нм). Скажите, пожалуйста, 1. стоит ли пытаться прециционно линзами сфокусировать луч ИК лазерного диода и ставить далее эту дифракционну решетку, или мне все-таки нужен какой-то когерентный источник ИК? 2. есть ли еще како-то разумно бюджетный способ получения какого-то простго (желательно сеточного) паттерна в ИК? Спасибо! PS: таки смог прецизионно большим объективом сфокусироваться и перенаправить получаемый луч в дифракционную решетку с голограммой, кое-каое изображение получилось и понятно, как решать первый пункт. Второй вопрос так и остался, ибо решение по первому пункту получается довольно колхозным.
-
Супер, спасибо большое, xvr! Да, полностью с Вами согласен! Меня, кстати очень удивляет, почему этот алгоритм называют кордиком, ведь реально он использует только тот факт, что синус и косинус суммы углов можно легко представить как сумму произведений синусов и косинусов исходных углов.
-
Огромное спасибо за советы! Формально - да, только две инстанции, но я-то хотел туда же еще добавить свои типы, которых у меня суммарно 6. Пока сделал как ниже, что порешило мой пункт 3, в ассемблере теперь видно, что синус и косинус вызываются один раз и есть предвычисленные константы. Но вот с первыми моими двумя пунктами пока еще не придумал как сделать. #include <stdio.h> #include <stdlib.h> #include <math.h> #include <array> template<typename T>constexpr auto generate() { const int BL = ((sizeof(T)==4))?24:53; std::array<std::array<T, BL>, 2> res{}; T a=0.5; for(int i=0; i<BL; i++) { res[0][i]=sin(a); res[1][i]=cos(a); a*=0.5; // a/=2.; } return res; } template<typename T> void CalcSinCos(T a, T &s, T &c) // a должно быть больше 0 и меньше 1 { const int BL = ((sizeof(T)==4))?24:53; long long IntA; if constexpr (sizeof(T)==4) IntA=(int)(a*(1024.*1024*16.)); else IntA=(long long)(a*(1024.*1024.*1024.*1024.*1024.*8.)); constexpr auto BinarySinCos = generate<T>(); s=0.; c=1.; for(int i=0; i<BL; i++) if((IntA&(1<<(BL-1-i)))!=0) { // s, c на данный момент - это sin(a), cos(a), а BinarySin[i] и BinaryCos[i] - это sin(b), cos(b) // результат sin(a+b) и cos(a+b) нам надо снова получить в s, c T temp_s = s*BinarySinCos[1][i] + c*BinarySinCos[0][i]; // sin(a+b) = sin(a)*cos(b) + sin(b)*cos(a) T temp_c = c*BinarySinCos[1][i] - s*BinarySinCos[0][i]; // cos(a+b) = cos(a)*cos(b) - sin(a)*sin(b) s = temp_s; c = temp_c; } return; } int main() { for(int i=0; i<20; i++) { float a = ((float)rand()) / (float)RAND_MAX; float s, c; CalcSinCos(a, s, c); printf("a=%g, s=%g (%g), c=%g (%g)\n", a, s, sin(a), c, cos(a)); } return 0; } Спасибо! Это понятно, что Чебышевым получается обычно не плохо. Другое дело, что кордик по основанию 16 или 256 (не по основанию 2, как у меня в примере) с Тейлором для маленьких составных кордика реально в 2-3 раза быстрее, чем стандартный вызов системной sincosf. А на некоторых МК ой как плохо в стандартных библиотеках все реализовано, что кордик даже по основанию 2 начинает обыгрывать системные функции. А у меня еще есть float-float тип, для которого стандартных синусов-то и нет.
-
constexpr C++ - как инициализировать массив внутри template
iiv опубликовал тема в Программирование
Добрый день и с наступающим Вас Новым Годом! У меня есть template (кордик синус и косинус), который в зависимости от того float это или double должен считать соответсвующие пары синусов и косинусов. Для этого мне надо в зависимости от того float это или double правильно проинициализировать целочисленную переменную BL, сделать int IntA или long long IntA и вычислить ее, предварительно заполнить BinarySin, BinaryCos предвычисленными числами. Я как-то это на С++ запрограммировал, но не все мне нравиться, а именно Пункт: хочется реально сравнивать только на float и double и в остальных случаях давать ошибку, Пункт: я все привел к типу long long, и не понимаю как сделать int для float, и long long для double, Пункт: я хочу чтобы инициализация этих массивов происходила на стадии компиляции, а сейчас у меня это происходит в runtime. Пожалуйста, посоветуйте, что и как тут изменить, чтобы это все исправить! Спасибо! Код тут: #include <stdio.h> #include <stdlib.h> #include <math.h> template<typename T> void CalcSinCos(T a, T &s, T &c) // a должно быть больше 0. и меньше 1. { const int BL = ((sizeof(T)==4))?24:53; long long IntA; if constexpr (sizeof(T)==4) IntA=(int)(a*(1024.*1024*16.)); else IntA=(long long)(a*(1024.*1024.*1024.*1024.*1024.*8.)); static T BinarySin[BL]; static T BinaryCos[BL]; static int NotYetInizialized=0; if(NotYetInizialized==0) { NotYetInizialized=1; float a=0.5; for(int i=0; i<BL; i++) { BinarySin[i]=sin(a); BinaryCos[i]=cos(a); a*=0.5; // a/=2.; } } s=0.; c=1.; for(int i=0; i<BL; i++) if((IntA&(1<<(BL-1-i)))!=0) { // s, c на данный момент - это sin(a), cos(a), а BinarySin[i] и BinaryCos[i] - это sin(b), cos(b) // результат sin(a+b) и cos(a+b) нам надо снова получить в s, c T temp_s = s*BinaryCos[i] + BinarySin[i]*c; // sin(a+b) = sin(a)*cos(b) + sin(b)*cos(a) T temp_c = c*BinaryCos[i] - s*BinarySin[i]; // cos(a+b) = cos(a)*cos(b) - sin(a)*sin(b) s = temp_s; c = temp_c; } return; } int main() { for(int i=0; i<20; i++) { float a = ((float)rand()) / (float)RAND_MAX; float s, c; CalcSinCos(a, s, c); printf("a=%g, s=%g (%g), c=%g (%g)\n", a, s, sin(a), c, cos(a)); } return 0; }