Технояхтинг с Ардуино

Ардуинщики всех стран - объединяйтесь! В этом форуме, конечно.
Ответить
Мучитель микросхем
Аватара пользователя
Сообщения: 480
Зарегистрирован: Вт апр 23, 2013 22:21:18
Откуда: KUBAN, Krasnodar

Сообщение maxlab »

Привет!
Роман, спасибо за наводку на хабре. Буду следить за творчеством этого чела :)

Добавлено after 3 hours 25 minutes 52 seconds:
Запилил тестовый макет с возможностью переключить шину i2c магнитометра через MPU-6500
Есть желание пощупать DMP. Первый раз об этом слышу :)
Изображение
Примерная компоновка в коробочке КМ41212-01 (в Бауцентре покупал) примерно такая
Изображение
Девице - Device
Реклама
Друг Кота
Сообщения: 9242
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

зачем i2c... есть же нормальный быстрый SPI...
https://aliexpress.ru/item/100500309378 ... 76b52Yrnaz
spi.jpg
(7.67 КБ) 184 скачивания
2.jpg
(47.92 КБ) 173 скачивания
3.jpg
(45.64 КБ) 176 скачиваний
4.jpg
(33.51 КБ) 162 скачивания
...
Реклама
Мучитель микросхем
Аватара пользователя
Сообщения: 480
Зарегистрирован: Вт апр 23, 2013 22:21:18
Откуда: KUBAN, Krasnodar

Сообщение maxlab »

Долго ждать посылки... А так, что в закромах нашел тем и пользуюсь
Использовать платы с SPI смысла не вижу. Время для оцифровки данных акселерометра и гироскопа до 10ms,
а если задействовать DMP будет еще больше. Аппаратное прерывание не используется. Забор данных по таймеру сделаю.
И для автопилота дискретность получения этих данных в 0.5-1 сек будет выше крыши. Лодки под парусами быстро не ходят.
7-10 узлов это уже хорошо. Так что быстрые интерфейсы ни к чему :)
Девице - Device
Друг Кота
Сообщения: 9242
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

maxlab писал(а):Использовать платы с SPI смысла не вижу.
вопрос не в скорости... вопрос в унификации и стандартизации...
к примеру в нашем кораблике все модули подключены к центральному процессору по общей шине SPI
1.jpg
(83.8 КБ) 169 скачиваний
аналогично работает и ПК
2.jpg
(55.02 КБ) 175 скачиваний
у нас не просто игрушечный кораблик)) у нас платформа для отработки новых технологий...
Правда не все это поняли... ну и ладно))
:tea:
Реклама
Эиком - электронные компоненты и радиодетали
Мучитель микросхем
Аватара пользователя
Сообщения: 480
Зарегистрирован: Вт апр 23, 2013 22:21:18
Откуда: KUBAN, Krasnodar

Сообщение maxlab »

Я не возражаю :)
Здесь не много другая концепция...
Центральный процессор, он же мастер устройство, общается с различными модулями, датчиками и исполнительными
устройствами посредством ModBus. Все эти девайсы устанавливаются в разных местах, вплоть до топа мачты. Это не в одной коробке. А конкретная реализация конечных устройств истекает из элементной базы что под рукой. Как то так
Девице - Device
Реклама
Друг Кота
Сообщения: 9242
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

Остался последний вопрос - за что отвечает Центральный процессор, он же мастер устройство ?
:tea:

главный вопрос - распределение задач (точнее распределение вычислительных ресурсов).

вопрос - а потянет ли один Центральный процессор, он же мастер устройство ?

к примеру мы подключали к одному центральному процессору экранчики всякие...
4 экранчика OLED и/или LCD один процессор тянет спокойно...
4_экранчика.jpg
(122.24 КБ) 169 скачиваний
а вот экранчик TFT один процессор уже не тянет... точнее тянет но с низким fps...
Пришлось ставить отдельный процессор - видеокарту ))
видеокарта.jpg
(106.2 КБ) 170 скачиваний
потом решили сделать автопилот... но оказалось что один процессор не тянет и управление всеми устройствами и автопилот... пришлось ставить отдельный процессор на автопилот... ESP32
автопилот.jpg
(93.97 КБ) 180 скачиваний
поэтому надо всё хорошо продумать чтоб больше не повторять ошибок.
:tea:

а потом концепция изменилась))
и вместо отдельного процессора решили сделать всё управление на гаджете...
гаджет.jpg
(104.01 КБ) 185 скачиваний
в любом современном гаджете стоит мощный процессор с огромным запасом вычислительных ресурсов))
:tea:
Реклама
Мучитель микросхем
Аватара пользователя
Сообщения: 480
Зарегистрирован: Вт апр 23, 2013 22:21:18
Откуда: KUBAN, Krasnodar

Сообщение maxlab »

Ну так... я же выше писал что в качестве мастера нетбук (или промышленный/милитари ноут) буду использовать
Зачем велосипед изобретать.
А отвечает он за все...
Центральное ПО - OpenCPN
Вспомогательное ПО - Processing (он же Java)
Ну и самописные плагины... Автопилот заюзаю pyPilot. Там только с сопряжением повозиться надо
Смартфоны сейчас конечно продвинутые, но я им не доверяю :)
И еще, как вариант, малинка 4 с 8Гб на борту или Rock PI
Последний раз редактировалось maxlab Ср фев 09, 2022 17:08:49, всего редактировалось 1 раз.
Девице - Device
Друг Кота
Аватара пользователя
Сообщения: 4651
Зарегистрирован: Ср сен 30, 2020 16:51:47
Откуда: РФ

Сообщение electroget »

[uquote="AndyGU70",url="/forum/viewtopic.php?p=4116932#p4116932"]Virtuino[/uquote]

А Virtuino это для чего? Для разработки интерфейса?
Друг Кота
Сообщения: 9242
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

ну замечательно)) осталось нарисовать схему))
схема.jpg
(104.76 КБ) 194 скачивания
ну можно и так.
у нас тоже была такая мысль))
:tea:

только ноут имеет свойство иногда зависать)) это надо учитывать...
мы это решили очень просто - в случае если пульт (или ПК) не отвечает то в кораблике через секунду срабатывает таймер и кораблик останавливает - выключается двигатель, руль в переводится в среднее положение и кораблик сообщает нам о потери связи с пультом (или ПК) ярким миганием фонарей со звуковой сигнализацией))

надо ещё сделать удалённую перезагрузку ПК...
а в идеале надо сделать горячее резервирование - в случае отказа одного ПК всё управление переходит к резервному ПК...
:roll:
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32

Сообщение Martian »

Нет на яхте автопилотов, что вы как сухопутные крысы - авторулевой! :)

схема - офигенная. аж жуть.
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 480
Зарегистрирован: Вт апр 23, 2013 22:21:18
Откуда: KUBAN, Krasnodar

Сообщение maxlab »

Резервирование будет. Главный резерв это команда :) и традиционные способы навигации. Ну, или я... если в одно рыло ходить :)
Роман, а что за плата эхолота в Вашем проекте?
Девице - Device
Друг Кота
Сообщения: 9242
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

у нас кораблик разрабатывался для рыбалки...
эхолот простой... типа такого - https://aliexpress.ru/item/32672648100. ... 672a8c5fNw
Друг Кота
Сообщения: 19495
Зарегистрирован: Чт фев 20, 2014 18:57:55

Сообщение Morroc »

[uquote="roman.com",url="/forum/viewtopic.php?p=4177620#p4177620"]в случае отказа одного ПК всё управление переходит к резервному ПК...[/uquote]
что то сразу вспомнилось "а на этот случай у меня проездной" :))
"Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл /
"Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
Друг Кота
Сообщения: 9242
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

roman.com писал(а):горячее резервирование - в случае отказа одного ПК всё управление переходит к резервному ПК...
это стандартная система любого современного автопилота...

в самолёте 5 штук компьютеров дублирующих друг друга...
автопилот.jpg
(55.34 КБ) 173 скачивания
:tea:

Добавлено after 2 minutes 18 seconds:
а вместо ModBus мы разработали свой собственный протокол на AVR ))
PING_100кбит.jpg
(125.68 КБ) 182 скачивания
:tea:
Мучитель микросхем
Аватара пользователя
Сообщения: 480
Зарегистрирован: Вт апр 23, 2013 22:21:18
Откуда: KUBAN, Krasnodar

Сообщение maxlab »

Привет всем! В общем с IMU-6500 (аксель-гироскоп) какие то непонятки.
Изображение
Вроде пишут что отклонение между текущим замером в неподвижном состоянии и фабричным не должно превышать 14% по всем измерениям.
А у меня какая то фигня. Хотя, уже 3 часа наблюдаю за процедурой самотестирования, дает одни и те же результаты.
Апнота по selftest в сети не нашел. Может я что то делаю не так? Или забить на это??? Все равно в ручную калибровать буду

Добавлено after 5 minutes 8 seconds:
Процедура само-тестирования у практически всех поставщиков библиотек на ГитХабе примерно одинаковая
и выглядит так
Спойлер

Код: Выделить всё

// Accelerometer and gyroscope self test; check calibration wrt factory settings
bool self_test_impl()  // Should return percent deviation from factory trim values, +/- 14 or less deviation is a pass
    {
        uint8_t raw_data[6] = {0, 0, 0, 0, 0, 0};
        int32_t gAvg[3] = {0}, aAvg[3] = {0}, aSTAvg[3] = {0}, gSTAvg[3] = {0};
        float factoryTrim[6];
        uint8_t FS = 0;

        writeByte(MPU6500_ADDRESS, SMPLRT_DIV, 0x00);       // Set gyro sample rate to 1 kHz
        writeByte(MPU6500_ADDRESS, CONFIG, 0x02);       // Set gyro sample rate to 1 kHz and DLPF to 92 Hz
        writeByte(MPU6500_ADDRESS, GYRO_CONFIG, FS << 3);   // Set full scale range for the gyro to 250 dps
        writeByte(MPU6500_ADDRESS, ACCEL_CONFIG2, 0x02);    // Set accelerometer rate to 1 kHz and bandwidth to 92 Hz
        writeByte(MPU6500_ADDRESS, ACCEL_CONFIG, FS << 3);  // Set full scale range for the accelerometer to 2 g

        for (int ii = 0; ii < 200; ii++) {  // get average current values of gyro and acclerometer

            readBytes(MPU6500_ADDRESS, ACCEL_XOUT_H, 6, &raw_data[0]);          // Read the six raw data registers into data array
            aAvg[0] += (int16_t)(((int16_t)raw_data[0] << 8) | raw_data[1]);  // Turn the MSB and LSB into a signed 16-bit value
            aAvg[1] += (int16_t)(((int16_t)raw_data[2] << 8) | raw_data[3]);
            aAvg[2] += (int16_t)(((int16_t)raw_data[4] << 8) | raw_data[5]);

            readBytes(MPU6500_ADDRESS, GYRO_XOUT_H, 6, &raw_data[0]);           // Read the six raw data registers sequentially into data array
            gAvg[0] += (int16_t)(((int16_t)raw_data[0] << 8) | raw_data[1]);  // Turn the MSB and LSB into a signed 16-bit value
            gAvg[1] += (int16_t)(((int16_t)raw_data[2] << 8) | raw_data[3]);
            gAvg[2] += (int16_t)(((int16_t)raw_data[4] << 8) | raw_data[5]);
        }

        for (int ii = 0; ii < 3; ii++) {  // Get average of 200 values and store as average current readings
            aAvg[ii] /= 200;
            gAvg[ii] /= 200;
        }

        // Configure the accelerometer for self-test
        writeByte(MPU6500_ADDRESS, ACCEL_CONFIG, 0xE0);  // Enable self test on all three axes and set accelerometer range to +/- 2 g
        writeByte(MPU6500_ADDRESS, GYRO_CONFIG, 0xE0);   // Enable self test on all three axes and set gyro range to +/- 250 degrees/s
        delay(25);                                     // Delay a while to let the device stabilize

        for (int ii = 0; ii < 200; ii++) {  // get average self-test values of gyro and acclerometer

            readBytes(MPU6500_ADDRESS, ACCEL_XOUT_H, 6, &raw_data[0]);            // Read the six raw data registers into data array
            aSTAvg[0] += (int16_t)(((int16_t)raw_data[0] << 8) | raw_data[1]);  // Turn the MSB and LSB into a signed 16-bit value
            aSTAvg[1] += (int16_t)(((int16_t)raw_data[2] << 8) | raw_data[3]);
            aSTAvg[2] += (int16_t)(((int16_t)raw_data[4] << 8) | raw_data[5]);

            readBytes(MPU6500_ADDRESS, GYRO_XOUT_H, 6, &raw_data[0]);             // Read the six raw data registers sequentially into data array
            gSTAvg[0] += (int16_t)(((int16_t)raw_data[0] << 8) | raw_data[1]);  // Turn the MSB and LSB into a signed 16-bit value
            gSTAvg[1] += (int16_t)(((int16_t)raw_data[2] << 8) | raw_data[3]);
            gSTAvg[2] += (int16_t)(((int16_t)raw_data[4] << 8) | raw_data[5]);
        }

        for (int ii = 0; ii < 3; ii++) {  // Get average of 200 values and store as average self-test readings
            aSTAvg[ii] /= 200;
            gSTAvg[ii] /= 200;
        }

        // Configure the gyro and accelerometer for normal operation
        writeByte(MPU6500_ADDRESS, ACCEL_CONFIG, 0x00);
        writeByte(MPU6500_ADDRESS, GYRO_CONFIG, 0x00);
        delay(25);  // Delay a while to let the device stabilize

        // Retrieve accelerometer and gyro factory Self-Test Code from USR_Reg
        uint8_t self_test_data[6];
        self_test_data[0] = readByte(MPU6500_ADDRESS, SELF_TEST_X_ACCEL);  // X-axis accel self-test results
        self_test_data[1] = readByte(MPU6500_ADDRESS, SELF_TEST_Y_ACCEL);  // Y-axis accel self-test results
        self_test_data[2] = readByte(MPU6500_ADDRESS, SELF_TEST_Z_ACCEL);  // Z-axis accel self-test results
        self_test_data[3] = readByte(MPU6500_ADDRESS, SELF_TEST_X_GYRO);   // X-axis gyro self-test results
        self_test_data[4] = readByte(MPU6500_ADDRESS, SELF_TEST_Y_GYRO);   // Y-axis gyro self-test results
        self_test_data[5] = readByte(MPU6500_ADDRESS, SELF_TEST_Z_GYRO);   // Z-axis gyro self-test results

        // Retrieve factory self-test value from self-test code reads
        factoryTrim[0] = (float)(2620 / 1 << FS) * (pow(1.01, ((float)self_test_data[0] - 1.0)));  // FT[Xa] factory trim calculation
        factoryTrim[1] = (float)(2620 / 1 << FS) * (pow(1.01, ((float)self_test_data[1] - 1.0)));  // FT[Ya] factory trim calculation
        factoryTrim[2] = (float)(2620 / 1 << FS) * (pow(1.01, ((float)self_test_data[2] - 1.0)));  // FT[Za] factory trim calculation
        factoryTrim[3] = (float)(2620 / 1 << FS) * (pow(1.01, ((float)self_test_data[3] - 1.0)));  // FT[Xg] factory trim calculation
        factoryTrim[4] = (float)(2620 / 1 << FS) * (pow(1.01, ((float)self_test_data[4] - 1.0)));  // FT[Yg] factory trim calculation
        factoryTrim[5] = (float)(2620 / 1 << FS) * (pow(1.01, ((float)self_test_data[5] - 1.0)));  // FT[Zg] factory trim calculation

        // Report results as a ratio of (STR - FT)/FT; the change from Factory Trim of the Self-Test Response
        // To get percent, must multiply by 100
        for (int i = 0; i < 3; i++) {
            self_test_result[i] = 100.0 * ((float)(aSTAvg[i] - aAvg[i])) / factoryTrim[i] - 100.;          // Report percent differences
            self_test_result[i + 3] = 100.0 * ((float)(gSTAvg[i] - gAvg[i])) / factoryTrim[i + 3] - 100.;  // Report percent differences
        }

//            Serial.print("x-axis self test: acceleration trim within : ");
//            Serial.print(self_test_result[0], 1);
//            Serial.println("% of factory value");
//            Serial.print("y-axis self test: acceleration trim within : ");
//            Serial.print(self_test_result[1], 1);
//            Serial.println("% of factory value");
//            Serial.print("z-axis self test: acceleration trim within : ");
//            Serial.print(self_test_result[2], 1);
//            Serial.println("% of factory value");
//            Serial.print("x-axis self test: gyration trim within : ");
//            Serial.print(self_test_result[3], 1);
//            Serial.println("% of factory value");
//            Serial.print("y-axis self test: gyration trim within : ");
//            Serial.print(self_test_result[4], 1);
//            Serial.println("% of factory value");
//            Serial.print("z-axis self test: gyration trim within : ");
//            Serial.print(self_test_result[5], 1);
//            Serial.println("% of factory value");
 
        bool b = true;
        for (uint8_t i = 0; i < 6; ++i) {
            b &= fabs(self_test_result[i]) <= 14.f;
        }
        return b;
    }
Девице - Device
Друг Кота
Сообщения: 9242
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

а как мы комп подключать будем ?
схема.jpg
(104.76 КБ) 168 скачиваний
через COM что ли ? ))
Мучитель микросхем
Аватара пользователя
Сообщения: 480
Зарегистрирован: Вт апр 23, 2013 22:21:18
Откуда: KUBAN, Krasnodar

Сообщение maxlab »

Вариантов масса. Я использую такой конвертер
https://aliexpress.ru/item/400129246584 ... 5642843938
Нормально работает даже в цеховых условиях вблизи оборудования с повышенным уровнем помех.
Есть промышленные преобразователи RS485 во что угодно
Для лодки можно использовать дешевый эквивалент
https://aliexpress.ru/item/100500356162 ... 3d62Ub98h4
Девице - Device
Друг Кота
Сообщения: 9242
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

а я думал что будет яхта с автопилотом и IP камерой... управление с ПК и телефона по Wi-Fi и Ethernet...
Яхта.jpg
(152.46 КБ) 191 скачивание
:)
RS... устарело немного...
:?
Мучитель микросхем
Аватара пользователя
Сообщения: 480
Зарегистрирован: Вт апр 23, 2013 22:21:18
Откуда: KUBAN, Krasnodar

Сообщение maxlab »

Это вишенка на торте :) Когда основная инфраструктура будет готова, тогда можно будет подумать о дистанционном
управлении. Кроме того, эту инфраструктуру нужно будет обкатать в реальных условиях. Т.е. этот проект у меня как минимум
на год-полтора. А там видно будет...
Практическое применение этому на лодках есть. Например, стоит твоя красавица на муринге посреди бухты... А ты на берегу.
Вот, сбросить конец и подойти к удобному месту посадки людей используя пульт ДУ.
Правда, обратная процедура затруднительна... Это еще на лодку надо манипулятор типа Kuka прикрутить чтобы веревку от
муринга из воды подобрать и зафиксировать в стопоре :)
В качестве развлекухи https://www.youtube.com/watch?v=bAdqazixuRY
Девице - Device
Друг Кота
Сообщения: 9242
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

:music:
Яхта.jpg
(205.23 КБ) 177 скачиваний
до берега Wi-Fi не добьёт...
Надо GSM или LTE или простой радио модем...
модем.jpg
(34.82 КБ) 177 скачиваний
:)
Ответить

Вернуться в «Arduino»