Создание собственной системы стабилизации
Ну вот к примеру - пусть таже наза, как известно спускается она с трудом, имеем разбежку высот старта и посадки ну метров 15-20, ветер - что мы видим аппарат спустился до высоты точки старта - из-за ветра скорость спуска =0 - о да мы сели!!! и с 20 метров в асфальт, или что там под аппаратом…
Не, замеряется наверно именно скорость снижения, т.е. текущая дельта по барометру, а не разность давлений взлет/посадка.
Не, замеряется наверно именно скорость снижения, т.е. текущая дельта по барометру, а не разность давлений взлет/посадка.
Как там делается я не знаю, но при старте надо бы засекать высоту места, только вот теоретически за время полёта может измениться давление и дрейф ГПС и баро. Посему нужно снижаться до тех пор, пока интегральная составляющая вертикального ПИД не уйдёт существенно в минус, т.е. упёрлись в планету.
Я раньше видео выкладывал - не мог посадить из-за бокового ветра, газ практически в 0 а аппарат висит на одной высоте, пока крен против ветра не дал - тогда только ветром и прижало к земле…
Есть у кого опыт работы с USART по передаче данных с чипа на чип ?
Похоже у меня скорости не совпадают, с контроллера полета на OSD еще более-менее, а с GPS на контроллер оч. плохо…
Делал то же самое (с тем же GPS) на AVRe, вроде стабильно было, скорость минимум -> 9600, провод 25 см. всего…
Видимо STM по капризней…
Видимо STM по капризней…
Не правда ваша, нет разницы между меж процевым и обменом с внешним компом. СТМ отлично работает.
Сделайте прверку на окончание передачи, перед посылкой следующего пакета, ну и на оборот пакет принят - прерывание… писал же выше (правда уарт+дма) пока не сделал проверку на окончание передачи - висяк был, хотя в 103-м этого не требовалось…
вот драйвер рабочий под ф4 думаю и под ф3 пойдёт, 3 уарта:
#include "board.h"
/*
DMA UART routines idea lifted from AutoQuad
Copyright © 2011 Bill Nesbitt
*/
#define UART_BUFFER_SIZE 512
// Receive buffer, circular DMA
volatile uint8_t rxBuffer[UART_BUFFER_SIZE];
uint32_t rxDMAPos = 0;
volatile uint8_t txBuffer[UART_BUFFER_SIZE];
uint32_t txBufferTail = 0;
uint32_t txBufferHead = 0;
static void uartTxDMA(void)
{
//while (DMA_GetCmdStatus(DMA2_Stream7) != DISABLE) {
// };
DMA2_Stream7->M0AR = (uint32_t)&txBuffer[txBufferTail];
if (txBufferHead > txBufferTail) {
//DMA_SetCurrDataCounter(DMA2_Stream7, txBufferHead - txBufferTail);
DMA2_Stream7->NDTR = txBufferHead - txBufferTail;
txBufferTail = txBufferHead;
} else {
//DMA_SetCurrDataCounter(DMA2_Stream7, UART_BUFFER_SIZE - txBufferTail);
DMA2_Stream7->NDTR = UART_BUFFER_SIZE - txBufferTail;
txBufferTail = 0;
}
DMA_Cmd(DMA2_Stream7, ENABLE);
}
void DMA2_Stream7_IRQHandler(void)
{
if(DMA_GetITStatus(DMA2_Stream7,DMA_IT_TCIF7))
{
/* Очищаем бит обработки прерывания */
DMA_ClearITPendingBit(DMA2_Stream7,DMA_IT_TCIF7);
DMA_Cmd(DMA2_Stream7, DISABLE);
if (txBufferHead != txBufferTail)
uartTxDMA();
}
}
void uartInit(uint32_t speed)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
// USART1_TX PA9
// USART1_RX PA10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);
// DMA TX Interrupt
NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream7_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
USART_InitStructure.USART_BaudRate = speed;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
// Receive DMA into a circular buffer
DMA_DeInit(DMA2_Stream5);
while (DMA_GetCmdStatus(DMA2_Stream5) != DISABLE) {
};
DMA_InitStructure.DMA_Channel = DMA_Channel_4;
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART1->DR;
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)rxBuffer;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_BufferSize = UART_BUFFER_SIZE;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
DMA_Init(DMA2_Stream5, &DMA_InitStructure);
DMA_Cmd(DMA2_Stream5, ENABLE);
USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);
rxDMAPos = DMA_GetCurrDataCounter(DMA2_Stream5);
// Transmit DMA
DMA_DeInit(DMA2_Stream7);
while (DMA_GetCmdStatus(DMA2_Stream7) != DISABLE) {
};
DMA_InitStructure.DMA_Channel = DMA_Channel_4;
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART1->DR;
DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_Init(DMA2_Stream7, &DMA_InitStructure);
DMA_ITConfig(DMA2_Stream7, DMA_IT_TC, ENABLE);
DMA2_Stream7->NDTR = 0;
USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);
USART_Cmd(USART1, ENABLE);
}
uint16_t uartAvailable(void)
{
return (DMA_GetCurrDataCounter(DMA2_Stream5) != rxDMAPos) ? true : false;
}
bool uartTransmitEmpty(void)
{
return (txBufferTail == txBufferHead);
}
uint8_t uartRead(void)
{
uint8_t ch;
ch = rxBuffer[UART_BUFFER_SIZE - rxDMAPos];
// go back around the buffer
if (--rxDMAPos == 0)
rxDMAPos = UART_BUFFER_SIZE;
return ch;
}
uint8_t uartReadPoll(void)
{
while (!uartAvailable()); // wait for some bytes
return uartRead();
}
void uartWrite( uint8_t ch)
{
while (DMA_GetCmdStatus(DMA2_Stream7) != DISABLE) {
};
txBuffer[txBufferHead] = ch;
txBufferHead = (txBufferHead + 1) % UART_BUFFER_SIZE;
// if DMA wasn't enabled, fire it up
if (!(DMA2_Stream7->CR & 1))
uartTxDMA();
}
void uartPrint(char *str)
{
while (*str)
uartWrite(*(str++));
}
/* -------------------------- UART2 ----------------------------- */
uartReceiveCallbackPtr uart2Callback = NULL;
#define UART2_BUFFER_SIZE 128
volatile uint8_t tx2Buffer[UART2_BUFFER_SIZE];
uint32_t tx2BufferTail = 0;
uint32_t tx2BufferHead = 0;
bool uart2RxOnly = false;
static void uart2Open(uint32_t speed)
{
USART_InitTypeDef USART_InitStructure;
USART_StructInit(&USART_InitStructure);
USART_InitStructure.USART_BaudRate = speed;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_Mode = USART_Mode_Rx | (uart2RxOnly ? 0 : USART_Mode_Tx);
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_Init(USART2, &USART_InitStructure);
USART_Cmd(USART2, ENABLE);
}
void uart2Init(uint32_t speed, uartReceiveCallbackPtr func, bool rxOnly)
{
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
uart2RxOnly = rxOnly;
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
// USART2_TX PD5
// USART2_RX PD6
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
if (!rxOnly)
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource5, GPIO_AF_USART2);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource6,GPIO_AF_USART2);
uart2Open(speed);
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
if (!rxOnly)
USART_ITConfig(USART2, USART_IT_TXE, ENABLE);
USART_Cmd(USART2, ENABLE);
uart2Callback = func;
}
void uart2ChangeBaud(uint32_t speed)
{
uart2Open(speed);
}
void uart2Write(uint8_t ch)
{
if (uart2RxOnly)
return;
tx2Buffer[tx2BufferHead] = ch;
tx2BufferHead = (tx2BufferHead + 1) % UART2_BUFFER_SIZE;
USART_ITConfig(USART2, USART_IT_TXE, ENABLE);
}
bool uart2TransmitEmpty(void)
{
return tx2BufferTail == tx2BufferHead;
}
void USART2_IRQHandler(void)
{
uint16_t SR = USART2->SR;
if (SR & USART_IT_RXNE) {
if (uart2Callback)
uart2Callback(USART_ReceiveData(USART2));
}
if (SR & USART_FLAG_TXE) {
if (tx2BufferTail != tx2BufferHead) {
USART2->DR = tx2Buffer[tx2BufferTail];
tx2BufferTail = (tx2BufferTail + 1) % UART2_BUFFER_SIZE;
} else {
USART_ITConfig(USART2, USART_IT_TXE, DISABLE);
}
}
}
/* -------------------------- UART3 ----------------------------- */
uartReceiveCallbackPtr uart3Callback = NULL;
#define UART3_BUFFER_SIZE 128
volatile uint8_t tx3Buffer[UART3_BUFFER_SIZE];
uint32_t tx3BufferTail = 0;
uint32_t tx3BufferHead = 0;
bool uart3RxOnly = false;
static void uart3Open(uint32_t speed)
{
USART_InitTypeDef USART_InitStructure;
USART_StructInit(&USART_InitStructure);
USART_InitStructure.USART_BaudRate = speed;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_Mode = USART_Mode_Rx | (uart3RxOnly ? 0 : USART_Mode_Tx);
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_Init(USART3, &USART_InitStructure);
USART_Cmd(USART3, ENABLE);
}
void uart3Init(uint32_t speed, uartReceiveCallbackPtr func, bool rxOnly)
{
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
uart3RxOnly = rxOnly;
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
if (!rxOnly)
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource8, GPIO_AF_USART2);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource9,GPIO_AF_USART2);
uart3Open(speed);
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
if (!rxOnly)
USART_ITConfig(USART3, USART_IT_TXE, ENABLE);
USART_Cmd(USART3, ENABLE);
uart3Callback = func;
}
void uart3ChangeBaud(uint32_t speed)
{
uart3Open(speed);
}
void uart3Write(uint8_t ch)
{
if (uart3RxOnly)
return;
tx3Buffer[tx3BufferHead] = ch;
tx3BufferHead = (tx3BufferHead + 1) % UART3_BUFFER_SIZE;
USART_ITConfig(USART3, USART_IT_TXE, ENABLE);
}
bool uart3TransmitEmpty(void)
{
return tx3BufferTail == tx3BufferHead;
}
void USART3_IRQHandler(void)
{
uint16_t SR = USART3->SR;
if (SR & USART_IT_RXNE) {
if (uart3Callback)
uart3Callback(USART_ReceiveData(USART3));
}
if (SR & USART_FLAG_TXE) {
if (tx3BufferTail != tx3BufferHead) {
USART3->DR = tx3Buffer[tx3BufferTail];
tx3BufferTail = (tx3BufferTail + 1) % UART3_BUFFER_SIZE;
} else {
USART_ITConfig(USART3, USART_IT_TXE, DISABLE);
}
}
}
Видимо STM по капризней…
В приложенных файлах всё что вам нужно.
SergDoc, по новой плате, может сразу заложиться на набортный ГПС с внешней антенной, т.к. без него уже не интересно, а ШИМ входы/выходы сокаратить до 6/6, ведь нет смысла делать просто более жирный мелковий?
может сразу заложиться на набортный ГПС с внешней антенной
при наличии в продаже дешевых готовых модулей, как-то не актуально, приведёт к увеличению размеров, да и с расчётами разводки можно накосячить, и вылавливать потом багоглюки, да и на каком модуле остановиться? вот что-нибудь для передачи телеметрии - хотя тоже спорный вопрос…
СТМ отлично работает.
Спасибо разобрался, глюк был в приоритетах DMA, у меня их два (канала) один гонит на OSD другой читает с GPS с разных UARTов, так вот при одноименном приоритете происходили трудно-понимаемые чудеса…
и на каком модуле остановиться?
EB270 или EB500 не хотите? , паять легко, обвеса нет (кроме кварца), у меня нормально служит…
может сразу заложиться на набортный ГПС
В следующем проекте (видимо зимой) планирую соорудить LSM333+GPS+баро на одной плате, должно компактно получиться, минимум проводов на модели (только OSD не знаю пока как, отдельно или туда же)…
при наличии в продаже дешевых готовых модулей, как-то не актуально
Актуально, потому как без ГНСС сейчас не один проект не делают, смысла делить на модули и путаться в проводах нет. Кроме того это доп вес и габариты. Больший смысл как раз имеет сделать полную компактную навигационную часть с небольшим количеством вх./выходов, 6/6 например, или общий ППМ/6выходов ШИМ, а остальные расширения входов и выходов делать отдельной платой опционально (аля ПХ4 только с ГНСС на основной плате).
приведёт к увеличению размеров, да и с расчётами разводки можно накосячить, и вылавливать потом багоглюки, да и на каком модуле остановиться?
вот этот модуль naviaglonass.ru/ml8088s имеет маленький размер и ни какой внешней обвязки кроме батарейки и разъема антенны. Единственное место, где можно накосячить, это полосковая линия к разъему, но её можно срисовать с родной девплаты.
вот что-нибудь для передачи телеметрии - хотя тоже спорный вопрос…
Это тоже важно, возможно снять сами РЧ-модули с 3DR и напаять на свою плату, стабы 3.3В нам не нужны. Дальнейшее развитие, думаю, будет идти в сторону всё большей автоматизации и наличие приемника Р/У будет не обязательным, а вот иметь постоянный двустороний канал уже необходимость.
чёт я не пойму - это у вас рубли такие здоровые? 33,2Х35,5 мм - это же вся моя мелкоплата? надо что-то мельче, у меня модуль с антенной 16Х16 если не ошибаюсь… блин первым делом надо заказать верхнюю плату (во разленился - её и дома сделать можно)…
EB500 не хотите?
это MTK? 12Х10 уже более - менее (по размерам)
LSM333
что-то мне подсказывает, что аксель там будет кака 😦
Это тоже важно, возможно снять сами РЧ-модули с 3DR и напаять на свою плату, стабы 3.3В нам не нужны. Дальнейшее развитие, думаю, будет идти в сторону всё большей автоматизации и наличие приемника Р/У будет не обязательным, а вот иметь постоянный двустороний канал уже необходимость.
ха в мелкопату это явно всё не влезет, но вот на основе большей - вполне (можно всё зафундулить и на верхнюю плату - тогда большую и трогать ненадо)…
чёт я не пойму - это у вас рубли такие здоровые? 33,2Х35,5 мм - это же вся моя мелкоплата?
Ну во-первых там копейка, во-вторых размер модуля 15х13х2,8 ))
можно всё зафундулить и на верхнюю плату
Можно и так.
Извиняюсь я GL, а не ML посмотрел, надеюсь его реально достать? сразу три системы (Галилео поддерживается) и с заделом на будущее, не так уж и плохо… только блин название бесит ГЛОНАСС/GPS, Global Positioning System — система глобального позиционирования и ни к какому названию отношения не имеет, Штатовская GPS всегда называлась NAVSTAR, Российская - ГЛОНАСС, а европейская GALILEO… вот что более интересно, что спутники своими инерциалками расчитывают эфемеиды(Эфемериды, в частности, используются для определения координат наблюдателя. Также эфемеридами называются координаты искусственных спутников Земли, используемых для навигации, например в системе NAVSTAR, ГЛОНАСС, Galileo. Координаты спутников передаются в составе сообщений о местонахождении спутника, в этом случае говорят о передаче эфемерид.) потом корректируют расчёты с других спутников и базовой станцией
Я себе прикрутил GPS/ГЛОНАСС SIM68R. Пока не летал но в ГУИ, стабильненько положение определяет.
как вариант сделать на одной плате 36*36 GPS модуль и OSD на stm32f103+LM1881 + можно флэшку поставить ака логер …
если элементы располагать на одной стороне , то перевернув плату деталями вниз не неё-же можно крепить GPS антенну …
как вариант на обратной стороне платы предусмотреть возможность установки модуля с антенной (да хоть тогоже MT3329) …
что-то мне подсказывает, что аксель там будет кака
Что мне не понравилось, так это физически разделенные (или не соединенные) SPI интерфейсы гиры и акс+маг, видимо просто два кристалла в один побольше слепили…
А насчет акселя, незнаю, почему Вам так кажется (если не секрет почему?) вроде 16 бит АЦП, может есть какие нибудь лидеры по показателям из доступных к покупке, так подскажите (у меня не велик опыт, только три марки пробовал, по моему они все приблизительно одинаковые)…
чуть выше, видимо собсвенные резонансы rcopen.com/forum/f134/topic224458/2002
да хоть тогоже MT3329
ну это на верхней плате текущего контроллера, вот думаю, пока не делал её - не заменить ли microSD (она как-то и не актуальна для логов хватит и флеши на плате) на приёмо-передатчик, что работает по SPI? ну например маленький RFM22B
но к нему на втором конце придётся что-то делать USB-> COM->SPI переходник(можно у немцев сколхозить 88 меги у меня есть правда мелкие слишком) 😦 было бы с чем совместить…
думаю эта мысль будет правильней, чем изобретать новую плату, не закончив старую…
Здравствуйте Сергей.Пришли мне на днях платы из того места где Вы заказали свои www.seeedstudio.com/depot.
Я расстроен.Первое-очень криво порезаны,думал что сам накосячил с гербером,но кривизна не повторяется,она уникальна для каждой платы)))Маска и шелкография тоже не на высоте,особенно шелкография.Диаметр отверстий под штырьковые разъемы не тот,штырьки еле еле вставляются.Аналогичная плата,с аналогичными размерами отверстий,заказанная в другом месте-все нормально…
надеюсь его реально достать? сразу три системы (Галилео поддерживается) и с заделом на будущее, не так уж и плохо…
Прийдёт посылка, достанешь )))
только блин название бесит ГЛОНАСС/GPS, Global Positioning System — система глобального позиционирования и ни к какому названию отношения не имеет, Штатовская GPS всегда называлась NAVSTAR, Российская - ГЛОНАСС, а европейская GALILEO.
Вот что википедия говорит:
В 1973 году была инициирована программа DNSS, позже переименованная в Navstar-GPS, а, затем, в GPS.
что более интересно, что спутники своими инерциалками расчитывают эфемеиды
Я конечно не специалист, но думаю, что в космосе ориентироваться с одной стороны сложнее,больше ориентиров, сложнее уравнения движения и больше математики, а с другой стороны проще, ориентация меняется медленней, возмущающих воздействий среды меньше, с вибрациями бороться не нужно. То есть для наших пременений совсем не применим:)
Пришли мне на днях платы из того места где Вы заказали свои
Ну извините, я как-то ответственности за китайский народ и их проделки не несу 😃, у меня платы все акуратные (есть небольшие огрехи в площадках под проц на некоторых, но не смертельно), ну а еже-ли начали гнать брак, то просто надо сменить магазин - за информацию спасибо!
Прийдёт посылка, достанешь )))
Эээ - мы так не договаривались, спасибо - значит верхняя плата в переделку полностью…
Вот что википедия говорит
ей тоже слепо верить нельзя 😃