Доброго дня, уважаемые жители форума.
Решил я склепать себе устройство для засветки моделей, из фотополимерного 3д принтера, в УФ спектре.
Решил собирать его под управлением ардуино нано, коих у меня есть несколько штук.
Питается система от 220В, через блок питания светодиодной ленты, который принимает эти 220В, и выдаёт 12В.
Далее эти 12В идут на DC-DC преобразователь, где напряжение понижается до 5В. С преобразователя идёт питание на 4 модуля реле SRD-05VDC. Эти модули будут управлять нагрузкой 220В (2 светодиодные УФ лампы 9Вт каждая, и мотор от микроволновки).
Вот такие модули, открываются логическим нулём (digitalWrite(relaypin,LOW), соответственно закрываются логической единицей (HIGH).
Почему не взял сразу 4-х канальный модуль? Нет в наличии в городе, а хотелось “здесь и сейчас”.
Данные модули реле спаяны на макетную плату, объединены земля и питание (GND и Vcc пины), управляющие ножки (IN), разведены на пины D6-D9 ардуины. Соединение идёт по проводам, питание через два провода на двух-пиновых коннекторах XH 2.54, соединение с пинами через 4 провода, на 4-х пиновых коннекторах такого-же типа.
Подключен модуль джойстика, вот такой
От модуля джойстика идут 5 проводов, через 5-и пиновый коннектор XH 2.54 подключаются к ардуино.
Так же есть спаянные на макетной плате 4 светодиода, красный, желтый и зелёный.
На аноды светодиодов припаяны резисторы 430 Ом, для ограничения тока через светодиод. Аноды подключены на пины D2-D4 ардуино. Катоды соединены в общую линию и идут на землю ардуино.
Подключается это всё через такой же 4-х пиновый коннектор, 1 провод на землю ардуины, и 3 провода на пины.
Сама ардуинка вставляется как шилд в макетную плату, на которой распаяны:
сокет для ардуинки
соответствующие коннекторы XH 2.54
“линии соединения”, посредством напаянной жилы из провода витой пары, от нужных пинов коннекторов, к нужным пинам ардуинки
коннектор питания
“Схема” (за исключением платы со светодиодами). Набросал в пэйнт, чтоб не рисовать на листочке.
И так, теперь суть проблемы.
Залит скетч-пробник, для теста джойстика. Плата светодиодов подключена.
При движении “крестовины” джойстика всё работает как нужно. Светодиоды загораются как должны, в соответствии со скетчем.
Отключаю плату со светодиодами.
Меняю скетч - хочу, чтобы при движении джойстика влево, включалось реле 1, вправо - реле 2. Ну и соответственно вниз-вверх, это реле 3 и 4. При возвращении джойстика в центральное положение, ранее включенное реле должно отключаться, сбрасывать состояние.
Нагрузка к реле никакая не подключена, ибо для начала хочу отладить работу самих модулей.
Происходит же следующее:
Баг 1 - при подключенных модулях реле и модуле джойстика, подаю питание через сеть, не через USB. Красные светодиоды на модулях реле начинают гореть.
Отвожу джойстик влево, включается реле 1, загорается зелёный светодиод на модуле, слышится щелчок реле. Отпускаю джойстик в центр - реле остаётся включенным. Щелчка не слышу, зелёный светодиод продолжает гореть.
Двигаю джойстик вправо. Включается реле 2. Отпускаю - реле 2 остаётся включенным. Реле 1 так-же продолжает работать.
И так же с двумя остальными реле.
Выключаю питание от сети - только тогда выключаются реле.
Баг 2 - подключаю в дополнении к плате джойстика, и плате релейных модулей, плату светодиодов. Хочу, чтобы при нажатии кнопки джойстика моргали несколько раз жёлтый и зелёный светодиоды.
Плюс задаю в void setup() включение красного светодиода, который сигнализирует о том, что питание вкл.
Подаю питание от сети.
Загораются красные светодиоды модулей реле. Затем загорается красный светодиод и вместе с ним щёлкают все 4 модуля реле, на них загораются зелёные светодиоды, то есть все реле включаются вместе с красным светодиодом.
При нажатии на кнопку джойстика ничего не происходит, но система периодически моргает светодиодами, и может зависнуть в этом состоянии, хотя кнопка не нажималась.
Куда копать, уважаемые жители форума? Что я делаю не так? На форуме решения похожих проблем не обнаружил. Поиск в гугле тоже мало что дал по моей теме.
Визуально всё перепроверил не один раз, капель припоя лишних нигде нет, линии соединения друг с другом на плате не пересекаются.
Скетч прилагаю.
#define axX A1 //данные с оси X джойстика в порт А1
#define axY A2 //данные с оси Y джойстика в порт А2
#include <Wire.h>
int n = 0;
int t=0;
int sec=0;
int min=0;
bool fin = false;
int pon = 2; //объявляем сигнальный диод включения на пин D2
int opr = 3; //объявляем сигнальный светодиод готовности силовой цепи на пин D3
int onl = 4; //объявляем сигнальный светодиод запуска программы на пин D4
int sst = 6; //общее реле питания на пин D6
int mtr = 7;//реле мотора на пин D7
int lmp1 = 8;//реле лампы 1 на пин D8
int lmp2 = 9;//реле лампы 2 на пин D9
int swi = 12;//кнопка джойстика на пин D12
int X = 0; //переменная под значение оси X
int Y = 0; //переменная под значение оси Y
void(* resetFunc) (void) = 0; //функция перезапуска программы (софт резет)
bool swpr = false; //флаг нажатия на кнопку джойстика
int i=0;
void setup() {
Serial.begin (9600); //запускаем серийный порт, скорость 9600 бод
//конфигурация пинов реле на вывод
pinMode (pon, OUTPUT);
pinMode (opr, OUTPUT);
pinMode (onl, OUTPUT);
pinMode (sst, OUTPUT);
pinMode (mtr, OUTPUT);
pinMode (lmp1, OUTPUT);
pinMode (lmp2, OUTPUT);
pinMode (swi, INPUT_PULLUP);
pinMode (axX, INPUT);
pinMode (axY, INPUT);
//включаем светодиод "питание включено"
digitalWrite(pon,HIGH);
//посылаем низкий уровень на остальные светодиоды
digitalWrite(opr,LOW);
digitalWrite(onl,LOW);
//на старте закрываем все реле, открытие по нулю
digitalWrite(sst,HIGH);
digitalWrite(mtr,HIGH);
digitalWrite(lmp1,HIGH);
digitalWrite(lmp2,HIGH);
}
void loop()
{
X = analogRead(axX);
Y = analogRead(axY);
swpr = digitalRead(swi);
check();
}
void check()
{
if (X<=300)
{
digitalWrite(sst,LOW);
}
else
{
digitalWrite(sst,HIGH);
}
if (X>=700)
{
digitalWrite(mtr,LOW);
}
else
{
digitalWrite(mtr,HIGH);
}
if (Y<=300)
{
digitalWrite(lmp1,LOW);
}
else
{
digitalWrite(lmp1,HIGH);
}
if (X>=700)
{
digitalWrite(lmp2,LOW);
}
else
{
digitalWrite(lmp2,HIGH);
}
if (swpr==true) clck();
}
void clck()
{
i=0;
while (i<3)
{
digitalWrite(opr,HIGH);
digitalWrite(onl,HIGH);
delay(1000);
digitalWrite(opr,LOW);
digitalWrite(onl,LOW);
delay(1000);
i++;
}
}