Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Диплом Орлова ГА2.doc
Скачиваний:
53
Добавлен:
02.04.2015
Размер:
12.2 Mб
Скачать

2.2.2 Senseit gt13

Рис 18. SENSEIT GT13

SENSEIT GT13 позволит вам обеспечить непрерывный on-line мониторинг перемещения ваших близких, а также, при необходимости, контроль их входа и выхода из заданной вами геозоны.

Использование SENSEIT GT13 будет комфортным для ваших близких — трекер имеет компактный размер и весит всего 57,5  гр. А наличие кнопки SOS обеспечит им дополнительную безопасность: при срабатывании кнопки координаты местоположения объекта передаются на зарегистрированный адрес электронной почты.

Всем владельцам SENSEIT GT13 предоставляется право бесплатного использования поддерживающей трекер системы мониторинга MobiTrack в течение года.

Таблица 1. Сравнение 2-х устройств

2.3 Создание печатной платы и создание программы.

2.3.1 Разработка печатной платы в Sprint-Layout 5

Рис. 19 Первый слой платы дляSim900D

Рис. 20 Второй слой платы дляSim900D

Рис. 20 Плата дляGPS приемника Quectel L10

Рис. 21 Плата дляSTM32f100c4t6

2.3.2 Создание управляющей программы для контроллера.

Создание программы происходит в Coocox CoIDE, почитав многие популярные сайты, я решил по отзывам да и по наитию, установить данную программу, которая сама сделана на эклипсе. CoIDE имеет большое количество библиотек, которые можно подключить для любого контроллера который он может поддержать. Можно к нему привязать программу для заливки прошивки в микроконтроллер, а не все время запускать по отдельности программ.

Рис. 22 Создание проекта

Рис. 23 Выбор чип или отладочная плата

Рис. 24 Выбор производителя, серии и модели чипа

Рис. 25 Подключение библиотек для каждого интерфейса

Рис. 26 Создание программы

Рис. 27 Прошивка STM32F100 через интегрированный программатор ST-Link

Рис. 28 Сбор программы

Рис. 29 Отладка программы

2.4. Структурная схема устройства

Рис. 30 Структурная схема трекера

3. Специальный раздел

3.1. Алгоритм работы трекера

3.2. Схемотехника трекера

3.3. Код программы

#include "gprs.h"

#include "ch.h"

#include "hal.h"

#include <string.h>

#include "util.h"

#include "led.h"

#define GPRS_CMD_BUF 256

#define ATZ_RETRY 5

#define CMD_WAIT_TIME 250

#define GPRS_SERIAL SD2

SerialConfig SD2_Config = {

.sc_speed = 115200,

.sc_cr2 = USART_CR2_STOP1_BITS,

.sc_cr3 = USART_CR3_RTSE | USART_CR3_CTSE

};

uint8_t *gprs_data = NULL;

static WORKING_AREA(waGPRSThread, 256);

static msg_t GPRSThread(void *arg) {

(void)arg;

if (gprs_data != NULL) {

chHeapFree(gprs_data);

}

gprs_data = chHeapAlloc(NULL, GPRS_CMD_BUF);

size_t gprs_bytes_read;

uint16_t signal_level;

uint16_t i;

char num_buf[16];

uint8_t num_len;

chRegSetThreadName("gprs_thread");

if (gprs_data == NULL) {

while (TRUE) {

//palTogglePad(GPIO_LED_1_PORT, GPIO_LED_1_PIN);

chThdSleepMilliseconds(50);

}

}

sdStart(&GPRS_SERIAL, &SD2_Config);

palSetPadMode(GPRS_USART_PORT, GPRS_USART_TX_PIN, PAL_MODE_ALTERNATE(7));

palSetPadMode(GPRS_USART_PORT, GPRS_USART_RX_PIN, PAL_MODE_ALTERNATE(7));

palSetPadMode(GPRS_USART_PORT, GPRS_USART_CTS_PIN, PAL_MODE_ALTERNATE(7));

palSetPadMode(GPRS_USART_PORT, GPRS_USART_RTS_PIN, PAL_MODE_ALTERNATE(7));

palSetPadMode(GPIO_GPRS_PWR_BAT_PORT, GPIO_GPRS_PWR_BAT_PIN, PAL_MODE_OUTPUT_PUSHPULL);

palSetPadMode(GPIO_GPRS_RESET_PORT, GPIO_GPRS_RESET_PIN, PAL_MODE_OUTPUT_OPENDRAIN);

// Turn on GPRS power

palClearPad(GPIO_GPRS_PWR_BAT_PORT, GPIO_GPRS_PWR_BAT_PIN);

chThdSleepSeconds(5);

while (TRUE) {

//palTogglePad(GPIO_LED_1_PORT, GPIO_LED_1_PIN);

if (init_modem() == E_OK)

break;

}

set_led_0_prescaler(5);

uint8_t counter = 0;

while (TRUE) {

counter++;

if (counter == 10) {

counter = 0;

send_tcp_message();

}

//palTogglePad(GPIO_LED_1_PORT, GPIO_LED_1_PIN);

if (is_gprs_network_ok() == TRUE) {

//sdWrite(&SD1, "NETWORK REGISTERED", sizeof("NETWORK REGISTERED") - 1);

} else {

//sdWrite(&SD1, "NO NETWORK", sizeof("NO NETWORK") - 1);

}

chThdSleepMilliseconds(100);

if (gprs_get_signal_level(&signal_level) == E_OK) {

/* sdWrite(&SD1, "SIGNAL LEVEL: ", sizeof("SIGNAL LEVEL: ") - 1);

stoa(signal_level, num_buf, &num_len);

sdWrite(&SD1, num_buf, num_len - 1);

sdWrite(&SD1, "\r\n", sizeof("\r\n") - 1);*/

} else {

//sdWrite(&SD1, "SIGNAL LEVEL: ERR\r\n", sizeof("SIGNAL LEVEL: ERR\r\n") - 1);

}

chThdSleepMilliseconds(1000);

}

chHeapFree(gprs_data);

}

uint8_t init_modem() {

uint16_t i;

uint16_t bytes_read;

for (i = 0; i < ATZ_RETRY; i++) {

sdWrite(&GPRS_SERIAL, "ATE0\r\n", sizeof("ATE0\r\n"));

chThdSleepMilliseconds(200);

if (gprs_cmd("ATZ\r\n", sizeof("ATZ\r\n") - 1, "\r\nOK\r\n", sizeof("\r\nOK\r\n") - 1) == E_OK)

break;

chThdSleepMilliseconds(500);

}

if (i >= ATZ_RETRY)

return E_NOT_RESPONDING;

return E_OK;

}

uint8_t gprs_cmd(char * cmd_str, uint16_t cmd_len, char * answer_str, uint16_t answer_len) {

uint16_t bytes_read;

// Flush buffer

sdAsynchronousRead(&GPRS_SERIAL, gprs_data, GPRS_CMD_BUF);

sdWrite(&GPRS_SERIAL, cmd_str, cmd_len);

chThdSleepMilliseconds(CMD_WAIT_TIME);

if (answer_str == NULL) {

return E_OK;

}

bytes_read = sdAsynchronousRead(&GPRS_SERIAL, gprs_data, answer_len);

if (bytes_read == answer_len) {

if (strncmp(gprs_data, answer_str, bytes_read) == 0) {

return E_OK;

}

}

return E_INVALID_ANSWER;

}

uint8_t gprs_cmd_read(char * cmd_str, uint16_t cmd_len, uint16_t *answer_len) {

uint16_t bytes_read;

sdWrite(&GPRS_SERIAL, "ATE0\r\n", sizeof("ATE0\r\n"));

chThdSleepMilliseconds(200);

// Flush buffer

sdAsynchronousRead(&GPRS_SERIAL, gprs_data, GPRS_CMD_BUF);

sdWrite(&GPRS_SERIAL, cmd_str, cmd_len);

chThdSleepMilliseconds(1000);

bytes_read = sdAsynchronousRead(&GPRS_SERIAL, gprs_data, GPRS_CMD_BUF);

*answer_len = bytes_read;

if (bytes_read == 0)

return E_NOT_RESPONDING;

return E_OK;

}

uint8_t gprs_get_signal_level(uint16_t *signalLevel) {

uint16_t bytes_read;

char signalLevelStr[3] = {0, 0, 0};

if (gprs_cmd_read("AT+CSQ\r\n", sizeof("AT+CSQ\r\n") - 1, &bytes_read) != E_OK) {

return E_NOT_RESPONDING;

}

if (bytes_read < 13)

return E_INVALID_ANSWER;

if (strncmp(gprs_data, "\r\n+CSQ:", sizeof("\r\n+CSQ:") - 1) != 0) {

return E_INVALID_ANSWER;

}

signalLevelStr[0] = gprs_data[8];

if (gprs_data[9] != ',')

signalLevelStr[1] = gprs_data[9];

*signalLevel = atos(signalLevelStr);

return E_OK;

}

void init_gprs() {

// GPRS Thread

chThdCreateStatic(waGPRSThread, sizeof(waGPRSThread), NORMALPRIO, GPRSThread, NULL);

}

uint8_t is_gprs_network_ok() {

sdWrite(&GPRS_SERIAL, "ATE0\r\n", sizeof("ATE0\r\n"));

chThdSleepMilliseconds(200);

if (gprs_cmd("AT+CREG?\r\n", sizeof("AT+CREG?\r\n") - 1, "\r\n+CREG 0,1\r\n", sizeof("\r\n+CREG 0,1\r\n") - 1) == E_OK)

return TRUE;

return FALSE;

}

uint8_t send_tcp_message() {

uint16_t bytes_read;

uint8_t i;

if (is_gprs_network_ok() != TRUE) {

// return E_NO_NETWORK;

}

chThdSleepMilliseconds(100);

// Enable embedded TCP/IP stack

gprs_cmd("AT+WIPCFG=1\r\n", sizeof("AT+WIPCFG=1\r\n") - 1, NULL, 0);

chThdSleepMilliseconds(250);

sdAsynchronousRead(&GPRS_SERIAL, gprs_data, GPRS_CMD_BUF);

// Open GPRS bearer

gprs_cmd("AT+WIPBR=1,6\r\n", sizeof("AT+WIPBR=1,6\r\n") - 1, NULL, 0);

chThdSleepMilliseconds(250);

sdAsynchronousRead(&GPRS_SERIAL, gprs_data, GPRS_CMD_BUF);

// Set GPRS AP

gprs_cmd("AT+WIPBR=2,6,11,\"internet\"\r\n", sizeof("AT+WIPBR=2,6,11,\"internet\"\r\n") - 1, NULL, 0);

chThdSleepMilliseconds(250);

sdAsynchronousRead(&GPRS_SERIAL, gprs_data, GPRS_CMD_BUF);

// Connect to GPRS

gprs_cmd("AT+WIPBR=4,6,0\r\n", sizeof("AT+WIPBR=4,6,0\r\n") - 1, NULL, 0);

chThdSleepSeconds(3);

bytes_read = sdAsynchronousRead(&GPRS_SERIAL, gprs_data, GPRS_CMD_BUF);

if (bytes_read > 0) {

if (strncmp(gprs_data, "\r\nOK", sizeof("\r\nOK") - 1) != 0) {

//return E_GPRS_CONNECT_ERROR;

}

} else {

//return E_GPRS_CONNECT_ERROR;

}

// Establish connection

gprs_cmd("AT+WIPCREATE=2,1,\"195.209.231.43\",5555\r\n", sizeof("AT+WIPCREATE=2,1,\"195.209.231.43\",5555\r\n") - 1, NULL, 0);

chThdSleepSeconds(1);

gprs_cmd("AT+WIPDATA=2,1,1\r\n", sizeof("AT+WIPDATA=2,1,1\r\n") - 1, NULL, 0);

chThdSleepSeconds(3);

gprs_cmd("Hello from wismo!\r\n", sizeof("Hello from wismo!\r\n") - 1, NULL, 0);

chThdSleepMilliseconds(250);

gprs_cmd("+++", sizeof("+++") - 1, NULL, 0);

chThdSleepMilliseconds(250);

}