Читаем Программируем Arduino. Профессиональная работа со скетчами полностью

  static int i = 0;

  if (gpsSerial.available())

  {

    char ch = gpsSerial.read();

    if (ch != '\n' && i < sentenceSize)

    {

      sentence[i] = ch;

      i++;

    }

    else

    {

     sentence[i] = '\0';

     i = 0;

     //Serial.println(sentence);

     displayGPS();

    }

  }

}

void displayGPS()

{

  char field[20];

  getField(field, 0);

  if (strcmp(field, "$GPRMC") == 0)

  {

    Serial.print("Lat: ");

    getField(field, 3);  // число

    Serial.print(field);

    getField(field, 4); // широта N/S

    Serial.print(field);

    Serial.print(" Long: ");

    getField(field, 5);  // число

    Serial.print(field);

    getField(field, 6);  // долгота E/W

    Serial.println(field);

  }

}

void getField(char* buffer, int index)

{

  int sentencePos = 0;

  int fieldPos = 0;

  int commaCount = 0;

  while (sentencePos < sentenceSize)

  {

    if (sentence[sentencePos] == ',')

    {

      commaCount ++;

      sentencePos ++;

    }

    if (commaCount == index)

    {

      buffer[fieldPos] = sentence[sentencePos];

      fieldPos ++;

    }

    sentencePos ++;

  }

  buffer[fieldPos] = '\0';

}

Сообщения, посылаемые модулем GPS, имеют разную длину, но не более 80 символов, поэтому в скетче используется буфер емкостью 80 символов, который заполняется данными, пока не заполнится или не будет получен признак конца строки.

После того как полное сообщение будет прочитано, в конец буфера вставляется нулевой символ, завершающий строки в языке C. Это необходимо, только если вы пожелаете «напечатать» сообщение в его исходном виде.

Остальная часть скетча реализует извлечение полей и форматирование выходной строки для записи в монитор последовательного порта. Функция getField извлекает текст из поля с указанным индексом.

Функция displayGPS игнорирует любые сообщения, тип которых отличается от "$GPRMC", и извлекает широту и долготу, а также односимвольные названия полушарий для отображения.


В заключение

В этой главе мы исследовали несколько способов программирования взаимодействий через последовательный интерфейс между платами Arduino, периферийными устройствами и компьютерами.

В следующей главе мы обратим внимание на одну интересную особенность Arduino Leonardo, которая позволяет имитировать поведение периферийных устройств USB, таких как клавиатура и мышь. А также рассмотрим некоторые аспекты программирования интерфейса USB.

8 Похожее описание на русском языке: http://arduino.ru/Reference/Serial. — Примеч. пер.

9 Описание на русском языке: http://arduino.ua/ru/prog/SoftwareSerial. — Примеч. пер.

11. Программирование интерфейса USB

В этой главе рассматриваются разные аспекты использования порта USB на плате Arduino. В том числе возможность эмуляции клавиатуры и мыши, поддерживаемой платой Arduino Leonardo, а также подключения клавиатуры или мыши к соответственно оборудованной плате Arduino.


Эмуляция клавиатуры и мыши

Три модели Arduino — Due, Leonardo и Micro (основанная на модели Leonardo) — позволяют использовать их порт USB для эмуляции клавиатуры или мыши. Существуют также Arduino-совместимые платы, такие как LeoStick от компании Freetronics (рис. 11.1), поддерживающие аналогичную возможность.

Эта возможность широко используется, например, с музыкальными контроллерами, что позволяет плате Arduino взаимодействовать с музыкальными синтезаторами и управляющими программами, такими как Ableton Live. Благодаря ей можно, к примеру, на основе Arduino создавать новые музыкальные инструменты, управляющие музыкальным программным обеспечением с помощью датчиков поворота, прерываемых лучей света или педальной клавиатуры. К несерьезным применениям этой возможности можно отнести устройства, которые создают впечатление, что мышь живет

Рис. 11.1. Плата LeoStick

своей жизнью независимо от действий пользователя или клавиатура сама печатает случайные символы.

Модель Arduino Due имеет два порта USB. Эмуляция клавиатуры и мыши осуществляется через локальный порт USB, а программирование Arduino Due — через порт USB для программирования (рис. 11.2).

Рис. 11.2. Плата Arduino Due с двумя портами USB


Эмуляция клавиатуры

Функции эмуляции клавиатуры просты в использовании. Они входят в состав стандартной библиотеки языка, поэтому для доступа к ним не требуется подключать дополнительные библиотеки. Чтобы включить режим эмуляции клавиатуры, добавьте в функцию setup следующую команду:

Keyboard.begin();

Чтобы заставить Arduino печатать что-нибудь, можно воспользоваться командами print и println, и переданный им текст появится в позиции текстового курсора:

Keyboard.println("It was the best of times.");

Чтобы сымитировать нажатие клавиш-модификаторов, например ввести комбинацию CTRL+C, используйте команду press:

Keyboard.press(KEY_LEFT_CTRL);

Keyboard.press('x');

delay(100);

Keyboard.releasrAll();

Перейти на страницу:

Похожие книги

C++: базовый курс
C++: базовый курс

В этой книге описаны все основные средства языка С++ - от элементарных понятий до супервозможностей. После рассмотрения основ программирования на C++ (переменных, операторов, инструкций управления, функций, классов и объектов) читатель освоит такие более сложные средства языка, как механизм обработки исключительных ситуаций (исключений), шаблоны, пространства имен, динамическая идентификация типов, стандартная библиотека шаблонов (STL), а также познакомится с расширенным набором ключевых слов, используемым в .NET-программировании. Автор справочника - общепризнанный авторитет в области программирования на языках C и C++, Java и C# - включил в текст своей книги и советы программистам, которые позволят повысить эффективность их работы. Книга рассчитана на широкий круг читателей, желающих изучить язык программирования С++.

Герберт Шилдт

Программирование, программы, базы данных
Programming with POSIX® Threads
Programming with POSIX® Threads

With this practical book, you will attain a solid understanding of threads and will discover how to put this powerful mode of programming to work in real-world applications. The primary advantage of threaded programming is that it enables your applications to accomplish more than one task at the same time by using the number-crunching power of multiprocessor parallelism and by automatically exploiting I/O concurrency in your code, even on a single processor machine. The result: applications that are faster, more responsive to users, and often easier to maintain. Threaded programming is particularly well suited to network programming where it helps alleviate the bottleneck of slow network I/O. This book offers an in-depth description of the IEEE operating system interface standard, POSIX (Portable Operating System Interface) threads, commonly called Pthreads. Written for experienced C programmers, but assuming no previous knowledge of threads, the book explains basic concepts such as asynchronous programming, the lifecycle of a thread, and synchronization. You then move to more advanced topics such as attributes objects, thread-specific data, and realtime scheduling. An entire chapter is devoted to "real code," with a look at barriers, read/write locks, the work queue manager, and how to utilize existing libraries. In addition, the book tackles one of the thorniest problems faced by thread programmers-debugging-with valuable suggestions on how to avoid code errors and performance problems from the outset. Numerous annotated examples are used to illustrate real-world concepts. A Pthreads mini-reference and a look at future standardization are also included.

David Butenhof

Программирование, программы, базы данных