Без оптрона работает, с оптроном нет...

Dr_grizzly
Dr_grizzly аватар
Offline
Зарегистрирован: 07.12.2015

Всем привет! Вчера собрал схемку 

На портах ардуины Uno пишу - pinMode(8,INPUT), digitalWrite(8,HIGH) - на ноге появляется +5в. Оптрон сажает его на землю при появлении сигнала от датчика. Датчик пока +5В. В дальнейшем перемычкой планирую выбор +5, +24  чтобы менялся резистор через который протекает ток на фотодиод. 

Вообщем картина такая - мультитестером проверяю питание на ноге 8 к оптрону - +5в. Подаю сигнал на на оптрон - питание пропадает. Т.е вроде как все работает. Но в программе при чтении порта 8 if (digitalRead(8)==LOW) - срабатывает. Но алгоритм не хочет читать дальше ноги 9,10,11. Как будто на них не приходит сигнала. Хотя электрически показывает 0 на ногах при сигнале. Что-то со схемой не так??? 

Убираю схему, тыкаю все на прямую в плату Арду(т.к. +5 везде), меняю состояние if (digitalRead(8)==HIGH) и все работает как надо.... Не пойму в чем прикол?

Гриша
Offline
Зарегистрирован: 27.04.2014

ну, теперь скетч, который не работает.... да и схему так не рисуют - что за прямоугольник с точкой 817 ? как можно понять алгоритм работы если вы используете черные квадраты :)))  нарисуйте схемку одного канала, раз они одинаковые

Dr_grizzly
Dr_grizzly аватар
Offline
Зарегистрирован: 07.12.2015

Как скажите ))) Вот накидал:

Резистор не на той ноге нарисова, он от земли к оптрону идет. А вот скеч смогу вечерком скинуть, т.к. ща не имею его на рабочем компе... Но думаю проблема не в скетче, т.к. без платы расширения скетч работает...

sadman41
Offline
Зарегистрирован: 19.10.2016

Зачем ставить оптопару и затем связывать ее по земле?

bankir_1986
Offline
Зарегистрирован: 23.03.2015

Как оптопара будет работать в Вашем случае?

НИКАК.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Dr_grizzly,

Правильнее ноги инициализировать вот так :

 pinMode(8,INPUT_PULLUP)

 

Logik
Offline
Зарегистрирован: 05.08.2014

sadman41 пишет:

Зачем ставить оптопару и затем связывать ее по земле?

))) Это тут хроническое и неисправимое. Приймите как данность, на нашем форуме оптроны не для гальваноразвязки, а чтоб не сгорело ;) Спорить с ними безсмыслено, аргумент у них убойный - "оноработает!"

b707
Offline
Зарегистрирован: 26.05.2017

Dr_grizzly. для работы оптрона во входной цепи нужен ток 5-20мА, а ваши датчики столко могут? - большинство датчиков обычно работают с микроамперами....

То что вы нарисовали - мало того, что бред в смысле бесполезности оптрона (развязки никакой НЕТ). так еще и просто неработоспособно с большинство датчиков.

Dr_grizzly
Dr_grizzly аватар
Offline
Зарегистрирован: 07.12.2015

Нуу блин )) стоило косякнуть в рисовании и раскритиковали )))) Первый рисунок правильный, просто не по правилам схемотехники )) земля не замкнута, один минус от датчиков он на стороне датчика, второй минус на ардуине ) Здесь используются датчики положения пневмоцилиндра, по сути это датчик индуктивности.

Поправил код на pinMode(8,INPUT_PULLUP)


uint16_t au16data[6]={0,0,0,0,0,0};
const int DPP1=8;
const int DPP2=9;
const int DPP3=10;

const int PNR1=5;
const int PNR2=6;
const int PNR3=7;

bool Pnr1_start=false; // запуск ПНР1
bool Pnr2_start=false; // запуск ПНР1
bool Pnr3_start=false; // запуск ПНР1

bool dpp2On=false;
bool dpp3On=false;

bool T1On=false; // таймер Т1
bool T2On=false; // таймер Т2
bool T3On=false; // таймер Т3
bool T4On=false; // таймер Т4
bool T5On=false; // таймер Т4

int AlgoStep=0; // шаги алгоритма

unsigned pauseT1 = 2000; // пауза dpp2
unsigned long timeT1 = millis();

unsigned pauseT2 = 500; // пауза перед pnr3
unsigned long timeT2 = millis();

unsigned pauseT3 = 5000; // пауза pnr3
unsigned long timeT3 = millis();

unsigned pauseT4 = 500; // пауза перед pnr2
unsigned long timeT4 = millis();

unsigned pauseT5 = 3000; // пауза перед началом нового цикла
unsigned long timeT5 = millis();

}
        

void setup() {
  slave.begin( 19200 ); 
  slave.setTimeOut(2000);

  pinMode(DPP1,INPUT_PULLUP);
  pinMode(DPP2,INPUT_PULLUP);
  pinMode(DPP3,INPUT_PULLUP);
  pinMode(PNR1,OUTPUT);
  pinMode(PNR2,OUTPUT);
  pinMode(PNR3,OUTPUT);
  pinMode(13,OUTPUT);
  digitalWrite(PNR1,HIGH); // для блока Реле даем 5В чтобы отключить реле.
  digitalWrite(PNR2,LOW); // включаем реле чтобы поршень занял правое крайнее положение
  digitalWrite(PNR3,HIGH); // для блока Реле даем 5В чтобы отключить реле. Сверло опускается
  digitalWrite(13,LOW); // светоидикация 
  
  au16data[0]=pauseT1;
  au16data[1]=pauseT2;
  au16data[2]=pauseT3;
  au16data[3]=pauseT4;
  au16data[4]=pauseT5;
  au16data[5]=0; // запись в ПЗУ - если =1 то пишем
  delay(3000); // ждем начала
}

void loop() {
 pauseT1=au16data[0]; // передаем из буфера slave новые значения
 pauseT2=au16data[1];
 pauseT3=au16data[2];
 pauseT4=au16data[3];
 pauseT5=au16data[4];
 

if (T1On==true) // Запустили с паузой
{
  if (millis() - timeT1 >= pauseT1) 
  {
    T1On=false;    
    digitalWrite(PNR1,LOW); // включили левый
    digitalWrite(PNR2,HIGH);        
    AlgoStep++; // переходим к шагу 1 алгоритма
    timeT1=millis();
  }
}

if (T2On==true) // Запустили с паузой
{
  if (millis() - timeT2 >= pauseT2) 
  {
    T2On=false;
    digitalWrite(PNR3,LOW); // подняли сверло   
    timeT2=millis();
    timeT3=millis(); // задаем текущее время для отсчета 
    T3On=true; // включили таймер

  }
}

if (T3On==true) // Запустили с паузой
{
  if (millis() - timeT3 >= pauseT3) 
  {
    T3On=false;
    digitalWrite(PNR3,HIGH); // убрали сверло   
    timeT3=millis();
    timeT4=millis(); // задаем текущее время для отсчета 
    T4On=true; // включили таймер

  }
}

if (T4On==true) // Запустили с паузой
{
  if (millis() - timeT4 >= pauseT4) 
  {
    T4On=false;
    digitalWrite(PNR2,LOW); // Двигаем вправо до конца поршень
    digitalWrite(PNR1,HIGH); // Двигаем вправо до конца поршень
    timeT4=millis();
    timeT5=millis(); // задаем текущее время для отсчета 
    T5On=true; // включили таймер
  }
}

if (T5On==true) // Запустили с паузой
{
  if (millis() - timeT5 >= pauseT5) 
  {
    T5On=false;    
    timeT5=millis();
    AlgoStep++; // Подождали 3000сек чтобы начать новый цикл переходим к шагу 2 алгоритма
  }
}


switch (AlgoStep) {
  case 0: { 
    if (digitalRead(DPP1)==LOW) { // читаем положение дпп1, если пнр3 лежит то разрешаем работу
      if (Pnr1_start==false) {
        Pnr1_start=true; // начали двигаться
        digitalWrite(PNR1,LOW); // включили левый
        digitalWrite(PNR2,HIGH);        
      }
    
      if (digitalRead(DPP2)==LOW) { // если сработал ДПП2 то останавливаем 
         if (dpp2On==false) { 
            dpp2On=true; // защелкнули одно срабатывание
            digitalWrite(PNR1,LOW); // включили левый
            digitalWrite(PNR2,LOW); // включили правый чтобы остановить движение цилиндра
            timeT1=millis(); // задаем текущее время для отсчета 
            T1On=true; // включили таймер
         }
      }    
    } //dpp1
    break;
  } // case 0
  
  case 1: {
     if  (digitalRead(DPP3)==LOW) {
       if (dpp3On==false) {
        dpp3On=true;
         digitalWrite(PNR1,LOW); // включили левый для возврата
         digitalWrite(PNR2,HIGH); // Двигаем вправо до конца поршень         
         timeT2=millis(); // задаем текущее время для отсчета 
         T2On=true; // включили таймер
         
       }
      
     }
    break;
  } // case 1

 case 2: {
  Pnr1_start=false; 
  dpp2On=false;
  dpp3On=false;
  AlgoStep=0;  
  break;  
 }//case 2
}


}

Вот приблизительный код )) По сути он не должен быть проблемой, т.к. без оптопар все работает, когда на прямую подаю сигналы.

b707
Offline
Зарегистрирован: 26.05.2017

Dr_grizzly пишет:

используются датчики положения пневмоцилиндра, по сути это датчик индуктивности.

см мое сообщение #7 - датчики какой ток выдают? - он в состоянии "зажечь" излучатель оптопары?

bankir_1986
Offline
Зарегистрирован: 23.03.2015

Dr_grizzly пишет:

Первый рисунок правильный

Как он может быть правильный? На пине всегда будет LOW, вне зависимости "зажгли" излучатель оптопары или нет.

Ты gnd цепляешь на пин и хочешь увидеть там HIGH?

Гриша
Offline
Зарегистрирован: 27.04.2014

bankir_1986 пишет:

Dr_grizzly пишет:

Первый рисунок правильный

Как он может быть правильный? На пине всегда будет LOW, вне зависимости "зажгли" излучатель оптопары или нет.

Ты gnd цепляешь на пин и хочешь увидеть там HIGH?

там пуллап резистор в подтяжках пинов

Dr_grizzly
Dr_grizzly аватар
Offline
Зарегистрирован: 07.12.2015

посмотрел характеристики - до 70мА может пропустить через себя. Цепь простая - блок питания -> датчик -> контакт на оптопаре. Датчик сработав дает на управляющем контакте напряжение блока питания. А вообще я ща посчитал что с резистером на 220 ом при 5В ток получается 22мА. ВРоде как достаточен?

Bront
Offline
Зарегистрирован: 05.04.2016

Если оптопары удобно, пусть будут оптопары.

Измерьте напряжение в точке, например, ard8 при активном сигнале датчика.
В данном случае логика же простая:
сработал датчик, в оптопаре загорелся светодиод, он открыл транзистор, транзистор притянул вход
ардуино к земле. если не работает - что-то не так подключено.

PS
не пойму, зачем оптопары. Если активный сигнал с датчика - напряжение питания, а оно 5 вольт, как я понял
так подавайте его напрямую через токоограничивающий резистор на вход ардуино. Для успокоения защитите
вход стабилитроном.

Dr_grizzly
Dr_grizzly аватар
Offline
Зарегистрирован: 07.12.2015

Померил напряжение, без активного сигнала датчика - +4.7В, когда датчик активен - 0В.

А токоограничеващий резистор на ногу ардуины какой должен стоять? допустим при питании в 5В, какая величина тока должна проходить на контроллер чтобы уверенно работать и не спалить? В описаловке до 40мА. А по факту какой должен быть? Если брать формулу R=U/I то получаем при 5В нужно не менее 125Ом - это максимальный ток 40мА получится, и не более 1кОм вроде?

Дело в том, что напряжения могут быть не 5 а 24В и тогда хотелось бы просто перекинуть перемычку на другой резистор, а не собирать отдельную цепь... Или может есть что попроще? ))

 

Dr_grizzly
Dr_grizzly аватар
Offline
Зарегистрирован: 07.12.2015

Чет ваще лажа какая-то.... заменил оптронную схему на эту, для тестов, а поводение такое же как с оптроном... Проверил по формуле - получается что это некий делитель но без сильного падения напряжения, т.е с основной задачей ограничения тока справляется, получается 15мА на ногу ардуины с датчка. Сделал подтяжку на землю через 10кОм. Поведение алгоритма ваще не пойми как - запускается, ждет 3сек. включает PNR2 и ждет сигнала от датчика. Подаю на DPP1 сигнал, срабатывает PNR1 и отключается PNR2, начало алгоритма положено, но дальше ни DPP2 ни DPP3 не реагируют, чтобы не делал... Уже не знаю куда смотреть.... Может где "бревно в глазу" засело???

Dr_grizzly
Dr_grizzly аватар
Offline
Зарегистрирован: 07.12.2015
const int DPP1=8;
const int DPP2=9;
const int DPP3=10;

const int PNR1=5;
const int PNR2=6;
const int PNR3=7;

void setup() {
  // put your setup code here, to run once:
  pinMode(DPP1,INPUT);
  pinMode(DPP2,INPUT);
  pinMode(DPP3,INPUT);
  pinMode(PNR1,OUTPUT);
  pinMode(PNR2,OUTPUT);
  pinMode(PNR3,OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  digitalWrite(PNR1,HIGH);
  digitalWrite(PNR2,HIGH);
  digitalWrite(PNR3,HIGH);
  
if (digitalRead(DPP1)==HIGH) {
  digitalWrite(PNR1,LOW);
}
if (digitalRead(DPP2)==HIGH) {
  digitalWrite(PNR2,LOW);
}

if (digitalRead(DPP3)==HIGH) {
  digitalWrite(PNR3,LOW);
}
delay(1000);
}

Создал тестовый код, запихнул, работает блин... значит лажа где-то в коде

bizzon
Offline
Зарегистрирован: 29.03.2016

Засело.Это почти не делитель. Почитайте в интернете про делитель напряжения и посчитайте сами, что вы нарисовали.

Поставьте вместо 330 ом 10 Ком, а вместо 10 Ком - стабилитрон па 4,7V и подавайте на вход хоть 24 вольта.

 

bwn
Offline
Зарегистрирован: 25.08.2014

Dr_grizzly пишет:

А токоограничеващий резистор на ногу ардуины какой должен стоять? допустим при питании в 5В, какая величина тока должна проходить на контроллер чтобы уверенно работать и не спалить? В описаловке до 40мА. А по факту какой должен быть? Если брать формулу R=U/I то получаем при 5В нужно не менее 125Ом - это максимальный ток 40мА получится, и не более 1кОм вроде?

Вы уважаемый совсем себе мозги заплели. Вы для пина в режиме INPUT пытаетесть использовать данные для OUTPUT, а это совсем разные вещи и режимы.

Dr_grizzly
Dr_grizzly аватар
Offline
Зарегистрирован: 07.12.2015

Ну я все таки по входному пытаюсь определить общие правила подключения )) на вход ведь тоже должно что-то ограничивать ток? или не?

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Dr_grizzly пишет:

Как скажите ))) Вот накидал:

Учитесь "кидать" красиво, например вот так :

 

Bront
Offline
Зарегистрирован: 05.04.2016

Вы себе голову чем-то не тем забили :)

Ток, который пытаетесь просчитать и на который ориентируетесь в 40 мА,
это максимальный ток нагрузки, который допустим для, грубо говоря, ножки микросхемы.
то есть
DC Current per I/O Pin 40.0mA

но надо помнить, что есть суммарный ток нагрузки для всех выводов не должен превышать 200ма.

Например, если пин сконфигурировать на выход и нагрузить, ну не знаю, тремя параллельно включенными
светодиодами, то, скорее всего, этот выход выйдет из строя.

Короче, не тот ток считаете :)

Нам, ну то есть Вам, нужно получить сигнал с датчиков в виде напряжения логических уровней, понятных микроконтроллеру.
Для atmega328 это (примерно, точно не помню)

для 0 - max 0.3Vсс (Vcc - напряжение питания, то есть напряжение 0 максимум 1.5в при питании контроллера от 5 вольт)
для 1 - все что выше нуля (логического) и до VCC.

Вы измерили:
Померил напряжение, без активного сигнала датчика - +4.7В, когда датчик активен - 0В.
С уровнями нормально получается. То есть когда датчик сработает - на входе мк ноль (логический)
Скорее всего в логике программы ошибка.

Dr_grizzly
Dr_grizzly аватар
Offline
Зарегистрирован: 07.12.2015

Bront пишет:
Вы себе голову чем-то не тем забили :) Ток, который пытаетесь просчитать и на который ориентируетесь в 40 мА, это максимальный ток нагрузки, который допустим для, грубо говоря, ножки микросхемы. то есть DC Current per I/O Pin 40.0mA но надо помнить, что есть суммарный ток нагрузки для всех выводов не должен превышать 200ма. Например, если пин сконфигурировать на выход и нагрузить, ну не знаю, тремя параллельно включенными светодиодами, то, скорее всего, этот выход выйдет из строя. Короче, не тот ток считаете :) Нам, ну то есть Вам, нужно получить сигнал с датчиков в виде напряжения логических уровней, понятных микроконтроллеру. Для atmega328 это (примерно, точно не помню) для 0 - max 0.3Vсс (Vcc - напряжение питания, то есть напряжение 0 максимум 1.5в при питании контроллера от 5 вольт) для 1 - все что выше нуля (логического) и до VCC. Вы измерили: Померил напряжение, без активного сигнала датчика - +4.7В, когда датчик активен - 0В. С уровнями нормально получается. То есть когда датчик сработает - на входе мк ноль (логический) Скорее всего в логике программы ошибка.

вооо! вот это уже ближе к теме! )) Доступным языком пояснили, спасибо большое! Есть еще один вопросик тогда - а если ток ничтожно мал будет к примеру 1.5 мкА(воткнуть например резистор в 3.6кОм), а напряжение 4,5В, то хватит ли этого тока чтобы МК понял сигнал на входе?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Хватить.

Dr_grizzly
Dr_grizzly аватар
Offline
Зарегистрирован: 07.12.2015

Ну все! Разобрался полностью! Ошибка в коде - скобку не там закрыл, за одно и пополнил навыки работы  с портами! Всем спасибо!))

По итогу собрал две схемы. На оптронах и на резисторах - и та и другая работают замечательно!))