"Samochodzik" sterowany z pilota

Masz problem, z którym nie możesz sobie poradzić? Pisz śmiało!
ODPOWIEDZ
Awatar użytkownika
jatoja
Młodszy majsterkowicz
Posty: 10
Rejestracja: 30 lis 2014, 14:48

"Samochodzik" sterowany z pilota

Post autor: jatoja » 19 gru 2015, 20:10

Witam, buduję zdalnie sterowany samochodzik, nooo namiastkę samochodzika :) Sterowanie odbywa się za pomocą podczerwieni, albo omija przeszkody, ogólnie wszystko działa jak bym sobie tego nawet życzył, ale... Dlaczego w ostatniej funkcji odpowiadającej za omijanie przeszkód nie wykonuje się ona cała po wybraniu funkcji przyciskiem, tylko jeśli na początku nie ma przeszkody to jedzie sobie w dal, albo po zbliżeniu reki do czujki przy wybieraniu trybu wykona tylko omijanie i koniec? Ratuje mnie tutaj trochę nieskończona pętla, no bo wtedy to się wykonuje prawidłowo, ale jak to pętla nieskończona nie pozwala mi na kolejne przełączenie trybu.. Chciałbym po wybraniu trybu automatycznego móc wrócić do manualnego sterowania bez potrzeby resetowania arduino, tylko po prostu naciskając przycisk. Próbowałem coś kombinować z breakami, ale nie dawało to efektu niestety... Jestem początkujący i zdaję sobie sprawę, że to jakaś pierdoła jest, ale nie mogę wpaść na rozwiązanie :) Pozdrawiam :)

Kod: Zaznacz cały

#include <IRremote.h>
#define LEFT 0
#define RIGHT 1
#define trigPin 3
#define echoPin 2
#define irPin 11
#define diodaPin 13
IRrecv irrecv(irPin);
decode_results results;
 

int diodaStatus = LOW;

void setup() 
{
    Serial.begin(9600);
    irrecv.enableIRIn();
pinMode(4, OUTPUT);    
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
}

void loop()
{  
  if (irrecv.decode(&results)) 
  { 
        switch (results.value)
        {

case 0x803F48B7:    
              if (diodaStatus=HIGH){    
            digitalWrite(diodaPin, diodaStatus);
            diodaStatus = ~diodaStatus; 
            stopMotor();            
            autom(LEFT, 255);            
            break;
              }
case 0x803FA857:           
            digitalWrite(diodaPin, diodaStatus);
            stopMotor();            
            break;
        
case 0x803FE817:          
            digitalWrite(diodaPin, diodaStatus);
            stopMotor();            
            startMotor(LEFT, 255);            
            break;
            
case 0x803F58A7:
            digitalWrite(diodaPin, diodaStatus);
            stopMotor();
            startMotor(RIGHT, 255);           
            break;

case 0x803F42BD:
            digitalWrite(diodaPin, diodaStatus);
            stopMotor();            
            changeMotor1(RIGHT, 120);                       
            break;
            
case 0x803F827D:
            digitalWrite(diodaPin, diodaStatus);
            stopMotor();
            changeMotor2(RIGHT, 100);                      
            break;
            
         } 
    irrecv.resume();
   }
}


void startMotor (boolean dir, uint8_t _speed)
{ 
  if(dir) 
    {    
      digitalWrite(7, HIGH);
      digitalWrite(9, HIGH);
      analogWrite(5, _speed);
      analogWrite(10, _speed);
    } 
    else 
      {      
      digitalWrite(6, HIGH);
      digitalWrite(8, HIGH);
      analogWrite(5, _speed); 
      analogWrite(10, _speed); 
      }
}
void changeMotor1 (boolean dir, uint8_t _speed)
{     
      digitalWrite(7, HIGH);  
      analogWrite(5, _speed);     
} 

void changeMotor2 (boolean dir, uint8_t _speed)   
{      
    digitalWrite(9, HIGH);       
    analogWrite(10, _speed);       
}
void stopMotor() 
{
  digitalWrite(6, LOW);
  digitalWrite(8, LOW);
  digitalWrite(7, LOW);
  digitalWrite(9, LOW);
  analogWrite(5, 0);
  analogWrite(10, 0);
  }

void autom(boolean dir, uint8_t _speed)
{
 for (;;){
  int duration, distance;
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(1000);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration/2) / 29.1;
  //w przod
  digitalWrite (4, LOW);
      digitalWrite (6, HIGH); 
      digitalWrite (8, HIGH);
       analogWrite(5, _speed); 
      analogWrite(10, _speed); 
       delay(200);

if (distance < 25)
{     
    digitalWrite (4, HIGH); 
      digitalWrite(6, LOW);
      digitalWrite(8, LOW);
      analogWrite(5, _speed); 
      analogWrite(10, _speed); 
        delay(200);
      digitalWrite (7, HIGH); 
      digitalWrite (9, HIGH);
      analogWrite(5, _speed); 
      analogWrite(10, _speed); 
        delay(150);
      digitalWrite(9, LOW);
      analogWrite(10, _speed); 
       delay(400);
      digitalWrite (7, LOW);
      analogWrite(5, _speed); 
        delay(300);
}
}
}

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


stiven
Złota rączka
Posty: 1641
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: "Samochodzik" sterowany z pilota

Post autor: stiven » 19 gru 2015, 21:24

Masz źle napisany if

Kod: Zaznacz cały

  if (diodaStatus=HIGH)
Dzięki temu, że jest źle napisany, to ten case działa. W warunku masz wpisanie do zmiennej diodaStatus wartości HIGH (jeśli w ifa wpisze się ustawienie wartości zmiennej, to taki if zawsze działa). A sprawdzenie czy w zmiennej diodaStatus jest wpisana wartość HIGH, wyglądało by tak:

Kod: Zaznacz cały

  if (diodaStatus == HIGH)
Pojedyncze = wpisuje wartość do zmiennej, a w ifie używa się operatora porównania ==, if się wykona, jeśli w warunku lewa strona jest równa prawej.

Ale pomyśl, włączasz program i zmienna diodaStatus ma wpisaną wartość LOW, więc jeśli byś zrobił takiego ifa w tym miejscu, to on nigdy by się nie wykonał, bo zmiana wartości na HIGH jest w tym ifie. Ten if tu jest niepotrzebny.

A tak możesz rozwiązać to wychodzenie z trybu automatycznego, własnie dzięki temu poprawnemu ifowi i tej zmiennej diodaStatus, ale musi to być poza switchem, w case tylko zmiana wartości zmiennej.
Spoiler:
Awatar użytkownika
jatoja
Młodszy majsterkowicz
Posty: 10
Rejestracja: 30 lis 2014, 14:48

Re: "Samochodzik" sterowany z pilota

Post autor: jatoja » 19 gru 2015, 21:57

Przyznaję, że ten fragment pozostał po cudowaniu moim "może zadziała", próbowałem to na różne sposoby rozwiązać. Został przez niedopatrzenie, ale rozumiem, po wybraniu przycisku stan powinien się zmienić i wykonać ten if, jednak się nie wykonuje, zero reakcji, działa jedynie manual a funkcja automatu się nie uruchamia :/
stiven
Złota rączka
Posty: 1641
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: "Samochodzik" sterowany z pilota

Post autor: stiven » 19 gru 2015, 22:05

A dioda się zapala i gaśnie? Przy zgaszonej powinien być włączony tryb automatyczny.
Awatar użytkownika
jatoja
Młodszy majsterkowicz
Posty: 10
Rejestracja: 30 lis 2014, 14:48

Re: "Samochodzik" sterowany z pilota

Post autor: jatoja » 19 gru 2015, 22:17

Dioda się zapala i gaśnie
stiven
Złota rączka
Posty: 1641
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: "Samochodzik" sterowany z pilota

Post autor: stiven » 19 gru 2015, 22:26

Diodę masz na pinie 13 na płytce arduino, nie musisz nic do niego podłączać. Jedynie brakuje w setup pinMode(13, OUTPUT);

Zobacz ten kod, teraz dioda będzie zapalona przy aktywnej tej funkcji.
Spoiler:
Awatar użytkownika
jatoja
Młodszy majsterkowicz
Posty: 10
Rejestracja: 30 lis 2014, 14:48

Re: "Samochodzik" sterowany z pilota

Post autor: jatoja » 19 gru 2015, 22:29

Dzięki wielkie, działa jak powinno! :)
ODPOWIEDZ

Strony partnerskie: