Відповісти

Введіть повідомлення і натисніть Надіслати
Параметри

Назад

Огляд теми (нові повідомленні вгорі)

seri0shka
2017-02-24 21:14:17

Сделал блок для управления нагрузками по одному проводу (на самом деле по двум, конечно, но при этом только один сигнальный и, соответственно, используется один пин ардуинки). Изначально блок проектировался для управления релюшками в количестве до 16 штук, но на картинке для простоты и наглядности два семисегментных индикатора. Разработано на основе статей "Управляем индикатором TIC по одному проводу", "Управление семисегментными индикаторами по одному проводу" и видео с ютуба "Управление сдвиговым регистром по одному проводу". Принцип работы подробно расписан в указанных статьях, остальное должно быть понятно из схемы и циклограмм на рисунке. В отличие от вариантов из статей, блок позволяет полноценно передавать 16 бит информации, в моём случае каждый бит означает включенное или выключенное состояние реле. Изменён вариант подключения защёлки регистра, применение SN74HC125 позволяет обойтись без диода между выходом буфера и конденсатором С2 (при высоком уровне на входе Е буфера выход буфера находится в высокоимпедансном состоянии и конденсатор постепенно заряжается через резистор R2, при низком уровне на входах Е и D буфера на выходе О тоже низкий уровень, что приводит к почти мгновенному разряду конденсатора С2). Возможно применение любых других повторителей (буферов) или по два последовательно соединённых инвертора (хоть 155ла3), но тогда между выходом микросхемы и конденсатора С2 нужно ставить диод- на схеме под цифрой 4 в кружочке, анодом к конденсатору. Номиналы резисторов и конденсаторов в моём варианте: R1=1ком, C1=0,1мкф, R2=4,7ком, C2=0,33мкф. На циклограмме t1- время записи единицы в регистр, при указанных номиналах я поставил 30 мкс, t0- время записи нуля в регистр, у меня 130 мкс, tр- пауза между битами, в скетче такая же, как и t0. Временые параметры можно изменить при других номиналах конденсаторов и резисторов, я подбирал экспериментально оптимальные для таких номиналов, как на схеме. При большом расстоянии от ардуины до приёмного блока возможно влияние помех, но так как информация в регистр перезаписывается каждый цикл отработки скетча, то одиночные помехи не оказывают значительного влияния на состояние реле на выходах или показания индикаторов.  Тех, кто попробует схему в действии, прошу написать про результаты работы, в частности про используемые в вашем варианте номиналы и временные параметры. Их можно менять в широких пределах. Также принимаются предложения по изменению скетча, если переписать его на СИ, можно значительно ускорить, но я ещё далёк от такого уровня. Отвечу на конструктивные вопросы, глупых прошу не задавать.

595-03.jpg


bool in01=1;//любые нужные переменные для вывода
bool in02=0;
bool in03=1;
bool in04=1;
bool in05=0;
bool in06=0;
bool in07=1;
bool in08=1;
bool in09=1;
bool in10=1;
bool in11=0;
bool in12=0;
bool in13=0;
bool in14=0;
bool in15=1;
bool in16=1;
int OUT = 5;//пин для вывода

void setup() {
  pinMode(OUT, OUTPUT);
}

void loop() {
  int x = 130;//t0- время записи нуля в регистр, и такое же время для tр- паузы между битами
  int y = 30;//t1- время записи единицы в регистр 

  digitalWrite(OUT, 0);
  if ( in01 == 0)delayMicroseconds(x);
  delayMicroseconds(y);
  digitalWrite(OUT, 1);
  delayMicroseconds(x);

  digitalWrite(OUT, 0);
  if (in02 == 0)delayMicroseconds(x);
  delayMicroseconds(y);
  digitalWrite(OUT, 1);
  delayMicroseconds(x);

  digitalWrite(OUT, 0);
  if (in03 == 0)delayMicroseconds(x);
  delayMicroseconds(y);
  digitalWrite(OUT, 1);
  delayMicroseconds(x);

  digitalWrite(OUT, 0);
  if (in04 == 0)delayMicroseconds(x);
  delayMicroseconds(y);
  digitalWrite(OUT, 1);
  delayMicroseconds(x);

  digitalWrite(OUT, 0);
  if (in05 == 0)delayMicroseconds(x);
  delayMicroseconds(y);
  digitalWrite(OUT, 1);
  delayMicroseconds(x);

  digitalWrite(OUT, 0);
  if (in06 == 0)delayMicroseconds(x);
  delayMicroseconds(y);
  digitalWrite(OUT, 1);
  delayMicroseconds(x);

  digitalWrite(OUT, 0);
  if (in07 == 0)delayMicroseconds(x);
  delayMicroseconds(y);
  digitalWrite(OUT, 1);
  delayMicroseconds(x);

  digitalWrite(OUT, 0);
  if (in08 == 0)delayMicroseconds(x);
  delayMicroseconds(y);
  digitalWrite(OUT, 1);
  delayMicroseconds(x);

  digitalWrite(OUT, 0);
  if (in09 == 0)delayMicroseconds(x);
  delayMicroseconds(y);
  digitalWrite(OUT, 1);
  delayMicroseconds(x);

  digitalWrite(OUT, 0);
  if (in10 == 0)delayMicroseconds(x);
  delayMicroseconds(y);
  digitalWrite(OUT, 1);
  delayMicroseconds(x);

  digitalWrite(OUT, 0);
  if (in11 == 0)delayMicroseconds(x);
  delayMicroseconds(y);
  digitalWrite(OUT, 1);
  delayMicroseconds(x);

  digitalWrite(OUT, 0);
  if (in12 == 0)delayMicroseconds(x);
  delayMicroseconds(y);
  digitalWrite(OUT, 1);
  delayMicroseconds(x);

  digitalWrite(OUT, 0);
  if (in13 == 0)delayMicroseconds(x);
  delayMicroseconds(y);
  digitalWrite(OUT, 1);
  delayMicroseconds(x);

  digitalWrite(OUT, 0);
  if (in14 == 0)delayMicroseconds(x);
  delayMicroseconds(y);
  digitalWrite(OUT, 1);
  delayMicroseconds(x);

  digitalWrite(OUT, 0);
  if (in15 == 0)delayMicroseconds(x);
  delayMicroseconds(y);
  digitalWrite(OUT, 1);
  delayMicroseconds(x);

  digitalWrite(OUT, 0);
  if (in16 == 0)delayMicroseconds(x);
  delayMicroseconds(y);
  digitalWrite(OUT, 1);
  delayMicroseconds(x);

  delay(40);//пауза до перезаписи
}

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