Четверг, 18 Февраль 2016 13:33

Робот-машинка на Arduino. Датчики положения колёс.

Автор
Оцените материал
(3 голосов)

Этой статьёй я начинаю цикл о том, как своими руками собрать и запрограммировать машинку-робота на Arduino. Статьи будут достаточно простые – так как инженерам-электронщикам вряд ли нужно искать такую информацию в интернетах, а вот начинающим радиолюбителям будет проще читать более «разжеванную» информацию.

И начну я не совсем стандартно – с подключения оптических датчиков положения колёс.

оптический датчик прерывания

Ещё их называют энкодерами. Или щелевыми оптронами. Или фотоинтеррапторами. Прям «Парк Юрского периода». Ну, по-русски это – оптический прерыватель… В общем, в разных магазинах кто как хочет – так и обзывает.

Почему именно с них? Потому, что информация о скорости вращения колёс и пути, пройденном каждым из колёс робота за отрезок времени является ключевой для управления машинкой.

К примеру, моторчики, которые шли в комплекте к купленному мной на Дилэкстриме шасси, оказались разной мощности – и вращаются с разной скоростью. И если я даже захочу, чтобы машинка ехала просто прямо – у меня не получится просто подключить параллельно оба мотора к одному источнику питания.

И даже если бы моторы оказались одинаковыми – всё равно нужны датчики положения колёс. Например, одно колесо встречает большее сопротивление – и начинает крутиться медленнее. Или робот упёрся в препятствие. Или робот поворачивает: одно колесо тормозим, второе вращаем – и для того, чтобы знать, на какой угол он повернул – нужно знать, сколько раз или на сколько градусов повернулось колесо…

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

Как работает щелевой оптрон?

С одной стороны в нём находится инфракрасный светодиод, который постоянно излучает невидимое ИК-излучение в щель. С другой стороны щели находится фототранзистор. ИК-излучение попадает на него, и он открывается – то есть, проводит через себя электрический ток. Если же в щель внести что-то непрозрачное – то фототранзистор закрывается, и ток через него не идёт.

Как подключить оптический прерыватель к Arduino?

схема подключения оптического прерывателя

«+» светодиода подключается к питанию через резистор, который ограничивает силу тока через него.

Катод светдиода соединяется с «землей», туда же – эмиттер фототранзистора.

Коллектор фототранзистора является «выходом» датчика. Но для того, чтобы напряжение на нём менялось в зависимости от наличия/отсутствия преграды в щели оптрона, коллектор соединяется с положительной шиной питания через «подтягивающий» резистор – чаще всего 10 кОм. А можно использовать «подтягивающие» резисторы, встроенные в порт микроконтроллеров AVR.

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

 датчики положения колёс машинка робот

На шасси есть специальные отверстия под эти датчики, а на валах колёс – специальные диски с прорезями. При вращении колеса диск попадает в прорезь то непрозрачной частью, то прорезью. И соответственно, на выходе датчика будет чередоваться то +5 В, то 0 В.

диск энкодер колеса машинки робота

Подключаем выходы датчиков к цифровым входам Arduino, и через небольшие промежутки времени проверяем эти входы. Если напряжение поменялось с высокого логического уровня на низкий, или наоборот – увеличиваем показания счётчика. Если счётчик отсчитал 40 раз (20 прорезей х 2 края у каждой прорези) – смотрим время, затраченное время на полный оборот, и высчитываем скорость вращения.

Сама программа вот:

float speedLeft, speedRight;
int counterLeft, counterRight;
boolean stateRight, stateLeft;
unsigned long timeLeft, timeRight;

void setup(){
pinMode (10,INPUT);
pinMode (11,INPUT);
digitalWrite(10,HIGH);
digitalWrite(11,HIGH);
Serial.begin(9600);
timeLeft=micros();
timeRight=timeLeft;
}

void loop(){
if(digitalRead(11) != stateLeft){
stateLeft = !stateLeft;
++counterLeft;
}
if(digitalRead(10) != stateRight){
stateRight = !stateRight;
++counterRight;
}
if(counterLeft==39){
counterLeft=0;
timeLeft=micros()-timeLeft;
speedLeft=(1000000.0/timeLeft);
timeLeft=micros();
Serial.print("left motor speed = ");
Serial.print(speedLeft);
Serial.println(" RPS");
}
if(counterRight==39){
counterRight=0;
timeRight=micros()-timeRight;
speedRight=(1000000.0/timeRight);
timeRight=micros();
Serial.print(" right motor speed = ");
Serial.print(speedRight);
Serial.println(" RPS");
}
delay(1);
}

А здесь – видео о подключении датчика положения колес:

А на следующем видео я подробно объясняю как работает приведенный выше скетч для Arduino. Он простой, конечно - но для самых начинающих может быть интересно.

Прочитано 4018 раз Последнее изменение Среда, 17 Февраль 2016 18:05
Авторизуйтесь, чтобы получить возможность оставлять комментарии