Arduino. Первый опыт. Школьный звонок и недоwebserver.

Добрый день. Хочу поделиться с вами первым горьким (или не очень) опытом. Было решено изучить что-же такое arduino и как его практически можно было использовать. Естественно решил сделать замену школьному звонку, с возможностью управления по локальной сети без поднятия web сервера и с записью расписания звонков на microsd карту.
Что использовалось:

- arduino mega 2560;
- ethernet модуль enc28j60;
- модуль MicroSD Card Adapter на базе LVC125A;
- твердотельное реле на базе G3MB-202P;
- модуль часов реального времени DS3231M;
- макетная плата 70*90;
- кривые руки;
- нулевые знания в arduino и С++;
- боль и слезы.

Что в итоге вышло:

Arduino. Первый опыт. Школьный звонок и недоwebserver. Arduino, Arduino Mega, Длиннопост

Теперь по порядку.

Поскольку познания в C++ у меня были совершенно никакие, поэтому было решено брать arduino mega 2560, для того чтобы был запас памяти, ввиду работы со строками (массивами). Модули взял какие были в продаже, не изучив возможные проблемы работу с ними (первая ошибка). По отдельности все модули, кроме модуля реального времени работали нормально, RTC модуль потом пришлось заменить на DS3231. В целом с данным модулем проблем дальше не было, ибо он подключается к шине (интерфейсу I2C).

Этап слез и боли.

Когда уже где-то на горизонте замаячил финал и сладостное предвкушение от результата работы, жизнь вновь окунула меня в жесткие реалии. Ethernet модуль и microsd ну никак не хотели работать вместе. Данные модули подключаются к шине (интерфейсу) ICSP и вроде как все должно работать сразу и без проблем. Изучение теории интерфейса ICSP и поиск по форумам ничего не дал. Я грешил на модуль microsd, купил второй такой же, и ничего.....
Работа полностью встала, но решение все же нашлось, даже два: 1. купить модуль другого производителя на другом чипе; 2. исправить недоразумение инженерной мысли создателя сего модуля. Решение заключалось в том, что нужно было кинуть перемычку с 13 ноги LVC125A на резистор R1 и всё. Иначе данный модуль не давал возможность работать другим модулям на данном интерфейсе (это если утрировать).

Arduino. Первый опыт. Школьный звонок и недоwebserver. Arduino, Arduino Mega, Длиннопост

Вытираем слезы и радуемся, мы не настолько плохи.

Чтобы все это дело не паять к arduino было решено сделать шилд для выноса шины ICSP, I2C и кнопки ресет. Купил макетную плату, отпилил лишнее, припаял пины в местах выводов интерфейсов и кнопки ресет. Любителей качественной пайки и перфекционистов прошу не смотреть.

Arduino. Первый опыт. Школьный звонок и недоwebserver. Arduino, Arduino Mega, Длиннопост

Справа внизу подключен модуль RTC.

Еще подсказка для новичков, твердотельное реле нельзя проверить мультиметром и говоря русским языком твердотельное реле работает только под нагрузкой (я использовал обычную лампу накаливая). И еще, ногу DC+ реле я подключил через тумблер, для возможности отключения звонка.

Все это дело отлично вписалось в корпус роутера D-Link DIR-400.

На этом я аппаратной частью можно и закончить.

Программная часть.

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

- EtherCard.h;

- SD.h;

- DS3231.h;.

Почему именно они.

DS3231.h - может показывать в

ремя в unixtime и в виде hh:mm:ss в формате string. Также умеет работать с днями недели.

SD.h - ничего особенного, просто с ней получилось сразу подружиться.

EtherCard.h - выбор библиотеки для работы с сетью стал для меня камнем преткновения. Поскольку мне хотелось отсылать расписание по сети, получать ответ, синхронизацию по NTP и все это делать со своего сайта (или приложения), а также не хотелось поднимать web сервер (как многие рекомендуют), выбор пал на данную библиотеку. Суть решения свелась к тому, что я отсылаю запрос вида http://ip/?command=команда, arduino парсит запрос и ищет нужные вхождения в строке. После чего шлет http ответ, либо 200 OK, либо 404 not found, это в упрощенной версии. (этот момент более подробно описан в скетче). А в нормальной реализации arduino возвращает json строку и сайт обрабатывает её. В Json строке может быть получено текущее время на arduino, логи за определенный период, текущий урок и пр. информация. Данная реализация находится в стадии допиливания и поэтому пока её не выкладываю.

В основном используется пока что три команды:

http://ip/?3bells=now - дает тройной звонок;

http://ip/?acttim=timenow - принудительная синхронизация с NTP сервером

http://ip/?nwrasp=08:00:00=08:45:00=... (макс. 20 звонков) - передаем новое расписание по сети и сохраняем его на карту.


Прилагаю ссылку на код скетча на ваш суд, код старался максимально комментировать.

Ссылка


p.s. какие проблемы выявлены:
1. иногда запрос не доходит до arduino и приходиться повторно отправлять команду.
2. при проблемах с локальной сетью, не всегда корректно загружается.


Отдельное спасибо @pangoleen.

Arduino & Pi

1.4K постов20.6K подписчиков

Добавить пост

Правила сообщества

В нашем сообществе запрещается:

• Добавлять посты не относящиеся к тематике сообщества, либо не несущие какой-либо полезной нагрузки (флуд)

• Задавать очевидные вопросы в виде постов, не воспользовавшись перед этим поиском

• Выкладывать код прямо в посте - используйте для этого сервисы ideone.com, gist.github.com или схожие ресурсы (pastebin запрещен)

• Рассуждать на темы политики

• Нарушать установленные правила Пикабу

Вы смотрите срез комментариев. Показать все
1
Автор поста оценил этот комментарий

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

Не удивительно, ведь интерфейс называется SPI. А ICSP - это In-Circuit System Programming, т.е. внутрисистемное программирование, нужно для прошивки МК, а никак не для подключения датчиков. Да, в AVR оно использует протокол SPI, да, пины для аппаратного SPI и ICSP будут совпадать, но это разные вещи, поэтому и не нашли ничего.


Решение заключалось в том, что нужно было кинуть перемычку с 13 ноги LVC125A на резистор R1 и всё. Иначе данный модуль не давал возможность работать другим модулям на данном интерфейсе (это если утрировать).

А если бы изучили интерфейс SPI, то узнали бы как там реализовано несколько ус-в на шине и про пин CS/SS, которым и выбирается текущее ус-во.


А вообще для расписания звонков вам должно было хватить и внутренних 4Кбайта EEPROM, и можно было бы без флешки обойтись, если через веб расписание отправлять.

раскрыть ветку (5)
Автор поста оценил этот комментарий
А если бы изучили интерфейс SPI, то узнали бы как там реализовано несколько ус-в на шине и про пин CS/SS, которым и выбирается текущее ус-во.

Я изучил, но проблема оказалась не в моем плохом понимании SPI, а в самом модуле.

Про CS/SS я знаю, с них я и начал проверять.

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

Тогда почему называете его ICSP? :)

LVC125A - просто буфер. 13ая нога включить-выключить 4ый порт. Подтянув её через R1 вы просто вырубили его на какое-то время. Куда сам порт к флешке идет - другой вопрос.

раскрыть ветку (3)
Автор поста оценил этот комментарий

Писал глядя на распиновку arduino, и не придал особого значения, простите.

Насчет 13-й ноги, в данный момент не могу найти информацию, благодаря которой пришел к такому решению, но как факт - работает.

раскрыть ветку (2)
1
Автор поста оценил этот комментарий

Нашел тут https://forum.arduino.cc/index.php?topic=360718.0

Pull up the pin no. 13 of the LVC125A, which controls the MISO output (soldered to GND for some reason), and connect it to the pin no. 8 (CS signal).

Ну соб-но как я понимаю на модуле просто грубо говоря не поддерживался CS и пин ^OE отвечающий за пин MISO всегда был притянут к земле (т.е. включен) и как следствие модуль всегда работал, мешая работе других на шине SPI. Подтянув его к плюсу через R1 теперь этого удалось избежать и теперь включается он и опускается до земли только по команде на ножке CS.

раскрыть ветку (1)
Автор поста оценил этот комментарий

Абсолютно верно. Китайцы не сильно парились и пустили в производство такой вот брак. (недоделку)

Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку