машина на блютуз начинает движение через 8 секунд после нажатия
- Войдите на сайт для отправки комментариев
Вс, 17/04/2016 - 16:48
всем привет
собрал машинку на блютуз управлении и добавил HC-SR4 со светодиодом в качестве парктроника, но машина начинает движение через 8 секунд после нажатия на кнопку движения, программу использую Arduino Bluetooth RC Car
#define in1 5
#define in2 6
#define in3 10
#define in4 11
#define Trig 13
#define Echo 12
#define ledPin 7
int command;
int Speed = 204;
int Speedsec;
int buttonState = 0;
int lastButtonState = 0;
int Turnradius = 0;
int brakeTime = 45;
int brkonoff = 1;
void setup() {
{
pinMode(Trig, OUTPUT);
pinMode(Echo, INPUT);
pinMode(ledPin, OUTPUT);
Serial.begin(9600); }
{pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);}
Serial.begin(9600);
}
unsigned int impulseTime=0;
unsigned int distance_sm=0;
void loop() {
if (Serial.available() > 0) {
command = Serial.read();
Stop();
switch (command)
{
case 'F':
forward();
break;
case 'B':
back();
break;
case 'L':
left();
break;
case 'R':
right();
break;
case 'G':
forwardleft();
break;
case 'I':
forwardright();
break;
case 'H':
backleft();
break;
case 'J':
backright();
break;
case '0':
Speed = 100;
break;
case '1':
Speed = 140;
break;
case '2':
Speed = 153;
break;
case '3':
Speed = 165;
break;
case '4':
Speed = 178;
break;
case '5':
Speed = 191;
break;
case '6':
Speed = 204;
break;
case '7':
Speed = 216;
break;
case '8':
Speed = 229;
break;
case '9':
Speed = 242;
break;
case 'q':
Speed = 255;
break;
}
Speedsec = Turnradius;
if (brkonoff == 1) {
brakeOn();
} else {
brakeOff();
}
}
{
digitalWrite(Trig, HIGH);
delayMicroseconds(10);
digitalWrite(Trig, LOW);
impulseTime=pulseIn(Echo, HIGH);
distance_sm=impulseTime/58;
Serial.println(distance_sm);
if (distance_sm<10)
{
digitalWrite(ledPin, HIGH);
}
else
{
digitalWrite(ledPin, LOW);
}
delay(100);
}
}
void forward() {
analogWrite(in1, Speed);
analogWrite(in3, Speed);
}
void back() {
analogWrite(in2, Speed);
analogWrite(in4, Speed);
}
void left() {
analogWrite(in3, Speed);
analogWrite(in2, Speed);
}
void right() {
analogWrite(in4, Speed);
analogWrite(in1, Speed);
}
void forwardleft() {
analogWrite(in1, Speedsec);
analogWrite(in3, Speed);
}
void forwardright() {
analogWrite(in1, Speed);
analogWrite(in3, Speedsec);
}
void backright() {
analogWrite(in2, Speed);
analogWrite(in4, Speedsec);
}
void backleft() {
analogWrite(in2, Speedsec);
analogWrite(in4, Speed);
}
void Stop() {
analogWrite(in1, 0);
analogWrite(in2, 0);
analogWrite(in3, 0);
analogWrite(in4, 0);
}
void brakeOn() {
buttonState = command;
if (buttonState != lastButtonState) {
if (lastButtonState == 'F') {
if (buttonState == 'S') {
back();
delay(brakeTime);
Stop();
}
}
if (lastButtonState == 'B') {
if (buttonState == 'S') {
forward();
delay(brakeTime);
Stop();
}
}
if (lastButtonState == 'L') {
if (buttonState == 'S') {
right();
delay(brakeTime);
Stop();
}
}
if (lastButtonState == 'R') {
if (buttonState == 'S') {
left();
delay(brakeTime);
Stop();
}
}
}
lastButtonState = buttonState;
}
void brakeOff() {
}
по сути это объединение двух кодов, по отдельности работает нормально все , но после вставки кода на дальномер происходит задержка
1. Никто не будет разбираться в коде, оформленном не по правилам.
2. Раз Вы произнесли слово дальномер, то, возможно, дальномер ултразвуковой и его таймаут составляет как раз порядка 8 секунд.
#define Trig 13 #define Echo 12 #define ledPin 11 void setup() { pinMode(Trig, OUTPUT); //инициируем как выход pinMode(Echo, INPUT); //инициируем как вход pinMode(ledPin, OUTPUT); Serial.begin(9600); /* задаем скорость общения. В нашем случае с компьютером */ } unsigned int impulseTime=0; unsigned int distance_sm=0; void loop() { digitalWrite(Trig, HIGH); /* Подаем импульс на вход trig дальномера */ delayMicroseconds(10); // равный 10 микросекундам digitalWrite(Trig, LOW); // Отключаем impulseTime=pulseIn(Echo, HIGH); // Замеряем длину импульса distance_sm=impulseTime/58; // Пересчитываем в сантиметры Serial.println(distance_sm); // Выводим на порт if (distance_sm<10) // Если расстояние менее 30 сантиметром { digitalWrite(ledPin, HIGH); // Светодиод горит } else { digitalWrite(ledPin, LOW); // иначе не горит } delay(100); /* ждем 0.1 секунды, Следующий импульс может быть излучён, только после исчезновения эха от предыдущего. Это время называется периодом цикла (cycle period). Рекомендованный период между импульсами должен быть не менее 50 мс. */ }в код для машины всатвлял вот этот код этот код зажигает светодиод если расстояние до приграды 10 см
#define in1 5 #define in2 6 #define in3 10 #define in4 11 #define Trig 13 #define Echo 12 #define ledPin 7 int command; int Speed = 204; int Speedsec; int buttonState = 0; int lastButtonState = 0; int Turnradius = 0; int brakeTime = 45; int brkonoff = 1; void setup() { { pinMode(Trig, OUTPUT); pinMode(Echo, INPUT); pinMode(ledPin, OUTPUT); Serial.begin(9600); } {pinMode(in1, OUTPUT); pinMode(in2, OUTPUT); pinMode(in3, OUTPUT); pinMode(in4, OUTPUT);} Serial.begin(9600); } unsigned int impulseTime=0; unsigned int distance_sm=0; void loop() { if (Serial.available() > 0) { command = Serial.read(); Stop(); switch (command) { case 'F': forward(); break; case 'B': back(); break; case 'L': left(); break; case 'R': right(); break; case 'G': forwardleft(); break; case 'I': forwardright(); break; case 'H': backleft(); break; case 'J': backright(); break; case '0': Speed = 100; break; case '1': Speed = 140; break; case '2': Speed = 153; break; case '3': Speed = 165; break; case '4': Speed = 178; break; case '5': Speed = 191; break; case '6': Speed = 204; break; case '7': Speed = 216; break; case '8': Speed = 229; break; case '9': Speed = 242; break; case 'q': Speed = 255; break; } Speedsec = Turnradius; if (brkonoff == 1) { brakeOn(); } else { brakeOff(); } } { digitalWrite(Trig, HIGH); delayMicroseconds(10); digitalWrite(Trig, LOW); impulseTime=pulseIn(Echo, HIGH); distance_sm=impulseTime/58; Serial.println(distance_sm); if (distance_sm<10) { digitalWrite(ledPin, HIGH); } else { digitalWrite(ledPin, LOW); } delay(100); } } void forward() { analogWrite(in1, Speed); analogWrite(in3, Speed); } void back() { analogWrite(in2, Speed); analogWrite(in4, Speed); } void left() { analogWrite(in3, Speed); analogWrite(in2, Speed); } void right() { analogWrite(in4, Speed); analogWrite(in1, Speed); } void forwardleft() { analogWrite(in1, Speedsec); analogWrite(in3, Speed); } void forwardright() { analogWrite(in1, Speed); analogWrite(in3, Speedsec); } void backright() { analogWrite(in2, Speed); analogWrite(in4, Speedsec); } void backleft() { analogWrite(in2, Speedsec); analogWrite(in4, Speed); } void Stop() { analogWrite(in1, 0); analogWrite(in2, 0); analogWrite(in3, 0); analogWrite(in4, 0); } void brakeOn() { buttonState = command; if (buttonState != lastButtonState) { if (lastButtonState == 'F') { if (buttonState == 'S') { back(); delay(brakeTime); Stop(); } } if (lastButtonState == 'B') { if (buttonState == 'S') { forward(); delay(brakeTime); Stop(); } } if (lastButtonState == 'L') { if (buttonState == 'S') { right(); delay(brakeTime); Stop(); } } if (lastButtonState == 'R') { if (buttonState == 'S') { left(); delay(brakeTime); Stop(); } } } lastButtonState = buttonState; } void brakeOff() { }Внимательно читаем доки по PulseIn(особенно про таймаут) : http://arduino.ru/Reference/PulseIn
и п.2 от andriano #2
ну и собственно что получилось в итог. извиняюсь за первое сообщение)
Может она перед стартом мотор прогревает?
А вообще, присоединяюсь к коллегам. Проверьте, если не поможет, тогда и будем думать.
знания не так глубоки, да что там говорить начальный уровень еще. PulseIn нужно приписать к пину но в скетче не указаны пины от блютуз модуля. итог не разобрался
носом меня ткнуть можно? што к чему должно, малость расжувать
зачем строка 115, если можно указать в 117 время импульса?