Всем привет, случилась такая проблема:есть приложение для телефона написанное на MIT App Inventor, при нажатии на кнопки в нём оно отправляет сигналы на ардуину, WASD и T, WASD управляют за повороты, т.е. вперёд, назад, лево, право. А сигнал T отвечает за остановку всех моторов (скрин работы в приложении прикрепил). Так вот, не всегда приходит сигнал T, из-за чего моторы крутятся без остановки. Код из ардуинки прикрепил тоже. Прошу добрых людей помочь с этой проблемой. (использую оригинальную ардуину, белые мотор шилды от амперки и китайские моторчики с редуктором). Код (C++): if (mySerial.available()) { val = mySerial.read(); // Задаём движение вперёд if (val == 'W') // При нажатии клавиши «W» {Serial.println(val); // Выводы конфигурируются согласно работе Motor Shield'а // Моторы крутятся вперед digitalWrite(EN1, HIGH); digitalWrite(EN2, HIGH); digitalWrite(EN3, HIGH); digitalWrite(EN4, HIGH); digitalWrite(IN1, HIGH); digitalWrite(IN2, HIGH); digitalWrite(IN3, HIGH); digitalWrite(IN4, HIGH); } // Задаём движение назад if ( val == 'S') {Serial.println(val); digitalWrite(EN1, HIGH); digitalWrite(EN2, HIGH); digitalWrite(EN3, HIGH); digitalWrite(EN4, HIGH); digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4, LOW); } // Задаём движение вправо if ( val == 'D') {Serial.println(val); digitalWrite(EN1, HIGH); digitalWrite(EN2, HIGH); digitalWrite(EN3, HIGH); digitalWrite(EN4, HIGH); digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); } // Задаём движение влево if ( val == 'A') {Serial.println(val); digitalWrite(EN1, HIGH); digitalWrite(EN2, HIGH); digitalWrite(EN3, HIGH); digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH); } // Стоп режим // При отпускании клавиш в программе в порт шлется «T» if ( val == 'T') // При нажатии клавиши «T» {Serial.println(val); // Выводы ENABLE притянуты к минусу, моторы не работают digitalWrite(EN1, LOW); digitalWrite(EN2, LOW); digitalWrite(EN3, LOW); digitalWrite(EN4, LOW); } }
всё что находится в можно не читать, там всё работает Код (C++): ///////////////////MOTOR PART//////////////////////////// int buttonState = 0; //состояние кнопки char val; //подключение моторов IN - управление EN - подключение int IN1 = 4; int IN2 = 7; int IN3 = 7; int IN4 = 7; int EN1 = 6; int EN2 = 5; int EN3 = 5; int EN4 = 5; int pos = 0; ////////////////////////////SERVOS PART/////////////////// #include <EEPROM.h> // подключаем библиотеку EEPROM #include <Servo.h> // подключаем библиотеку для Servo #include <Wire.h> #include <Multiservo.h> #include <SoftwareSerial.h> SoftwareSerial mySerial(8, 9); Multiservo servo_1; //даём имена servo Multiservo servo_2; Multiservo servo_3; Multiservo servo_4; Multiservo servo_5; // для хранения градуса поворота Servo машин. int servo_val_1; int servo_val_2; int servo_val_3; int servo_val_4; int servo_val_5; int serial_val; // для хранения значений Serial.parseInt. int serial_val2; int serial_val3; int serial_val4; int serial_val5; void setup() { mySerial.begin(9600); Serial.begin(9600); // скорость передачи /////////////////////////MOTOR PART//////////////////////// //подключение моторов на вывод информации pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); pinMode(EN1, OUTPUT); pinMode(EN2, OUTPUT); pinMode(IN3, OUTPUT); pinMode(EN3, OUTPUT); pinMode(IN4, OUTPUT); pinMode(EN4, OUTPUT); ////////////////////////SERVOS PART//////////////////////// // При вызове parseInt() задержка ожидания последующего символа по умолчанию 1 секунда. // Функцией setTimeout() можно уменьшить эту задержку. Например на 4 миллисекунды, setTimeout(4);. // Чем выше скорость Serial.begin, тем меньше потребуется значение setTimeout. mySerial.setTimeout(4); //подключаем сервоприводы к цифровым пинам servo_1.attach(10); servo_2.attach(11); servo_3.attach(12); servo_4.attach(13); servo_5.attach(14); // для восстановления сохранённых параметров положения servo, servo_val_1 = EEPROM.read(1), servo_1.write(servo_val_1); servo_val_2 = EEPROM.read(2), servo_2.write(servo_val_2); servo_val_3 = EEPROM.read(3), servo_3.write(servo_val_3); servo_val_4 = EEPROM.read(4), servo_4.write(servo_val_4); servo_val_5 = EEPROM.read(5), servo_5.write(servo_val_5); } void loop() { //////////////////////////////////////////MOTOR PART///////////////////////////// if (mySerial.available()) { val = mySerial.read(); // Задаём движение вперёд if (val == 'W') // При нажатии клавиши «W» {Serial.println(val); // Выводы конфигурируются согласно работе Motor Shield'а // Моторы крутятся вперед digitalWrite(EN1, HIGH); digitalWrite(EN2, HIGH); digitalWrite(EN3, HIGH); digitalWrite(EN4, HIGH); digitalWrite(IN1, HIGH); digitalWrite(IN2, HIGH); digitalWrite(IN3, HIGH); digitalWrite(IN4, HIGH); } // Задаём движение назад if ( val == 'S') {Serial.println(val); digitalWrite(EN1, HIGH); digitalWrite(EN2, HIGH); digitalWrite(EN3, HIGH); digitalWrite(EN4, HIGH); digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4, LOW); } // Задаём движение вправо if ( val == 'D') {Serial.println(val); digitalWrite(EN1, HIGH); digitalWrite(EN2, HIGH); digitalWrite(EN3, HIGH); digitalWrite(EN4, HIGH); digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); } // Задаём движение влево if ( val == 'A') {Serial.println(val); digitalWrite(EN1, HIGH); digitalWrite(EN2, HIGH); digitalWrite(EN3, HIGH); digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH); } // Стоп режим // При отпускании клавиш в программе в порт шлется «T» if ( val == 'T') // При нажатии клавиши «T» {Serial.println(val); // Выводы ENABLE притянуты к минусу, моторы не работают digitalWrite(EN1, LOW); digitalWrite(EN2, LOW); digitalWrite(EN3, LOW); digitalWrite(EN4, LOW); } }
Те вы в мониторе {Serial.println(val); не видите пришедшей команды "Т" ? Тогда дело в передаче-приёме. ПС. Зачем у вас несколько раз If (val == xxx) { Serial.println(val); ? Получили - один раз распечатайте, а потом разбирайтесь. val = mySerial.read(); Serial.println(val); If (val == xxx) {... ПС. Надо бы выбирать буквы не имеющие аналогов. Не поймешь латинская там или русская...
Так надо разобраться. Я так понимаю, что работа идет без подтверждения доставки пакета (широковещательная передача), отсюда и провалы в связи.
Измените код как я вам посоветовал. И смотрите что вам приходит вместо "Т", а потом под него измените вашу проверку if (mySerial.available()) { val = mySerial.read(); {Serial.println(val); //********************Смотрим что пришло вместо "Т" } ... if (val == 'T') { //*********************Меняем на то что пришло {Serial.println(val); // Выводы ENABLE притянуты к минусу, моторы не работают digitalWrite(EN1, LOW); ... } }
Мит Инвентор, вроде бы не халявная приблуда. В триал-режиме он имеет ограничение на количество объектов. Может в этом проблема ? Мита я не видел, поэтому только мысли вслух.