การใช้งาน SD shield, GPRS shield ร่วมกับ Arduino Mega

Issue:
ที่ผ่านมาเราใช้ mega ขา 10, 11 ต่อเข้ากับ gprs shield ขา 7, 8 (SWserial)
แต่เมื่อมี sd shield มาต่อด้วย ทำให้เราใช้ขา 10, 11 ดังกล่าวไม่ได้เพราะมันทับกับ
ขา spi ที่ต้องใช้สื่อสารกับ sd shield

Objective:
บทความนี้เสนอการแก้ปัญหาการใช้งาน SD shield, GPRS shield ร่วมกับ Arduino Mega
โดยใช้ HWserial (ขา 14, 15) แทน SWserial  (ขา 10, 11)

Hardware:
1. arduino mega
2. gprs shield พร้อม ซิม
3. sd shield
4. สายไฟ สาย USB และอื่นๆ

ต่อวงจรเข้าด้วยกันตามรูป โดย
1. mega ขา 14 -> gprs ขา 8
2. mega ขา 15 -> gprs ขา 7
3. set jumper บน gprs ไปที่ SW uart
4. mega ขา 53 -> gprs ขา 4 เพื่อเชื่อมกับ sd shield ขา 4 ที่อยู่ตรงกลาง

Software:
1. Arduino IDE

เขียนโปรแกรม:
ใช้ "Serial3 เชื่อมต่อ gprs" และ "Serial เชื่อมต่อคอมพิวเตอร์"
โปรแกรมด้านล่างเป็นการเปิดไฟล์ที่อยู่ใน sd card และแสดงข้อมูลภายในออกมาทาง serial 
จากนั้นเชื่อมต่อ gprs เพื่อทดสอบการเปิดเว็บด้วย AT command

#include <SPI.h>
#include <SD.h>

File myFile;
char myFileName[] = "20160405.TXT";
const int baudRate = 19200;
const int chipSelect = 53;
const int delay_normal = 500;
const int timeout = 3000;
const char expected_answer1[] = "OK";

unsigned char buffer[64]; // buffer array for data recieve over serial port
int count=0;                         // counter for buffer array 

void setup() {
    init_serial_sd();
    open_and_read_file();
    
    init_serial_gprs();
    sendATcommand("AT");
    sendATcommand("ATI");
    sendATcommand("AT+SAPBR=3,1,\"Contype\",\"GPRS\"");
    sendATcommand("AT+SAPBR=3,1,\"APN\",\"internet\"");
    sendATcommand("AT+SAPBR=1,1");
    sendATcommand("AT+SAPBR=2,1");
    sendATcommand("AT+HTTPINIT");
    sendATcommand("AT+HTTPPARA=\"CID\",1");
    sendATcommand("AT+HTTPPARA=\"URL\",\"203.158.110.131\"");
    sendATcommand("AT+HTTPACTION=0");
    sendATcommand("AT+HTTPREAD");
}

void loop() {
}

void sendATcommand(const char* ATcommand)
{
    unsigned char x = 0, answer = 0;
    char response[100];  
    unsigned long previous;
    memset(response, '\0', 100);
    delay(delay_normal);
  
    while(Serial3.available() > 0)
    {
        Serial3.read();
    }
    Serial3.println(ATcommand);

    previous = millis();
    do{
        if(Serial3.available() != 0){    
            response[x] = Serial3.read();
            x++;
        }
    }while((millis() - previous) < timeout);
    Serial.println(response);
}

void init_serial_gprs(){
    Serial3.begin(baudRate);
    while (!Serial3) {
        ; // wait for serial port to connect. Needed for native USB port only
    }
}

void open_and_read_file(){
    myFile = SD.open(myFileName);
    if (myFile) {
        Serial.println(myFileName);
        while (myFile.available()) {
            Serial.write(myFile.read());
        }
        myFile.close();
    } else {
        Serial.println("error opening the file");
    }
}

void init_serial_sd(){
    Serial.begin(baudRate);
    while (!Serial) {
        ; // wait for serial port to connect. Needed for native USB port only
    }
    Serial.print("Initializing SD card...");

    if (!SD.begin(chipSelect)) {
        Serial.println("initialization failed!");
        return;
    }
    Serial.println("initialization done.");
}

Result:

Further issue:
การใช้งาน AT command "AT+SAPBR=1,1" และ "AT+HTTPINIT" มีหลายครั้งที่เกิด ERROR แต่ยังสามารถเปิดเว็บได้

อ้างอิง:
[1] Problem in transfering a text file to FTP server using the GPRS and SIM900 http://forum.arduino.cc/index.php?topic=178607.0

ไฟล์:

Comments

Popular posts from this blog

การสร้างหน้า google maps ใน ionic slide menu

การใช้ MATLAB ย้ายข้างสมการ

การตั้งค่า Raspberry Pi 3 เพื่อเชื่อมต่อ RS485