การใช้งาน SD shield, GPRS shield ร่วมกับ Arduino Mega
Issue:
ที่ผ่านมาเราใช้ mega ขา 10, 11 ต่อเข้ากับ gprs shield ขา 7, 8 (SWserial)
แต่เมื่อมี sd shield มาต่อด้วย ทำให้เราใช้ขา 10, 11 ดังกล่าวไม่ได้เพราะมันทับกับ
ขา spi ที่ต้องใช้สื่อสารกับ sd shield
ขา 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
Post a Comment