Проблема с подключением 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;
}
@Wyeth Gamba, 👍1
1 ответ
В функции loop
у вас есть строка
If (Serial.available() < 1) return;
Это предотвращает дальнейшую обработку кода, если в аппаратном последовательном буфере ничего нет. Подумайте об этом.
- Правильный способ получить значения крена, тангажа и перемещения
- Снять гравитацию с акселерометра MPU-6050
- Использование MPU-6050 без I2C
- Акселерометр ADXL345 не работает
- Изменение скорости передачи данных не работает
- MPU-6050 с Arduino – вскрытие
- Можно ли измерить скорость акселерометром? Насколько точно?
- В чем разница между акселерометром, гироскопом и датчиком магнитометра?