Venus Supply — компания из Бангкока (Таиланд), специализирующаяся на embedded-системах. Она реализует продукцию через бренд ThaiEasyElec и выступает локальным дистрибьютором популярных DIY-электронных компонентов. Ранее тестировалась их плата ESPino32 на ESP32 , а сейчас был предоставлен новый продукт — «3G HAT Expansion for Raspberry Pi» на базе модуля Quectel UC20-G , поддерживающего глобальные сети 3G и GPS/GLONASS. Устройство работает в любой стране с покрытием 2G или 3G.
После перечисления характеристик, распаковки и сборки с Raspberry Pi 2/3, представлено краткое руководство по использованию GPS и подключению к 3G с SIM-картой Hologram .
Характеристики платы расширения 3G HAT для Raspberry Pi
- Беспроводной модуль Quectel UC20-G с поддержкой:
- Сотовая связь
- 3G – UMTS @ 800/850/900/1900/2100 МГц
- 2G – GSM @ 850/900/1800/1900 МГц
- Данные – HSPA+ до 14.4 Мбит/с (прием), 5.76 Мбит/с (передача), EDGE, GPRS
- SIM-карта Push-Pull с защитой от ESD
- Основной + разнесенный RP-SMA антенные разъемы
- GNSS
- Двигатель Qualcomm gpsOne Gen8
- GPS, ГЛОНАСС
- RP-SMA антенный разъем
- Сотовая связь
- Интерфейс хоста – USB и UART
- Аудио – Аудиокодек, 3.5 мм разъем для микрофона и монофонического звука
- Дополнительно
- Перемычка автостарта (J3)
- Программный старт/стоп через GPIO17 или GPIO18, настраивается перемычкой «P8»
- Выключатель питания
- Светодиоды – статуса, сети, питания
- Резервная батарея для ускорения фиксации GPS
- Совместимость с 40-контактным разъемом Raspberry Pi Hat
Распаковка
Комплект поступил в картонной коробке с тремя пакетами: плата с аксессуарами, GPS/ГЛОНАСС и 3G антенны (последние две опциональны).

Антенна GPS оснащена 3-метровым кабелем, что подходит для установки в автомобилях. В комплект HAT входят стойки, винты, гайки и 40-контактный разъем. Указанный 25-см micro USB кабель отсутствовал в поставке.

На плате центрально расположен модуль Quectel UC20GB, три антенных разъема RP-SMA (DIV, GNSS, MAIN), micro USB для питания/данных, 3.5 мм аудиоразъем. В правом верхнем углу: 2-контактная перемычка J3 (автостарт), 3-контактная P8 (выбор GPIO 17/18 для ПО включения), кнопка ручного запуска/остановки модуля.

40-контактный разъем RPi выведен штыревыми контактами, включая 4-контактный UART.
На обратной стороне: аудиокодек Nuvoton NAU8814Y , слот для SIM-карты с заглушкой, резервная батарея CR1220 для GPS, 40-контактный разъем для подключения к Raspberry Pi.

Резервная батарея питает внутренний тактовый генератор модуля, ускоряя фиксацию GPS за счет использования данных за последние 3 дня.
Сборка и конфигурация 3G HAT с Raspberry Pi 2/3

Требуется micro USB кабель для подключения платы расширения к USB-порту Raspberry Pi. Заглушка SIM-карты заменяется на активную карту контактами к плате. После установки карта выступает на ~3 мм — это нормально. Управление питанием: кнопка, перемычка J3 (автостарт) или GPIO 17/18. Для теста выбрана перемычка J3; для батарейного питания предпочтительнее GPIO.
Проверка распознавания 3G HAT в Linux
После запуска Raspberry Pi и входа в терминал (SSH, serial, GUI) модуль Quectel UC20 должен отображаться через lsusb с VID:PID 05c6:9003:
lsusb
Bus 001 Device 004: ID 05c6:9003 Qualcomm, Inc. Quectel UC20
При отсутствии: проверить подключение USB и питание модуля. Рекомендуется активировать перемычку J3. После распознавания появятся четыре устройства ttyUSB:
ls /dev/ttyUSB*
/dev/ttyUSB0 /dev/ttyUSB1 /dev/ttyUSB2 /dev/ttyUSB3
Назначение устройств:
- /dev/ttyUSB0 – DM-интерфейс (диагностика, не используется)
- /dev/ttyUSB1 – NMEA-интерфейс (вывод GPS NMEA, только чтение)
- /dev/ttyUSB2 – AT-интерфейс (для GPS)
- /dev/ttyUSB3 – Модемный интерфейс для PPP и AT-команд
Управление GPS и обработка данных
ThaiEasyElec использует Putty, но для headless-режима установлен picocom:
sudo apt install picocom
Подключение к /dev/ttyUSB2 на 115200 8N1 для отправки AT-команд:
picocom /dev/ttyUSB2 -b 115200
picocom v1.7
...
Terminal ready
AT+QGPS=1
OK
AT+QGPSEND
OK
Команда AT+QGPS=1 включает GNSS, AT+QGPSEND — выключает.
При активном GNSS подключение к /dev/ttyUSB1 @ 9600 бод выводит NMEA-данные (обновляются ежесекундно):
pi@raspberrypi:~ $ picocom /dev/ttyUSB1 -b 9600
picocom v1.7
...
Terminal ready
$GPGSV,1,1,01,14,,,44*7D
$GPVTG,,T,,M,,N,,K,N*2C
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPGGA,,,,,,0,,,,,,,,*66
$GPRMC,,V,,,,,,,,,,N*53
$GPGSV,1,1,03,14,,,44,31,,,36,33,,,39*72
$GPVTG,,T,,M,,N,,K,N*2C
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPGGA,,,,,,0,,,,,,,,*66
$GPRMC,,V,,,,,,,,,,N*53
$GPGSV,1,1,04,03,,,37,14,,,44,31,,,37,33,,,40*7D
$GPVTG,,T,,M,,N,,K,N*2C
$GPGSV,2,1,08,26,63,009,42,01,01,246,,03,31,299,,16,74,250,*7C
$GPGSV,2,2,08,22,43,278,,23,04,320,,27,27,168,,29,00,047,*78
$GPVTG,,T,,M,,N,,K,N*2C
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPGGA,,,,,,0,,,,,,,,*66
$GPRMC,,V,,,,,,,,,,N*53
$GPGSV,3,1,09,14,,,44,26,63,009,43,01,01,246,,03,31,299,*4B
$GPGSV,3,2,09,16,74,250,,22,43,278,,23,04,320,,27,27,168,*73
$GPGSV,3,3,09,29,00,047,*48
$GPVTG,,T,,M,,N,,K,N*2C
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
Расшифровка полей:
- GPGGA – Фиксация, время, позиция
- GPRMC – Минимальные навигационные данные
- GPGSV – Данные о спутниках
- GPGSA – Общая информация о спутниках
- GPVTG – Вектор и скорость перемещения
Отсутствие GPGSA в выводе вызвано незавершенной фиксацией GPS.
Автоматический запуск GNSS при включении модуля:
AT+QGPSCFG="autogps",1
OK
Для отключения: заменить 1 на 0. Статус «autogps» проверяется командой без параметра:
AT+QGPSCFG="autogps"
+QGPSCFG: "autogps",1
OK
Подробности AT-команд для GPS/ГЛОНАСС в руководстве Quectel UC20 GNSS AT Commands Manual (pdf).
Для удобного отображения данных вместо чтения NMEA используются GPS Daemon (gpsd) и клиент (cgps). После остановки picocom устанавливаются пакеты:
sudo apt install gpsd gpsd-clients python-gps
Демон gpsd запускается автоматически, поэтому его останавливают:
sudo systemctl stop gpsd.socket
… и перезапускают с параметрами (интерфейс /dev/ttyUSB1):
sudo gpsd /dev/ttyUSB1 –F /var/run/gpsd.sock
Запуск клиента:
cgps –s
Через несколько секунд отображается фиксация с деталями (слева) и данными о спутниках (справа).
Ранее тестировался модуль NavSpark mini GPS (Arduino-совместимый) , где фиксация достигалась внутри помещения. Здесь потребовалось вынести антенну на улицу. Для интеграции в приложения рекомендуется изучить исходный код cgps .
Координаты также получаются через /dev/ttyUSB2 командой QGPSLOC в трех режимах:
- Режим 0 – формат = ddmm.mmmmN/S, dddmm.mmmmE/W
- Режим 1 – формат = ddmm.mmmmmmN/S, dddmm.mmmmmmE/W
- Режим 2 – формат = (-d)dd.ddddd,(-)ddd.ddddd
AT+QGPSLOC=0
+QGPSLOC: 075825.0,1111.0856N,01111.5670E,0.7,300.8,2,0.00,0.0,0.0,100218,09
OK
AT+QGPSLOC=1
+QGPSLOC: 075850.0,1111.085526,N,01111.566956,E,1.0,300.3,2,0.00,0.0,0.0,100218,08
OK
AT+QGPSLOC=2
+QGPSLOC: 075921.0,11.83475,011.99278,0.8,299.2,2,0.00,0.0,0.0,100218,09
OK
Поля (слева направо): <UTC время>,<широта>,<долгота>,<hdop>,<высота>,<фиксация>,<cog>,<spkm>,<spkn>,<UTC дата>,<nsat>
Пояснения:
- <hdop> – Горизонтальная точность, 0.5-99.9 (из GPGGA)
- <fix> – Режим позиционирования (из GNGSA/GPGSA): 2 = 2D, 3 = 3D
- <cog> – Направление относительно севера. Формат: ddd.mm (из GPVTG)
- <spkm> – Скорость (км/ч). Формат: xxxx.x (из GPVTG)
- <spkn> – Скорость (узлы). Формат: xxxx.x (из GPVTG)
- <nsat> – Количество спутников (00-24) (из GPGGA)
Работа 3G HAT с SIM-картой Hologram
Тестирование сотовой связи выполнено с IoT SIM-картой Hologram для разработчиков , подойдет любая 3G SIM-карта.
Способ 1: Sakis3G и UMTSkeeper
В документации ThaiEasyElec для установки PPP-подключения 3G
- используются:
- Sakis3G – контроллер параметров и оборудования для подключения к интернету.
UMTSkeeper – переподключение через Sakis3G при обрыве связи.
mkdir umtskeeper
cd umtskeeper/
wget http://mintakaconciencia.net/square/umtskeeper/src/umtskeeper.tar.gz
tar xvf umtskeeper.tar.gz
Оба включены в пакет umtskeeper, устанавливаемый из tarball:
sudo apt install usb-modeswitch ppp
Дополнительные пакеты:
sudo ./sakig3G --interactive
Интерактивная настройка Sakis3G (интерфейс зависит от типа терминала). В SSH-терминале: Выбрать 1. Connect with 3G , затем 3. Custom tty…
, указать /dev/ttyUSB3 для CUSTOM_TTY.
Автоопределение APN (HOLOGRAM) прошло успешно. Для APN_USER и APN_PASS (не требуются Hologram) введено 0. Sakis3G подключился.
В главном меню доступна Connection Information с деталями.
После отключения и выхода запускается umtskeeper с аналогичными параметрами:
sudo ./umtskeeper --sakisoperators "OTHER='CUSTOM_TTY' CUSTOM_TTY='/dev/ttyUSB3' APN='CUSTOM_APN' CUSTOM_APN='HOLOGRAM' APN_USER='0' APN_PASS='0'" --sakisswitches "--sudo --console" --devicename 'Quectel' --log --nat 'no'
Первоначальный вывод содержит ошибку «no modem connected»:
2018-02-11 08:01:32 Start: ver. 2.07 20151004; PID = 5259; Python v. 2.7.13
stats period = 8s, connection check period = 32s
Internet status:
Cell network: No modem plugged or modem not set up.
2018-02-11 08:01:32 Sending SIGTERM signal to running program instance with PID=31984.
2018-02-11 08:01:32 Found version 1.xx statfile, converting to new format.
Reading main stats file returned an error: "name 'currHour' is not defined".
Main stats file is incomplete. This happens in rare cases when UMTSkeeper is killed in the wrong moment. Trying to load backup file. This can cause slight inacurracies in the stati.
stats period = 8s, connection check period = 32s
2018-02-11 08:01:40 Program startup. Calling Sakis3G connect, to be sure...
Sakis3G cmdLine: nice /home/pi/umtskeeper/sakis3g connect --sudo --console OTHER='CUSTOM_TTY' CUSTOM_TTY='/dev/ttyUSB3' APN='CUSTOM_APN' CUSTOM_APN='HOLOGRAM' APN_USER='0' APN_PASS'
Sakis3G says...
UC20 connected to Hologram (52000).
2018-02-11 08:01:49 Testing connection...
2018-02-11 08:01:57 Success... we are online!
Через некоторое время подключение устанавливается. Статус интернета:
Internet status:
Network link status on ppp0: unknown
Cell network: Connected.
Способ 2: Скрипт PPP Creator
В качестве альтернативы (при неудаче первого способа) использован скрипт ppp-creator.sh от Sixfab для их щита RPi 3G/4G (тоже на Quectel).
Загрузка и выполнение скрипта на Raspberry Pi:
wget https://raw.githubusercontent.com/sixfab/rpiShields/master/tutorials/tutorial3/ppp-creator.sh
chmod +x ppp-creator
sudo ./ppp-creator.sh HOLOGRAM ttyUSB3
Установка соединения командой:
sudo pppd call gprs
pppd options in effect:
debug # (from /etc/ppp/peers/gprs)
nodetach # (from /etc/ppp/peers/gprs)
dump # (from /etc/ppp/peers/gprs)
noauth # (from /etc/ppp/peers/gprs)
remotename 3gppp # (from /etc/ppp/peers/gprs)
/dev/ttyUSB3 # (from /etc/ppp/peers/gprs)
115200 # (from /etc/ppp/peers/gprs)
lock # (from /etc/ppp/peers/gprs)
connect chat -s -v -f /etc/chatscripts/quectel-chat-connect -T HOLOGRAM # (from /etc/ppp/peers/gprs)
disconnect chat -s -v -f /etc/chatscripts/quectel-chat-disconnect # (from /etc/ppp/peers/gprs)
nocrtscts # (from /etc/ppp/peers/gprs)
modem # (from /etc/ppp/peers/gprs)
asyncmap 0 # (from /etc/ppp/options)
lcp-echo-failure 4 # (from /etc/ppp/options)
lcp-echo-interval 30 # (from /etc/ppp/options)
hide-password # (from /etc/ppp/peers/gprs)
novj # (from /etc/ppp/peers/gprs)
novjccomp # (from /etc/ppp/peers/gprs)
ipcp-accept-local # (from /etc/ppp/peers/gprs)
ipcp-accept-remote # (from /etc/ppp/peers/gprs)
ipparam 3gppp # (from /etc/ppp/peers/gprs)
noipdefault # (from /etc/ppp/peers/gprs)
ipcp-max-failure 30 # (from /etc/ppp/peers/gprs)
defaultroute # (from /etc/ppp/peers/gprs)
usepeerdns # (from /etc/ppp/peers/gprs)
noccp # (from /etc/ppp/peers/gprs)
noipx # (from /etc/ppp/options)
abort on (BUSY)
abort on (NO CARRIER)
abort on (NO DIALTONE)
abort on (ERROR)
abort on (NO ANSWER)
timeout set to 30 seconds
send (AT^M)
expect (OK)
AT^M^M
OK
-- got it
send (ATE0^M)
expect (OK)
^M
ATE0^M^M
OK
-- got it
send (ATI;+CSUB;+CSQ;+CPIN?;+COPS?;+CGREG?;&D2^M)
expect (OK)
^M
^M
Quectel^M
UC20^M
Revision: UC20GQBR03A14E1G^M
^M
SubEdition: V01^M
^M
+CSQ: 21,99^M
^M
+CPIN: READY^M
^M
+COPS: 0,0,"True Move Hologram",6^M
^M
+CGREG: 0,5^M
^M
OK
-- got it
send (AT+CGDCONT=1,"IP","HOLOGRAM",,0,0^M)
expect (OK)
^M
^M
OK
-- got it
send (ATD*99#^M)
expect (CONNECT)
^M
^M
CONNECT
-- got it
Script chat -s -v -f /etc/chatscripts/quectel-chat-connect -T HOLOGRAM finished (pid 8861), status = 0x0
Serial connection established.
using channel 1
Using interface ppp0
Connect: ppp0 <--> /dev/ttyUSB3
sent [LCP ConfReq id=0x1 <asyncmap 0x0> <magic 0x10623c2f> <pcomp> <accomp>]
rcvd [LCP ConfReq id=0x0 <asyncmap 0x0> <auth pap> <magic 0x73462b62> <pcomp> <accomp>]
No auth is possible
sent [LCP ConfRej id=0x0 <auth pap>]
rcvd [LCP ConfAck id=0x1 <asyncmap 0x0> <magic 0x10623c2f> <pcomp> <accomp>]
rcvd [LCP ConfReq id=0x1 <asyncmap 0x0> <magic 0x73462b62> <pcomp> <accomp>]
sent [LCP ConfAck id=0x1 <asyncmap 0x0> <magic 0x73462b62> <pcomp> <accomp>]
sent [LCP EchoReq id=0x0 magic=0x10623c2f]
sent [IPCP ConfReq id=0x1 <addr 0.0.0.0> <ms-dns1 0.0.0.0> <ms-dns2 0.0.0.0>]
rcvd [LCP DiscReq id=0x2 magic=0x73462b62]
rcvd [LCP EchoRep id=0x0 magic=0x73462b62 10 62 3c 2f]
rcvd [proto=0x3] 01 00 04
Unsupported protocol 0x3 received
sent [LCP ProtRej id=0x2 00 03 01 00 04]
rcvd [IPCP ConfReq id=0x0]
sent [IPCP ConfNak id=0x0 <addr 0.0.0.0>]
rcvd [IPCP ConfNak id=0x1 <addr 10.170.40.106> <ms-dns1 212.9.0.135> <ms-dns2 212.9.0.136>]
sent [IPCP ConfReq id=0x2 <addr 10.170.40.106> <ms-dns1 212.9.0.135> <ms-dns2 212.9.0.136>]
rcvd [IPCP ConfReq id=0x1]
sent [IPCP ConfAck id=0x1]
rcvd [IPCP ConfAck id=0x2 <addr 10.170.40.106> <ms-dns1 212.9.0.135> <ms-dns2 212.9.0.136>]
Could not determine remote IP address: defaulting to 10.64.64.64
not replacing default route to eth0 [192.168.0.1]
local IP address 10.170.40.106
remote IP address 10.64.64.64
primary DNS address 212.9.0.135
secondary DNS address 212.9.0.136
Script /etc/ppp/ip-up started (pid 8869)
Script /etc/ppp/ip-up finished (pid 8869), status = 0x0
Подключение успешно. Скрипт требует корректировки при необходимости указания логина/пароля APN.
Тестирование подключения
При использовании любого способа проверяется статус ppp0:
ifconfig ppp0
ppp0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1500
inet 10.170.40.106 netmask 255.255.255.255 destination 10.64.64.64
ppp txqueuelen 3 (Point-to-Point Protocol)
RX packets 5 bytes 55 (55.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 4 bytes 58 (58.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Тест выполнен при активном Ethernet. После его отключения скрипт запущен в фоне:
sudo ifconfig eth0 down
sudo pppd call gprs &
Подтверждение активного подключения ppp0:
ifconfig
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1 (Local Loopback)
RX packets 22986 bytes 7354748 (7.0 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 22986 bytes 7354748 (7.0 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ppp0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1500
inet 10.170.40.106 netmask 255.255.255.255 destination 10.64.64.64
ppp txqueuelen 3 (Point-to-Point Protocol)
RX packets 26 bytes 2892 (2.8 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 25 bytes 1659 (1.6 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
wwan0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
ether da:4d:8c:1e:d0:81 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3 bytes 270 (270.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Проверка исходящего трафика ping:
ping cnx-software.com
PING cnx-software.com (104.28.18.95) 56(84) bytes of data.
64 bytes from 104.28.18.95: icmp_seq=1 ttl=52 time=601 ms
64 bytes from 104.28.18.95: icmp_seq=2 ttl=52 time=558 ms
64 bytes from 104.28.18.95: icmp_seq=3 ttl=52 time=555 ms
64 bytes from 104.28.18.95: icmp_seq=4 ttl=52 time=605 ms
ping google.com
PING google.com (216.58.208.238) 56(84) bytes of data.
64 bytes from par10s22-in-f14.1e100.net (216.58.208.238): icmp_seq=1 ttl=49 tims
64 bytes from par10s22-in-f14.1e100.net (216.58.208.238): icmp_seq=2 ttl=49 tims
64 bytes from par10s22-in-f14.1e100.net (216.58.208.238): icmp_seq=3 ttl=49 tims
Успешно. Попытка SSH-подключения:
ssh pi@10.170.40.106
Завершилась ошибкой (возможно, из-за локального IP 10.170.40.106 и удаленного 10.64.64.64, как указано в логе pppd call gprs).
SSH-туннелирование с SIM-картой Hologram
Для доступа по SSH через 3G/4G Hologram требуется настройка туннелирования (через SpaceBridge или CLI), описанная на соответствующей странице Hologram .
Использован SpaceBridge. Клиент скачивается для Windows/Linux/macOS. Действия для Ubuntu 16.04:
wget http://downloads.hologram.io/spacebridge/spacebridge-0.4.2-x86_64-pc-linux-gnu.tar.bz2
tar xvf spacebridge-0.4.2-x86_64-pc-linux-gnu.tar.bz2
cd spacebridge-0.4.2-x86_64-pc-linux-gnu/bin
./spacebridge
Включение туннелирования для устройства в панели Hologram и генерация API-ключа в личном кабинете .
После выбора устройств указан порт Raspberry Pi (например, 22 для SSH) и локальный порт для доступа.

Нажатие Done активирует туннель через несколько секунд.
Подключение по SSH:
ssh -p 5000 pi@127.0.0.1
Дополнительно получены GPS-координаты через cgps.
Остановка подключения, запущенного через pppd call gprs:
sudo kill 10678
Terminating on signal 15
Connect time 3.4 minutes.
Sent 5885 bytes, received 6313 bytes.
Script /etc/ppp/ip-down started (pid 10828)
sent [LCP TermReq id=0x3 "User request"]
pi@raspberrypi:~$ rcvd [LCP TermAck id=0x3]
Connection terminated.
abort on (ERROR)
abort on (NO DIALTONE)
unterminated quote (line 4)
Script chat -s -v -f /etc/chatscripts/quectel-chat-disconnect finished (pid 1081
disconnect script failed
Script /etc/ppp/ip-down finished (pid 10828), status = 0x0
В рабочих проектах управление подключением осуществляется через initd или systemd.
Благодарность Venus Supply / ThaiEasyElec за предоставленный образец. Плата доступна за 2350 THB (~$75) , антенна GSM/3G — за 120 THB (~$4) , антенна GNSS — за 350 THB (~$12) .
Выражаем свою благодарность источнику, с которого взята и переведена статья, сайту cnx-software.com.
Оригинал статьи вы можете прочитать здесь.