Доброго всем дня. Появилась серьезная проблема при соеденении всех элементов в одно целое (снизу вверх): Гусеничная платформа Rover 5 + Arduino Uno + Motor Shield + Troyka Shield + 2*Инфракрасный датчик препятствий. Трактор без датчиков бегает отлично, перелезает через тапки, буксует упершись в стену и т.д. Датчики отдельно тоже работают, они у меня стоят в 20см друг от друга (ширина ровера), закрываешь то один рукой, то второй - отладчик показывает всё как есть. Теперь запускаем моторы, и как только датчики начинают подавать сигналы в troyka_shield, сигнал проходит насквозь motor_shield и приходит в Uno - там обрабатывается, и из Unо соответствующий управляющий сигнал идет в motor_shield, а потом на моторы - происходит что-то непонятное... Вот пример: показания с левого и правого датчиков delay(1000): left = 0 right = 1 left = 0 right = 1 left = 0 right = 1 left = 1 right = 1 left = 0 right = 1 left = 0 right = 1 left = 1 right = 1 left = 1 right = 1 left = 1 right = 1 хотя датчики были направлены в небо, я пробовал закрывать правый датчик - но он никак не реагировал. Запускаем другой скетч(где моторы не используются) - и датчики снова ведут себя адекватно. Вот листинг: Код (C): int PIN_speed_left = 5; int PIN_course_left = 4; int PIN_speed_right = 6; int PIN_course_right = 7; int PIN_sensor_left = 10; int PIN_sensor_right = 12; void setup() { pinMode(PIN_course_left, OUTPUT); //моторы, направление и скорость. pinMode(PIN_course_right, OUTPUT); pinMode(PIN_speed_left, OUTPUT); pinMode(PIN_speed_right, OUTPUT); pinMode(PIN_sensor_left, INPUT); //датчики препятствий pinMode(PIN_sensor_right, INPUT); Serial.begin(9600); //Для отладки } void GO (boolean course_left, boolean course_right, int speed_left, int speed_right) { digitalWrite(PIN_course_left, !course_left); // провода к моторам не правильно подсоединили!!!!! digitalWrite(PIN_course_right, course_right);// нужно поменять местами питание и землю на левом моторе. analogWrite(PIN_speed_left, speed_left); analogWrite(PIN_speed_right, speed_right); delay(200); } void STOP () { analogWrite(PIN_speed_left, 0); analogWrite(PIN_speed_right, 0); delay(200); } void loop() { boolean left = digitalRead(PIN_sensor_left); //Если 1, значит путь свободен, можно ехать, boolean right = digitalRead(PIN_sensor_right); //если 0, прохода нет. Serial.print("left = "); Serial.print(left); // Для отладки датчиков Serial.print(" right = "); Serial.println(right); delay(2000); if (left && right) { // Вперед GO(HIGH, HIGH, 255, 255); } if (!left && !right) { //останавливаемся STOP(); //крутимся на месте, будем искать выход GO(HIGH, LOW, 255, 255); } if (left && !right) { // надо повернуть левее, левую сторону останавливаем, правую разгоняем. GO(HIGH, HIGH, 0, 255); } if (!left && right) { // надо повернуть правее, правую сторону останавливаем, левую разгоняем. GO(HIGH, HIGH, 255, 0); } } Причем эта программа в первый свой запуск отработала отлично, трактор поездил по кухне, аккуратно объезжая препятствия, а потом началось "то в лес, то по дрова". Питание моторов от 6 аккумуляторов в сумме 7,5 вольт. Питание ардуины от кроны на 9 вольт, либо от USB(хожу за трактором с ноутбуком). Менял пины подключения датчиков, почти все варианты перебрал - не сработало. P.S. убрал тройку_шилд и собрал на макетке - не помогло. Может кто сталкивался с такой проблемой? Можете подсказать что происходит?
Значит так, проблема была вот в чём: не хватало питания для датчиков (5 В, 100 мА - каждый), поэтому иногда они показывали что вздумается. Отказался от тройки_шилд, пусть пока в сторонке полежит. Запитал весь бутерброд от 6 аккумуляторов, которые стоят в Ровере, на моторшилде есть перемычка такая PWRIN - VIN. А датчики подключил к разъёмам моторшилда: левый на Vin-GND-10pin правый на 5V-GND-12pin Да, конечно, провода теперь торчат в разные стороны, но с тройкой_шилд датчики работают черт знает как ((. Если теперь кто-то столкнётся с такой проблемой, то помните, что бывают очень энергозатратные датчики, и лучше их питание выводить на отдельную цепь. Ардуинка потянет один, а вот два и больше уже с трудом.