Skocz do zawartości

Użyłem innego pilota innej biblioteki działa! Tylko Chciałem dodać jeżdzenie po linii (maszyna stanów) coś nie wychodzi


Mattti87

Pomocna odpowiedź

KOD
inny pilot 😉
chciałbym dodać LineFollower, próbowałem maszyną stanów ale coś nie pykło 

#include <IRremote.h>
 
int IR_Recv = 3;   //IR Receiver Pin 3
#define L_PWM 5
#define L_DIR 4
#define R_PWM 6
#define R_DIR 9
#define PWM_MAX 165

#define GRANICA 850
#define R_LINE_SENSOR A0
#define L_LINE_SENSOR A1
 
#define BUZZER 10
#define LED 13
 
IRrecv irrecv(IR_Recv);
decode_results results;

 
void setup(){
  Serial.begin(9600);  //starts serial communication
  irrecv.enableIRIn(); // Starts the receiver
   //Konfiguracja pinow od mostka H
  pinMode(L_DIR, OUTPUT);
  pinMode(R_DIR, OUTPUT);
  pinMode(L_PWM, OUTPUT);
  pinMode(R_PWM, OUTPUT);
 
  //Konfiguracja pozostalych elementow
  pinMode(BUZZER, OUTPUT);
  digitalWrite(BUZZER, 0); //Wylaczenie buzzera  
  pinMode(LED, OUTPUT); 
  digitalWrite(LED, 0); //Wylaczenie diody

}
 
void loop(){
  //decodes the infrared input
  if (irrecv.decode(&results)){
    long int decCode = results.value;
    Serial.println(results.value);
    //switch case to use the selected remote control button
    switch (results.value){
      case 16736925: 
        leftMotor(100); //Do przodu TURBO!
        rightMotor(100);
        break;  
      case 16712445: 
        leftMotor(50); //Do przodu
        rightMotor(50);
        break;   
      case 16750695: 
        leftMotor(-40);//Do tyłu
        rightMotor(-40);
        break;
       case 16754775: 
        stopMotors();
        break;   
       case 16769055: 
        leftMotor(-30);//w lewo w miejscu
        rightMotor(30);
        break;    
       case 16720605: 
        leftMotor(20);//w lewo po łuku
        rightMotor(40);
        break;   
       case 16748655: 
        leftMotor(30); //w prawo w miejscu
        rightMotor(-30);
        break; 
       case 16761405: 
        leftMotor(40);//w prawo po łuku
        rightMotor(20);
        break;     
       case 16769565: 
        digitalWrite(BUZZER, 1); //buzzer
        delay(500);
        digitalWrite(BUZZER, 0);
        break;    
       case 16753245: //led
        digitalWrite(LED, 1); 
        delay(500);
        digitalWrite(LED, 0);
        break;    
       case 16738455: //alarm
        stopMotors();
        for(int i=0;i<20;i++)
        {
        digitalWrite(BUZZER, 1);
        digitalWrite(LED, 1);
        delay(50);
        digitalWrite(BUZZER, 0);
        digitalWrite(LED, 0);
        delay(50);
        }
        break;  
       case 16756815: //alarm
        stopMotors();
        for(int i=0;i<10;i++)
        {
        digitalWrite(BUZZER, 1);
        digitalWrite(LED, 1);
        delay(100);
        digitalWrite(BUZZER, 0);
        digitalWrite(LED, 0);
        delay(100);
        }
        break;        
    }
    irrecv.resume(); // Receives the next value from the button you press
  }
  delay(10);
}

/*FUNKCJEFUNKCJEFUNKCJEFUNKCJEFUNKCJEFUNKCJEFUNKCJEFUNKCJEFUNKCJEFUNKCJEFUNKCJEFUNKCJEFUNKCJEFUNKCJEFUNKCJEFUNKCJE*/
void leftMotor(int V) {
  if (V > 0) { //Jesli predkosc jest wieksza od 0 (dodatnia)
    V = map(V, 0, 100, 0, PWM_MAX);
    digitalWrite(L_DIR, 0); //Kierunek: do przodu
    analogWrite(L_PWM, V); //Ustawienie predkosci 
  } else {
    V = abs(V); //Funkcja abs() zwroci wartosc V  bez znaku
    V = map(V, 0, 100, 0, PWM_MAX);
    digitalWrite(L_DIR, 1); //Kierunek: do tyłu
    analogWrite(L_PWM, V); //Ustawienie predkosci    
  }
}
void rightMotor(int V) {
  if (V > 0) { //Jesli predkosc jest wieksza od 0 (dodatnia)
    V = map(V, 0, 100, 0, PWM_MAX);
    digitalWrite(R_DIR, 0); //Kierunek: do przodu
    analogWrite(R_PWM, V); //Ustawienie predkosci 
  } else {
    V = abs(V); //Funkcja abs() zwroci wartosc V  bez znaku
    V = map(V, 0, 100, 0, PWM_MAX);
    digitalWrite(R_DIR, 1); //Kierunek: do tyłu
    analogWrite(R_PWM, V); //Ustawienie predkosci    
  }
}
 
void stopMotors() {
  analogWrite(L_PWM, 0); //Wylaczenie silnika lewego
  analogWrite(R_PWM, 0); //Wylaczenie silnika prawego
}

boolean leftSensor() {
   if (analogRead(L_LINE_SENSOR) > GRANICA) { //Jesli czujnik widzi linie, to
    return 1; //Zwroc 1
  } else { //Jesli czujnik nie jest nad linią, to
    return 0; //Zwroc 0
  } 
}
 
boolean rightSensor() {
   if (analogRead(R_LINE_SENSOR) > GRANICA) { //Jesli czujnik widzi linie, to
    return 1; //Zwroc 1
  } else { //Jesli czujnik nie jest nad linią, to
    return 0; //Zwroc 0
  } 
}

void lineFollow()
{
  if (leftSensor() == 0 && rightSensor() == 0)
  {                //Jesli czujniki nie widza linii
    leftMotor(50); //Jazda prosto
    rightMotor(50);
  }
  else if (leftSensor() == 1)
  {               //Jesli lewy czujnik widzi linie
    leftMotor(0); //Jazda po łuku w lewo
    rightMotor(60);
  }
  else if (rightSensor() == 1)
  {                //Jesli prawy czujnik widzi linie
    leftMotor(60); //Jazda po łuku w prawo
    rightMotor(0);
  }
}

 

Edytowano przez Gieneq
Zachęcam do używania bloku kodu
Link do komentarza
Share on other sites

(edytowany)

Zrobiłem 😉
TAK!

/*
 * Modified by Rui Santos, http://randomnerdtutorialscom
 * based on IRremote Library - Ken Shirriff
*/
 
#include <IRremote.h>
 
int IR_Recv = 3;   //IR Receiver Pin 3
#define L_PWM 5
#define L_DIR 4
#define R_PWM 6
#define R_DIR 9
#define PWM_MAX 165

#define GRANICA 850
#define R_LINE_SENSOR A0
#define L_LINE_SENSOR A1
 
#define BUZZER 10
#define LED 13
 
IRrecv irrecv(IR_Recv);
decode_results results;

volatile int stanRobota = 1; //do maszyny stanów
 
void setup(){
  Serial.begin(9600);  //starts serial communication
  irrecv.enableIRIn(); // Starts the receiver
   //Konfiguracja pinow od mostka H
  pinMode(L_DIR, OUTPUT);
  pinMode(R_DIR, OUTPUT);
  pinMode(L_PWM, OUTPUT);
  pinMode(R_PWM, OUTPUT);
 
  //Konfiguracja pozostalych elementow
  pinMode(BUZZER, OUTPUT);
  digitalWrite(BUZZER, 0); //Wylaczenie buzzera  
  pinMode(LED, OUTPUT); 
  digitalWrite(LED, 0); //Wylaczenie diody

}
 
void loop(){
  if(results.value==16724175)
  {
    lineFollow();
  }
  //decodes the infrared input
  if (irrecv.decode(&results)){
    long int decCode = results.value;
    Serial.println(results.value);
    //switch case to use the selected remote control button
    switch (results.value){
      case 16736925: 
        leftMotor(100); //Do przodu TURBO!
        rightMotor(100);
        break;  
      case 16712445: 
        leftMotor(50); //Do przodu
        rightMotor(50);
        break;   
      case 16750695: 
        leftMotor(-40);//Do tyłu
        rightMotor(-40);
        break;
       case 16754775: 
        stopMotors();
        break;   
       case 16769055: 
        leftMotor(-30);//w lewo w miejscu
        rightMotor(30);
        break;    
       case 16720605: 
        leftMotor(20);//w lewo po łuku
        rightMotor(40);
        break;   
       case 16748655: 
        leftMotor(30); //w prawo w miejscu
        rightMotor(-30);
        break; 
       case 16761405: 
        leftMotor(40);//w prawo po łuku
        rightMotor(20);
        break;     
       case 16769565: 
        digitalWrite(BUZZER, 1); //buzzer
        delay(500);
        digitalWrite(BUZZER, 0);
        break;    
       case 16753245: //led
        digitalWrite(LED, 1); 
        delay(500);
        digitalWrite(LED, 0);
        break;    
       case 16738455: //alarm
        stopMotors();
        for(int i=0;i<20;i++)
        {
        digitalWrite(BUZZER, 1);
        digitalWrite(LED, 1);
        delay(50);
        digitalWrite(BUZZER, 0);
        digitalWrite(LED, 0);
        delay(50);
        }
        break;  
       case 16756815: //alarm
        stopMotors();
        for(int i=0;i<10;i++)
        {
        digitalWrite(BUZZER, 1);
        digitalWrite(LED, 1);
        delay(100);
        digitalWrite(BUZZER, 0);
        digitalWrite(LED, 0);
        delay(100);
        }
        break;        
    }
    irrecv.resume(); // Receives the next value from the button you press
  }
  delay(10);
}

/*FUNKCJEFUNKCJEFUNKCJEFUNKCJEFUNKCJEFUNKCJEFUNKCJEFUNKCJEFUNKCJEFUNKCJEFUNKCJEFUNKCJEFUNKCJEFUNKCJEFUNKCJEFUNKCJE*/
void leftMotor(int V) {
  if (V > 0) { //Jesli predkosc jest wieksza od 0 (dodatnia)
    V = map(V, 0, 100, 0, PWM_MAX);
    digitalWrite(L_DIR, 0); //Kierunek: do przodu
    analogWrite(L_PWM, V); //Ustawienie predkosci 
  } else {
    V = abs(V); //Funkcja abs() zwroci wartosc V  bez znaku
    V = map(V, 0, 100, 0, PWM_MAX);
    digitalWrite(L_DIR, 1); //Kierunek: do tyłu
    analogWrite(L_PWM, V); //Ustawienie predkosci    
  }
}
void rightMotor(int V) {
  if (V > 0) { //Jesli predkosc jest wieksza od 0 (dodatnia)
    V = map(V, 0, 100, 0, PWM_MAX);
    digitalWrite(R_DIR, 0); //Kierunek: do przodu
    analogWrite(R_PWM, V); //Ustawienie predkosci 
  } else {
    V = abs(V); //Funkcja abs() zwroci wartosc V  bez znaku
    V = map(V, 0, 100, 0, PWM_MAX);
    digitalWrite(R_DIR, 1); //Kierunek: do tyłu
    analogWrite(R_PWM, V); //Ustawienie predkosci    
  }
}
 
void stopMotors() {
  analogWrite(L_PWM, 0); //Wylaczenie silnika lewego
  analogWrite(R_PWM, 0); //Wylaczenie silnika prawego
}

boolean leftSensor() {
   if (analogRead(L_LINE_SENSOR) > GRANICA) { //Jesli czujnik widzi linie, to
    return 1; //Zwroc 1
  } else { //Jesli czujnik nie jest nad linią, to
    return 0; //Zwroc 0
  } 
}
 
boolean rightSensor() {
   if (analogRead(R_LINE_SENSOR) > GRANICA) { //Jesli czujnik widzi linie, to
    return 1; //Zwroc 1
  } else { //Jesli czujnik nie jest nad linią, to
    return 0; //Zwroc 0
  } 
}

void lineFollow()
{
  if (leftSensor() == 0 && rightSensor() == 0)
  {                //Jesli czujniki nie widza linii
    leftMotor(50); //Jazda prosto
    rightMotor(50);
  }
  else if (leftSensor() == 1)
  {               //Jesli lewy czujnik widzi linie
    leftMotor(0); //Jazda po łuku w lewo
    rightMotor(60);
  }
  else if (rightSensor() == 1)
  {                //Jesli prawy czujnik widzi linie
    leftMotor(60); //Jazda po łuku w prawo
    rightMotor(0);
  }
}

 

Edytowano przez Gieneq
Zachęcam do używania bloku kodu
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • 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.