Не работают сонары с двигателями
- Войдите на сайт для отправки комментариев
Ср, 27/01/2016 - 21:56
Есть скетч:
#include "AFMotor.h" #include "Wire.h" // #include "Ultrasonic.h" int ADDR = 30; bool autonom = false; int val; int LED = 13; //int d_3 = 20; AF_DCMotor motor1(1); //канал М1 на Motor Shield — задний левый AF_DCMotor motor2(2); //канал М2 на Motor Shield — задний правый AF_DCMotor motor3(3); //канал М3 на Motor Shield — передний левый AF_DCMotor motor4(4); //Ultrasonic us_1(14, 15); //Ultrasonic us_2(16, 17); //Ultrasonic us_3(3, 4); void setup() { pinMode(14, OUTPUT); digitalWrite(14, HIGH); pinMode(15, INPUT); // pinMode(16, OUTPUT); // digitalWrite(16, HIGH); // pinMode(17, INPUT); Serial.begin(9600); pinMode(LED, OUTPUT); Wire.begin(); } void loop() { //int d_1 = us_1.Ranging(CM); // get distance // int d_2 = us_2.Ranging(CM); Wire.requestFrom(ADDR, 1); digitalWrite(LED, HIGH); motor1.setSpeed(200); motor2.setSpeed(200); motor3.setSpeed(200); motor4.setSpeed(200); if (Serial.available()) { val = Serial.read(); // if (!autonom) { // При символе "W" if (val == 'W') { Wire.beginTransmission(ADDR); // передача для устройства #30 Wire.write("W"); // отправка байта val Wire.endTransmission(); /* if (d_1 <= 1) { motor3.run(BACKWARD); motor4.run(BACKWARD); } else { motor3.run(RELEASE); motor4.run(RELEASE); }*/ } if (val == 'C') { motor1.run(RELEASE); motor2.run(RELEASE); motor3.run(RELEASE); motor4.run(RELEASE); Wire.beginTransmission(ADDR); // передача для устройства #30 Wire.write("C"); // отправка байта val Wire.endTransmission(); } // При символе "S" if ( val == 'S') { Wire.beginTransmission(ADDR); // передача для устройства #30 Wire.write("S"); // отправка байта val Wire.endTransmission(); /* if (d_1 <= 1) { motor3.run(FORWARD); motor4.run(FORWARD); } else { motor3.run(RELEASE); motor4.run(RELEASE); }*/ } if (val == 'A') { Wire.beginTransmission(ADDR); // передача для устройства #30 Wire.write("A"); // отправка байта val Wire.endTransmission(); } if (val == 'D') { Wire.beginTransmission(ADDR); // передача для устройства #30 Wire.write("D"); // отправка байта val Wire.endTransmission(); } if (val == '1') { motor1.run(FORWARD); } if (val == '2') { motor1.run(BACKWARD); } if (val == '3') { motor2.run(FORWARD); } if (val == '4') { motor2.run(BACKWARD); } if (val == '5') { motor1.run(RELEASE); motor2.run(RELEASE); motor3.run(RELEASE); motor4.run(RELEASE); } // } /* if (val == 'V') { autonom = !autonom; } if (autonom) { if (d_3 >= 19) { Wire.beginTransmission(ADDR); // передача для устройства #30 Wire.write("W"); // отправка байта val Wire.endTransmission(); } if (d_3 <= 19) { Wire.beginTransmission(ADDR); // передача для устройства #30 Wire.write("D"); // отправка байта val Wire.endTransmission(); } } d_3 = us_3.Ranging(CM);*/ } }
При раскомментировании закомментированных строк :), отвечающих за подключение сонаров, двигатели перестают работать. (В общем, работают отдельно, либо сонары, либо двигатели.) В чем проблема и как можно исправить? Заранее спасибо за ответы. P.S. Если Вам нужна какая-то дополнительная информация, то допишу.
Сходу тупое решение: взять вторую ардуину и запрограммить там одно, здесь другое, между ними передавать нужную инфу, по i2c там или uart. Мб это у меня от пересмотра Full metall alchemist - Шу Такер, химеры... Изврат.. но работает.
У меня их уже и так две:) И на обеих работа с двигателями. Просто это вообще странно, что не работает
Они у Вас подрались за пины.
Первое, что очевидно - Вы используете в строке 16 пин 4 для Unltrasonic, а библиотека AFMotor использует его же для MOTORCLK. Остальное смотреть не стал, но Вы проверьте всё внимательно.
Не работает даже если просто подключить библиотеку ultrasonic. То есть у меня рабочий код (без сонаров), но как только я прописываю
, то моторы сразу перестают работать.
Не работает даже если просто подключить библиотеку ultrasonic. То есть у меня рабочий код (без сонаров), но как только я прописываю
, то моторы сразу перестают работать.
Т.е., вот в том скетче, что у Вас приведёт, если раскомментировать только одну строку - всё перестаёт работать?
Мне стало интересно.
Давайте так. Это действительно точно тот скетч с единственной раскоменитрованной строкой? Если нет (важна ЛЮБАЯ мелочь), то выложите ТОТ скетч.
И ещё, выложите Вашу версию файлов Ultrasonic.h и Ultrasonic.cpp - именно ту, что используется, а то может у меня другая. Я на всё это посмотрю. Чудес не бывает, найдём причину.
Странно, теперь и с этой строчкой работает. Оо
Поправил замечание насчет 4 пина, теперь скетч такой(с раскомментированными строчками):
Но двигатели все же не работают.
На второй ардуинке этот код:
(на всякий случай).
Ultrasonic.cpp
Ultrasonic.h
Тот пин, что Вы выложили (первый) работает или нет? И что нужно закомментирровать / раскомментировать. чтобы он перестал (начал) работать. А то я уже запутался.
Если заккоментировать работу с ультрасоником, то всё начинает работать
Даже если не закомментировано #include "Ultrasonic.h"
Номера строк, пожалуйста. точно. Что закомментировать. По минимуму!. Т.е. поэкспериментируйте и оставьте как можно больше строк в покое. Что по минимуму надо закомментировать, чтобы заработало. Номера.
Как только закомментировал вычисление расстояния( строки 30-31), то всё заработало. До этого он не реагировал, но секунд через 10 увидел команду, проехал сантиметров пять и снова затих. Такое чувство, что вычисление расстояния "перебивает" выполнение других процессов. P.S. Также закомментировал строки: 43, 49-55, 73-79, 110-126.
Артём, ну так нельзя, ну, говорите Вы чётко, ну я же не могу ничего видеть и всё только через Ваши слова воспринимаю. А Вы что мне пишете: "Как только закомментировал вычисление расстояния( строки 30-31), то всё заработало. ... Также закомментировал строки: 43, 49-55, 73-79, 110-126". Так, блин, надо комментировать 43, 459-55 ... чтобы заработало? Или чтобы заработало достаточно только 30-31? Ну, пожалуйста, скажите Вы наконец, чётко и понятно!
Конечно и 30-31 и 49-55, 73-79. Всё вместе. Там ведь в if-ах проверка расстояния, а она без строк 30-31(в которых расстояние вычисляется) не работает. Извините за неточности:)