Простой поисковый радио маячок.

Pavel_liev

Круг на ЖКИ рисуется отлично попиксельно без математики, указчик так же рисуется картинкой, на Си математика самое прожорливое что есть. Мои НМС5883 были какие-то бракованные, один вообще не завелся, а второй работал лишь в двух осях, зависая рандомно спустя несколько минут. Приехал LSM303(GY511), напоминает бутер, даже адреса компаса и акселерометра разные, но работает пока без зависаний и глюков.

Раньше компасы делать не приходилось, изучая тему в мануалах обычно приводят арктангенс X/Y компаса и поправку на акселерометр, где достают четверть круга и длину ребра треугольника наклона с углом от горизонта, получается математика вида арктангенс компаса умножить на поправку акселерометра. И все бы здорово но нужно до математики калибровать показания компаса и акселерометра, чтобы ноль был центром и оборот оси был кругом. Только в голове не уходит мысль что показания акселерометра по всех осях от минимума до максимума это куб состоящий из кучки значений мелких кубиков, и если записать таблицу значений этого пространственного куба в виде градусов, типа X/Y/Z такие-то это угол такой-то, то больше вроде ничего и не надо делать. Не надо считать арктангенс и косинус с ребром треугольника акселерометра и сам акселерометр ненужен, но надо как-то заполнить эти самые значения таблицы с константами углов, и так чтобы это не было куча строк кода. Но это лишь идея и что получится дальше неясно.

16 days later
Pavel_liev

Остановился на модуле LSM303DLHC, это сборка состоящая из дешевого магнитометра и акселерометра в одном чипе, регистры магнетометра идентичны НМС5883. Очень помог мануал “LSM303DLH compass app note”, и пример из гитхаба, на деле все оказалось не так сложно, по началу боялся шумности акселерометра без модуля гироскопа, но на деле там все нормально, получились показания компаса что не сильно уплывают, 7…20° при наклонах, что приемлемо.

Не обошлось без неудобств, как не старался а уговорить CubeIDE считать отрицательные двухбайтовые числа углов (int16_t) не получилось, кругом хочет видеть лишь нативные 32’битные int, а вот модуль компаса и мануалы на ардуинку под двухбайтовую математику, в результате пришлось разбивать круг на четвертя и считать математику в первой четверти(0…90°), после чего приводить к виду круга (0…360°). Библиотека математики atan2; cos; sin достаточно прожорлива, если заменить на выборку из массива 360° записей можно сэкономить кучу места, на меге8 так и поступал, но у нас же STM32, гулять так гулять.

8 months later
Polle

Помогите разобраться с модулем Lora: напишите поимер кода ( что нужно загрузить в передатчик и приемник чтобы передать несколько байт) , вы тут пишите как AlgorithmBuilder,- в этой среде было бы идеально

13 days later
Polle

непонятно в каком режиме работает SPI : 1. начальный уроветь на SCK, 2. данные отправляются с младшего или старшего бита, 3. CS -выбор чипа отправка по сколько байт?, 4. как подробно заполняется буфер FIFO ?

Polle

пост 1425, не получается управлять модулями Lora SX1276. может кто объяснит на примере что нужно загрузить в SX1276 чтобы он передал в эфир несколько байт. только язык СИ я не понимаю, а програмирую в AlgorithmBuilder

Vladimir_N

пост 1425 чистый AVR ассемблер - AlgorithmBuilder причем тут Си. По передаче spi, почитать даташит по модулю lora религия не позволяет? Пример программной реализации SPI есть в первом посте в том числе и на ассемблере. Нефиг лезть к аппаратной реализации SPI если не понимаешь как это работает, там дофига нюансов.

PS: СИ нужно знать, хотя бы на уровне Ардуино!

Polle

Спасибо за помощь, я так тоже могу.

Vladimir_N

Я не думаю, что Вам поможет простой ответ. Типа: SPI должен быть 2 раза по 8 бит, первый бит старший. Вначале адрес, затем данные. Это все есть в даташите модуля. Как это сделать в аппаратной реализацией SPI на ассемблере очень сильно зависит от контроллера, поэтому не знаю, и знать не желаю 😃 ( на СИ это сделать проще и надежней он аппаратно не зависимый) , для таких приложений как Ваше, на ассемблере проще реализовать это программно, там просто нужно дергать и читать выводы контроллера. Опять же есть пример в первом посте этой темы в архиве есть фаил .asm . Но без изучения даташитов и документации по протоколу SPI ничего нормально не получится.

Polle

вот мой неработующий код, если можете подскажите где ошибки

Vladimir_N

Блинский нафиг, все это напоминает старый анекдот про старого и молодого хакера. 😃 Ладно, еще раз повторяю внимательно читайте документацию! cdn-shop.adafruit.com/…/sx1276_77_78_79.pdf Страница 80, расписан и нарисован в картинках обмен по SPI. И что мы видим? SPI должен быть 2 раза по 8 бит, первый бит старший. Вначале адрес, затем данные. (Это я уже писал!). Начало и конец отсекаются сигналом NSS (CS) всего 2 байта!, а не десять. Обмен с регистрами идет по 16 бит, 2 байта адрес и данные. Дальше обратить внимание на старший бит адреса в каком состоянии он должен быть для записи в регистр и в каком для чтения из него? Его нужно устанавливать или снимать принудительно пред отправкой адреса иначе ничего не получится. Для начала научитесь читать регистры модуля, например, регистр с адресом 0x42-RegVersion если научитесь нормально читать его значение, то дальше будет проще.

PS: У разных модулей Lora обмен spi может быть разный нужно читать документацию по конкретному типу.

Polle

Передатчик заработал, сигнал виден на SDR приёмнике, приём пока не делал. вот код:

Polle

И с аппаратным SPI передача работает. Проблема была в загрузке данных в буфер FIFO надо грузить по байтно,- адрес FIFO и байт данных и так пока не загрузишь все данные. Вот код:

Vladimir_N

Это все конечно хорошо, но нафига столько подпрограмм? В результате получается не читаемый код с кучей одинаковых подпрограмм и множеством ошибок. Нужно всего лишь две подпрограммы чтения и записи и вызывать их по мере необходимости, зачем городить весь этот огород с кучей одинаковых подпрограмм. FIFO буфер это один регистр( один адрес) и с ним можно работать и в пакетном режиме.

Polle

Оптимизацией кода займусь позже, помогите с приёмом данных

Polle

Сегодня заработал приём на модулях SX1778. Вот пример кода приёмника:

включаются 4 ре светодиода в любой последовательности, а на передатчике 4 ре кнопки каждая для своего светодиода на приёмнике, один раз нажал включится, второй выключится. Вот код передатчика, кроме кнопок,- там меняется регистор rb в подпрограмме FIFO

Polle

Получается не плохая поисковая система на базе модулей лора и мк ATMega8, к сведенью: микроконтроллер ATMega8 весит 0,15 гр. , а Tiny85?- 0.12 гр. поэтому не вижусмысла экономить. Я уже частично испытал систему: поисковое устройство посылает запрос на маяк, а маяк присылает коордитаты своего положения, а также напряжение своего аккумулятора. В радиомаяке применён GPS модуль ATGM336H, он показал лучшие результаты,- в помещении в пасмурную погоду ловит 7 спутников. Пока всё на макетках, в выходные собираюсь собрать маяк уже на печатной плате. В маяке будит установлен маленький активный зуммер который просто необходим для ближнего поиска небольших аппаратов, сам столкнулся как это необходимо.

Polle

Собрал GPS-маяк уже на печатной плате 31Х30 мм

вес получился 11,08 г без баттареи.

Polle

Маяк уже в корпусе: 35х36х20 и весит с аккумулятором 240 ма\ч 25,5г. Буду собирать пульт с олед дисплеем.

Polle

Готова и проверена в работе плата пульта для запроса координат с маяка, размеры 46мм на 36мм. Начинаю делать корпус, а потом на испытания.

Polle

вот готов и корпус для пульта, полный вес 48,7 грамма