Перемещение и сохранение положений сервопривода через bluetooth
Я пытаюсь запрограммировать роботизированную руку 4DOF (используя 4 серводвигателя). Я хотел бы перемещать сервоприводы с помощью приложения для Android с помощью Bluetooth (HC-05).
Я разработал приложение, в интерфейсе которого есть 7 кнопок (Вверх, Вниз, Влево, Вправо, Вперед, назад, Сохранить) и поле, в котором вы можете вводить текст с помощью клавиатуры (я приложил скриншот интерфейса приложения).
До сих пор я пытался управлять только кнопками вверх (которая определяет "U" через Bluetooth для Arduino) и вниз (которая определяет "D"), которые перемещали бы сервопривод, предназначенный для вертикальных движений руки. Этот код работает довольно хорошо, хотя приложение иногда выходит из строя, но я все еще не могу понять причину. Используя функцию println (), я вижу, что Arduino считывает на входе Bluetooth символ "⸮", что это значит? Я использую скорость передачи данных в бодах 9600.
Затем я хотел бы сделать следующее: как только я переместил сервопривод и достиг определенного положения, я хотел бы сохранить положение двигателя в массив. Чтобы разрешить сохранение нескольких позиций, после нажатия кнопки сохранения я хочу, чтобы Arduino ожидал другого ввода от Bluetooth (чтобы он ожидал нажатия другой кнопки из приложения или ввода чего-либо в выделенную панель с клавиатуры), которая определяет позицию в массиве, в котором я сохраняю позицию сервопривода (например: я ввожу '2' в выделенную панель приложений, и Arduino, который ожидает ввода, получая его, сохраняет последнюю позицию сервопривода в массив servo01pos [2]). Я написал код "case ('S')", который довольно длинный и неэффективный, но, по крайней мере, он работает.
Заранее благодарю всех, кто мне поможет.
Джаммарко
#include <SoftwareSerial.h>
SoftwareSerial bluetooth(10, 11); // BlueTooth RX, TX
#include <Servo.h> // библиотека сервоприводов
unsigned long timestampSend = 0; // Период ожидания записи BT
String readString;
Servo servo01; //
byte pos01 = 90;
#define ANGLE_STEP 10 // шаги 10 градусов
int servo01pos\[50\];
char data;
char button;
int x = 1;
void setup() {
Serial.begin(9600);
bluetooth.begin(9600);
delay(1000);
Serial.println("Ready ...");
Serial.println ("\n");
servo01.attach(12);
servo01.write(pos01);
}
void loop() {
do {
if (bluetooth.available() > 0) {
Serial.println(data);
do {
delay(500);
data = bluetooth.read();
Serial.println(data);
} while (bluetooth.available() > 0);
if (data == 'U' || data == 'D' || data == 'L' || data == 'R' || data == 'F' || data == 'B' || data == 'S' || data == 'X') {
Serial.print("Received value: ");
Serial.println(data);
switch (data) {
case ('S'): //СОХРАНИТЬ
Serial.println("Enter the button you desire to set...");
do {
data = 254;
bluetooth.listen();
button = bluetooth.read();
if (button == '0' || button == '1' || button == '2') {
data = 'S';
}
} while (data != 'S');
Serial.println("SAVING POSITIONS ...");
if (button == '0') {
servo01pos\[0\] = pos01;
} else if (button == '1') {
servo01pos\[1\] = pos01;
} else if (button == '2') {
servo01pos\[2\] = pos01;
}
servo01.write(pos01);
Serial.println(button);
Serial.println(pos01);
Serial.println(servo01pos\[1\]);
Serial.println(servo01pos\[2\]);
Serial.println(servo01pos\[0\]);
//}
break;
case ('U'):
Serial.println("UP");
if (pos01 <= 180 - ANGLE_STEP) {
pos01 = pos01 + ANGLE_STEP;
servo01.write(pos01);
Serial.println(pos01);
delay(20);
Serial.println(data);
}
break;
case ('X'):
Serial.println("EXIT");
x = 0;
break;
}
}
}
} while (x != 0) ;
}
@Giammarco, 👍2
Обсуждение1 ответ
Символ "⸮" присваивался каждый раз, когда происходило отключение электроэнергии. Таким образом, достаточно использовать внешний источник питания для питания bluetooth и сервоприводов (Arduino не может одновременно питать все эти модули).
Как уже упоминал Крисл, вы должны отметить свой ответ как принятый., @timemage
- Как объединить два скетча Arduino: один для реле и один для серводвигателя?
- Сервоуправление Arduino bluetooth HC-05
- Сервопривод сохраняет свою позицию каждый раз, когда я отправляю какое-то значение
- esp32, platformio A fatal error occurred: Packet content transfer stopped (received 8 bytes) *** [upload] Error 2
- Tower Pro MG996R сервопривод с высоким крутящим моментом 180 °, управляющий с помощью Arduino
- Проблемы с надежным подключением с использованием HC-05 в качестве ведущего устройства Bluetooth
- Как заставить сервопривод вращаться на угол больше 180°
- Пповорот сервопривода на 90 градусов
Когда ваше приложение выходит из строя, оно может отправлять мусорные данные по serial, которые затем интерпретируются как обратная метка auestion. Вам следует заглянуть в журналы вашего приложения, чтобы проверить, почему оно выходит из строя. Какой у вас вопрос по поводу остальной части проекта? Вы там ничего такого не сформулировали, @chrisl
Спасибо вам за ваш ответ. Я попробовал с catlog, но, похоже, никаких проблем не возникло (я попробую еще раз, просто чтобы быть уверенным). Мой главный вопрос касается как раз перевернутого вопросительного знака. Вторая часть состоит просто в том, чтобы узнать, есть ли другие более простые способы сделать то, что я хотел бы сделать в случае "S". Большое спасибо. Джаммарко, @Giammarco
Я только что попробовал использовать случайное приложение, загруженное из PlayStore (и использующее тот же код Arduino), и у меня все еще есть эта проблема. В таком случае, я думаю, я могу сказать, что это не проблема моего приложения, не так ли?, @Giammarco
Я думаю, что решил проблему с помощью источника питания. Похоже, что перевернутый вопросительный знак возник, когда произошло отключение электроэнергии. Теперь, кажется, это работает правильно. Еще раз огромное вам спасибо за вашу помощь! Джаммарко, @Giammarco
Пожалуйста, запишите это решение в виде правильного ответа и примите его как правильное. Это помогает нам отслеживать, на какие вопросы уже даны ответы., @chrisl