Проблема с подключением Android-приложения к Arduino

Извините за это, я действительно не знаю, где разместить сообщение, потому что это код и для Android Studio, и для Arduino, поэтому я разместил его на обоих сайтах.

Я хочу создать проект управления наклоном и поворотом (2 сервопривода объединены) с использованием данных акселерометра и гироскопа в смартфоне. Создание приложения для Android и отправка данных акселерометра и гироскопа в Arduino, чтобы наклон и поворот могли определять свое местоположение.

Моя проблема заключается в том, что когда я подключаю приложение Android к Arduino, на последовательном мониторе Arduino не отображаются данные, а поворотно-наклонное устройство не определяет местоположение смартфона. Пожалуйста, помогите мне решить эту проблему.

Этот MainActivity — класс для идентификации данных акселерометра и гироскопа.

Основная деятельность:

public class MainActivity extends AppCompatActivity implements SensorEventListener{

    private final String TAG = "MainActivity";//регистрируем нашу активность

    SensorManager sm;//определить менеджер датчиков
    Sensor accelerometer, gyrometer;// определение акселерометра

    TextView xValue, yValue, zValue, xGyroValue, yGyroValue, zGyroValue;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        xValue = (TextView)findViewById(R.id.xValue);
        yValue = (TextView)findViewById(R.id.yValue);
        zValue = (TextView)findViewById(R.id.zValue);

        xGyroValue = (TextView)findViewById(R.id.xGyroValue);
        yGyroValue = (TextView)findViewById(R.id.yGyroValue);
        zGyroValue = (TextView)findViewById(R.id.zGyroValue);

        Log.d(TAG, "onCreate: Initializing Sensor Services");

        sm =(SensorManager) getSystemService(Context.SENSOR_SERVICE);//разрешение на использование датчика

        accelerometer = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        if (accelerometer != null) {

            sm.registerListener(MainActivity.this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL);
            Log.d(TAG, "onCreate: Registered accelerometer listerner");
        }else {

            xValue.setText("accelerometer is not supported");
            yValue.setText("accelerometer is not supported");
            zValue.setText("accelerometer is not supported");
        }
        gyrometer = sm.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
        if (gyrometer != null) {

            sm.registerListener(MainActivity.this, gyrometer, SensorManager.SENSOR_DELAY_NORMAL);
            Log.d(TAG, "onCreate: Registered gyrometer listerner");
        }else {

            xGyroValue.setText("gyrometer is not supported");
            yGyroValue.setText("gyrometer is not supported");
            zGyroValue.setText("gyrometer is not supported");
        }
    }

    public void connect(View v){

        DataSender dataSender = new DataSender();
        dataSender.execute((String) xValue.getText(), toString());
        dataSender.execute((String) yValue.getText(), toString());
        dataSender.execute((String) zValue.getText(), toString());
        dataSender.execute((String) xGyroValue.getText(), toString());
        dataSender.execute((String) yGyroValue.getText(), toString());
        dataSender.execute((String) zGyroValue.getText(), toString());

    }

    @Override
    public void onSensorChanged(SensorEvent sensorEvent) {
        Sensor sensor = sensorEvent.sensor;
        if(sensor.getType() == Sensor.TYPE_ACCELEROMETER){

            Log.d(TAG, "onSensorChanged: X: " + sensorEvent.values[0] + "Y: " + sensorEvent.values[1] + "Z:" + sensorEvent.values[2]);

            xValue.setText("xValue:   " + sensorEvent.values[0]);
            yValue.setText("yValue:   " + sensorEvent.values[1]);
            zValue.setText("zValue:   " + sensorEvent.values[2]);
        }else if (sensor.getType() == Sensor.TYPE_GYROSCOPE){

            xGyroValue.setText("xGyroValue:   " + sensorEvent.values[0]);
            yGyroValue.setText("yGyroValue:   " + sensorEvent.values[1]);
            zGyroValue.setText("zGyroValue:   " + sensorEvent.values[2]);

        }

    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }
}

Этот DataSender — класс для отправки данных в Arduino.

Отправитель данных:

public class DataSender extends AsyncTask<String, Void, Void> {

    Socket s;
    DataOutputStream dos;
    PrintWriter pw;

    @Override
    protected Void doInBackground(String... voids) {

        String data = voids[0];

        try {
            s = new Socket("192.168.1.100",80);
            pw = new PrintWriter(s.getOutputStream());
            pw.write(data);
            pw.flush();
            pw.close();
            s.close();

        } catch (IOException e){
            e.printStackTrace();
        }

        return null;
    }
}

Это код, загруженный в модуль Wi-Fi (esp8266-01), подключенный к Arduino.

Код Arduino:

#include <SoftwareSerial.h>
#include <Servo.h>

#define DEBUG true

SoftwareSerial esp8266(10, 11); // RX, TX

char tiltChannel=0, panChannel=1;

//Это объекты для каждого сервопривода.
Servo servoTilt, servoPan;

//Это символ, который будет хранить данные из последовательного порта.
char serialChar=0;

// Центральные сервоприводы
int tiltVal = 90; 
int panVal =90; 

//значение смартфона
String inText;
float value0, value1, value2;


void setup() { // Открываем последовательную связь и ждем открытия порта:

  servoTilt.attach(2);  //Сервопривод наклона подключен к контакту 2.
  servoPan.attach(3);   //Сервопривод панорамирования подключен к контакту 3.
  servoTilt.write(90);  //Изначально ставим сервоприводы оба
  servoPan.write(90);      //на 90 градусах.

  Serial.begin(9600); //для целей мониторинга
  esp8266.begin(9600);

  //sendCommand("AT+CIFS+RST\r\n", 2000, DEBUG); // сброс модуля
  sendCommand("AT+IPR=9600\r\n", 1000, DEBUG);
  sendCommand("AT+CWMODE=1\r\n", 1000, DEBUG); // настроить как точку доступа
  sendCommand("AT+CWJAP=\"EceConnect\",\"1234\"\r\n", 3000, DEBUG); //подключиться к
a network with name EceConnect with password 1234
  delay(1000);
  sendCommand("AT+CIFSR\r\n", 1000, DEBUG); // получить IP-адрес
  sendCommand("AT+CIPSTA=\"192.168.1.100\"\r\n", 1000, DEBUG);
  sendCommand("AT+CIPMUX=1\r\n", 1000, DEBUG); // настройка для нескольких
connections
  sendCommand("AT+CIPSERVER=1,80\r\n", 1000, DEBUG); // включить сервер на порту
80
  Serial.println("Server Ready");

  Serial.println("Android Sensor Type No: ");
  Serial.println("1- ACCELEROMETER  (m/s^2 - X,Y,Z)");
  Serial.println("2- GYROSCOPE (rad/s - X,Y,Z)");
  Serial.flush();

}

void loop() { // запускать снова и снова

  Serial.flush();
  int inCommand = 0;
  int sensorType = 0;
  unsigned long logCount = 0L;

  if (Serial.available() < 1) return; // если последовательный порт пуст, вернуться в loop().

    char getChar = ' '; 
    if (esp8266.available()) {
      if (esp8266.find("+IPD,0,")) {
        delay(10);
        esp8266.find(":");
        delay(10);
        char letter = esp8266.read();
        Serial.print(letter); //для целей мониторинга
        // Получает значение/символ из приложения Android
      }
    }

    // анализируем входящий флаг запуска команды

    if (getChar != serialChar) return; // если нет флага запуска команды, вернуться к
loop().

    // анализируем входящий номер контакта и значение
    sensorType = Serial.parseInt(); // прочитать тип датчика
    logCount = Serial.parseInt();  // прочитать общие зарегистрированные показания датчика
    value0 = Serial.parseFloat();  // значение 1-го датчика
    value1 = Serial.parseFloat();  // значение 2-го датчика, если существует
    value2 = Serial.parseFloat();  // значение 3-го датчика, если существует

    // отправить показания смартфона на последовательный монитор/терминал
    if (DEBUG) {
      Serial.print("Sensor type: ");
      Serial.println(sensorType);
      Serial.print("Sensor log#: ");
      Serial.println(logCount);
      Serial.print("Val[0]: ");
      Serial.println(value0);
      Serial.print("Val[1]: ");
      Serial.println(value1);
      Serial.print("Val[2]: ");
      Serial.println(value2);
      Serial.println("-----------------------");
      delay(10);
    }

    // Проверить тип датчика. Если не акселерометр (#1), то игнорировать показания
    // sensorType 1 — датчик акселерометра

  if (sensorType !=1) return;   

  panVal = value0; // value0 = показания датчика X
  tiltVal = value1;  // значение1 = показания датчика Y

  tiltVal = map(tiltVal, 10, -10, 0, 179);   // Сопоставляем значение Y акселерометра с
tilt servo angle. 
  servoTilt.write(tiltVal);
  delay(10);

  panVal = map(panVal, -10, 10, 0, 179);  // Сопоставить значение X акселерометра с панорамированием
servo angle.
  servoPan.write(panVal);     
  delay(10); 
}


String sendCommand(String command, const int timeout, boolean debug) {
  String response = "";
  esp8266.print(command); // отправляем прочитанный символ в esp8266
  long int time = millis();
  while ((time + timeout) > millis()) {
    while (esp8266.available()) {
      // В esp есть данные, поэтому отобразите их вывод в последовательном окне
      char c = esp8266.read(); // прочитать следующий символ.
      response += c;
    }
  }

  if (debug) {
    Serial.print(response);
  }
  return response;
}

, 👍1


1 ответ


2

В функции loop у вас есть строка

If (Serial.available() < 1) return;

Это предотвращает дальнейшую обработку кода, если в аппаратном последовательном буфере ничего нет. Подумайте об этом.

,