• 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
If nie działa (a tak poza tym to laser dla kota)
#1
Dzień dobry,
Mam problem, a dokładniej chodzi o to, że chciałem zrobić sterowany laser dla kota działający z kontrolerem na telefonie (bluetooth). Zbudowałem go, a kiedy zacząłem go programować, okazało się, że nie umiem tego zrobić. Dzięki diagnostyce udało mi się ustalić, że komendy if nie działają i najzwyczajniej if nie wykrywa w odpowiednim momencie, że musi odpalić inne komendy. Czy mógłby ktoś mi pomóc? Załączam plik z (dotychczasowym) kodem. 
.zip   kod laserek.zip (Rozmiar: 790 bajtów / Pobrań: 1)



Kod:
#define Speed 3 //określenie pinu do definiowania szybkości silnika
#define output1 5 // określenie pierwszego pinu silnika
#define output2 6 // określenie drugiego pinu silnika
#define laser 11 // określenie pinu lasera

#include <Servo.h> // biblioteka serwomachanizmów
Servo laserek; // definiowanie nowego serwa

int moc = 170; //moc lasera (przy zbyt dużym napięciu laser się przegrzewa)
int c = 0; // odbieranie informacji od bluetooth

void setup() {
  pinMode(output1,OUTPUT);
  pinMode(output2,OUTPUT);
  pinMode(Speed, OUTPUT);
  pinMode(laser, OUTPUT);

  laserek.attach(9);

  digitalWrite(laser, moc);

  laserek.write(0);

  Serial.begin(9600);

 
}

void loop() { 

  digitalWrite(laser, moc);
  Serial.write(c);// część diagnostyki


  if (Serial.available()){ //if od wykrywania wiadomości z kontrolera (działa)
    c = Serial.read();
    Serial.write(c); // część diagnostyki
    }
 
  if (c == 1){ //wykrycie pierwszego przycisku (nie działa)
      laserek.write(laserek.read() + 1);
      Serial.write("KK"); //część diagnostyki
    }
    if (c == "2"){ //if od drugiego przycisku (nie działa)
      laserek.write(laserek.read() - 1);
      Serial.write("KK"); //część diagnostyki
    }
    if (c == 3){ //if od trzeciego przycisku (nie działa)
      digitalWrite(Speed, 255);
      digitalWrite(output1,LOW);
      digitalWrite(output2,HIGH);
      Serial.write("KK"); //część diagnostyki
      delay(500);
    }
    if (c == 4){ //if od czwartego przycisku (nie działa)
      digitalWrite(Speed, 255);
      digitalWrite(output1,HIGH);
      digitalWrite(output2,LOW);
      Serial.write("KK"); // część diagnostyki
      delay(500);
    }
    if (c == 5){ //if od piątego przycisku (nie działa)
      if(moc > 120){
        moc = 0;
        Serial.write("KK"); //część diagnostyki
      }else{
        moc = 170;
        Serial.write("KK"); //część diagnostyki
      }
    }
}
 
Odpowiedź
#2
Podejrzewam, że to co otrzymujesz nie jest zmienną int tylko char i stąd problem.
 
Odpowiedź
#3
Gwarantuję, że if działa! Dział tak jak każesz.
Możesz wytłumaczyć, dlaczego czasem w kodzie porównujesz z liczbą
Kod:
if (c == 1){ //wykrycie pierwszego przycisku (nie działa)
a czasem z kodem znaku
Kod:
if (c == "2"){ //if od drugiego przycisku (nie działa)
?
Co wyświetla serial monitor gdy wykonuje się fragment
Kod:
if (Serial.available()){ //if od wykrywania wiadomości z kontrolera (działa)
    c = Serial.read();
    Serial.write(c); // część diagnostyki
    }
?
 
Odpowiedź
#4
Pierwsza sprawa:
Kod:
digitalWrite(laser, moc);
Tak nie reguluje się mocy lasera. Podejrzewam, że chodziło Ci o sygnał PWM, więc powinno to wyglądać tak:
Kod:
analogWrite(laser, moc);

Druga sprawa, to jak wyglądają komendy wysyłane z telefonu?

Tak naprawdę to wysyłasz kody ASCII, a c=Serial.read() przypisuje te kody do zmiennej c.
Więc jeśli wyślesz char '1', to c=49 i za chwilę c=10 bo jeszcze mamy '\n' co w ASCII jest decymalnie równe 10.
Proponuję:
Kod:
  if (Serial.available())
   {
      c = Serial.parseInt(SKIP_WHITESPACE,'\n');
   }
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#5
(09-12-2019, 20:28)semi napisał(a): Gwarantuję, że if działa! Dział tak jak każesz.
Możesz wytłumaczyć, dlaczego czasem w kodzie porównujesz z liczbą
Kod:
  if (c == 1){ //wykrycie pierwszego przycisku (nie działa)
a czasem z kodem znaku
Kod:
    if (c == "2"){ //if od drugiego przycisku (nie działa)
?
Co wyświetla serial monitor gdy wykonuje się fragment
Kod:
if (Serial.available()){ //if od wykrywania wiadomości z kontrolera (działa)
    c = Serial.read();
    Serial.write(c); // część diagnostyki
    }
?
Robiłem raz z liczbą, a raz ze znakiem, bo testy robiłem i zapomniałem usunąć. A gdy wykonuje ten fragment, to wyświetla to, co się wyślę z telefonu.
 
Odpowiedź
#6
(09-12-2019, 20:33)Robson Kerman napisał(a): Pierwsza sprawa:
Kod:
digitalWrite(laser, moc);
Tak nie reguluje się mocy lasera. Podejrzewam, że chodziło Ci o sygnał PWM, więc powinno to wyglądać tak:
Kod:
analogWrite(laser, moc);

Druga sprawa, to jak wyglądają komendy wysyłane z telefonu?

Tak naprawdę to wysyłasz kody ASCII, a c=Serial.read() przypisuje te kody do zmiennej c.
Więc jeśli wyślesz char '1', to c=49 i za chwilę c=10 bo jeszcze mamy '\n' co w ASCII jest decymalnie równe 10.
Proponuję:
Kod:
  if (Serial.available())
   {
      c = Serial.parseInt(SKIP_WHITESPACE,'\n');
   }
Sprawdzałem i nie wysyła ascii tylko to co na telefonie wpisywałem. I nie chodziło mi o regulacje mocy, tylko o to, żeby można było wyłączyć, a 5V z pinu było za dużo i laser się przegrzewał, więc trzeba było zmienić PWN i wszystko działa z digitalRead.
 
Odpowiedź
#7
(09-12-2019, 21:55)Fl1p3r3k napisał(a): Sprawdzałem i nie wysyła ascii tylko to co na telefonie wpisywałem.

A jak to sprawdziłeś? Bo jeśli tak:

Kod:
  if (Serial.available()){ //if od wykrywania wiadomości z kontrolera (działa)
    c = Serial.read();
    Serial.write(c); // część diagnostyki
    }

to uwierz mi, ale gdy wyślesz z telefonu 1, to c przyjmie wartość 49.
Zrób taki eksperyment i napisz program:

Kod:
void setup() {
  Serial.begin(9600);
  Serial.write(49);
}

void loop() { 
}

I powiedz co się wyświetliło? 49 czy 1?
Albo w swoim kodzie zamiast
Kod:
Serial.write(c)
, wpisz
Kod:
Serial.print(c)
, to się przekonasz.

Albo zamiast if(c==1) napisz if(c==49), to gwarantuję, że warunek zadziała.
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#8
(09-12-2019, 22:50)Robson Kerman napisał(a):
(09-12-2019, 21:55)Fl1p3r3k napisał(a): Sprawdzałem i nie wysyła ascii tylko to co na telefonie wpisywałem.

A jak to sprawdziłeś? Bo jeśli tak:

Kod:
  if (Serial.available()){ //if od wykrywania wiadomości z kontrolera (działa)
    c = Serial.read();
    Serial.write(c); // część diagnostyki
    }

to uwierz mi, ale gdy wyślesz z telefonu 1, to c przyjmie wartość 49.
Zrób taki eksperyment i napisz program:

Kod:
void setup() {
  Serial.begin(9600);
  Serial.write(49);
}

void loop() { 
}

I powiedz co się wyświetliło? 49 czy 1?
Albo w swoim kodzie zamiast
Kod:
Serial.write(c)
, wpisz
Kod:
Serial.print(c)
, to się przekonasz.

Albo zamiast if(c==1) napisz if(c==49), to gwarantuję, że warunek zadziała.
Po poprawce program zadziałał, dzięki za pomoc. Ten write był przez przypadek, nie pomyślałem i jakoś przepisałem część komendy od serwa do Seriala. Działa tak jak napisałeś. Jeszcze raz dzięki za pomoc.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości