- •Министерство образования и науки Российской Федерации
- •2013 Год
- •Введение.
- •Особенные характеристики
- •Использование gps-трекеров
- •1. Технологический раздел
- •1.1.3 ПротоколNmea0183
- •1.1.4 Устройство трекера
- •1.1.5 Стек протоколов tcp/ip
- •1.1.6 Ат -команды
- •1.2 Модуль связиGsm/gprsSim900d
- •1.3 Приёмник местоположенияGpsQuectelL10
- •1.4 МикроконтроллерStm32f100c4t6.
- •1.5 Среда разработки для микроконтроллераStm32f100CooCoxCoIde.
- •1.6 Отладочное устройство stm32f4 Discovery
- •1.7 Импульсный стабилизатор напряжения на lm2596t-3.3 с напряжением 3.3 вольт и максимальным током 3 а .
- •1.8 Программа по проектированию плат и схем, DipTrace
- •Возможности и функции DipTrace Интуитивно-понятный пользовательский интерфейс
- •Эффективные возможности трассировки
- •Всесторонняя проверка проекта
- •3D предпросмотр платы
- •2.2.2 Senseit gt13
- •2.3 Создание печатной платы и создание программы.
- •2.3.1 Разработка печатной платы в Sprint-Layout 5
- •2.3.2 Создание управляющей программы для контроллера.
- •2.4. Структурная схема устройства
- •4. Организационно-экономический раздел
- •5. Безопасность Жизнедеятельности
- •5.1 Область и порядок применения правил
- •5.2 Требования к техническому процессу, устройству и оборудованию производственных помещений и рабочих мест
- •5.3 Требования к вентиляции
- •5.4 Требования к санитарно-бытовым, вспомогательным помещениям и средствам индивидуальной профилактики
- •5.5 Требования к содержанию и уборке помещений
- •5.6 Медико-профилактическое обслуживание рабочих
- •Заключение
- •Список литературы
- •Список Интернет источников
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);
}