Samochodzik z trybem auto :) - OnaTuJest - 05-07-2016
Heeeja wszystkim
Niedawno zaczęłam zabawę z arduino, nawet zrobiłam robota : Tzn kupiłam kilka części i złożyłam bo program jest sklejką kilku inny z internetu : 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" : . 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 :? (przyciski na telefonie na pewno są dobrze bo sprawdzałam w kilku innych wariantach)
robot jest podobny do tego
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();
}
}
}
}
RE: Samochodzik z trybem auto :) - adix - 05-07-2016
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 drukujeKod: 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();
}
}
}
}
RE: Samochodzik z trybem auto :) - OnaTuJest - 06-07-2016
Dzięki że odpisałeś
Więc tak
-wgrałam kod
-w serial monitor tylko raz wyskakuje
i dalej jakby nie skanowało.
Porobiłam kilka prób z ręką (1 wartość to 1 wysłanie )
Jak blisko przystawię rękę i wyśle "z" to wykonuje zaprogramowany manewr ale potem jedzie do przodu i czujnik nie reaguje.
RE: Samochodzik z trybem auto :) - adix - 06-07-2016
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.
RE: Samochodzik z trybem auto :) - OnaTuJest - 07-07-2016
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ć?
RE: Samochodzik z trybem auto :) - mateqsz1990 - 11-07-2016
cześć, korzystam też z tej pętli while ale niestety nie mam pojęcia jak z niej wyjść
RE: Samochodzik z trybem auto :) - OnaTuJest - 14-07-2016
Czy ktoś pomoże?
RE: Samochodzik z trybem auto :) - adix - 14-07-2016
(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 .
|