Trải nghiệm với modem GSM SIM900

Có thể được sử dụng trong các thiết bị cần liên lạc khoảng cách xa. Ví dụ: một người điều khiển robot ở Moscow khi đang ngồi ở Krasnodar! Hoặc một người nông dân bật máy bơm nước trên cánh đồng lúa cách nhà mình, cách cánh đồng vài km! Có một số tùy chọn để liên lạc với thiết bị:

Giao tiếp đơn giản dựa trên tin nhắn SMS:
Bật/tắt thiết bị bằng các lệnh SMS đơn giản. Bạn có thể sử dụng bất kỳ thiết bị nào để điều khiển thiết bị. điện thoại di động.
Hệ thống báo cháy/an ninh thông báo cho chủ sở hữu về khẩn cấp trong nhà qua tin nhắn SMS.

Giao tiếp dựa trên cuộc gọi:
Chuông báo trộm/cháy thông minh gọi cảnh sát hoặc sở cứu hỏa và báo cáo trường hợp khẩn cấp bằng tin nhắn thoại được ghi sẵn.

Truyền thông sử dụng Internet (GPRS):
Người dùng có thể điều khiển thiết bị từ bất kỳ PC/máy tính bảng/điện thoại di động nào được kết nối Internet. Ví dụ: màn hình thông tin lắp đặt trên đường cao tốc được điều khiển từ phòng điều khiển trung tâm.
Robot được điều khiển qua Internet. Một robot như vậy có thể truy cập được từ bất kỳ thiết bị nào được kết nối Internet từ mọi nơi trên thế giới.
Các thiết bị di động được cài đặt trong xe cộ, kết nối với Internet bằng mô-đun GPRS SIM300 và thêm vị trí hiện tại (với sử dụng GPS(Hệ thống vị trí toàn cầu, Hệ thống toàn cầuĐịnh vị)) đến máy chủ. Dữ liệu này được lưu từ cơ sở dữ liệu trên máy chủ cùng với ID xe. Để xem lộ trình của xe, bạn có thể kết nối với máy chủ từ máy tính bằng cách sử dụng toàn thế giới Web (Mạng toàn cầu).

Lợi ích của việc sử dụng mô-đun SIM300

Bộ SIM300 hoàn toàn mô-đun độc lập với đầu nối thẻ SIM, nguồn điện, v.v. Mô-đun này có thể dễ dàng giao tiếp với các bộ vi điều khiển AVR/PIC/8051 chi phí thấp. Giao tiếp với vi điều khiển được thực hiện thông qua một cơ chế không đồng bộ cổng nối tiếp. Đây là loại giao tiếp nối tiếp cơ bản được hầu hết các bộ vi điều khiển hỗ trợ trong phần cứng. Dữ liệu được truyền từng bit và được thu thập thành byte. TRÊN cấp độ cao nó trông giống như một dòng văn bản đơn giản. Tổng cộng có hai luồng: một từ bộ vi điều khiển đến SIM300 và một từ SIM300 đến vi điều khiển. Các lệnh được gửi dưới dạng văn bản thuần túy.

Nếu bạn chưa bao giờ sử dụng truyền dữ liệu nối tiếp hoặc nghe nói về nó thì nên hiểu cách thức hoạt động của nó và thực hành với các ví dụ đơn giản hơn.

Giao tiếp với mô-đun SIM300 bằng AVR UART

Phần cứng của bộ vi điều khiển được sử dụng cho giao tiếp nối tiếp được gọi là UART và chúng tôi sử dụng nó để giao tiếp với mô-đun SIM300 (Nó cũng có thể được sử dụng để giao tiếp với các thiết bị khác như đầu đọc RFID, mô-đun GPS, máy quét dấu vân tay, v.v.). UART là một phương thức giao tiếp rất phổ biến trong thế giới điện tử, chúng tôi đã viết một thư viện rõ ràng và đơn giản cho nó mà chúng tôi sử dụng trong tất cả các dự án sử dụng UART.

Vì một byte từ SIM300 có thể đến bộ vi điều khiển bất cứ lúc nào, điều gì sẽ xảy ra nếu bộ vi điều khiển đang bận việc khác? Để giải quyết vấn đề này, chúng tôi đã triển khai tính năng đệm dữ liệu đến dựa trên ngắt. Bộ đệm đang ở trong bộ nhớ truy cập tạm thời vi điều khiển. Nó có chức năng cho phép bạn xác định số byte trong hàng đợi.

Dưới đây là các chức năng của thư viện AVR USART:

void USARTInit(uint16_t ubrrvalue)

Đang khởi tạo phần cứng AVR USART. Giá trị tham số giá trị urrr tốc độ truyền dữ liệu mong muốn được thiết lập. Tốc độ dữ liệu mặc định cho SIM300: 9600 bps. Vì vi điều khiển AVR hoạt động ở giá trị 16 MHz giá trị urrr với tốc độ như vậy thì phải có 103 .

char UReadData()

Đọc một ký tự từ hàng đợi. Nếu không có gì trong hàng đợi thì câu trả lời là 0.

void UWriteData(dữ liệu char)

Ghi một byte dữ liệu vào dòng Tx bằng hàm UWriteString().

uint8_t UDataAvailable()

Báo cáo số lượng dữ liệu trong hàng đợi FIFO.

void UWriteString(char *str)

Ghi một chuỗi kiểu C kết thúc bằng null vào dòng Tx.
Ví dụ 1: UWriteString("Xin chào thế giới!");
Ví dụ 2: tên char="Avinash!"; UWriteString(tên);

void UReadBuffer(void *buff,uint16_t len)

Sao chép nội dung của bộ đệm FIFO vào bộ nhớ được chỉ định bởi buff, lượng dữ liệu được sao chép được xác định bởi tham số len. Nếu nhận được ít dữ liệu hơn mức cần thiết (theo tham số len) qua UART vào bộ đệm FIFO, thì khoảng trống còn lại sẽ được lấp đầy bằng số không.

char gsm_buffer;
UReadBuffer(gsm_buffer,16);

Ví dụ trên sẽ đọc 16 byte dữ liệu (nếu có) từ bộ đệm FIFO vào một biến gsm_buffer. lưu ý rằng gsm_buffer một mảng 128 byte được phân bổ vì sau này chúng ta có thể cần nhiều hơn 16 byte. Do đó, bộ đệm này có thể được sử dụng để đọc tới 128 byte trong tương lai.

Hàm hiển thị ở trên thường được sử dụng cùng với UDataAvailable().

while(UDataAvailable()<16)
{
//Không làm gì cả
}

char gsm_buffer;
UReadBuffer(gsm_buffer,16);

Đoạn mã hiển thị ở trên đợi cho đến khi có 16 byte dữ liệu trong bộ đệm rồi đọc nó.

void UFlushBuffer()

Hủy bộ đệm FIFO khỏi việc chờ dữ liệu. Trước khi gửi lệnh mới đến mô-đun GSM, trước tiên hãy hủy bộ đệm FIFO đang chờ dữ liệu.

Các chức năng trên được sử dụng để gửi và nhận lệnh văn bản từ mô-đun GSM SIM300.

Bộ lệnh AT cho SIM300

Bây giờ bạn đã quen với những kiến ​​thức cơ bản về thư viện AVR USART và cách nó được sử dụng để khởi tạo USART cũng như gửi và nhận dữ liệu, đã đến lúc tìm hiểu các lệnh mô-đun SIM300 cũng như cách gửi và nhận phản hồi. SIM300 có một số chức năng: gửi tin nhắn văn bản, gọi điện, v.v. Mỗi chức năng này được thực thi sau một lệnh cụ thể và SIM300 có bộ lệnh riêng.

Tất cả các lệnh SIM300 đều bắt đầu bằng tiền tố TẠI+ Và kết thúc Vận chuyển trở lại(viết tắt là vận chuyển trở lại). Mã ASCII cho CR là 0x0D (thập phân 13). Tất cả các lệnh bạn gửi tới SIM300 sẽ được trả về trên dòng SIM300 TX. Nghĩa là, nếu bạn gửi lệnh 7 byte (bao gồm cả CR cuối cùng) thì bạn sẽ ngay lập tức nhận được 7 byte này vào bộ đệm thông qua UART. Nếu bạn không nhận được nó, điều đó có nghĩa là có gì đó không ổn!

Hàm đầu tiên chúng ta nghiên cứu sẽ là SIM300Cmd(const char *cmd), nó thực hiện như sau:

  • Viết các lệnh được chỉ định bởi tham số cmd.
  • Thêm CR sau lệnh.
  • Chờ lệnh quay trở lại và nếu nó đến trước thời gian chờ thì nó sẽ phản hồi SIM300_OK(hằng số được xác định trong sim300.h). Nếu bạn đợi quá lâu để nhận được tiền hoàn lại và tiền vẫn chưa đến, cô ấy sẽ phản hồi SIM300_TIMEOUT.

Lưu ý: Tất cả các chức năng phụ thuộc của SIM300 được lưu trữ trong tệp sim300.c. Các mẫu và hằng số được lưu trữ trong sim300.h

Làm việc với SIM300Cmd()

Int8_t SIM300Cmd(const char *cmd) ( UWriteString(cmd); // Gửi lệnh UWriteData(0x0D); //CR uint8_t len=strlen(cmd); len++; // Thêm 1 cho dấu CR được thêm vào tất cả các lệnh uint16_t i= 0; //Đợi tiếng vang trong khi(i< 10*len) { if(UDataAvailable() < len) { i++; _delay_ms(10); continue; } else { //We got an echo //Now check it UReadBuffer(sim300_buffer,len); //Read serial Data return SIM300_OK; } } return SIM300_TIMEOUT; }

Lệnh thường được theo sau bởi một phản hồi. Mẫu phản hồi là:
LF- Line Feed, mã ASCII của nó là 0x0A (10 ở dạng thập phân)

Vì vậy, trong khi chờ phản hồi sau khi gửi lệnh, ba điều có thể xảy ra:

  • Không có câu trả lời trong một thời gian dài. Nguyên nhân có thể là do SIM300 không được kết nối với vi điều khiển.
  • Đã nhận được câu trả lời, nhưng không như mong đợi. Nguyên nhân có thể là do đường nối tiếp bị lỗi, tốc độ truyền được đặt không chính xác hoặc vi điều khiển hoạt động ở tần số sai.
  • Đã nhận được câu trả lời đúng.

Ví dụ, lệnh Nhận đăng ký mạng(Đăng ký mạng) được thực hiện như sau: Chuỗi lệnh: " AT+CREG?"

Phản ứng(Trả lời): +CREG: , ĐƯỢC RỒI

Bạn thấy câu trả lời đúng là 20 byte. Tức là sau khi gửi lệnh "AT + CREG?" bạn phải đợi cho đến khi nhận được 20 byte hoặc cho đến khi một thời gian nhất định trôi qua. Điều kiện thứ hai được đáp ứng là tránh bị treo nếu SIM300 bị lỗi. Nghĩa là, thay vì chờ đợi phản hồi mãi mãi, một lỗi sẽ xuất hiện nếu SIM300 mất quá nhiều thời gian để phản hồi (điều này được gọi là hết thời gian chờ)

Nếu nhận được câu trả lời đúng, chúng tôi sẽ phân tích biến để có được thông tin về việc đăng ký trên mạng.

Tùy thuộc vào trạng thái đăng ký hiện tại trong mạng, giá trị có thể là: 0 - Chưa đăng ký, SIM300 hiện không tìm kiếm nhà mạng mới để đăng ký. 1 - Đã đăng ký trong mạng gia đình. 2 - Chưa đăng ký, SIM300 hiện đang tìm nhà mạng mới để đăng ký. 3 - Đăng ký bị từ chối. 4 - Không rõ. 5 - Đã đăng ký, chuyển vùng.

Làm việc với SIM300GetNetStat()

Int8_t SIM300GetNetStat() ( //Gửi lệnh SIM300Cmd("AT+CREG?"); //Bây giờ hãy đợi phản hồi uint16_t i=0; //phản hồi đúng dài 20 byte //Vì vậy, hãy đợi cho đến khi chúng ta có 20 byte // trong bộ đệm trong khi (i<10) { if(UDataAvailable()<20) { i++; _delay_ms(10); continue; } else { //We got a response that is 20 bytes long //Now check it UReadBuffer(sim300_buffer,20); //Read serial Data if(sim300_buffer=="1") return SIM300_NW_REGISTERED_HOME; else if(sim300_buffer=="2") return SIM300_NW_SEARCHING; else if(sim300_buffer=="5") return SIM300_NW_REGISTED_ROAMING; else return SIM300_NW_ERROR; } } //We waited so long but got no response //So tell caller that we timed out return SIM300_TIMEOUT; }

Chức năng này được thực hiện theo cùng một cách: int8_t SIM300IsSIMInserted()

Với một loại phản hồi khác, chúng ta không biết trước kích thước chính xác của phản hồi như trong lệnh trên. Ví dụ: đây là lệnh Lấy tên nhà cung cấp dịch vụ, trong đó độ dài của tên nhà điều hành không xác định trước. Đây có thể là MTS, Beeline, v.v. Để giải quyết vấn đề này, chúng tôi sử dụng những gì nằm trước và sau câu trả lời CR LF. Vì vậy, chúng tôi chỉ cần đệm tất cả các ký tự cho đến khi gặp CR, có nghĩa là kết thúc câu trả lời.

Để đơn giản hóa việc xử lý các lệnh như vậy, chúng tôi đã tạo một hàm
SIM300WaitForResponse (thời gian chờ uint16_t)

Hàm này chờ phản hồi từ SIM300 (phần cuối của phản hồi được biểu thị bằng CR) và báo cáo kích thước của phản hồi, trong khi chính phản hồi đó được sao chép vào một biến toàn cục sim300_buffer.

Nếu không nhận được phản hồi trước thời gian chờ thì phản hồi là 0. Thời gian chờ tính bằng mili giây có thể được đặt bằng tham số hết giờ. Nó không tính các LF muộn hoặc OK cuối cùng, chúng vẫn còn trong bộ đệm UART FIFO. Vì vậy trước khi quay lại chúng ta sử dụng lệnh UFlushBuffer()để loại bỏ chúng khỏi bộ đệm.

Làm việc với SIM300WaitForResponse (thời gian chờ uint16_t)

Int8_t SIM300WaitForResponse(uint16_t hết thời gian) ( uint8_t i=0; uint16_t n=0; while(1) ( while (UDataAvailable()==0 && n

Làm việc với SIM300GetProviderName (char *name) Hàm thực hiện như sau:

  1. Xóa bộ đệm USART để loại bỏ mọi lỗi hoặc phản hồi.
  2. Gửi lệnh "AT+CSPN?" sử dụng chức năng SIM300Cmd ("AT + CSPN?");
  3. Sau đó nó chờ phản hồi bằng hàm SIM300WaitForResponse()
  4. Nếu chúng tôi nhận được phản hồi khác 0, nó sẽ phân tích cú pháp đó để lấy tên của toán tử.

Các chức năng sau đây được thực hiện theo cách tương tự:

  • uint8_t SIM300GetProviderName(char *name)
  • int8_t SIM300GetIMEI(char *emei)
  • int8_t SIM300GetNhà sản xuất(char *man_id)
  • int8_t SIM300GetModel(char *model)
uint8_t SIM300GetProviderName(char *name) ( UFlushBuffer(); //Gửi lệnh SIM300Cmd("AT+CSPN?"); uint8_t len=SIM300WaitForResponse(1000); if(len==0) return SIM300_TIMEOUT; char *start,*end ; start=strchr(sim300_buffer,"""); bắt đầu++; end=strchr(bắt đầu,"""); strcpy(name,start);

SIM300 và ATmega32. Phần cứng

Để chứng minh khả năng giao tiếp với SIM300 bằng AVR ATmega32, chúng ta sẽ cần các thành phần sau:
- ATmega32 với thanh ghi nối dây – reset, chân ISP, thạch anh 16 MHz.
- Nguồn +5V để cấp nguồn cho ATmega32 và màn hình LCD.
- Màn hình LCD 16x2 ký tự hiển thị kết quả.
- Mô-đun SIM300.

Chúng tôi sử dụng bảng phát triển Xboard vì nó có ATmega32 kèm dây điện, nguồn +5V và màn hình LCD.

Mã nguồn demo cho AVR và SIM300

Mã nguồn demo được viết bằng C và được biên dịch bằng trình biên dịch AVR-GCC miễn phí, sử dụng . Dự án được chia thành các mô-đun sau:

  • Thư viện LCD
    - Các tập tin lcd.c, lcd.h, myutils.h, custom_char.h
    - Công việc của nó là điều khiển màn hình LCD 16x2 tiêu chuẩn.
    - Thông tin chi tiết hơn có thể được tìm thấy tại liên kết.
  • Thư viện USART
    - File usart.c, usart.h
    - Công việc của cô là điều khiển phần cứng vi điều khiển USART AVR. Bao gồm các chức năng khởi tạo USART, gửi/nhận ký tự và gửi/nhận chuỗi.
  • Thư viện SIM300
    - File sim300.c, sim300.h

Thiết lập từng bước của dự án AS6

Tạo một dự án AS6 mới có tên "Sim300Demo".
Sử dụng Solution Explorer (cây dự án) tạo thư mục có tên "lib" trong thư mục hiện tại.
Trong thư mục "lib", tạo các thư mục "LCD", "USART" và "SIM300".
Sao chép các tập tin (sử dụng Windows Explorer) lcd.c, lcd.h, myutils.h, custom_char.h vào thư mục lcd.
Copy các file (dùng Windows Explorer) usart.c, usart.h vào thư mục USART
Copy các file (dùng Windows Explorer) sim300.c, sim300.h vào thư mục SIM300.
Thêm các tệp lcd.c, lcd.h, myutils.h, custom_char.h vào dự án bằng cách sử dụng Solution Explorer (cây dự án).
Thêm filesusart.c, usart.h vào dự án bằng cách sử dụng Solution Explorer (cây dự án).
Thêm file sim300.c, sim300.h vào dự án bằng Solution Explorer (cây dự án).
Xác định mức sử dụng F_CPU = 16000000 AS6.
Sao chép và dán tệp Sim300Demo.c chính vào chương trình.
Biên dịch dự án để có được một tập tin hex.
Flash Xboard sử dụng bộ lập trình USB.
Nếu bạn đang sử dụng bộ vi điều khiển ATmega32 mới, hãy đặt LOW FUSE thành 0xFF và FUSE CAO bật 0xC9.

Chương trình demo làm gì?

Khởi tạo màn hình LCD và mô-đun SIM300.
Xác minh rằng mô-đun SIM300 được kết nối với USART và phản hồi như mong đợi.
Hiển thị IMEI của mô-đun SIM300.
Hiển thị ID nhà sản xuất
Kiểm tra sự hiện diện của thẻ SIM.
Tìm kiếm mạng GSM và thiết lập kết nối. Để thực hiện việc này, bạn phải có thẻ SIM đang hoạt động.
Hiển thị tên của nhà điều hành, chẳng hạn như MTS hoặc Megafon.

vấn đề có thể xảy ra

Không có hình ảnh trên LCD

Đảm bảo dự án AVR Studio của bạn được đặt ở tốc độ xung nhịp 16 MHz (16000000Hz)
Điều chỉnh độ tương phản bằng chiết áp.
Nhấn nút đặt lại nhiều lần.
Bật/tắt thiết bị nhiều lần.
Chỉ kết nối màn hình LCD như thể hiện trong sơ đồ.

Lỗi "Không phản hồi" xuất hiện trong quá trình khởi tạo SIM300

Kiểm tra tính toàn vẹn của các đường Rx, Tx và GND giữa SIM300 và Xboard.
Đảm bảo bộ vi điều khiển đang chạy ở tần số 16 MHz.
Đặt cầu chì chính xác như mô tả ở trên.

Lỗi trình biên dịch

Nhiều người sử dụng các chương trình đã được viết và biên soạn sẵn. Họ thiếu kinh nghiệm và không quen với những điều cơ bản về lập trình và biên dịch. Làm quen với các trình biên dịch và cách chúng hoạt động trên các nền tảng khác nhau (PC/MAC/Linux) là một khởi đầu tuyệt vời. Hệ thống nhúng không phù hợp để học những điều cơ bản. Chúng dành cho những người có những kỹ năng này và chỉ cần sử dụng chúng.
Đảm bảo tất cả các tệp thư viện LCD được thêm vào dự án.
Đảm bảo AVR-GCC đã được cài đặt. (Bản phân phối Windows được gọi là WinAVR)
Đảm bảo dự án AVR Studio của bạn được đặt thành AVR GCC.

Lời khuyên chung cho người mới bắt đầu

Sử dụng bảng gỡ lỗi và lập trình viên làm sẵn.
Cố gắng học dựa trên các bài báo và sách giáo khoa.

Danh sách các nguyên tố phóng xạ

chỉ định Kiểu Mệnh giá Số lượng Ghi chúCửa hàngsổ ghi chú của tôi
U1 MK AVR 8-bit

ATmega32

1 Vào sổ ghi chú
U2 Bộ điều chỉnh tuyến tính

LM7805

1 Vào sổ ghi chú
D1 Điốt chỉnh lưu

1N4007

1 Vào sổ ghi chú
D2 Điốt phát sáng 1 Vào sổ ghi chú
C1, C2 tụ điện22 pF2 Vào sổ ghi chú
C3, C4, C6 tụ điện0,1 µF3

Gần đây, nhiều lựa chọn khác nhau về sơ đồ thiết bị báo động GSM đã xuất hiện. Nếu sơ đồ này sử dụng mô-đun GSM, thì trong hầu hết các trường hợp, nó là mô-đun phổ biến do công ty SimCom SIM300 của Trung Quốc sản xuất. Mô-đun này đã cho thấy nó rất tốt cả về độ tin cậy và chi phí thấp.
Một mô tả của thiết bị được cung cấp báo động GSM dựa trên mô-đun SIM300 do tác giả phát triển. Ngoài ra còn có các bản vẽ bảng mạch in và phiên bản đầy đủ tính năng của phần sụn vi điều khiển. Ngoài ra, nhiều mô-đun mở rộng, điều khiển từ xa, bộ điều khiển bàn phím, nguồn điện đã được phát triển cho hệ thống báo động này...
Nhưng nhà sản xuất thông báo rằng từ cuối năm 2010, việc sản xuất mô-đun GSM của dòng SIM3xx sẽ ngừng hoạt động. Thay vào đó, nên sử dụng mô-đun mới do cùng một nhà sản xuất - SIM900 sản xuất. Hơn nữa, như đã nêu, SIM900 sẽ có nhiều chức năng hơn “tổ tiên” của nó, và đối với chúng tôi đó là một trong những tiêu chí quan trọng nhất, rẻ hơn.

Đôi điều về SIM900...

Vậy mô-đun SIM900 là gì? Hãy lấy bảng dữ liệu và thử đọc nó.
Mô-đun SIM900 là thiết bị GSM/GPRS bốn băng tần hoạt động ở tần số 850/900/950/1900 MHz, được thiết kế để truyền giọng nói, dữ liệu, tin nhắn SMS, v.v.
Đặc tính kỹ thuật chính của mô-đun:
Dải tần số:
GSM850, EGSM900, DCS1800, PCS1900
Với tương thích với GSM giai đoạn 2/2+.
Công suất phát ra:
lớp 4 (2W/900 MHz)
lớp 1 (1W/1800 MHz)

Điều khiển: Lệnh AT (GSM 07.10)
Điện áp cung cấp mô-đun: 3,4 – 4,5V
Dòng điện tiêu thụ:
ở chế độ ngủ - 1,5 mA
ở chế độ chuyển giao – lên tới 500 mA
tối đa – 1,8 A
Nhiệt độ làm việc: -30 … +80 C
Kích thước: 24x24x3 mm
Cân nặng: 3,4 g
Như bạn có thể thấy, mô-đun này khác về kích thước so với mô-đun tiền nhiệm của nó, mô-đun SIM3xx, khoảng một lần rưỡi. Nhưng xét về mặt thông số và chức năng thì nó cũng vượt trội hơn rất nhiều.


Hình 1 - Hình dáng của mô-đun GSM SIM900



Hình 2 – Cách gán chân mô-đun SIM900

Sự xuất hiện của mô-đun được hiển thị trong Hình. 1, và cách phân công các chân như trong Hình. 2. Từ các hình vẽ, bạn có thể xác định rằng ngoài bộ giao diện tiêu chuẩn vốn có trong các mẫu máy trước đó (cổng UART để trao đổi dữ liệu, đầu ra trạng thái mô-đun TRẠNG THÁI, chân giao diện thẻ SIM, v.v.), một số giao diện mới đã được thêm vào (kết nối bàn phím chân KBR/KBC, chân đầu raPWM, chân đặt lại mô-đun NRESET).
Do mô-đun này tại thời điểm viết bài này vẫn chưa được "thử nghiệm" đầy đủ trên vùng lãnh thổ Ukraine rộng lớn nên phần mềm liên tục được cải tiến; .

Thông số thiết bị cơ bản

Thiết bị này là sự tiếp nối của dòng thiết bị báo động GSM do tác giả phát triển. Do đó, các thông số phần lớn giống hệt nhau.
Giám sát trạng thái của bốn vòng lặp cảnh báo (AL) ở tất cả các chế độ vận hành, ngoại trừ chế độ “Lập trình” và hiển thị trạng thái của các vòng lặp bằng đèn LED nằm ở mặt trước của thiết bị (đèn báo cho biết “vòng lặp đã được kích hoạt”). trong điều kiện bình thường”, nếu không thì đó là hiện tượng đứt hoặc đoản mạch của vòng báo động).
Vòng báo động có thể bao gồm:
> thiết bị báo hiệu tiếp xúc từ tính (công tắc sậy SMK, SOMK);
> máy dò loại “Foil” và “Window”;
> đầu báo cháy (IP-104, IP-105);
> cảm biến chuyển động, âm lượng, nhịp;
> các cảm biến khác có đầu ra đóng ở điều kiện bình thường và các tiếp điểm mở trong trường hợp vi phạm.
Hỗ trợ thiết bị các loại sau vùng báo động (vòng):
“bình thường” (tín hiệu “Báo động” được tạo ngay khi nhận được tín hiệu vi phạm tính toàn vẹn của vòng báo động; vòng lặp không được khôi phục sau khi kích hoạt);
“có độ trễ” (người dùng có thời gian để thoát và vào để có thời gian bật thiết bị và rời khỏi đồ vật hoặc mở đồ vật và tắt thiết bị);
“hành lang” (khi vùng được kích hoạt và sau đó trở về trạng thái bình thường loại này khu vực được vũ trang trở lại);
“24 giờ, cháy” (vòng báo động được bảo vệ liên tục, việc giải giáp và giải giáp được thực hiện bằng lệnh SMS đặc biệt);
"suốt ngày đêm, Nút cảnh báo» (vòng báo động liên tục được trang bị, việc giải giáp và kích hoạt được thực hiện bằng lệnh SMS đặc biệt, khi vòng lặp được kích hoạt, chỉ thực hiện quay số, một tin nhắn SMS được gửi về hành vi phá hoại, còi báo động không bật);
“bị vô hiệu hóa” (hệ thống không phản hồi với bất kỳ thay đổi nào ở đầu vào AL).
Bật chế độ “Bảo mật” bằng nút “ẩn” hoặc “bí mật”, công tắc “bí mật” (thay vào đó có thể sử dụng bàn phím có danh bạ thường mở, chẳng hạn như “Satel”) hoặc điều khiển từ xa điều khiển từ xa, Phím TouchMemory (Dallas) hoặc bàn phím bổ sung, tùy thuộc vào chương trình cơ sở của bộ điều khiển. Phần sụn được mô tả ở đây chỉ sử dụng công tắc "bí mật", các phiên bản khác sẽ được thảo luận sau.
Hai chế độ hoạt động của thiết bị được hỗ trợ:
Báo động GSM (thiết bị đầu cuối GSM được kết nối và dữ liệu đang được trao đổi với nó);
hệ thống báo động tự động (thiết bị đầu cuối GSM không tham gia vào hoạt động của hệ thống, thiết bị hoạt động như một hệ thống báo động tự động).
Vô hiệu hóa và kích hoạt bằng cách sử dụng cuộc gọi từ một điện thoại cụ thể (có thể bị tắt) với việc truyền SMS tương ứng về trạng thái hệ thống.
Việc truyền tin nhắn SMS xác nhận khi một đối tượng được bảo vệ (có thể bị vô hiệu hóa).
Tạo tín hiệu “Báo động” (bật còi báo động, truyền dữ liệu “cảnh báo” đến điện thoại di động) trong trường hợp vi phạm tính toàn vẹn (“ngắt” hoặc “đoản mạch”) của ít nhất một trong các vòng báo động.
Gửi tin nhắn SMS và tự động quay số tới ba số điện thoại di động hoặc cố định (nếu chức năng SMS được nhà khai thác viễn thông của bạn hỗ trợ).
Chuyển thiết bị sang chế độ “Đã vô hiệu hóa” chỉ bằng điều khiển từ xa, bàn phím, bằng cách nhận tin nhắn SMS từ số điện thoại di động 1 và (hoặc) gọi từ số này (có thể bị tắt), cũng như công tắc “bí mật”, tùy theo từ phần mềm điều khiển.
Khả năng điều khiển thiết bị từ xa bằng cách gửi tin nhắn SMS có nội dung nhất định (có thể bị tắt).
Lập trình các chức năng và thông số chính của thiết bị (số điện thoại, thời gian trễ, thời gian hoạt động của còi báo động, v.v.) bằng máy tính Chương trình rút gọn Lập trình viên ở chế độ “Lập trình” của thiết bị. Trong trường hợp này, đầu ra của cổng COM của máy tính (chân RxD và TxD) được kết nối với đầu nối tương ứng của thiết bị báo động bằng cáp đặc biệt.
Cho ăn bằng thiết bị tín hiệu nhất định cho người dùng về việc không đủ tiền trong tài khoản thẻ di động.
Thiết bị sẽ gửi tín hiệu cụ thể cho người dùng về việc không có tín hiệu liên lạc với trạm di động.
Truyền tín hiệu SMS khi mất điện áp nguồn (220V) ở chế độ "Bảo mật" (có thể tắt).
Việc sử dụng modem GSM tích hợp cho phép bạn thực hiện mà không cần các khối và kết nối không cần thiết, cũng như tăng tính tương thích và tính ổn định của kết nối kênh GSM.
Phản ứng được lập trình của đầu ra nguồn: chỉ bật đầu ra ở chế độ "Báo động" người dùng đã cài đặt thời gian (từ 60 đến 240 giây).
Việc sử dụng giao thức truyền dữ liệu IR gốc bằng điều khiển từ xa để điều khiển thiết bị và điều khiển từ xa RF, cũng như mã hóa ban đầu của dữ liệu nhận được từ bàn phím.
Có thể kiểm soát điện áp và điện áp cung cấp của thiết bị ắc quy, trong khi tin nhắn SMS tương ứng sẽ được gửi khi điện áp nguồn biến mất hoặc xuất hiện trở lại. Ngoài ra, khi điện áp cung cấp của nguồn dự phòng (pin) giảm xuống dưới mức quy định (8-9V), một thông báo sẽ được gửi, sau đó thiết bị sẽ chuyển sang chế độ “ngủ”, chế độ này chỉ có thể thoát khi nguồn điện ( nguồn điện hoặc pin) được khôi phục.
Gửi tin nhắn SMS tới Số điện thoại 1 khi nhận được cuộc gọi đến cho biết số đến(có thể bị vô hiệu hóa).
Thiết bị cho phép bạn chuyển đổi báo động âm thanh hoặc ánh sáng bên ngoài (chuông, còi báo động, đèn) với điện áp hoạt động 12V và mức tiêu thụ dòng điện lên tới 1,25A.
Phần sụn của bộ vi điều khiển được mô tả trong bài viết này được thiết kế để vận hành thiết bị kết hợp với công tắc “bí mật”, cũng như bật và tắt thiết bị bằng cách quay số và gửi tin nhắn SMS. Các phiên bản khác của thiết bị sẽ được mô tả trong các tài liệu sau, tất nhiên nếu độc giả quan tâm.

Thông số kỹ thuật

Số vòng báo động – 4.
Điện trở của phần tử ở xa (thiết bị đầu cuối), kOhm – 2.7.
Điện trở tối đa của vòng bảo mật không tính đến điện trở của phần tử từ xa, Ohm – 750.
Mức tiêu thụ hiện tại từ nguồn dòng điện một chiều(không có cảm biến cảnh báo hoạt động được kết nối), ở điện áp 12,6 V, ở các chế độ vận hành sau, không còn nữa:
- "đang làm nhiệm vụ", không sử dụng mô-đun GSM – 0,16 A;
- "đang làm nhiệm vụ", khi sử dụng mô-đun GSM – 0,23 A;
- “bảo mật”, khi sử dụng mô-đun GSM – 0,28 A;
- “báo động”, khi sử dụng mô-đun GSM và còi báo động đã tắt – 0,34 A;
- mức tiêu thụ đỉnh (xung) – 1,8 A.
Được hỗ trợ Tiêu chuẩn GSM: 850/900/1800/1900 MHz.
Giới hạn cài đặt thời gian:
- Thời gian trễ nhập – 0…150 giây;
- Thời gian trễ thoát – 0…250 giây;
- Thời gian hoạt động của còi báo động – 30…250 giây.

Mô tả sơ đồ

Sơ đồ mạch điện của thiết bị chính được hiển thị trong Hình. 3. Tôi sẽ làm rõ – “thiết bị chính”, vì được phát triển thêm cho các hệ thống báo động này bộ lớn thiết bị ngoại vi: đây là nhiều loại bảng điều khiển, bộ mở rộng, v.v.
So với phiên bản trước, mạch đã trải qua những thay đổi về chất: ngoài ra, như đã đề cập ở trên, việc sử dụng một mô-đun GSM khác, rơle cũng đã bị loại bỏ (thay vào đó, sử dụng IC - một bộ công tắc bóng bán dẫn mạnh mẽ) và Bộ chuyển đổi RS232-UART cũng đã bị loại bỏ (như thực tế đã cho thấy, việc lập trình không được thực hiện thường xuyên và vì mục đích này, họ chủ yếu sử dụng máy tính xách tay, thường đơn giản là không có cổng RS232).



Hình 3 - Sơ đồ mạch điện

Bộ phận điều khiển chính của thiết bị là bộ vi điều khiển ATmega168 do Atmel sản xuất. Bộ vi điều khiển giám sát trạng thái của các vòng báo động được kết nối với đầu vào ADC và tùy thuộc vào chế độ vận hành, thực hiện các hành động tiếp theo, chẳng hạn như quay số và gửi tin nhắn SMS, bật còi báo động, v.v.
Đầu vào ADC PC0-PC3 được thiết kế để theo dõi trạng thái của các vòng cảnh báo, MK đo điện áp ở các chân này và tùy thuộc vào điện áp, tạo ra tín hiệu “ngắt”, “bình thường” hoặc “ngắn”. PC5, PC6 được cấp điện áp từ đầu ra của nguồn điện để điều khiển giá trị của chúng. Nhân tiện, nếu các chân này không được kết nối, thiết bị sẽ không khởi động!
Mạch sử dụng các đèn LED điều khiển: LED1 – điều khiển hoạt động của module GSM (nếu có kết nối và module đang hoạt động thì nó sẽ nhấp nháy với tần số 1 đèn nháy trong 2-3 giây, các trường hợp khác có vấn đề về giao tiếp hoặc với chính mô-đun), LED2 – điều khiển hoạt động của hệ thống ( ở chế độ vận hành, nó nhấp nháy với tần số 3-5 lần mỗi giây, ở chế độ lập trình, nó sáng liên tục). Ngoài ra, các đèn LED để theo dõi trạng thái của các vòng báo động LED4...LED7 được kết nối với các chân IND1...IND4. KEY_S – thực chất là nút “bí mật” hoặc chính công tắc đó. LOA – đầu nối để kết nối loa, nó có thể có bất kỳ điện trở nào, công suất ít nhất là 0,25 W.

Về nguồn điện của thiết bị. Thiết bị này yêu cầu điện áp nguồn trong khoảng 10 - 18 V, dòng điện lên tới 2 A. Nên xây dựng nguồn điện sao cho điện áp nguồn không biến mất ngay cả khi mất mạng, nghĩa là cung cấp pin sạc. Nên sử dụng nguồn điện phù hợp cho những phiên bản trước thiết bị đang được mô tả. Nó cũng mô tả cách kết nối nguồn điện với thiết bị báo động.

Lập trình các chức năng cơ bản của thiết bị

Việc lập trình các chức năng chính của thiết bị được thực hiện bằng chương trình đặc biệt - Lập trình viên Lite. Phiên bản mới nhất Các chương trình luôn có thể được tải xuống từ trang web của tác giả. Về nguyên tắc, thay vì máy tính để lập trình thiết bị, có thể sử dụng điện thoại di động kết nối với thiết bị qua cổng dữ liệu hoặc cổng hồng ngoại, nhưng để làm được điều này, bạn cần phải viết ít nhất một java midlet và do thiếu có thời gian rảnh, đơn giản là tác giả không có thời gian để làm việc này và việc lập trình bằng máy tính xách tay hiện tại là ổn. Nếu ai quan tâm đến việc giải quyết vấn đề này, hãy viết thư cho tác giả qua email, tất cả tài liệu sẽ được cung cấp.
Thiết bị được kết nối với cổng COM trống của máy tính thông qua bộ chuyển đổi RS232-UART đặc biệt hoặc với cổng USB thông qua bộ chuyển đổi USB-UART. Đừng cố gắng kết nối trực tiếp mà không cần bộ chuyển đổi (hiện nay đã có những người thợ thủ công như vậy)! Điều này đe dọa đến cái chết của bộ vi điều khiển hoặc cổng máy tính!
Cách chuyển sang chế độ lập trình:
1. Nhấn nút S1 trong ít nhất 2 giây và đợi cho đến khi đèn báo trạng thái hoạt động của mô-đun 2HL1 ngừng nhấp nháy (thường không quá 10 giây)
2. Ngắt điện cho thiết bị.
3. Đặt jumper J1, chuyển thiết bị sang chế độ “Lập trình”.
4. Cắm cáp để kết nối thiết bị với máy tính.
5. Thiết lập kết nối với thiết bị và lập trình cho thiết bị (mô tả bên dưới).
6. Ngắt điện cho thiết bị.
7. Ngắt kết nối cáp để liên lạc với PC và tháo jumper J1.
8. Lập trình hoàn tất, bạn có thể bật nguồn và sử dụng thiết bị.
Biểu mẫu chính Chương trình là tiêu chuẩn, không rườm rà hay chuông và còi. Ở phía bên phải của biểu mẫu, số cổng COM được đặt, cũng như tốc độ truyền và nhận dữ liệu (đối với trường hợp của chúng tôi – 115200 baud), để đưa thiết bị vào chế độ lập trình, chọn “thiết lập kết nối” trong phần “Hành động”. ” khung (ở góc dưới bên phải), Trong trường hợp này, đèn LED 1LED1 sẽ sáng liên tục. Bạn có thể lập trình!



Hình 4 – Hình thức chính của chương trình Lite Programr

Làm việc với chương trình không gây ra bất kỳ khó khăn cụ thể nào đối với người dùng đã bật máy tính ít nhất một lần trong đời. Ngoài ra, mọi thứ đều được mô tả chi tiết trong Hướng dẫn vận hành và lập trình được đề cập nhiều lần. Tóm lại: đặt các tham số bạn cần, đảm bảo rằng “Thay đổi” xuất hiện màu đỏ ở cột thứ ba, chọn “Lập trình” trong khung “Hành động”, nhấp vào nút “Chạy”, thế là xong. Nếu tham số được lập trình thì dòng chữ “Đã lập trình” sẽ xuất hiện ở cột thứ năm; trong trường hợp có lỗi, chương trình cũng sẽ hiển thị thông báo tương ứng.

Một số sắc thái của lập trình.

Nên Đặc biệt chú ý hãy chú ý đến quá trình lập trình, vì hoạt động của toàn bộ thiết bị phụ thuộc vào điều này. Như thực tế đã chỉ ra, sai lầm chính là khi cài đặt số trung tâm SMS của một nhà mạng di động. Nếu bạn không biết con số này hoặc không chắc chắn thì tốt hơn hết là đừng lập trình nó. Trong trường hợp này, phần mềm mô-đun GSM sẽ xác định số một cách độc lập.
Ngoài ra, hãy cẩn thận khi đặt số yêu cầu số dư USSD nếu bạn định sử dụng nó. Ban đầu, thiết bị được phát triển cho người dùng Ukraina, vì vậy số dư tối thiểu là từ một đến chín hryvnia-rúp. Có hai tùy chọn cài đặt có sẵn. Đầu tiên là chọn toán tử mong muốn và chính chương trình sẽ đặt số lượng cần thiết và số dư tối thiểu bằng hai hryvnia. Tùy chọn thứ hai là chọn TUNE USSD từ menu thả xuống để chọn toán tử yêu cầu USSD, sau đó điền các tham số bắt buộc vào biểu mẫu xuất hiện: số tiền tối thiểu (từ một đến chín rúp), dấu phân cách rúp-kopeck (một số các toán tử sử dụng các ký tự phân tách khác nhau, ví dụ: dấu chấm, dấu phẩy, dấu hai chấm).
Chương trình hiện chỉ hỗ trợ bảng chữ cái Latinh khi nhập tin nhắn SMS, vì Chức năng này cũng được hỗ trợ bởi chương trình vi điều khiển. Hiện tại, công việc đang được tiến hành để bao gồm bảng chữ cái Cyrillic.

Hướng dẫn nhanh.

Trước khi cài đặt báo thức vào thiết bị, bạn nên “chuẩn bị” thẻ SIM theo cách nào đó, cụ thể là: vô hiệu hóa mật khẩu. Bạn nên sử dụng thẻ SIM của cùng một nhà cung cấp dịch vụ di động với điện thoại quay số. Ít nhất, khả năng tin nhắn SMS được gửi đi sẽ tăng lên gấp nhiều lần.
Sau khi cấp nguồn và khởi động, thiết bị sẽ phát ra một tiếng bíp dài từ loa bên trong, sau đó giao tiếp với mô-đun được thiết lập, sau khi hoàn thành sẽ có ba tiếng bíp ngắn. Thiết bị đã sẵn sàng để sử dụng.
Tiếp theo, chúng ta sẽ nói về việc sử dụng thiết bị này làm thiết bị báo động an ninh cho các tòa nhà trong nhà, v.v. Để sử dụng thiết bị này làm báo động ô tô hoặc các chức năng khác, trước tiên cần có một chương trình cơ sở vi điều khiển khác và điều này nằm ngoài phạm vi của bài viết này. Đây là chủ đề của các ấn phẩm tiếp theo.
Để kích hoạt thiết bị, bạn cần đóng công tắc KEY_S. Nhân tiện, thay vì công tắc này, bạn có thể sử dụng bất kỳ bàn phím nào có danh bạ thường mở, chẳng hạn như Satel SW02. Sau đó, thiết bị sẽ bắt đầu đếm thời gian thoát (thời gian được đặt trong quá trình lập trình), trong thời gian đó cần phải rời khỏi đối tượng được bảo vệ. Nếu sau khi hết thời gian thoát, tất cả các vòng lặp đều ở trạng thái được lắp ráp, thiết bị sẽ chuyển sang chế độ bảo mật. Nếu sau khi hết thời gian vào, ít nhất một trong các vòng lặp bị hở hoặc bị chập, thiết bị phát ra âm thanh ngắt quãng trong 100-140 giây thì một thông báo về đối tượng không được trang bị vũ khí sẽ được gửi đến số 1 (nếu được lập trình), sau đó nó chuyển sang chế độ báo thức với việc gửi tất cả tin nhắn và quay số. Bạn cũng có thể trang bị thiết bị bằng cách gọi từ số được lập trình trước hoặc bằng cách gửi tin nhắn SMS có nội dung “BẮT ĐẦU” từ cùng một số. Hãy nhớ rằng phiên bản phần sụn này không được khuyến khích chia sẻ khi trang bị công tắc “bí mật” và các chức năng GSM để loại bỏ ảnh hưởng lẫn nhau của chúng. Khi sử dụng cùng nhau, ưu tiên sẽ thuộc về phía switch, các chức năng GSM sẽ không hoạt động!
Ở chế độ bảo mật, thiết bị liên tục theo dõi trạng thái của tất cả các vòng báo động, cũng như trạng thái của mô-đun GSM. Trong trường hợp này, nếu vòng lặp được kích hoạt, tin nhắn SMS sẽ được gửi và cuộc gọi được thực hiện theo thẻ lập trình. Việc quay số được thực hiện cho đến khi thuê bao nhấc máy nhưng không quá 8 lần. Cũng ở chế độ bảo mật, nguồn điện vào mạng 220V và ắc quy dự phòng đều được kiểm soát. Đồng thời, với mỗi lần mất điện áp 220V và xuất hiện trở lại sau đó, một tin nhắn SMS tương ứng sẽ được gửi (chức năng này có thể bị tắt trong quá trình lập trình).
Để vô hiệu hóa thiết bị, bạn cần mở đối tượng và mở các tiếp điểm công tắc trong thời gian thoát. Nếu điều này không được thực hiện, thiết bị sẽ chuyển sang chế độ báo động. Hoặc vô hiệu hóa đối tượng trước khi mở bằng cách gọi điện hoặc gửi tin nhắn SMS “STOP” từ số đầu tiên.
Ở chế độ chờ, thiết bị cũng giám sát trạng thái của các vòng báo động cũng như mô-đun GSM. Nếu mất liên lạc với mô-đun hoặc mất mạng, 5 tiếng chuông ngắn sẽ vang lên sau mỗi 2-4 phút. Ngoài ra, cứ sau 30-40 phút, trạng thái tài khoản của số điện thoại di động sẽ được thăm dò. Trong trường hợp này, mười tín hiệu âm thanh ngắn hạn (“rung”) sẽ được nghe thấy và một tin nhắn SMS (“KHÔNG CÓ TIỀN!!”) được gửi đến số 1.
Bảng này cho thấy tin nhắn dịch vụ, mà thiết bị có thể gửi khi xảy ra một số sự kiện nhất định (nếu chức năng gửi bị tắt trong khi lập trình, những tin nhắn này sẽ không được gửi!):

tin nhắn SMS

Sự miêu tả

Ghi chú

Dừng canh gác!

Xác nhận việc vô hiệu hóa hệ thống

Chế độ chờ

TẮT NGUỒN!!!

Trục trặc hoặc không có điện áp nguồn 220V

Chỉ ở chế độ bảo mật

BẬT nguồn

Xuất hiện điện áp mạng 220V (sau khi vắng)

TẤT CẢ CÁC ĐIỆN TẮT!!!

Tất cả các điện áp cung cấp đều dưới mức bình thường. Sau một thời gian, thiết bị sẽ chuyển sang chế độ ngủ.

Ở mọi chế độ hoạt động

Bắt đầu sau khi ngủ

Khôi phục hoạt động của thiết bị sau khi mất điện

KHÔNG CÓ TIỀN!!!

Số tiền tối thiểu trong tài khoản. Bạn cần phải nạp tiền vào tài khoản của mình!

Thiết bị này có tiềm năng cải tiến và hiện đại hóa rất lớn; nó không chỉ có thể được sử dụng như một thiết bị báo động mà còn như bất kỳ thiết bị thu thập và truyền dữ liệu nào bằng cách định cấu hình chương trình vi điều khiển cho từng trường hợp cụ thể.

Phần kết luận

Thiết bị được mô tả đã vượt qua thử nghiệm ban đầu trong phòng thí nghiệm của tác giả và cho kết quả tốt. Mô-đun SIM900 hiển thị công việc ổn định Khi điều khiển các lệnh AT tiêu chuẩn, không có khiếu nại đặc biệt nào. Các bảng mạch in cho thiết bị này sẽ sớm được phát triển và các tài liệu tương ứng sẽ được chuẩn bị. Phiên bản demo của phần sụn vi điều khiển được đính kèm với bài viết này. Phiên bản đầy đủ chức năng của chương trình cơ sở vi điều khiển của thiết bị được cung cấp miễn phí cho mọi người. Để thực hiện việc này, bạn nên gửi yêu cầu tương ứng tới Hộp thư điện tử tác giả hoặc thông qua ICQ. Mọi đề xuất tổ chức sản xuất thiết bị báo động và thiết bị ngoại vi được mô tả cũng được xem xét.
Trong tương lai, dự kiến ​​​​sẽ đảm bảo khả năng tương thích của thiết bị với tất cả các thiết bị ngoại vi được thiết kế cho phiên bản trước của thiết bị báo động GSM do D. Dmitrenko sáng tác. Dưới đây là những bổ sung cho bài viết cho các ứng dụng cụ thể khác nhau.

Tất cả phần sụn hiện có đầy đủ chức năng, ngoại trừ phần sụn hỗ trợ phím iButton, có những hạn chế về số lượng phím được sử dụng tối đa - từ một đến ba.

1. Sử dụng phím TouchMemory để điều khiển thiết bị

Hiện tại, phần sụn vi điều khiển đã được phát triển để hoạt động với các phím TouchMemory. Để làm được điều này, cần bổ sung cho thiết bị một thiết bị đơn giản gồm hai điện trở, một điện dung và một diode zener. Và tất nhiên, hãy sử dụng phần sụn cho loại thiết bị này.
Một ví dụ về việc sử dụng một thiết bị như vậy được mô tả rõ ràng trong bài viết Báo hiệu GSM bằng phím iButton. Ở đó, trên sơ đồ mạch điện, kết nối của một thiết bị bổ sung được hiển thị và các bản vẽ của bảng mạch in được đưa ra.
Có thể tải xuống chương trình cơ sở [tìm kiếm thiết bị DDN Research HG45Q]

Trải nghiệm sử dụng SIM900 được mô tả dưới đây sẽ hữu ích hơn cho những người đã làm việc một chút với mô-đun này. Đối với những độc giả mới bắt đầu nghiên cứu vi mạch này và dự định sử dụng nó để trao đổi dữ liệu qua Internet, chúng tôi đã chuẩn bị một loạt bài học về chủ đề này. Đây .

Vì vậy, SIM900 là mô-đun GSM từ SIM COM, được điều khiển bằng lệnh AT, có thể gửi SMS, thực hiện cuộc gọi, tổ chức kết nối CSD trực tiếp và trao đổi thông tin qua GPRS.

Trên tay tôi là một đơn hàng từ Trung Quốc Ban phát triển Tấm chắn SIM900 GPRS – tương thích với nền tảng Arduino.

Bo mạch chứa chính chip SIM900, đầu nối micrô và tai nghe, công tắc cấp nguồn (từ đầu nối bên ngoài hoặc từ Arduino), ăng-ten, một số đèn LED để biểu thị các chế độ hoạt động, đầu nối cho pin (nếu bạn cần đồng hồ thời gian thực), nút bật/tắt. Mô tả tốt Tôi tìm thấy nhà sản xuất trên wiki . Ngoài ra còn có mã để điều khiển modem ở nhiều chế độ khác nhau.

Như nhà sản xuất cho chúng tôi biết, bo mạch này hoàn toàn tương thích với Arduino Uno. Thật vậy, bo mạch SIM900 chỉ cần cắm vào Uno và ngay lập tức bắt đầu hoạt động. Tuy nhiên, hóa ra, Arduino Uno có thể “yếu” trong việc thực hiện một số chức năng, nhưng tôi sẽ nói về điều này bên dưới.

VỚI Arduino Mega Hội đồng quản trị hoạt động với một số hạn chế. Điều này là do Mega, không giống như Uno, có các chân 7 và 8, không có sẵn để sử dụng làm phần mềm nối tiếp (phần mềm USART). Điều này có thể được giải quyết bằng cách chuyển giao diện USART sang chân 0 và 1; vì mục đích này, các jumper được cung cấp trên bo mạch SIM900.

Nói chung, bo mạch có thể được kết nối với bất kỳ bộ điều khiển nào có giao diện USART. Ví dụ: tôi đã thử điều khiển modem bằng bộ điều khiển STM32F4.

SIM900: Tin nhắn SMS và cuộc gọi

Việc thử nghiệm mô-đun trao đổi tin nhắn SMS và cuộc gọi đã thành công tốt đẹp! Mô-đun xử lý các nhiệm vụ này mà không cần vấn đề đặc biệt, đối với điều này tôi vừa sao chép c cùng một trang web, được biên dịch và flash mã này trong Arduino Uno:

// Rơle nối tiếp - Arduino sẽ vá một // liên kết nối tiếp giữa máy tính và GPRS Shield // ở tốc độ 19200 bps 8-N-1 // Máy tính được kết nối với UART phần cứng // GPRS Shield được kết nối với UART phần mềm #include Phần mềm GPRS nối tiếp(7, 8); bộ đệm char không dấu; // mảng đệm để nhận dữ liệu qua cổng nối tiếp int count=0; // bộ đếm cho mảng đệm void setup() ( GPRS.begin(19200); // tốc độ truyền của GPRS Serial.begin(19200); // cổng nối tiếp của tốc độ truyền của Arduino. ) void loop() ( if (GPRS .available()) // nếu ngày đến từ cổng nối tiếp phần mềm ==> dữ liệu đến từ tấm chắn gprs ( while(GPRS.available()) // đọc dữ liệu vào mảng char ( buffer=GPRS.read(); // ghi dữ liệu vào mảng if(count == 64)break; ) Serial.write(buffer,count); // nếu không có dữ liệu nào kết thúc, hãy ghi dữ liệu vào cổng nối tiếp phần cứng clearBufferArray(); / đặt bộ đếm của vòng lặp while về 0) if (Serial.available()) // nếu dữ liệu có sẵn trên cổng nối tiếp phần cứng ==> dữ liệu đến từ PC hoặc notebook GPRS.write(Serial .read()); nó tới tấm chắn GPRS ) void clearBufferArray() // chức năng xóa mảng đệm ( for (int i=0; i

Để gửi lệnh đến mô-đun, nó phải được kết nối với máy tính. Điều này có thể được thực hiện bằng cổng USB Arduino. Trên máy tính, bạn cần bất kỳ trình giám sát cổng COM nào để thực hiện việc này. Bạn có thể tải nó xuống từ đây hoặc bạn có thể sử dụng màn hình được tích hợp trong Arduino IDE.

Tất cả những gì chương trình Arduino thực hiện là “bắt” lệnh của người dùng và gửi chúng đến mô-đun, sau đó trả về phản hồi cho SIM900 cho người dùng. Do đó, bằng cách truyền lệnh AT theo cách thủ công đến mô-đun, tôi đã kiểm tra khả năng nhận và truyền tin nhắn SMS, đồng thời bằng cách kết nối micrô và tai nghe với các đầu nối thích hợp, tôi đã sử dụng mô-đun SIM900 làm điện thoại di động.

Truyền dữ liệu qua GPRS sử dụng SIM900

Tôi bắt đầu những thử nghiệm đầu tiên về truyền dữ liệu qua GPRS bằng nền tảng Arduino UNO để điều khiển SIM900 (đơn giản vì nó ở trong tầm tay). Để bắt đầu, tôi đã mua dịch vụ lưu trữ có máy chủ chạy Apatche và triển khai một ứng dụng đơn giản trên đó có thể đáp ứng khéo léo các yêu cầu GET. Đã xảy ra! Tôi vẫn gửi lệnh từ PC đến bộ điều khiển Arduino, từ đó gửi chúng đến SIM900.

Mọi thứ đều hoạt động chính xác miễn là yêu cầu GET đủ ngắn (tối đa 100 ký tự). Nhưng ngay khi các yêu cầu trở nên dài hơn thì lỗi bắt đầu xảy ra: các yêu cầu không được truyền đi hoàn toàn. Cần lưu ý rằng các trục trặc có thể xuất hiện hoặc biến mất ngay cả khi tăng/giảm chương trình điều khiển Arduino vài dòng. Sau đó, hóa ra các lỗi này liên quan đến phần mềm USART mà Arduino UNO sử dụng để giao tiếp với SIM900, bởi vì USART như vậy hoàn toàn phụ thuộc vào chu trình chương trình của lõi bộ điều khiển. Nếu lượng dữ liệu nhỏ thì nó luôn có thời gian để truyền đi, còn nếu lượng dữ liệu đó tăng lên thì kết quả của việc truyền tải phụ thuộc vào độ dài của chu kỳ chương trình.

Kết luận từ tất cả những điều trên: KHÔNG THỂ sử dụng phần mềm USART khi giao tiếp với SIM900, đặc biệt khi có lượng lớn dữ liệu được truyền đi.

Arduino Uno chỉ có một giao diện USART “phần cứng”, được sử dụng để trao đổi với PC, vì vậy chúng tôi phải từ bỏ UNO, thay thế bằng Arduino Mega, không bị thiếu USART “phần cứng”. Sau khi “đóng thành” như vậy, hoạt động của thiết bị trở nên ổn định và chính xác.

SIM900: ngăn xếp TCP-IP hay HTTP? Cái gì tốt hơn?

Khi nghiên cứu sổ tay quản lý modem, tôi phát hiện ra có hai nhóm lệnh AT. Nhóm đầu tiên được sử dụng để truyền dữ liệu qua ngăn xếp TCP-IP tích hợp và nhóm thứ hai sử dụng giao thức HTTP đã được logic bên trong của SIM900 triển khai. Cho dù tôi có dày vò Google và Yandex đến mức nào để cố gắng tìm hiểu xem các phương pháp này khác nhau như thế nào, ưu và nhược điểm của từng phương pháp là gì, tôi cũng không tìm thấy gì, vì vậy tôi đã thử cả hai và chia sẻ kinh nghiệm thực tế của mình tại đây.

Cả hai phương pháp đều hoạt động và có quyền tồn tại.

Ngăn xếp TCP-IP khó khởi tạo hơn một chút (cần chuyển nhiều lệnh hơn đến mô-đun) và khó quản lý hơn một chút. Để gửi yêu cầu, bạn cần mở kết nối, đợi phản hồi và đóng lại đúng cách.

Nói một cách đơn giản, HTTP là một trình duyệt được tích hợp trong SIM900. Thật dễ dàng để khởi tạo; để bắt đầu liên lạc với máy chủ, bạn cần mở một phiên. Đồng thời, việc mở và đóng kết nối với từng yêu cầu cũng như giải quyết các “nhiệm vụ tổ chức” khác được đặt lên vai SIM900. Điều này rất thuận tiện và việc truyền dữ liệu theo cách này nhanh hơn một chút, chính xác là vì SIM900 có thể thực hiện tất cả “các hoạt động phụ trợ” nhanh hơn bộ điều khiển điều khiển có thể làm.

Vì vậy, khi chọn phương thức trao đổi, tôi vẫn sử dụng giao thức HTTP.

Yêu cầu GET không chính xác tới máy chủ

Khi mới bắt đầu công việc truyền dữ liệu qua GPRS, tôi đã mắc một sai lầm khiến tôi phải dằn vặt hơn một ngày. Không có đủ kinh nghiệm trong việc tương tác với máy chủ thông qua các yêu cầu GET, tôi, với kiến ​​thức sơ sài trên Internet, đã biên soạn một yêu cầu như:

NHẬN http://xxx.ru/d_command.php?UC=1111 HTTP/1.1
CHỦ NHÀ: xxx.ru

Yêu cầu này không chính xác, nhưng nó đã được trình duyệt và máy chủ proxy mà tôi đã gửi yêu cầu gỡ lỗi "ăn" một cách hoàn hảo - đó là lý do tại sao tôi coi yêu cầu này là chính xác.

Điều đáng ngạc nhiên nhất là SIM900 cũng đối phó tốt với yêu cầu “xấu” (và hồi đó tôi đã gửi yêu cầu qua ngăn xếp TCP-IP). Tuy nhiên, vào một ngày đẹp trời, máy chủ bắt đầu phản hồi những yêu cầu đó với lỗi 404. Điều này xảy ra do một số trường hợp vẫn chưa được làm rõ, hoặc nhà cung cấp dịch vụ lưu trữ đã thay đổi thuật toán xử lý yêu cầu (anh ta phủ nhận điều này) hoặc nhà điều hành di động đã làm nó. Nhưng sự thật vẫn là sự thật. Sau đó, tôi đã cố gắng gửi yêu cầu tương tự qua HTTP - mọi thứ đều hoạt động. Điều này được giải thích là do giao thức HTTP nội bộ của mô-đun SIM900 (như tôi đã nói, về cơ bản là một trình duyệt tích hợp) có thể “phân tích cú pháp” chính xác các yêu cầu không chính xác và phát chúng lên mạng ở dạng chính xác. Đây là một lợi thế khác (tất nhiên là không rõ ràng) của việc sử dụng HTTP, vì nó cho phép người lập trình có một số điểm không chính xác. Nói chung, tất nhiên, yêu cầu phải được viết chính xác và trông như thế này:

NHẬN /d_command.php?UC=1111 HTTP/1.1
CHỦ NHÀ: xxx.ru

Với yêu cầu chính xác như vậy, SIM900 trao đổi thành công cả thông qua ngăn xếp TCP-IP và qua HTTP.

SIM900 bị treo

Đôi khi, khi trao đổi qua GPRS, các tình huống phát sinh sau đó mô-đun có thể bị treo. Điều này có thể là do dữ liệu truyền qua mạng không chính xác và khiến SIM900 rơi vào trạng thái ngừng hoạt động hoặc do nhiễu trên đường truyền trao đổi của mô-đun và bộ điều khiển, trong đó SIM900 nhận được “không như mong đợi” hoặc một số sự cố không xác định khác. Nhà sản xuất chip cảnh báo rằng điều này có thể xảy ra và gợi ý rằng trong những trường hợp như vậy, hãy khởi động lại mô-đun bằng cách sử dụng một chuỗi xung đặc biệt áp dụng cho đầu vào PWRKEY.

Tuy nhiên, hóa ra, điều này không phải lúc nào cũng hữu ích - sau khi khởi động lại như vậy, mô-đun có thể “thức dậy” vẫn “trục trặc”. Và nhà sản xuất cũng cảnh báo chúng ta về điều này nếu chúng ta đọc kỹ DataSheet của mô-đun. Đây là những gì tài liệu khuyến nghị:

LƯU Ý: Nên cắt trực tiếp nguồn điện VBAT thay vì sử dụng chân đặt lại bên ngoài khi SIM900 không thể phản hồi với lệnh AT “AT+CPOWD=1” và chân PWRKEY.

Do đó, cách chính xác nhất để khởi động lại mô-đun là ngắt hoàn toàn nguồn điện khỏi nó (khỏi chân VBAT), đợi một lúc (ít nhất một giây để đề phòng) và cấp lại nguồn. Để khởi động lại mô-đun, tốt hơn là cung cấp một công tắc rơle hoặc bóng bán dẫn trên bo mạch, được điều khiển bởi bộ điều khiển.

Phần kết luận

Trong tương lai, tôi dự định phát hành một loạt bài viết trong đó tôi sẽ cho bạn biết cách tổ chức trao đổi giữa ứng dụng web máy chủ và SIM900, bắt đầu bằng việc mua dịch vụ lưu trữ từ nhà cung cấp và kết thúc bằng việc viết mã chương trình điều khiển.

Tạm biệt! Hãy theo dõi để cập nhật về Lười biếng THÔNG MINH .

Vì vậy, sau một thời gian dài tìm hiểu những điều phức tạp khi làm việc với mô-đun GSM SIM900D, chúng tôi công bố dự án hoạt động đầu tiên kết hợp hệ thống bảo mật với khả năng điều khiển từ xa. Nói tóm lại, thiết bị có khả năng gửi SMS thông báo nếu cảm biến xâm nhập được kích hoạt, thực hiện cuộc gọi để kích hoạt giám sát âm thanh trong phòng, theo dõi nhiệt độ và gửi qua SMS theo yêu cầu, cũng như kiểm soát một số tải dựa trên lệnh được gửi. qua tin nhắn SMS.

Bất kỳ ai đã theo dõi chủ đề này đều biết rằng tôi có một mô-đun GSM và một mô-đun điều khiển cho nó - hai bảng khác nhau được kết nối bằng một bánh sandwich (xem bảng có SIM900D và bảng điều khiển).Trên bảng điều khiển, ngoài bộ vi điều khiển ATmega32a, còn có một mô-đun nguồn được chế tạo trên bộ chuyển đổi LM2596; nó cấp nguồn cho mạch có điện áp không đổi 3,5 volt. Về nguyên tắc, bất kỳ nguồn điện nào khác cũng sẽ làm được, điều chính là nó có khả năng tiêu thụ tối đa 2 ampe trong thời gian ngắn (đây chính xác là mức tiêu thụ của mô-đun GSM tại thời điểm đăng ký).

Để thuận tiện, màn hình của điện thoại Nokia3310 được kết nối với bảng điều khiển, các phương pháp làm việc đã được mô tả nhiều lần trên trang web này. Nhờ màn hình, bạn có thể nhanh chóng xác định trạng thái của thiết bị và giá trị của cảm biến.

Kết quả là sơ đồ kết nối thu được trông như thế này (có thể nhấp vào):

Việc đánh số các chân của bộ vi điều khiển trong sơ đồ được đưa ra cho gói DIP, vì vậy nếu bạn lặp lại mạch bằng bộ vi điều khiển trong gói TQFP, hãy cẩn thận, cách đánh số chân sẽ khác. Bộ vi điều khiển được lấy xung nhịp từ một thạch anh bên ngoài ở tần số 16 MHz.

Đường kẻ Điều khiểnđi từ bộ thu của bóng bán dẫn Q2 đến chân PortD.4 của vi điều khiển đã được thêm vào để tái bảo hiểm và cần thiết để theo dõi xem mô-đun có được bật hay không. Vì ngưỡng tắt của SIM900 là 3,2 volt nên ngay cả khi điện áp giảm nhẹ, mô-đun sẽ tự động tắt, trong khi bộ vi điều khiển sẽ tiếp tục hoạt động và thực hiện chương trình (ngưỡng đặt lại cho ATmega32a là 2,7 volt). Trong điều kiện hoạt động, đường này ở mức thấp. Nếu vi điều khiển phát hiện dòng này ở mức cao, mô-đun GSM sẽ khởi động lại chức năng.

Và đây là những gì nó trông giống như trong hành động vào lúc này.

Sau lần sửa đổi cuối cùng của chương trình, tất cả những thứ này sẽ được đưa vào hộp và các kết nối có thể tháo rời Chúng sẽ được niêm phong để đảm bảo độ tin cậy.

Màn hình hiển thị các thông tin cơ bản về trạng thái của thiết bị: tên người vận hành, chất lượng tín hiệu liên lạc, giá trị nhiệt độ từ cảm biến 18b20, trạng thái đầu ra tải và cảm biến xâm nhập, cũng như thời gian và ngày.

Video kích hoạt mô-đun

Ngày và giờ được lấy từ đồng hồ được tích hợp trong mô-đun GSM. Để chúng hoạt động, cần phải có pin 3 volt được kết nối với chân 15 (VRTC). Nên lắp đặt diode D1 có điện áp rơi thấp, ví dụ như Schottky. Việc cài đặt ngày giờ được thực hiện thủ công, các lệnh đã được mô tả trước đó

Ngày được hiển thị trên màn hình ở định dạng thu được từ mô-đun, nghĩa là đầu tiên là năm, sau đó là tháng và ngày. Tôi vẫn chưa thay đổi gì ở đây.

Cảm biến DS18B20 có nhiệm vụ đo nhiệt độ; nó được kết nối với chân PortD.3 của vi điều khiển.

Bạn có thể kết nối bất kỳ tải nào với PortD.6 và điều khiển nó thông qua các lệnh SMS. Bây giờ tôi có một đèn LED treo - D4 trên sơ đồ. Nhưng không có gì ngăn cản bạn treo rơle hoặc triac ở đây và kiểm soát thứ gì đó nghiêm trọng hơn.

Vì mục đích bảo mật, dự kiến ​​​​sẽ sử dụng cảm biến chuyển động HC-SR501, được mua trên E-bay. Nếu được kích hoạt, một logic sẽ xuất hiện ở đầu ra cảm biến. Sau khi bắt được nó, vi điều khiển sẽ ra lệnh gửi tin nhắn SMS đến số điện thoại được chỉ định trong chương trình.

Đầu ra cảm biến được kết nối với chân PortD.7 của bộ vi điều khiển; trong sơ đồ, cảm biến thường được thay thế bằng một nút.

Thay vì cảm biến chuyển động, bạn có thể cài đặt bất kỳ phương tiện phát hiện xâm nhập nào khác - cảm biến mở cửa sổ và cửa ra vào, cảm biến vỡ kính, cảm biến quang điện, v.v. nói chung, mọi thứ mà trí tưởng tượng của bạn có thể làm được.

Để ngăn việc gửi SMS cảnh báo nhiều lần trong trường hợp kích hoạt cảm biến, một hạn chế đã được đưa vào chương trình: sau khi gửi SMS đầu tiên, lệnh cấm sẽ được áp dụng cho lần gửi tiếp theo. Để kích hoạt lại tính năng gửi tin nhắn thông báo khi cảm biến được kích hoạt, bạn cần gửi SMS có lệnh cụ thể đến mô-đun. Khi việc gửi SMS bị cấm, dấu chấm than sẽ xuất hiện trên màn hình bên cạnh trạng thái cảm biến.

Danh sách lệnh

Và đây là danh sách các lệnh trong SMS mà mô-đun xử lý. Để thuận tiện và đơn giản, các lệnh là kỹ thuật số; có lẽ trong các phiên bản phần sụn sau này sẽ có tên lệnh có ý nghĩa hơn :)

0 - Ngắt kết nối tải (Pin PortD.6 được đặt ở mức logic 0)

1 - Bật tải (Pin PortD.6 được đặt thành logic 1)

2 - Sau khi nhận lệnh này, module sẽ gọi lại số điện thoại được chỉ định trong chương trình

3 - Yêu cầu số dư của bạn và gửi lại qua SMS đến số được chỉ định. Có một sắc thái quan trọng ở đây - câu trả lời cho các yêu cầu USSD phải bằng tiếng Latinh. Nếu không, thay vì văn bản có ý nghĩa, phản hồi sẽ là một thông báo ở dạng mã hóa thập lục phân. Bạn cần kiểm tra với nhà cung cấp dịch vụ của mình cách chuyển đổi USSD sang tiếng Latin. Ví dụ: trên thẻ SIM tôi sử dụng từ Smarts, bạn cần nhập *102*1# (trong loa *105*0#)

4 - Yêu cầu nhiệt độ. Giá trị nhiệt độ sẽ được gửi cho chúng tôi qua SMS.

5 - Cho phép gửi tin nhắn nếu cảm biến xâm nhập được kích hoạt.

6 - Cấm gửi SMS thông báo từ cảm biến xâm nhập.

? - Theo lệnh này, mô-đun sẽ gửi cho chúng tôi một SMS chứa thông tin chung về thiết bị, chẳng hạn như giá trị từ cảm biến nhiệt độ, tải có bật hay không, trạng thái đầu vào từ cảm biến xâm nhập và liệu có gửi SMS thông báo từ nó hay không được cho phép.Ví dụ: một tin nhắn có thể trông như thế này: nhiệt độ +24, tắt tải, đầu ra cảm biến chuyển động 0, gửi SMS nếu được kích hoạt đều bị cấm.

Bây giờ cách định cấu hình mô-đun để gửi SMS đến số của bạn. Trong kho lưu trữ có chương trình, chúng tôi tìm thấy tệp chính của chương trình, nó được gọi là “chương trình” :) và chúng tôi tìm thấy một hằng số trong đó:

Hằng số Số điện thoại = "+7908390xxxx"

Chúng tôi thay thế số điện thoại của bạn tại đây, biên dịch chương trình và lấy tệp chương trình cơ sở hex.

Chương trình, như mọi khi, được viết bằng Bascom-AVR, vì vậy việc hiểu thuật toán làm việc với mô-đun GSM khá đơn giản. Chúc may mắn!

Và cuối cùng là phần minh họa cách mô-đun xử lý các lệnh.

Đặc biệt cảm ơn người bạn lâu năm của trang web Sergei RD3AVJ vì đã tham gia và hỗ trợ phát triển!

CẬP NHẬT: từ ngày 31/10/12

Tôi đã sửa đổi một chút phần sụn, bây giờ để đặt số lượng SMS thông báo sẽ được gửi, bạn không cần phải biên dịch lại chương trình. Chỉ cần gửi một tin nhắn SMS có tin nhắn đến mô-đun là đủ "Số đầu tiên" (không có dấu ngoặc kép) và số mà lệnh này được gửi đi sẽ được ghi vào bộ nhớ cố định của vi điều khiển.

Cách đây không lâu, một người bạn đã mời tôi một công việc liên quan đến tạo phần sụn cho một bộ vi điều khiển được cho là giao tiếp với máy chủ bằng mô-đun SIM900D GSM. Trước đây tôi chưa từng làm bất cứ điều gì liên quan đến lập trình bộ vi điều khiển và lần cuối cùng tôi lập trình bằng C là khi còn là sinh viên, nhưng sự tò mò đã chiếm ưu thế và tôi phải bắt tay vào làm. Tài liệu về phần cứng này có sẵn trên Internet, nhưng không thể tìm thấy các ví dụ hay về cách làm việc với TCP/IP trong mã. Không còn gì để làm ngoài việc chất đầy tài liệu, dự trữ thuốc lá và trà, rồi bắt đầu di chuyển giữa những chiếc cào. Và có rất nhiều cái cào. Thực ra đó là lý do tại sao tôi viết bài này - để giúp người khác dễ dàng hơn.

Những gì cần thiết

Cần phải viết mã có thể khởi tạo mô-đun GSM, thiết lập kết nối với máy chủ, nhận và gửi dữ liệu tùy ý, kiểm tra trạng thái kết nối và hoạt động mà không gặp lỗi. Và cũng đủ nhỏ gọn để vừa với bộ nhớ hạn chế của bộ vi điều khiển và chừa chỗ cho chức năng chính và một chút dự trữ.

Cuối cùng thì chuyện gì đã xảy ra

Kết quả là một mã C có thể làm được mọi thứ cần thiết. Do yêu cầu về tính gọn nhẹ, chúng tôi đã phải phân tích cú pháp các câu trả lời và tạo ra các chuỗi bằng cách sử dụng mã của riêng mình, điều này thậm chí còn gây lúng túng khi hiển thị cho những người trung thực. Vì vậy, tôi khuyên mọi người nên sử dụng biểu thức chính quy cho những mục đích này. Tôi cũng sẽ chuyển mã của mình sang một công cụ biểu thức chính quy nhẹ, nhưng sau khi tạo một chương trình cơ sở đầy đủ chức năng.

Mã này yêu cầu các hàm/macro hoạt động với cổng nối tiếp, cũng như sự hiện diện của các hàm memset và memcpy. Vì vậy, nó có thể được chuyển sang nền tảng khác một cách tương đối dễ dàng mà không cần chạm vào nhiều thư viện trong quá trình thực hiện.

Và nó trông như thế nào?

Việc lập trình và thử nghiệm được thực hiện trong Windows 7. Mã thu được đã trở thành tài liệu chính cho bài viết này. Tôi sẽ không cung cấp mã đầy đủ và nhận xét về nó mà thay vào đó tôi sẽ hiển thị thuật toán thiết lập và làm việc với mô-đun GSM.

Các tính năng mà mã yêu cầu:

  • uint16_t init_serial_port(char *port_name) Hàm này cấu hình cổng nối tiếp được chỉ định. Dưới Windows.
  • uint16_t put_serial(uint8_t *buffer, uint16_t size) Và cái này ghi một chuỗi byte vào cổng này.
  • gets_serial(uint8_t *buffer, uint16_t size) Điều này, theo đó, đọc một chuỗi byte từ cổng nối tiếp.
Các chức năng mà mã cung cấp:
  • init_gprs() & stop_gprs() Mô-đun GSM được khởi tạo và vô hiệu hóa tương ứng.
  • uint16_t connect_gprs(uint8_t index, uint8_t mode, char *address, char *port) Thiết lập kết nối với máy chủ. Điều đáng chú ý là mô-đun này có thể hoạt động với các giao thức TCP và UDP với tư cách là máy khách và máy khách. Hỗ trợ tối đa 8 kết nối đồng thời.
  • uint16_t close_gprs(uint8_t index) Đóng kết nối đã chỉ định.
  • uint16_t send_gprs(uint8_t index, uint8_t *buffer, uint16_t size) Gửi tin nhắn thông qua kết nối được chỉ định.
  • uint16_t recv_gprs(uint8_t index, uint8_t *buffer, uint16_t size) Nhận tin nhắn. Chức năng không chặn, có nghĩa là nó sẽ không đợi dữ liệu xuất hiện trong luồng mà sẽ trả về quyền kiểm soát nếu không có gì để nhận. Điều đáng chú ý là hành vi này dễ thực hiện hơn là chặn.

Cách làm việc với cổng nối tiếp

Nó khá đơn giản. Có các macro dành cho bộ vi điều khiển đích để gửi/nhận dữ liệu qua USART, nhưng vì việc gỡ lỗi mã đó từ máy tính để bàn dễ dàng hơn nên tôi đã được cung cấp một gói từ bộ chuyển đổi USB<->Mô-đun USART và GSM. Tất cả những gì còn lại là học cách làm việc với cổng nối tiếp trong Windows. Hóa ra lại đơn giản. Nói tóm lại, một cổng nối tiếp được thể hiện trong HĐH dưới dạng một tệp thông thường, thông tin được truyền bằng các chức năng ReadFile và WriteFile. Bạn chỉ cần đặt một số tham số bằng hàm SetCommTimeouts và SetCommState.

Chức năng khởi tạo cổng trông như thế này:
uint16_t init_serial_port(char *port_name) ( COMMTIMEOUTS hết thời gian chờ; tham số DCB; int result; serial_port_handle = CreateFile(port_name, // "\\\\.\\COMx" GENERIC_READ | GENERIC_WRITE, 0, // Giá trị của các tham số tiếp theo đã được sửa khi làm việc với cổng NULL, OPEN_EXISTING, 0, NULL); if (serial_port_handle == INVALID_HANDLE_VALUE) ( printf("Lỗi mở cổng nối tiếp!\n"); return 1; ) // Thời gian tối đa giữa việc đọc hai byte trong một hàng timeouts.ReadIntervalTimeout = 100 ; // Giá trị tiếp theo được nhân với số ký tự được đọc từ thời gian chờ của cổng.ReadTotalTimeoutMultiplier = 0; // và được thêm vào giá trị này, thời gian tối đa để hoàn thành // toàn bộ thao tác sẽ thu được timeouts.ReadTotalTimeoutConstant = 1000 // Giá trị giống như hai tham số trước đó, tuy nhiên, thời gian chờ được tính để ghi. ( printf("Lỗi cài đặt thời gian chờ cho cổng nối tiếp!\ n"); close_serial_port(); trả về 1; ) // Các tham số cổng chứa các cài đặt đơn giản nhất - không có tính chẵn lẻ, // không có điều khiển luồng, 1 bit stop. memset(¶meters,0,sizeof(parameters)); tham số.DCBlength = sizeof(DCB); GetCommState(serial_port_handle, ¶meters); tham số.BaudRate = (DWORD)BAUD_RATE; tham số.ByteSize = 8; tham số.Parity = NOPARITY; tham số.StopBits = ONETOPBIT; tham số.fAbortOnError = TRUE; tham số.fDtrControl = DTR_Control_DISABLE; tham số.fRtsControl = RTS_Control_DISABLE; tham số.fBinary = TRUE; tham số.fParity = FALSE; tham số.fOutX = FALSE; tham số.fInX = FALSE; tham số.XonChar = (uint8_t)0x00; tham số.XoffChar = (uint8_t)0xff; tham số.fErrorChar = FALSE; tham số.fNull = FALSE; tham số.fOutxCtsFlow = FALSE; tham số.fOutxDsrFlow = FALSE; tham số.XonLim = 128; tham số.XoffLim = 128; result = SetCommState(serial_port_handle, ¶meters); if (result == 0) ( printf("Lỗi cài đặt tham số cổng nối tiếp!\n"); close_serial_port(); return 1; ) return 0; )

Giao tiếp với mô-đun GSM diễn ra như thế nào?

Khi cổng nối tiếp được cấu hình, các lệnh AT có thể được gửi tới nó. Lệnh đầu tiên phải là chuỗi "AT\r", cho phép mô-đun tự động điều chỉnh tốc độ truyền trên cổng nối tiếp. Phản hồi sau đó có thể nhận được từ cổng sẽ có dạng "AT\r\r\nOK\r\n" .

Lệnh này là một chuỗi ký tự ASCII đơn giản. Để lệnh được mô-đun chấp nhận, bạn cần đặt ký tự xuống dòng "\r" ở cuối lệnh. Để phản hồi, mô-đun sẽ truyền một chuỗi ký tự bao gồm hai phần - lệnh mà mô-đun phản hồi và phản hồi được phân tách khỏi nó bằng các ký tự "\r\r\n", kết thúc bằng các ký tự "\r\n " . Để phân tích cú pháp phản hồi thuận tiện hơn, tôi đã tạo một macro đặt con trỏ ở đầu phản hồi trong bộ đệm nhận. Nếu bạn muốn xuất phản hồi ra bảng điều khiển, bạn cần thêm ký tự null vào cuối tin nhắn đã nhận.

Void at_send(char *cmd, uint16_t size) ( uint16_t result; cmd = "\r"; result = put_serial(cmd, size); return; ) uint16_t at_recv(uint8_t *buffer, uint16_t size) ( uint16_t result; result = gets_serial (bộ đệm, kích thước); kết quả trả về;
Đây gần giống như các chức năng phụ trợ để gửi lệnh và nhận phản hồi.

Khởi tạo mô-đun

Hàm lớn nhất trong mã chịu trách nhiệm cấu hình mô-đun. Trong quá trình khởi tạo, nhiều lệnh AT được gửi đi. Tôi sẽ mô tả chúng theo thứ tự chúng được gửi đến mô-đun. Tôi không mô tả chi tiết các đối số và tùy chọn trả lời vì chúng có thể được tìm thấy trong tài liệu.
  • "AT+CPIN=pin-code" Như bạn có thể đoán, lệnh này sẽ mở khóa thẻ SIM bằng cách nhập mã pin. Để kiểm tra xem có cần mã PIN hay không, bạn có thể sử dụng lệnh "AT+CPIN?" .
  • "AT+CREG?" Lệnh này trả về trạng thái đăng ký của mô-đun trên mạng. Bạn cần thực hiện việc này cho đến khi mô-đun phản hồi rằng nó đã được đăng ký trên mạng.
  • "AT+CGATT=1" Buộc mô-đun kết nối với GPRS. Bạn có thể kiểm tra xem nó có được kết nối bằng lệnh "AT+CGATT không?" .
  • "AT+CIPRXGET=1" Cho phép truy xuất thủ công dữ liệu được truyền qua kết nối. Theo mặc định, tùy chọn này bị tắt và dữ liệu sẽ được gửi đến cổng nối tiếp ngay khi nhận được. Điều này không thuận tiện lắm, mặc dù nó không quan trọng - bạn có thể định cấu hình mô-đun để cùng với dữ liệu, nó cũng truyền các tiêu đề IP, qua đó bạn có thể xác định gói được nhận từ ai. Tôi quyết định rằng việc lấy dữ liệu theo cách thủ công sẽ dễ dàng hơn và tôi đã không nhầm. Theo tôi hiểu, lệnh này chỉ được chấp nhận bởi các mô-đun SIM.COM GSM.
  • "AT+CIPMUX=1" Theo mặc định, mô-đun chỉ có thể thiết lập một kết nối. Cài đặt này cho phép khả năng tạo nhiều kết nối. Việc gửi và nhận dữ liệu sẽ chỉ khác nhau ở một tham số - chỉ mục kết nối.
  • "AT+CSTT="internet"" APN - Tên điểm truy cập, tên điểm truy cập cho GPRS. Đối với nhà cung cấp của tôi, nó trông giống hệt như thế này.
  • "AT+CIICR" Thiết lập kết nối không dây GPRS. Có thể mất một chút thời gian, vì vậy bạn cần chạy nó theo vòng lặp và kiểm tra câu trả lời.
  • "AT+CIFSR" Trả về địa chỉ IP của mô-đun. Tôi sử dụng nó để kiểm tra xem mô-đun có được kết nối với internet hay không.
  • "AT+CDNSCFG="8.8.8.8","8.8.4.4"" Lệnh này đặt máy chủ DNS mà mô-đun sẽ sử dụng.
  • "AT+CIPSTATUS" Ngoài thông tin về trạng thái kết nối, lệnh này còn cung cấp thông tin về việc mô-đun có sẵn sàng thiết lập kết nối hay không. Vì vậy bạn cần phải kiểm tra câu trả lời của cô ấy.
Sau khi thực hiện các lệnh này, mô-đun sẽ sẵn sàng để sử dụng. Vâng, hoặc nó sẽ không. Nó phụ thuộc vào may mắn của bạn.

Tạo và ngắt kết nối

Kết nối được tạo bằng lệnh "AT+CIPSTART=index,"mode","address","port"" .
  • chỉ số cho biết số serial của kết nối, có thể lấy giá trị từ 0 đến 7.
  • chế độ chỉ định giao thức sẽ được sử dụng bởi kết nối. Có thể là "TCP" hoặc "UDP".
  • address chỉ định địa chỉ máy chủ. Nếu máy chủ DNS được chỉ định trong quá trình thiết lập, bạn có thể sử dụng cả địa chỉ IP và tên miền.
  • cổng chỉ định cổng máy chủ mà kết nối sẽ được thiết lập.
Lưu ý rằng khi sử dụng giao thức UDP, theo mặc định, các datagram sẽ chỉ được gửi và nhận từ một địa chỉ. Để sử dụng tối đa UDP và gửi/nhận dữ liệu từ bất kỳ địa chỉ nào, bạn có thể sử dụng cái gọi là chế độ UDP mở rộng, được định cấu hình bằng lệnh "AT+CIPUDPMODE". Tôi giới thiệu bạn với tài liệu để biết chi tiết.

Để đáp lại một lệnh, bạn có thể nhận được một số câu trả lời có thể có. Nếu mọi thứ đều ổn, thì sau tiêu chuẩn “OK”, sau một khoảng thời gian ngắn, bạn có thể nhận được một trong ba câu trả lời:

  • "index,ALREADY CONNECT" điều này có nghĩa là một kết nối với chỉ mục đã cho đã được thiết lập và rất đáng để tìm kiếm nó.
  • "index,CONNECT OK" mọi thứ đều rõ ràng ở đây.
  • "index,CONNECT FAIL" có nghĩa là đã xảy ra sự cố khi thiết lập kết nối.
Bạn có thể đóng kết nối bằng lệnh "AT+CIPCLOSE=index" . Bạn có thể ngắt tất cả các kết nối và tắt giao diện GPRS bằng lệnh "AT+CIPSHUT".

Truyền dữ liệu

Dữ liệu được truyền bằng lệnh "AT+CIPSEND=index,length", trong đó chỉ mục chỉ định kết nối mà dữ liệu sẽ được gửi và độ dài chỉ định độ dài của gói dữ liệu. Nhân tiện, bạn có thể tìm ra MTU cho mỗi kết nối bằng lệnh "AT+CIPSEND=?" .

Nếu tất cả đều ổn, mô-đun sẽ phản hồi lệnh bằng dấu nhắc “>”, sau đó bạn cần gửi dữ liệu đến cổng nối tiếp. Khi mô-đun nhận được một số byte bằng độ dài, nó sẽ có nội dung như "index,SEND OK". Nói chung, bạn không phải sử dụng tham số độ dài, nhưng trong trường hợp này phần cuối của gói dữ liệu phải được biểu thị rõ ràng bằng ký hiệu 0x1A, trong tổ hợp đầu cuối Ctrl+Z. Tùy chọn này rõ ràng là không phù hợp để truyền dữ liệu tùy ý.

Như bạn có thể thấy, truyền dữ liệu không phải là một quá trình quá phức tạp. Do đó, hãy chuyển sang phần thú vị nhất - nhận dữ liệu.

Đang nhận dữ liệu

Ngay khi mô-đun GSM nhận được dữ liệu, nó sẽ báo hiệu điều này bằng cách gửi một chuỗi như "+CIPRXGET:1,index\r\n" tới cổng nối tiếp. Thực lòng tôi không biết nó nghĩa là gì, vì chức năng mô-đun này không được ghi chép đầy đủ, nhưng đối với tôi, nó xuất hiện trong tất cả các thông báo về việc nhận gói.

Tôi không thích ý nghĩ phải theo dõi các thông điệp của mô-đun bằng cách này hay cách khác. Tuy nhiên, sau khi chơi một chút với trình gỡ lỗi, tôi phát hiện ra rằng mô-đun này không gửi bất kỳ thông báo không đồng bộ nào khác và sau khi thực hiện bất kỳ lệnh AT nào, thông báo này sẽ xuất hiện ở đầu bộ đệm. Vì tôi đã tạo macro để tách phản hồi khỏi lệnh bằng cách tìm kiếm chuỗi con "\r\r\n" , nên tôi không bị ảnh hưởng gì. Như vậy chức năng tiếp nhận dữ liệu đã được thực hiện khá đơn giản.

Vì vậy, bạn có thể nhận dữ liệu bằng lệnh "AT+CIPRXGET=2,index,length" . Hai phương tiện nhận chế độ, trong trường hợp này các byte chỉ đơn giản được đổ vào cổng nối tiếp. Bạn cũng có thể chỉ định nhận dữ liệu dưới dạng văn bản HEX, có lẽ là để tránh xung đột với điều khiển luồng phần mềm. Tôi không cần điều này vì tôi không hề sử dụng tính năng kiểm soát luồng. Tham số độ dài chỉ định kích thước của gói dữ liệu mà chúng ta muốn nhận tại một thời điểm.

Đáp lại, chúng tôi sẽ nhận được một cái gì đó như "+CIPRXGET:2,index,received,excess\r\n__DATA__\r\nOK\r\n" . Trường nhận được sẽ chứa số byte trong gói dữ liệu __DATA__ và trường vượt quá sẽ chứa số byte đang chờ trong bộ đệm mô-đun. Vì vậy, nếu trường nhận được bằng 0, bạn có thể nói với lương tâm trong sáng rằng không có gì để nhận. Trên thực tế, bằng cách sử dụng tính năng này, tôi đã triển khai chức năng không chặn để nhận dữ liệu.

Cuối cùng

Trước khi viết mã, tôi thực sự khuyên bạn nên làm quen với các lệnh AT bằng PuTTY, lệnh này hoạt động tốt với cổng nối tiếp.

Tôi hy vọng thông tin trong bài viết này sẽ giúp được ai đó viết mã cho SIM900 của họ. Rất có thể các nguyên tắc làm việc với mô-đun GSM nêu trên có thể được áp dụng cho các mô-đun của các kiểu máy khác và có thể cả các nhà sản xuất.

Thẻ:

  • vi điều khiển
  • lập trình
  • gsm
  • gprs
Thêm thẻ