Подсчёт числа оборотов с помощью оптопары TCST1103

Saigak
Offline
Зарегистрирован: 09.02.2020

Приветствую, коллеги.

Я новичок в Ардуино, помогаю школьнику с проектом :-)

Решили сделать макет электромобиля. Комплектущие были закуплены, контроллер - Arduino UNO, программа написана (использовалась книга М. Момота "Мобильные роботы на базе Arduino, 2-е изд."). Захотелось снимать количество оборотов двигателя, для чего на "мотор-редуктор колесо" установлен диск с прорезями, и закуплена оптопара TCST1103, идеально подходящая по размеру под диск.

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

Задача наверняка уже решалась неоднократно.


void setup()
{
  Serial.begin(115200); // Устанавливал и 9600 - разницы нет
  pinMode(2, INPUT);  // Переводим 2 порт в состояние ввода информации
  digitalWrite(2, HIGH);
}

void loop() 
{
  Serial.println(digitalRead(2)); // Ситываем состояние.
}
sadman41
Offline
Зарегистрирован: 19.10.2016

INPUT_PULLUP

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

sadman41 пишет:

INPUT_PULLUP

а 5-я строка это не оно?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Схему давайте.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

Схему давайте.

со схемой любой инженер сможет )))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

И, кстати, лог монитора порта тоже. Что там у Вас лезет, откуда нам знать-то?

Saigak
Offline
Зарегистрирован: 09.02.2020

Упс... Полез снимать лог монитора порта, и... там теперь "нормальные" единицы!!! А перед тем, как я писал, что "даже без подключения вывода фототранзистора в монитор порта постоянно лезут значения" - был то 0, то 1 - совершенно хаотично.

Скетч не менял.

Потом поменял подтягивающий резистор на "землю" - 

  digitalWrite(2, LOW);  

в монитор порта полезли стабильные нули, ура! :-)

Считаю, что данная ошибка устранена, всем ОГРОМНОЕ СПАСИБО за быстрый ответ!

В следующий раз уже видимо приду с вопросами по оптопаре :-)

 

P.S. Хотя конечно причину я не понял... Как будто не загрузилась команда использовать подтягивающий резистор... Но сегодня-то скетч старый нормально заработал без перекомпиляции...

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

У 328-го МК нет внутреннего "резистора на землю".

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

sadman41 пишет:
У 328-го МК нет внутреннего "резистора на землю".

Но это не мешает ему читать принудительно установленный LOW. Наверно поэтому и рекомендуют запись - INPUT_PULLUP.)))) Но радист протестовал.))))

Atmega328
Offline
Зарегистрирован: 11.02.2020

Saigak пишет:

Приветствую, коллеги.

Я новичок в Ардуино, помогаю школьнику с проектом :-)

Решили сделать макет электромобиля. Комплектущие были закуплены, контроллер - Arduino UNO, программа написана (использовалась книга М. Момота "Мобильные роботы на базе Arduino, 2-е изд."). Захотелось снимать количество оборотов двигателя, для чего на "мотор-редуктор колесо" установлен диск с прорезями, и закуплена оптопара TCST1103, идеально подходящая по размеру под диск.

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

Задача наверняка уже решалась неоднократно.



У вас они и будут "лезть" - в бесконечном цикле

Чтобы сообщения "лезли " только при срабатывании фототранзистора, попробуйте так:

int old;
void setup()
{
  Serial.begin(9600); // разницы нет, но если не видно разницы. зачем платить больше ? :)
  pinMode(2, INPUT_PULLUP);  // Настраиваем пин 2 как "вход с подключенным подтягивающим резистором" (если не поможет, тогда...подключить реальный резюк 4,7..10 кОм на землю :) )
  digitalWrite(2, HIGH);
 Serial.println(digitalRead(2)); .

}

void loop() 
{

 if (digitalRead(2)!=old) //Если измеренное значение не равно текущему, только тогда обновляем данные
  {
old=digitalRead(2);// Считываем состояние
 Serial.println(old);
  }
} 
RG22EM
Offline
Зарегистрирован: 27.08.2016

bwn пишет:

sadman41 пишет:
У 328-го МК нет внутреннего "резистора на землю".

Но это не мешает ему читать принудительно установленный LOW. Наверно поэтому и рекомендуют запись - INPUT_PULLUP.)))) Но радист протестовал.))))

 а не то ли самое делает 5-я строка скетча, только не столь наглядно

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

RG22EM пишет:

 а не то ли самое делает 5-я строка скетча, только не столь наглядно

В том скетче, да, но потом рождаются посты #6, по аналогии. А вот вписать PULL_DOWN уже не выйдет.