Как получить данные с gps в лабвью

В статье рассмотрены основы передачи данных Arduino на персональный компьютер и в обратном направлении с использованием LabView.

Вы научитесь отсылать строки и получать данные, которые передаются через USB порт.

Вам помогут навыки программирования на Arduino и создания блок-диаграм виртуальных инструментов (ВИ) в LabView, но даже если вы ни разу не работали в LabView или Arduino IDE, интсрукция достаточно подробная и ее должно хватить.

  • Микроконтроллер Arduino UNO;
  • LM35 (Или другой сенсор);
  • Программа LabVIEW С установленным NI-VISA Driver;

Если вы захотите более детально ознакомиться с принципом действия сенсора LM35, рекомендую почитать его даташит.

LabVIEW (Laboratory Virtual Instrument Engineering Workbench) — это визуальный язык программирования, разработанный компанией National Instruments. Наибольшее применение LabView нашел в сферах получение данных с измерительных приборов (основная идея примера в этой статье), управления, промышленной автоматизации.

Arduino — это open-source платформа, которая обеспечивает разработку интерактивных проектов. В этих проектах берутся данные с различных датчиков или элементов управления (джойстики, кнопки и т.п.) и передаются дальше для управления светодиодами, моторами и т.д.

Проекты на Arduino могут быть автономными и могут передавать-получать данные с программного обеспечения на вашем персональном компьютере (для этого часто используют технологии Flash, Processing, MaxMSP). Плату Arduino можно собрать самостоятельно, а можно купить уже собранную, в том числе и у неоригинального (итальянского) производителя. Оболочка для программирования Arduino IDE доступна для скачивания совершенно бесплатно с оффициального сайта Arduino.

1. Создайте новый VI (ВИ), перейдя на вкладку File > New VI.

2. Перейдите в окно block diagram (блок-диаграмма). Выберите ВП в Data Communication > Protocols > Serial.

  • VISA Configure Serial Port: установите серийный порт.
  • VISA Write (2x): запись данных на подключенное устройство.
  • VISA Read: считывание данных с серийного порта подключенного устройства.
  • VISA Close: закрытие подключения.
  • Bytes at Serial Port: проверка того, доступны ли какие-то данные.

Настало время создать основу нашего ВИ в LabView.

1. Создайте цикл условия while loop Programming > Structures > While Loop.

2. Создайте три структуры Case structure внутри цикла while loop. Цикл Case находится в Programming > Structures > Case Structure.

3. Первые две структуры Case используются для записи строки, а последняя — для чтения.

4. Иконки с операторами VISA Configure Serial Port и VISA Close выносятся за пределы структуры while loop.

Вы можете разместить VISA Configure Serial Port внутри структуры while loop. В примере, который рассматривается нами вам надо будет выбрать COM порт перед запуском виртуального инструмента (ВИ). Если же вы разместите VISA Configure. внутри структуры, вы сможете выбрать COM порт в любое время.

5. Visa Bytes at Port располагается внутри структуры while Loop. Для ого, чтобы активировать условие для считывания информации, надо проверить, есть ли она вообще на серийном порту. Для этого мы проверяем количество байтов на серийном порту и сравниваем его с 0. Для этого используется Programming > Comparison > Grater than 0 VI.

6. Если количество байт на порту больше 0, активируется структура “True Case Structure” и VISA Read вернет считанные байты.

7. VISA Configure Serial Port дает пользователю возможность выбрать какой именно серийный порт будет использоваться и устанавливает скорость обмена данными. То есть “Visa resource name” и “Baud Rate” должны быть элементами управления. По умолчанию скорость обмена данными равна 9600.

8. Используйте блок VISA Write > Write Buffer. Эта строка будет передана на USB порт. В этой статье в дальнейшем будут использоваться условные обозначения ВКЛ для Включить и ВЫКЛ для Выключить.

Если вы хотите передавать команды с клавиатуры, вы можете использовать VISA Write для создания элемента управления строками. В этом примере использовались кнопки.

9. Перейдите в окно Front Panel (Интерфейс пользователя) и создайте необходимые элементы интерфейса.

10. Для того, чтобы отобразить полученные данные (температура), можно использовать Numerics > Thermometer и параллельно Graph Indicators > Chart.

11. Добавьте кнопки (Buttons > OK Button), для того, чтобы вкл/выкл датчик. Измените Mechanical Action на Switch Until Released и добавьте числовые индикаторы (Num Inds > Num Indicator), чтобы отслеживать температуру.

Вы также можете добавить элементы управления вроде “USB Control” и “LM35”;

12. Вернитесь в окно блок-диаграмы, чтобы настроить кнопки (Buttons), графики (Graph), термометр (Thermometer) и числовые индикаторы (Num inds).

Для отображения данных, полученных с USB порта, их надо преобразовать из строки в число:

  • Programming > String > String/Number Convertions > Fract/Exp String to Number: конвертирует строку в число. Этот ВИ надо добавить внуть структуры read case structure, чтобы убедиться, что все полученные данные будут конвертированы.
  • Вход String данного ВИ подключен к read buffer подпрограммы VISA Read.

13. Теперь подключите Gaph, Thermometer и Num ind к выходу Number, который находится в Fract/Exp String to Number.

14. Подключите кнопку turn on (вкл) к первому условию case structure, а кнопку turn off (выкл) — ко всторому условию. Кнопку stop подключите к условию While Loop.

15. Так как процесс проходит достаточно быстро, добавьте небольшую задержку (delay) в пределах цикла while loop: Programming > Timing > Wait (ms). Выставьте задержку равной 600 мс, чтобы убедиться, что все данные были получены. При этом Arduino будет обновлять данные каждые 500 мс (смотрите скетч Arduino).

VISA Configure Serial Port находится внутри структуры while loop на рисунке выше.

  • Вы можете проверить, доступен ли USB порт или проверить наличие ошибок на нем. Этот (Programming > Dialog and User Interface > Find First Error) ВИ возвращает “true”, если есть ошибка. Если ошибки нет или она устранена, COM порт будет доступен.
  • Можете создать так называемый «error handler» (Programming > Dialog and User Interface > Simple Error Handler). С его помощью вы сможете не только обнаружить ошибку, но и узнать, где она, получить ее описание.
  • Кроме того, вы можете перезапустить ВИ в любой момент его работы. Просто используйте VI Server Reference (Programming > Application Control> VI Server Reference) и Invoke Node (Programming > Application Control> Invoke Node).


1. Инициализируем все переменные и пины, которые вы будете использовать. В данном случае:

  • 1 светодиод (Светодиод на Arduino);
  • 1 сенсор LM35.

Теперь создадим для примера вполне практическую программу для общения компьютера с GPS-навигатором по протоколу NMEA. В качестве прототипа используем процедуру с использованием компонента AsyncFree, но читатель, при нежелании устанавливать этот компонент, без сомнения, легко перепишет ее с использованием функций API. Тем более что общение с устройством тут полностью одностороннее.

Сначала о протоколе NMEA. Хотя эта программа испытывалась с навигатором Garmin eTrex, никакой разницы нет — любой навигатор, от самых сложных профессиональных приборов до дешевых ручных устройств поддерживает этот протокол. Для этого его нужно установить в меню установок прибора — по умолчанию гам, как правило, установлен фирменный протокол (для фирмы Garmin это и есть упоминавшийся ранее протокол Garmin). Хотя фирменный протокол имеет более широкие возможности (см. [27]), но NMEA обычно достаточно, чтобы извлечь из навигатора практически всю информацию, которую он умеет выдавать. Протокол этот был разработан Национальной ассоциацией морской электроники (National Marine Electronics Association, NMEA) еще до появления GPS н под названием NMEA0183 (IECI162) стал в настоящее время мировым стандартом. Крупнейшим недостатком протокола обычно называют невозможность присоединения более чем одного устройства к одному порту.

$gprmc,154140,а,5552.6225,n,03733.3341,е,0.0, 0.0, 080405, 9.5,е,а*1е 3gprmb,а. а,а*0в

5gpgga,154138,5552.6224,n,03733.3334,е,1,04,3.5,268.5, м, 15.4, м, ,’45 5gpgsa,а,2. 04,13. 23,24. 3.7,3.5,1.0*31

3gpgsv,3,2,10,16,13,111,00,20,69,147,00,23,69,247,43,24,49,246,47*72 5gpgll,5552.6224,n,03733.3334,е,154138,а,а*4в $gpbod,,т,,м,,*47

$hchdg,147.3. 9 5,е*24

Каждое сообщение начинается с символа $ и заканчивается переводом строки ( + , т. е. символами с номерами 13 и 10), отдельные поля разделяются запятыми. Последний байт перед этими символами (ie в первой строке)— контрольная сумма. Мы ее отслеживать не будем. Если навигатор ка- кую-то величину «не знает», то соответствующее поле между запятыми будет пустым. Забавно, что между одинаковыми полями сообщений имеются некоторые разночтения, которые, очевидно, вызваны тем, что сообщения формируются в разное время, хотя и выдаются единовременно.

Все это море информации нам не требуется, давайте ограничимся простой задачей: вывести в окошки координаты места (в нормальных единицах широты/долготы), высоту места над уровнем моря и точное время по Гринвичу. Для этого достаточно проанализировать, например, сообщение sgpgga.

Первое поле в этом сообщении — время по Гринвичу (Greenwich Mean Time, GMT), второе и третье— широта (n — значит «северная», North), четвертое и пятое— долгота (е— значит «восточная», East). Высота места над уровнем моря— поле перед первым по ходу строки символом м, который обозначает единицу ее измерения (метр, Meter). Надо так понимать, что могут быть и футы, но это явно должно устанавливаться в самом навигаторе, так что будем рассчитывать на метры, в крайнем случае программа просто не выведет ничего. Разберемся с представлением координат— что это за числа: 5552.6225, 03733.3341? Оказывается, это десятичные градусы, точнее— минуты. Первые два (или три для долготы) знака есть целые градусы, еще два до точки — минуты, остальное есть секунды, выраженные в десятичных долях вместо шестидесятеричных. Для того чтобы перевести их в привычные секунды, достаточно дробную часть умножить на 60 — получим секунды с сотыми долями.

Заметки на полях

Кстати, любопытно, а какова получается разрешающая способность такого представления координат (четыре разряда минут после запятой), если ее выразить в метрах? По широте на этот вопрос можно ответить более-менее однозначно: 1 минута широты (угловая минута дуги меридиана) есть одна морская миля, т. е. 1852 метра (отсюда 1 градус — примерно 111 км). Тогда одна десятитысячная часть составит примерно 20 см (а одна секунда широты — 31 м, а ее сотая часть — 31 см, как видите, при переводе долей десятичных минут в углоаые секунды мы теряем в разрешении). На самом деле это цифры приблизительные, потому что при таких точностях надо учитывать форму геоида, навигаторы делать это умеют, и в сообщениях NMEA информация для этого содержится, но углубляться в этот вопрос здесь мы не будем. Заметим только, что для долготы уже такой однозначности нет — к полюсам меридианы сходятся, на широте 60 градусов длина широтной дуги становится в два раза меньше меридиональной. Для прикидок а уме можно принимать, что для средних широт 40—50° длина 1 минуты по долготе примерно в 1,5 раза меньше, чем по широте. А методика более точных расчетов по данным GPS-навигатора имеется на множестве ресурсов в Сети— дисциплины геодезия и картография, ранее бывшие прерогатиаой отдельных специалистов с военным и геологическим уклоном, теперь пришли в широкие массы, которые раньше даже и не подозревали о существовании какого-нибудь эллипсоида Красовского.

Разобрались, теперь можно писать программу. Для этого создадим новый проект под названием GPSNavigate (в папке GIava21\4), установим на форму то же самое Memo с теми же свойствами, как и в проекте COMProba ранее (только уберем у него линейку прокрутки: scrollBars = ssNone), и тот же самый AfComPort. Из визуальных компонентов нам потребуется еще только сотЬовох для выбора порта, который мы тоже скопируем из проекта-пробы. При инициализации порта стоит учесть, что в каждой посылке навигатора может быть порядка 500 символов, и на всякий случай установить буфер побольше (пусть это будет 1024 байта).

В секции объявления переменных мы запишем следующее:

Forml: TForml; st,stcorn:string;

FlagCOM:boolean=False; FlagGPS:boo lean-False; call:integer;

Л процедура инициализации порта будет выглядеть так:

procedure IniCOM; var i, err :integer; begin

Fo rml.Memo1.Li nes.Add(s t);

Forml.AfComPortl.Close; (закрываем старый СОМ, если был/

if err=0 then Forml.AfComPort1.ComNumber:=i else exit;

(номер порта/ Forml.AfComPortl.BaudRate:=br4800; (скорость 4800/ Forml.AfComPortl.InBufSize:=1024; (емкость буфера) try

Fo ml. A f ComPo r 11. Open ; except

if not Forml.AfComPortl.Active then (если не открылся/ begin

st:=stcoirv+’ does not be present or occupied.’; Application.MessageBox(Pchar(st),’Error’,MB_OK); exit (выход из процедуры – неудача) end; end;

st: = ‘AT’ i’iil3+#10; (будем посылать инициализацию модема/ Forml.AfComPortl.WriteString(st); (ответ не сразу) Forml.Timerl.Enabled:-True; tall:=0;

while callcl do application.ProcessMessages; Iпауза в 1 с) Forml.Timerl. Enabled: ^ False;

st:=Forml.AfComPortl.ReadString; (ответ модема 10 знаков) FlagGPS:=False; (это еще не проверка GPS) if pos(‘OK’,st)<>0 then (модем/ begin

st:=stcomi’ занят модемом’; Fo rml.Timerl.Enabled: Fa lse; Forml.Memol.Lines.Clear; Forml.Memol.Lines.Add(st); exit;

end else (все нормально, открываем СС&!) begin

Forml.Memol.Lines.Clear; s t: =’ ‘; (очюцаем строку для вывода> FlagCOM:=True; tall:=0;

Forml.Timerl.Enabled:^True; (запускаем опять таймер) FlagGPS:=True; (проверка GPS) end; end;

Видите, насколько удобнее пользоваться готовым компонентом — захотели послать целую строку — послали без дополнительных раздумий (см. в тексте процедуры определение модема), захотели отдельный байт— также послали (на самом деле можно посылать и отдельный символ, как символ). То же самое касается и приема — байтовый массив нам тут держать уже нужды нет.

Процедура по событию таймера будет выглядеть так:

procedure TForml.TimerlTimer(Sender: TObject);

if (tall>2) and (FlagGFS=True) then (устройство не обнаружено) begin

st: =’Устройство не обнаружено 1 ; Forml.Memol.Lines.Clear; Forml.Memol.Lines.Add(st) ; end; end;

To есть таймер работает все время (отсчитывая секунды в переменной tail, т. к. величину свойства interval мы не меняли, она по умолчанию I с и равна). Для того чтобы теперь отслеживать контакт с устройством, достаточно каждый раз обнулять переменную tall в процедуре приема— как только промежуток между поступлениями данных превысит 2 с, программа «завопит», что «устройство не обнаружено» и автоматически возобновит прием, как только данные пойдуг опять.

Прежде чем перейти к процедуре приема, создадим все остальные необходимые процедуры, они гут будут очень просты:

procedure TForml.FormCreate(Sender: TObject); begin

prooedure TForml.FormDestroy(Sender: TObject); begin

AfComPort1.Close; Iзакрытие порта> end;

prooedure TForml.ComboBoxlSelect(Sender: TObject); begin

prooedure TForml.MemolChange(Sender: TObject); begin

Как видите, для красоты мы добавили процедуру скрытия текстового курсора. И наконец, самая главная процедура приема данных, анализа строк сообщения и вывода результатов на экран:

prooedure TForml.AfComPortlDataRecived(Sender: TObject; Count: Integer); var stl:string; sek:real; i,err:integer; begin

tall:=0; /устройство обнаруженоI

if pos(‘$’,st.)=0 then begin st: = ”; exit end;

if length(st) 0 then <конец сообщения GPGCA) begin (анализ сообщения) Memol.Lines.Clear; (st:=’$GPGGA,154138,5552.6224,N,03733.3334,E.1,04, 3. 5,268. 5, M, 15. 4, M,, 45′;)

stl:=copy(st,pos( 1 ,’,st)+1,6);(время) if pos(‘,’,stl)<>0 then (нет данных) begin stl:=’HeT данных’;

Компания National Instruments анонсировала выход набора инструментов для LabVIEW — NI GPS Toolkit, представляющего собой дополнение к среде графической разработки. Этот набор инструментов расширяет спектр функциональных возможностей платформы NI RF PXI и позволяет проводить симуляцию GPS-сигналов нескольких спутников. Используя программное обеспечение NI LabVIEW для генерации радиосигналов и симуляции сигналов 12 спутников (формируя последовательность навигационных C/A кодов в полосе частот L1), инженеры могут измерять чувствительность приемного устройства, регистрировать время захвата (TTFF) и определять точность позиционирования при помощи генератора векторных сигналов NI PXIe-5672 RF.

Благодаря новому программному обеспечению, инженеры могут использовать комбинацию смоделированных и записанных GPS-радиосигналов в качестве универсального недорогого решения для проверки и контроля при проектировании приёмных устройств. При помощи анализатора векторных сигналов NI PXI-5661 RF и предусилителя NI PXI-5690 (малошумящего усилителя), разработчики могут принимать и записывать сигналы GPS с характерными искажениями, имеющими место при регистрации сигналов с реального спутника. Появилась возможность генерировать как смоделированные, так и записанные сигналы с помощью генератора векторных сигналов NI PXIe-5672 RF, производя последовательное копирование отсчетов GPS-сигналов, сохраненных на жёстком диске. Используя RAID-массив емкостью 2 ТБ, разработчики могут формировать поток смоделированных сигналов с мгновенной длительностью до 12,5 минут или же 25 часовую непрерывную последовательность предварительно записанных GPS-сигналов для регистрации и анализа отклика приёмника на широкий диапазон сигналов.

Разработчики могут использовать пакет GPS совместно c комплектом виртуальных приборов для модуляции сигналов NI Modulation Toolkit, программным обеспечением для тестовых испытаний NI TestStand и модульным оборудованием PXI RF для создания комплексной и недорогой системы тестирования. Так как алгоритм работы PXI-системы полностью определяется программной частью, при помощи PXI-платформы можно также тестировать устройства для беспроводной передачи данных работающих в соответствии с протоколами RDS, WiFi, GSM, WCDMA, Bluetooth и DVB. Измерительные системы, созданные на базе платформы PXI, отличаются более низкой стоимостью, универсальностью и высокой скоростью обработки данных по сравнению с традиционными измерительными системами, применяемыми в серийных испытаниях продукции. При проведении многофункционального тестирования, выбор в пользу PXI становится еще более очевидным.

Читайте также:
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...
Adblock
detector