Wątek przeniesiony 2018-11-08 11:36 z C/C++ przez Marooned.

Problem dotyczący ifa w ifie

Odpowiedz Nowy wątek
2018-09-01 19:40
0

Witam mam pewien problem dotyczący ifa w ifie.
Otóż robiłem robocika (arduino) na ultradźwiękowym czujniku odległości (przyjmujemy, że drogi które może obrać są 3 prawo lewo i przód) który miał działać tak, że gdy nie ma przeszkody jedzie do przodu (włącza styczniki których pinami wyjściowymi są 8 i 7, gdy jest przeszkoda skręca w prawo (włącza stycznik którego pinem wyjściowym jest 8 na 2 sekundy) lecz gdy skręcił w prawo i nadal wykrywa przeszkodę skręca dwukrotnie w lewo (włącza stycznik 7 na 4 sekundy), a program wygląda następująco

#define trigPin 12
#define echoPin 11

void setup() {
  Serial.begin (9600);
  pinMode(trigPin, OUTPUT); //Pin, do którego podłączymy trig jako wyjście
  pinMode(echoPin, INPUT); //a echo, jako wejście
  pinMode(8, OUTPUT); //Wyjście dla buzzera
  pinMode(7, OUTPUT);
}

void loop() {  
  zakres(0, 3);   
  delay(100);
} 

int zmierzOdleglosc() {
  long czas, dystans;

  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  czas = pulseIn(echoPin, HIGH);
  dystans = czas / 58;

  return dystans;
}

void zakres(int a, int b) {
  int jakDaleko = zmierzOdleglosc();
  if ((jakDaleko > a) && (jakDaleko < b)) {
      digitalWrite(8, HIGH);
      delay(2000);
      digitalWrite(8, LOW);

      if ((jakDaleko > a) && (jakDaleko < b)) {
          digitalWrite(7, HIGH);
          delay(4000);
          digitalWrite(7, LOW);
      }

      else {
      digitalWrite(8, HIGH);
      digitalWrite(7, HIGH);
  }}
      else {
      digitalWrite(8, HIGH);
      digitalWrite(7, HIGH);
  }
}

Problem z tego co mi się wydaje znajduje się tu gdzie jest if w ifie

void zakres(int a, int b) {
  int jakDaleko = zmierzOdleglosc();
  if ((jakDaleko > a) && (jakDaleko < b)) {
      digitalWrite(8, HIGH);
      delay(2000);
      digitalWrite(8, LOW);

      if ((jakDaleko > a) && (jakDaleko < b)) {
          digitalWrite(7, HIGH);
          delay(4000);
          digitalWrite(7, LOW);
      }

      else {
      digitalWrite(8, HIGH);
      digitalWrite(7, HIGH);
  }

Proszę o pomoc.

edytowany 4x, ostatnio: furious programming, 2018-09-01 23:40
Wstawiaj kod w znaczniki kolorujące składnię – ```csharp przed kodem, a po kodzie samo ``` - furious programming 2018-09-01 20:46
Ale to nie C#. - somekind 2018-09-01 21:07
Fakt, nie zwróciłem uwagi na kod, a jedynie na tag (błędny). - furious programming 2018-09-01 21:08

Pozostało 580 znaków

2018-09-01 19:53
0

Hej,
nie do końca rozumiem to warunkowanie. Może wystarczy takie: jeżeli dystans (na podstawie sygnału) jest mniejszy od określonej wartości, to wtedy podejmujemy jakieś czynności. Można jeszcze wysyłać jakieś sygnały w lewo i w prawo, i jak robocik natrafi na trzy ściany, to zawraca, dobrze myślę ?? czy ujowo ?? :)

edytowany 1x, ostatnio: hurgadion, 2018-09-01 19:54

Pozostało 580 znaków

2018-09-01 20:04
0

Program nie był w całości pisany przeze mnie lecz skopiowany z forbota (program na załączanie buzzera) i przerobiony/dopisany.
Nie do końca rozumiem co miałeś na myśli gdyż sam nie pojmuję na jakiej zasadzie program sprawdza odległość lecz jest to tak zrobione, że gdy przeszkoda nie jest wykrywana to jedzie do przodu a gdy jest to sprawdza inne drogi do momentu w którym będzie mógł jechać przed siebie i nie chodzi mi tu o robota który przejdzie labirynt a jedynie "krętą drogę"

edytowany 3x, ostatnio: swaqqu, 2018-09-01 20:08

Pozostało 580 znaków

2018-09-01 20:07
0

To w takim razie zajmij się tym, i ogarnij logikę poruszania się tego robota (tak na chłopski rozum), dojeżdża do ściany i co robi dalej, itd. a jak będziesz miał logikę rozrysowaną, możesz nawet sobie zrobić jakieś rysunki, to wtedy przełożenie na warunkowanie nie będzie trudne. bo zaczynasz robotę, że tak powiem od d$%^ strony :)

Pozostało 580 znaków

2018-09-01 20:09
0

To jest tak że gdy dojedzie do ścianki to skręca w prawo i gdy już nie ma przeszkody jedzie w przód. Lecz gdy skręcił w prawo i nadal wykrywa przeszkodę t skręca w lewo dwukrotnie. System działania miałem zaplanowany zanim się zabrałem do przerabiania programu :P Problem jest taki, że wszystko wariuje gdy już dopiszę tą zależność gdy skręciłeś już w prawo i nadal masz przeszkodę włącz silnik lewy na czas dwukrotnie większy od tego gdy skręcałeś w prawo.

edytowany 2x, ostatnio: swaqqu, 2018-09-01 20:14
jak widać, źle, sorki, tyle ode mnie, nie lubię poprawiać programików, musiałbym pisać od nowa :) a jak się sprężysz, to dasz radę :) - hurgadion 2018-09-01 20:14

Pozostało 580 znaków

2018-09-01 22:44
0

Ale z czym masz problem? Weź opisz jeszcze raz jak powinien działać program, a jak działa w rzeczywistości.

Pozostało 580 znaków

2018-09-01 22:50
0

Chwilowo działa tak, że gdy nie ma przeszkody to jedzie w przód a gdy napotka przeszkodę to z kilkusekundowym opóźnieniem załącza się stycznik podpięty pod pin nr 7 tzn. włącza się lewy silnik. To jak ma działać wyjaśniłem już dokładnie.

edytowany 1x, ostatnio: swaqqu, 2018-09-01 22:50

Pozostało 580 znaków

2018-09-01 22:52
0

W sensie, że za późno reaguje i wjeżdża w ścianę zamiast ją ominąć? Opisz dokładnie zasadę działania i w czym jest problem, bo nie opisałeś tego albo przynajmniej ja nie rozumiem.

edytowany 1x, ostatnio: Draaz, 2018-09-01 22:52

Pozostało 580 znaków

2018-09-01 22:59
0

Gdy czujnik nic nie wykrywa robot jedzie prosto lecz gdy jest przeszkoda to najpierw skręca w prawo i teraz albo nadal jest przeszkoda albo nie jeśli tak to skręca w lewo w czasie dwukrotnie większym niż gdy skręcał w prawo (by wrócić do pozycji na której napotkał przeszkodę a potem skręcić w 3 możliwą stronę) zaczekaj chwilę to ci to rozrysuję

Pozostało 580 znaków

2018-09-01 23:01
0

W skrócie robot powinien skręcić w prawo po wykryciu przeszkody, a skręca w lewo tak? I gdy piny 8 i 7 są w stanie wysokim to jedzie prosto, gdy w stanie wysokim jest tylko pin 8 to jedzie w prawo, a jak tylko 7 to w lewo?

edytowany 1x, ostatnio: Draaz, 2018-09-01 23:03

Pozostało 580 znaków

2018-09-01 23:04
0

WIN_20180901_230256.JPG może to ci w jakiś sposób rozjaśni to jak ma działać (tak wiem ciężko zrozumieć mój tok myślenia)

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0