Wio GPS – также известный как Wio Tracker – представляет собой совместимую с Arduino плату на базе микроконтроллера Microchip Atmel SAMD21, оснащенную модулями GPS, Bluetooth, GSM/GPRS, а также несколькими Grove-разъемами для подключения сенсоров и модулей в IoT-проектах. Компания SeeedStudio предоставила образец для оценки; было проведено тестирование, результаты которого представлены ниже на основе проверки нескольких Arduino-скетчей.
Распаковка Wio Tracker
В комплект входила только плата Wio GPS Tracker v1.1. На лицевой стороне расположены: микроконтроллер Atmel, RGB-светодиод, микрофон и разъем 3.5 мм для телефонных звонков, пользовательская и питающая кнопки, порт micro USB для питания и программирования, двухконтактный разъем для аккумулятора и 6 Grove-разъемов для цифровых, последовательных, I2C и аналоговых модулей.

На обратной стороне платы установлен модуль Quectel MC20, отвечающий за Bluetooth, GPS и GSM, слот двойного назначения для micro SD и nano-SIM, а также антенны GPS, 2G и Bluetooth. Также видны контактные площадки +/- рядом с логотипом OSHW для подключения динамиков.

Нажмите для увеличения
Начало работы с Wio GPS Tracker в Arduino IDE
Для этой части обзора использовалось руководство Wio GPS Board Wiki ; как выяснилось, опыт оказался неоднозначным.
Сначала потребуется кабель micro USB — USB для подключения платы к компьютеру под Windows/Linux/Mac. Вывод ядра в Ubuntu 16.04:
[27730.518478] usb 5-3: new full-speed USB device number 3 using ohci-pci
[27730.720494] usb 5-3: New USB device found, idVendor=2886, idProduct=800e
[27730.720497] usb 5-3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[27730.720499] usb 5-3: Product: Wio GPS Board
[27730.720501] usb 5-3: Manufacturer: Seeed Studio
[27730.723714] cdc_acm 5-3:1.0: ttyACM0: USB ACM device
После установки Arduino IDE для вашей ОС можно добавить платы Seeduino через Файл→Настройки , вставив ссылку https://raw.githubusercontent.com/Seeed-Studio/Seeed_Platform/master/package_seeeduino_boards_index.json в поле Дополнительные ссылки для менеджера плат и нажав OK. Затем в Инструменты→Платы→Менеджер плат следует найти «wio» и установить Seeeduino SAMD by Seeed Studio.
Дополнительно можно установить Adafruit Neopixel через Скетч→Подключить библиотеку→Управлять библиотеками или импортировать zip-архив . После этого в списке плат, вопреки указаниям в Wiki, «Wio Tracker» обнаружено не было, поэтому была выбрана Wio GPS Board и порт /dev/ttyACM0 (Wio GPS Board) .
Затем были проверены примеры скетчей в Примеры→Seeed_Wio_GPS_Board , охватывающие все ключевые функции платы. Протестированы скетчи для RGB_LED, Bluetooth, GNSS (GPS) и GSM (Send SMS), но работоспособным оказался только Bluetooth.

Нажмите для увеличенияПри повторном обращении к Wiki выяснилось, что требуется дополнительно импортировать библиотеку Wio Tracker , что и было сделано. Появился схожий набор примеров для MC20_GPS_Traker-master.
Причины дублирования функционально идентичных примеров неясны, поэтому тестирование продолжилось с образцами из папки MC20_GPS_Tracker-master.
Скетч Blink.ino должен мигать RGB-светодиодом синим цветом:
#include "MC20_Arduino_Interface.h"
#include <Adafruit_NeoPixel.h>
#define RGBPIN 10
#define LED_NUM 1
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(LED_NUM, RGBPIN, NEO_GRB + NEO_KHZ800);
void setup() {
pixels.begin(); // This initializes the NeoPixel library.
}
void loop() {
// For a set of NeoPixels the first NeoPixel is 0, second is 1, all the way up to the count of pixels minus one.
// pixels.Color takes RGB values, from 0,0,0 up to 255,255,255
pixels.setPixelColor(0, pixels.Color(0,0,100)); // Moderately bright blue color.
pixels.show(); // This sends the updated pixel color to the hardware.
delay(1000); // Wait for 1 second
pixels.setPixelColor(0, pixels.Color(0,0,0)); // Turn off the led.
pixels.show();
delay(1000);
}
Программа загрузилась на плату со следующими предупреждениями:
WARNING: Spurious .github folder in 'Adafruit NeoPixel' library
WARNING: Category '' in library FlashStorage is not valid. Setting to 'Uncategorized'
WARNING: Spurious .github folder in 'Adafruit NeoPixel' library
Multiple libraries were found for "MC20_Arduino_Interface.h"
Used: /home/jaufranc/Arduino/libraries/MC20_GPS_Tracker-master
Not used: /home/jaufranc/.arduino15/packages/Seeeduino/hardware/Seeeduino_SAMD/1.1.2/libraries/Seeed_Wio_GPS_Boardl
RGB-светодиод не сработал. После удаления библиотеки Adafruit Neopixel результат сохранился. Проверка схемы подтвердила подключение светодиода к D10; добавление отладочных println-выводов показало корректное выполнение кода, но индикация отсутствовала. Обращение в компанию не дало оперативного результата из-за выходных.
Тестирование продолжилось скетчем BT_CLientHandle.ino для сопряжения платы со смартфоном. Код достаточно прост:
#include "MC20_Common.h"
#include "MC20_BT.h"
// GPSTracker gpsTracker = GPSTracker();
BlueTooth bt = BlueTooth();
int bt_state = -1;
int device_id;
void setup() {
SerialUSB.begin(115200);
while(!SerialUSB);
bt.Power_On();
SerialUSB.println("\n\rMC20 power On!");
bt.BTPowerOn();
SerialUSB.println("\n\rBT power On!");
while(IDLE != (bt_state = bt.getBTState())){
SerialUSB.print("State: ");
SerialUSB.println(bt_state);
delay(1000);
}
SerialUSB.println("Waitting for connecting...");
int result = bt.loopHandle();
SerialUSB.print("Connect result: ");
result != 0? SerialUSB.println("Failed!"):SerialUSB.println("Success!");
}
void loop() {
/* Debug */
if(SerialUSB.available()){
serialMC20.write(SerialUSB.read());
}
if(serialMC20.available()){
SerialUSB.write(serialMC20.read());
}
}
Устройство QUECTEL-BT успешно обнаружено и сопряжено с Android-смартфоном.
Вывод последовательного порта при сопряжении и отключении демонстрирует используемые AT-команды:
+QBTIND: "pair","Apollo Lite",9471BC2FEFAD,446331
Connect result: Success!
AT
+QBTPAIRCNF: 1,1,0,"Apollo Lite",9471BC2FEFAD
+QBTCONN: 1,0,"Apollo Lite",9471BC2FEFAD,"HF_PROFILE"
+QBTIND: "disc",0,1,"Apollo Lite",9471BC2FEFAD,"HF_PROFILE"
Попытка использовать плату как Bluetooth-колонку через AUX-разъем не удалась — динамик издавал звуки, напоминающие модемные. Для реализации функционала, вероятно, требуется дополнительный код и профиль A2DP (не HF_PROFILE). Тест Bluetooth признан успешным.
Тест GPS. Скетч GNSS_Show_Coordinate.ino должен выводить широту и долготу в последовательный порт:
#include "MC20_Common.h"
#include "MC20_Arduino_Interface.h"
#include "MC20_GNSS.h"
GNSS gnss = GNSS();
void setup() {
SerialUSB.begin(115200);
// while(!SerialUSB);
gnss.Power_On();
SerialUSB.println("\n\rPower On!");
while(!gnss.open_GNSS(EPO_QUICK_MODE)){
delay(1000);
}
SerialUSB.println("Open GNSS OK.");
}
void loop() {
char buffer[64];
if(gnss.getCoordinate()){
SerialUSB.print("GNSS: ");
SerialUSB.print(gnss.longitude, 6);
SerialUSB.print(",");
SerialUSB.println(gnss.latitude, 6);
SerialUSB.print(gnss.str_longitude);
SerialUSB.print(",");
SerialUSB.println(gnss.str_latitude);
} else{
SerialUSB.println("Error!");
}
delay(1000);
}
Однако в выводе наблюдалось только повторяющееся сообщение:
Power On!
RDY
+CFUN: 1
+CPIN: NOT INSERTED
IFGCNT=2
OK
AT+CREG?
+CREG: 0,4
OK
AT+CREG?
+CREG: 0,0
OK
AT+CREG?
+CREG: 0,0
OK
AT+CREG?
+CREG: 0,0
OK
AT+CREG?
+CREG: 0,0
OK
AT+CREG?
+CREG: 0,0
+CREG: 0,0. Документация AT-команд (и схемы EAGLE) доступны в папке ресурсов на Github . Согласно документации, AT+CREG? запрашивает статус регистрации в сети; значения 0,0 означают:
- Отключение автоматического уведомления о статусе регистрации
- Не зарегистрирован, устройство не ищет сеть для регистрации
Первоначальное тестирование проводилось в помещении. Учитывая предыдущий опыт получения сигнала в здании с платой NavSpark mini , тест был повторен на улице, но результат не изменился. Возможная причина — отсутствие SIM-карты. После принудительного переключения Android-смартфона на 2G (подтверждено значком «E»), успешной отправки SMS и звонка SIM-карта была извлечена.
Поскольку карта имела формат micro-SIM, а плата требует nano-SIM, использовался переходник (доступны на eBay дешевле $1 ).

Нажмите для увеличенияПосле обрезки SIM-карты и вставки nano-SIM (совместно с micro SD, как показано на фото) GPS-тест был повторен. Вывод изменился, но координаты отсутствовали:
+QGNSSC:1 указывает на включенный модуль GNSS. +CREG:0,2 означает регистрацию в домашней сети, сменяющуюся +CREG:0,5 (регистрация в роуминге).
RDY
+CFUN: 1
+CPIN: READY
AT+CREG?
+CREG: 0,2
OK
Call Ready
AT+CREG?
+CREG: 0,2
OK
SMS Ready
AT+CREG?
+CREG: 0,5
OK
AT+CREG?
+CREG: 0,5
OK
AT+QGNSSC?
+QGNSSC: 0
OK
AT+QGNSSC=1
OK
AT+QGNSSC?
+QGNSSC: 1
OK
AT+CREG?NT=2
OK
+CREG: 0,5
OK
AT+CREG?
+CREG: 0,5
OK
AT+CREG?
+CREG: 0,5
OK
Более сложный скетч GNSS_Google_KML.ino должен выводить координаты на OLED-дисплей и сохранять сырые данные в gps.txt на SD-карте для генерации KML-файла Google. Скетч GoogleMapDemo.ino загружает координаты на сайт ziladuo.com. Учитывая неработоспособность базового примера GNSS, тестирование GPS/GNSS прекращено.
Последняя попытка — отправка SMS через скетч GSM (MC20_SMSSend.ino), рассылающий сообщение «Hello MC20!!» на указанный номер:
Отправка не удалась из-за ошибки функции waitForNetworkRegister:
Тестирование завершено. Извлечение nano-SIM потребовало использования пинцета для нажатия на фиксаторы слота.
#include "MC20_Common.h"
#include "MC20_Arduino_Interface.h"
#define RGBPIN 10
const char message[128] = "Hello MC20!";
GPSTracker gpsTracker = GPSTracker();
void setup() {
pinMode(RGBPIN, OUTPUT);
digitalWrite(RGBPIN, LOW);
SerialUSB.begin(115200);
while(!SerialUSB);
gpsTracker.Power_On();
SerialUSB.println("Power On!");
if(!gpsTracker.waitForNetworkRegister())
{
SerialUSB.println("Network error!");
return;
}
gpsTracker.sendSMS("xxxxxxxxxxx", "Hello MC20!"); /* replace xxxxxx with destination phone number */
}
void loop() {
/* Debug */
if(SerialUSB.available()){
serialMC20.write(SerialUSB.read());
}
if(serialMC20.available()){
SerialUSB.write(serialMC20.read());
}
}
Итоговый опыт оказался крайне негативным: функционировал только Bluetooth, тогда как GPS, 2G GSM и даже пример с RGB-светодиодом не работали. Дополнительные сложности возникали при загрузке кода с ошибками:
Power On!
Network error!
ATE1 E0
OK
или (после длительного простоя последовательного порта):
Требовались многократные попытки загрузки. Возможная причина — использование Ubuntu 16.04 вместо Windows.
No device found on ttyACM0
При условии работоспособности плата обладает значительным потенциалом: простое программирование GPS, Bluetooth, 2G (данные, SMS, звонки) и поддержка Grove-сенсоров для IoT-проектов. Компания предоставляет практичный пример
Caused by: processing.app.SerialException: Error touching serial port '/dev/ttyACM0'.
at processing.app.Serial.touchForCDCReset(Serial.java:87)
at cc.arduino.packages.uploaders.SerialUploader.uploadUsingPreferences(SerialUploader.java:130)
... 6 more
Caused by: jssc.SerialPortException: Port name - /dev/ttyACM0; Method name - openPort(); Exception type - Port busy.
at jssc.SerialPort.openPort(SerialPort.java:164)
at processing.app.Serial.touchForCDCReset(Serial.java:81)
«Wild Adventure Tracker»
, отправляющий GPS-координаты по SMS при обнаружении удара. Исходный код доступен на Github с демонстрационным видео.
Анонсирована 4G-версия устройства для будущего тестирования. Текущую модель Wio GPS Tracker можно предзаказать за $24.95 (включая три антенны).
Выражаем свою благодарность источнику, с которого взята и переведена статья, сайту cnx-software.com.
Оригинал статьи вы можете прочитать здесь.