Привет! Продолжаем... Приехала апельсинка (orange pi 3 lts). Налепил на нее радиаторов, установил на MicroSD образ убунты. Взлетело! Прикрутил OpenCPN, подкинул морские карты, настроил GPS/GLONASS. Собрал из исходников rtl-ais (идентификация судов)... тест соединения проходит. Завтра натурные испытания на побережье сделаю. Может успею и прием погодных факсов настроить через свисток SDR
Ну, яхты у меня нету, я не родственник Абрамовича, поэтому оценить затею не могу А касательно жипиэс-трекера, я когда-то "для побаловаться" делал на базе отладочной платы STM32F746G-Disco.
Ну, яхты у меня нету, я не родственник Абрамовича...
Миром правят стереотипы Для того чтобы иметь яхту не нужно быть олигархом. Можно уложиться в бюджет подержанного авто. Например Maxi 77 в удовлетворительном состоянии можно найти по цене до 600 килорублей. В такой же бюджет ляжет и самостоятельная постройка... Правда это долго и не всем по плечу.
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}; int32_t aSTAvg[3] = {0}, gSTAvg[3] = {0}; float factoryTrim[6]; uint8_t FS = 0; float self_test_result[6] {0.f};
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; aAvg[ii] <<= 24; aAvg[ii] >>= 24; // Не хватало сдвига туда-сюда чтобы получить LSB gAvg[ii] /= 200; gAvg[ii] <<= 24; gAvg[ii] >>= 24; }
// 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; aSTAvg[ii] <<= 24; aSTAvg[ii] >>= 24; // Не хватало сдвига туда-сюда чтобы получить LSB gSTAvg[ii] /= 200; gSTAvg[ii] <<= 24; gSTAvg[ii] >>= 24; }
// 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
// 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]; // Report percent differences self_test_result[i + 3] = 100.0 * ((float)(gSTAvg[i] - gAvg[i])) / factoryTrim[i + 3]; // 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; }
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Добрый вечер! За все лето ни разу не брал паяло в руки и не открывал Arduino IDE.
Купить подержанную лодку мне не удалось... по понятным причинам, поэтому, чтобы иметь точку приложения к своим идеям по технояхтингу - решил построить. Так что все лето занимался судостроением. Вот что из этого вышло:
Строим вот это Длина 6.5, щирина 2.5, осадка будет 1.10 В разрезе Пока выглядит так Сегодня монтировал килевую балку
Еще две недели будет сносная погода. Затем стройку консервирую до следующей весны и займусь электроникой
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Всем привет! Разобрался с QMC5883L. Этот магнетометр весьма не плох, не смотря что стоит сущие копейки. Показания стабильны после 5 минутного прогрева. Точность показаний зависит от начальной калибровки. Подключал датчик к NodeMCU. Прошивку писал на MicroPython. После женитьбы магнетометра с акселерометром MPU-6500, код портирую на C. На питоне быстрее экспериментировать Спойлер
Код:
from machine import I2C,Pin import utime import sys import math
# qmc temperature data register qmc_temp_lsb = 0x07 qmc_temp_msb = 0x08
# qmc control register 1 qmc_cntrl_1 = 0x09
# qmc control register 2 qmc_cntrl_2 = 0x0A
# qmc SET/RESET Period register qmc_period = 0x0B
# qmc Chip ID register qmc_chip_id = 0x0D
# Проверка соединения с датчиком if not (i2c.readfrom_mem(qmc_adrs,qmc_chip_id,1)==bytes([0xFF])): print("qmc is abcent!") sys.exit()
# Процедура слияния байтов в 16 разрядное слово def combine_register_values(h, l): if not h[0] & 0x80: return h[0] << 8 | l[0] return ((((h[0] ^ 0xFF) << 8) | (l[0] ^ 0xFF)) + 1)*(-1)
# Чтение x,y,z данных из регистров def get_raw(): data = { 'x':combine_register_values(i2c.readfrom_mem(qmc_adrs,qmc_x_msb,1),i2c.readfrom_mem(qmc_adrs,qmc_x_lsb,1)), 'y':combine_register_values(i2c.readfrom_mem(qmc_adrs,qmc_y_msb,1),i2c.readfrom_mem(qmc_adrs,qmc_y_lsb,1)), 'z':combine_register_values(i2c.readfrom_mem(qmc_adrs,qmc_z_msb,1),i2c.readfrom_mem(qmc_adrs,qmc_z_lsb,1)) } return data
while True: data = get_qmc_data() queue.append(data) if len(queue) > 64:queue.pop(0) # Глубина конвеера 64 x = 0; y = 0; z = 0 for val in queue: x += val['x']; y += val['y']; z += val['z'] x = x / len(queue); y = y / len(queue); z = z / len(queue) # Средние значения по всем осям azimuth = math.atan2(y,x)*180.0/math.pi # Вычисление азимута if azimuth < 0: azimuth = 360+azimuth print(round(azimuth)) utime.sleep_ms(50)
Добрый вечер! Победил я датчик пространственной ориентации применительно к лодке. Вот код на питоне, кому интересно Спойлер
Код:
# Китайский клон на RP2040 с 16 Mb на борту # Версия MicroPython v1.19.1;Pimoroni Pico LiPo 16MB with RP2040 # В алгоритме компенсации гироскоп не задействован
# mpu Chip ID register mpu_chip_id = 0x75 # Должен быть ответ - 0x70
# Переменные для вычислений depth = 64 # Глубина конвеера фильтра НЧ queue_accel = [] # Конвеер для акселерометра queue_mag = [] # Конвеер для магнитометра queue_gyro = [] # Конвеер для гироскопа # Из даташита accel_scale = 4096.0 gyro_scale = 65.5 mag_scale = 3000
# Проверка соединения с датчиком if not (i2c.readfrom_mem(qmc_adrs,qmc_chip_id,1)==bytes([0xFF])): raise RuntimeError("qmc not found.") if not (i2c.readfrom_mem(mpu_adrs,mpu_chip_id,1)==bytes([0x70])): raise RuntimeError("mpu not found.")
# Процедура слияния байтов в 16 разрядное слово def combine_register_values(h, l): if not h[0] & 0x80: return h[0] << 8 | l[0] return ((((h[0] ^ 0xFF) << 8) | (l[0] ^ 0xFF)) + 1)*(-1)
# Чтение x,y,z данных из регистров матнитометра def get_raw_qmc(): data = { 'x':combine_register_values(i2c.readfrom_mem(qmc_adrs,qmc_x_msb,1),i2c.readfrom_mem(qmc_adrs,qmc_x_lsb,1)), 'y':combine_register_values(i2c.readfrom_mem(qmc_adrs,qmc_y_msb,1),i2c.readfrom_mem(qmc_adrs,qmc_y_lsb,1)), 'z':combine_register_values(i2c.readfrom_mem(qmc_adrs,qmc_z_msb,1),i2c.readfrom_mem(qmc_adrs,qmc_z_lsb,1)) } queue_mag.append(data) if len(queue_mag) > depth: queue_mag.pop(0) x = 0; y = 0; z = 0 for val in queue_mag: x += val['x']; y += val['y']; z += val['z'] x = x / len(queue_mag); y = y / len(queue_mag); z = z / len(queue_mag) return {'x':x,'y':y,'z':z}
# Чтение x,y,z данных из регистров MPU def get_gyro_raw(): data = { 'x':combine_register_values(i2c.readfrom_mem(mpu_adrs,gyro_x_msb,1),i2c.readfrom_mem(mpu_adrs,gyro_x_lsb,1)), 'y':combine_register_values(i2c.readfrom_mem(mpu_adrs,gyro_y_msb,1),i2c.readfrom_mem(mpu_adrs,gyro_y_lsb,1)), 'z':combine_register_values(i2c.readfrom_mem(mpu_adrs,gyro_z_msb,1),i2c.readfrom_mem(mpu_adrs,gyro_z_lsb,1)) } queue_gyro.append(data) if len(queue_gyro) > depth: queue_gyro.pop(0) x = 0; y = 0; z = 0 for val in queue_gyro: x += val['x']; y += val['y']; z += val['z'] x = x / len(queue_gyro); y = y / len(queue_gyro); z = z / len(queue_gyro) return {'x':x,'y':y,'z':z}
def get_accel_raw(): data = { 'x':combine_register_values(i2c.readfrom_mem(mpu_adrs,accel_x_msb,1),i2c.readfrom_mem(mpu_adrs,accel_x_lsb,1)), 'y':combine_register_values(i2c.readfrom_mem(mpu_adrs,accel_y_msb,1),i2c.readfrom_mem(mpu_adrs,accel_y_lsb,1)), 'z':combine_register_values(i2c.readfrom_mem(mpu_adrs,accel_z_msb,1),i2c.readfrom_mem(mpu_adrs,accel_z_lsb,1)) } queue_accel.append(data) if len(queue_accel) > depth: queue_accel.pop(0) x = 0; y = 0; z = 0 for val in queue_accel: x += val['x']; y += val['y']; z += val['z'] x = x / len(queue_accel); y = y / len(queue_accel); z = z / len(queue_accel) return {'x':x,'y':y,'z':z}
# Поправки определить на абсолютно ровном столе к горизонту pitch_err = 5 roll_err = 8
while True: accel = get_accel() r = math.sqrt(accel['x']*accel['x']+accel['y']*accel['y']+accel['z']*accel['z']) # Вектор пространственной ориентации # Получаем крен/тангаж в градусах и суммируем с поправкой pitch = 180/math.pi*math.asin(accel['x']/r)+pitch_err roll = 180/math.pi*(-1)*math.asin((-1)*accel['y']/r)+roll_err # Обратно в радианы с учетом поправок pitch_rad = math.pi/180*pitch roll_rad = math.pi/180*roll # Расчет влияния крена/тангажа на показания магнитометра mag = get_qmc_data() cx = mag['x']*math.cos(pitch_rad) + (-1)*mag['y']*math.sin(roll_rad)*math.sin(pitch_rad) - mag['z']*math.cos(roll_rad)*math.sin(pitch_rad) cy = (-1)*mag['y']*math.cos(roll_rad) + mag['z']*math.sin(roll_rad) az_rad = 180/math.pi * math.atan2(cy,cx) azimuth = round(((-1)*az_rad+360) % 360) print(azimuth, round(pitch), round(roll))
Ориентация датчиков такая
Осталось на С портировать и затолкать это все в lgt8f328p - а..ля ардуино микро Заталкивать будем сюда Есть еще идея заморочиться с миниатюрным гравитационным подвесом и поместить туда магнитометр. Тогда компенсация не нужна будет. Но возникнет геморрой с токосъемниками. В общем ... на будущее
Вложения:
Комментарий к файлу: Источник вдохновения YMFC-32_document_1.pdf [85.9 KiB]
Скачиваний: 49
Всем привет! Дочитался я как в компенсацию наклонов подмешать данные гироскопа. Вроде работает. Предстоит все это на стенде испытать. Теперь код выглядит так: Спойлер
Код:
# Китайский клон на RP2040 с 16 Mb на борту # Версия MicroPython v1.19.1;Pimoroni Pico LiPo 16MB with RP2040
# Проверка соединения с датчиком if not (i2c.readfrom_mem(qmc_adrs,qmc_chip_id,1)==bytes([0xFF])): raise RuntimeError("qmc not found.") if not (i2c.readfrom_mem(mpu_adrs,mpu_chip_id,1)==bytes([0x70])): raise RuntimeError("mpu not found.")
# Процедура слияния байтов в 16 разрядное слово def combine_register_values(h, l): if not h[0] & 0x80: return h[0] << 8 | l[0] return ((((h[0] ^ 0xFF) << 8) | (l[0] ^ 0xFF)) + 1)*(-1)
# Чтение x,y,z данных из регистров матнитометра def get_raw_qmc(): data = { 'x':combine_register_values(i2c.readfrom_mem(qmc_adrs,qmc_x_msb,1),i2c.readfrom_mem(qmc_adrs,qmc_x_lsb,1)), 'y':combine_register_values(i2c.readfrom_mem(qmc_adrs,qmc_y_msb,1),i2c.readfrom_mem(qmc_adrs,qmc_y_lsb,1)), 'z':combine_register_values(i2c.readfrom_mem(qmc_adrs,qmc_z_msb,1),i2c.readfrom_mem(qmc_adrs,qmc_z_lsb,1)) } queue_mag.append(data) if len(queue_mag) > depth: queue_mag.pop(0) x = 0; y = 0; z = 0 for val in queue_mag: x += val['x']; y += val['y']; z += val['z'] x = x / len(queue_mag); y = y / len(queue_mag); z = z / len(queue_mag) return {'x':x,'y':y,'z':z}
# Чтение x,y,z данных из регистров MPU def get_gyro_raw(): data = { 'x':combine_register_values(i2c.readfrom_mem(mpu_adrs,gyro_x_msb,1),i2c.readfrom_mem(mpu_adrs,gyro_x_lsb,1)), 'y':combine_register_values(i2c.readfrom_mem(mpu_adrs,gyro_y_msb,1),i2c.readfrom_mem(mpu_adrs,gyro_y_lsb,1)), 'z':combine_register_values(i2c.readfrom_mem(mpu_adrs,gyro_z_msb,1),i2c.readfrom_mem(mpu_adrs,gyro_z_lsb,1)) } queue_gyro.append(data) if len(queue_gyro) > depth: queue_gyro.pop(0) x = 0; y = 0; z = 0 for val in queue_gyro: x += val['x']; y += val['y']; z += val['z'] x = x / len(queue_gyro); y = y / len(queue_gyro); z = z / len(queue_gyro) return {'x':x,'y':y,'z':z}
def get_accel_raw(): data = { 'x':combine_register_values(i2c.readfrom_mem(mpu_adrs,accel_x_msb,1),i2c.readfrom_mem(mpu_adrs,accel_x_lsb,1)), 'y':combine_register_values(i2c.readfrom_mem(mpu_adrs,accel_y_msb,1),i2c.readfrom_mem(mpu_adrs,accel_y_lsb,1)), 'z':combine_register_values(i2c.readfrom_mem(mpu_adrs,accel_z_msb,1),i2c.readfrom_mem(mpu_adrs,accel_z_lsb,1)) } queue_accel.append(data) if len(queue_accel) > depth: queue_accel.pop(0) x = 0; y = 0; z = 0 for val in queue_accel: x += val['x']; y += val['y']; z += val['z'] x = x / len(queue_accel); y = y / len(queue_accel); z = z / len(queue_accel) return {'x':x,'y':y,'z':z}
Лору не пробовали... Лора имеет дальнобойность только при низкой скорости передачи... десятки бит/с... сотни бит/с. а нам нужна высокая скорость передачи... тысячи бит/с... миллионы бит/с... для минимального времени отклика. при таких скоростях дальнобойность у Лоры маленькая))
int qmc_matrix[] = {-1637, 1508, -1541, 1427, -1421, 1401};
int accel_scale = 4096; int mag_scale = 3000; int queue_mag[DEPTH][3]; int queue_accel[DEPTH][3]; float accel_data[] = {0,0,0}; float qmc_data[] = {0,0,0}; unsigned int fld_data[3] = {0,0,0}; int pitch_err=2,roll_err=17; long lastTime;
Раздобыл проприетарный код для digital motion processing. Если будет время и необходимость вкручу сюда. И так хорошо работает При кренах +/- 15 градусов, магнитный курс плавает в пределах 2х градусов. Нормальный результат для датчика, тем более что он нужен не для навигации по компасу. А всего лишь удержать авторулевого на магнитном меридиане, пока лодка топчется на месте в слабый ветер и данные с GPS не дают точного направления движения.
Всем наблюдающим привет! Окончательная редакция магнитного указателя курса. С возможностью калибровки. Потребление 20mA Посмотрю как поведет себя в реальных условиях эксплуатации. Следующая реинкарнация будет с квартернионами, DMP, и с прочей эйлеровской херней.
Всем привет! Пока то да сё, замакетировал master-device. Задачи возлагаются на него следующие:
1 Опрос всех немыслимых навигационных и сервисных датчиков. 2 Обработка данных, запись на флеш исторических событий (log). 3 Функция автопилотирования и сигналов вахтенному экипажу 4 Охранная функция (GSM SIM800L)+LORA 5 Графический интерфейс 6 WEB сервер для доступа с телефона. 7 Еще не придумал....
В качестве процессора ESP32. Задачи буду распараллеливать, а это значит привет мьютексам, таскам и семафорам Надеюсь его производительности хватит.
Ночь прошла результативно Изучал устройство продвинутой библиотеки для ModBus RTU отсюда https://github.com/emelianov/modbus-esp8266 Не все понятно с их асинхронщиной, и нет пока уверенности что все правильно понял что понял (каламбурчик) Но датчики стабильно и корректно опрашиваются. Ошибок чтения нет Спойлер
Сейчас пока на фишки RTOS заморачиваться не буду. Потому что датчиков будет много, и не решил какие и с какой частотой нужно опрашивать. На Core1 по умолчанию пусть рутина молотит... а там посмотрим
или с помощью трояна украдёт все твои данные WEB сервер с телефона... (браузер сохраняет все логины... пароли... куки... ключи шифрования всех WEB серверов к котором подключается телефон).
поэтому никаких WEB серверов ! )) пишем своё приложение на телефоне... с использованием UDP... для защиты от любых сканеров)) UDP сервер ни один сканер не найдёт ! ))
и т.д. при этом приложение на телефоне НЕ сохраняет все логины... пароли... куки... ключи шифрования. всё это зашито в приложении... откуда достать это не так то и просто)) в отличии от браузера, который хранит это всё в телефоне, в отдельном файле, в открытом виде ! ))
-во первых он работает быстрей (10 мбит/c против ModBus 115200)... -во вторых PoE избавляет меня от протягивания лишних проводов... -в третьих более универсальная схема (не нужны переходники ModBus <> Ethernet, ModBus <> Wi-Fi и т.д.) и т.д.
Что то в море я не видел школьников с ноутами и с веслами наперевес. То, о чем ты говоришь, имеет место в обычной жизни обывателя. Но когда ты от берега отвалишь хотя бы на пару миль, жизнь начинает играть другими красками. WEB сервер, локального исполнения и без доступа к WAN. Я понимаю что можно для телефона написать приложение и использовать TCP сокеты. Но это все сложно и время-затратно. Поэтому пара тройка страниц HTML&CSS&JS в рамках веб сервера на esp32 - это быстро и дешево. Мощность wi-fi передатчика можно программно притушить, чтобы у ботанов от IT не возбуждать не здоровое любопытство когда на стоянке или близко к берегу. Да и когда стоишь это все обесточено кроме пожарной сигнализации.
По поводу ModBus. Это просто и надежно. Видеопоток мне гонять не нужно, а с задачами навигации и пилотирования скорости на шине и в 38400 за глаза хватит. Парусная лодка такого размера, как я строю, ходит не быстрее велосипеда. Т.е. 20 км/ч для нее недостижимый потолок. Это водоизмещающее плавание а не глиссирование. Хотя, тут коллеги меня уже почти переубедили пересесть на CAN шину. Потому что тогда можно будет наращивать аппаратное обеспечение и стандартным оборудованием Raymarine или B&G например. Некоторые поставщики морского оборудования уже тоже используют Ethernet в качестве шины. Но ассоциацией NMEA это еще не стандартизировано и не сертифицировано. Это называется OneNet. Кстати, кто то мне рассказывал что на наших современных субмаринах уже на всю катушку оптику юзают.
Мощность wi-fi передатчика можно программно притушить, чтобы у ботанов от IT не возбуждать не здоровое любопытство когда на стоянке или близко к берегу.
гуляют себе люди... с телефонами с Wi-Fi... а тут стоит лодка.. .с бесплатным Wi-Fi ! ))
roman.com, если сумеете взломать мой веб-сервер через вай-фай, дам шоколадку. Но вряд-ли. ,Потому что сниффер, трояны... у Вас богатый набор слов и совершенно отсутствует понимание процесса. И ещё: UDP сканируется.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения