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:
1 2 3 4 5 6 |
[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-светодиодом синим цветом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#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); } |
Программа загрузилась на плату со следующими предупреждениями:
1 2 3 4 5 6 |
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 для сопряжения платы со смартфоном. Код достаточно прост:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
#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-команды:
1 2 3 4 5 6 7 8 9 10 |
+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 должен выводить широту и долготу в последовательный порт:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
#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); } |
Однако в выводе наблюдалось только повторяющееся сообщение:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
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 (регистрация в роуминге).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
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 потребовало использования пинцета для нажатия на фиксаторы слота.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
#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-светодиодом не работали. Дополнительные сложности возникали при загрузке кода с ошибками:
1 2 3 4 |
Power On! Network error! ATE1 E0 OK |
или (после длительного простоя последовательного порта):
Требовались многократные попытки загрузки. Возможная причина — использование Ubuntu 16.04 вместо Windows.
1 |
No device found on ttyACM0 |
При условии работоспособности плата обладает значительным потенциалом: простое программирование GPS, Bluetooth, 2G (данные, SMS, звонки) и поддержка Grove-сенсоров для IoT-проектов. Компания предоставляет практичный пример
1 2 3 4 5 6 7 |
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.
Оригинал статьи вы можете прочитать здесь.