4.2. Подключение концевых переключателей

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

Для того, чтобы считать значение с концевого выключателя, используется функция digitalRead, в качестве аргумента указывается номер пина, к которому подключен концевой выключатель. Эта функция может вернуть 2 значения: 1 (true) – концевой выключатель нажат, 0 (false) – концевой выключатель отжат. Напишем программу, которая будет зажигать светодиод, если концевой выключатель нажат. Создадим 2 директивы препроцессора, для хранения номеров пинов светодиода и концевого выключателя. Настроим пин светодиода на отдачу напряжения. Пин концевого выключателя должен быть настроен на считывание напряжения, для этого вызовем в функции setup функцию pinMode(X_ENDSTOP, INPUT_PULLUP).

Далее переходим в функцию loop, в ней должно циклично проверяться состояние концевого выключателя. Воспользуемся оператором if. Это условный оператор, который выполняет команды, прописанные в его теле, если условие в круглых скобках выполняется (истинно). Если условие не выполняется (ложно), то выполняются команды после тела if. Else – вторая часть условного оператора, если условие в круглых скобках if истинно, то операторы в теле else не выполняются и программа сразу переходит к выполнению операторов после тела else, если же условие if не выполняется, то выполняются команды в теле else и команды, прописанные после него.

Условие, которое пишется в круглых скобках после if, является логическим выражением, результат которого либо 1 (true, истина), либо 0 (false, ложь). Т.к. команда digitalRead(X_ENDSTOP) также во-звращает либо 1 либо 0, где 1 – концевой выключатель замкнут, 0 –разомкнут, мы можем написать его в качестве условия. Если условие выполняется, подаем питание на светодиод, если не выполняется, отключаем светодиод.

Полный код программы выглядит следующим образом:

#define X_ENDSTOP 9
#define LED_PIN BDPIN_LED_USER_1
void setup() {
 pinMode(X_ENDSTOP, INPUT_PULLUP);
 pinMode(LED_PIN, OUTPUT);
}
void loop() {
 if(digitalRead(X_ENDSTOP))
 {
digitalWrite(LED_PIN, HIGH);
 }
 else
 {
 digitalWrite(LED_PIN, LOW);
 }
}

Перед началом работы, каретка агронабора должна встать в стартовое положение. Напишем отдельные функции для движения в стартовое положение по каждой оси. Функции, которые мы реализуем будут иметь тип возвращаемых данных void и не будут иметь аргументов. Тело функции будет выглядеть следующим образом:

void home_x()
{
 digitalWrite(DIR_PIN_X,LOW);
 while(digitalRead(X_ENDSTOP) != true)
 {
 digitalWrite(STEP_PIN_X,HIGH);
 delayMicroseconds(1000);
 digitalWrite(STEP_PIN_X,LOW);
 delayMicroseconds(1000);
 }
}

Сначала надо задать направление движения каретки (функция digitalWrite(DIR_PIN_X,LOW)), затем требуется двигать каретку к концевому выключателю. Т.к. мы не знаем текущее положение каретки в пространстве и не знаем расстояние до концевого выключателя, будем циклично двигать каретку на один шаг шагового двигателя, пока не сработает концевой выключатель. Сделать это можно с помощью цикла while. Он будет выполняться, пока условие в круглых скобках истинно. Условием будет являться состояние концевого выключателя, пока он не сработал (digitalRead(X_ENDSTOP) != true), каретка будет двигаться.

Полный код программы будет выглядеть так:

#define X_ENDSTOP 9
#define LED_PIN BDPIN_LED_USER_1
void home_x()
{
 digitalWrite(DIR_PIN_X,LOW);
 while(digitalRead(X_ENDSTOP) != true)
 {
 digitalWrite(STEP_PIN_X,HIGH);
 delayMicroseconds(1000);
 digitalWrite(STEP_PIN_X,LOW);
 delayMicroseconds(1000);
 }
}
void setup() {
 pinMode(LED_PIN, OUTPUT);
 pinMode(X_ENDSTOP, INPUT_PULLUP);
 home_x();
}
void loop() {

}

В результате выполнения данной программы каретка окажется в стартовом положении по оси X.