ARDUINO Bluetooth машинка. Обсуждение проекта

Karambol

✩✩✩✩✩✩✩
28 Ноя 2018
3
0
Здравствуйте. В приложении на смартфоне формируются пакеты с координатами джойстика вида $X Y; . Далее пакет отправляется на Ардуину, где считывается и разлаживается в массив функцией парсинга. Вопрос: Как сформировать подобный пакет в какой-нибудь консоли на андроид. Нужно отсылать такие пакеты с буквами вместо координат, для смены режимов работы машины, и чтоб они не конфликтовали с функцией парсинга, ибо обычное обращение к блютуз затруднено этой самой функцией. Подскажите как это сделать, потому как добавлять кнопки на все случаи в апк прогу джойстика как-то неохота, впрочем это тоже вариант.
 

Саня_Личность

✩✩✩✩✩✩✩
3 Мар 2019
1
0
Привет. Подскажите что лучше использовать в качестве ходовой 4 колеса или гусли?
Хочу сделать подобную машинку для прокладки кабеля под навесным потолком, поэтому ищу вариант с максимальной проходимостью и мощностью.
 

HELP

✩✩✩✩✩✩✩
13 Мар 2019
5
0
Привет. Подскажите что лучше использовать в качестве ходовой 4 колеса или гусли?
Хочу сделать подобную машинку для прокладки кабеля под навесным потолком, поэтому ищу вариант с максимальной проходимостью и мощностью.
Гусли дают выигрыш в проходимости, но проигрывают колёсам в поворотах(на гуслях заметно хуже идёт поворот в движении, а не в стоячем положении)
 

egoruh

✩✩✩✩✩✩✩
31 Мар 2019
1
0
у меня повербанки уходят в защиту если повышается нагрузка на двигатели, например если машинка едет в горку или просто придержать колеса рукой. даже при незначительном разряде повербанка подобное поведение начинается и на прямых участках, особенно в поворотах. и пока не передернешь питание повербанка- машинка с места не тронется. питание на моторы у меня от повербанка, а питание ардуинки и блютуз модуля от батареек, земли соединины.

повербанки пробовал 2 разных, один 5 аккумов+солнечная панель, другой на 2 аккумулятора
 

Jekabo

✩✩✩✩✩✩✩
30 Мар 2019
2
0
Добрый вечер. У меня мотор шилд download.jpg
и ардуино уно в проекте будет использоваться, радикально ли поменяется скетч если использовать такой шилд?
 

Karambol

✩✩✩✩✩✩✩
28 Ноя 2018
3
0
Добрый вечер. У меня мотор шилд Посмотреть вложение 2986
и ардуино уно в проекте будет использоваться, радикально ли поменяется скетч если использовать такой шилд?
Будет использована другая библиотека для управления мостами шилда, а следовательно и немного другие команды, но их порядок и положение в коде будет соответствовать прежним строкам для изначального шилда, правда нужно будет вместо 1й команды использовать 2 (на задне и переднее колесо), либо цеплять 2 двигателя на 1 разьем. И еще я советовал бы в случаи проблем с блютузом цеплять его на тх2 и rх13 порты, так как их шилд не задействует в работе. Делал на таком же для 4 отдельных колес с блютуз модулем нс-6 вроде так звался, там 6 выводов у него вместо 4х как у нс-5.
 

Jekabo

✩✩✩✩✩✩✩
30 Мар 2019
2
0
Добрый вечер. Переписал код на библиотеку 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; // флаг на принятие
}
}
}
 

Karambol

✩✩✩✩✩✩✩
28 Ноя 2018
3
0
Добрый вечер. Переписал код на библиотеку 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; // флаг на принятие
}
}
}
Если еще актуально... Зависает само приложение на телефоне? Просто само приложение посылает лишь текущие координаты ХУ а за движение отвечает логика зашитая в машинку. Если машина едет в нужном направлении, хоть даже и залипая при этом, то все нормально. А вот если залипает сам джойстик на экране смартфона тогда проблема в приложении. Знаю, немного бесполезно, но я делал эту машинку на таком шилде 4х колеса, и она прекрачно работала. Я переделывал под себя и приложение и скетч. Твою сводку с кодом еще не смотрел, но не думаю, что там есть какой-либо огрех.
Я так понимаю блютуз у тебя подключен на 0 и 1 порты? Попробуй переключить на 2 и 13... Этот шилд рассчитан на 4 двигателя там 4 Н-моста. Он забирает себе на работу все порты кроме 2-го и 13-го. Возможно, когда ты подаешь сигнал с телефона, координата считывается, но тогда на шилд подается управляющий сигнал с 1-го порта для управления двигателем, который создает коллизию, искажая сигнал с блютуза. К тому же, на 2 13 портах блютуз не мешает заливать скетчи через шнур и позволяет юзать мониторинг в IDE. Можно выводить координаты которые принимаются с блютуза и выводить их в реальном времени. Если залипание в программе, то это будет прекрасно видно на мониторе.
 
Последнее редактирование:

andy887

✩✩✩✩✩✩✩
20 Апр 2019
1
0
почему нельзя обрезать старые провода (к шаговым двигателям) и их припаять к ардуино?
 

zhora_kk

✩✩✩✩✩✩✩
7 Май 2019
1
0
Gyver привет.
Есть небольшая проблема с твоим приложением я хочу переделать твой код под 4 мотора - но приложение под андройт уже скомпилировано и импорт в санкбл нету -https://community.thunkable.com/t/how-to-upload-aia-file-in-thunkable-x/33765
Ты можешь выложить или скриншот своего скретч проекта или помочь разобраться в сопряжении с другими приложениями.
Как я понял то привязывая к жругому приложению нужно отправлять цифры на приемник + начало/ конец/ строки.
 

slavikzh

✩✩✩✩✩✩✩
16 Ноя 2019
1
0
в Thunkable Х нет возможности импортировать aia. А для Thunkable Clasic регистрация закрыта. Получается .aia файлы в проектах безполезны для новых пользователей.
 

ska_ska

✩✩✩✩✩✩✩
4 Дек 2019
3
0
ребят, а можно ли добавить свет перед-зад и включать с приложения?
 

sannikovkuk

✩✩✩✩✩✩✩
9 Янв 2020
1
0
как новичок в этом деле прошу помощи с переходом от драйвера mx 1508 на l298n, что куда подключать и как изменить скечь. Заранее спасибо.
 

Эмануил

✩✩✩✩✩✩✩
26 Май 2020
1
0
Здравствуйте, хотел собрать машинку на радиоуправлении из видео "Блютуз танк повербанк", собрал по схеме и запитал от аккумуляторов через повышающий модуль. Когда в приложении хочу начать ехать вылезает Error 516: Unable to write: Broken pipe, хочу спросить в чем может быть ошибка.
 

Буратино

✩✩✩✩✩✩✩
2 Авг 2020
13
0
Супер! Вот это то, что нужно инвалидам. Но нужен механический (аналоговый) джойстик.