Skocz do zawartości

Kurs budowy robotów - #6 - Światłolub (sterowanie latarką)


Pomocna odpowiedź

Czyli dwie funkcje

void start(){
if (bip<3){
digitalWrite ( Buzzer , HIGH);
delay(300);
digitalWrite ( Buzzer , LOW);
delay(300);
 bip++; 
}
}
void ledstart(){
 while (mig<4){
  digitalWrite (dioda, HIGH);
  delay(400);
  digitalWrite(dioda, LOW);
  delay(300);
mig++;}
}

 

Mam zamienić na for? i  to spowoduje wykonanie każdej funkcji w całości i przejście do następnej ?  

Link do komentarza
Share on other sites

While tak, ale if już nie. Dzieje się tak, że miga i piszczy na zmianę? Spróbuj najpierw zamienić funkcję z instrukcja warunkową na funkcję z pętlą.

Wgrałem u siebie te funkcje i działa to tak jak myślałem, że buzzer piszczy raz, potem dioda miga 3 razy (bo jest w pętli while) a potem buzzer piszczy jeszcze 2 razy, ponieważ warunek dla pętli while już jest spełniony więc dwa razy z rzędu wykonuje funkcję start(). Zmień ten if w funkcji start() na pętle - dowolnie czy while czy for i wszystko będzie ok. 

W tej chwili powinno działać u Ciebie mniej więcej tak:

 

Edytowano przez BHBmacieg
  • Lubię! 2
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

Cześć wszystkim!

Bardzo przyjemna część kursu, fajnie w końcu móc sterować nawet w niewielkim stopniu.

Tak zrobiłem zadanie 6_1 (wideo)

#define PWM_MAX 165
#define ROZNICA_MAX 300
#define ROZNICA_MIN -300

#define L_PWM 5
#define L_DIR 4
#define R_PWM 6
#define R_DIR 9

#define L_SENSOR A1
#define R_SENSOR A0
#define BUZZER 10
#define LED 13

void setup()
{
  Serial.begin(9600);

  pinMode(L_PWM, OUTPUT);
  pinMode(L_DIR, OUTPUT);
  pinMode(R_PWM, OUTPUT);
  pinMode(L_DIR, OUTPUT);

  randomSeed(analogRead(5));
  pinMode(LED, OUTPUT);
  pinMode(BUZZER, OUTPUT);
  digitalWrite(BUZZER, LOW);
}

bool isMoving = false;
bool ledEnable = false;

void loop()
{
    int r_value = analogRead(R_SENSOR);
    int l_value = analogRead(L_SENSOR);
  
  if(isMoving)
  {
    int roznica = l_value - r_value;

    if(roznica < ROZNICA_MIN)
    {
      roznica = ROZNICA_MIN;
    }

    if(roznica > ROZNICA_MAX)
    {
      roznica = ROZNICA_MAX;
    }

    int zmianaPredkosci = map(roznica, ROZNICA_MIN, ROZNICA_MAX, -40, 40);

    leftMotor(30 + zmianaPredkosci);
    rightMotor(30 - zmianaPredkosci);
    }
    else
    {
      ledEnable = !ledEnable;
      digitalWrite(LED, ledEnable);
      if(r_value < 500 || l_value < 500)
      {
        for(int i = 0; i < 3; i++)
        {
          digitalWrite(BUZZER, HIGH);
          delay(200);
          digitalWrite(BUZZER, LOW);
          delay(200);
        }

        isMoving = true;
      }
      delay(150);
    }
}

void leftMotor(int v)
{
  if(v < 0)
  {
    v = map(abs(v), 0, 100, 0, PWM_MAX);
    digitalWrite(L_DIR, 1);
    analogWrite(L_PWM, v);
  }
  else
  {
    v = map(v, 0, 100, 0, PWM_MAX);
    digitalWrite(L_DIR, 0);
    analogWrite(L_PWM, v);
  }
}

void rightMotor(int v)
{
  if(v < 0)
  {
    v = map(abs(v), 0, 100, 0, PWM_MAX);
    digitalWrite(R_DIR, 1);
    analogWrite(R_PWM, v);
  }
  else
  {
    v = map(v, 0, 100, 0, PWM_MAX);
    digitalWrite(R_DIR, 0);
    analogWrite(R_PWM, v);
  }
}

void stopMotors()
{
  analogWrite(L_PWM, 0);
  analogWrite(R_PWM, 0);
}

 

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

hej, małe pytanko. Nie rozmumiem dlaczego zakrywając fotorezystor mam wartości nizsze a świecąc latarka wyzsze. Przy czym nie używam czujników z zestawu tylko z II cześci Arduino. oczywiście łatwo to obejść zaminiając plus z minusem w programie. 

Link do komentarza
Share on other sites

@Kubi zapewne używasz fotorezystora w układzie dzielnika napięcia, zależy to zatem od tego w którym miejscu go umieścić - czy przy plusie czy minusie zasilania. Przy plusie oświetlenie (spadek rezystancji) spowoduje zwiększenie napięcia, przy minusie odwrotnie.

Link do komentarza
Share on other sites

Dnia 18.02.2021 o 19:29, Kubi napisał:

hej, małe pytanko. Nie rozmumiem dlaczego zakrywając fotorezystor mam wartości nizsze a świecąc latarka wyzsze. Przy czym nie używam czujników z zestawu tylko z II cześci Arduino. oczywiście łatwo to obejść zaminiając plus z minusem w programie. 

Ja zamiast podłączyć części z kursu czyli zestaw fotorezystora z diodą, podłączyłem sobie fotorezystor i rezystor, ale nie działa to wcale, tzn jak zaświecę na jedną czujkę to wartości się zmieniają na obu i jak zaświecę na lewy czujnik to spadają wartości na obu, jak zabiorę źródło światła to nic się nie dzieje do momentu aż zaświecę na drugi czujnik, wtedy wartości na obu wzrastają. Dodam, że jak podłącze te z kursu to wszystko działa normalnie.

Link do komentarza
Share on other sites

Niestety czujniki pomimo pracy w identycznych warunkach pokazują zupełnie różne wartości. Zamieniałem je miejscami, najwidoczniej problem leży po stronie jednego czujnika. Jaką rezystancję mają fotorezystory zamontowane w czujnikach? Spróbuję wlutować nowy.  

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.