Перемещение и сохранение положений сервопривода через bluetooth

servo hc-05 error

Я пытаюсь запрограммировать роботизированную руку 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) ;
}

App interface

, 👍2

Обсуждение

Когда ваше приложение выходит из строя, оно может отправлять мусорные данные по serial, которые затем интерпретируются как обратная метка auestion. Вам следует заглянуть в журналы вашего приложения, чтобы проверить, почему оно выходит из строя. Какой у вас вопрос по поводу остальной части проекта? Вы там ничего такого не сформулировали, @chrisl

Спасибо вам за ваш ответ. Я попробовал с catlog, но, похоже, никаких проблем не возникло (я попробую еще раз, просто чтобы быть уверенным). Мой главный вопрос касается как раз перевернутого вопросительного знака. Вторая часть состоит просто в том, чтобы узнать, есть ли другие более простые способы сделать то, что я хотел бы сделать в случае "S". Большое спасибо. Джаммарко, @Giammarco

Я только что попробовал использовать случайное приложение, загруженное из PlayStore (и использующее тот же код Arduino), и у меня все еще есть эта проблема. В таком случае, я думаю, я могу сказать, что это не проблема моего приложения, не так ли?, @Giammarco

Я думаю, что решил проблему с помощью источника питания. Похоже, что перевернутый вопросительный знак возник, когда произошло отключение электроэнергии. Теперь, кажется, это работает правильно. Еще раз огромное вам спасибо за вашу помощь! Джаммарко, @Giammarco

Пожалуйста, запишите это решение в виде правильного ответа и примите его как правильное. Это помогает нам отслеживать, на какие вопросы уже даны ответы., @chrisl


1 ответ


1

Символ "⸮" присваивался каждый раз, когда происходило отключение электроэнергии. Таким образом, достаточно использовать внешний источник питания для питания bluetooth и сервоприводов (Arduino не может одновременно питать все эти модули).

,

Как уже упоминал Крисл, вы должны отметить свой ответ как принятый., @timemage