mega 2560 + efcom gsm shielg
- Войдите на сайт для отправки комментариев
Ср, 31/07/2013 - 14:47
Помогите азобаться с подключением по этому мануалу
http://www.elecfreaks.com/wiki/index.php?title=EFCom_GPRS/GSM_Shield
Помогите азобаться с подключением по этому мануалу
http://www.elecfreaks.com/wiki/index.php?title=EFCom_GPRS/GSM_Shield
Берете шилд, насаживаете его на дуину и вуаля - готово, все подключено!
Затем вставил нижеприведенный код но на этапе компиляции выдало ошибку
//Serial Relay - Arduino will patch a //serial link between the computer and the GPRS Shield //at 19200 bps 8-N-1 //Computer is connected to Hardware UART //GPRS Shield is connected to the Software UART #include <NewSoftSerial.h> NewSoftSerial mySerial(2, 3); void setup() { mySerial.begin(19200); // the GPRS baud rate Serial.begin(19200); // the GPRS baud rate } void loop() { if(Serial.available()) { mySerial.print((unsigned char)Serial.read()); } else if(mySerial.available()) { Serial.print((unsigned char)mySerial.read()); } }ошибка
Еще можете объяснить что за провода идут на нижней катинке
http://www.elecfreaks.com/4446.html
Вот дарю Переводчик. Этими проводами можно подключаться к аппаратным UART'ам Меги.
Переводчик помог?
#include <SoftwareSerial.h> SoftwareSerial mySerial(2, 3); void setup() { mySerial.begin(19200); // the GPRS baud rate Serial.begin(19200); // the GPRS baud rate } void loop() { if(Serial.available()) { mySerial.print((unsigned char)Serial.read()); } else if(mySerial.available()) { Serial.print((unsigned char)mySerial.read()); } }Переводчик помог?
#include <SoftwareSerial.h> SoftwareSerial mySerial(2, 3); void setup() { mySerial.begin(19200); // the GPRS baud rate Serial.begin(19200); // the GPRS baud rate } void loop() { if(Serial.available()) { mySerial.print((unsigned char)Serial.read()); } else if(mySerial.available()) { Serial.print((unsigned char)mySerial.read()); } }да помог
//Serial Relay - Arduino will patch a //serial link between the computer and the GPRS Shield //at 19200 bps 8-N-1 //Computer is connected to Hardware UART //GPRS Shield is connected to the Software UART #include <SoftwareSerial.h> SoftwareSerial mySerial(0, 1); void setup() { mySerial.begin(9600); // the GPRS baud rate Serial.begin(9600); // the GPRS baud rate } void loop() { if (mySerial.available()) Serial.write(mySerial.read()); if (Serial.available()) mySerial.write(Serial.read()); }попробовал использовать 0 и 1 порт ,при посылке АТ команды мигает лампочка RX на плате но ответа нет
Прочитайте полностью описание платформы Arduino Mega2560.
Связь
На платформе Arduino Mega2560 установлено несколько устройств для осуществления связи с компьютером, другими устройствами Arduino или микроконтроллерами. ATmega2560 поддерживает 4 порта последовательной передачи данных UART для TTL. Установленная на плате микросхема ATmega8U2 направляет один из интерфейсов через USB, предоставляя виртуальный COM порт программам на компьютере...
Выводы 0 и 1 подключены к соответствующим выводам микросхемы последовательной шины ...ATmega8U2... направляет один из интерфейсов через USB, предоставляя виртуальный COM порт программам на компьютере..
Выводы 0 и 1 - COM порт.
Подключаю вот таким образом, к 16 и 17 порту. на gsm подключаю без перемычек , просто к крайним выводам D3.
Прописываю следующий код
//Serial Relay - Arduino will patch a //serial link between the computer and the GPRS Shield //at 19200 bps 8-N-1 //Computer is connected to Hardware UART //GPRS Shield is connected to the Software UART #include <SoftwareSerial.h> SoftwareSerial mySerial(16, 17); void setup() { mySerial.begin(19200); // the GPRS baud rate Serial2.begin(19200); // the GPRS baud rate } void loop() { if (mySerial.available()) Serial2.write(mySerial.read()); if (Serial2.available()) mySerial.write(Serial2.read()); }но на команду AT ничего не приходит
А зачем вы пользуетесь программным UARTом если подключились к аппаратному? И вы все по прежнему "засовываете змее хвост в рот и спрашиваете почему она не ползет".
void setup() { Serial.begin(19200); // the GPRS baud rate Serial2.begin(19200); // the GPRS baud rate Serial.print("start"); } void loop() { if (Serial.available()) Serial2.write(Serial.read()); if (Serial2.available()) Serial.write(Serial2.read()); }start при открытии монитора печатается?
Так же есть вариант проверить шилд в обход дуины, заливаете в дуину сей код:
void setup() {} void loop() {}и ставите вот так перемычки:

void setup() { Serial.begin(19200); // the GPRS baud rate Serial2.begin(19200); // the GPRS baud rate Serial.print("start"); } void loop() { if (Serial.available()) Serial2.write(Serial.read()); if (Serial2.available()) Serial.write(Serial2.read()); }Этот код заработал, делал звонки отправлял сообщения с помощью АТ команд, но вот с библиотекой не получается, она помойму работает с програмным юартом
БИБЛИОТЕКА
Разобрался, с другой библиотекой все работает отлично, позже скину на нее ссылку
Разобрался, с другой библиотекой все работает отлично, позже скину на нее ссылку
А где обещенная ссылка?
Извиняюсь за такую задержку, вот библиотека
https://code.google.com/p/gsm-shield-arduino/downloads/list
Здравствуйте!
Не могу заставить работать этот efcom с мегой. Все варианты перепробовал и скорости - молчит окоянный! Другой модем (другая модель) нормально работает на аппаратном. Этот же диодиками мыргает, но молчит. Что может быть?
Таже проблема, не могу заставить работать на меге, на уно все гуд. maksim вопрос к вам ваш пример для хард сериал?
Уно на ура работает с наследниками класса GSM. Принимает, отправляет смс, звонит. И все это можно увидеть на мониторе.
На мега - проблема за проблемой, программно - включаю кнопку питания - запускаеться по настроению. Верю, что проблему можно решиль с помощью доп питания. Дальше, больше - Ни сериал потр, ни NEW Сериал, ни Хардвер - порт, ни преславутые ноги 50, 51 ни 6,7; 7,8; 10,11; и иже с ними перемычки на плате (icomsat 1.1) ставил по-разному.
Шилд живет своец собственной, скрытной жизнью. А мега, хоть и пишет в мониторе, значения аналоговыых входов, т.е. работает - все равно - непонятно.
Может кто разобрался, покажите в картинках, куда, что... Танцы с бубном - уже надоели
#include <SoftwareSerial.h> SoftwareSerial port1(52,53); char Result; void setup() { Serial.begin(9600); port1.begin(9600); } void loop() { port1.listen(); while (port1.available() > 0) { char Result = port1.read(); Serial.write(Result); } }Для меги подключение хитрО
Вот тут на фото видно (для Icomsat v1.1)
Крайние выводы (rx и tx) подключаются к выводам меги. tx - 19, rx - 18
не знаю как сюда подцепить архив с библиотекой.
Вот вспомнил где я нашел способ подключения: http://competefornothing.com/arduino-mega-2560-r3-using-itead-studio-icomsat-v1-1/
под картинкой красным цветом ссылка на саму библиотеку. кста вот она http://competefornothing.com/arduino-mega-2560-r3-using-itead-studio-icomsat-v1-1/icomsat_v1-1_arduino_mega_2560_library/
разархивировать и каталог GSM_Shield поместить в Program files\Arduino\Libraries
Но мне пришлось доработать функцию GetSMS.
Без этого исправления некорректно текст пришедшей смс возвращался.
С русскими буквами работать не научился, но мне это и не надо было.
char GSM::GetSMS(byte position, char *phone_number, char *SMS_text, byte max_SMS_len) { char ret_val = -1; char *p_char; char *p_char1; byte len; char AlxCmd[64]; if (position == 0) return (-3); if (CLS_FREE != GetCommLineStatus()) return (ret_val); SetCommLineStatus(CLS_ATCMD); phone_number[0] = 0; // end of string for now ret_val = GETSMS_NO_SMS; // still no SMS //send "AT+CMGR=X" - where X = position //Serial1.write("AT+CMGR="); //Serial1.write((int)position); sprintf(AlxCmd, "AT+CMGR=%d", (int)position); Serial1.write(AlxCmd); //Serial1.write((int)position); Serial1.write("\r"); // 5000 msec. for initial comm tmout // 100 msec. for inter character tmout switch (WaitResp(5000, 100, "+CMGR")) { case RX_TMOUT_ERR: // response was not received in specific time ret_val = -2; break; case RX_FINISHED_STR_NOT_RECV: // OK was received => there is NO SMS stored in this position if(IsStringReceived("OK")) { // there is only response <CR><LF>OK<CR><LF> // => there is NO SMS ret_val = GETSMS_NO_SMS; } else if(IsStringReceived("ERROR")) { // error should not be here but for sure ret_val = GETSMS_NO_SMS; } break; case RX_FINISHED_STR_RECV: // find out what was received exactly //response for new SMS: //<CR><LF>+CMGR: "REC UNREAD","+XXXXXXXXXXXX",,"02/03/18,09:54:28+40"<CR><LF> //There is SMS text<CR><LF>OK<CR><LF> if(IsStringReceived("\"REC UNREAD\"")) { // get phone number of received SMS: parse phone number string // +XXXXXXXXXXXX // ------------------------------------------------------- ret_val = GETSMS_UNREAD_SMS; } //response for already read SMS = old SMS: //<CR><LF>+CMGR: "REC READ","+XXXXXXXXXXXX",,"02/03/18,09:54:28+40"<CR><LF> //There is SMS text<CR><LF> else if(IsStringReceived("\"REC READ\"")) { // get phone number of received SMS // -------------------------------- ret_val = GETSMS_READ_SMS; } else { // other type like stored for sending.. ret_val = GETSMS_OTHER_SMS; } // extract phone number string // --------------------------- p_char = strchr((char *)(comm_buf),','); p_char1 = p_char+2; // we are on the first phone number character p_char = strchr((char *)(p_char1),'"'); if (p_char != NULL) { *p_char = 0; // end of string strcpy(phone_number, (char *)(p_char1)); } // get SMS text and copy this text to the SMS_text buffer // ------------------------------------------------------ p_char = strchr(p_char+1, 0x0a); // find <LF> if (p_char != NULL) { // next character after <LF> is the first SMS character p_char++; // now we are on the first SMS character // find <CR> as the end of SMS string p_char1 = strchr((char *)(p_char), 0x0d); if (p_char1 != NULL) { // finish the SMS text string // because string must be finished for right behaviour // of next strcpy() function *p_char1 = 0; } // in case there is not finish sequence <CR><LF> because the SMS is // too long (more then 130 characters) sms text is finished by the 0x00 // directly in the WaitResp() routine // find out length of the SMS (excluding 0x00 termination character) len = strlen(p_char); if (len < max_SMS_len) { // buffer SMS_text has enough place for copying all SMS text // so copy whole SMS text // from the beginning of the text(=p_char position) // to the end of the string(= p_char1 position) strcpy(SMS_text, (char *)(p_char)); } else { // buffer SMS_text doesn't have enough place for copying all SMS text // so cut SMS text to the (max_SMS_len-1) // (max_SMS_len-1) because we need 1 position for the 0x00 as finish // string character memcpy(SMS_text, (char *)(p_char), (max_SMS_len-1)); SMS_text[max_SMS_len] = 0; // finish string } } break; } SetCommLineStatus(CLS_FREE); return (ret_val); }del
del
Крайние выводы (rx и tx) подключаются к выводам меги. tx - 19, rx - 18
Разобрался, все посадил, все вроде закрутилось
Стартует два примера
#include <GSM_Shield.h> //for enable disable debug rem or not the string #define DEBUG_PRINT // definition of instance of GSM class GSM gsm; void setup() { Serial.begin(9600); Serial.println("system startup" //gsm.InitSerLine(9600); //initialize serial 1 gsm.TurnOn(9600); //module power on //gsm.InitSerLine(9600); //initialize serial 1 gsm.InitParam(PARAM_SET_1);//configure the module gsm.Echo(1); //enable AT echo }//-------------------------------------------
#include "SIM900.h" #include <SoftwareSerial.h> //We don't need the http functions. So we can disable the next line. //#include "inetGSM.h" #include "sms.h" #include "call.h" //To change pins for Software Serial, use the two lines in GSM.cpp. //GSM Shield for Arduino //www.open-electronics.org //this code is based on the example of Arduino Labs. //Simple sketch to check if an incoming call is from an authorized //number and in this case, send to this number an SMS with the value //of a digital input. //We have to create the classes for SMSs and calls. CallGSM call; SMSGSM sms; char number[20]="067***-**-**"; byte stat=0; int value=0; int pin=1; char value_str[5]; void setup() { pinMode(pin,INPUT); //Serial connection. Serial.begin(9600); Serial.println("GSM Shield testing." //Start configuration of shield with baudrate. //For http uses is raccomanded to use 4800 or slower. if (gsm.begin(2400)) Serial.println("\nstatus=READY"); else Serial.println("\nstatus=IDLE"); };Библиотека GSM.h не хочет цепляться, точнее GSMVoiceCall vcs;
не хочеться работать с помощью АТ команд
//----------------------------------
я совсем запутался, как теперь звонить шилдом, СМСсить ? писать в порт АТ ?
Крайние выводы (rx и tx) подключаются к выводам меги. tx - 19, rx - 18
Разобрался, все посадил, все вроде закрутилось
Стартует два примера
... Библиотека GSM.h не хочет цепляться, точнее GSMVoiceCall vcs;не хочеться работать с помощью АТ команд
//----------------------------------
я совсем запутался, как теперь звонить шилдом, СМСсить ? писать в порт АТ ?
Какова причина нежелания пользоваться at-командами?
По ссылкам что я дал, можно выкачать адаптированную под мегу библиотеку GSM_Shield.
Там есть один из примеров - GSM_Shield_Test, достаточно наглядный.
Так и есть. В конечном итоге мы ему в порт посылаем АТ-Команды и слушаем ответы.
Я только не пойму почему на этих АТ-командах зацикилились: я вызываю процедуры/функции библиотеки GSM_Shield. А она уж сама посылает туда чего надо и слушает ответы :)
Тут загвоздка в основном - правильно проинициализировать GSM модем. И если надо, поправить в функциях по работе с смс АТ-команды (в основном CNMI, CMGD)
Всё остальное желательно по умолчанию.
А да, я для себя ещё доработал функцию удаления СМС
char GSM::DeleteSMS(byte position) { char ret_val = -1; char AlxCmd[64]; // Здесь будем формировать команду удаления. С параметром. if (position == 0) return (-3); if (CLS_FREE != GetCommLineStatus()) return (ret_val); SetCommLineStatus(CLS_ATCMD); ret_val = 0; // not deleted yet //send "AT+CMGD=XY" - where XY = position //Serial1.write("AT+CMGD="); //Serial1.write((int)position); sprintf(AlxCmd, "AT+CMGD=%d,2", (int)position); // В "родной" версии номер смски некорректно задавался. и я добавил опцию "2" Serial1.write(AlxCmd); // Посылаем получившуюся команду. Serial1.write("\r"); // 5000 msec. for initial comm tmout // 20 msec. for inter character timeout switch (WaitResp(5000, 50, "OK")) { case RX_TMOUT_ERR: // response was not received in specific time ret_val = -2; break; case RX_FINISHED_STR_RECV: // OK was received => SMS deleted ret_val = 1; break; case RX_FINISHED_STR_NOT_RECV: // other response: e.g. ERROR => SMS was not deleted ret_val = 0; break; } SetCommLineStatus(CLS_FREE); return (ret_val); }Ребят помогите arduino-pro-mini-v11 пишет ошибки вывод питания 3.3v с vcc перезаписан. Как избавится от этого?
Так и есть. В конечном итоге мы ему в порт посылаем АТ-Команды и слушаем ответы.
Я только не пойму почему на этих АТ-командах зацикилились: я вызываю процедуры/функции библиотеки GSM_Shield. А она уж сама посылает туда чего надо и слушает ответы
Тут загвоздка в основном - правильно проинициализировать GSM модем. И если надо, поправить в функциях по работе с смс АТ-команды (в основном CNMI, CMGD)
Зачем тогда создают SofwareSerialPort(Rx, Tx)? коггда нет возможности использовать программный ?
И если я туда прицеплю еще чего-нибудь например на Сериал порт2 (rx2, tx2); Как это инициализировать и работать с ним ?
Зачем тогда создают SofwareSerialPort(Rx, Tx)? коггда нет возможности использовать программный ?
И если я туда прицеплю еще чего-нибудь например на Сериал порт2 (rx2, tx2); Как это инициализировать и работать с ним ?
В библиотеке по моей ссылке не используется SofwareSerialPort(Rx, Tx).
Посмотри внимательно - там всё закомментировано. Для общения с жсм модемом используется serial 1.
Использование и инициализация второго порта зависит от того что подключишь туда. Наверное это будут уже другие библиотеки - у них свои инициализации.
Я в своём проекте использовал и жсм модем, два датчика, экранчик двустрочный. Всё инициализуется и работает.
использовал и жсм модем, два датчика, экранчик двустрочный. Всё инициализуется и работает.
Пытался посадить
из-за того, что инициализирует 9я нога LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
нужно что-то перепаивать
использовал и жсм модем, два датчика, экранчик двустрочный. Всё инициализуется и работает.
Пытался посадить
из-за того, что инициализирует 9я нога LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
нужно что-то перепаивать
Посади вместо 9 ноги, на 10 например.
и строку инициализации замени: LiquidCrystal lcd(8, 10, 4, 5, 6, 7);
9 ногу жсм использует как пин включения. так что 9 ногу измени либо для жсм либо для экранчика.
Для экранчика кажется проще
Перепаивать ничего не надо! Просто проводок перевоткнуть
О чудо, модем корректно начал общаться на скорости 2400
void setup() { /* pinMode(9, OUTPUT); digitalWrite(9, HIGH); delay(500); digitalWrite(9, LOW); delay(500); Serial.flush(); */ Serial.begin(9600); Serial.println("system startup"); gsm.TurnOn(2400); //module power on gsm.InitParam(PARAM_SET_1);//configure the module gsm.Echo(0); //enable AT echo //gsm.IsInitialized(); }О чудо, модем корректно начал общаться на скорости 2400
Должно быть 9600.
Наверное надо зайти терминалом и скинуть модем в заводские настройки.
Как его перегрузить, видать я его замучал - перестал принимать смс...
Как его перегрузить, видать я его замучал - перестал принимать смс...
AT&F - сброс в заводские настройки.
По идее надо терминалом подключиться чтобы команды самому писать.
Но наверное можно в setup() скетча рабочего прописать. Запустить его раз, а потом удалить эту команду.
Терминалом, не получилось. Что ему туда отправлять ?
AT&F "AT&F" 'AT&F' println(AT&F)
//Serial1.write(AT&F)
SendATCmdWaitResp("AT&F")
- тоже не прокатило
Терминалом, не получилось. Что ему туда отправлять ?
AT&F "AT&F" 'AT&F' println(AT&F)
Serial1.write("AT&F"); - тоже не прокатило
символ перевода строки не забываем!
Serial1.write("\r");
т.е. должно быть так:
Serial1.write("AT&F");
Serial1.write("\r");
после этой комбинации - все напрочь замерло gsm.SendATCmdWaitResp("AT&F", 500, 50, "OK", 5); Serial1.write("AT&F"); Serial1.write("\r"); Serial.begin(9600); Serial.println("system startup"); gsm.TurnOn(9600); //gsm.InitParam(PARAM_SET_1);//configure the module gsm.InitParam(PARAM_SET_0); gsm.Echo(0);после этой комбинации - все напрочь замерло gsm.SendATCmdWaitResp("AT&F", 500, 50, "OK", 5); Serial1.write("AT&F"); Serial1.write("\r"); Serial.begin(9600); Serial.println("system startup"); gsm.TurnOn(9600); //gsm.InitParam(PARAM_SET_1);//configure the module gsm.InitParam(PARAM_SET_0); gsm.Echo(0);Так и должно быть!
сейчас убери эти конманды из скетча и подключайся уже на скорости 9600
кста вот прога, можно использовать как терминалку:
void setup() { Serial.begin(9600); Serial1.begin(9600); delay(1000); Serial.println("Initializing..."); } void loop() { if(Serial.available()) { char a=Serial.read(); Serial1.print(a); // Serial.print(a); } if(Serial1.available()) { char b=Serial1.read(); Serial.print(b); } delay(100); }загружаешь скетч, открываешь монитор порта и пишешь вверху ат-команды.
нет. Не работает. Видать или руки или плата - кривая.
На скорости 2400, принимал, СМС все хорошо. Завтра, просто при включении - отказался. Принимает - пустое СМС. Исправил фукцию GetSMS
И как отреагировать на СМС
if ((sms_rx != NULL) && (sms_rx[0] != '\0')) { if ((stroka == "stop") || (stroka == "Stop")) { Serial.print("stroka: "); Serial.println(stroka); gsm.SendSMS(number_incoming, stroka); } //& stroka.peek()}И сравнить с тем что нужно ?
нет. Не работает. Видать или руки или плата - кривая.
На скорости 2400, принимал, СМС все хорошо. Завтра, просто при включении - отказался. Принимает - пустое СМС. Исправил фукцию GetSMS
И как отреагировать на СМС
..
И сравнить с тем что нужно ?
Подключись терминалом и сбрось в заводские настройки.
Скорость по умолчанию - 9600.
Если не так, настрой.
В примерах, что идут с библиотекой вполне наглядно показано как работать с смс.
в библиотеке gsm_shield.h пишут, что при вызове верхней строки, он сбрасывает настройка. через терминал - ничего не получилось.
сейчас больше думаю в сторону сименса с35... icomsat, хоть и с небольшими глюками, но и так работает