Наводки или ошибка в коде?

eNOT

✩✩✩✩✩✩✩
11 Май 2020
20
0
Господа и снова здравствуйте. С помощью формумчан и Александра запилили код управления.
Суть устройства такова :

2 кнопки на пинах А2 и А3 управляют моторредуктором(подключен на готовую плату с l293d на борту), мотор редуктор по нажатию этих кнопок поворачивается то в одну сторону, то в другую.

4 кнопки на пинах D0, D1, D2, D3 поворачивают сервомашинку на углы 120, 0 , 40 и 80 градусов(серва находится на пине D9).

2 кнопки на пинах D5 и D6 поочередно переключают 4 реле ( реле подключены на пины 8,10,12,13 ) и есть режим когда все реле выключены.

Все кнопки подключены к земле и на всякий случай подтянуты к 5в , резюками аж на 360кОм (других под рукой не оказалось).

Проблема в том, что при нажатии на кнопку А3 почему-то активируется реле на 8 пине. Если продолжить нажимать кнопку на А3 , то видно , что на блоке реле еще очень очень тускло загорается лампочка с пина 10 . Когда нажимаю на А2 и мотор редуктор поворачивается в начальное положение , то реле на 8 пине опять активируется, когда моторчик остановился.

Кнопки распаяны на некой панеле, подключено все правда толстыми проводами(такое же сечение в БП ПК ).
Все питается от БП компа через две LM2596. Одна 10вольт подключена к шилду l293d и питает моторредуктор, другая 7,5в , питает ардуино уно через штекер. К лини 5в БП подключены серва и блок реле. Земли продублированы на всякий случай. Длинна каждого провода порядка 40-50см. Припаивал правда не к пинам ардуино, а к пинам шилда, дабы легко и непринужденно можно было снять саму дуню.

В данный момент распаял все , проверял неоднократно на наличие КЗ в местах пайки. Фирму проводов не скажу, т.к. это остатки с работы после подключения слаботочной части станков под управлением сименс, в оплетке 25 независимых жил.

Подскажите, это наводки или ошибка в коде?

Портянка кода:
#define PIN A2        // кнопка подключена сюда (PIN --- КНОПКА --- GND)
#define PIN A3        // кнопка подключена сюда (PIN --- КНОПКА --- GND)
#define PIN 0        // кнопка подключена сюда (PIN --- КНОПКА --- GND)
#define PIN 1        // кнопка подключена сюда (PIN --- КНОПКА --- GND)
#define PIN 2        // кнопка подключена сюда (PIN --- КНОПКА --- GND)
#define PIN 3        // кнопка подключена сюда (PIN --- КНОПКА --- GND)
#define PIN 6        // кнопка подключена сюда (PIN --- КНОПКА --- GND)
#define PIN 5        // кнопка подключена сюда (PIN --- КНОПКА --- GND)
#define MODE_AM 5    // количество режимов (от 0 до указанного)
#define POT A0       //центральный провод встроенного потенциометра, крайние подключены на GND и 5v

#include <GyverButton.h>   // подключаем библиотеку для кнопок
#include <Servo.h>       // подключаем библиотеку для сервы
#include <AFMotor.h>     // подключаем библиотеку для шилда

AF_DCMotor motor1(1);   // подключаем мотор к клеммникам M1
Servo servo1;           //добавляем серву пин 9
GButton button1(A2);   // кнопки серво 1 (А2) от 640 до 90
GButton button2(A3);   //кнопки серво 1 (А3) от 90 до 640
GButton button3(0);    // кнопки серво2 d0 = 120гр
GButton button4(1);   // кнопки серво2 d1 = 0гр
GButton button5(2);   // кнопки серво2 d2 = 40гр
GButton button6(3);   // кнопки серво2 d3 = 80гр
GButton button7(6);   // кнопки переключения реле убавить
GButton button8(5);   // кнопки переключения реле прибавить
int relay1 = 8;
int relay2 = 10;
int relay3 = 12;
int relay4 = 13; // пины реле

byte rel = 0;  // переменная режима реле

void setup()


{
  motor1.run(RELEASE);   // останавливаем мотор
  servo1.attach(9);  //определить порт сервы пин 9
  servo1.write(45); // определение пинов серво1 и серво2, указание начального угла

  pinMode(relay1, OUTPUT);
  pinMode(relay2, OUTPUT);
  pinMode(relay3, OUTPUT);
  pinMode(relay4, OUTPUT); // определение пинов реле, как выход

  digitalWrite(8, HIGH);
  digitalWrite(10, HIGH);
  digitalWrite(12, HIGH);
  digitalWrite(13, HIGH); // стартовое состояние реле. NO контакты разомкнуты
}

void loop()
{
  uint16_t val = 0;              // Переменная для считывания значения потенциометра
  static byte running = 0;       // Флаг, указывающий на то, что мотор в движении. static делает так, что переменная сохраняет свое значение каждый оборот loop
  static byte speed = 0;

  if (running == 0)
  {                           // Блокируем кнопки, пока мотор в движении
    button1.tick();
    button2.tick();
  }

  button3.tick();
  button4.tick();
  button5.tick();
  button6.tick();
  button7.tick();
  button8.tick();// опрос кнопок

 

//Управление моторредуктором

  if (running > 0) {// если флаг указывает на то, что мотор должен двигаться в направлении 1 или 2, 1 = вперед, 2 = назад.
  val = analogRead(POT);  // считывание показаний потенциометра обратной связи моторредуктора
  }

if (button1.isClick()) { // Если был клик по кнопке 1
    motor1.run(FORWARD);  // задаем движение вперед
    running = 1;
  }

  if (button2.isClick()) {    // Если был клик по кнопке 2
    motor1.run(BACKWARD);  // задаем движение назад
    running = 2;
   }

  if (running > 0 and speed < 255) {   // стоит флаг, что мы в движении, медленно разганяем мотор. пока не достигли значения 255, увеличиваем скорость на 1
    speed++;
    motor1.setSpeed(speed);    // устанавливаем скорость мотора
    delay(2);                 // пока мотор будет разганятся, loop будет подтормаживаться на время разгона, Это 255*delay ~ 0.5сек.
  }

  if ((val >= 620 and val <= 630) and running == 2) {
                    // если достигли одного или другого крайнего положения (слишком точное значение ставить не стоит
                    // легко проскочить). Тут можно свои значения поставить. Мапить к 255 не стоит, точность позиции падает
    running = 0;   // приехали, сбрасываем флаг, соответственно кнопки разблокируются, потенциометр не читается.
    speed = 0;
    motor1.run(RELEASE); // остановка мотора
  }

  if ((val >= 90 and val <= 100) and running == 1) {
                   // если достигли одного или другого крайнего положения (слишком точное значение ставить не стоит
                  // легко проскочить). Тут можно свои значения поставить. Мапить к 255 не стоит, точность позиции падает
    running = 0;  // приехали, сбрасываем флаг, соответственно кнопки разблокируются, потенциометр не читается.
    speed = 0;
    motor1.run(RELEASE); // остановка мотора
  }


//нажатие кнопкок управления SERVO 1

  //нажатие кнопки 3
  if (button3.isPress())
  {
    servo1.write(120); // поворот серво1
  }

  //нажатие кнопки 4
  if (button4.isPress())
  {
    servo1.write(0); // поворот серво1
  }

  //нажатие кнопки 5
  if (button5.isPress())
  {
    servo1.write(40); // поворот серво1
  }
 
  //нажатие кнопки 6
  if (button6.isPress())
  {
    servo1.write(80); // поворот серво1
  }


//отработка переключений режимов реле

  //нажатие кнопки 7

  if (button7.isPress())
  {
    if (--rel >= MODE_AM) rel = 0;
    switchTask();
  }

  //нажатие кнопки 8
  if (button8.isPress())
  {
    if (++rel >= MODE_AM) rel = 5;
    switchTask();
  }
}
  void switchTask()
  {
    switch (rel)
    {
      case 0: task_0();
        break;
      case 1: task_1();
        break;
      case 2: task_2();
        break;
      case 3: task_3();
        break;
      case 4: task_4();
        break;
    }
  }

// Переключение реле
void task_0()
{
  digitalWrite(8, HIGH);
  digitalWrite(10, HIGH);
  digitalWrite(12, HIGH);
  digitalWrite(13, HIGH);
}
void task_1()
{
  digitalWrite(8, LOW);
  digitalWrite(10, HIGH);
  digitalWrite(12, HIGH);
  digitalWrite(13, HIGH);
}
void task_2()
{
  digitalWrite(8, HIGH);
  digitalWrite(10, LOW);
  digitalWrite(12, HIGH);
  digitalWrite(13, HIGH);
}
void task_3()
{
  digitalWrite(8, HIGH);
  digitalWrite(10, HIGH);
  digitalWrite(12, LOW);
  digitalWrite(13, HIGH);
}
void task_4()
{
  digitalWrite(8, HIGH);
  digitalWrite(10, HIGH);
  digitalWrite(12, HIGH);
  digitalWrite(13, LOW);
}
 

Вложения

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,301
Москва
Вот это что?
#define PIN A2 // кнопка подключена сюда (PIN --- КНОПКА --- GND)
#define PIN A3 // кнопка подключена сюда (PIN --- КНОПКА --- GND)
#define PIN 0 // кнопка подключена сюда (PIN --- КНОПКА --- GND)
#define PIN 1 // кнопка подключена сюда (PIN --- КНОПКА --- GND)
#define PIN 2 // кнопка подключена сюда (PIN --- КНОПКА --- GND)
#define PIN 3 // кнопка подключена сюда (PIN --- КНОПКА --- GND)
#define PIN 6 // кнопка подключена сюда (PIN --- КНОПКА --- GND)
#define PIN 5

А! Вижу, это вообще не используется :D

у тебя под ОДНИМ именем PIN все пины описаны ? или там что то пропало ?

Ну и еще:
по моему не совсем верно блокировать тики кнопок 1 и 2. Пусть они крутятся. А блокировать надо вот эту часть
if (button1.isClick()) { // Если был клик по кнопке 1
motor1.run(FORWARD); // задаем движение вперед
running = 1;
}
ну и со второй частью тоже. Или же блокировать и тики и действия этих кнопок, что будет совсем верном
опять же у тебя куча условий
if (running ...)
тогда весь код можно было бы сделать
if (running ==0)
{
тут все действия если мотор не запущен
}
else
{
тут все если запущен.
}


Дальше что не очень понятно
батоны с 3-ей по 8-ую проверяются на условие
button N .isPress()
isPress активно когда кнопка нажата и удерживается. И ни кликов, ни даблкиков на них не висят. Так зачем такая роскошь как лишние батоны ? просто читать if (digitalRead(0)) и все.


ОБНОВЛЕНО
Не разбирая схемы закачай этот код.
Это просто чтение всех портов , цифровых от 2 до 13 и аналоговых от А1 до А5
( 0 и 1 оставил для сериала)
Если схема грамотная, то используемые порты будут стабильно держать 0
Остальные могут менять значения на 1 хаотично. Нажимая кнопки посмотри есть ли зависимость от 8 порта от А3 кнопки.
проверка портов:
void setup() {
  for (int i = 2; i < 14; i++) pinMode(i, OUTPUT);

  for (int i = A0; i < A6; i++) pinMode(i, OUTPUT);
  Serial.begin(115200);

}


void loop() {
  for (int i = 2; i < 14; i++) Serial.print(digitalRead(i));
  for (int i = A0; i < A6; i++) Serial.print(digitalRead(i));
  Serial.println();

}
 
Изменено:
  • Лойс +1
Реакции: eNOT

eNOT

✩✩✩✩✩✩✩
11 Май 2020
20
0
@Старик Похабыч, За проверочный скетч спасибо. Позже перепаяю еще раз схему.

По поводу isPress Вы правы, этот код скачал из черновика, в прошивку заливал isClick на каждую кнопку.
А вот по поводу if(running) я прокоментировать этот момент не могу, т.к эту часть кода предложил один из жителей форума. У меня изначально было просто ,как в примерах


Код:
void loop()

{

  button1.tick();

  button2.tick();

  val = analogRead(POT);           // Читаем значения с потенциометра

  val = map(val, 0, 1023, 0, 255); // диапазон значений от 0 до 255



  Serial.println(val); // вывод значений в порт





  if (Button1.isClick())

  {

    motor1.run(FORWARD);  // задаем движение вперед

    motor1.setSpeed(255);   // задаем скорость движения



delay (6000); // 6 секунд от крайнего до крайнего положения при 10в на моторе

    motor1.run(RELEASE); // остановка мотора

  }



  if (button2.isClick())

  {

    motor1.run(BACKWARD);  // задаем движение вперед

    motor1.setSpeed(255);   // задаем скорость движения



delay (6000); // 6 секунд от крайнего до крайнего положения при 10в на моторе

    motor1.run(RELEASE); // остановка мотора

  }

}
я искренне руками и ногами "ЗА" модернизацию и упрощение кода и чтоб жрал он поменьше ресурсов, тк в последующем будет еще 1602 и ds18b20 в прошивке. Но сам я в этом деле еще зеленый новичок
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,301
Москва
Перепаивать схему не надо! надо залить и при подключенном шнуре посмотреть..

А какой смысл вкладывать не актуальный скетч ? дьявол кроется в деталях, надо смотреть актуальный код. Может тут проблемы нет, а там есть ?
 

eNOT

✩✩✩✩✩✩✩
11 Май 2020
20
0
@Старик Похабыч, все уже отпаяно, косы проводов распущены, буду собирать еще раз с особой внимательностью и тестить. Скажите по опыту, могут ли это быть наводки?
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,301
Москва
Могут. При макетировании наливатора и изменении значений (аналоговых) на 3-4 аналоговых пинах (кажется) получал изменения на 6-ом и 7-ом. Или наоборот. Помогала подтяжка резисторм 6-го и 7-го пина. Кажется да, они глючили.
 
  • Лойс +1
Реакции: eNOT

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
2,409
976
58
Марий-Эл
резюками аж на 360кОм (других под рукой не оказалось).
Не более 10 ком. Остальное бесполезно.
Внутреннюю подтяжку встроенную в контроллер лучше не использовать. Там резисторы 20-50 КОм. Или использовать параллельно с внешней.
Всем гусарам прошу заткнуться и не орать "Гайвер же делал".
 
  • Лойс +1
Реакции: eNOT

Arhat109

★★★★✩✩✩
9 Июн 2019
473
203
@Эдуард Анисимов, глючить наводками может "запросто". Конкретно неделю взад бился с АЦП Пульсоксиметра. При засовывании пальца в зону измерений прет 50гц .. "как из шланга при поливе" .. оказалось, что "пимпочки" фоторезистора, что у китайцев на лицевой стороне фоток явно залиты прозрачным клеем .. фигу! Имеют прямой контакт, при приконсновении к ним!

Долго не мог понять откуда прет наводка при .. питании от батареек.
 

Arhat109

★★★★✩✩✩
9 Июн 2019
473
203
@Эдуард Анисимов, должна быть определенная "культура" разводки и соединений. Надо иметь "опыт", который кроме как наработать, больше никак. Далеко не всякая свитая кучка проводов .. "экранирована". Тем более, если там рядом "станок с двиглом". Ещё поди и коллекторным.
 

eNOT

✩✩✩✩✩✩✩
11 Май 2020
20
0
@Старик Похабыч, Товарищ Похабыч, приветствую Вас. В общем перепаял все с моторшилда прямо на уню новыми кабелями от оптических датчиков SICK, проверил все на кз и отработку кнопок в различных скетчах. Проблема осталась .
Если подключаю либу ATFMotorShield (1 DC мотор на пине М1 из описания шилда становится ясно, что он занимает: пин 4-направление вращения, пин 11- скорость). Соответственно эти пины не задействовал. Каналы реле подлкючены к пинам 0,1,2,3. Питание от одного бп пк , но через два понижающих DC (1 на ардуино, 1 на на шилд), 5в с бп пк на питание реле.
В общем , если либа подключена, то срабатывает реле 1,2 сразу при подачи питания(пины 0,1). Если отключаю питание то эти пины еще какое-то время звонятся на землю. Если удаляю библиотеку и соответственно все, что связано с мотором из кода, то глюков нет.


У меня ряд предположений:
наводки от мотора.
глюк библиотеки.
проблема самого моторшилда.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,301
Москва
Шилды они такие.. у меня был скетч для пульта РУ, все работало, я решил добавить ему мобильности и поставил шилд с акб. И все... одна ось потенциометра отвалилась. Выяснил, что шилд использует этот пин для своих каких то целей, то ли определяет заряд батарейки, то ли еще что то. пришлось скетч чуть исправить.
Так что посмотри документы на шилд, может он что то еще использует кроме очевидного.
 
  • Лойс +1
Реакции: eNOT

Arhat109

★★★★✩✩✩
9 Июн 2019
473
203
1. Пины 0 и 1 это UART0 их вообще в схеме лучше не задействовать. По ним идет опрос USB преобразователя на предмет заливки скетча при включении. И вообще, они пользуются в процессе перепрошивки из Ардуино ИДЕ.

2. Вопрос ребром: DC-мотор имеет конденсатор промеж своих М+ и М-? Если нет - припаяйте 100-300нф с напряжением пробоя в 3-5 раз выше напряжений на моторе. Коллектор мотора является просто изумительным источником разного рода помех вплоть до ТВ диапазона. Ещё лучше 3шт: между контактами и с каждого из них на корпус мотора, если он железный.
 
  • Лойс +1
Реакции: eNOT

eNOT

✩✩✩✩✩✩✩
11 Май 2020
20
0
@Arhat109, конденсатора нет, припаяю. Про пины 0,1 я в курсе, просто жду когда мега приедет, а портов люто не хватает.Сейчас ради интереса проверил вот что:


Вставляю стандартный скетч из примера для работы моторшилда этого. Реле срабатывает.
Отрубаю мотор с клеммы м1 -> даю питание -> реле срабатывает.
Отрубаю полностью питание шилда(он не втставлен на уно , а просто лежит рядом все это время) -> реле срабатывает.

подключаю все назад -> удаляю из скетча библиотеку и упоминание о моторе -> реле не срабатывает =))) Мистика блин.

Делаю вывод,что проблема все-таки в библиотеке...
 
Изменено:

Arhat109

★★★★✩✩✩
9 Июн 2019
473
203
Скорее всего какая-то накладка с кодом. Смотри библиотеку и как оно взаимодействует с твоим кодом. Тут присоединюсь. А конденсатор таки припаяй. Без него от коллекторных DC-моторов даже у телевизеров "в глазах рябит".. ;)
 
  • Лойс +1
Реакции: eNOT

eNOT

✩✩✩✩✩✩✩
11 Май 2020
20
0
@Старик Похабыч, @Arhat109, ооо нет, рытье в библиотеке это явно не мое, мне бы простенький код освоить для начала. Раз конфликт по портам 0 и 1 то подожду приезда меги и перекину все туда
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,301
Москва
Когда мне надо было сделать запись на ЕЕПРОМ для глой тиньки85 меня не устраивало , что буфер для нее ограничен 16-ю байтами в библиотеке тиннивайр, залез туда и переправил 16 на 32 и все стало хоекй. Глаза бояться, а руки делают, до приезда меги можешь вполне попробовать поискать
 
  • Лойс +1
Реакции: jaguarov, eNOT и Arhat109