#1 2017-05-26 21:20:25

Piman
Учасник
Зареєстрований: 2017-05-26
Повідомлень: 5

Arduino mega и блок из 16 реле ничего не получается

УВ Ардуинщики. Не бросайте в беде. Я уже не знаю куда обратиться.
У нас задача. Сделать компьютеризированное управление советским пневмороботом. Для этого был куплен микроконтроллер arduino mega и блок из 16 реле(специально для ардуино). В работе задействовано 14 из 16 реле.
--Zirzq3jNs.jpg
Сам микроконтроллер запитан через USB порт компьютера
Блок реле запитан от блока питания 12В 1.5А
Питание электропневмоклапанов  27В.
Я загружаю программу на микроконтроллер, и с помощью него управляю релюшками к которым подключены элекропневмоклапана робота.
Но неожиданно происходит дичь!!!
В общем. Без подачи напряжения на контакты реле, все работает прекрасно. Все прекрасно щелкает при подачи команды на микроконтроллер. Но как только я врубаю напругу 27В на электропневмоклапана, плата начинает сходить с ума, тупо перезагружается и я теряю управление над микроконтроллером.

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

Остання редакція Piman (2017-05-26 22:27:24)

Неактивний

#2 2017-05-26 21:39:57

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 1,025

Re: Arduino mega и блок из 16 реле ничего не получается

Точно сказать не могу, хрустальный шар сдал в чистку.

Гадаю на кофейной гуще - видимо, что-то не правильно включаете !!!

Неактивний

#3 2017-05-26 22:29:07

Piman
Учасник
Зареєстрований: 2017-05-26
Повідомлень: 5

Re: Arduino mega и блок из 16 реле ничего не получается

Опечатался чутка. 27В питание электропневмоклапанов

Неактивний

#4 2017-05-27 00:17:57

Piman
Учасник
Зареєстрований: 2017-05-26
Повідомлень: 5

Re: Arduino mega и блок из 16 реле ничего не получается

Q2_V_c1m9Dk.jpg
На скорую руку наваял схему. Может поможет

Неактивний

#5 2017-05-27 14:00:53

goodspeedmen
Учасник
З https://discord.gg/6hbs98y
Зареєстрований: 2016-10-02
Повідомлень: 81

Re: Arduino mega и блок из 16 реле ничего не получается

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

Неактивний

#6 2017-05-27 14:09:47

goodspeedmen
Учасник
З https://discord.gg/6hbs98y
Зареєстрований: 2016-10-02
Повідомлень: 81

Re: Arduino mega и блок из 16 реле ничего не получается

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

Неактивний

#7 2017-05-27 19:26:31

Piman
Учасник
Зареєстрований: 2017-05-26
Повідомлень: 5

Re: Arduino mega и блок из 16 реле ничего не получается

goodspeedmen пише:

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

Ну как то так у меня получилось. Управление при нажатии клавиши

int Vverh=40;          //Подъем
int Vnyz=41;           //Опускание
int Vlevo1=42;         //Поворот влево реле 1
int Vpravo1=43;        // Поворот вправо реле 1
int LevRukaVpered=44;  // Выдвижение левой руки 
int LevRukaNazad=45;   // Задвижение левой руки
int PravRukaVpered=46; // Выдвижение правой руки
int PravRukaNazad=47;  // Задвижение правой руки
int LevKistLevo=48;    // Поворот левой кисти влево
int LevKistPravo=49;   // Поворот левой кисти вправо
int PravKistLevo=50;   // Поворот правой кисти влево
int PravKistPravo=51;  // Поворот правой кисти вправо
int LevKistShvat=52;   // Схват левой кситью
int PravKistShvat=53;  // Схват правой кистью
int val;

void setup()
{
  Serial.begin(9600);
  pinMode(Vverh, OUTPUT);
  pinMode(Vnyz, OUTPUT);
  pinMode(Vlevo1, OUTPUT);
  pinMode(Vpravo1, OUTPUT);
  pinMode(LevRukaVpered, OUTPUT);
  pinMode(LevRukaNazad, OUTPUT);
  pinMode(PravRukaVpered, OUTPUT);
  pinMode(PravRukaNazad, OUTPUT);
  pinMode(LevKistLevo, OUTPUT);
  pinMode(LevKistPravo, OUTPUT);
  pinMode(PravKistLevo, OUTPUT);
  pinMode(PravKistPravo, OUTPUT);
  pinMode(LevKistShvat, OUTPUT);
  pinMode(PravKistShvat, OUTPUT);
  
}

void loop()
{
  if (Serial.available()) {
    val = Serial.read();
    if(val=='8'){
      digitalWrite(Vverh,LOW);
      Serial.println("Подъем");
    }
    else if (val == '2') {
      digitalWrite(Vnyz,LOW);
      Serial.println("Опускается");
    }
    else if (val == '4') {
      digitalWrite(Vlevo1,LOW);
        Serial.println("Поворот налево");
    }     
     else if (val == '6') {
      digitalWrite(Vpravo1,LOW);
      Serial.println("Поворот направо");
    }     
     else if (val == '7') {
      digitalWrite(LevRukaVpered,LOW);
      Serial.println("Выдвижение левой руки");
    }     
     else if (val == '1') {
      digitalWrite(LevRukaNazad,LOW);
      Serial.println("Задвижение левой руки");
    }     
     else if (val == '9') {
      digitalWrite(PravRukaVpered,LOW);
      Serial.println("Выдвижение правой руки");
    }     
     else if (val == '3') {
      digitalWrite(PravRukaNazad,LOW);
      Serial.println("Задвижение правой руки");
    }     
     else if (val == 'Q') {
      digitalWrite(LevKistLevo,LOW);
      Serial.println("Поворот левой кисти направо");
    }     
     else if (val == 'R') {
      digitalWrite(LevKistPravo,LOW);
      Serial.println("Поворот левой кисти направо");
    }     
     else if (val == 'q') {
      digitalWrite(PravKistLevo,LOW);
      Serial.println("Поворот правой кисти налево");
    }     
     else if (val == 'r') {
      digitalWrite(PravKistPravo,LOW);
      Serial.println("Поворот правой кисти направо");
    }     
     else if (val == 'A') {
      digitalWrite(LevKistShvat,LOW);
      Serial.println("Схват левой кистью");
    }     
     else if (val == 'D') {
      digitalWrite(PravKistShvat,LOW);
      Serial.println("Схват правой кистью");
    }     
     else if (val == '0') {
      digitalWrite(Vverh,HIGH);
      digitalWrite(Vnyz,HIGH);
      digitalWrite(Vlevo1,HIGH);
      digitalWrite(Vpravo1,HIGH);
      digitalWrite(LevRukaVpered,HIGH);
      digitalWrite(LevRukaNazad,HIGH);
      digitalWrite(PravRukaVpered,HIGH);
      digitalWrite(PravRukaNazad,HIGH);
      digitalWrite(LevKistLevo,HIGH);
      digitalWrite(LevKistPravo,HIGH);
      digitalWrite(PravKistLevo,HIGH);
      digitalWrite(PravKistPravo,HIGH);
      digitalWrite(LevKistShvat,HIGH);
      digitalWrite(Vverh,HIGH);
      digitalWrite(PravKistShvat,HIGH);
      Serial.println("СТОП");
     }

     else
     {
      Serial.println("ошибка");
     }
  }
}

Программа при использовании датчиков обратной связи (пока нормально не прописаны)

int Vverh=38;          //Подъем
int Vnyz=39;           //Опускание
int Vlevo1=40;         //Поворот влево реле 1
int Vlevo2=41;         // Поворот влево реле 2
int Vpravo1=42;        // Поворот вправо реле 1
int Vpravo2=43;        // Поворот вправо реле 2
int LevRukaVpered=44;  // Выдвижение левой руки 
int LevRukaNazad=45;   // Задвижение левой руки
int PravRukaVpered=46; // Выдвижение правой руки
int PravRukaNazad=47;  // Задвижение правой руки
int LevKistLevo=48;    // Поворот левой кисти влево
int LevKistPravo=49;   // Поворот левой кисти вправо
int PravKistLevo=50;   // Поворот правой кисти влево
int PravKistPravo=51;  // Поворот правой кисти вправо
int LevKistShvat=52;   // Схват левой кситью
int PravKistShvat=53;  // Схват правой кистью
int PRG=0;
int val;

void setup() 
{
  Serial.begin(9600);
  pinMode(Vverh, OUTPUT); // Управление
  pinMode(Vnyz, OUTPUT);
  pinMode(Vlevo1, OUTPUT);
  pinMode(Vlevo2, OUTPUT);
  pinMode(Vpravo1, OUTPUT);
  pinMode(Vpravo2, OUTPUT);
  pinMode(LevRukaVpered, OUTPUT);
  pinMode(LevRukaNazad, OUTPUT);
  pinMode(PravRukaVpered, OUTPUT);
  pinMode(PravRukaNazad, OUTPUT);
  pinMode(LevKistLevo, OUTPUT);
  pinMode(LevKistPravo, OUTPUT);
  pinMode(PravKistLevo, OUTPUT);
  pinMode(PravKistPravo, OUTPUT);
  pinMode(LevKistShvat, OUTPUT);
  pinMode(PravKistShvat, OUTPUT);
  pinMode(22, INPUT_PULLUP); // Датчики
  pinMode(23, INPUT_PULLUP);
  pinMode(24, INPUT_PULLUP);
  pinMode(25, INPUT_PULLUP);
  pinMode(26, INPUT_PULLUP);
  pinMode(27, INPUT_PULLUP);
  pinMode(28, INPUT_PULLUP);
  pinMode(29, INPUT_PULLUP);
  pinMode(30, INPUT_PULLUP);
  pinMode(31, INPUT_PULLUP);
  pinMode(32, INPUT_PULLUP);
  pinMode(33, INPUT_PULLUP);
  pinMode(34, INPUT_PULLUP);
  pinMode(35, INPUT_PULLUP);
  pinMode(36, INPUT_PULLUP);
  pinMode(37, INPUT_PULLUP);
  
}
void loop() 
{
  if (Serial.available()) {
    val = Serial.read();
    if(val=='0') {PRG = 1;
      Serial.println("Возврат на базу");
      if(PRG == 1){sensorVal = digitalRead(22); //Исправить номер порта
      digitalWrite(Vverh,HIGH);
      digitalWrite(Vnyz,LOW);
      digitalWrite(Vlevo1,HIGH);
      digitalWrite(Vlevo2,HIGH);
      digitalWrite(Vpravo1,LOW);
      digitalWrite(Vpravo2,LOW);
      digitalWrite(LevRukaVpered,HIGH);
      digitalWrite(LevRukaNazad,LOW);
      digitalWrite(PravRukaVpered,HIGH);
      digitalWrite(PravRukaNazad,LOW);
      digitalWrite(LevKistLevo,HIGH);
      digitalWrite(LevKistPravo,HIGH);
      digitalWrite(PravKistLevo,HIGH);
      digitalWrite(PravKistPravo,HIGH);
      digitalWrite(LevKistShvat,HIGH);
      digitalWrite(Vverh,HIGH);
      digitalWrite(PravKistShvat,HIGH);
      if(sensorVal == HIGH){
      digitalWrite(Vverh,HIGH);
      digitalWrite(Vnyz,HIGH);
      digitalWrite(Vlevo1,HIGH);
      digitalWrite(Vlevo2,HIGH);
      digitalWrite(Vpravo1,HIGH);
      digitalWrite(Vpravo2,HIGH);
      digitalWrite(LevRukaVpered,HIGH);
      digitalWrite(LevRukaNazad,HIGH);
      digitalWrite(PravRukaVpered,HIGH);
      digitalWrite(PravRukaNazad,HIGH);
      digitalWrite(LevKistLevo,HIGH);
      digitalWrite(LevKistPravo,HIGH);
      digitalWrite(PravKistLevo,HIGH);
      digitalWrite(PravKistPravo,HIGH);
      digitalWrite(LevKistShvat,HIGH);
      digitalWrite(Vverh,HIGH);
      digitalWrite(PravKistShvat,HIGH);PRG=2;}}
     
    }
      else if (val == '1') {PRG = 1;
      Serial.println("Программа запущена");
      if(PRG == 1){sensorVal = digitalRead(22); //Исправить номер порта
      digitalWrite(Vlevo1,LOW);
      digitalWrite(Vlevo2,LOW);
      if(sensorVal == HIGH){
      digitalWrite(Vlevo1,HIGH);PRG=2;}}
      if(PRG == 2){sensorVal = digitalRead(22); //Исправить номер порта
      digitalWrite(LevRukaVpered,LOW);
      digitalWrite(PravRukaVpered,LOW);
      if(sensorVal == HIGH){
      digitalWrite(LevRukaVpered,HIGH);
      digitalWrite(PravRukaVpered,HIGH);PRG=3;}}
      if(PRG == 3){sensorVal = digitalRead(22); //Исправить номер порта 
      digitalWrite(Vnyz,LOW);
      if(sensorVal == HIGH){
      digitalWrite(Vnyz,HIGH);PRG=4;}}
      if(PRG == 4){sensorVal = digitalRead(22); //Исправить номер порта 
      digitalWrite(LevKistShvat,LOW);
      digitalWrite(PravKistShvat,LOW);
      if(sensorVal == HIGH){
      digitalWrite(Vlevo2,HIGH);PRG=5;}}
      if(PRG == 5){sensorVal = digitalRead(22); //Исправить номер порта 
      digitalWrite(Vverh,LOW);
      if(sensorVal == HIGH){
      digitalWrite(LevRukaNazad,LOW);PRG=6;}}
      if(PRG == 6){sensorVal = digitalRead(22); //Исправить номер порта
      digitalWrite(PravRukaNazad,LOW);
      if(sensorVal == HIGH){
      digitalWrite(LevRukaNazad,HIGH);
      digitalWrite(PravRukaNazad,HIGH);PRG=7;}}
      if(PRG == 7){sensorVal = digitalRead(22); //Исправить номер порта
      digitalWrite(Vpravo1,LOW);
      digitalWrite(Vpravo2,LOW);
      if(sensorVal == HIGH){
      digitalWrite(Vpravo1,HIGH);PRG=8;}}
      if(PRG == 8){sensorVal = digitalRead(22); //Исправить номер порта
      digitalWrite(LevRukaVpered,LOW);
      digitalWrite(PravRukaVpered,LOW);
      if(sensorVal == HIGH){
      digitalWrite(LevRukaVpered,HIGH);
      digitalWrite(PravRukaVpered,HIGH);PRG=9;}}
      if(PRG == 9){sensorVal = digitalRead(22); //Исправить номер порта
      digitalWrite(Vverh,HIGH);
      digitalWrite(Vnyz,LOW);
      if(sensorVal == HIGH){; 
      digitalWrite(Vnyz,HIGH);PRG=10;}}
      if(PRG == 10){sensorVal = digitalRead(22); //Исправить номер порта
      digitalWrite(LevKistShvat,HIGH);
      digitalWrite(PravKistShvat,HIGH);
      if(sensorVal == HIGH){;
      digitalWrite(Vverh,LOW);PRG=11;}}
      if(PRG == 11){sensorVal = digitalRead(22); //Исправить номер порта
      digitalWrite(Vverh,LOW);
      if(sensorVal == HIGH){;
      digitalWrite(LevRukaNazad,LOW);
      digitalWrite(PravRukaNazad,LOW);PRG=12;}}
      if(PRG == 12){sensorVal = digitalRead(22); //Исправить номер порта
      digitalWrite(LevRukaNazad,LOW);
      digitalWrite(PravRukaNazad,LOW);
      if(sensorVal == HIGH){;
      digitalWrite(Vverh,HIGH);
      digitalWrite(LevRukaNazad,HIGH);
      digitalWrite(PravRukaNazad,HIGH);
      digitalWrite(Vpravo2,HIGH);PRG=13;}}
      
      
     }
  }
}

Без нагрузки все работает шикарно. Но как только врубаешь нагрузку на клапана. То все, плата перезагружается и сходит с ума

Неактивний

#8 2017-05-27 21:40:49

goodspeedmen
Учасник
З https://discord.gg/6hbs98y
Зареєстрований: 2016-10-02
Повідомлень: 81

Re: Arduino mega и блок из 16 реле ничего не получается

DDRA = 11111111;
PORTA = 11111111;
DDRC = 11111111;
PORTC = 11111111;
Я предпочитаю так настраивать порты и внутренние резисторы.
Очевидно, что дело в питании, там и копайте, возможно китайцы где то ошиблись или "соплю" повесели neutral

Неактивний

#9 2017-05-27 21:43:02

Piman
Учасник
Зареєстрований: 2017-05-26
Повідомлень: 5

Re: Arduino mega и блок из 16 реле ничего не получается

goodspeedmen пише:

DDRA = 11111111;
PORTA = 11111111;
DDRC = 11111111;
PORTC = 11111111;
Я предпочитаю так настраивать порты и внутренние резисторы.
Очевидно, что дело в питании, там и копайте, возможно китайцы где то ошиблись или "соплю" повесели neutral

Вот будем там копать

Неактивний

#10 2017-06-01 10:14:53

Lic Control
Учасник
Зареєстрований: 2016-01-23
Повідомлень: 124

Re: Arduino mega и блок из 16 реле ничего не получается

Piman пише:

img
На скорую руку наваял схему. Может поможет

Эта плата релейных выходов должна быть с оптической развязкой входов. Если это так, то проверьте нет ли у вас объединения массы (земли) ARDUINO MEGA и блока питания 12В 1.5А. Если есть - разорвите эту связь. Эта связь может быть даже на плате релейных выходов в виде перемычки!
Ну и конечно, как советовали вам раньше, проверьте наличие электромагнитных помех - например, с помощью осциллографа посмотрите питание на ARDUINO MEGA, релейном блоке и форму напряжения на цифровых выходах. Везде должна быть ровная прямая без всплесков и провалов.

Еще Иван Николаев (02.09.2014) в своем отзыве о товаре пишет, что:
Качество сборки хорошее, но есть 2 минуса(которые не трудно исправить):
1) управление каналами минусовое - при питании от 5-ти вольт. Это не дает возможности использования в схемах с питанием 3,3в(на контролер прийдет 5в с платы реле) да и реле может при этом самопроизвольно включаться.
2) оптопары стоят непонятно для чего, т.к. не выполняют свою функцию - у них обе стороны подключены от одного источника 5в. И как раз они и выполняют роль лишнего инвертора.
Исправил это выпаиванием всех оптопар и впаиванием вместо них перемычки. Теперь входы напрямую идут на драйверы ULN2003 и работают как положено - 1(+) вкл\\ 0(-) выкл. Судя по всему братья китаязы ошиблись в схемотехнике. Все остальное сделано правильно.
Источник https://arduino-ua.com/prod248-16ti_kanalnii_modyl_rele_12V_10A

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

Остання редакція Lic Control (2017-06-01 10:41:17)

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму