Так ведь это shield , по маркировке будет понятно к каким пинам подключать
Вид для печати
Так ведь это shield , по маркировке будет понятно к каким пинам подключать
Да вроде-бы разобрался, но боюсь... Не могу до конца разобраться.
Вот сам продукт - http://iteadstudio.com/store/index.p...roducts_id=413
Вот даташит - http://iteadstudio.com/store/images/...msat_DS1.2.pdf
А в чем не можешь разобраться?
Да вот думал, что могу что-то не так сделать и спалить платку... Но уже все нормально. Дело в том, что она вставляется ТОЛЬКО В "СВОЕ" МЕСТО. По иному не вставишь. Со "знакомым" уже нам скетчем, получилось позвонить. Теперь буду учить отправлять и обрабатывать СМС.
Формат СМС знаешь?
Формат такой:
Синим выделенны данные о кодировкеЦитата:
Это СМС:
B2 07 07 91 97 62 92 90 90 F0 11 FF 04 81 21 43 00 08 FF 08 04 45 04 30 04 31 04 40 FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF 90 00
Зеленым дляна сообщения
Красным текст сообщения
Цитата:
Все, кроме первых и последних двух байтов (B2, 07, 90, 00) является записью сообщения.
07 Длина номера смс-центра в байтах.
91 Тип номера смс-центра (в данном случае, он представлен в международном формате).
97 62 92 90 90 F0 Номер смс-центра — +7-926-290-90-90 (читать с конца байта). Символ F нужен для выравнивания.
11 Длина номера смс-центра.
04 Длина номера отправителя.
81 Тип номера отправителя.
21 43 Номер отправителя — 1234 (опять читать с конца байта).
00 Идентификатор протокола.
08 Кодировка (00 — только латиница, 08 — с кириллицей).
08 Длина сообщения в байтах.
04 45 04 30 04 31 04 40 Это есть само сообщение, Кодируется в UTF-16.
Важно заметить, что когда в сообщении содержатся только латинские буквы, то тогда используется 7-битная GSM кодировка.
Брррр.... Вот это да... Это что значит? Нелзя ли просто АТ командами отправлять?
Можно и получишь в ответ СМС вот в таком вот виде
Цитата:
B2 07 07 91 97 62 92 90 90 F0 11 FF 04 81 21 43 00 08 FF 08 04 45 04 30 04 31 04 40 FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF 90 00
Это ты описал формат СМС для приема Ардуиной? (Т.е. то, что она будет обрабатывать?)
Ну так я и написал что это формат СМС
Chip, я думаю до этого еще далековато. Тут бы научить ардуину отправлять СМСки.
Опять застопорился... Упс... ПОЛУЧИЛОСЬ!!!! :))))
#include <NewSoftSerial.h>
NewSoftSerial phone(2, 3);
void setup() {
Serial.begin(9600);
phone.begin(9600);
Serial.println("\r");
}
void loop() {
phone.println("AT+CMGF=1\r");
delay(1000);
phone.println("AT+CMGS=\"+380675678366\"\r");
delay(1000);
phone.println("SIM900 and Arduino say Hi!\r");
delay(1000);
phone.println(26,BYTE);
delay(150000);
}
И так, думаю теперь можно перейти к изучению обработки СМС.
По поводу формата СМС у меня возникло несколько вопросов.
1.Что такое "ТИП НОМЕРА СМС ЦЕНТРА"?
2.Чей должен быть указан номер центра, отправителя или получателя (в случае с разными операторами)?
3.Что значит тип номера отправителя?
4. Что такое идентификатор протокола?
5. -7-битная GSM кодировка.?
Зачем тебе не нужная информация
Достаточно будет информации о кодировке и длине сообщения
Chip, я так понимаю, что при посылке СМС на шилд, Ардуина видет его именно в таком виде, как ты написал.? Просто не могу докумекать, как все это в скетче оформить и как "прочитать", т.е. увидеть отправленное СМС так, как видит его Ардуина?
нужно от сообщения отбросить всю техническую информацию , а потом перекодировать и преобразовать в тип string
Как мне увидеть техническую информацию в сообщении, которое я хочу посылать Ардуине, если я вижу например только ON и OFF (в текстовом формате)?
А потом еще перекодировать и преобразовать?
Может подскажешь где почитать об этом?
Я же выложил здесь о формате СМС
Для перекодировки пошли ардуине весь алфавит и будет логически понятно куда рыть
Chip, я немного не пойму, в какую сторону мне действовать.
Вижу ситуацию так:
Посылаю на Ардуину СМС с нужным мне текстом. ? Где и как я могу увидеть, что она получила для дальнейшего изучения?
Принимать сообщение нужно в массив типа byte
Дело в том, что в виде "визуально-мысленного" алгоритма, я представляю это все, но я никак не могу понять, как мне это реализовать...
Chip, в терминале, читаю отправленную на Arduino СМС.
Выводит вот что :
================================================== ===
+CMGL: 5,"REC UNREAD","+380675678366","","12/02/12,18:18:36+08"
OFF
OK
================================================== ===
Как его увидеть в формате, который ты писал?
При чем тут терминал? ты же хочешь ардуиной читать
Я думал, что в терминале увижу то, что ардуина видит..
Если отправить СМС в латиннице? И попробуй отправить латиницей + кирилицей
Кирилицу вообще иероглифами выдает. Но она мне и не нужна.
Нащел таблицу GSM кодировки (вроде-бы 7 битная)
http://bp1.blogger.com/_vrrdow9KgWQ/...gsm_coding.gif
Но все равно НИЧЕГО не понятно...
ребята вопрос по теме. Тоже присматриваюсь к модулю для отправли СМС. Но вот попутно возникла проблемка. К ардуине надо подключить купюроприемник, термопринтер и GSM-шилд. Все девайсы предполагаю подключить по RS-232. Как добавить еще два RS232 порта к ардуине?
Еще два ни как не добавить.
Можно добавить 1 софтовый, но скорость не выше чем 9600
Лучше Arduino Maga используй, у него аппаратных UART 4шт.
Chip, что-то нашел, но не хочет реагировать. Посмотри пожалуйста
http://tronixstuff.wordpress.com/201...ar-–-part-two/
Вот собственно скетч :
Строку Serial.println("AT+CNMI=3,0,0,0"); // set module to send SMS data to serial out upon receipt я поменял. Было значение 3,3,0,0 , но тогда текст сообщения не открывался.PHP код:
char inchar; //Will hold the incoming character from the Serial Port.
int led1 = 5;
void setup()
{
// prepare the digital output pins
pinMode(led1, OUTPUT);
digitalWrite(led1, LOW);
//Initialize GSM module serial port for communication.
Serial.begin(9600); // for GSM module communication
delay(30000); // give time for GSM module to register on network etc.
Serial.println("AT+CMGF=1"); // set SMS mode to text
delay(200);
Serial.println("AT+CNMI=3,0,0,0"); // set module to send SMS data to serial out upon receipt
delay(200);
}
void loop()
{
//If a character comes in from the cellular module...
if(Serial.available() >0)
{
inchar=Serial.read();
if (inchar=='#')
{
delay(10);
inchar=Serial.read();
if (inchar=='a')
{
delay(10);
inchar=Serial.read();
if (inchar=='0')
{
digitalWrite(led1, LOW);
}
else if (inchar=='1')
{
digitalWrite(led1, HIGH);
}
delay(10);
}
}
Serial.println("AT+CMGD=1,4"); // delete all SMS
}
}
С использованием Serial1 (вместо Serial) в терминале все работает, но на Ардуину не передается, т.к. даже СМС не удаляется, т.е. работает не ардуина, а терминал (как ємулятор).
При использовании Serial, не работает вообще.
Пробовал подключить NewSoftSerial, результата тоже нет...
Упростил код, до "не могу":
Не пойму в чем дело. Может команда ("AT+CNMI=3,0,0,0") какая-то не правильная, или перемычки на шилде не там стоят для Serial?PHP код:
char text; //Will hold the incoming character from the Serial Port.
int led = 13;
void setup()
{
pinMode(led, OUTPUT);
digitalWrite(led, LOW);
Serial.begin(9600);
delay(200);
Serial.println("AT+CMGF=1"); // set SMS mode to text
delay(200);
Serial.println("AT+CNMI=3,0,0,0"); // set module to send SMS data to serial out upon receipt
delay(200);
}
void loop()
{
if(Serial.available() >0)
{
text=Serial.read();
if (text=='1');
{
delay(10);
{
digitalWrite(led, HIGH);
}
delay(10);
Serial.println("AT+CMGD=1,4");
}
}
}
А ты посмотри в PDF для модема перечень AT команд
Chip, я читал. Команда AT+CNMI есть, но вот с параметрами не могу разобраться. Опытным путем, выяснил, что при параметрах 3,0,0,0, когда приходит СМС, оно автоматически открывается, то же самое происходит и с параметрами 3,2,0,0
В оригинале скетча, установлено 3,3,0,0, но это скетч для модуля SM5100B. При параметрах 3,3,0,0 просто приходит уведомление о полученном сообщении, а судя по статье http://tronixstuff.wordpress.com/201...ar-–-part-two/, в модуле SM5100B с такими параметрами СМС сразу открывается.
Кроме того, если в скетче, вместо Serial пишу Serial1, то шилд реагирует на команды терминала. С Serial, не реагирует. Но на Arduino Mega, Serial1 это ведь пины 18 и 19, а шилд к ним никак не может быть подключен. Его ноги включены в пины 0 и 1.
Также, с перемычками проблема. Когда использую NewSoftserial, устанавливаю ноги 2 и 3 и ставлю перемычки так:
Вложение 13998 (ранние скетчи по отправке СМС и звонки работают)
При Serial1 так:
Вложение 13999 (могу управлять с помощью терминала)
Вот надпись на шилде:
TXD
D|0|1|2|3|4|5|6|7
RXD
Никак не пойму, в чем загвоздка?
Нашел одну важную ошибку в моих скетчах (КАСАТЕЛЬНО ТОЛЬКО ARDUINO MEGA), которая также является, думаю одной из первопричин ранних неудач и дальнейших эксперементов:
Not all pins on the Mega and Mega 2560 support change interrupts, so only the following can be used for RX: 10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69
Т.е. используя NewSoftSerial, использование пина 2 в качестве Rx - недопустимо (а я то думаю, почему Ардуина в терминал ответы не шлет?).
Попробовал побороть эту проблему, установкой Rx на указанные пины, но все равно ничего не получилось. В результате, пришлось вообще отказаться от NewSoftSerial и работать с Serial1. ИМХО, NewSoftSerial, разрабатывалась для Arduino имеющих один последовательный порт.
Странно что ты использовал NewSoftSerial имея на борту четыре нормальных порта
НУ вот и я так думаю... :) Просто до этого нужно было "дойти" (разобраться)... Учимся на своих ошибках и эксперементируем дальше :)
Получилось. !!! Вся заморочка была в моем непонимании Serial-oв. Перекинул на Serial1 и все заработало. СМС принимает, диодами моргает. :)
Вот и отлично!
Chip, сейчас начинаю работу над скетчем, который бы охватывал весь нужный мне функционал. Посмотрел примеры скетчей и увидел, что кроме функций "setup" и "loop", можно еще использовать и "свои" функции.
Почитал http://arduino.ru/Reference/FunctionDeclaration. Судя по описанию, название функции нужно объявлять заранее.
Почитал http://www.compcar.ru/forum/showthread.php?t=5307, посмотрел код.
"Свои" функции (их названия) объявлены в "loop". Т.е. можно просто в "loop" объявить выполнение "своих" функций и далее каждую функцию программировать?
Объявлять функции не нужно , достаточно создать ее и вызывать из любого места
PHP код:
void loop()
{
IR_resiver(); //вызываем
joystik(); //вызываем
}
//*******************
void IR_resiver()
{
//твой код
}
//****************
void joystik()
{
//твой код
}
Chip, возникла некоторая проблема. Увеличил упраравление до 8-ми устройств.
Вот скетч :
PHP код:
char inchar;
int relay8 = 11;
int relay7 = 10;
int relay6 = 9;
int relay5 = 8;
int relay4 = 7;
int relay3 = 6;
int relay2 = 5;
int relay1 = 4;
void setup()
{
pinMode(relay1, OUTPUT);
pinMode(relay2, OUTPUT);
pinMode(relay3, OUTPUT);
pinMode(relay4, OUTPUT);
pinMode(relay5, OUTPUT);
pinMode(relay6, OUTPUT);
pinMode(relay7, OUTPUT);
pinMode(relay8, OUTPUT);
digitalWrite(relay1, LOW);
digitalWrite(relay2, LOW);
digitalWrite(relay3, LOW);
digitalWrite(relay4, LOW);
digitalWrite(relay5, LOW);
digitalWrite(relay6, LOW);
digitalWrite(relay7, LOW);
digitalWrite(relay8, LOW);
Serial1.begin(9600);
delay(30000);
Serial1.println("AT+CMGF=1\r");
delay(200);
Serial1.println("AT+CNMI=3,0,0,0\r");
delay(200);
}
void loop()
{
if(Serial1.available() >0)
{
inchar=Serial1.read();
if (inchar=='#')
{
delay(10);
inchar=Serial1.read();
if (inchar=='a')
{
delay(10);
inchar=Serial1.read();
if (inchar=='0')
{
digitalWrite(relay1, LOW);
}
else if (inchar=='1')
{
digitalWrite(relay1, HIGH);
}
delay(10);
inchar=Serial1.read();
if (inchar=='b')
{
inchar=Serial1.read();
if (inchar=='0')
{
digitalWrite(relay2, LOW);
}
else if (inchar=='1')
{
digitalWrite(relay2, HIGH);
}
delay(10);
inchar=Serial1.read();
if (inchar=='c')
{
inchar=Serial1.read();
if (inchar=='0')
{
digitalWrite(relay3, LOW);
}
else if (inchar=='1')
{
digitalWrite(relay3, HIGH);
}
delay(10);
inchar=Serial1.read();
if (inchar=='d')
{
inchar=Serial1.read();
if (inchar=='0')
{
digitalWrite(relay4, LOW);
}
else if (inchar=='1')
{
digitalWrite(relay4, HIGH);
}
delay(10);
inchar=Serial1.read();
if (inchar=='e')
{
inchar=Serial1.read();
if (inchar=='0')
{
digitalWrite(relay5, LOW);
}
else if (inchar=='1')
{
digitalWrite(relay5, HIGH);
}
delay(10);
inchar=Serial1.read();
if (inchar=='f')
{
inchar=Serial1.read();
if (inchar=='0')
{
digitalWrite(relay6, LOW);
}
else if (inchar=='1')
{
digitalWrite(relay6, HIGH);
}
delay(10);
inchar=Serial1.read();
if (inchar=='g')
{
inchar=Serial1.read();
if (inchar=='0')
{
digitalWrite(relay7, LOW);
}
else if (inchar=='1')
{
digitalWrite(relay7, HIGH);
}
delay(10);
inchar=Serial1.read();
if (inchar=='h')
{
inchar=Serial1.read();
if (inchar=='0')
{
digitalWrite(relay8, LOW);
}
else if (inchar=='1')
{
digitalWrite(relay8, HIGH);
}
delay(10);
}
}
Serial1.println("AT+CMGD=1,4\r"); // delete all SMS
}
}
}
}
}
}
}
}
}
Когда включаю всего 6 устройств (#a1b1c1d1e1f1g0h0), все работает нормально. Когда включаю 7 или 8 устройств (#a1b1c1d1e1f1g1h1), они включаются, но шилд отключается. С кнопки его не включить. Только отсоединение и подсоединение питания. При этом, Ардуина питается от компьютерного БП (12В) и устройства (нагрузка) физически не подключена. Кроме того, єто происходит именно тогда, когда включаю "g1" и "h1"