Mattti87 Napisano Lipiec 1, 2020 Udostępnij Napisano Lipiec 1, 2020 (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 Lipiec 2, 2020 przez Gieneq Zachęcam do używania bloku kodu Cytuj Link do komentarza Share on other sites More sharing options...
Mattti87 Lipiec 1, 2020 Autor tematu Udostępnij Lipiec 1, 2020 (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 Lipiec 2, 2020 przez Gieneq Zachęcam do używania bloku kodu Cytuj Link do komentarza Share on other sites More sharing options...
deshipu Lipiec 2, 2020 Udostępnij Lipiec 2, 2020 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ć. Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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!