PCA9685 + UNO

eNOT

✩✩✩✩✩✩✩
11 Май 2020
20
0
Добрый день. На уно не хватает портов для кнопок и переферии, что лучше купить сразу МЕГУ(но там большая часть портов будет простаивать, да и скетч не особо увесестый) ,либо же добавить PCA9685 к уже имеющейся дуне и использовать ардер отличный от lcd 1602 i2c ??? Либо же повесить светодиод на тот же цифровой пин, что и кнопка, чтоб тот загорался, только если кнопка нажата?
 
Изменено:

PiratFox

★★★★★✩✩
13 Фев 2020
1,706
474
@eNOT, а сколько портов у вас не хватает? Схему бы посмотреть, чего вы там делать хотите, тогда и подсказать можно...
 
  • Лойс +1
Реакции: eNOT

PiratFox

★★★★★✩✩
13 Фев 2020
1,706
474
@Wan-Derer, да если это для опроса кнопок - так там быстродействие по барабану. Я же говорю, схему нужно смотреть. Может, там матрицу можно организовать. Минимум портов - максимум кнопок.
 
Изменено:
  • Лойс +1
Реакции: eNOT

eNOT

✩✩✩✩✩✩✩
11 Май 2020
20
0
Моторшилд L293D, использует порты 4,9,11 для управления моторредуктором и сервой. именно его распиновку в не нашел в проге, да и слишком габаритная она бы получилась. Не хватает порядка 6 портов для светодиодов
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,706
474
@eNOT, из того, что вы показали - так у вас на каждую кнопку задействован отдельный порт. Слишком расточительно для опроса кнопок. Я бы решил вот так:
 

Вложения

PiratFox

★★★★★✩✩
13 Фев 2020
1,706
474
Опять же, вам нужна индикация каждой нажатой кнопки светодиодом? Или в цифру можно вывести?
 

eNOT

✩✩✩✩✩✩✩
11 Май 2020
20
0
@PiratFox, Благодарю Вас за ответы в теме,но если честно, я не сильно понимаю в чем разница. Дело в том, что есть тактовые NO кнопки со встроенными светодиодами, и хотелось бы, чтоб эти диоды загорались, если нажата кнопка. (Например 4 кнопки отвечают за поворот сервы на определенный угол, нажал кнопку1-серва повернулась на 30 градусов, нажал кнопку 3, повернулась на 90, нажал 2 повернулась на 60, 4ая -на 120 градусов, светодиод должен гореть пока серва повернута на тот или иной градус .).
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,706
474
Не совсем понятно, чего вы хотите. Вам нужно моргание светодиодиками, или рабочее устройство? Определитесь уже, чего вы хотите! Ежели не ясно с матрицей кнопок - так поможем в написании функции(подпрограммы) для этого дела. Чего вам тут не ясно, определитесь уже... А вообще ваша схема реализуется на NANO, той же UNO.
 

eNOT

✩✩✩✩✩✩✩
11 Май 2020
20
0
Я определился, просто выразился неправильно и от сюда недопонимание. Итак: есть 4 кнопки со встроенными светодиодами, есть серво привод с запрограммированными 4мя положениями. Нажатие одной из кнопок поворачивает сервы на запрограммированный угол. Требуется следующее:
нажали на кнопку 1-загорается светодиод в этой кнопке и серва поворачивается на заданный угол. нажали кнопку 2 - светодиод первой (или любой другой нажатой ранее) гаснет , зажигается светодиод кнопки2 и серва поворачивается на опять же запрограммированный угол.
Вскетче это выглядит так :
Строки кода этих кнопок выделил:

Код:
#define PIN 0        // кнопка подключена сюда (PIN --- КНОПКА --- GND)

#define PIN 1        // кнопка подключена сюда (PIN --- КНОПКА --- GND)

#define PIN 7        // кнопка подключена сюда (PIN --- КНОПКА --- GND)

#define PIN 6        // кнопка подключена сюда (PIN --- КНОПКА --- GND)

#define PIN 14        // кнопка подключена сюда (PIN --- КНОПКА --- GND)

#define PIN 15        // кнопка подключена сюда (PIN --- КНОПКА --- GND)

#define PIN 16        // кнопка подключена сюда (PIN --- КНОПКА --- GND)

#define PIN 17        // кнопка подключена сюда (PIN --- КНОПКА --- GND)

#define MODE_AM 5    // количество режимов (от 0 до указанного)

#include <GyverButton.h> //библиотека кнопок

#include <Servo.h>  //библиотека серво





Servo servo1;

Servo servo2;                 //добавляем сервы

GButton button1(14);

GButton button2(15);

GButton button3(16);

GButton button4(17);// кнопки серво 1 (А0-А3)

GButton button5(0);

GButton button6(1); // кнопки серво2

GButton button7(6);

GButton button8(7); // кнопки переключения реле



int relay1 = 2;

int relay2 = 3;

int relay3 = 5;

int relay4 = 4; // пины реле



byte Mode = 0; // переменная положения серво2

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



void setup()



{

  servo1.attach(9);

  servo1.write(45);

  servo2.attach(8);

  servo2.write(45); // определение пинов серво1 и серво2, указание начального угла



  pinMode(relay1, OUTPUT);

  pinMode(relay2, OUTPUT);

  pinMode(relay3, OUTPUT);

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



  digitalWrite(2, HIGH);

  digitalWrite(3, HIGH);

  digitalWrite(5, HIGH);

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

}



void loop()

{

  button1.tick();

  button2.tick();

  button3.tick();

  button4.tick();

  button5.tick();

  button6.tick();

  button7.tick();

  button8.tick();// опрос кнопок постоянный







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

  if (button1.isPress())

  {

    servo1.write(120); // поворот серво1 на 120

  }





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

  if (button2.isPress())

  {

    servo1.write(0); // поворот серво1 на 0

  }





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

  if (button3.isPress())

  {

    servo1.write(30); // поворот серво1 на 30

  }





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

  if (button4.isPress())

  {

    servo1.write(60); // поворот серво1 на 60

  }





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

  if (button5.isPress())

  {

    Mode++;

    if (Mode > 2) Mode = 2; // поворот серво 2 в одном направлении на 2 шага

    servo2.write(Mode * 45); // угол поворота серво2 при нажатии кнопки

  }







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

  if (button6.isPress())

  {

    Mode--;

    if (Mode > 2) Mode = 0;// поворот серво 2 в обратном направлении на 2 шага

    servo2.write(Mode * 45); // угол поворота серво2 при нажатии кнопки

  }





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



  if (button7.isPress()) //кнопка выбора режима реле

  {

    if (--rel >= MODE_AM) rel = 0; //декремент режима

    switchTask(); //переключение

  }



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

  if (button8.isPress()) //кнопка выбора режима реле

  {

    if (++rel >= MODE_AM) rel = 5; //инкремент режима , количество режимов =5 , включая режим all off

    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(2, HIGH);

  digitalWrite(3, HIGH);

  digitalWrite(5, HIGH);

  digitalWrite(4, HIGH);

}

void task_1()

{

  digitalWrite(2, LOW);

  digitalWrite(3, HIGH);

  digitalWrite(5, HIGH);

  digitalWrite(4, HIGH);

}

void task_2()

{

  digitalWrite(2, HIGH);

  digitalWrite(3, LOW);

  digitalWrite(5, HIGH);

  digitalWrite(4, HIGH);

}

void task_3()

{

  digitalWrite(2, HIGH);

  digitalWrite(3, HIGH);

  digitalWrite(5, LOW);

  digitalWrite(4, HIGH);

}

void task_4()

{

  digitalWrite(2, HIGH);

  digitalWrite(3, HIGH);

  digitalWrite(5, HIGH);

  digitalWrite(4, LOW);

}
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,706
474
В скетче кнопок я вижу 8. Соответственно 8 портов. И где тут 4, как вы говорите? Примените выше нарисованную схему - так будет 6 портов вместо 8 на 8 кнопок, а добавите ещё один ряд - так ещё +4 кнопки на один порт. Вопрос только в том, что эту матрицу опрашивать нужно. Так это и не сложно.
 
Изменено:

PiratFox

★★★★★✩✩
13 Фев 2020
1,706
474
Так же точно для светодиодов можно применить матрицу. Засвечивать по одному при опросе строк.
 

eNOT

✩✩✩✩✩✩✩
11 Май 2020
20
0
Спасибо за ответы и советы, но все же вопрос звучал несколько иначе. Можно ли подцепить светодиод на тот же пин, что и кнопку и можно ли повесить светодиоды на плату расширения портов PCA9685 . Про использование кнопок с резистивным делителем наслышан. Про сдвиговый регистр тоже.
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,706
474
@eNOT, светодиод повесить на кнопку нельзя! Рискуете сжечь процессор, когда светодиод светиться будет, т.е. когда активная "1" на выходе будет. А вообще попробуйте, может, желающих тогда меньше будет делать так. Отпишитесь по результатам. ;)
 

Arhat109

★★★★✩✩✩
9 Июн 2019
473
203
@PiratFox, Чего это так категорично-то?

Все можно, если осторожно .. ;)

Подключаем светодиод к +5в анодом. К катоду ставим резистор с током ограничения 1-5мА. Светодиод гореть будет .. не ярко, но все же. Второй конец резистора отводим на пин и верх кнопки. Нижний конец кнопки садим на землю.

Сверху-вниз от +5в до земли: светодиод - резистор - кнопка. Входной пин - точка соединения "резистор-кнопка".

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

PiratFox

★★★★★✩✩
13 Фев 2020
1,706
474
@Arhat109, месье знает толк в извращениях. Можно и так, но это не для новичков. Примерно оно?
 

Вложения

Изменено:

kalobyte

★★★✩✩✩✩
1 Янв 2020
724
148
светодиоды и реле можно повесить на 2 595 регистра, они дешевле стоят
 

eNOT

✩✩✩✩✩✩✩
11 Май 2020
20
0
@kalobyte, регистры есть , хотел их оставить на крайний случай, если не найду другого выхода.
 

kalobyte

★★★✩✩✩✩
1 Янв 2020
724
148
почему на крайний? они для этого и используются
у меня вон валяется ящик от плк сименс, так там все светодиоды сделаны на регистрах и релешки тоже
может быть и входы тоже, но я уже не помню

есть еще мелкасхема тм1638 что ли или 37, на днях тут рекомендовал ее
там светодиоды и кнопки можно сделать, защита от дребезга и всего 3 провода надо
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,706
474
@kalobyte, вы точно говорите про это: 74HC595? Там же получится по даташиту 20mA на всю мелкосхему. Так это же критический режим для этой штуки! На все выходы. Берём по 5mA на светодиод, так получается 4 штуки. И это в напряжённом(критическом) режиме. Ну 5, ежели ток завалить. Или я не тот даташит читаю? Может, много тока беру на один светодиод, так они у меня при меньшем не светятся при достаточной яркости. Вопрос только, когда сдохнет эта схема...
 
Изменено: