Без оптрона работает, с оптроном нет...
- Войдите на сайт для отправки комментариев
Всем привет! Вчера собрал схемку 
На портах ардуины 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) и все работает как надо.... Не пойму в чем прикол?
ну, теперь скетч, который не работает.... да и схему так не рисуют - что за прямоугольник с точкой 817 ? как можно понять алгоритм работы если вы используете черные квадраты :))) нарисуйте схемку одного канала, раз они одинаковые
Как скажите ))) Вот накидал:
Резистор не на той ноге нарисова, он от земли к оптрону идет. А вот скеч смогу вечерком скинуть, т.к. ща не имею его на рабочем компе... Но думаю проблема не в скетче, т.к. без платы расширения скетч работает...
Зачем ставить оптопару и затем связывать ее по земле?
Как оптопара будет работать в Вашем случае?
НИКАК.
Dr_grizzly,
Правильнее ноги инициализировать вот так :
pinMode(8,INPUT_PULLUP)
Зачем ставить оптопару и затем связывать ее по земле?
))) Это тут хроническое и неисправимое. Приймите как данность, на нашем форуме оптроны не для гальваноразвязки, а чтоб не сгорело ;) Спорить с ними безсмыслено, аргумент у них убойный - "оноработает!"
Dr_grizzly. для работы оптрона во входной цепи нужен ток 5-20мА, а ваши датчики столко могут? - большинство датчиков обычно работают с микроамперами....
То что вы нарисовали - мало того, что бред в смысле бесполезности оптрона (развязки никакой НЕТ). так еще и просто неработоспособно с большинство датчиков.
Нуу блин )) стоило косякнуть в рисовании и раскритиковали )))) Первый рисунок правильный, просто не по правилам схемотехники )) земля не замкнута, один минус от датчиков он на стороне датчика, второй минус на ардуине ) Здесь используются датчики положения пневмоцилиндра, по сути это датчик индуктивности.
Поправил код на 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 } }Вот приблизительный код )) По сути он не должен быть проблемой, т.к. без оптопар все работает, когда на прямую подаю сигналы.
используются датчики положения пневмоцилиндра, по сути это датчик индуктивности.
см мое сообщение #7 - датчики какой ток выдают? - он в состоянии "зажечь" излучатель оптопары?
Первый рисунок правильный
Как он может быть правильный? На пине всегда будет LOW, вне зависимости "зажгли" излучатель оптопары или нет.
Ты gnd цепляешь на пин и хочешь увидеть там HIGH?
Первый рисунок правильный
Как он может быть правильный? На пине всегда будет LOW, вне зависимости "зажгли" излучатель оптопары или нет.
Ты gnd цепляешь на пин и хочешь увидеть там HIGH?
там пуллап резистор в подтяжках пинов
посмотрел характеристики - до 70мА может пропустить через себя. Цепь простая - блок питания -> датчик -> контакт на оптопаре. Датчик сработав дает на управляющем контакте напряжение блока питания. А вообще я ща посчитал что с резистером на 220 ом при 5В ток получается 22мА. ВРоде как достаточен?
Если оптопары удобно, пусть будут оптопары.
Измерьте напряжение в точке, например, ard8 при активном сигнале датчика.
В данном случае логика же простая:
сработал датчик, в оптопаре загорелся светодиод, он открыл транзистор, транзистор притянул вход
ардуино к земле. если не работает - что-то не так подключено.
PS
не пойму, зачем оптопары. Если активный сигнал с датчика - напряжение питания, а оно 5 вольт, как я понял
так подавайте его напрямую через токоограничивающий резистор на вход ардуино. Для успокоения защитите
вход стабилитроном.
Померил напряжение, без активного сигнала датчика - +4.7В, когда датчик активен - 0В.
А токоограничеващий резистор на ногу ардуины какой должен стоять? допустим при питании в 5В, какая величина тока должна проходить на контроллер чтобы уверенно работать и не спалить? В описаловке до 40мА. А по факту какой должен быть? Если брать формулу R=U/I то получаем при 5В нужно не менее 125Ом - это максимальный ток 40мА получится, и не более 1кОм вроде?
Дело в том, что напряжения могут быть не 5 а 24В и тогда хотелось бы просто перекинуть перемычку на другой резистор, а не собирать отдельную цепь... Или может есть что попроще? ))
Чет ваще лажа какая-то.... заменил оптронную схему на эту, для тестов, а поводение такое же как с оптроном... Проверил по формуле - получается что это некий делитель но без сильного падения напряжения, т.е с основной задачей ограничения тока справляется, получается 15мА на ногу ардуины с датчка. Сделал подтяжку на землю через 10кОм. Поведение алгоритма ваще не пойми как - запускается, ждет 3сек. включает PNR2 и ждет сигнала от датчика. Подаю на DPP1 сигнал, срабатывает PNR1 и отключается PNR2, начало алгоритма положено, но дальше ни DPP2 ни DPP3 не реагируют, чтобы не делал... Уже не знаю куда смотреть.... Может где "бревно в глазу" засело???
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); }Создал тестовый код, запихнул, работает блин... значит лажа где-то в коде
Засело.Это почти не делитель. Почитайте в интернете про делитель напряжения и посчитайте сами, что вы нарисовали.
Поставьте вместо 330 ом 10 Ком, а вместо 10 Ком - стабилитрон па 4,7V и подавайте на вход хоть 24 вольта.
А токоограничеващий резистор на ногу ардуины какой должен стоять? допустим при питании в 5В, какая величина тока должна проходить на контроллер чтобы уверенно работать и не спалить? В описаловке до 40мА. А по факту какой должен быть? Если брать формулу R=U/I то получаем при 5В нужно не менее 125Ом - это максимальный ток 40мА получится, и не более 1кОм вроде?
Вы уважаемый совсем себе мозги заплели. Вы для пина в режиме INPUT пытаетесть использовать данные для OUTPUT, а это совсем разные вещи и режимы.
Ну я все таки по входному пытаюсь определить общие правила подключения )) на вход ведь тоже должно что-то ограничивать ток? или не?
Как скажите ))) Вот накидал:
Учитесь "кидать" красиво, например вот так :
Вы себе голову чем-то не тем забили :)
Ток, который пытаетесь просчитать и на который ориентируетесь в 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В, то хватит ли этого тока чтобы МК понял сигнал на входе?
Хватить.
Ну все! Разобрался полностью! Ошибка в коде - скобку не там закрыл, за одно и пополнил навыки работы с портами! Всем спасибо!))
По итогу собрал две схемы. На оптронах и на резисторах - и та и другая работают замечательно!))