Странно работают датчики линии

dkm.group
dkm.group аватар
Offline
Зарегистрирован: 21.03.2016

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

Датчики работают по простому принципу - 1, если белый цвет, 0, если черный цвет. Я их настроил. все вроде как хорошо, но когда дело доходит до езды - робот некоторое время крутится (одним датчиком видит черный цвет), а когда доезжает до белого, то останавливается, хотя должен ехать по прямой.

int leftLinePin = 5;
int rightLinePin = 6; 

int leftDirPin = 4;
int leftSpeedPin = 5;

int rightDirPin = 7;
int rightSpeedPin = 6;

int runSpeed = 100; 

void setupMotorShield()
{
    pinMode(leftDirPin, OUTPUT);
    pinMode(leftSpeedPin, OUTPUT);
    pinMode(rightDirPin, OUTPUT);
    pinMode(rightSpeedPin, OUTPUT);
}

void go()
{
    analogWrite(leftSpeedPin, runSpeed);
    analogWrite(rightSpeedPin, runSpeed);
}



void goFoward()
{
    digitalWrite(leftDirPin, HIGH);
    digitalWrite(rightDirPin, HIGH);
    go();
}

void turnLeft()
{
    digitalWrite(leftDirPin, LOW);
    digitalWrite(rightDirPin, HIGH);
    go();
}

void turnRight()
{
    digitalWrite(leftDirPin, HIGH);
    digitalWrite(rightDirPin, LOW);
    go();
}

void setup()
{
    setupMotorShield();
}

void loop()
{
    // Считываем данные с сенсоров
    boolean whiteLeft = digitalRead(leftLinePin);
    boolean whiteRight = digitalRead(rightLinePin);

    if (whiteLeft && whiteRight) 
    {
        goFoward();
    } else if (whiteRight) {
        turnLeft();
    } else if (whiteLeft){
        turnRight();
    } else {
        goFoward();
    }
}

 

 

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

ДА какие конкретно датчики пользуете?

dkm.group
dkm.group аватар
Offline
Зарегистрирован: 21.03.2016

Цифровые, от амперки

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Их несколько разных типов. Требуется маркировка или фото.

Есть с одним резистором, управляющим яркостью светодиода, а есть с двумя: подстраивается как яркость, так и частота сигнала, ибо датчик на TSOP 33-38кгц. Первые тоже на нем, но без подстройки. Есть ещё третий тип, с обычным ИК-приемником. Они менее чувствительны (до 2-3см всего), но работают устойчиво.

Первые и вторые имеют большой недостаток в том что резистор яркости "работает" практически в крайнем положении. по-хорошему его надо выпаивать и заменять на 2 резистора: "базовый" и подстроечный с более плавным режимом подстройки яркости.

Настройка второго типа:

1. Берете фотоаппарат (телефон с камерой и т.п.) смотрите через него на светодиоды и выкручиваете яркость (резистор дальности) на максимум.

2. Если есть второй резистор, то крутите его, настраивая датчик на максимальную дальность приема "белого". У меня светят до 40см уверенно.

3. Устанавливаете требуемую дальность работы резистором дальности.

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

P.S. Датчик требует перенастройки (плывет частота) при изменениях питающего напряжения .. в частности от разряда батареек.

P.P.S Датчики (и первого и второго типа на TSOP) могут выдавать периодически "только белое" длительностью до нескольких миллисекунд .. биения? похоже что частота таки плавает. Поэтому, в коде надо производить несколько замеров по несколько пачек и их усреднять для выделения черного.

У меня относительно устойчиво работало так:

В скетче замер производился через everyMillis() макрос а позже через хук обработчика таймера, с вызовом каждую миллисекунду (1024мксек). За 1 сеанс делалось 10 замеров. Результат всех замеров тупо суммировался. Сумма обнулялась каждый 2 сеанс, что давало макс "белое" = 20. Если в последнем сеансе сумма была менее 16, то это "черное". :)

Ещё устойчивее получал результаты если сеансы замеров проводить "через раз" то есть первую мсек - замеряем пачку подряд 10 раз, потом 1 мсек пропускаем и потом делаем вторую попытку.