Добрый вечер. Переписал код на библиотеку AFMotor.
Машинка едет но недолго. потом как будто зависает приложение. Т.е. это выглядит так: Заливаю код в ардуино, включаю приложение на телефоне, подключаюсь к машинке, сдвигаю джойстик в какое либо положение и через 3-8 секунд в таком положении программа виснет (джойстик как будто прилипает к краю). Соответственно машинка зависает в том направлении вращения колёс в котором программа зависла.
Помогите разгрести это всё, очень хочется на "Джойстике" покататься. Нашёл на другом сайте, для такого-же шилда как у меня машинку, сделал, едет без проблем, но там используется программа на кнопках. Т.е. нажал на кнопку и машинка едет в соответствии с нажатой кнопкой, пока не нажмёшь другую кнопку или стоп.
Лишние (закоментированные) строки убрал чтобы было покороче.
Это тот код что без ошибок заливается, но приводит к зависанию.
#define MOTOR_MAX 255 // максимальный сигнал на мотор (max 255)
#define JOY_MAX 40 // рабочий ход джойстика (из приложения)
#define PARSE_AMOUNT 2 // число значений в массиве, который хотим получить
int intData[PARSE_AMOUNT]; // массив численных значений после парсинга
boolean recievedFlag;
int dutyR, dutyL;
int signalX, signalY;
int dataX, dataY;
int val; // освобождаем память в контроллере
#include <AFMotor.h> // Подключаем библиотеку для работы с шилдом
AF_DCMotor motorL(3);// Подключаем моторы к клеммникам M3
AF_DCMotor motorR(4);// Подключаем моторы к клеммникам M4
#include <SoftwareSerial.h>
SoftwareSerial btSerial(0, 1); // TX, RX
void setup() {
Serial.begin(9600);
btSerial.begin(9600);
motorL.setSpeed(255);
motorL.run(RELEASE);
motorR.setSpeed(255); // Задаем максимальную скорость мотора
motorR.run(RELEASE);
//PWMfrequency(IN2, 1); // 31 кГц
}
void loop() {
parsing(); // функция парсинга
if (recievedFlag) { // если получены данные
recievedFlag = false;
dataX = intData[0];
dataY = intData[1];
/*for (byte i = 0; i < PARSE_AMOUNT; i++) { // выводим элементы массива
Serial.print(intData); Serial.print(" ");
} Serial.println();*/
Serial.print(dutyR);
Serial.print(" ");
Serial.println(dutyL);
}
if (dataX == 0 && dataY == 0) { // если мы в "мёртвой" зоне
motorR.run(RELEASE); // не двигаемся
motorL.run(RELEASE);
dutyR = 0;
dutyL = dutyR;
} else {
signalY = map((dataY), -JOY_MAX, JOY_MAX, -MOTOR_MAX, MOTOR_MAX); // сигнал по У
signalX = map((dataX), -JOY_MAX, JOY_MAX, -MOTOR_MAX / 2, MOTOR_MAX / 2); // сигнал по Х
dutyR = signalY + signalX;
dutyL = signalY - signalX;
if (dutyR > 0) motorR.run(FORWARD);
else motorR.run(BACKWARD);
if (dutyL > 0) motorL.run(FORWARD);
else motorL.run(BACKWARD);
dutyR = constrain(abs(dutyR), 0, MOTOR_MAX);
dutyL = constrain(abs(dutyL), 0, MOTOR_MAX);
}
motorR.run(dutyR);
motorL.run(dutyL);
}
boolean getStarted;
byte index;
String string_convert = "";
void parsing() {
if (btSerial.available() > 0) {
char incomingByte = btSerial.read(); // обязательно ЧИТАЕМ входящий символ
if (getStarted) { // если приняли начальный символ (парсинг разрешён)
if (incomingByte != ' ' && incomingByte != ';') { // если это не пробел И не конец
string_convert += incomingByte; // складываем в строку
} else { // если это пробел или ; конец пакета
intData[index] = string_convert.toInt(); // преобразуем строку в int и кладём в массив
string_convert = ""; // очищаем строку
index++; // переходим к парсингу следующего элемента массива
}
}
if (incomingByte == '$') { // если это $
getStarted = true; // поднимаем флаг, что можно парсить
index = 0; // сбрасываем индекс
string_convert = ""; // очищаем строку
}
if (incomingByte == ';') { // если таки приняли ; - конец парсинга
getStarted = false; // сброс
recievedFlag = true; // флаг на принятие
}
}
}