Skocz do zawartości

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


Farmer

Pomocna odpowiedź

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

Link do komentarza
Share on other sites

@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.

Link do komentarza
Share on other sites

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".

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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 

  • Lubię! 1
Link do komentarza
Share on other sites

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

Link do komentarza
Share on other sites

2 godziny temu, Santiago napisał:

Może zmiń int data na byte data. 

 

Działa tak samo, tylko Arduino wysyła ciągle 255 zamiast -1

Link do komentarza
Share on other sites

(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
Link do komentarza
Share on other sites

(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
Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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);  
  }
}

 

Link do komentarza
Share on other sites

(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
Link do komentarza
Share on other sites

(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
Link do komentarza
Share on other sites

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:

 

 

Link do komentarza
Share on other sites

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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.