Я строю робота, который работает с двигателями 4DC, и у меня есть небольшие проблемы при подключении к нему Bluetooth. Когда я запускаю тестовый код для этих двигателей без Bluetooth, двигатели работают на полную мощность, никаких проблем. Вот код теста только для двигателей:
#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include "utility/Adafruit_PWMServoDriver.h"
// Create the motor shield object with the default I2C address
Adafruit_MotorShield AFMS = Adafruit_MotorShield();
// Select which 'port' M1, M2, M3 or M4.
Adafruit_DCMotor *M1 = AFMS.getMotor(1);
Adafruit_DCMotor *M2 = AFMS.getMotor(2);
Adafruit_DCMotor *M3 = AFMS.getMotor(3);
Adafruit_DCMotor *M4 = AFMS.getMotor(4);
void setup() {
AFMS.begin(); // create with the default frequency 1.6KHz
//AFMS.begin(1000); // OR with a different frequency, say 1KHz
// turn on motor
M1->setSpeed(255);
M2->setSpeed(255);
M3->setSpeed(255);
M4->setSpeed(255);
M1->run(RELEASE);
M2->run(RELEASE);
M3->run(RELEASE);
M4->run(RELEASE);
Serial.begin(9600); // set up Serial library at 9600 bps
}
void loop()
{
M1->run(FORWARD);
M2->run(FORWARD);
M3->run(FORWARD);
M4->run(FORWARD);
delay (5000);
M1->run(BACKWARD);
M2->run(BACKWARD);
M3->run(BACKWARD);
M4->run(BACKWARD);
delay (5000);
}
Когда я подключаю Bluetooth и запускаю приведенный ниже код, двигатели работают с таким низким крутящим моментом, что едва может двигать робота.
#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include "utility/Adafruit_PWMServoDriver.h"
// Create the motor shield object with the default I2C address
Adafruit_MotorShield AFMS = Adafruit_MotorShield();
// Select which 'port' M1, M2, M3 or M4.
Adafruit_DCMotor *M1 = AFMS.getMotor(1);
Adafruit_DCMotor *M2 = AFMS.getMotor(2);
Adafruit_DCMotor *M3 = AFMS.getMotor(3);
Adafruit_DCMotor *M4 = AFMS.getMotor(4);
const int BTState = 11;
int state;
void setup() {
AFMS.begin(); // create with the default frequency 1.6KHz
//AFMS.begin(1000); // OR with a different frequency, say 1KHz
// turn on motor
M1->setSpeed(255);
M2->setSpeed(255);
M3->setSpeed(255);
M4->setSpeed(255);
M1->run(RELEASE);
M2->run(RELEASE);
M3->run(RELEASE);
M4->run(RELEASE);
pinMode(BTState, INPUT);
Serial.begin(9600); // set up Serial library at 9600 bps
}
void loop()
{
//Stop car when connection lost or bluetooth disconnected
if (digitalRead(BTState) == LOW) {
state = 'S';
}
//Save income data to variable 'state'
if (Serial.available() > 0) {
state = Serial.read();
}
//If state is equal with letter 'F', car will go forward!
if (state == 'F') {
M1->run(FORWARD);
M2->run(FORWARD);
M3->run(FORWARD);
M4->run(FORWARD);
}//If state is equal with letter 'B', car will go backward
else if (state == 'B') {
M1->run(BACKWARD);
M2->run(BACKWARD);
M3->run(BACKWARD);
M4->run(BACKWARD);
}
//If state is equal with letter 'S', stop the car
else if (state == 'S') {
M1->run(RELEASE);
M2->run(RELEASE);
M3->run(RELEASE);
M4->run(RELEASE);
}
}
Вот фотографии моей установки:
Я подключил все правильно, когда дело доходит до Bluetooth, но я не понимаю, почему, когда я запускаю команду «Вперед» или «Назад» с моего телефона или компьютера через Bluetooth, я не получаю полную скорость двигателей постоянного тока. почти кажется, что я не получаю достаточно энергии для них.
Есть идеи, что я делаю не так?
Хорошо, я понял, в чем проблема.
Именно в этой части кода:
//If state is equal with letter 'S', stop the car
else if (state == 'S') {
M1->run(RELEASE);
M2->run(RELEASE);
M3->run(RELEASE);
M4->run(RELEASE);
}
Так что приложение, которое у меня есть, передает данные каждые 50 мс по Bluetooth. Таким образом, между этими моментами Bluetooth выполняет приведенный выше код. Итак, что мне нужно добавить, так это утверждение, что если состояние Bluetooth «S», то, скажем, больше 1, чем выполнить этот код выше. Состояние «S» означает, что ни одна кнопка в приложении не нажата, и это означает остановку робота.
Можете ли вы помочь мне написать ту строку кода, которая скажет, если состояние S больше 1, чем выполнить оператор else?
Спасибо,
славянин
Других решений пока нет …