Skocz do zawartości
Mattti87

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

Pomocna odpowiedź

Napisano (edytowany)

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

Udostępnij ten post


Link to post
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

Udostępnij ten post


Link to post
Share on other sites

Instrukcja switch to jeszcze nie maszyna stanów. Żeby mieć maszynę stanów, to musiałbyś gdzieś trzymać stan i na podstawie jego oraz wejścia decydować co robić.

Udostępnij ten post


Link to post
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...