Этот пост — продолжение серии рассказов о том, как можно сделать своими руками выключатель полезной нагрузки.
В первой части была описана «железячная» составляющая: особенности ее проектирования и производства.
Сегодняшний пост описывает шаги по подготовке среды разработки Arduino и полное тестирование изготовленного модуля.
Для работы с изготовленным модулем потребуется любой ISP-программатор. Я буду использовать имеющийся USBtinyISP, вы можете использовать такой же или любой другой (например, сделать ArduinoISP из имеющейся платы ардуино).
Напомню, что по финалу предыдущего поста мы получили полностью собранное устройство — все компоненты находятся на своих местах.
Теперь необходимо проверить ее работоспособность.
Проверка МК
Проще всего это сделать следующим образом: подключить программатор и считать значения фьюзов.
Поскольку пост ориентирован на новичков, то буду использовать наглядные инструменты и покажу, как это сделать максимально просто: будем использовать графическую оболочку Avrdude-GUI.
- Скачиваем пакет Avrdude-GUI по ссылке.
- Распаковываем полученный архив в какую-нибудь папку.
- Запускаем avrdude-GUI.
После этих нехитрых действий появится окно типа:
Теперь необходимо сделать минимальные настройки: выбрать используемый программатор (поле Programmer), используемый порт (Port), указать используемый МК (Device).
Теперь подключаем программатор к компьютеру, а сам программатор — к нашей плате.
В секции «Fuse» нажимаем кнопку «Read». Если все сделано правильно — в соответствующих полях появятся значения фьюзов:
1. Где-то непропай (или наоборот, «сопля»). Тогда в результате попытки считать фьюзы появится сообщение о такой ошибке:
Для исправления ситуации отключайте плату от программатора и очень придирчиво проверяйте качество пайки:
- тонкой иглой проверяйте, насколько хорошо припаяны все ноги МК,
- через увеличительное стекло отсматривайте подозрительные места,
- прозванивайте тестером цепи от разъема ISP до МК,
- проверяйте цепи питания.
2. Неверно выбран тип МК. Сообщение об ошибке будет выглядеть примерно так:
В моем случае как раз такая ошибка и возникла. Произошло это из-за того, что я использовал ATmega168p, а в программе выбрал ATmega168.
Чипы эти максимально близки, но у них разная сигнатура, о чем система заботливо сообщила. При этом программа подсказывает и решение проблемы — проверить правильно выбранный чип или отключить проверку сигнатуры (добавив ключ "-F" в поле «Command Line Option»).
Я воспользовался именно вторым решением (в данном случае это абсолютно нормально).
Правильнее было бы, конечно, открыть файл avdude.conf и добавить там информацию о ATmega168p, но оставим это на моей совести.
С помощью этой же оболочки можно и записать необходимые фьюзы.
В нашем случае требуется обеспечить работу МК от внутреннего осциллятора на частоте 8МГц. Для этого можете использовать для ATmega168p те значения, что приведены выше на скриншоте.
Фьюзы «объясняют» МК, в каком режиме он должен работать. О том, какие значения необоходимо прописывать (или понять значения приведенных выше) можно с помощью «калькулятора фьюзов AVR», который доступен, например, по этой ссылке.
Теперь можно приступать к следующему этапу: проверка возможности программирования МК и тестирование остальной «периферии» на плате.
Подготовка среды разработки
Для этого следует сделать еще один подготовительный шаг: необходимо для среды Arduino создать соответствующую «плату». Делается это следующим образом: нужно открыть текстовым редактором файл boards.txt, который находится внутри папки ARDUINOhardwarearduino, где «ARDUINO» — корневая папка, в которой находится среда разработки.
В этот файл необходимо добавить следующие строчки:
##############################################################
s168po8.name=Sensor168p (int8MHz, 1.8V)
s168po8.upload.protocol=arduino
s168po8.upload.maximum_size=14336
s168po8.upload.speed=19200
s168po8.bootloader.low_fuses=0xe2
s168po8.bootloader.high_fuses=0xde
s168po8.bootloader.extended_fuses=0x00
s168po8.bootloader.path=atmega
s168po8.bootloader.file=ATmegaBOOT_168_pro_8MHz.hex
s168po8.bootloader.unlock_bits=0x3F
s168po8.bootloader.lock_bits=0x0F
s168po8.build.mcu=atmega168p
s168po8.build.f_cpu=8000000L
s168po8.build.core=arduino
s168po8.build.variant=standard
##############################################################
В первой строке указывается «имя платы», которое вы потом будете выбирать в среде программирования (можете указать любое, какое вам нравится).
Особенное внимание обратите на параметры, которые описывают фьюзы, тип МК и частоту, на которой будет работать устройство.
После этих несложных манипуляций можно запускать среду Arduino и убедиться в том, что «новая плата» появилась в списке доступных (в меню «Сервис — Плата» надо выбрать нашу: Sensor168p (int8MHz, 1.8V)).
Тест кнопок и реле
Напомню, что по схемотехнике ключи для управления реле подключены к цифровым пинам D3 и D4, а кнопки — к аналоговым A1 и A0.
Сделаем простейший тест для проверки нормального функционирования кнопок и реле:
// реле
int r1 = 3; // D3
int r2 = 4; // D4
// кнопки
int b1 = 15; // A1
int b2 = 14; // A0
void setup() {
// реле
pinMode(r1, OUTPUT);
pinMode(r2, OUTPUT);
// кнопки
pinMode(b1, INPUT);
pinMode(b2, INPUT);
// включим подтягивающие резисторы для кнопок
digitalWrite(b1, HIGH);
digitalWrite(b2, HIGH);
}
void loop() {
// если нажали кнопку b1 - включим реле r1
if (digitalRead(b1) == LOW) {
digitalWrite(r1, HIGH);
}
else {
digitalWrite(r1, LOW);
}
// если нажали кнопку b2 - включим реле r2
if (digitalRead(b2) == LOW) {
digitalWrite(r2, HIGH);
}
else {
digitalWrite(r2, LOW);
}
}
Загружаем этот тест в наше устройство.
Перед загрузкой не забываем выбрать используемый программатор в меню «Сервис» — «Программатор».
Поскольку используется программатор, то процедура чуть иная — надо в меню «Файл» выбирать пункт «Загрузить с помощью программатора» (или просто нажать комбинацию клавиш Ctrl+Shift+U).
Если все сделано правильно, то при замыкании кнопок будут щелкать соответствующие реле.
Вышеприведенный тестовый скетч не отрабатывает «дребезг» и нужен исключительно для быстрой проверки функционирования платы.
- Что-то неправильно сделано в среде Arduino (тогда появляются сообщения о проблемах с загрузкой в МК).
- Проблемы в аппаратной части (при этом загрузка проходит успешно, но реле не щелкает).
В первом случае нужно проверить все шаги, что описаны раньше (работа с файлом boards.txt, правильно выбранная результирующая плата и программатор).
Во втором случае лучшими помощниками снова станут принципиальная схема, лупа, острая иголка и тестер.
После этого остается только проверить все ли в порядке с разъемом для подключения nRF24L01+.
Тест интерфейса для nRF24L01+
На этом этапе мы не будем писать код, а просто проверим электрические цепи: при подключенном программаторе (или источнике питания 5В) измеряем напряжение между 1 и 2 контактом разъема RF24 — должно быть 3.3В.
Теперь отключаем программатор (или источник питания) и прозваниваем все цепи разъема на предмет отсутствия замыкания между соседними и наличие соединения с соответствующими пинами МК (см.схему из предыдущего поста).
Проверка высоковольтной части
Поскольку наше устройство в последующем будет коммутировать высоковольтную нагрузку, следует очень придирчиво проверить эту часть:
- Очень придирчиво осмотрите плату (ту часть, где расположены реле и клеммники для подключения нагрузки), устраните все подозрительные места, пайка должна быть очень надежной. Не должно быть никаких «лишних» соединений.
- Прозвоните тестером все цепи, заодно определите, на каких контактах клеммника у вас нормально замкнутые (НЗ) и нормально разомкнутые (НР) контакты.
Результат
После всех проверок у вас на руках — полнофункциональный и полностью готовый к последующему программированию модуль. Ваша среда программирования так же подготовлена для дальнейших шагов.
Продолжение следует...
Полезные ссылки:
- Arduino ISP
- Использование Arduino UNO в качестве программатора
- AVR. Учебный Курс. Конфигурация FUSE бит
Автор: avstepanov