#1 Re: Апаратні питання » Arduino mega и блок из 16 реле ничего не получается » 2017-05-27 21:43:02

goodspeedmen пише:

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

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

#2 Re: Апаратні питання » Arduino mega и блок из 16 реле ничего не получается » 2017-05-27 19:26:31

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;}}
      
      
     }
  }
}

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

#5 Апаратні питання » Arduino mega и блок из 16 реле ничего не получается » 2017-05-26 21:20:25

Piman
відповідей: 9

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

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

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