Операция ИЛИ - это две вертикальные черты, клавиша между плюсом и BackSpace, что над Enter.
В тексте вашей программы, присмотритесь, в главной программе loop есть оператор if, после которого скобки открылись и закрылись. Это первый блок команд. Скобка закрывается. Далее else и снова открывается скобка, далее идет альтернативный блок команд, и скобка закрывается. А затем идет опять else и третий блок, а это уже косяк. Должно быть так:
Код:
// Подключение модуля ультразвукового сенсора
#include <Ultrasonic.h>
//объявление глобальных переменных
int L_Sensor = 0; //Левый сенсор
int R_Sensor = 0; //Правый сенсор
float dist_cm = 0; // Значение расстояния
Ultrasonic ultrasonic(4, 2); // Назначение портов УЗ сенсора. Trig, Echo
byte turn = 0; // переменная Eruman
void setup()// Модуль инициализации
{
pinMode( 15 , INPUT); // Вход правого сенсора
pinMode( 17 , INPUT); // Вход левого сенсора
pinMode(3, OUTPUT); //B-B Назад - Левый мотор
pinMode(5, OUTPUT); //B-1A Вперед - Левый мотор
pinMode(6, OUTPUT); //A-B Назад - Правый мотор
pinMode(9, OUTPUT); //A-1A Вперед - Правый мотор
pinMode(7, OUTPUT); // LED1 Захват
pinMode(8, OUTPUT); // LED2 Откат
Serial.begin(9600); // Активация передачи данных через терминал
delay(5000); // Задержка старта 5 сек.
}
void go_forward() //Атакуем движение вперед
{
analogWrite(3, 0); //LEFT MOTOR
analogWrite(5, 255); //LEFT MOTOR
analogWrite(6, 0); //RIGHT MOTOR
analogWrite(9, 255); //RIGHT MOTOR
}
void go_left() // поиск цели или движение налево
{
analogWrite(3, 0); //LEFT MOTOR
analogWrite(5, 100); //LEFT MOTOR
analogWrite(6, 100); //RIGHT MOTOR
analogWrite(9, 0); //RIGHT MOTOR
}
void go_back () //движение назад
{
analogWrite(3, 255); //LEFT MOTOR
analogWrite(5, 0); //LEFT MOTOR
analogWrite(6, 255); //RIGHT MOTOR
analogWrite(9, 0); //RIGHT MOTOR
}
void go_right () //поиск цели или движение направо
{
analogWrite(3, 100); //LEFT MOTOR
analogWrite(5, 0); //LEFT MOTOR
analogWrite(6, 0); //RIGHT MOTOR
analogWrite(9, 100); //RIGHT MOTOR
}
void go_stop() //остановка
{
analogWrite(3, 255); //LEFT MOTOR
analogWrite(5, 255); //LEFT MOTOR
analogWrite(6, 255); //RIGHT MOTOR
analogWrite(9, 255); //RIGHT MOTOR
}
void check_sensor() // Подпрограмма проверки сенсоров.
{
R_Sensor = analogRead(15); // считываем показания с правого сенсора
delay(10); // Ожидание преобразования АЦП
L_Sensor = analogRead(17); // считываем показания с левого сенсора
delay(10); // Ожидание преобразования АЦП
dist_cm = ultrasonic.Ranging(CM);
delay(10);// Ожидание преобразования
}
void loop()
{
check_sensor(); // Проверяем сенсоры
if (R_Sensor < 150 || L_Sensor < 150) // Если белое поле
{
go_stop(); //Стоп!
delay(100); //Ждем 100 мс
go_back(); //Движемся назад
delay(1000); //1 секунду.
// При анализе края возможна ситуация, что потом, при поиске цели, бот будет рыскать
// налево-направо. Поэтому можно ввести дополнительную переменную, и записывать
// в нее предыдущий поворот. Я назвал её turn, добавив перед setup() строчку byte turn = 0;
if (L_Sensor <= 150) {
go_right(); //Поворачиваем направо если последним сработал левый
turn = 1;
} else {
go_left(); //иначе поворачиваем налево
turn = 2;
}
delay(300); //300 мс
go_forward(); //Движемся вперед
delay(300); //300 мс
}
else // Если поле черное
{
if (dist_cm > 40) //Если дистанция до объекта больше 40 см то
{
// поиск цели
if (turn == 1) {
go_right(); //Поворачиваем направо если ранее сработал левый
} else {
go_left(); //иначе поворачиваем налево
}
}
else
{
go_forward(); //если поймана цель атакуем
tone(10, 300, 250); // сигналим
digitalWrite(7, HIGH); //зажигаем
digitalWrite(8, LOW);
}
}
}
Есть возможность сворачивать код между скобками, так можно получше понять, что как работает. В меню "Файл/Настройки/Включить сворачивание кода" галочку поставьте, и можно пользоваться.