• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Samochodzik z trybem auto :)
#1
Tongue 
Heeeja wszystkim Smile

Niedawno zaczęłam zabawę z arduino, nawet zrobiłam robota :Smile Tzn kupiłam kilka części i złożyłam bo program jest sklejką kilku inny z internetu :Smile Ale do rzeczy, jest do samochodzik sterowany zdalnie telefonem przez bt. Wszystko fajnie działa tak jak chciałam tylko jest problem z trybem "auto" :Sad  . Nie wiem dlaczego cały czas jedzie do przodu , jak dam ten kawałek kodu w pętli while to nie ma problemu i działa (czyli omija przeszkodę) ale jest problem z wyjściem bo naciskam stop na telefonie a robocik nie reaguje i cały czas działa w trybie auto .  Czy może mi ktoś poprawić to albo naprowadzić mnie :Tongue? (przyciski na telefonie na pewno są dobrze bo sprawdzałam w kilku innych  wariantachBig Grin

robot jest podobny do tego [Obrazek: robot_ikona.jpg]

a tu proszę cały kod

Kod:
#include <NewPing.h>  

#define TRIGGER_PIN 2
#define ECHO_PIN 3
#define MAX_DISTANCE 100

const int outPin = 5;
const int outPin2 = 6;
const int outPin3 = 11;
const int outPin4 = 10;

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);

unsigned int time;        
int distance;              
int triggerDistance = 30;    
int fDistance;            
int lDistance;
int rDistance;

void setup()
{
Serial.begin(9600);
pinMode(outPin, OUTPUT);  
pinMode(outPin2, OUTPUT);  
pinMode(outPin3, OUTPUT);  
pinMode(outPin4, OUTPUT);
}

void scan(){
time = sonar.ping();                
distance = time / US_ROUNDTRIP_CM;  
if(distance == 0){                  
 distance = 100;                  
}
delay(5);
}

void moveBackward(){
digitalWrite(outPin, LOW);
digitalWrite(outPin2, HIGH);
digitalWrite(outPin3, HIGH);
digitalWrite(outPin4, LOW);
}

void moveForward(){
digitalWrite(outPin, HIGH);
digitalWrite(outPin2, LOW);
digitalWrite(outPin3, LOW);
digitalWrite(outPin4, HIGH);
}

void moveRight(){
digitalWrite(outPin, LOW);
digitalWrite(outPin2, LOW);
digitalWrite(outPin3, LOW);
digitalWrite(outPin4, HIGH);
}

void moveLeft(){
digitalWrite(outPin, HIGH);
digitalWrite(outPin2, LOW);
digitalWrite(outPin3, LOW);
digitalWrite(outPin4, LOW);
}

void moveStop(){
digitalWrite(outPin, LOW);
digitalWrite(outPin2, LOW);
digitalWrite(outPin3, LOW);
digitalWrite(outPin4, LOW);
}


void loop()
{
  if (Serial.available()){
 char bt = Serial.read();

 if(bt == 'u'){            //do przodu
digitalWrite(outPin,HIGH);
digitalWrite(outPin2,LOW);
digitalWrite(outPin3,HIGH);
digitalWrite(outPin4,LOW);
 }
else if (bt == 'd'){       //do tyłu
digitalWrite(outPin,LOW);
digitalWrite(outPin2,HIGH);
digitalWrite(outPin3,LOW);
digitalWrite(outPin4,HIGH);
}
else if (bt == 's'){       //stop
digitalWrite(outPin,LOW);
digitalWrite(outPin2,LOW);
digitalWrite(outPin3,LOW);
digitalWrite(outPin4,LOW);
}
else if (bt == 'r'){       //prawo
digitalWrite(outPin,HIGH);
digitalWrite(outPin2,LOW);
digitalWrite(outPin3,LOW);
digitalWrite(outPin4,LOW);
}

 else if (bt == 'l'){       //lewo
digitalWrite(outPin,LOW);
digitalWrite(outPin2,LOW);
digitalWrite(outPin3,HIGH);
digitalWrite(outPin4,LOW);
 }
 else if (bt == 'e'){       //lewo w tym samym miejscu
digitalWrite(outPin,LOW);
digitalWrite(outPin2,HIGH);
digitalWrite(outPin3,HIGH);
digitalWrite(outPin4,LOW);
 }

 else if (bt == 'i'){       //prawo w tym samym miejscu
digitalWrite(outPin,HIGH);
digitalWrite(outPin2,LOW);
digitalWrite(outPin3,LOW);
digitalWrite(outPin4,HIGH);
 }

else if (bt == 'z') /// automatyczny
{
scan();                            
fDistance = distance;              
if(fDistance < triggerDistance){    
 moveBackward();              
 delay(1000);
 moveRight();                      
 delay(500);
 moveStop();                        
 scan();                          
 rDistance = distance;              
 moveLeft();
 delay(1000);                      
 moveStop();                      
 scan();                          
 lDistance = distance;            
 if(lDistance < rDistance){        
 moveRight();                  
 delay(200);
 moveForward();                
 }
 else{
 moveForward();                  
 }
}
else{
 moveForward();                  
}
}
}
}
[Obrazek: lpudoa819ca.png]
 
Odpowiedź
#2
Po pierwsze zrobił bym minimalizacje kodu czyli nie powtarzał bym funkcji np przód, tył.(mam na mysli ta czesc kodu
Kod:
void loop()
{
  if (Serial.available()){
char bt = Serial.read();

if(bt == 'u'){            //do przodu
digitalWrite(outPin,HIGH);
digitalWrite(outPin2,LOW);
digitalWrite(outPin3,HIGH);
digitalWrite(outPin4,LOW);
}
else if (bt == 'd'){       //do tyłu
digitalWrite(outPin,LOW);
digitalWrite(outPin2,HIGH);
digitalWrite(outPin3,LOW);
digitalWrite(outPin4,HIGH);
}
else if (bt == 's'){       //stop
digitalWrite(outPin,LOW);
digitalWrite(outPin2,LOW);
digitalWrite(outPin3,LOW);
digitalWrite(outPin4,LOW);
}
else if (bt == 'r'){       //prawo
digitalWrite(outPin,HIGH);
digitalWrite(outPin2,LOW);
digitalWrite(outPin3,LOW);
digitalWrite(outPin4,LOW);
}

else if (bt == 'l'){       //lewo
digitalWrite(outPin,LOW);
digitalWrite(outPin2,LOW);
digitalWrite(outPin3,HIGH);
digitalWrite(outPin4,LOW);
}
else if (bt == 'e'){       //lewo w tym samym miejscu
digitalWrite(outPin,LOW);
digitalWrite(outPin2,HIGH);
digitalWrite(outPin3,HIGH);
digitalWrite(outPin4,LOW);
}

else if (bt == 'i'){       //prawo w tym samym miejscu
digitalWrite(outPin,HIGH);
digitalWrite(outPin2,LOW);
digitalWrite(outPin3,LOW);
digitalWrite(outPin4,HIGH);
}
Zrobił bym 4 pod programy do przodu, do tył ,prawo ,lewo .
Połącz do serial monitora i wstaw mi odczyt w tym miejscu co ci drukuje
Kod:
scan();                            
fDistance = distance;  
Serial.println(fDistance);          
if(fDistance < triggerDistance){    
moveBackward();              
delay(1000);
moveRight();                      
delay(500);
moveStop();                        
scan();                          
rDistance = distance;              
moveLeft();
delay(1000);                      
moveStop();                      
scan();                          
lDistance = distance;



oraz spróbuj ten kod
Kod:
#include <NewPing.h>  

#define TRIGGER_PIN 2
#define ECHO_PIN 3
#define MAX_DISTANCE 100

const int outPin = 5;
const int outPin2 = 6;
const int outPin3 = 11;
const int outPin4 = 10;

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);

unsigned int time;        
int distance;              
int triggerDistance = 30;    
int fDistance;            
int lDistance;
int rDistance;

void setup()
{
Serial.begin(9600);
pinMode(outPin, OUTPUT);  
pinMode(outPin2, OUTPUT);  
pinMode(outPin3, OUTPUT);  
pinMode(outPin4, OUTPUT);
}

void scan(){
time = sonar.ping();                
distance = time / US_ROUNDTRIP_CM;  
if(distance == 0){                  
distance = 100;                  
}
delay(5);
}

void moveBackward(){
digitalWrite(outPin, LOW);
digitalWrite(outPin2, HIGH);
digitalWrite(outPin3, HIGH);
digitalWrite(outPin4, LOW);
}

void moveForward(){
digitalWrite(outPin, HIGH);
digitalWrite(outPin2, LOW);
digitalWrite(outPin3, LOW);
digitalWrite(outPin4, HIGH);
}

void moveRight(){
digitalWrite(outPin, LOW);
digitalWrite(outPin2, LOW);
digitalWrite(outPin3, LOW);
digitalWrite(outPin4, HIGH);
}

void moveLeft(){
digitalWrite(outPin, HIGH);
digitalWrite(outPin2, LOW);
digitalWrite(outPin3, LOW);
digitalWrite(outPin4, LOW);
}

void moveStop(){
digitalWrite(outPin, LOW);
digitalWrite(outPin2, LOW);
digitalWrite(outPin3, LOW);
digitalWrite(outPin4, LOW);
}


void loop()
{
  if (Serial.available()){
char bt = Serial.read();

if(bt == 'u'){            //do przodu
digitalWrite(outPin,HIGH);
digitalWrite(outPin2,LOW);
digitalWrite(outPin3,HIGH);
digitalWrite(outPin4,LOW);
}
else if (bt == 'd'){       //do tyłu
digitalWrite(outPin,LOW);
digitalWrite(outPin2,HIGH);
digitalWrite(outPin3,LOW);
digitalWrite(outPin4,HIGH);
}
else if (bt == 's'){       //stop
digitalWrite(outPin,LOW);
digitalWrite(outPin2,LOW);
digitalWrite(outPin3,LOW);
digitalWrite(outPin4,LOW);
}
else if (bt == 'r'){       //prawo
digitalWrite(outPin,HIGH);
digitalWrite(outPin2,LOW);
digitalWrite(outPin3,LOW);
digitalWrite(outPin4,LOW);
}

else if (bt == 'l'){       //lewo
digitalWrite(outPin,LOW);
digitalWrite(outPin2,LOW);
digitalWrite(outPin3,HIGH);
digitalWrite(outPin4,LOW);
}
else if (bt == 'e'){       //lewo w tym samym miejscu
digitalWrite(outPin,LOW);
digitalWrite(outPin2,HIGH);
digitalWrite(outPin3,HIGH);
digitalWrite(outPin4,LOW);
}

else if (bt == 'i'){       //prawo w tym samym miejscu
digitalWrite(outPin,HIGH);
digitalWrite(outPin2,LOW);
digitalWrite(outPin3,LOW);
digitalWrite(outPin4,HIGH);
}

else if (bt == 'z') /// automatyczny
{
scan();                            
fDistance = distance;  
      
if(fDistance < triggerDistance){    
moveBackward();              
delay(1000);
moveRight();                      
delay(500);
moveStop();                        
scan();                          
rDistance = distance;              
moveLeft();
delay(1000);                      
moveStop();                      
scan();                          
lDistance = distance;  
}  else{
moveForward();                  
}

        
if(lDistance < rDistance){        
moveRight();                  
delay(200);
moveForward();                
}


else{
moveForward();                  
}
}
}
}
[Obrazek: banerelektronika.jpg]



Jeśli pomogłem podziękuj punktem reputacji Wink
 
Odpowiedź
#3
Dzięki że odpisałeś Smile
Więc tak 
-wgrałam kod
-w serial monitor tylko raz wyskakuje 
Kod:
100
i dalej jakby nie skanowało.

Porobiłam kilka prób z ręką  (1 wartość to 1 wysłanie ) 
Kod:
3
6
10
22
100
Jak blisko przystawię rękę i wyśle "z" to wykonuje zaprogramowany manewr ale potem jedzie do przodu i czujnik nie reaguje.
[Obrazek: lpudoa819ca.png]
 
Odpowiedź
#4
Kod:
if(fDistance < triggerDistance)
To nie będzie ten warunek spełniony skoro fDistans=100 a triggerDistance=30 sprawdź ten warunek czy jest szansa aby go spełnić.

A po wgraniu ostatniego kodu co ci wysłałem jak się zachowuje.
[Obrazek: banerelektronika.jpg]



Jeśli pomogłem podziękuj punktem reputacji Wink
 
Odpowiedź
#5
Właśnie na twoim kodzie sprawdzałam i cały czas jedzie do przodu.

Tu właśnie nie chodzi o czujnik a o ten fragment kodu
Kod:
else if (bt == 'z') /// automatyczny
{
scan();                            
fDistance = distance;              
if(fDistance < triggerDistance){    
moveBackward();              
delay(1000);
moveRight();                      
delay(500);
moveStop();                        
scan();                          
rDistance = distance;              
moveLeft();
delay(1000);                      
moveStop();                      
scan();                          
lDistance = distance;            
if(lDistance < rDistance){        
moveRight();                  
delay(200);
moveForward();                
}
else{
moveForward();                  
}
}
else{
moveForward();                  
}
}
}
}

jeśli w nim zmienię "else if" na "while"
to czujnik działa wyśmienicie i autko jeździ tak jak chcę na automacie ale nie mogę go potem przełączyć na tryb manualny.


@@edit
chyba jednak coś źle zaprogramowałam z tym czujnikiem, bo dopiero jak założyłam koło to stwierdziłam że coś jest nie tak, aktualny kod (poprawiłam kierunki)

Kod:
#include <NewPing.h>  

#define TRIGGER_PIN 2
#define ECHO_PIN 3
#define MAX_DISTANCE 100

const int outPin = 5;
const int outPin2 = 6;
const int outPin3 = 11;
const int outPin4 = 10;

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);

unsigned int time;        
int distance;              
int triggerDistance = 30;    
int fDistance;            
int lDistance;
int rDistance;

void setup()
{
Serial.begin(9600);
pinMode(outPin, OUTPUT);  
pinMode(outPin2, OUTPUT);  
pinMode(outPin3, OUTPUT);  
pinMode(outPin4, OUTPUT);
}

void scan(){
time = sonar.ping();                
distance = time / US_ROUNDTRIP_CM;  
if(distance == 0){                  
distance = 100;                  
}
delay(10);
}

void moveBackward(){
digitalWrite(outPin,LOW);
digitalWrite(outPin2,HIGH);
digitalWrite(outPin3,LOW);
digitalWrite(outPin4,HIGH);
}

void moveForward(){
digitalWrite(outPin,HIGH);
digitalWrite(outPin2,LOW);
digitalWrite(outPin3,HIGH);
digitalWrite(outPin4,LOW);
}

void moveRight(){
digitalWrite(outPin,LOW);
digitalWrite(outPin2,LOW);
digitalWrite(outPin3,HIGH);
digitalWrite(outPin4,LOW);
}

void moveLeft(){
digitalWrite(outPin,HIGH);
digitalWrite(outPin2,LOW);
digitalWrite(outPin3,LOW);
digitalWrite(outPin4,LOW);
}

void moveStop(){
digitalWrite(outPin, LOW);
digitalWrite(outPin2, LOW);
digitalWrite(outPin3, LOW);
digitalWrite(outPin4, LOW);
}


void loop()
{
  if (Serial.available()){
char bt = Serial.read();

if(bt == 'u'){            //do przodu
digitalWrite(outPin,HIGH);
digitalWrite(outPin2,LOW);
digitalWrite(outPin3,HIGH);
digitalWrite(outPin4,LOW);
}
else if (bt == 'd'){       //do tyłu
digitalWrite(outPin,LOW);
digitalWrite(outPin2,HIGH);
digitalWrite(outPin3,LOW);
digitalWrite(outPin4,HIGH);
}
else if (bt == 's'){       //stop
digitalWrite(outPin,LOW);
digitalWrite(outPin2,LOW);
digitalWrite(outPin3,LOW);
digitalWrite(outPin4,LOW);
}
else if (bt == 'r'){       //lewo
digitalWrite(outPin,HIGH);
digitalWrite(outPin2,LOW);
digitalWrite(outPin3,LOW);
digitalWrite(outPin4,LOW);
}

else if (bt == 'e'){       //prawo
digitalWrite(outPin,LOW);
digitalWrite(outPin2,LOW);
digitalWrite(outPin3,HIGH);
digitalWrite(outPin4,LOW);
}
else if (bt == 'l'){       //prawo w tym samym miejscu
digitalWrite(outPin,LOW);
digitalWrite(outPin2,HIGH);
digitalWrite(outPin3,HIGH);
digitalWrite(outPin4,LOW);
}

else if (bt == 'i'){       //lewo w tym samym miejscu
digitalWrite(outPin,HIGH);
digitalWrite(outPin2,LOW);
digitalWrite(outPin3,LOW);
digitalWrite(outPin4,HIGH);
}

else 
while (bt == 'z') /// automatyczny
{
scan();
                           
fDistance = distance;   
       
if(fDistance < triggerDistance){    
moveBackward();              
delay(780);
moveRight();                      
delay(500);
moveStop();                        
scan();                          
rDistance = distance;              
moveLeft();
delay(1000);                      
moveStop();                      
scan();                          
lDistance = distance;   
}  else{
moveForward();                  
}

         
if(lDistance < rDistance){        
moveRight();                  
delay(200);
moveForward();                
}


else{
moveForward();                  
}
}
}
}

no i jest tak ze po włączeniu trybu auto jedzie do przodu ,wykryje przeszkodę jedzie do tylu następnie cofa się w prawo potem jedzie w prawo do przodu i jak nic nie wykryje to prostu i tak się zapętla. Czyli chyba nie bardzo jak jest w tym warunku napisane :/


@@@edit v2
znalazłam taki filmik https://www.youtube.com/watch?v=j19aq5owmBE
właśnie tak chciałabym aby działał mój robocik w trybie auto. Niestety, nie bardzo mi się to udaję, czytam różne poradniki ale tam zawsze servo na ten czujnik jest a jak nie ma to robią taki kod że tylko w jedną stronę skręca :/ Możecie mnie naprowadzić?
[Obrazek: lpudoa819ca.png]
 
Odpowiedź
#6
cześć, korzystam też z tej pętli while ale niestety nie mam pojęcia jak z niej wyjść
 
Odpowiedź
#7
Czy ktoś pomoże?
[Obrazek: lpudoa819ca.png]
 
Odpowiedź
#8
(11-07-2016, 13:33)mateqsz1990 napisał(a): cześć, korzystam też z tej pętli while ale niestety nie mam pojęcia jak z niej wyjść

Spelniajac warunek jaki zadałeś zgodni z założeniami pętli while
ta pętla wykonuje się do momentu osiągnięcia pozytywnego wyniki

int iStart=-100;
while( iStart >= 0 )
{

--iStart;
} //while
to raczej oczywiste .
[Obrazek: banerelektronika.jpg]



Jeśli pomogłem podziękuj punktem reputacji Wink
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości