Skocz do zawartości

Problem z robotem bluetooth- jeździ tylko do przodu.


Pomocna odpowiedź

Napisano

Witam,

Jestem początkujący i mam problem z zbudowanym przeze mnie robotem sterowanym z telefonu przez bluetooth. Robot niezależnie od tego jaką zmienną mu wyślę jedzie tylko do przodu. Jak rozwiązać ten problem?

W skład robota wchodzą:

- Arduino Uno

- Płytka stykowa (170 pól)

- 2x Silnik 9v

- Sterownik silników l293d

- Moduł bluetooth HC-05

- 3x Bateria 9v

int data;                     //Deklaracja zmiennej o nazwie data
void setup() {                //Poczatek funkcji inicjalizującej
  
  pinMode(2,OUTPUT);          //Określenie pinów 2-5 jako wyjścia
  pinMode(3,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);

  Serial.begin(9600);        //Rozpoczęcie transmisji na porcie szeregowym(bluetooth)
}
void loop() {                //Początek funkcji loop wykonującej się w pętli przez cały czas
data=Serial.read();          //Przypisanie do zmiennej data odczytu z portu szeregowegi, czyli danych wysłanych ze smartfona
Serial.println(data);        //Wyświetlenie danych przypisanych do zmiennej data na "Monitorze portu szeregowego"
delay(100);                  //Przerwa w wykonywaniu programu (100ms);
 
if(data==97){                //Jazda do przodu. 
  digitalWrite(3,LOW);       //Ustawienie stanu niskiego na pin 3
  digitalWrite(2,HIGH);      //Ustawienie stanu wysokiego na pin 2
  digitalWrite(4,LOW);       
  digitalWrite(5,HIGH);      
   }
else if(data==99){           //Stop
  digitalWrite(3,HIGH);
  digitalWrite(2,HIGH);
  digitalWrite(4,HIGH);
  digitalWrite(5,HIGH);
  }
else if(data==98){           //Lewo
  digitalWrite(3,HIGH);
  digitalWrite(2,HIGH);
  digitalWrite(4,LOW);
  digitalWrite(5,HIGH);       //Lewy silnik jest zatrzymany, prawy silnik się obraca
 }
 else if(data==100){           //Prawo
  digitalWrite(3,LOW);
  digitalWrite(2,HIGH);
  digitalWrite(4,HIGH);
  digitalWrite(5,HIGH);       //Prawy silnik jest zatrzymany, lewy silnik się obraca
  }
else if(data==101){          //Jazda do tyłu
  digitalWrite(2,LOW);
  digitalWrite(3,HIGH);
  digitalWrite(5,LOW);
  digitalWrite(4,HIGH);  
  }
}

Kierując się schematem w załączniku:

pin 2 podłączony jest do INPUT 1

pin 3 podłączony jest do INPUT 2

pin 4 podłączony jest do INPUT 3

pin 5 podłączony jest do INPUT 4

 

Do Arduino oprócz VIN, GND i 5v podłączyłem jeszcze:

pin 0 (RX) do TXD na module bluetooth

pin 1 (TX) do RXD na module bluetooth

Schemat l293d.png

@Farmer witam na forum - dla formalności, czy pomijając kwestię Bluetooth robot jeździ normalnie we wszystkie strony i problem jest tylko podczas komunikacji przez BT?

PS baterie 9 V nie nadają się do zasilania tego typu projektów - mają za małą pojemność, będę bardzo, bardzo szybko się rozładowywać. Poszukaj innego źródła zasilania, bo te baterie będą sprawiały dużo problemów.

8 godzin temu, Treker napisał:

@Farmer witam na forum - dla formalności, czy pomijając kwestię Bluetooth robot jeździ normalnie we wszystkie strony i problem jest tylko podczas komunikacji przez BT?

PS baterie 9 V nie nadają się do zasilania tego typu projektów - mają za małą pojemność, będę bardzo, bardzo szybko się rozładowywać. Poszukaj innego źródła zasilania, bo te baterie będą sprawiały dużo problemów.

Na razie podpinam całość tylko do komputera, ale jak podpiąłem do baterii to problem i tak występował. Jeśli chodzi o Bluetooth, gdy wysyłam do robota zmienne przewodowo, to działa to tak samo. Jeśli to coś da, to na monitorze portu szeregowego Arduino ciągle wysyła "-1".

48 minut temu, farmaceuta napisał:
if (Serial.available() > 0) { 
  char x = Serial.read(); 
  Serial.println(x); 
  } 

Wgraj to na Ardu i sprawdź czy wysyłając jakieś różne dane otrzymujesz różne wartości 

Nie ogarniam do końca, czy tak miał ten program wyglądać...

int data;                     //Deklaracja zmiennej o nazwie data
void setup() {                //Poczatek funkcji inicjalizującej
  
  pinMode(2,OUTPUT);          //Określenie pinów 2-5 jako wyjścia
  pinMode(3,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);

  Serial.begin(9600);        //Rozpoczęcie transmisji na porcie szeregowym(bluetooth)
}
void loop() {                //Początek funkcji loop wykonującej się w pętli przez cały czas
data=Serial.read();          //Przypisanie do zmiennej data odczytu z portu szeregowegi, czyli danych wysłanych ze smartfona
Serial.println(data);        //Wyświetlenie danych przypisanych do zmiennej data na "Monitorze portu szeregowego"
delay(100);                  //Przerwa w wykonywaniu programu (100ms);
 
if (Serial.available() > 0) { 
  char x = Serial.read(); 
  Serial.println(x); 
  } 
}

Tak to wyglądało.InfRobo.thumb.png.eec34585399693373f8cb937af1e4207.png

(edytowany)
void setup() { 
  Serial.begin(9600); 
  } 
 
void loop() { 
  if (Serial.available() > 0) { 
  char x = Serial.read(); 
  Serial.println(x); 
  }  
 }

Tak ma wyglądać...wysyłaj pojedyncze liczby/znaki i sprawdź czy się zgadza 

Druga sprawa to jakiego programu na blue używasz?

Edytowano przez farmaceuta
(edytowany)
4 godziny temu, farmaceuta napisał:
void setup() { 
  Serial.begin(9600); 
  } 
 
void loop() { 
  if (Serial.available() > 0) { 
  char x = Serial.read(); 
  Serial.println(x); 
  }  
 }

Tak ma wyglądać...wysyłaj pojedyncze liczby/znaki i sprawdź czy się zgadza 

Druga sprawa to jakiego programu na blue używasz?

Generalnie działa. Jak wysyłam więcej niż jeden znak to w odpowiedzi dostaje to samo tylko w każdej linijce po 1 znaku. Ze sklepu play zainstalowałem "Arduino Bluetooth Control".

Edytowano przez Farmer

Może zmienna x nie powinna być jako char tylko String? Char może przechowywać tylko jeden znak na raz, a string ciąg znaków.

Ok...w aplikacji masz taką opcję jak "keys configuration" tam przypisz wartości np. 1/2/3/4 dla dół/góra/lewo/prawo a kod ma wyglądać tak... 

void setup() {                //Poczatek funkcji inicjalizującej
  
  pinMode(2,OUTPUT);          //Określenie pinów 2-5 jako wyjścia
  pinMode(3,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);

  Serial.begin(9600);        //Rozpoczęcie transmisji na porcie szeregowym(bluetooth)
}
void loop() {                
  if (Serial.available() > 0) {
    
char data=Serial.read(); 
 Serial.println(data);
 }
  if(data== '1'){                //Jazda do przodu. 
  digitalWrite(3,LOW);       //Ustawienie stanu niskiego na pin 3
  digitalWrite(2,HIGH);      //Ustawienie stanu wysokiego na pin 2
  digitalWrite(4,LOW);       
  digitalWrite(5,HIGH);      
   }
else if(data== ){           //Stop
 se if(data== '4'){           //Lewo
  digitalWrite(3,HIGH);
  digitalWrite(2,HIGH);
  digitalWrite(4,LOW);
  digitalWrite(5,HIGH);       //Lewy silnik jest zatrzymany, prawy silnik się obraca
 }
 else if(data== '3'){           //Prawo
  digitalWrite(3,LOW);
  digitalWrite(2,HIGH);
  digitalWrite(4,HIGH);
  digitalWrite(5,HIGH);       //Prawy silnik jest zatrzymany, lewy silnik się obraca
  }
else if(data== '2'){          //Jazda do tyłu
  digitalWrite(2,LOW);
  digitalWrite(3,HIGH);
  digitalWrite(5,LOW);
  digitalWrite(4,HIGH);  
  }
}

 

(edytowany)
1 godzinę temu, farmaceuta napisał:

Ok...w aplikacji masz taką opcję jak "keys configuration" tam przypisz wartości np. 1/2/3/4 dla dół/góra/lewo/prawo a kod ma wyglądać tak... 

void setup() {                //Poczatek funkcji inicjalizującej
  
  pinMode(2,OUTPUT);          //Określenie pinów 2-5 jako wyjścia
  pinMode(3,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);

  Serial.begin(9600);        //Rozpoczęcie transmisji na porcie szeregowym(bluetooth)
}
void loop() {                
  if (Serial.available() > 0) {
    
char data=Serial.read(); 
 Serial.println(data);
 }
  if(data== '1'){                //Jazda do przodu. 
  digitalWrite(3,LOW);       //Ustawienie stanu niskiego na pin 3
  digitalWrite(2,HIGH);      //Ustawienie stanu wysokiego na pin 2
  digitalWrite(4,LOW);       
  digitalWrite(5,HIGH);      
   }
else if(data== ){           //Stop
 se if(data== '4'){           //Lewo
  digitalWrite(3,HIGH);
  digitalWrite(2,HIGH);
  digitalWrite(4,LOW);
  digitalWrite(5,HIGH);       //Lewy silnik jest zatrzymany, prawy silnik się obraca
 }
 else if(data== '3'){           //Prawo
  digitalWrite(3,LOW);
  digitalWrite(2,HIGH);
  digitalWrite(4,HIGH);
  digitalWrite(5,HIGH);       //Prawy silnik jest zatrzymany, lewy silnik się obraca
  }
else if(data== '2'){          //Jazda do tyłu
  digitalWrite(2,LOW);
  digitalWrite(3,HIGH);
  digitalWrite(5,LOW);
  digitalWrite(4,HIGH);  
  }
}

 

Mam problem z twoim kodem...BledyArduino.thumb.png.e7a652f796c5897731936c305d1bcd0f.png

Próbowałem go poprawić na coś takiego:

void setup() {                //Poczatek funkcji inicjalizującej
  
  pinMode(2,OUTPUT);          //Określenie pinów 2-5 jako wyjścia
  pinMode(3,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);

  Serial.begin(9600);        //Rozpoczęcie transmisji na porcie szeregowym(bluetooth)
}
void loop() {                
  if (Serial.available() > 0) {
    
char data=Serial.read(); 
 Serial.println(data);
 }
  if(data==1){               //Jazda do przodu. 
  digitalWrite(3,LOW);       //Ustawienie stanu niskiego na pin 3
  digitalWrite(2,HIGH);      //Ustawienie stanu wysokiego na pin 2
  digitalWrite(4,LOW);       
  digitalWrite(5,HIGH);      
   }
else if(data==4){           //Lewo
  digitalWrite(3,HIGH);
  digitalWrite(2,HIGH);
  digitalWrite(4,LOW);
  digitalWrite(5,HIGH);       //Lewy silnik jest zatrzymany, prawy silnik się obraca
 }
 else if(data==3){           //Prawo
  digitalWrite(3,LOW);
  digitalWrite(2,HIGH);
  digitalWrite(4,HIGH);
  digitalWrite(5,HIGH);       //Prawy silnik jest zatrzymany, lewy silnik się obraca
  }
else if(data==2){          //Jazda do tyłu
  digitalWrite(2,LOW);
  digitalWrite(3,HIGH);
  digitalWrite(5,LOW);
  digitalWrite(4,HIGH);  
  }
}

Ale z tym też jest problem.BledyArduinov2.thumb.png.7ade998b6a9be250ae9bba6f873979b1.png

 

Jeśli chodzi o to, że program wysyła złe zmienne, to korzystałem z konsoli i zmienne wpisywałem ręcznie.

Edytowano przez Farmer
(edytowany)

Nie zmieniaj na liczby bo odbierasz znaki... 

void setup() {                //Poczatek funkcji inicjalizującej
  
  pinMode(2,OUTPUT);          //Określenie pinów 2-5 jako wyjścia
  pinMode(3,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
 } 

void loop() {                
  if (Serial.available() > 0) {
    
char data=Serial.read(); 
 Serial.println(data);
 }
  if(data== '1'){                //Jazda do przodu. 
  digitalWrite(3,LOW);       //Ustawienie stanu niskiego na pin 3
  digitalWrite(2,HIGH);      //Ustawienie stanu wysokiego na pin 2
  digitalWrite(4,LOW);       
  digitalWrite(5,HIGH);      
   }
           //Stop
 else if(data== '4'){           //Lewo
  digitalWrite(3,HIGH);
  digitalWrite(2,HIGH);
  digitalWrite(4,LOW);
  digitalWrite(5,HIGH);       //Lewy silnik jest zatrzymany, prawy silnik się obraca
 }
 else if(data== '3'){           //Prawo
  digitalWrite(3,LOW);
  digitalWrite(2,HIGH);
  digitalWrite(4,HIGH);
  digitalWrite(5,HIGH);       //Prawy silnik jest zatrzymany, lewy silnik się obraca
  }
else if(data== '2'){          //Jazda do tyłu
  digitalWrite(2,LOW);
  digitalWrite(3,HIGH);
  digitalWrite(5,LOW);
  digitalWrite(4,HIGH);  
  }
}
 

Teraz spróbuj 

Edytowano przez farmaceuta
1 godzinę temu, Farmer napisał:

Próbowałem go poprawić na coś takiego:

Wstaw odstęp w warunkach po prawej stronie "data".

Oraz sam już sobie szukałem i działało:

 

 

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...