Добрый день всем. Не давно участвовал в Робоштурме и заметил что робот управляемый по Bluetooth не работает. Получается управлять им только с компьютера. Проблема засела в коде. Помогите её отыскать. Код (C++): #include <Ultrasonic.h> #include <Servo.h> #define SPEED_1 5 #define DIR_1 4 #define CON_MOTOR1 0 #define CON_MOTOR2 0 #define TRIGGER_PIN 16 #define ECHO_PIN 17 Ultrasonic ultrasonic(TRIGGER_PIN, ECHO_PIN); #define SPEED_2 6 #define DIR_2 7 #define FORWARD 0 #define BACKWARD 1 #define LEFT 2 #define RIGHT 3 Servo neck; int val; void go(int newDirection, int speed) { boolean motorDirection_1, motorDirection_2; switch ( newDirection ) { case FORWARD: motorDirection_1 = true; motorDirection_2 = true; break; case BACKWARD: motorDirection_1 = false; motorDirection_2 = false; break; case LEFT: motorDirection_1 = true; motorDirection_2 = false; break; case RIGHT: motorDirection_1 = false; motorDirection_2 = true; break; } analogWrite(SPEED_1, speed); analogWrite(SPEED_2, speed); digitalWrite(DIR_1, motorDirection_1); digitalWrite(DIR_2, motorDirection_2); } void robot_avtonomno() { delay(50); float dist_cm = ultrasonic.Ranging(CM); delay(100); if (dist_cm < 45.0) { go(FORWARD, 0); neck.write(180); delay(600); float dist_cm_1 = ultrasonic.Ranging(CM); neck.write(0); delay(600); float dist_cm_2 = ultrasonic.Ranging(CM); if (dist_cm_1 > dist_cm_2) { neck.write(90); delay(300); go(LEFT, 100); delay(360); } else { neck.write(90); delay(300); go(RIGHT, 100); delay(360); } } else { go(FORWARD, 75); } if (Serial.available()) { val = Serial.read(); if (val == 'T') { go(FORWARD, 0); while (1) { float dist_cm = ultrasonic.Ranging(CM); Serial.println(dist_cm); robot_upravlenie(); delay(100); } } } } void robot_upravlenie() { if (Serial.available()) { val = Serial.read(); if (val == 'F') { go(FORWARD, 75); delay(200); } if (val == 'B') { go(BACKWARD, 75); delay(200); } if (val == 'L') { go(LEFT, 100); delay(200); } if (val == 'R') { go(RIGHT, 100); delay(200); } if (val == 'S') { go(FORWARD, 0); } if(val == 'W') { neck.write(90); } if(val == 'D') { neck.write(0); } if(val == 'A') { neck.write(180); } if (val == 'Y') { while (1) { neck.write(90); float dist_cm = ultrasonic.Ranging(CM); Serial.println(dist_cm); robot_avtonomno(); delay(100); } } } } void setup() { for (int i = 4; i <= 7; i++) pinMode(i, OUTPUT); neck.attach(2); neck.write(90); Serial.begin(9600); } void loop() { if (Serial.available()) { val = Serial.read(); if (val == 'Y') { while (1) { neck.write(90); float dist_cm = ultrasonic.Ranging(CM); Serial.println(dist_cm); robot_avtonomno(); } } else if (val == 'T') { while (1) { float dist_cm = ultrasonic.Ranging(CM); Serial.println(dist_cm); robot_upravlenie(); } } } }
по идее, управление через ком-порт с компа и через блютус ничем не отличается - один и тот же уарт. может что-то не так в программе, которая на телефоне? что за плата кстати? не леонардо случайно
Блютус-балалайка, подключаемая к дуне - суть работает как удлинитель UART, всё. Если получается управлять роботом по UART, подоткнув плату по USB к компу, но не получается, когда к плате подоткнута балалайка - значит, проблема в том, что балалайка не передаёт данные на плату. Причин может быть много: разные скорости работы по UART балалайки и платы, разные настройки UART, отсутствие сопряжения по блютуз балалайки и управляющего устройства - выбирайте любую.
Нет. Плата Arduino Uno. Программа на телефоне Arduino Bluetooth Controller. Раньше код работал. Но что-то пошло не так. Да очень понравилось. Проходило в Ярославле. Спортивные соревнования роботов Оно закончилось вчера. Вот их сайт: http://roboshturm.ru/
Данные передаются(по крайней мере я проверял в другом коде). Скорость настраивал. Устройства сопрягаются.
Но в дуньку они не попадают по какой-то причине. Либо попадают - но искажённые. Надо тестировать, других вариантов не вижу. Допишите в прошивку дуньки код, который эхом выводит в UART данные, полученные извне - так хоть будет понятно, доходит ли до дуньки что-либо. Ну и, конечно, надо убедиться, что с подключением и с питанием всё ништяк.