Господа и снова здравствуйте. С помощью формумчан и Александра запилили код управления.
Суть устройства такова :
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 независимых жил.
Подскажите, это наводки или ошибка в коде?
Суть устройства такова :
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);
}
Вложения
-
244.5 KB Просмотры: 7