Привет всем, сделал робота на мега, с платой мотор шилд L293D, с дальномером, и bluetoohth-модулем hc-06. Проблема вот в чем: Иногда мой телефон теряет соединение с роботом даже когда расстояние 20 см от робота к тел. В чем может быть проблема? Когда подключал bluetoohth-модул к мега без мотор-шилда и дальномера, все работало норм без потери соединения. И вот думаю может ли это быть из-за нехватки тока? Питание у меня 4 х 1.5В
Может быть от нехватки тока, может от проседания питания в момент старта двигателей (та же нехватка тока, но кратковременная), может от наводок от двигателей. Сталкивался с подобной проблемой сам. У меня, похоже, было второе, поскольку все пропадания были синхронизированны с началом движения двигателей. Решил конденсатором 10 мкФ параллельно пинам питания модуля.
Нашел в чем причина(ну как): Когда даю команду "w" (вперед)(через bluetooth terminal с телефона) 1 и 2 двиг крутятся вперед, потом если дать команду "s" (назад) двигатели остановились и связь потеряна с роботом. Но если сделать паузу то есть после "w" дать команду "p"(у меня при этой команде оба двигателя переходят в режим RELEASE) и только потом дать команду "s" все норм. Короче просто паузу делаю. Но уже есть новая проблема Хочу сделать чтобы при команде "o" мой робот двигался вперед и когда расстояние менее 20 см нужно чтобы он сдал задний ход, потом развернулся и продолжил двигаться вперед. Написал код но если при отправке команды расстояние более 20см то он просто едет вперед даже когда он уже у стены и расстояние 5 см а если более то он едет назад потом поворачивает и повторяет. И не знаю что делать код ниже Код (C++): #include <AFMotor.h> // Подключаем библиотеку для управления двигателями char blueToothVal; //value sent over via bluetooth char lastValue; //stores last state of device (on/off) AF_DCMotor motor1(1); //канал М1 на Motor Shield — задний левый AF_DCMotor motor2(2); //канал М1 на Motor Shield — задний левый const int Trig = 30; const int Echo = 34; void setup() { Serial.begin(9600); pinMode(Trig, OUTPUT); pinMode(Echo, INPUT); pinMode(13,OUTPUT); } unsigned int time_us=0; unsigned int distance_sm=0; void loop() { motor1.setSpeed(255); //Устанавливаем скорость 100% (0-255) motor2.setSpeed(255); //Устанавливаем скорость 100% (0-255) digitalWrite(Trig, HIGH); // Подаем сигнал на выход микроконтроллера delayMicroseconds(10); // Удерживаем 10 микросекунд digitalWrite(Trig, LOW); // Затем убираем time_us=pulseIn(Echo, HIGH); // Замеряем длину импульса distance_sm=time_us/58; // Пересчитываем в сантиметры if(Serial.available()>0); {//if there is data being recieved blueToothVal=Serial.read(); //read it } if (blueToothVal=='w') { motor1.run(FORWARD); motor2.run(FORWARD); if (lastValue!='w') Serial.println(F("w")); lastValue=blueToothVal; } else if (blueToothVal=='s') { motor1.run(BACKWARD); motor2.run(BACKWARD); if (lastValue!='s') Serial.println(F("s")); lastValue=blueToothVal; } else if (blueToothVal=='d') { motor1.run(FORWARD); motor2.run(BACKWARD); if (lastValue!='d') Serial.println(F("d")); lastValue=blueToothVal; } else if (blueToothVal=='a') { motor1.run(BACKWARD); motor2.run(FORWARD); if (lastValue!='a') Serial.println(F("a")); lastValue=blueToothVal; } else if (blueToothVal=='p') { motor1.run(RELEASE); motor2.run(RELEASE); if (lastValue!='p') Serial.println(F("p")); lastValue=blueToothVal; } else if (blueToothVal=='o') { if (distance_sm<20) // Если расстояние менее 20 сантиметром { motor1.setSpeed(170); //Устанавливаем скорость motor2.setSpeed(170); motor1.run(BACKWARD); motor2.run(BACKWARD); delay(1000); motor1.setSpeed(255); //Устанавливаем скорость 100% (0-255) motor2.setSpeed(255); motor1.run(FORWARD); motor2.run(BACKWARD); delay(200); } else { motor1.run(FORWARD); motor2.run(FORWARD); } if (lastValue!='o') Serial.println(F("o--Auto")); Serial.println(distance_sm); // Выводим на порт lastValue=blueToothVal; } } Как вы сделали свой робот? Можно скетч?
Возможно, что проблема в том, что код, проверяющий расстояние и выполняющий действие перед препятствием, выполняется лишь однажды, когда от БТ приходит 'o' в переменную blueToothVal. А его надо выполнять постоянно до отмены команды, т.е. пока в lastValue находится 'o'. У меня не робот, у меня просто дистанционно управляемая тележка с достаточно примитивным собственным ПО, получает даже не команды, а скорость и разницу в скорости правого и левого мотора. Причем от БТ пришлось отказаться в пользу APC-220, поскольку ноутбук постоянно терял контакт с модулем и не желал его восстанавливать. Да и с дальнобойностью у пары APC-220 получше как-то получилось.
И как это сделать не знаете случайно? А вообще думаю может сделать режим (mode) только не знаю как, просто увидел то что тут используют .
Посмотрел внимательнее код. Вопрос на засыпку. Как осуществляется управление, в смысле с какого устройства и из какой программы? В теории, если передается только управляющая команда, т.е. один символ, проблемы быть вроде не должно (по крайней мере не вижу навскидку). А если за управляющим символом идет что-то еще, например, какие-то данные или символ перевода строки, то, естественно, на следующем круге система прочитает новый символ и "забудет" про отданную команду 'o'.
Через телефон (андроид), через bluetooth terminal. Я думал может написать простую программу, но было лень.