Не корректно работает реле под нагрузкой

nexxie
Offline
Зарегистрирован: 10.10.2021

Добрый день! 

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

Имеется:

1)Arduino nano (ATmega328P)

2)Реле HIGH SLA-05VDC-SL-C  - IN подключен к 12 пину ардуино

3)Модуль YK04 

пин VT - > 4 пин ардуино

пин D2 - >3 пин ардуино

Если через реле не проходит ток, то по нажатию на кнопку "A", реле корректно переключается в верхнее состояние. Если к реле подключить силовые кабели, реле перестает нормально переключаться(как будто реле переключается не до конца. щелчок есть )

Скетч

#define ledPin 13
#define vtRem 3
#define vtRem 1
#define keyB_A 4
#define exitA 11

// Состояние выхода, установленного в состояние ВЫКЛ.
boolean statusexitA = false;

void setup() {
  // Конфигурация  выходов.
  pinMode(exitA, OUTPUT);
  
 // Конфигурация ключей как входов.
  pinMode(keyB_A, INPUT);

// Мы активируем PULL-UP Verify Tx для большей стабильности.
  pinMode(vtRem, INPUT_PULLUP);
  
// Активируем прерывание (теперь мы можем прочитать команду)
  attachInterrupt(vtRemInt, keyBRead, RISING);
}

void loop() {
  // Припаянный к плате светодиод не горит, пока ни одна кнопка не нажата.
  digitalWrite(ledPin, LOW);
}

// Подпрограмма прерывания для чтения клавиатуры
void keyBRead() {

 // Мы отключаем прерывания.
  noInterrupts();
 // Мы включаем светодиод платы Arduino, чтобы показать пользователю, что что-то получено.
  digitalWrite(ledPin, HIGH);

 // Если у нас есть ВЫСОКОЕ состояние на выводе клавиши A, это означает, что она была нажата, если нет, мы проверим B и так далее.
  if(digitalRead(keyB_A) == HIGH){
// В этом случае, когда мы получили A, мы переключаем значение выхода A
  statusexitA = !statusexitA;
  digitalWrite(exitA, statusexitA);
  }
    
  delay(500);
  interrupts();
}

 

 

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

Компилятор на #3 не жалуется?

И вообще с ногами какая то фигня вроде..

rkit
Offline
Зарегистрирован: 23.11.2016

Схему проверяй

nexxie
Offline
Зарегистрирован: 10.10.2021
Испраивл

#define ledPin 13
#define vtRem 3
#define vtRemInt 1
#define keyB_A 4
#define exitA 11

// Состояние выхода, установленного в состояние ВЫКЛ.
boolean statusexitA = false;

void setup() {
  // Конфигурация  выходов.
  pinMode(exitA, OUTPUT);
  
 // Конфигурация ключей как входов.
  pinMode(keyB_A, INPUT);

// Мы активируем PULL-UP Verify Tx для большей стабильности.
  pinMode(vtRem, INPUT_PULLUP);
  
// Активируем прерывание (теперь мы можем прочитать команду)
  attachInterrupt(vtRemInt, keyBRead, RISING);
}

void loop() {
  // Припаянный к плате светодиод не горит, пока ни одна кнопка не нажата.
  digitalWrite(ledPin, LOW);
}

// Подпрограмма прерывания для чтения клавиатуры
void keyBRead() {

 // Мы отключаем прерывания.
  noInterrupts();
 // Мы включаем светодиод платы Arduino, чтобы показать пользователю, что что-то получено.
  digitalWrite(ledPin, HIGH);

 // Если у нас есть ВЫСОКОЕ состояние на выводе клавиши A, это означает, что она была нажата, если нет, мы проверим B и так далее.
  if(digitalRead(keyB_A) == HIGH){
// В этом случае, когда мы получили A, мы переключаем значение выхода A
  statusexitA = !statusexitA;
  digitalWrite(exitA, statusexitA);
  }
    
  delay(500);
  interrupts();
}

 

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

07 #define exitA 11

2)Реле HIGH SLA-05VDC-SL-C  - IN подключен к 12 пину ардуино

Это оно? Точно?

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

А результат исправления какой?

nexxie
Offline
Зарегистрирован: 10.10.2021

<span style="font-size:14.4px;font-weight:700;">Rumata</span>],[quote=<span style="font-size:14.4px;font-weight:700;">BOOM</span> пишет:

Не нашел как исправить сам текст поста скопировал его тут и изменения написал жирным шрифтом. (В описании поменял на 11 порт и переименовал в строчке 3 переменную)

 

Добрый день! 

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

Имеется:

1)Arduino nano (ATmega328P)

2)Реле HIGH SLA-05VDC-SL-C  - IN подключен к 11 пину ардуино

3)Модуль YK04 

пин VT - > 4 пин ардуино

пин D2 - >3 пин ардуино

Если через реле не проходит ток, то по нажатию на кнопку "A", реле корректно переключается в верхнее состояние. Если к реле подключить силовые кабели, реле перестает нормально переключаться(как будто реле переключается не до конца. щелчок есть )

Скетч

#define ledPin 13
#define vtRem 3
#define vtRemInt 1
#define keyB_A 4
#define exitA 11

// Состояние выхода, установленного в состояние ВЫКЛ.
boolean statusexitA = false;

void setup() {
  // Конфигурация  выходов.
  pinMode(exitA, OUTPUT);
  
 // Конфигурация ключей как входов.
  pinMode(keyB_A, INPUT);

// Мы активируем PULL-UP Verify Tx для большей стабильности.
  pinMode(vtRem, INPUT_PULLUP);
  
// Активируем прерывание (теперь мы можем прочитать команду)
  attachInterrupt(vtRemInt, keyBRead, RISING);
}

void loop() {
  // Припаянный к плате светодиод не горит, пока ни одна кнопка не нажата.
  digitalWrite(ledPin, LOW);
}

// Подпрограмма прерывания для чтения клавиатуры
void keyBRead() {

 // Мы отключаем прерывания.
  noInterrupts();
 // Мы включаем светодиод платы Arduino, чтобы показать пользователю, что что-то получено.
  digitalWrite(ledPin, HIGH);

 // Если у нас есть ВЫСОКОЕ состояние на выводе клавиши A, это означает, что она была нажата, если нет, мы проверим B и так далее.
  if(digitalRead(keyB_A) == HIGH){
// В этом случае, когда мы получили A, мы переключаем значение выхода A
  statusexitA = !statusexitA;
  digitalWrite(exitA, statusexitA);
  }
    
  delay(500);
  interrupts();
}

 

 

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

ХЗ что там еще, но delay(500) в прерывании режет глаз

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

в обработчике должна быть одна строка

statusexitA = !statusexitA;

ну если нужно можно еще и условие добавить.

все! остальное переносить в лууп.

чем проверено работоспособность реле без нагрузки?

а то может подсоединяете нагрузку на контакты реле которые никогда не замыкаются.

схема, тип реле, фото - вот тогда ваша проблема быстро решится.

nexxie
Offline
Зарегистрирован: 10.10.2021

все перенес, все так же. 

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

P.S.: я тестировал на разных реле. Вот фото

 

Саама схема

sadman41
Offline
Зарегистрирован: 19.10.2016

Реле через ардуину питается и ноль коммутирует?

Green
Offline
Зарегистрирован: 01.10.2015

Даже не читал. Реле - мощный потребитель по +5в, плюс источник помех при срабатывании. Проверяется питанием от отдельного источника. 

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

nexxie пишет:

Если через реле не проходит ток, то по нажатию на кнопку "A", реле корректно переключается в верхнее состояние. Если к реле подключить силовые кабели, реле перестает нормально переключаться(как будто реле переключается не до конца. щелчок есть )

Такое "чудо" с трудом можно представить, но,если коммутируете мощную нагрузку, а вся система запитана через переноску с тонким проводом, или есть где-то плохой контакт и ,при подключении  нагрузки, критично проседает сетевое напряжение.

Проверьте, не проседают ли напряжения при подключении нагрузки, и рассчитана ли на неё сеть

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

ну что сказать, чудеса!

а если включить реле без нагрузки (вижу лампа у вас), а потом штепсель в розетку?

nexxie
Offline
Зарегистрирован: 10.10.2021

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

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

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

все у меня мыслей больше нет.

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

 Ещё можно проверить реле и плату на утечку, хотя-бы мультиметром на мегаомах. Между силовыми контактами реле и катушкой, а так же пинами управления, не должно быть сопротивления ниже 100МОм

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Я бы предложил еще несколько экспериментов для локализации проблемы:

1) Написать простую программу автоматического включения - выключения реле раз в секунду. Если будет сбоить - значит проблема в воздействии искрения на ардуинку. Исправить шунтированием выхода реле 1-2 конденсаторами.

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

3) Установить очень маленькую чисто тепловую нагрузку (лампочка накаливания 10-15Вт. Такие еще продаются для холодильников) или в выходной цепи поставить светодиод с питанием от отдельного блока питания.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

Я бы поверил в косяк с реле с искренеем, но он выше пишет что менял реле и ни раз. Ту наверное все таки питание.

nexxie
Offline
Зарегистрирован: 10.10.2021

xDriver пишет:

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

все у меня мыслей больше нет.

Запитал от 4 батареек (~5.5 В) ведет себя так же

nexxie
Offline
Зарегистрирован: 10.10.2021

mykaida пишет:

Я бы предложил еще несколько экспериментов для локализации проблемы:

1) Написать простую программу автоматического включения - выключения реле раз в секунду. Если будет сбоить - значит проблема в воздействии искрения на ардуинку. Исправить шунтированием выхода реле 1-2 конденсаторами.

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

3) Установить очень маленькую чисто тепловую нагрузку (лампочка накаливания 10-15Вт. Такие еще продаются для холодильников) или в выходной цепи поставить светодиод с питанием от отдельного блока питания.

Спасибо за дельный совет. Сегодня попробую и напишу результат 

nexxie
Offline
Зарегистрирован: 10.10.2021

mykaida пишет:

Я бы предложил еще несколько экспериментов для локализации проблемы:

1) Написать простую программу автоматического включения - выключения реле раз в секунду. Если будет сбоить - значит проблема в воздействии искрения на ардуинку. Исправить шунтированием выхода реле 1-2 конденсаторами.

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

3) Установить очень маленькую чисто тепловую нагрузку (лампочка накаливания 10-15Вт. Такие еще продаются для холодильников) или в выходной цепи поставить светодиод с питанием от отдельного блока питания.

Сделал как вы и говорили, работает стабильно. Буду тогда искать причину в своем первоначальном коде. (да простят меня за delay())

#define relay 9


int last_time =0;
void setup() {
  // put your setup code here, to run once:
  pinMode(relay, OUTPUT);

}

void loop() {
  digitalWrite(relay, LOW);   
  delay(500);
  digitalWrite(relay, HIGH); 
  delay(500);
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Интеррапт рядом с силовыми кабелями - источник потенциальных багов - обработчик будет мотаться как г-но в проруби. Избавьтесь от него хотя бы временно - читайте через digitalRead() свой вход. Если осциллограф есть - присядьте на вход, посмотрите чего там творится.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

ну вот половину отсекли (mykaida респект за системный подход), а теперь код... код который не работает СЕЙЧАС, ни вчера, ни я поправил, а только тот который СЕЙЧАС.

просто присмотрелся, вот это вызывает вопросы

// Мы активируем PULL-UP Verify Tx для большей стабильности.
  pinMode(vtRem, INPUT_PULLUP);
  
// Активируем прерывание (теперь мы можем прочитать команду)
  attachInterrupt(vtRemInt, keyBRead, RISING);

 

nexxie
Offline
Зарегистрирован: 10.10.2021

В общем я подчистил код. Работает через delay(),через millis() - не захотел. Добавил вторую проверку по состоянию флага на пине. Порт VT решил не обрабатывать. Так же поменял чуть чуть пины подключения .Спасибо еще раз mykaida  за совет. 

#define button_A 3 //Пин конопки А на арудино
#define exit_A 9 // То что кнопка будет переключать

boolean status_exit_A = LOW; //Начальное положение Реле  - выкл(флаг пина выкл)

void setup()
{
  pinMode(button_A, INPUT_PULLUP); //Инициализация кнопки А с YK04 на вход Ардуино
  pinMode(exit_A, OUTPUT); //Инициализация порта выхода с ардуно на реле
  
}

void loop()
{
  if (digitalRead(button_A) == HIGH  && status_exit_A == 0) //Если кнопка нажата и пинатание ЕСТЬ на пине 9 нет 
  {
    digitalWrite(exit_A, status_exit_A); 
    status_exit_A = !status_exit_A; // Меняем флаг состояния кнопки 
    delay(500);
    }
   
  if (digitalRead(button_A) == HIGH  && status_exit_A == 1)//Если кнопка нажата и пинатания НЕТ на пине 9 нет 
  {
    digitalWrite(exit_A, status_exit_A);
    status_exit_A = !status_exit_A; // Меняем флаг состояния кнопки 
    Serial.println(status_exit_A);
    delay(500);
  }
}

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Можно было и попроще:

#define button_A 3 //Пин конопки А на арудино
#define exit_A 9 // То что кнопка будет переключать

//boolean status_exit_A = LOW; //Начальное положение Реле  - выкл(флаг пина выкл)

void setup()
{
  pinMode(button_A, INPUT_PULLUP); //Инициализация кнопки А с YK04 на вход Ардуино
  pinMode(exit_A, OUTPUT); //Инициализация порта выхода с ардуно на реле
  
}

void loop()
{
  if (digitalRead(button_A) == HIGH)
  {
    digitalWrite(exit_A, !digitalRead(exit_A)); 
    
    delay(500);
    }
  
}

 

nexxie
Offline
Зарегистрирован: 10.10.2021

Спасибо за еще один вариант. Так действительно проще)

SLKH
Offline
Зарегистрирован: 17.08.2015
Spee
Offline
Зарегистрирован: 20.10.2021

https://www.teachmemicro.com/wp-content/uploads/2019/06/Arduino-Nano-pinout-3.jpg

Пины 2,3 с прерыванием. Ни тот ни другой подтягивать нельзя. Все силы уходят на то что бы подтягивающий резистор сытый был, на реле сил не остается. Так же внимательным нужно быть с выходами SPI. SS - вобще лучше не трогать.При этом не факт что получится его не трогать. Указано что SS это D10, но на практике еще на D4 он то ли дублируется, то ли меняется как то программно  MOSI должен быть output, а вот MISO input.

Но вот в вашем примере явно резистор кушает, раз у реле сил не хватает.

nik182
Offline
Зарегистрирован: 04.05.2015

Spee пишет:
...Пины 2,3 с прерыванием. Ни тот ни другой подтягивать нельзя. Все силы уходят на то что бы подтягивающий резистор сытый был, на реле сил не остается. Так же внимательным нужно быть с выходами SPI. SS - вобще лучше не трогать.При этом не факт что получится его не трогать. Указано что SS это D10, но на практике еще на D4 он то ли дублируется, то ли меняется как то программно  MOSI должен быть output, а вот MISO input...

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

 

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

так дальше еще забавне, чел намекает нам на ремап пинов наверное:)

Spee пишет:

Указано что SS это D10, но на практике еще на D4 он то ли дублируется, то ли меняется как то программно

где указано, на какой практике... х.з.

nik182
Offline
Зарегистрирован: 04.05.2015

sadman41 пишет:
Интеррапт рядом с силовыми кабелями - источник потенциальных багов - обработчик будет мотаться как г-но в проруби. Избавьтесь от него хотя бы временно - читайте через digitalRead() свой вход. Если осциллограф есть - присядьте на вход, посмотрите чего там творится.

Согласен. Однажды пришлось управлять мощным контактором, который включал индуктивную нагрузку. От реле до контактора было 20 метров. Нормальной работы удалось добиться после питания реле от отдельного источника и обвеса всех контактов снабберами. Реле было переведено в режим опторазвязки. Даже в режиме опторазвязки и отдельном питании без снабберов иногда происходил сброс ардуины.     

Spee
Offline
Зарегистрирован: 20.10.2021

Не то что бы не подтягивать совсем. Но подтянуть на другом пине можно. У меня была один в один проблема на wemos d1. Там китайцы вобще запутали, одни пины при подключении к реле работали другие нет. Как я понял, тогда я подавал output на пин ss. Из-за чего на других пинах случалась абракадабра, вместо установленного output контроллер начинал искать ведомое устройство. Реле от такого пина плевало на мои желания и на код прописаный у него на лбу.

В общем, кому нужны wemos d2r1, валяются три штуки. Сил и желания с ними бороться нет, отдам в хорошие терпеливые руки)))

PS:mega рулит, все остальные arduino в мусор.

Spee
Offline
Зарегистрирован: 20.10.2021

На практике вспомнил свою UNO, в шите указано, выход SS пин 10. Иии нет. не работает. Пин 4 работает. Почему не понимаю, но как было так и говорю. Uno не китайская, оригинал... Может магия, может опыта мало понять сие чудо...

Spee
Offline
Зарегистрирован: 20.10.2021

Собственно на этом примере и испытывался выход 10 и 4 SPI

/*
  SD card read/write

  This example shows how to read and write data to and from an SD card file
  The circuit:
   SD card attached to SPI bus as follows:
 ** MOSI - pin 11
 ** MISO - pin 12
 ** CLK - pin 13
 ** CS - pin 4 (for MKRZero SD: SDCARD_SS_PIN)

  created   Nov 2010
  by David A. Mellis
  modified 9 Apr 2012
  by Tom Igoe

  This example code is in the public domain.

*/

#include <SPI.h>
#include <SD.h>

File myFile;

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }


  Serial.print("Initializing SD card...");

  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    while (1);
  }
  Serial.println("initialization done.");

  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  myFile = SD.open("test.txt", FILE_WRITE);

  // if the file opened okay, write to it:
  if (myFile) {
    Serial.print("Writing to test.txt...");
    myFile.println("testing 1, 2, 3.");
    // close the file:
    myFile.close();
    Serial.println("done.");
  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }

  // re-open the file for reading:
  myFile = SD.open("test.txt");
  if (myFile) {
    Serial.println("test.txt:");

    // read from the file until there's nothing else in it:
    while (myFile.available()) {
      Serial.write(myFile.read());
    }
    // close the file:
    myFile.close();
  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }
}

void loop() {
  // nothing happens after setup
}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Spee пишет:

В общем, кому нужны wemos d2r1, валяются три штуки. Сил и желания с ними бороться нет, отдам в хорошие терпеливые руки)))

у меня вемос три года работает круглосуточно, проблем нет, руки у меня хорошие, девушки говорят - как масло, а девушкам надо верить )))

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

nik182 пишет:

Spee пишет:
...Пины 2,3 с прерыванием. Ни тот ни другой подтягивать нельзя.

Это точно в мемориз.

А зачем это комментировать. Еще при первом прочтении поста было видно, что человек под чем-то тяжелым. Может и не торчок, просто из больнички пишет? Зря обижать не стану.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

wdrakula пишет:

 человек под чем-то тяжелым

дексаметазон?

Spee
Offline
Зарегистрирован: 20.10.2021

)))Ну что же вы) Я пол года как изучать это все начал. Эмбрион новичка, так сказать) Но так интересно что пихаю информацию по максимуму) Вот и получается передоз) Я не из обидчевых, так что жгите) Только по делу и с разъяснением, тупым оставаться не хочется)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Spee пишет:

 тупым оставаться не хочется)

это обычно от кислорода бывает )))

Spee
Offline
Зарегистрирован: 20.10.2021

 Так уж и быть. Придется создать отдельно тему, что бы гуру мне извилины правильно согнули)

b707
Offline
Зарегистрирован: 26.05.2017

Spee пишет:

Собственно на этом примере и испытывался выход 10 и 4 SPI

/*
 
 ** MOSI - pin 11
 ** MISO - pin 12
 ** CLK - pin 13
 ** CS - pin 4 (for MKRZero SD: SDCARD_SS_PIN)

 

и как тестировали? - тупо меняли пин 4 на пин 10? А комментарии в коде читали - я вот специально выше вам оставил? Строчка  ** CS - pin 4 ни на какие мысли не наводит? :)