В современной жизни мобильный телефон стал для человека одним из основных средств связи. Но в жизни любого человека бывают моменты когда он не может ответить на звонок по мобильному телефону, соответственно, он может пропустить важный звонок и упустить возможность услышать важную для себя информацию.
В этой статье мы рассмотрим устройство для решения этой проблемы и создадим автоответчик (Automatic Call answering Machine) на основе платы Arduino и GSM модуля. В дальнейшем на это устройство вы можете записать свой голос/ответ и использовать его всегда когда вы не можете/не хотите ответить на звонок по мобильному телефону. Или, к примеру, вы сменили номер телефона, и хотите проинформировать об этом всех, кто звонит вам по старому номеру.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- GSM модуль – Flyscale SIM 900 (купить на AliExpress).
- Голосовой модуль (Voice Module) ISD 1820 (купить на AliExpress).
- Адаптер на 12 В для подачи питания на GSM модуль.
- Батарейка 9 В для подачи питания на плату Arduino.
- Соединительные провода.
GSM модуль Fly Scale SIM900
GSM модули часто используются в разнообразных радиоэлектронных проектах для реализации возможностей удаленного доступа. Эти модули могут выполнять те же самые функции как и мобильные телефоны: совершение/прием вызовов, передача/прием SMS, соединение с сетью интернет при помощи технологии GPRS и т.д. Если вы подключите к GSM модулю микрофон и громкоговоритель вы можете превратить его в полноценный мобильный телефон. На нашем сайте вы можете посмотреть все проекты, в которых используется GSM модуль.
Как вы можете видеть на рисунке ниже GSM модуль включает в себя USART adapter (адаптер универсального синхронно-асинхронного приемопередатчика – то есть последовательный порт связи), поэтому его можно подключить к компьютеру с использованием модуля MAX232, или использовать его контакты Tx и Rx для подключения к микроконтроллеру. Также вы можете заметить разъемы MIC+, MIC-, SP+, SP-, к которым можно подключать микрофон и громкоговоритель. Модуль запитывается от адаптера на 12 В с помощью обычного разъема для постоянного тока (DC barrel jack).
Вставьте SIM карту в соответствующий слот модуля и подайте питание на него – после этого вы должны заметить как загорится светоиод, сигнализирующий о подаче питания на модуль. После этого подождите около минуты и вы увидите как красный (или другого цвета) светодиод будет мигать один раз в каждые 3 секунды. Это означает что теперь модуль может установить соединение с вашей SIM картой. После этого вы можете подключать модуль к микроконтроллеру/плате Arduino.
Голосовой модуль (Voice Module) ISD 1820
Голосовой модуль ISD 1820 может добавить в ваши проекты голосовые объявления. Модуль способен записывать аудио сигнал в течение 10 секунд и затем воспроизводить его когда потребуется. Модуль включает в себя и микрофон, и динамик (8ohms 0.5watts) и выглядит примерно так, как показано на следующем рисунке.
Модуль работает от напряжения +5V и может быть запитан с помощью контактов на его левой стороне. Также на нижней стороне модуля есть 3 кнопки с названиями Rec, PlayE и PlayL. Вы можете записать ваш голос нажимая кнопку Rec и затем воспроизвести его используя кнопку PlayE. При нажатии кнопки PlayL голос будет воспроизводиться так долго, как долго вы держите кнопку. Подать питание на модуль можно непосредственно с платы Arduino. В нашем проекте мы будем управлять контактом PLAYE используя контакт D8 платы Arduino. Таким образом, мы сможем воспроизводить записанный голос всегда, когда мы будем обнаруживать входящий звонок на GSM модуль.
Работа схемы
Схема устройства представлена на следующем рисунке.
Как вы можете видеть, мы подали питание на GSM модуль с помощью адаптера на 12V 1A, а на плату Arduino мы подали питание с помощью батарейки 9V, голосовой модуль ISD 1820 запитывается от платы Arduino. Записанный голос с данного модуля (с его контактов динамика) мы можем непосредственно передавать на контакты микрофона GSM модуля.
Плата Arduino и GSM модуль соединены по последовательному каналу связи, контакт Tx модуля подсоединен к контакту 9 платы Arduino, а контакт Rx модуля - к контакту 10 платы Arduino. Это позволит плате Arduino "прослушивать" GSM модуль. Когда на GSM модуль будет поступать входящий звонок плата Arduino будет обнаруживать это. Когда плата Arduino удостоверится в том, что звонок активен, она будет воспроизводить голосовое сообщение с голосового модуля при помощи подачи сигнала высокого уровня на свой контакт 8 в течение 200 мс – таким образом имитируется нажатие кнопки PlayE.
Программирование платы Arduino
Полный код программы приведен в конце статьи, здесь же мы рассмотрим только его наиболее важные фрагменты.
Перед началом программирования платы Arduino нам необходимо скачать библиотеку для работы с GSM модулем (GSM Library) с Github и добавить ее в Arduino IDE (в папку с библиотеками) с помощью Sketch -> Include Library -> Add .Zip file.
Первые три строчки кода программы нужны для подключения необходимых библиотек. Мы будем использовать библиотеку последовательной связи поскольку мы не используем для связи с GSM модулем контакты последовательного порта связи, реализованные в плате Arduino по умолчанию.
1 2 3 |
#include <sim900.h> //скачайте библиотеку по адресу https://github.com/Seeed-Studio/GPRS_SIM900 #include <SoftwareSerial.h> //библиотека последовательной связи #include <Wire.h> //default library |
Мы задействуем последовательную связь на контактах 9 и 10 платы Arduino с помощью следующей команды:
1 |
SoftwareSerial gprs(9,10);//TX,RX |
Это стало возможным благодаря использованию нами библиотеки последовательной связи.
Внутри функции setup мы инициализировали последовательную связь с компьютером (для вывода информации в окно монитора последовательной связи) со скоростью 9600 бод/с и последовательную связь с модулем GSM также на скорости 9600 бод/с. На контакт 8 будет подаваться сигнал, инициирующий воспроизведение записанного голосового сообщения с голосового модуля, поэтому устанавливаем его в режим вывода данных.
1 2 3 4 5 6 |
void setup(){ Serial.begin(9600); //Serial monitor works on 9600 baudrate for debugging sim900_init(&gprs, 9600); //GSM module works on 9600 baudrate pinMode(8, OUTPUT); //pin to turn on Voice Serial.println("Arduino - Automatic Voice Machine"); } |
Следующим этапом мы создадим функцию которая будет считывать данные от GSM модуля и понимать их содержание. Если для этой цели мы используем просто команду вида “gprs.read()”, то мы просто получим десятичные значения в коде ASCII, которые не будут нести никакого смысла для нас.
Поэтому в данной функции мы будем конвертировать эти десятичные значения в строки и объединять их чтобы получить результирующую строку. Окончательная строка будет храниться в переменной Fdata, которую можно будет сравнивать с другими строками.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
void check_Incoming() { if(gprs.available()) //если GSM модуль что-нибудь передает { Incomingch = gprs.read(); // сохраняем это в переменную if (Incomingch == 10 || Incomingch ==13) // если это пробел (10) или перевод строки (13) это будет означать что закончилось одно слово {Serial.println(data); Fdata =data; data = ""; } //печатаем это слово и очищаем переменную чтобы начать заново else { String newchar = String (char(Incomingch)); //конвертируем символ (char) в строку (string) с помощью использования объекта типа строка data = data +newchar; // после конвертирования в строку производим объединение строк } } } |
Следующие строки используются для отладки программы, с помощью этих строк вы можете передавать любые AT команды из монитора последовательной связи (Serial monitor) GSM модулю и смотреть что модуль ответил на них.
1 2 3 |
if(Serial.available()){ //Used for debugging gprs.write(Serial.read()); //Used for debugging } //Used for debugging |
Как описывалось ранее, плата Arduino постоянно проверяет принимает ли GSM модуль какие-нибудь звонки. Это можно осуществить с помощью проверки строки “RING” поскольку GSM модуль выдает эту строку каждый раз при входящем звонке. Когда плата Arduino обнаруживает звонок она ждет 5 секунд и затем передает команду “ATA” на GSM модуль, это заставляет GSM модуль ответить на звонок и после ответа на звонок он передает Arduino “OK”. После получения сигнала “OK” (до этого плата Arduino ждет) плата Arduino выдает на контакт 8 сигнал высокого уровня в течение 200 мс чтобы воспроизвести голосовое сообщение с голосового модуля.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
if (Fdata == "RING") // если GSM модуль передал RING { delay(5000); // ждем 5 секунд чтобы сделать задержку на 3 долгих гудка gprs.write ("ATA\r\n"); //отвечаем на звонок Serial.println ("Placed Received"); //используется для отладки while(Fdata != "OK") // ждем пока вызов не будет успешно отвечен {check_Incoming(); // считываем что передает GSM модуль Serial.println ("Playing Recorded message"); //используется для отладки // воспроизводим записанное голосовое сообщение delay(500); digitalWrite(8, HIGH); //Go high delay(200); // ждем 200 мс digitalWrite(8, LOW); //Go low } |
Работа проекта
Подайте питание на все элементы проекта. Нажмите кнопку REC на голосовом модуле и запишите сообщение – оно может быть длительностью максимум 10 секунд.
Теперь загрузите в плату Arduino код программы, приведенный в конце статьи и вставьте SIM карту в GSM модуль. После этого необходимо подождать около 2 минут чтобы GSM модуль установил соединение с сетью вашего сотового оператора. Как только он сделает это красный светодиод будет мигать каждые 3 секунды, что будет свидетельствовать о том, что ваша SIM карта готова к приему вызовов. Теперь вы можете позвонить на эту SIM карту с любого номера и в ответ вы должны услышать записанное вами сообщение после трех продолжительных гудков. Более подробно весь этот процесс можно посмотреть на видео, приведенном в конце статьи.
Исходный код программы
Хотя статья является переводом с другого сайта вы можете задавать вопросы по ней в комментариях – я постараюсь ответить на них потому что я сам стараюсь разобраться во всех проектах, которые я перевожу.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
/* Automatic Voice machine using Arudino and GSM900 Created by: Aswinth Raj B Coded on: 22-9-2017 Website: http://www.circuitdigest.com/ */ #include <sim900.h> //скачайте библиотеку по этому адресу https://github.com/Seeed-Studio/GPRS_SIM900 #include <SoftwareSerial.h> //default library #include <Wire.h> //default library int Incomingch; String data,Fdata; //Connect Tx pin of GSM to 9 of Arduino //Connect Rx pin of GSM to 10 of Arduino SoftwareSerial gprs(9,10);//TX,RX void setup(){ Serial.begin(9600); //Serial monitor works on 9600 baudrate for debugging sim900_init(&gprs, 9600); //GSM module works on 9600 baudrate pinMode(8, OUTPUT); //контакт, с которого управляется голосовой модуль Serial.println("Arduino - Automatic Voice Machine"); } /*функция для считывания поступающей информации от модуля GSM */ void check_Incoming() { if(gprs.available()) //если модуль GSM что-нибудь передает { Incomingch = gprs.read(); // сохраняем эту информацию в переменной if (Incomingch == 10 || Incomingch ==13) // если это пробел (10) или перевод строки (13) это значит что закончилось слово {Serial.println(data); Fdata =data; data = ""; } //печатаем слово и очищаем переменную чтобы начать заново else { String newchar = String (char(Incomingch)); // конвертируем символ (char) в строку (string) с помощью использования объекта типа строка data = data +newchar; // после конвертирования в строку производим объединение строк } } } /*##End of Function##*/ void loop(){ check_Incoming(); //считываем что передает GSM модуль if(Serial.available()){ //Used for debugging gprs.write(Serial.read()); //Used for debugging } //Used for debugging if (Fdata == "RING") // если GSM модуль передал RING { delay(5000); // ждем 5 секунд чтобы сделать задержку на 3 долгих гудка gprs.write ("ATA\r\n"); //отвечаем на вызов Serial.println ("Placed Received"); //Used for debugging while(Fdata != "OK") // ждем пока вызов не будет успешно отвечен {check_Incoming(); // считываем что передает GSM модуль Serial.println ("Playing Recorded message"); //Used for debugging // воспроизводим записанное голосовое сообщение delay(500); digitalWrite(8, HIGH); //Go high delay(200); // ждем 200 мс digitalWrite(8, LOW); //Go low } } } |