Как делают телефоны кнопочные

Недавно на хабре был пост про то, как некие умельцы из Массачусетсого Технологического создали «самодельный» мобильный телефон. Я думаю, пришла пора доказать, что наши месье тоже знают толк в из… э… в изысканных удовольствиях.
Итак, представляю вашему вниманию мобильный телефон, собранный практически «на коленке»!

Всех заинтересованных прошу под кат. Много картинок!

В связи со значительным объёмом материала статья будет в двух частях. В первой части будет приведено описание аппаратной части, а во второй части будут рассмотрены AT-команды модуля и приведены примеры их использования.
Итак, начнём.

Краткое описание

«Сердцем» телефона является GSM-модуль Quectel M10, обладающий широкими функциональными возможностями, включая как телефонную связь, так и передачу данных. Также устройство имеет источник питания, позволяющий питать устройство от источника 12В (например, свинцово-кислотного аккумулятора), интерфейс RS-232, клавиатуру, антенну, держатель SIM-карты и разъём подключения гарнитуры.


Модуль M10-TE-A

Начнём с блока питания

Блок питания

Блок питания обеспечивает питание устройства напряжениями +4,1В (ток до 2А), +5В (ток до 500 мА), +3,3В (ток до 100 мА). Напряжение 4,1В нужно для питания GSM-модуля. GSM-модули предъявляют весьма высокие требования к источнику питания. Источник питания модуля должен иметь напряжение от 3.4 В до 4.5В при токе до 2А, при этом амплитуда пульсаций при скачкообразном изменении тока нагрузки от нуля до максимума не должна превышать 400мВ. На рис. 1 показана допустимая амплитуда пульсаций питающего напряжения при работе модуля.

Рис. 1. Допустимые пульсации напряжения питания при работе GSM-модуля.

Изначально предполагалось, что устройство будет содержать микроконтроллер с напряжением питания 3.3 В и дисплей, для питания подсветки которого нужно будет напряжение 5В. На данном этапе предположим, что ток по каналу 5В не превышает 0.5А. Входное напряжение источника питания выберем равным 12В. Схема электрическая принципиальная приведена на рис. 2.

Рис. 2. Схема источника питания (pdf)

Схема не лишена недостатков, и в основном использует то, что было у меня «под рукой». Для серийной продукции такое решение, конечно, мало подходит, но для экспериментов вполне годится. Не будем подробно останавливаться здесь на работе этой схемы и на расчетах номиналов, так как они элементарны и подробно описаны в документации на соответствующие микросхемы.
Итак, собираем схему на макетной плате (рис. 3) и проводим испытания под нагрузкой, при этом контролируя температуру тепловыделяющих элементов. Испытания пройдены успешно.
Если вы собираетесь использовать только GSM-модуль, без других узлов, то источники +5В и 3,3В не нужны.

Рис.3. Плата источника питания

Плата клавиатуры

Схема платы клавиатуры практически без изменений взята из документации на модуль. Однако, уже после того, как она была собрана, оказалось, что ряд кнопок не поддерживается данной версией модуля. В принципе, можно вообще не подключать клавиатуру к модулю, все действия с модулем можно производить с помощью AT-команд через UART.
Схема клавиатуры приведена на рис. 4. Диоды служат для защиты модуля от статического напряжения.

Рис.4. Схема клавиатуры (pdf)

Рис.5. Плата клавиатуры

Плата GSM-модуля

Переходим к основной плате.
Так как устройство собрано на макетной плате, я решил использовать не модуль Quectel M10, который распаивается на плате, а его «производную», модуль с модулем M10-TE-A, имеющий разъём IDC с шагом контактов 1,27мм (двухрядная розетка). Антенна подключается к специальному маленькому разъёму (GSC) через переходник GSC-SMA. В серийном устройстве, на нормальной плате, разумеется, имеет смысл использовать обычный модуль M10. Следует иметь в виду, что M10 и M10-TE-A имеют разную нумерацию выводов, поэтому схему также придётся скорректировать.

Итак, схема платы:

Рис.6. Схема платы GSM (pdf)

И сама плата:

Рис.7. Плата GSM

Схема содержит модуль, держатель SIM-карты, разъем для подключения гарнитуры, разъем клавиатуры и пару микросхем: интерфейс RS-232 и вспомогательную микросхему для подключения к модулю пъезоизлучателя и светодиода. Никаких особых схемотехнических изысков здесь нет, практически всё взято из документации на модуль.
Ещё пара слов про подключение клавиатуры. Так как ряды ROW3, ROW4 и столбец COL4 не используются модулем, я решил задействовать их для кнопок включения и выключения модуля.
Дисплея телефон тоже не имеет. Хотя модуль имеет выводы для прямого подключения дисплея, его всё равно нельзя подключить, так как эта функция (как и многие другие) отключена у модулей, поступающих в открытую продажу.
Для питания часов реального времени используется ионистор (конденсатор ёмкостью 1Ф, большая круглая штука на плате). Если часы не нужны, его можно не устанавливать.

Сборка

Итак, пришла пора собрать наш конструктор:

Рис. 8. Всё готово к сборке

Рис. 9. Телефон в сборе

Теперь можно вставить SIM-карту, подключить питание, подключить телефон к компьютеру через COM-порт и приступить к исследованию AT-команд.

Пара слов про бюджет.

Бюджет

Модуль Quectel M10-TE-A 665,64 р.
Антенна 120 р.
Держатель SIM-карты SCV-W2523X-06-LF 21,80р
Кабель-переходник GSC-SMA — 161,86р.

Остальные комплектующие найдены в радиусе трёх метров.

В заключение первой части

В следующей части будут рассмотрены AT-команды, поддерживаемые модулем.

Ссылки

К сожалению, на сайте производителя представлена далеко не полная информация о модуле. Большая часть pdf-файлов не выложена в открытый доступ, тем не менее, в сети можно найти некоторые из них. Я взял на себя труд собрать эти файлы и выложить для скачивания.

1. M10_ATC_V1.03.pdf — справочник по AT-командам модуля M10
2. M10_EVB_UGD_V1.01.pdf — описание отладочной платы на базе модуля M10
3. M10_GSM_Module_Specification.pdf — краткое описание модуля M10
4. M10_HD_V1.02.pdf — Hardware Design
5. M10-TE-A_HD_V1.01.pdf — описание платы на основе модуля M10
6. GPRS_Startup_UGD_V101.pdf — установка модема в Windows
7. GSM_UART_AN_V100.pdf — подключение устройств к UART
8. RF LAYOUT_AN_V1.0.pdf — подключение антенны к модулю
9. GSM_Location_ATC_V10.pdf — запрос координат и времени

Документы, описывающие работу с FTP, HTTP, MMS, SMTP и TCP/IP соответственно:
10. GSM_FTP_ATC_V100.pdf
11. GSM_HTTP_ATC_V100.pdf
12. GSM_MMS_ATC_V101.pdf
13. GSM_SMTP_ATC_V11.pdf
14. GSM_TCPIP_AN_V101.pdf

PS. Если у вас не открываются ссылки, попробуйте скачать здесь:
PDF (одним архивом)
Схемы (одним архивом)

Кроме десятка известных международных корпораций, телефоны выпускают сотни компаний в разных странах. Продаются не только готовые аппараты, но и всевозможные детали, микросхемы и модули.

Содержание

  • Что делаем
  • Что понадобится
  • Как спаять электронику
  • Как прошить
  • Как решить проблемы со связью
  • Как сделать корпус
  • Как пользоваться телефоном
  • 4 примера самодельных телефонов

Что делаем

Прежде чем покупать сырье, паять и прошивать, нужно решить, что мы хотим получить в итоге. Нам нужен телефон, который выполнит классический набор обязательных действий:

  • будет делать исходящие, принимать входящие вызовы;
  • будет передавать и получать SMS-сообщения;
  • станет будильником, при необходимости;
  • сохранит информацию о наших контактах;
  • покажет дату и время на экране.

Под каждую из поставленных задач понадобится свой аппаратный модуль или микропрограмма. Приступим к реализации.

Что понадобится

Вне зависимости от числа встроенных модулей для беспроводной и проводной передачи данных, любой телефон начинается с основной платы микроконтроллера.

Готовая микросхема

Вы можете не изобретать велосипед, а сразу взять готовую микросхему Arduino GPRS Shield SIM900 или GSM Shield 2 со встроенным антенным модулем. Она уже включает:

  • Модули для взаимодействия с базовыми станциями сотовых операторов с помощью стандарта GSM в диапазонах частот 850-960 МГц и 1805-1880 МГц. Это покроет все поставленные задачи для общения, обмена текстовыми сообщениями.
  • GPRS-модем, который работает с вышеуказанным модулем GSM. Потенциально, плата сможет скачивать со скоростью до 85,6 Кбит/ секунду.

Как сделать настоящий телефон своими руками

Arduino GSM Shield стоит 4-5 тысяч рублей, а GPRS Shield SIM900 в 1-2 тысячи рублей на декабрь 2019 года. Разница между GPRS Shield SIM900 и GSM Shield 2 лишь в том, что у первой модели антенна прикручивается отдельно в разъем, а во втором варианте этого не нужно.

Тем, кому важны дополнительные возможности в виде поддержки UMTS (3G), LTE (4G), позиционирования GPS/ГЛОНАСС, Bluetooth или Wi-Fi, стоит посмотреть на другие микроконтроллеры или просто припаять нужные передатчики к плате Arduino.

Экран

К плате нужен экран. Его можно присмотреть на специализированных сервисах. Лучше выбирайте светодиодные DIY Матрицы. Их легче настроить, а мы не ставим цели сделать смартфон для просмотра изображений или интернет-страниц.

Как сделать настоящий телефон своими руками

Существуют сразу готовые варианты плат, со встроенным небольшим текстовым экраном и всеми модулями передачи данных. Один из них, DIY Cellphone, LED Matrix. На декабрь 2019 года мы нашли эту плату за 3778 рублей, смотрите по ссылке.

Также нам понадобятся транзисторы, резисторы, кнопки, микрофон, динамики, USB-разъем и литий-ионная батарея. Полный список смотрите в подготовленном нами документе здесь. В результате вы должны уложиться в 10 тысяч рублей.

Не меняйте размер предусмотренной для передачи данных, антенны, без понимания физики процесса. Ее длина напрямую связана с частотами передачи и приема сигнала. При спонтанном изменении размеров антенны, увеличивается коэффициент стоячей волны (КСВ) и ухудшаются приемо-передающие качества. Больше не значит лучше.

В итоге у вас есть три варианта:

  1. Купить одну готовую плату, в которую уже встроены все модули, экран, клавиатура.
  2. Купить частично готовую плату, на которую нужно допаивать экран, клавиатуру и не только.
  3. Купить голый микроконтроллер и все нужные элементы отдельно, а затем спаять в единый блок.

Какой вариант выбрать, решайте сами, исходя из количества свободного времени, денег, мастерства и желания. Чем меньше действий от вас требует выбранное решение, тем дороже оно будет стоить. Дешевле всего – купить готовый смартфон в магазине.

Если денег не хватает, а паять вы умеете, попробуйте отпаять нужные детали от своих старых смартфонов. Это не только сэкономит бюджет, но и время на ожидание посылок с комплектующими.

Как спаять электронику

Для пайки понадобится стандартный набор инструментов – сам паяльник, припой, щипцы. При работе, обращайте внимание на 2 момента:

  • Полярность, ошибка возможно будет стоить деталей. Например, конденсатор может рвануть.
  • Схемы плат создатели указывают в документации для конкретных модулей, например, клавиатуры.

Паять можно не только платы, но и внешнюю антенну для того, чтобы получить качественный сигнал. В качестве сырья подойдут медный провод, металлические диски и штыри. Как спаять усиливающую внешнюю сотовую антенну для телефона или 3G-модема смотрите в видео.

Как прошить

Чтобы прошить самодельный телефон, заранее предусмотрите на плате разъем для подключения к компьютеру, ноутбуку или специальному программатору. Как правило такой порт уже предусмотрен, если вы покупаете частично готовую плату. Производители уже предполагают, что вам придется ее программировать через внешние устройства.

Для прошивания понадобится еще один посредник, даже если вы пользуетесь компьютером, — программатор. Приведем два, для примера:

  • ATAVRISP2, поставляется с собственным ПО, подключается к компьютеру через USB-разъем;
  • USBASP – подходит для сторонних программ для прошивки микросхем, подключается аналогично предыдущему варианту, для соединения с микросхемой использует 10-контактный интерфейс ISP.

Для работы используйте одну из программ:

  • AVRdude;
  • AVRdude_Prog;
  • Bascom-AVR;
  • Khazama AVR Prog;
  • eXtreme Burner AVR.

Они поддерживают современные операционные системы семейств Windows, Mac, Linux. Не все перечисленные программы русифицированы.

Попробуйте запрограммировать AVR с помощью языков Assembler или Си.

Как решить проблемы со связью

Причин проблем со связью 6:

  • некачественный припой;
  • некачественные материалы узлов, в том числе разъема для SIM карты;
  • отсутствие или неверное расположение SIM-карты в разъеме;
  • неверно подобранные характеристики антенны;
  • ошибки при программировании;
  • отсутствие связь в районе использования.

При самостоятельной работе, часто связь не ловит из-за неверно подобранной антенны. Один и тот же модуль не сможет одинаково эффективно принимать сигналы на разных радиочастотах. Поэтому не стоит пытаться использовать UMTS-антенну, которая работает на 2110-2170 МГц для приема GSM на 890-960 МГц, если производитель не предусмотрел этого.

Как сделать корпус

Главная цель корпуса – защитить хрупкие внутренние узлы, сохранив управляемость, понятность интерфейса и эстетичность.

При работе удобнее использовать материалы, из которых легко вырезать объекты нужных форм с подходящими выемками и разъемами. Например, дерево или пластик. Для красоты покройте основной защитный материал декоративными, например, кожей.

Также можно работать с металлом, алюминием, стеклотекстолитом 0,5 мм и тонким оргстеклом.

Отверстия по корпусу должны позволять всем узлам работать эффективно – не стоит закрывать устройство металлом со всех сторон, это заметно ухудшит приемо-передающие качества GSM-передатчика. Также озаботьтесь отверстиями под кнопки, микрофон, динамики в нужных местах.

Если не хотите делать внешнюю оболочку вручную, возьмите ее со старого телефона или закажите со специальных порталов. Главная проблема – уместить внутренности внутри готового корпуса, зафиксировать их и расположить в соответствии с готовыми отверстиями.

Вы всегда можете делегировать работу, по конструированию корпуса для вашего творения сторонним организациям. С помощью высокоточного лазера, они ровно вырежут изделие по вашим меркам или измерят все сами.

Как пользоваться телефоном

Использование handmade телефона ничем не отличается от привычных всем действий на коммерческих смартфонах. Клавиатура передает информацию о номерах, сообщениях или контактах, экран позволяет читать выводимые данные.

4 примера самодельных телефонов

Приведем четыре известных примера самодельных мобильных устройств.

DIY Cellphone

Простой телефон в деревянном корпусе с простым светодиодным линейным дисплеем и небольшими кнопками. Он сделан на основе готовой платы с матричным диодным дисплеем. Получилось лаконично, ударостойко, но непривычно для современных владельцев.

Как сделать настоящий телефон своими руками

Вместо красного строчного экрана, можно установить монохромный от старых моделей Nokia. Общая стоимость комплектующих 200-250$ на декабрь 2019.

Достоинства и недостатки DIY Cellphone

Преимущества Недостатки
Деревянный корпус выдерживает удары Неудобные кнопки без надписей
Корпус легко вырезать Работает только в GSM-сетях
Встроенная антенна За итоговую стоимость комплектующих можно купить обычный смартфон

PiPhone

Модель с внешней антенной и цветным дисплеем выглядит привычнее в 21 веке, чем DIY. PiPhone выполнен на основе микроконтроллера Raspberry Pi. Все коммуникации узлы, припаяны и подключены отдельно. Размер экрана – 2,8 дюйма, а корпус создатель решил не устанавливать вовсе.

Результат вышел на 50-100$ дешевле предыдущего, но вряд ли он выдержит аналогичные нагрузки, что и DIY.

Из цены мобильного устройства на микроконтроллер ушло 40$, на сенсорный экран – 35$, на батарею (2500 мАч) – 15$, модуль беспроводной передачи данных в диапазонах стандарта GSM – 48$, преобразователь, кабели и разъемы – оставшаяся сумма.

Как сделать настоящий телефон своими руками

Смотрите видео эксплуатации PiPhone.

Достоинства и недостатки PiPhone

Преимущества Недостатки
Цветной дисплей Отсутствие корпуса
Дешевле аналогов Внешняя антенна на хрупком разъеме

Phoenard

Монохромный сенсорный телефон в дизайне нулевых годов второго тысячелетия. Корпусом выступает передний прозрачный пластик, который покрывает все, кроме дисплея.

Как сделать настоящий телефон своими руками

Гаджет выполнен на базе микросхем Arduino, о которых мы писали в начале статьи. К плате, кроме GSM-передатчика, также припаяны GPS-приемник с Bluetooth-модулем. Умельцам удавалось сделать из самоделки даже mp3-плеер. Функции обычного телефона устройство выполняет без труда.

Phoenard – универсальный прибор, из которого получится сделать не только удобный смартфон. В пятиминутном Youtube-ролике, умельцы делают из Phoenard различные устройства, в том числе монитор биения сердца, внутренний компьютер велотренажера и электронную барабанную установку.

Достоинства и недостатки Phoenard

Преимущества Недостатки
Широкий диапазон возможностей Не защищен от ударов
Сенсорный дисплей 2.6 дюйма Не цветной дисплей
Защитный пластиковый корпус

Kevin Lynagh

Kevin Lynagh – не название телефона, а имя автора безымянного устройства, которое он представил в 2015 году. Его отличительные черты – отсутствие дисплея и беспроводная зарядка.

Программист-разработчик начал с подбора чипа, выбор пал на Qeuctel UC15. При поиске модуля для передачи данных стандартов GSM и UMTS, он купил Rubra Penta-band SMD. Для работы Кевин использовал плату контроллера Atmel ATMEGA1284-AUR за 8$.

Программная оболочка для устройства написана на объектно-ориентированном языке программирования C.

Кевин Линах получил двойку по курсу электротехники в Высшем Учебном Заведении.

Корпус устройства Кевин вырезал из дерева, покрыл кожей с обратной стороны. На всю работу программист потратил 15 суток в сумме.

Как сделать настоящий телефон своими руками

Чтобы пользователь понимал процессы, происходящие внутри мобильного устройства без экрана, разработчик установил на нем серию диодных индикаторов, мигая, они оповещают пользователя.

Достоинства и недостатки устройства

Преимущества Недостатки
Беспроводная зарядка Отсутствует дисплей
Передача данных в диапазонах 2G и 3G Большие трудозатраты для сборки и прошивки устройства.
Крепкий деревянный корпус

Создание уникального телефона не обойдется дешевле покупки нового смартфона в офисе продаж. Вы сможете сделать простой, крепкий аппарат, с ограниченным вами набором функций, который не взломают злоумышленники, потому что взламывать нечего. Творите и следуйте рекомендациям техники безопасности при пайке.

Что твой телефон знает о тебе? Насколько надежно он хранит информацию и кто имеет к ней доступ? К счастью, изготовить и запрограммировать собственный мобильный телефон теперь можно буквально за несколько дней. Что я и сделал, а теперь и тебе покажу, что для этого нужно.

Содержание

  1. Как создать свой мобильный телефон
  2. Блок-схема компонентов
  3. Настраиваем UART
  4. Работа с экраном
  5. Клавиатура
  6. Модуль GSM
  7. Телефонная книга
  8. Работа с графикой
  9. Энергосбережение
  10. Интерфейс
  11. Идеи и развитие проекта

Как создать свой мобильный телефон

Все началось с того, что некоторое время назад я собирал для себя телефон на модуле связи GSM. Современная электроника была размещена в винтажном корпусе с внешней трубкой и дисковым номеронабирателем (помнишь ли ты еще, как ими пользоваться?). Увы, из-за непродуманной схемы звонить с него было неудобно.

Тогда я решил предпринять вторую попытку, но уже с новой концепцией. Хотелось создать компактное устройство, выполняющее функции простого кнопочного телефона и при этом пригодное к практическому использованию. В идеале заряда даже от небольшого аккумулятора должно хватать минимум на неделю. Никаких лишних сервисов, подозрительных приложений и надоедливых уведомлений, только самое необходимое — звонки, SMS и телефонная книжка.

По мнению всех ведущих специалистов с мировым именем, тут десять баллов из десяти по шкале ремонтопригодности

По мнению всех ведущих специалистов с мировым именем, тут десять баллов из десяти по шкале ремонтопригодности

Проект демонстрировался на Chaos Constructions 2019 и, к моему (приятному) удивлению, вызвал интерес у широкой аудитории. Многим было любопытно узнать внутреннее устройство мобильного телефона, поэтому сегодня я подробно расскажу, как можно собрать подобный гаджет самостоятельно.

Увы, система сотовой связи по умолчанию позволяет операторам следить за абонентами практически в режиме реального времени и с точностью порядка двадцати метров (за счет триангуляции с нескольких вышек). C учетом российской практики выдачи симок в обмен на паспортные данные, ситуация выглядит печальной. На самом деле уйти из-под надзора телекоммуникационных компаний тоже возможно, но такие способы выходят за рамки этой статьи.

Блок-схема компонентов

Сперва определимся с требованиями к устройству: нам нужно совершать исходящие звонки, принимать входящие, читать и писать SMS (в том числе на кириллице) и управлять контактами в телефонной книге. Это базовая функциональность, которую пользователи ожидают от кнопочных телефонов. Конечно, это далеко не полный список и тут не хватает как минимум встроенных игр (змейки или тетриса), но их легко будет добавить уже на финальном этапе.

Ключевым компонентом устройства станет модуль сотовой связи SIM800C. Он содержит полный радиотракт, аудиотракт и реализует основные функции работы с сетью GSM. Иными словами, это практически готовый мост GSM-UART, который нуждается лишь в управлении через внешний терминал.

Для этого нам потребуется экран, клавиатура и какой-нибудь микроконтроллер для выполнения основной программы. В качестве экрана я использовал дисплейный модуль ST7735 с разрешением 128 на 160 пикселей. К нему у меня уже была готовая библиотека, которая позволяла отрисовывать символы и графические примитивы. По большому счету выбор дисплея некритичен для проекта, и ты можешь использовать любой другой с подходящей диагональю.

РЕКОМЕНДУЕМ:
Как создать защищенное зашифрованное устройство

Клавиатура с шестнадцатью кнопками реализована на сдвиговых регистрах (пара восьмибитных микросхем 74HC165 (PDF). Также ты можешь использовать их отечественный аналог — микросхемы компании «Интеграл» КР1533ИР9. В любом случае выход таких регистров представляет собой неполноценный SPI, так как даже при отключении они не переходят в высокоимпедансное состояние. Поэтому вместо аппаратной и совмещенной с дисплеем шины SPI для них использовалась программная реализация.

Управлять всем будет микроконтроллер семейства STM32. Так как особого быстродействия не требуется, подойдут даже бюджетные решения. Я остановил свой выбор на F103C8T6 (PDF), его ресурсов тут должно хватить с избытком. Кроме того, именно на таком микроконтроллере выпускается известная модельная линейка отладочных плат BluePill (прекрасное средство для избавления от Arduino-зависимости). Это позволило собрать прототип и протестировать работу компонентов практически с самого старта.

Некоторые микросхемы F103C8T6 имеют 128 Кбайт памяти вместо заявленных по документации 64 Кбайт. Однако это относится к недокументированным возможностям, и рассчитывать на «лишний» банк памяти не стоит.

Позже (и в качестве приятного бонуса) я решил добавить в проект внешнюю постоянную память W25Q32 (PDF) на 32 Мбит. Это позволило не перезаписывать флеш самого микроконтроллера и хранить все контакты отдельно. Кроме того, появилась возможность загружать на телефон картинки, символы и прочие элементы растровой графики.

Сама схема мобильного телефона достаточно стандартная и в комментариях вряд ли нуждается. SIM800C включается при подаче низкого уровня на вывод REST (используется транзистор Q1, соединенный с контактом PA0 микроконтроллера). Дополнительно светодиоды VD2 и VD3 указывают на состояние радиомодуля. VD2 мигает при успешном подключении, тогда как VD3 горит все время, пока SIM800C активен.

Принципиальная схема устройства

Принципиальная схема устройства

Компоненты размещены на двух односторонних печатных платах, преимущественно поверхностным монтажом. Первая плата содержит радиомодуль, микроконтроллер, микросхему внешней памяти и разъемы для подключения антенны и динамика. Вторая плата целиком и полностью отдана под клавиатуру. Собранная конструкция помещается в корпус из оргстекла и закрепляется на стойках М3.

Питается наше устройство от литий-полимерного аккумулятора на 1500 мА · ч. Его емкость примерно в два раза ниже, чем у современных флагманских смартфонов, но и ее хватает примерно на неделю в режиме ожидания (потребление около 6 мА) или на сутки активного пользования (потребление около 40 мА).

Вообще говоря, большая часть использованных электронных компонентов сейчас доступна в виде готовых оценочных плат или модулей. Поэтому, если тебе не хочется возиться с разводкой плат и пайкой микросхем, ты можешь собрать все на беспаечных макетках.

Настраиваем UART

Сегодня существует масса вариантов для программирования микроконтроллеров. Это и различные языки (С/С++, Rust), и самые разнообразные прикладные библиотеки, абстрагирующие разработку от аппаратного уровня (HAL от ST Microelectronics, Arduino Core и другие). Я использовал в проекте каноничный C и открытую libopencm3.

Полный комплект исходных файлов проекта доступен в репозитории на GitHub.

Первым делом следует инициализировать UART1, ведь именно он отвечает за общение с радиомодулем. Параметры стандартные: 115 200 бод и 8N1.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

static void usart1_setup(void){

    /* Enable clocks for GPIO port A (for GPIO_USART1_TX) and USART1 */

    rcc_periph_clock_enable(RCC_GPIOA);

    rcc_periph_clock_enable(RCC_USART1);

    /* Enable the USART1 interrupt */

    nvic_enable_irq(NVIC_USART1_IRQ);

    /* PA9 TX,PA10 RX */

    gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_ALTFN_PUSHPULL, GPIO_USART1_TX);

    gpio_set_mode(GPIOA, GPIO_MODE_INPUT, GPIO_CNF_INPUT_FLOAT, GPIO_USART1_RX);

    /* Setup UART parameters */

    usart_set_baudrate(USART1, 115200);

    usart_set_databits(USART1, 8);

    usart_set_stopbits(USART1, USART_STOPBITS_1);

    usart_set_mode(USART1, USART_MODE_TX_RX);

    usart_set_parity(USART1, USART_PARITY_NONE);

    usart_set_flow_control(USART1, USART_FLOWCONTROL_NONE);

    usart_enable_rx_interrupt(USART1);

    usart_enable(USART1);

}

После этого логично как-то организовать отправку команд на модуль. Например, c помощью сторонней реализации
printf(). Для этого используется библиотека rprintf. Ее код хорошо оптимизирован и занимает всего несколько килобайтов памяти. Библиотеку следует подправить для работы с
libopencm3, буквально несколько строк.

#38  #define UART USART1

...

#95  vfprintf_((&usart_send_blocking), format, arg);

...

#142 ch = usart_recv_blocking(UART);

Теперь модулю можно отправлять команды вида
printf_(«AT_command»), а ответ модуля принимается с использованием прерываний и сохраняется в буфер. После приема содержимое анализируется, и если это ожидаемый ответ, то вызывается функция-обработчик, которая используется для вывода сообщений SMS и USSD. Также возможен непосредственный вывод сообщения на экран, что очень удобно при отладке.

Работа с экраном

Как и любую другую периферию, дисплей перед использованием предстоит инициализировать. Конечно, сегодня подходящий код можно найти и в интернете, но я решил написать реализацию самостоятельно. Это не отнимет много времени, зато позволит лучше узнать возможности микросхемы ST7735. Я ориентировался на документацию (PDF) производителя и брал за основу готовые примеры в псевдокоде.

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

static void spi1_setup(void){

    /* Enable SPI1 Periph and gpio clocks */

    rcc_periph_clock_enable(RCC_SPI1);

    rcc_periph_clock_enable(RCC_GPIOA);

    /* Configure GPIOs:

      * SCK = PA5

      * DC = PA6

      * MOSI = PA7

      * CS = PA1

      * RST = PA4

      * LED = PB0

      */

    gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_ALTFN_PUSHPULL, GPIO5 | GPIO7);

    gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, GPIO4 | GPIO6 | GPIO1);

    /* Reset SPI, SPI_CR1 register cleared, SPI is disabled */

    spi_reset(SPI1);

    /* Set up SPI in Master mode with:

      * Clock baud rate: 1/64 of peripheral clock frequency

      * Clock polarity: Idle High

      * Clock phase: Data valid on 2nd clock pulse

      * Data frame format: 8-bit

      * Frame format: MSB First

      */

    spi_init_master(SPI1, SPI_CR1_BAUDRATE_FPCLK_DIV_2, SPI_CR1_CPOL_CLK_TO_0_WHEN_IDLE, SPI_CR1_CPHA_CLK_TRANSITION_1, SPI_CR1_DFF_8BIT, SPI_CR1_MSBFIRST);

    /* Set NSS management to software */

    spi_enable_software_slave_management(SPI1);

    spi_set_nss_high(SPI1);

    /* Enable SPI1 periph. */

    spi_enable(SPI1);

    gpio_set(GPIOA, GPIO1);

}

В библиотеке последовательно реализованы функции отрисовки точек, линий, окружностей, печати символов и целых строк и обновления экрана. Также поддерживается вывод символов кириллицы в кодировке CP866. Ключевой компонент кода — вызов
st7735_sendchar(char* c), который позволяет последовательно выводить на экран строки, в том числе и с управляющими последовательностями. На данный момент поддерживаются символы перевода строки (
n), возврата каретки (
r), очистки экрана (
a) и бэкспейса (
b).

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

void st7735_sendchar(char ch){

    uint16_t px, py;

    gpio_clear(STPORT, STCS);

    if (ch == ‘r’) {

        pos -= pos % 26;

        return;

    }

    if (ch == ‘n’) {

        pos += 26;

        pos -= pos % 26;

        return;

    }

    if (ch == ‘a’) {

        pos = 0;

        st7735_clear(bg_color);

        return;

    }

    if (ch == ‘b’) {

        pos;

        px = (pos % 26) * 6;

        py = (pos / 26) * 8;

        st7735_drawchar(px, py, 0x20, txt_color, bg_color);

        return;

    }

    if(pos > 416) {

        pos=0;

        st7735_clear(bg_color);

    }

    px = (pos % 26) * 6;

    py = (pos /26) * 8;

    st7735_drawchar(px, py, ch, txt_color, bg_color);

    pos++;

    while (SPI_SR(SPI) & SPI_SR_BSY);

    gpio_set(STPORT,STCS);

}

По умолчанию используется зеленый текст на черном фоне. Цвета можно указать явно, с помощью вызова функции
st7735_set_printf_color(unit16_t text, uint16_t back). Кроме того, реализована дополнительная функция вывода текущего символа, который пользователь набирает на клавиатуре.

void st7735_virt_sendchar(char ch){

    uint16_t px, py;

    gpio_clear(STPORT, STCS);

    px = (pos % 26) * 6;

    py = (pos / 26) * 8;

    if (ch > 0x20)  {

        st7735_drawchar(px, py, ch, RED, bg_color);

    }

    while (SPI_SR(SPI) & SPI_SR_BSY);

    gpio_set(STPORT, STCS);

}

Она похожа на
st7735_sendchar(), но не обрабатывает управляющие последовательности и не меняет текущую позицию символа. Таким образом, вызов функции
st7735_sendchar() после
st7735_virt_sendchar() перерисует на экране символ, выведенный
st7735_virt_sendchar().

Клавиатура

Весь набор кнопок подключен через сдвиговые регистры к программному SPI. Обрабатывает пользовательский ввод библиотека
4х4key. У клавиатуры две раскладки — русская и английская, в каждой раскладке за кнопкой закреплено по четыре символа.

собрать мобильный телефон

Тут я несколько отступил от классики кнопочных телефонов нулевых годов — выбор конкретного символа определяется не количеством кликов, а длительностью нажатия. Это связано с тем, что в мобильниках обычно использовались мембранные клавиатуры, а тактовые кнопки тугие и перебирать буквы уже не так удобно.

Рассмотрим процесс обработки ввода подробнее. За опрос клавиатуры отвечает функция
get_key(). Для этого используется процедура
read_key(), которая считывает текущее состояние сдвиговых регистров и возвращает два байта информации от кнопок. Сочетаний клавиш в данный момент нет, но их можно легко добавить при необходимости.

Раскладка переключается при получении кода
0x0002, в любом другом случае возвращается код символа. В зависимости от выбранного языка значение переменной
ch_map инкрементируется.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

...

while (!key_code) {

    key_code = read_key();

}

do {

    if(key_code == 0x0002) {

        if (ch_map < 2) {

            ch_map++;

        else {

            ch_map = 0;

        }

        show_char_map(ch_map);

        while(key_code==2) key_code=read_key();

    }

    while(!key_code) {

        key_code = read_key();

    }

} while (key_code == 0x0002);

...

Теперь вызывается функция
key_map(), которая принимает на вход код клавиши и номер текущей раскладки. Она ищет нужный символ в массиве
char_map и возвращает результат. Логика дальнейшей обработки ввода зависит от полученного символа.

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

...

if (key == ‘n’) {

    delay(500);

} else if (key == ‘b’) {

    delay(500);

} else if(key == ‘ ‘) {

#ifdef ECHO

    st7735_virt_sendchar(key);

#endif

    delay(800);

    timer_start();

    old_keycode = key_code;

    do {

        key_code = read_key();

        if (key_code){

            if (key_code == old_keycode) {

                count++;

                if (count > 15) {

                    count = 0;

                }

                wait_key_counter = 0;  

            } else {

                count = 0;

                break;

            }

            key = keymap2(count, 2);

#ifdef ECHO

            systick_interrupt_disable();

            st7735_virt_sendchar(key);

            systick_interrupt_enable();

#endif

            delay(900);

    }

} while (wait_key_counter < 1000);

timer_stop();

...

Обработчик клавиатуры вышел сложнее, чем мне бы хотелось, но зато я получил практически все необходимые символы на шестнадцати клавишах, что довольно удобно. Однако в некоторых случаях хотелось бы мгновенной реакции на нажатие кнопок: например, когда вызываются пункты меню или принимается входящий вызов. Для этих целей реализована отдельная функция
fast_get_key(), которая работает с усеченным массивом символов.

char fast_get_key() {

    uint16_t key_code;

    char key;

    while (!key_code) {

        key_code=read_key();

    }  

    key = keymap(key_code, 0);

    while (read_key()) {

         __asm__(«nop»);

    }

#ifdef ECHO

    echo(key);

#endif

    return key;

}

Теперь, когда есть дисплей и клавиатура, от создания терминала нас отделяют только функции
stprintf() и
kscanf(). Они были реализованы с помощью уже упоминавшейся библиотеки
rprintf, но изменений тут потребовалось чуть больше.

int stprintf(const char *format, ) {

    va_list arg;

    va_start(arg, format);

    stprintf_((&st7735_sendchar), format, arg);

    va_end(arg);

    return 0;

}

С функцией
kscanf() все несколько сложнее, так как у нас есть две функции получения символа с клавиатуры. Поэтому придется объединить их в одну, организовав переключение ввода между
get_key() и
fast_get_key(). Заодно добавим поддержку управляющего символа
b.

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

void set_scanf_mode(unsigned char mode) {

    fast_mode=mode;

}

int kscanf(const char* format, ) {

    va_list args;

    va_start( args, format );

    int count = 0;

    char ch = 0;

    char buffer[kscanf_buff_size];

    kscanf_buffer = buffer;

    while (count <= kscanf_buff_size ) {

        if(fast_mode) {

            ch = fast_get_key();

        } else {

            ch = get_key();

        }

        if (ch == ‘b’) {

            if (kscanf_buffer > buffer) {

                kscanf_buffer;

            }  

            continue;

        } else {

            count++;

        }

        if (ch != ‘n’ && ch != ‘r’) {

            *kscanf_buffer++ = ch;

        else {

            break;

        }

    }

    *kscanf_buffer = »;

    kscanf_buffer = buffer;

    count =  ksscanf(kscanf_buffer, format, args);

    va_end(args);

    return count;

}

Таким образом мы реализовали систему ввода-вывода и теперь имеем практически полнофункциональный терминал. Например, чтобы очистить экран и вывести традиционное приветствие, достаточно написать строчку

stprintf(«aHello World!»);

Модуль GSM

Рассмотрим работу с SIM800 на примере с отправкой SMS, остальные функции ведут себя аналогично. Будем использовать текстовый режим, так как он более наглядный. Дополнительно для отправки сообщений на кириллице нужно заранее настроить кодировку.

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

void sim800_init_cmd() {

    printf_(«AT+CMGF=1rn»);

    for (uint32_t i = 0; i < 0xFFFFFF; i++) __asm__(«nop»);

    printf_(«AT+CSCS=»UCS2″rn»);

    for (uint32_t i = 0; i < 0xFFFFFF; i++) __asm__(«nop»);

    printf_(«AT+CSMP=17,167,0,8rn»);

    for (uint32_t i = 0; i < 0xFFFFFF; i++) __asm__(«nop»);

}

void fast_sms_send(char *text, char *tel) {

    char *p_tel;

    char u_tel[64]=«+7»;

    char temp[512];

    if (tel[0] == ‘8’) {

        p_tel = tel + 1;

    } else if (tel[0] == ‘+’) {

        p_tel = tel + 2;

    } else {

        p_tel = tel;

    }

    strcat(u_tel, p_tel);

    strcpy(temp, text);

    cp866_to_utc2(temp);

    cp866_to_utc2(u_tel);

    stprintf(«aSend smsrnAT+CMGS=»%s»rn%sx1A», u_tel, temp);

    printf_(«AT+CMGS=»%s»rn», u_tel);

    for (uint32_t i = 0; i < 0xFFFFFF; i++) __asm__(«nop»);

    printf_(«%sx1A», temp);

}

Теперь можно использовать в коде что-то осмысленное и понятное, например

fast_sms_send(«Hello world!», «89162402484»);

Попробуем передать строку на кириллице, предварительно включив нужную кодировку:

void write_sms() {

    char text[256];

    char tel[13];

    uint8_t ret_code;

    stprintf(«aSMS writer v0.01rn»

                    «Enter the sms textrn»

                    «>»);

    kscanf(«%s», text);

    ret_code = telbook_get_number(tel);

    if(!ret_code) {

        return;

    }

    fast_sms_send(text, tel);  

}

К слову, здесь в качестве номера контакта используется запись из телефонной книги. Думаю, о ней стоит рассказать чуть подробнее.

Телефонная книга

Как я уже говорил, информация о контактах хранится в микросхеме внешней памяти. Каждая запись занимает 32 байта: шестнадцать на номер телефона и столько же на имя абонента. Сейчас эти данные у меня записываются открытым текстом, без шифрования. Конечно, желательно использовать здесь AES или любой другой блочный шифр.

РЕКОМЕНДУЕМ:
3D-сканер из смартфона или фотокамеры

Основные возможности телефонной книги позволяют выбрать нужный номер контакта (
telbook_get_number()), а также добавить или удалить уже существующий (
telbook_rec_add() и
telbook_rec_del()). Кроме того, можно произвести поиск имени по телефону с помощью функции
telbook_find_name(). Для низкоуровневого взаимодействия с микросхемой памяти написана библиотека 25q32, которая берет на себя все нюансы аппаратной реализации.

Работа с графикой

Что можно еще попробовать, располагая цветным дисплеем и несколькими мегабайтами свободной памяти? Ну конечно же, вывод изображений, это само просится! Мобилка легко переваривает файлы ВМР с разрешением 128 на 160 и глубиной цвета в 16 бит. Картинки хранятся во внешней микросхеме и отображаются на экран с помощью функции
img_from_flash(), которая принимает адрес начала массива пикселей. Структура формата очень простая, но, если ты ее забыл, всегда можно почитать про заголовок и смещение в интернете.

создать мобильный телефон

Изображение на экран выводится частями с использованием буфера на стеке. В каждом проходе 4096 байт считываются из памяти в буфер, а потом пересылаются на экран. Конечно, можно заметить, что у F103C8T6 есть контроллер DMA, который предназначен именно для таких задач. Но, так как у нас нет возможности статически разместить весь буфер кадра в памяти, выигрыш от использования DMA здесь будет минимальным.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

void img_from_flash_v3(uint32_t addr) {

    uint8_t bufer[4096];

    gpio_clear(STPORT, STCS);

    st7735_sendcmd(ST7735_MADCTL);

    st7735_senddata(1 << 7);

    while (SPI_SR(SPI) & SPI_SR_BSY);

    gpio_set(GPIOA, STCS);

    for(uint8_t i = 0; i < 10; i++) {

        w25_read(addr + (i * 4096), bufer, 4096);

        st7735_drawimg(0,0+16*i,128,16, bufer);

    }

    gpio_clear(STPORT, STCS);

    st7735_sendcmd(ST7735_MADCTL);

    st7735_senddata(MV | MX);

    while (SPI_SR(SPI) & SPI_SR_BSY);

    gpio_set(STPORT, STCS);

}

Разумеется, перед тем как обращаться к изображениям в памяти, предварительно их следует туда все же записать. Для этого используется UART2 и протокол xmodem. На принимающей стороне я обрабатываю данные функцией
xmodem_to_flash(), которой передается адрес начала файла во флеше.

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

void xmodem_to_flash(uint32_t addr) {

    unsigned char buf[132];

    uint32_t byte = 0;

    uint8_t lastlen, ch;

    usart2_init();

    usart_send_blocking(USARTX, NAK);

    while(1){

        ch = usart_recv_blocking(USARTX);

        if (ch == SOH){

            for (uint8_t i = 0; i < 131; i++) {

                ch = usart_recv_blocking(USARTX);

                buf[i]=ch;

            }

            lastlen=129;

            while(buf[lastlen] == EOF);

            lastlen -= 1;

            w25_write(addr + byte, buf + 2, lastlen);

            byte += lastlen;

            usart_send_blocking(USARTX,ACK);

            continue;

        }

        if (ch == EOT){

            usart_send_blocking(USARTX, ACK);

            break;

        }

    }

    usart2_deinit();

}

Таким образом, для записи файла с компьютера я начинаю передачу с помощью терминальной программы (например, minicom), после чего любым удобным способом вызываю функцию
xmodem_to_flash().

Энергосбережение

Малое время автономной работы — слабое место современных смартфонов, в том числе даже флагманских аппаратов. В своем проекте я использовал несколько способов сокращения энергопотребления.

В первую очередь посадим на сухой паек радиомодуль. Команда
AT+CSCLK=1 и высокий уровень на выводе DTR переводят SIM800C в спящий режим (
sim800_sleep()). При этом все еще сохраняется возможность принимать входящие вызовы и SMS, но для передачи команд с микроконтроллера нужно вновь подать низкий уровень на DTR и выждать порядка 50 мс (
sim800_wake()). В таком режиме потребление составляет всего несколько миллиампер.

Подсветка дисплея тоже потребляет немало, так что на время ожидания логично отключать и ее (функции
st7735_sleep() и
st7735_wake()). Однако основной выигрыш электроэнергии получается за счет перевода микроконтроллера в режим глубокого сна, это позволяет сэкономить дополнительные 30 мА.

void standby (void) {

    SCB_SCR |= SCB_SCR_SLEEPDEEP;

    PWR_CR |= PWR_CR_PDDS;

    PWR_CR |= PWR_CR_CWUF;

__asm__(«WFI»);

}

Заключительная строчка кода (Wait For Interrupt) переводит F103C8T6 в режим ожидания, из которого он выходит, только когда наступает прерывание. В нашем случае это подача низкого уровня на вывод REST микроконтроллера.

Интерфейс

Интерфейс устройства текстовый и реализован достаточно просто. При вызове соответствующего меню очищается экран и появляется подсказка с функциями клавиш. После этого ожидается пользовательский ввод, и цикл повторяется. Все функции меню собраны в отдельном файле
menu.c.

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

void main_help_menu(void) {

    stprintf(«aHELPrn»

                        «~ — ATArn»

                        «! — ATHrn»

                        «1 — data menurn»

                        «2 — call menu rn»

                        «3 — img menurn»

                        «4 — power menurn»

                        «5 — sim800 menurn»

                        «6 — helprn»

                        «7 — sim800 PWRrn»

                        «8 — sleeprn»

                        «9 — sleep logorn»

                        «* — tel bookrn»

                        «0 — sms menu»);

}

void get_keybord_cmd(void) {

    char bufer[64];

    uint32_t addr,  l, n = 4096;

    char key;

    key=fast_get_key();

    switch (key){

        case ‘1’: data_menu(); break;

        case ‘2’: telbook_menu_v2(); break;

        case ‘3’: img_menu(); break;

        case ‘4’: power_menu(); break;

        case ‘5’: sim800_menu(); break;

        case ‘6’: main_help_menu(); break;

        case ‘7’: sim800_power(); break;

        case ‘8’: st7735_sleep();

                        w25_powerdown();

                        standby();

                        break;

        case ‘9’: w25_powerdown();

                        standby();

                        break;

        case ‘0’: sms_menu(); break;

        case ‘*’: telbook_menu(); break;

        case ‘~’: sim800_take_call(); break;

        case ‘!’: sim800_ath(); break;

    }

    return;

}

Кратко расскажу о некоторых функциях главного меню. Команда ATA позволяет принять входящий вызов, команда ATH отклоняет вызов или завершает звонок. Меню data облегчает работу с внешней памятью и дает возможность в реальном времени посмотреть дамп любого участка, как в ASCII, так и в HEX. Также здесь можно перезаписать байты по произвольным адресам, вплоть до ручного управления полями в контактах (хотя конкретно для этого удобнее воспользоваться подходящим разделом).

Меню call служит для быстрого набора номера из телефонной книги, тогда как tel book позволяет редактировать и добавлять записи новых абонентов. Power menu управляет настройками энергосбережения, а команды sleep и sleep logo переводят устройство в режим сна (примерно 6 и 9 мА потребления соответственно).

Есть и несколько дополнительных полезностей. Меню img выполняет функции галереи и предоставляет доступ к сохраненным картинкам, а sim800 напрямую взаимодействует с радиомодулем через стандартные команды АТ. Как будто не самая очевидная вещь, но она мне здорово пригодилась при отладке.

Идеи и развитие проекта

Я получил большое удовольствие от работы над созданием своего мобильного телефона, последовательно воплощая в жизнь разные функции, отлавливая ошибки и решая возникающие в процессе задачи. И само собой, останавливаться на достигнутом я вовсе не намерен. Вот несколько идей, которые я пока не реализовал, но уже запланировал на ближайшее будущее: встроенные игры, шифрование данных, отправка и прием MMS, записная книжка, дополнительные поля в контактах.

РЕКОМЕНДУЕМ:
Как из телефона сделать панель приборов автомобиля

И это далеко не полный список. Современные микроконтроллеры имеют массу полезных интерфейсов и позволяют подключать самую разную периферию: микросхемы внешней оперативной памяти, карточки SD, экраны с высоким разрешением и даже цифровые камеры. Кажется, так можно увлечься и собрать полноценный смартфон!

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (3 оценок, среднее: 5,00 из 5)

Загрузка…

Сегодня мы сделаем вполне себе рабочий, хотя и довольно простой в плане функционала, мобильный телефон.

Вот перечень тех функций, которые будет поддерживать наш телефон:

  • — Принимать и делать звонки
  • — Принимать и отправлять СМС
  • — Хранить записную книжку
  • — Показывать время
  • — Будить в заданное время

Телефон будет работать в GSM сетях и использовать обычную SIM карту. Он будет сконструирован на базе железа и софта входящего в комплект Arduino GSM Shield (можно купить на амазоне, ~90$ за новый, и 70$ за б/у). Однако Arduino GSM Shield это просто набор голых плат, в них мало веселья, нам же нужен настоящий телефон, с интерфейсом, кнопками, микрофоном, дисплеем и т.д. Детальное описание железа и софта можно найти на open source проекте размещенном на GitHub (Железо и Софт)

Зачем я делаю этот проект? Отчасти потому что это весело, и отчасти потому что, хотя телефоны и стали за последние 10-15 лет вездесущими, очень малый процент людей догадывается и понимает как они работают, и как они устроены. С виду они кажутся сложными, но на самом деле собираются также как электро чайник или микроволновка. А так как телефоны вездесущи и популярны, в мире полно компаний которые выпускают нужные нам комплектующие.

Проведя пару вечером за компьютером я натыкался на места где можно было бы купить все элементы по довольно низким ценам в малом количестве, и для их сборки не нужно было дополнительное оборудование, только твои, надеюсь умелые руки. Возможно я что то упростил, и конечно придется приложить немного усилий для сборки телефона, но поверь мне, собрать его гораздо проще, чем получить степень по физике.

За прошлый год я собрал несколько версий такого телефона, и использовал их как свой основной девайс. Плюс я проводил занятия с другими любителями электроники, на которых мы также собирали разные вариации этого телефона. Тебе не понадобиться иметь каких то особых знаний в электронике, а вот умение конфигурировать софт, паять мелкие компоненты, иметь навыки в лазерной резке — все это пригодится. Хотя если ты этого раньше не делал, все равно попробуй, но будь готов к тому, что будет немного сложнее. Хотя все же я бы посоветовал приступать к проекту только если у тебя уже есть навыки в пайке и в работе с вещами от Arduino, или ты можешь найти кого-то с опытом.

Шаг 1: Материалы и комплектующие

Платы можно заказать от OSH Park. Стоимость комплекта из 3 штук ~60$.

Компоненты для плат можно купить в одной из этих компаний: Digi-Key, SparkFun и Ardunio. Полный список комплектующих тут — PDF. Общая стоимость порядка 135$ + доставка.

Для сборки платы понадобится конечно же паяльник (пример), припой, щипцы и т.д. Для программирования микроконтроллера понадобится AVR программатор (например такой) и usb кабель (пример). Для зарядки батареи понадобится mini-USB. Если у тебя нет ничего из этого, и ты не планируешь создавать дома полноценную лабораторию, то обратись в местный кружок юных техников, скорее всего у них есть все что тебе нужно, и они не откажут тебе в просьбе поработать с их оборудованием в обмен на хрустящие купюры или банку меда :)

Для корпуса нам понадобится фанера 6 мм (только не покупай фанеру на которой видны следы клея, при работе с лазером он может возгореться), шпон, ~1.5 см шурупы. Хотя конечно ты можешь придумать и свой корпус и сделать его из любого другого материала.

Шаг 2: Паяем электронику

Хотя в телефоне много мелких компонентов, которые монтируются к плате, тем не менее, немного наловчившись, вполне можно спаять все это руками.

Хотя процесс припоя большинства компонентов не сложен, есть некоторые моменты на которые нужно обратить внимание:

Конденсаторы: будь осторожен с полярностью больших конденсаторов (1000 uf), они могут взорваться если паять их обратной стороной. Для ориентира обращай внимание на оранжевую полосу.

Полярность: другие компоненты с полярностью: включая супер конденсатор, диоды, микроконтроллер ATmega1284P, M10 GSM модуль, сокет SIM карты, микрофон. Компоненты без полярности: микрофон, кнопки, малые конденсаторы, резисторы.

Шаг 4: Решаем проблемы со связью

В телефоне много компонентов, которые ответственны за работу с сетью, их не верная настройка может повлечь проблемы с подключением к сети. Если на дисплее не исчезая светится Connect, можно быть уверенным что то то пошло не так. Ниже я приведу одни из самых частых причин подобного поведения. Если же ты вовсе не видишь на дисплее ничего, то нужно проверить места спайки компонентов, и убедится в том, что софт встал как нужно и без ошибок.

Что нужно проверить:

Не забыл ли ты вставить SIM карту?
Корректно ли припаян сокет SIM карты? А 22 омный резистор (тот, который соединяет сокет сим карты и GSM модуль)? Все ли в порядке с GSM модулем?
Корректно ли припаяна антенна?
Резистор на 0 ом корректно ли припаян? (тот, что на соединении M10 GSM модуля и антенны)
Попробуй выйти из помещения в место с точно хорошим сигналом.

Отладка

Ты можешь продолжить отладку телефона коммуницируя с GSM модулем с компьютера, используя микроконтроллер как прокси. Для этого загрузи на телефон по кабелю SerialProxy, открой его на компьютере и укажи скорость передачи данных равной 9600, а в качестве окончания строки — «carriage return». Через пару секунд ты должен увидеть: «READY
AT
OK». Это говорит о том, что GSM модуль готов принимать AT команды. Детальное описание команд можно найти в документации к GSM модулю.

Базовые команды:

AT — тестовая команда, должна вернуть ОК.
AT CREG? — проверка статуса регистрации в сети. Ответ вида: » CREG 0,N», где N может быть 0 (устройство не зарегистрировано), 1 (регистрация пройдена), 2 (поиск сети), 3 (запрос на регистрацию отклонен), 5 (регистрация пройдена, роуминг)
AT CPBS=»SM» — выбор телефонной книги сим карты.

Шаг 5: Использование телефона

Вот и настал таки тот самый радостный момент, когда можно начать звонить подругам и друзьям :)
По крайней мере, я надеюсь что у тебя все получилось! Однако осталось еще буквально пара моментов.

Разблокировка телефона.

При первом успешном запуске телефон будет заблокирован, его экран будет пустым. Для активации нажми любую кнопку, на экране высветится дата и время, теперь нажми верхнюю левую кнопку — ура, телефон разблокирован.

Блокировка телефона.

Чтобы заблокировать телефон нажми левую верхнюю кнопку. В таком состоянии он по прежнему будет принимать смс и звонки.

Звонки.

Для совершения звонков просто набери нужный номер и нажми Call (все как на обычном телефоне), для удаления вводимых цифр используй кнопку *.

  • Как делают телефоны галилео
  • Как делают телефоны алиса
  • Как делают стикеры на телефон
  • Как делать сканы документов на телефоне
  • Как делать скан на телефоне самсунг