SMS GPS-трекер из Neoway M590 and ublox NEO-6 часть 2. Сборка и программирование



In English

Часть 1 ЗДЕСЬ.

Это продолжение моей серии постов о GSM / GPRS модуле Neoway M590:
  1. Neoway M590 GPRS Tutorial: sending and receiving files from/to SD card
  2. Application of Neoway M590: remote control for garage heater
  3. SMS GPS-трекер из Neoway M590 and ublox NEO-6 часть 1. Собираем детали и тестим

Ссылки на даташиты по используемому оборудованию:

Принципиальная схема и сборка


Схема трекера (ССЫЛКА НА PDF) довольно проста. Последовательный порт модуля GPS подключается к аппаратному UART меги из-за нужды библиотеки NeoGPS в быстром и надежном последовательном порту, что очевидно из документации к ней. Модуль M590 подключен к второму по скорости последовательному порту: AltSoftSerial на пинах D8 и D9.

Соотвествие пинов Arduino физическим ножкам микросхемы было определено из этого полезного рисунка:



Как вы, возможно, заметили, на схеме появилась новая ножка на модуле Neoway M590 - DTR. Эта нога используется для перевода GSM-модуля в спящий режим. Потребление тока в режиме сна сокращается в десять раз, так что это нам точно нужно.

К сожалению, моя платка с модемом не выводит DTR на штыревой разъем. Придется внести некоторые изменения:


Следующим логичным шагом будет включить паяльник и порыться по мастерской в поисках кусочка макетной платы.

Мой девайс выполнен в форм-факторе "сэндвич". Такой стиль, как мне показалось,  приведет к самой компактной сборке. Платы расположены как 3 слоя: верхний (нижний на самом деле, первое фото перевернуто) занят модулем Neoway M590 с его огромным фильтрующим конденсатором, середина - ATMega и всей самодельной схемой, и нижний (верхний, то есть) с GPS-модулем и обеими антеннами (поэтому этот слой я и считаю верхним, антенны располагаются в верхней части устройства).

Вот пара фото трекера в процессе сборки:

Вот и "сендвич".
Рим не один день строился, начинаем с малого
Дорожки сделаны из сердцевины цельного провода - ни одна не порвется и не отвалится, как могут провода.
Зарядка добавлена как дополнительный слой между верхним и средним.
Готово! На этом фото явно видно, как З/У припаяно к плате. И то как я кривовато слепил все двусторонним скотчем.
Выключатель питания укромно спрятан между слоями, чтобы избежать случайного переключения.
Обе антенны сверху.
Послойный вид готового устройства сбоку
То же, спереди

После включения устройства ничего не должно нагреться и дымиться. Если что-то все же дымится или нагревается, еще раз проверьте все соединения и повторите попытку. Как только оборудование работает, можно перейти к кодингу...

Готовое устройство

Программирование

Выбор ATMega328 не был случайным, я специально выбрал ее для упрощения процесса программирования при помощи Arduino.

Берем программатор и подключаем к 6-контактному разъему для программирования.
Вот такой программатор я использую (ссылки на переходник и программатор):

Программатор USBASP + переходник с 10 на 6 контактов.

Запустим Arduino IDE попробуем загрузить любой пример кода чтобы проверить соединения и чип: выбираем целевую платформу и программатор и щелкаем "Загрузить при помощи программатора" (в большинстве ОС это Ctrl+Shift+U).

Выбираем напряжение и тактовую частоту
Выбираем прогамматор

Так просто это лично у меня не получилось (ничего никогда не работает из коробки, блин!).

Вот так мы будет дебажить нашу загрузку кода. Лично у меня всегда стоит эта галочка.

Отмечаем в настройках Arduino IDE режим детального вывода информации при загрузки, и видим следующее:



После пары часов ковыряния Гугла я нашел основную причину ошибки. Очевидно, чипы ATMega328P на заводе прошиваются на использование внутреннего генератора 1 МГц. Это слишком медленно, чтобы запрограммировать их с помощью USBASP с настройками, с которыми IDE вызывает его.

Первая мысль, которая пришла ко мне после выяснения этого была: «Ну отлично, почему оно не работает я знаю, но как теперь проверить, что чип не дохлый?»

Для этого нам понадобится avrdude. Выполним эту строку, чтобы проверить соединение с чипом без каких-либо изменений в прошивке (найдено на stackexchange):



Если это работает, то наша ATMega работает и программируется. Теперь вот что надо сделать чтобы обойти медленный внутренний тактовый генератор: во-первых, создадим новую «медленную» версию программатора USBASP для Arduino IDE. Современные версии IDE запихивают конфигурационные файлы далеко в  папку пользователя (Для Windows будет что-то вроде  C:\Users\Пользователь\AppData\Local\Arduino15\packages\arduino\hardware\avr\Версия)

Пришлось покопаться на жестком диске чтобы их найти...
Вот ссылка на полезный мануал по настройке Arduino IDE. Согласно этому документу, вставим эти строки в programmers.txt после секции с USBASP:



Перезапускаем Arduino IDE, выбираем программатор 'Slow USBASP' и пробуем загрузить снова... Работает! Скетч Blink.hex грузится, хотя частота мигания кажется... низковатой. В 8 раз медленне чем надо, если быть точным. Почему? Смотрим в лог загрузки... Ага! Фьюзы совершенно неправильные!



> avrdude: safemode: Fuses OK (E:FF, H:D9, L:62).
По-моему совсем не OK. Почему-то несмотря на то, что настройки фьюзов указаны для каждой платы в файле board.txt, IDE не прожигает правильные фьюзы даже если они неверные. Фьюзы прожигаются только при записи загрузчика, а мне он не нужен.

AVRDude просто нуждается в небольшом толчке в правильном направлении, чтобы прожечь правильные фьюз биты. Просто оставим Arduino IDE открытым (чтобы Blink.hex не удалился), скопируем команду, которая загружает Blink.hex и запустим ее в консоли с небольшим дополнением в конце:



Это должно решить проблему с аномальной скоростью чипа! Теперь можно переключиться на обычную конфигурацию USBASP в среде Arduino, поскольку теперь AVR работает на частоте 8 МГц.

Скетч Arduino

Вот финальный код для отправления GPS-координаты (а также опционально даты и времени GPS и баланса SIM-карты) в ответ на звонок (без энергосберегающих режимов). Вам нужно будет установить библиотеки AltSoftSerial и NeoGPS, чтобы все заработало:



Пришлось обойти один сильный недостаток библиотеки AltSoftSerial, а именно тот факт что все функции которые зависят от Timer0 перестают работать - delay() and millis(). Чтобы заново получить функцию задержки выполнения кода на определенное время, я использую функцию setTimeout() у объекта Serial, оттуда и взялась функция newDelay().

Тот же самый скетч с энергосбережением скоро появится чуть ниже... Пока что можно использовать верхний скетч, чтобы получать координаты трекера в виде ссылки на Google Maps в ответ на Ваш звонок. Просто этот скетч будет быстро разряжать батарею.

ОБНОВЛЕНИЕ 4 июля 2017

Код ниже отправляет вам те же данные, что и предыдущий, только теперь он использует режимы энергосбережения для AVR и Neoway M590. Дополнительно понадобится установить библиотеку LowPower. ATMega и GSM-модем проводят большую часть времени в режиме энергосбережения, пока кто-то не позвонит или не отправит СМС.



Теперь, чтобы еще больше экономить заряд аккумулятора, можно отсоединить светодиодный индикатор питания на плате Neoway M590. Теперь мы экономим дополнительные 20 мА, что очень даже приятно!

Comments