Аналоговый датчик в цифровой

Александр Бирюков
Offline
Зарегистрирован: 06.12.2018

Как известно, чтение ардуиной данных с цифрового датчика происходит гораздо быстрее, чем с аналогового. Хочу из оптопары сделать цифровой энкодер. Как это можно сделать?

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

А подробнее можете ? Из какой оптопары, какой именно результат хотите получить. 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Александр Бирюков пишет:
Как известно, чтение ардуиной данных с цифрового датчика происходит гораздо быстрее, чем с аналогового.

Как известно, это утверждение не соответствует действительности.

Цитата:

Хочу из оптопары сделать цифровой энкодер. Как это можно сделать?

Элементарно: берешь контроллер (например, Ардуину), подключаешь ее к аналоговому датчику, придумываешь протокол, по которому этот новый цифровой датчик будет обмениваться информацией с внешним контроллером, пишешь скетч, в котором наша Ардуина будет снимать показания с аналогового датчика и выдавать их наружу по придуманному цифровому протоколу.

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

andriano пишет:

Александр Бирюков пишет:
Как известно, чтение ардуиной данных с цифрового датчика происходит гораздо быстрее, чем с аналогового.

Как известно, это утверждение не соответствует действительности.

Тоись с пина читать выходит не быстрее, чем через АЦП с преобразованием?

Александр Бирюков
Offline
Зарегистрирован: 06.12.2018

andriano пишет:

Александр Бирюков пишет:
Как известно, чтение ардуиной данных с цифрового датчика происходит гораздо быстрее, чем с аналогового.

Как известно, это утверждение не соответствует действительности.

http://arduino.ru/forum/obshchii/vremya-vypolneniya-otdelnykh-komand-ard...

Функчия digitalWrite идет намного быстрее, чем analogWrite

Александр Бирюков
Offline
Зарегистрирован: 06.12.2018

asam пишет:

А подробнее можете ? Из какой оптопары, какой именно результат хотите получить. 

Я думаю, то, какая оптопара, не имеет огромного значения. Наверное, зто TCRT5000, из которой я выковыряю ИК-датчик и светодиод. Сделать хочу по этому принципу: 

Желаемый результат - чтобы датчик определял, есть щель или нет, и чтобы ардуина, определяя частоту изменений состояния датчика, считала скорость в оборотах.

Александр Бирюков
Offline
Зарегистрирован: 06.12.2018

andriano пишет:

Элементарно: берешь контроллер (например, Ардуину), подключаешь ее к аналоговому датчику, придумываешь протокол, по которому этот новый цифровой датчик будет обмениваться информацией с внешним контроллером, пишешь скетч, в котором наша Ардуина будет снимать показания с аналогового датчика и выдавать их наружу по придуманному цифровому протоколу.

Вы предлагаете приклеить еще одну ардинку? Ну что ж, если нет бонее удобного способа...

AlexanderNO
Offline
Зарегистрирован: 08.11.2018

Александр Бирюков пишет:
Как известно, чтение ардуиной данных с цифрового датчика происходит гораздо быстрее, чем с аналогового.

Александр Бирюков пишет:

Функчия digitalWrite идет намного быстрее, чем analogWrite

Запутались с Read и Write?

Александр Бирюков пишет:

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

Ардуина в данном случае будет считать импульсы. Можно считать импульсы за определенный промежуток времени, а можно вычислить время между импульсами. Так или иначе эти задачи уже давно решены в различных проектах с использованием самых разных датчиков.    

Наберите здесь в поисковичке "Тахометр оптопара" и увидите много интересного.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

DetSimen пишет:

andriano пишет:

Александр Бирюков пишет:
Как известно, чтение ардуиной данных с цифрового датчика происходит гораздо быстрее, чем с аналогового.

Как известно, это утверждение не соответствует действительности.

Тоись с пина читать выходит не быстрее, чем через АЦП с преобразованием?

От датчика зависти, однако.

Некоторым датчикам нужна почти секунда, чтобы прочухаться.

Опять же, если ориентироваться на мое предложение, опубликованное выше: если цифровой датчик - это аналоговый датчик + ардуина, то, очевидно, время получения данных с такого цифрового датчика равно сумме времени оцифровки и времени передачи. А, как известно из курса арифметики, сумма двух положительных чисел не может быть меньше ни одного из слагаемых.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Александр Бирюков пишет:

Я думаю, то, какая оптопара, не имеет огромного значения. Наверное, зто TCRT5000, из которой я выковыряю ИК-датчик и светодиод. Сделать хочу по этому принципу: 

Желаемый результат - чтобы датчик определял, есть щель или нет, и чтобы ардуина, определяя частоту изменений состояния датчика, считала скорость в оборотах.

Если Вам нужен логический сигнал, а не цифровые данные (как можно было понять из исходного сообщения темы), то, разумеется, лучше читать с цифрового входа. Иногда может понадобиться установить между аналоговым датчиком и входом Ардуины триггер Шмитта или компаратор.

Александр Бирюков
Offline
Зарегистрирован: 06.12.2018

AlexanderNO пишет:

Запутались с Read и Write?

Да, правда. Впрочем, скорость Read примерно равна скорости Write

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Александр Бирюков пишет:

Да, правда. Впрочем, скорость Read примерно равна скорости Write

Не совсем. Если писать порт или читать напрямую, то да. Если использовать wiring  to digitalWrite медленне процентов на 15


void setup() {
  uint16_t i;
  uint32_t t;
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(4,INPUT);
  Serial.begin(115200);
  Serial.println("Start");
  t=micros();
  for(i=0;i<10000;i++)
  {
    digitalWrite(LED_BUILTIN, HIGH);
    digitalWrite(LED_BUILTIN, LOW);
  }
  t=micros()-t;
  Serial.print("digital Writes t=");
  Serial.println(t);
   t=micros();
  for(i=0;i<10000;i++)
  {
    digitalRead(4);
    digitalRead(4);
  }
  t=micros()-t;
  Serial.print("digital Reads t=");
  Serial.println(t);
}

void loop() {}
Start
digital Writes t=85556
digital Reads t=74340
 
Это происходит из-за того что digitalWrite делает дополнительные проверки перед непосредственной записью в порт.
ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

Зачем вам аналогрид?
К оптопаре оу простейший на 1 транзисторе и читать дигиталридом... Да и какую вы собираетесь считать частоту импульсов?

Александр Бирюков
Offline
Зарегистрирован: 06.12.2018

ELITE пишет:
Зачем вам аналогрид? К оптопаре оу простейший на 1 транзисторе и читать дигиталридом...

Интересно, спасибо

Цитата:
Да и какую вы собираетесь считать частоту импульсов?

Частоту, с которой мелькает крыльчатка, т.е., с которой меняется состояние "есть щель - нету ее"

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Александр Бирюков пишет:

Частоту, с которой мелькает крыльчатка, т.е., с которой меняется состояние "есть щель - нету ее"

А какая ожидается максимальная частота в Герцах (то есть сколько раз в секунду) с "которой мелькает крыльчатка" ? 

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

Александр Бирюков пишет:
Хочу из оптопары сделать цифровой энкодер. Как это можно сделать?

Таки наверное всё-таки из двух оптопар, если дальше идёт картинка с диском, не?

Алсо, здешний народ сбивает с толку слово "оптопара". Если у вас открытая оптопара с щелью, куда можно просовывать например, бумагу (или тот же диск), или нечто подобное, то называть сие изделие следует "фотоинтераптор", а не "оптопара".

Собсно гайд. Берёте микросхему, которая называется LM393. Если вникать, то это - компаратор, или операционный усилитель с бесконечным коэффициентом усиления и дискретным выходом. В микросхеме таких компараторов два, один на выводах 123, второй на 567. 4 и 8 питание. Какие за что отвечают - не помню, гугланёте. Выход этого компаратора непосредственно в арду. Выход является открытым стоком (или открытым коллектором, неважно), N-типа, тобишь это выход "активный ноль". Всмысле, так на нём неизвестно что (но если сделать подтяжку - то будет чёткая единица от внешнего резистора), а когда он сработает - будет чёткий ноль. Отталкиваясь от этого, вы можете включить в арде пин на INPUT_PULLUP и читать условием

if(!digitalRead(pin)) //reaction();

где восклицательный знак - лог. НЕ, аналогичное digitalread==false/low/0.

Далее берёте любой переменный резистор, сопротивлением достаточным чтобы ток через него от источника питания (5В) был не таким большим, чтобы сжечь его из-за нехватки мощности (миллиамперы). То есть резюк 1к ставить допустимо, 100 ом - не стоит. И достаточно маленьким, чтобы он не шумел. 1 Мегаом будет рассеивать в 1000 раз меньше мощности чем 1килоом, но сильнее шумит. Ползунок (средний вывод резистора) - в один из входов компаратора. У них обозначение + и -, какой - неважно, перепутаете - будет работать наоборот, поменяете. Во второй вход компаратора - ваш датчик, с тем чтобы то что подавалось в компаратор, являлось напряжением. То есть если это фотодиод - возможно, достаточно будет его подключить к плюсу питания. Если фоторезистор - притянуть к плюсу питания ещё одним резистором. Чем больше будет тот резистор, тем слабее он будет влиять на сопротивление датчика, и тем чувствительнее всё это дело будет. Чем меньше резистор (в килоомах), тем нечувствительнее соответственно. Обычно (для инфракрасных и не только фотодиодов, фоторезисторов) - этот притягивающий резистор около сотен килоом. Может 100к, может 330к, может 47к.

Чтобы был гисерезис (отходняк сработавшего компаратора не тутже как снизился порог датчика, а с некоторым нахлестом), типа срабатывает при 70% освещённости, но отпускает не при 69% а 55% - да, так вот, чтобы был гистерезис, надо соединить большим (сотни килоом) резистором выход компаратора, идущий в ардуину, и вход, который на датчике.

Рисовать схему лень.

Пробуйте. Советую проявить фантазию и немного додумать, дописав к "LM393", "компаратор" слово ардуино и покопать картинки гугла. Бтв, All так и будет стебать, пока не зададите вопрос нормально. А я отвечаю тоже... да чё я объясняю. Всё равно многабукав.

Упд. Какбе должно быть очевидно, что переменным настраивается порог сработки датчика. Потом замерить тестером и заменить на делитель из постоянных резисторов.