Ви не увійшли.
УВ Ардуинщики. Не бросайте в беде. Я уже не знаю куда обратиться.
У нас задача. Сделать компьютеризированное управление советским пневмороботом. Для этого был куплен микроконтроллер arduino mega и блок из 16 реле(специально для ардуино). В работе задействовано 14 из 16 реле.
Сам микроконтроллер запитан через USB порт компьютера
Блок реле запитан от блока питания 12В 1.5А
Питание электропневмоклапанов 27В.
Я загружаю программу на микроконтроллер, и с помощью него управляю релюшками к которым подключены элекропневмоклапана робота.
Но неожиданно происходит дичь!!!
В общем. Без подачи напряжения на контакты реле, все работает прекрасно. Все прекрасно щелкает при подачи команды на микроконтроллер. Но как только я врубаю напругу 27В на электропневмоклапана, плата начинает сходить с ума, тупо перезагружается и я теряю управление над микроконтроллером.
Если нужно что то выпаять, или наоборот припаять я готов. Просто уже не знаю что делать.
Остання редакція Piman (2017-05-26 22:27:24)
Неактивний
Мега здесь вовсе не нужна была, достаточно и нано было. На сколько я знаю эти реле управляются низким уровнем. Ну и наконец вы хоть бы код выложили, а что так гадать то...
Неактивний
Проверьте цепь между силовыми выводами реле и входами в плату, также если земля общая то возможно могут быть помехи от ЭДС самоиндукции клапанов.
Неактивний
Мега здесь вовсе не нужна была, достаточно и нано было. На сколько я знаю эти реле управляются низким уровнем. Ну и наконец вы хоть бы код выложили, а что так гадать то...
Ну как то так у меня получилось. Управление при нажатии клавиши
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;}}
}
}
}
Без нагрузки все работает шикарно. Но как только врубаешь нагрузку на клапана. То все, плата перезагружается и сходит с ума
Неактивний
DDRA = 11111111;
PORTA = 11111111;
DDRC = 11111111;
PORTC = 11111111;
Я предпочитаю так настраивать порты и внутренние резисторы.
Очевидно, что дело в питании, там и копайте, возможно китайцы где то ошиблись или "соплю" повесели
Неактивний
DDRA = 11111111;
PORTA = 11111111;
DDRC = 11111111;
PORTC = 11111111;
Я предпочитаю так настраивать порты и внутренние резисторы.
Очевидно, что дело в питании, там и копайте, возможно китайцы где то ошиблись или "соплю" повесели
Вот будем там копать
Неактивний
На скорую руку наваял схему. Может поможет
Эта плата релейных выходов должна быть с оптической развязкой входов. Если это так, то проверьте нет ли у вас объединения массы (земли) 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)
Неактивний