Не работают сонары с двигателями
- Войдите на сайт для отправки комментариев
Ср, 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 пина, теперь скетч такой(с раскомментированными строчками):
#include "AFMotor.h" #include "Wire.h" #include "Ultrasonic.h" int ADDR = 30; bool autonom = false; int val; int LED = 13; 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, 16); 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_3 = us_3.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(); } } } }Но двигатели все же не работают.
На второй ардуинке этот код:
#include "Wire.h" #include "AFMotor.h" int val; int ADDR = 30; 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); void setup() { Wire.begin(30); // join i2c bus with address #8 Serial.begin(9600); Wire.onReceive(receiveEvent); // register event } void loop() { } // function that executes whenever data is requested by master // this function is registered as an event, see setup() void receiveEvent(int howMany) { while (Wire.available()) // loop through all but the last { char cmd = Wire.read(); // receive byte as a character motor1.setSpeed(200); motor2.setSpeed(200); motor3.setSpeed(200); motor4.setSpeed(200); if (cmd == 'W') { motor1.run(BACKWARD); motor2.run(FORWARD); motor3.run(FORWARD); motor4.run(BACKWARD); Serial.print("W2"); } if (cmd == 'S') { motor1.run(FORWARD); motor2.run(BACKWARD); motor3.run(BACKWARD); motor4.run(FORWARD); Serial.print("S2"); } if (cmd == 'C') { motor1.run(RELEASE); motor2.run(RELEASE); motor3.run(RELEASE); motor4.run(RELEASE); Serial.print("C2"); } if (cmd == 'A') { motor1.run(FORWARD); motor2.run(FORWARD); motor3.run(FORWARD); motor4.run(FORWARD); Serial.print("A2"); } if (cmd == 'D') { motor1.run(BACKWARD); motor2.run(BACKWARD); motor3.run(BACKWARD); motor4.run(BACKWARD); Serial.print("D2"); } } }(на всякий случай).
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(в которых расстояние вычисляется) не работает. Извините за неточности:)