LINUX.ORG.RU

Ардуино IDE и машинка под управление андроида

 ,


0

1

Написал код на ардуинке IDE. Машинка управляется через смарт, при нажатии кнопки машинка едет, согласно на писаному коду, и когда отпускаешь кнопку на андроид машинка все равно едет! А мне надо что бы машинка ехала только,когда нажата кнопка! Подскажите в чем проблема! А то вторые сутки не могу ни чего найти !!!!

#include <AFMotor.h>

#include <SoftwareSerial.h>

SoftwareSerial BT(52,53); //53 - RX, 52 - TX

AF_DCMotor motor1(1); //задний левый мотор

AF_DCMotor motor2(2); //задний правый мотор

AF_DCMotor motor3(3); // передний правый мотор

AF_DCMotor motor4(4); //передний левый мотор

char val;

void setup() {

Serial.begin(9600);

BT.begin(9600);

}

void loop() {

if (BT.available()){ // Если есть данные

val = BT.read(); // переменная val равна полученной команде

// едем вперед

if(val == 'W')

{

motor1.run(FORWARD);

motor1.setSpeed(255);

motor2.run(FORWARD);

motor2.setSpeed(255);

motor3.run(FORWARD);

motor3.setSpeed(255);

motor4.run(FORWARD);

motor4.setSpeed(255);

}

//едем назад

if(val == 'S'){

motor1.run(BACKWARD);

motor1.setSpeed(255);

motor2.run(BACKWARD);

motor2.setSpeed(255);

motor3.run(BACKWARD);

motor3.setSpeed(255);

motor4.run(BACKWARD);

motor4.setSpeed(255);

}

// поворот на лево

if(val == 'A'){

motor1.run(FORWARD);

motor1.setSpeed(200);

motor2.run(FORWARD);

motor2.setSpeed(200);

motor3.run(FORWARD);

motor3.setSpeed(200);

motor4.run(BACKWARD);

motor4.setSpeed(255);

}

//поворот на право

if(val == 'D'){

motor1.run(FORWARD);

motor1.setSpeed(200);

motor2.run(FORWARD);

motor2.setSpeed(200);

motor3.run(BACKWARD);

motor3.setSpeed(255);

motor4.run(FORWARD);

motor4.setSpeed(200);

}

// стоп

if(val == 'E'){

motor1.run(RELEASE);

motor2.run(RELEASE);

motor3.run(RELEASE);

motor4.run(RELEASE);

}

}

}

Побуду дежурным по ЛОРу в теме.

  • правь исходное сообщение с использованием тега code (см LORCODE). Если укажешь через «=» язык программирования, будет подсветка синтаксиса.
  • По коду... У тебя остановка работает при нажатии клавиши «E». Проверок нажата ли клавиша нет. Из этого фрагмента кода, я делаю вывод, что мотор после запуска сам не выключается.

Мой «патч» :)

if (BT.available()){ // Если есть данные
<здесь твой код>
else // нет данных === клавиша не нажата?
motor1.run(RELEASE);

motor2.run(RELEASE);

motor3.run(RELEASE);

motor4.run(RELEASE);
....
Ксати, у тебя если нажата «неправильная» клавиша (или это невозможно?) продолжает выполнять последнюю команду.

anymouze ()
void loop() {
  int left, right, back;

  if (BT.available()) {
    val = BT.read();

    switch (val) {
      case 'W':
        left = FORWARD;
        right = FORWARD;
        back = FORWARD;
        break;

      case 'S':
        left = BACKWARD;
        right = BACKWARD;
        back = BACKWARD;
        break;

      case 'A':
        left = FORWARD;
        right = BACKWARD;
        back = FORWARD;
        break;

      case 'D':
        left = BACKWARD;
        right = FORWARD;
        back = FORWARD;
        break;

      case 'E':
        left = RELEASE;
        right = RELEASE;
        back = RELEASE;
        break;
    }
  } else {
    left = RELEASE;
    right = RELEASE;
    back = RELEASE;
  }
  motor1.run(back);
  motor1.setSpeed(255);
  motor2.run(back);
  motor2.setSpeed(255);
  motor3.run(right);
  motor3.setSpeed(255);
  motor4.run(left);
  motor4.setSpeed(255);
}
anonymous ()
Ответ на: комментарий от NeXt123

Программу «пульта» на Android тоже ты писал? Твой скетч на машинке в принципе не сможет понять, что кнопка отпущена. С android должна приходить команда. Там же должно отрабатываться и отпускание кнопки.

Примерно так

Нажата кнопка --> послать команду «Run to ...»
Кнопку отпустили --> послать команду «Stop»

Тогда скетч только «ловит» и выполняет команды движения

anymouze ()
Последнее исправление: anymouze (всего исправлений: 1)
Ответ на: комментарий от anymouze

ага, спасибо тебе за помощь. Я тоже так по размышлял, и понял скорее всего ошибка в приложении, потому что от туда приходит только логическая 1. Поэтому скетч и игнорит функцию else! Завтра покопаюсь, а то сейчас уже ночь!

NeXt123 ()
Ответ на: комментарий от NeXt123

Java без GC не встречается. А пока выполняется GC — машинка разобьётся. Есть, правда, исключительные случаи — JavaCard (в которой от Java скорее одно название), плюс некоторые хипсторы настолько обмазались OOM и супервайзорами, что тупо вырубают GC и перезапускают свои жабоподелия, когда они обожрутся — ачо, работает же, особенно если это что-то очень распараллеленное — временный сбой пары узлов не критичен, обработается и вычисления перекинутся на другие узлы, а вот GC может залочить все нити.

svinarenko ()