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

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.