Skocz do zawartości

Pesjar

Użytkownicy
  • Zawartość

    14
  • Rejestracja

  • Ostatnio

Informacje

  • Płeć
    Mężczyzna
  • Zawód
    Ekonomista
  • Moje zainteresowania:
    Elektronika

Ostatnio na profilu byli

Blok z ostatnio odwiedzającymi jest wyłączony i nie jest wyświetlany innym użytkownikom.

Osiągnięcia użytkownika Pesjar

Odkrywca

Odkrywca (4/19)

  • Za 5 postów
  • To już rok!
  • To już 5 lat!

Odznaki

0

Reputacja

  1. Do godz. 19 brak pierwszego odcinka kursu. Kiedy faktycznie zacznie się kurs RPi.
  2. Co z nowymi modułami do robota?. Kiedy mogę się spodziewać pierwszych dodatków z opisami? Powoli tracę cierpliwość. Pozdrawiam
  3. Co z nowymi modułami do robota?. Kiedy mogę się spodziewać pierwszych dodatków z opisami? Czekam niecierpliwie. Pozdeawiam.
  4. Dla jasności. Jazdę autonomiczną podpiełem pod jeden z przycisków pilota bez pętli while. Natomiast dzisiaj wykorzystałem pętle while do połączenia programu sterowania pilotem z światłolubem. W tym przypadku rozwiązanie to spisuje się doskonale. Pozdrawiam i życzę cierpliwości w interpretowaniu moich nieudolnych prób. Walczę dalej.
  5. Treker, wszystko się zgadza. W ramach prób, w pętle while, wstawiłem program jazdy do tyłu. Po naciśnięciu przycisku 1 (Przycisk jeden zaprogramowany jako wyjście z pętli) robot kontynuował jazdę wstecz ale od tego momentu reagował na pozostałe zaprogramowane przyciski. Rozumiem, że z tych samych przyczyn, po wejściu w pętle while, zamiast wyjścia, nie można zaprogramować przycisku na pilocie tak aby zresetował cały program (Podobnie jak wciśnięcie przycisku reset na płytce Arduino). Bo to rozwiązało by sprawę. Można by od nowa korzystać z zaprogramowanych przycisków. Z mniejszą nadzieją na sukces eksperymentuje dalej. Pięknie dziękuje za pomoc i cierpliwośc. [ Dodano: 09-04-2017, 08:41 ] Treker, jeszcze nasuwa mi się inne rozwiązanie. Po zaprogramowaniu przycisku case 56 jako jazdy autonomicznej, przycisk 56 reaguje w ten sposób, że po wciśnięciu i trzymaniu, realizuj jazdę autonomiczną, po puszczeniu, zatrzymuje się a pozostałe zaprogramowane przyciski są aktywne. Czy istnieje taka możliwość aby do programu dopisać taką sekwencję, która mimo puszczenia przycisku symulowała by, że jest on wciśnięty, przy jednoczesnym pozostawieniu aktywności pozostałych zaprogramowanych przycisków.
  6. Treker , wprowadziłem poprawki w programie. Po tych poprawkach naciśnięcie case 56 powoduje wejście w pętle, która realizuje jazdę na podstawie wskazań czujnika ultradźwięków. Naciśnięcie przycisku 1 nie powoduje wyjścia z pętli, dalej jest realizowana jazda na podstawie wskazań czujnika. ... void loop() { if (rc5.read(&toggle, &address, &command)) { switch (command) { case 12: digitalWrite(BUZZER, 1); delay(500); digitalWrite(BUZZER, 0); break; case 2: //Do przodu leftMotor(40); rightMotor(40); break; case 5: //STOP stopMotors(); break; case 56://Jazda samodzielna while (command != 1) { jazdaSAM(); odczytCZUJ(); } break; } } } void odczytCZUJ() { if (rc5.read(&toggle, &address, &command)) { switch (command) { } } } ... Gdzie popełniam błąd, który uniemożliwia mi wyjście z pętli i reakcję na pozostałe zaprogramowane przyciski pilota.
  7. Proponuje w przyszłości uwzględnić zamocowanie na ruchomym ramieniu robota kamery, która przekazywała by obraz łączem bezprzewodowym.
  8. Pytanie do Trekera Po skorzystaniu z Twojej rady: "leepa79, najprościej będzie wrzucić do tego słynnego case '56' pętle while, która będzie wykonywała się w koło (w jej wnętrzu program korzystający z serwa i czujnika). Wyjście z pętli powinno odbywać się w momencie odebrania konkretnego sygnału z pilota. Oczywiście w związku z tym w pętli znajdującej się wewnątrz case '56' trzeba powtórzyć fragment odpowiedzialny z odczytywanie RC5." naciśnięcie i trzymanie wciśniętego case56 powoduje samodzielną jazdę na podstawie wskazań czujnika ultradźwiękowego, kiedy puszczę case56, robot kontynuuje jazdę jaką wykonywał przed puszczeniem przycisku (jazda do przodu, obrót w prawo lub obrót w lewo). Od tego momentu reaguje na wciśnięcie dowolnego przycisku case. Wadą tego rozwiązania jest konieczność trzymania wciśniętego case56. Poniżej fragment programu wykorzystujący Twoją radę: void loop() { if (rc5.read(&toggle, &address, &command)) { switch (command) { case 12: digitalWrite(BUZZER, 1); delay(500); digitalWrite(BUZZER, 0); break; case 2: //Do przodu leftMotor(40); rightMotor(40); break; case 5: //STOP stopMotors(); break; case 56://Jazda samodzielna while (command == 56) { jazdaSAM(); odczytCZUJ(); break; } } } } void odczytCZUJ() { if (rc5.read(&toggle, &address, &command)) { switch (command) { } } } Krótkie wyjaśnienie: Własna funkcja jazdaSAM() zawiera program samodzielnej jazdy sterowanej czujnikiem ultradźwiękowym . Program zawiera tylko cztery case co znacznie ułatwiło mi dokonywanie przeróbek i licznych prób. Zasadnicze pytanie: Jak pozbyć się opisanej wyżej wady, aby program po krótkim wciśnięciu case56 realizował jazdę na podstawie wskazań czujnika ultradźwiękowego i jednocześnie wyczekiwał na wciśnięcie dowolnego case.
  9. Połowiczny sukces przy łączeniu programów. Udało się przy pomocy wrzucenia do case ‘56’ pętli while, która wykonuje program jazdy za pomocą czujnika skanujący otoczenie. Jednak nie mogę wyjść z pętli. Inaczej nie potrafię prawidłowo sformułować fragmentu odpowiedzialnego za odczytanie RC5 oraz ustalenia miejsca wstawienia tego fragmentu w pętle while. Znów kręce się w kółko, może ktoś ma jakieś sugestie. #include <RC5.h> //Biblioteka od serwomechanizmu #include <Servo.h> Servo serwo; #define SERWO_PIN 11 #define L_PWM 5 #define L_DIR 4 #define R_PWM 6 #define R_DIR 9 #define PWM_MAX 165 //Piny od czujnika odleglosci #define trigPin 7 #define echoPin 8 #define BUZZER 10 #define LED 13 #define TSOP_PIN 3 RC5 rc5(TSOP_PIN); //Informacja o podłączeniu odbiornika TSOP byte address; byte command; byte toggle; void setup() { //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 //Czujnik odleglosci pinMode(trigPin, OUTPUT); //Pin, do którego podłączymy trig jako wyjście pinMode(echoPin, INPUT); //a echo, jako wejście //Serwo do pinu 11 serwo.attach(SERWO_PIN); //Serwo na pozycje srodkowa 90 (bo zakres 0-180) serwo.write(90); Serial.begin(9600); } void loop() { if (rc5.read(&toggle, &address, &command)) { switch (command) { case 2: //Do przodu leftMotor(40); rightMotor(40); break; case 8: //Do tyłu leftMotor(-40); rightMotor(-40); break; case 5: //STOP stopMotors(); break; case 4: //Obrót w lewo leftMotor(-30); rightMotor(30); break; case 6: //Obrót w prawo leftMotor(30); rightMotor(-30); break; case 12: digitalWrite(BUZZER, 1); delay(500); digitalWrite(BUZZER, 0); break; case 56: while (command == 56) { //Czy wykryto przeszkode w zakresie 0-40 cm if (zmierzOdleglosc() > 40) { leftMotor(40); //Jesli nie, to jedz prosto rightMotor(40); } else { //Jesli przeszkoda stopMotors(); //Zatrzymaj robota serwo.write(20); //Skrec czujnikiem w prawo delay(800); //Poczekaj 800ms dla ustabilizowania konstrukcji //Sprawdz, czy po prawej stronie jest przeszkoda if (zmierzOdleglosc() > 40) { //Jesli jest pusto leftMotor(40); rightMotor(-40); delay(400); //Obracaj w prawo przez 400 ms } else { //Jeśli po prawej jest przeszkoda serwo.write(160); //Obroc czujnik w lewo delay(800); //Poczekaj 800ms dla ustabilizowania konstrukcji //Sprawdz, czy po lowej stronie jest przeszkoda if (zmierzOdleglosc() > 40) { //Jesli jest pusto leftMotor(-40); rightMotor(40); delay(400); //Obracaj w lewo przez 400 ms } else { //Jesli z przodu, z lewej i prawej jest przeszkoda digitalWrite(BUZZER, 1); delay(500); digitalWrite(BUZZER, 0); //Daj sygnal buzzerem } } //Po sprawdzeniu przeszkod po bokach //Ustaw czujnik prosto serwo.write(90); } //Opoznienie 100ms, ponieważ nie ma potrzeby sprawdzać przeszkod czesciej delay(100); } } } } int zmierzOdleglosc() { long czas, dystans; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); czas = pulseIn(echoPin, HIGH); dystans = czas / 58; return dystans; } 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 } [ Dodano: 02-04-2017, 14:57 ] Cąg dalszy połączenia programów: #include <RC5.h> //Biblioteka od serwomechanizmu #include <Servo.h> Servo serwo; #define SERWO_PIN 11 #define L_PWM 5 #define L_DIR 4 #define R_PWM 6 #define R_DIR 9 #define PWM_MAX 165 //Piny od czujnika odleglosci #define trigPin 7 #define echoPin 8 #define BUZZER 10 #define LED 13 #define TSOP_PIN 3 RC5 rc5(TSOP_PIN); //Informacja o podłączeniu odbiornika TSOP byte address; byte command; byte toggle; void setup() { //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 //Czujnik odleglosci pinMode(trigPin, OUTPUT); //Pin, do którego podłączymy trig jako wyjście pinMode(echoPin, INPUT); //a echo, jako wejście //Serwo do pinu 11 serwo.attach(SERWO_PIN); //Serwo na pozycje srodkowa 90 (bo zakres 0-180) serwo.write(90); Serial.begin(9600); } void loop() { if (rc5.read(&toggle, &address, &command)) { switch (command) { case 2: //Do przodu leftMotor(40); rightMotor(40); break; case 8: //Do tyłu leftMotor(-40); rightMotor(-40); break; case 5: //STOP stopMotors(); break; case 4: //Obrót w lewo leftMotor(-30); rightMotor(30); break; case 6: //Obrót w prawo leftMotor(30); rightMotor(-30); break; case 12: digitalWrite(BUZZER, 1); delay(500); digitalWrite(BUZZER, 0); break; case 56: while (command == 56) { //Czy wykryto przeszkode w zakresie 0-40 cm if (zmierzOdleglosc() > 40) { leftMotor(40); //Jesli nie, to jedz prosto rightMotor(40); } else { //Jesli przeszkoda stopMotors(); //Zatrzymaj robota serwo.write(20); //Skrec czujnikiem w prawo delay(800); //Poczekaj 800ms dla ustabilizowania konstrukcji //Sprawdz, czy po prawej stronie jest przeszkoda if (zmierzOdleglosc() > 40) { //Jesli jest pusto leftMotor(40); rightMotor(-40); delay(400); //Obracaj w prawo przez 400 ms } else { //Jeśli po prawej jest przeszkoda serwo.write(160); //Obroc czujnik w lewo delay(800); //Poczekaj 800ms dla ustabilizowania konstrukcji //Sprawdz, czy po lowej stronie jest przeszkoda if (zmierzOdleglosc() > 40) { //Jesli jest pusto leftMotor(-40); rightMotor(40); delay(400); //Obracaj w lewo przez 400 ms } else { //Jesli z przodu, z lewej i prawej jest przeszkoda digitalWrite(BUZZER, 1); delay(500); digitalWrite(BUZZER, 0); //Daj sygnal buzzerem } } //Po sprawdzeniu przeszkod po bokach //Ustaw czujnik prosto serwo.write(90); } //Opoznienie 100ms, ponieważ nie ma potrzeby sprawdzać przeszkod czesciej delay(100); break; if (rc5.read(&toggle, &address, &command)); switch (command); } } } } int zmierzOdleglosc() { long czas, dystans; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); czas = pulseIn(echoPin, HIGH); dystans = czas / 58; return dystans; } 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 } Program w tej wersji realizuje wszystkie funkcje z tą wadą, że jazda sterowana czujnikie realizowana jest przy wciśniętym klawiszu "Case56". Nie mam pomysłu jak się tego pozbyć. Proszę o pomoc. [ Dodano: 02-04-2017, 14:59 ] Cąg dalszy połączenia programów: #include <RC5.h> //Biblioteka od serwomechanizmu #include <Servo.h> Servo serwo; #define SERWO_PIN 11 #define L_PWM 5 #define L_DIR 4 #define R_PWM 6 #define R_DIR 9 #define PWM_MAX 165 //Piny od czujnika odleglosci #define trigPin 7 #define echoPin 8 #define BUZZER 10 #define LED 13 #define TSOP_PIN 3 RC5 rc5(TSOP_PIN); //Informacja o podłączeniu odbiornika TSOP byte address; byte command; byte toggle; void setup() { //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 //Czujnik odleglosci pinMode(trigPin, OUTPUT); //Pin, do którego podłączymy trig jako wyjście pinMode(echoPin, INPUT); //a echo, jako wejście //Serwo do pinu 11 serwo.attach(SERWO_PIN); //Serwo na pozycje srodkowa 90 (bo zakres 0-180) serwo.write(90); Serial.begin(9600); } void loop() { if (rc5.read(&toggle, &address, &command)) { switch (command) { case 2: //Do przodu leftMotor(40); rightMotor(40); break; case 8: //Do tyłu leftMotor(-40); rightMotor(-40); break; case 5: //STOP stopMotors(); break; case 4: //Obrót w lewo leftMotor(-30); rightMotor(30); break; case 6: //Obrót w prawo leftMotor(30); rightMotor(-30); break; case 12: digitalWrite(BUZZER, 1); delay(500); digitalWrite(BUZZER, 0); break; case 56: while (command == 56) { //Czy wykryto przeszkode w zakresie 0-40 cm if (zmierzOdleglosc() > 40) { leftMotor(40); //Jesli nie, to jedz prosto rightMotor(40); } else { //Jesli przeszkoda stopMotors(); //Zatrzymaj robota serwo.write(20); //Skrec czujnikiem w prawo delay(800); //Poczekaj 800ms dla ustabilizowania konstrukcji //Sprawdz, czy po prawej stronie jest przeszkoda if (zmierzOdleglosc() > 40) { //Jesli jest pusto leftMotor(40); rightMotor(-40); delay(400); //Obracaj w prawo przez 400 ms } else { //Jeśli po prawej jest przeszkoda serwo.write(160); //Obroc czujnik w lewo delay(800); //Poczekaj 800ms dla ustabilizowania konstrukcji //Sprawdz, czy po lowej stronie jest przeszkoda if (zmierzOdleglosc() > 40) { //Jesli jest pusto leftMotor(-40); rightMotor(40); delay(400); //Obracaj w lewo przez 400 ms } else { //Jesli z przodu, z lewej i prawej jest przeszkoda digitalWrite(BUZZER, 1); delay(500); digitalWrite(BUZZER, 0); //Daj sygnal buzzerem } } //Po sprawdzeniu przeszkod po bokach //Ustaw czujnik prosto serwo.write(90); } //Opoznienie 100ms, ponieważ nie ma potrzeby sprawdzać przeszkod czesciej delay(100); break; if (rc5.read(&toggle, &address, &command)); switch (command); } } } } int zmierzOdleglosc() { long czas, dystans; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); czas = pulseIn(echoPin, HIGH); dystans = czas / 58; return dystans; } 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 } Program w tej wersji realizuje wszystkie funkcje z tą wadą, że jazda sterowana czujnikie realizowana jest przy wciśniętym klawiszu "Case56". Nie mam pomysłu jak się tego pozbyć. Proszę o pomoc.
  10. Dalej walczę nad połączeniem programów i brak sukcesu, może jeszcze jakaś podpowiedź. Ponżej ostatnie moje wypociny. #include <RC5.h> #include <Servo.h> Servo serwo; #define SERWO_PIN 11 #define L_PWM 5 #define L_DIR 4 #define R_PWM 6 #define R_DIR 9 #define PWM_MAX 165 //Piny od czujnika odleglosci #define trigPin 7 #define echoPin 8 #define BUZZER 10 #define LED 13 #define TSOP_PIN 3 RC5 rc5(TSOP_PIN); //Informacja o podłączeniu odbiornika TSOP byte address; byte command; byte toggle; void setup() { //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 //Czujnik odleglosci pinMode(trigPin, OUTPUT); //Pin, do którego podłączymy trig jako wyjście pinMode(echoPin, INPUT); //a echo, jako wejście Serial.begin(9600); //Serwo do pinu 11 serwo.attach(SERWO_PIN); serwo.write (90); } void loop() { if (rc5.read(&toggle, &address, &command)) { switch (command) { case 2: //Do przodu leftMotor(40); rightMotor(40); serwo.write (90); delay (800); break; case 8: //Do tyłu leftMotor(-30); rightMotor(-30); serwo.write (90); delay (800); digitalWrite(BUZZER, 1); delay(500); digitalWrite(BUZZER, 0); break; case 5: //STOP stopMotors(); serwo.write (90); delay (800); break; case 4: //Obrót w lewo leftMotor(-30); rightMotor(30); serwo.write (160); delay (800); break; case 6: //Obrót w prawo leftMotor(30); rightMotor(-30); serwo.write (20); delay (800); break; case 1: //Jazda do przodu po łuku w lewo rightMotor(40); //Prawy przód 30% leftMotor(20); //Lewy przód 10% serwo.write (160); delay (800); break; case 3: //Jazda do przodu po łuku w prawo rightMotor(20); leftMotor(40); serwo.write (20); delay (800); break; case 7: //Jazad do tył po łuku w lewo rightMotor(-40); leftMotor(-20); serwo.write (90); delay (800); digitalWrite(BUZZER, 1); delay(500); digitalWrite(BUZZER, 0); break; case 9: //Jazad do tył po łuku w prawo rightMotor(-20); leftMotor(-40); serwo.write (90); delay (800); digitalWrite(BUZZER, 1); delay(500); digitalWrite(BUZZER, 0); break; case 144: //Do przodu leftMotor(90); rightMotor(90); serwo.write (90); delay (800); break; case 145: //Do tyłu leftMotor(-90); rightMotor(-90); serwo.write (90); delay (800); digitalWrite(BUZZER, 1); delay(500); digitalWrite(BUZZER, 0); break; case 149: //Jazda do przodu po łuku w lewo rightMotor(90); //Prawy przód 30% leftMotor(45); //Lewy przód 10% serwo.write (160); delay (800); break; case 150: //Jazda do przodu po łuku w prawo rightMotor(45); leftMotor(90); serwo.write (20); delay (800); break; case 151: //STOP stopMotors(); serwo.write (90); delay (800); break; case 12: digitalWrite(BUZZER, 1); delay(500); digitalWrite(BUZZER, 0); break; case 13: serwo.write (90); delay (800); break; case 32: serwo.write (20); delay (800); break; case 16: serwo.write (160); delay (800); break; case 56: while (rc5.read(&toggle, &address, &command)comm == 56) { if (zmierzOdleglosc() > 40) { leftMotor(40); //Jesli nie, to jedz prosto rightMotor(40); } else { //Jesli przeszkoda stopMotors(); //Zatrzymaj robota serwo.write(20); //Skrec czujnikiem w prawo delay(800); //Poczekaj 800ms dla ustabilizowania konstrukcji //Sprawdz, czy po prawej stronie jest przeszkoda if (zmierzOdleglosc() > 40) { //Jesli jest pusto leftMotor(40); rightMotor(-40); delay(400); //Obracaj w prawo przez 400 ms } else { //Jeśli po prawej jest przeszkoda serwo.write(160); //Obroc czujnik w lewo delay(800); //Poczekaj 800ms dla ustabilizowania konstrukcji //Sprawdz, czy po lowej stronie jest przeszkoda if (zmierzOdleglosc() > 40) { //Jesli jest pusto leftMotor(-40); rightMotor(40); delay(400); //Obracaj w lewo przez 400 ms } else { //Jesli z przodu, z lewej i prawej jest przeszkoda digitalWrite(BUZZER, 1); delay(500); digitalWrite(BUZZER, 0); //Daj sygnal buzzerem } } //Po sprawdzeniu przeszkod po bokach //Ustaw czujnik prosto serwo.write(90); } //Opoznienie 100ms, ponieważ nie ma potrzeby sprawdzać przeszkod czesciej delay(100); } int zmierzOdleglosc() { long czas, dystans; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); czas = pulseIn(echoPin, HIGH); dystans = czas / 58; return dystans; if (rc5.read(&toggle, &address, &command)) { switch (command) { } } } 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 }
  11. Niestety kręcę się w kółko i nic mi nie wychodzi. Drobne korekty programu sterowania pilotem oraz drobne korekty konstrukcji takie jak: zaprogramowałem klawisze 144, 149, 150, 151, 145 do szybszej jazdy do przodu, po łuku, stop i w tył. Do każdej jazdy wstecz dodałem sygnał buzera. Przy skręcie orczyk obraca czujnik w kierunku skrętu. Do orczyka zamontowałem dwie czerwone diody, Serwo zamontowałem tak aby było wyżej, z obawy by nie wjeżdżał pod meble. Czujniki wykorzystywane przy światłolubie zastosowałem jako przednie lampy. Czy ktoś nie napisał by takiego programu, którego założenia podaje poniżej, byłbym wdzięczny. Do programu sterującego pilotem dodać funkcje, która po wciśnięciu przycisku na pilocie ( na przykład klawisz, który po naciśnięciu wysyła wartość 56) uruchamiał by cały program sterowania za pomocą ruchomego czujnika skanującego otoczenie. Następnie po naciśnięciu wcześniej zaprogramowanych przycisków na piloci wracał by do sterowania ręcznego. [ Dodano: 26-03-2017, 09:28 ] Zdjęcie mojego robota.
  12. Do leepa79 Skorzystam z Twoich rad. Byłbym jednak wdzięczny gdybś przesłał mi poprawiony kod. Nadminiam że mam prawie 70 lat jestem emerytowanym ekonomistą. Boję się że zaplątam sie i nic z tego nie wyjdzie. Posiadając poprawiony kod porównam z efektami moich poprawek i napewno pozwoli mi to wyłapać błędy. Jeśli nie chcesz publikowć tego na forum to poniżej podaję swój adres: jaroslawpestka6@gmail.com
  13. Jestem kompletnym laikiem w programowaniu. Wyciełem powtarzające się funkcję leftMotor, rightMotor i stopMotors. Jednak w dalszym ciągu weryfikacja wkazuje błąd. Co zrobić dalej? Program pomkorekcie: #include <RC5.h> //Biblioteka od serwomechanizmu #include <Servo.h> Servo serwo; #define SERWO_PIN 11 #define L_PWM 5 #define L_DIR 4 #define R_PWM 6 #define R_DIR 9 #define PWM_MAX 165 //Piny od czujnika odleglosci #define trigPin 7 #define echoPin 8 #define BUZZER 10 #define LED 13 #define TSOP_PIN 3 RC5 rc5(TSOP_PIN); //Informacja o podłączeniu odbiornika TSOP byte address; byte command; byte toggle; void setup() { //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 //Czujnik odleglosci pinMode(trigPin, OUTPUT); //Pin, do którego podłączymy trig jako wyjście pinMode(echoPin, INPUT); //a echo, jako wejście //Serwo do pinu 11 serwo.attach(SERWO_PIN); //Serwo na pozycje srodkowa 90 (bo zakres 0-180) serwo.write(90); Serial.begin(9600); } void loop() { if (rc5.read(&toggle, &address, &command)){ switch(command) { case 2: //Do przodu leftMotor(40); rightMotor(40); break; case 8: //Do tyłu leftMotor(-40); rightMotor(-40); break; case 5: //STOP stopMotors(); break; case 4: //Obrót w lewo leftMotor(-30); rightMotor(30); break; case 6: //Obrót w prawo leftMotor(30); rightMotor(-30); break; case 12: digitalWrite(BUZZER, 1); delay(500); digitalWrite(BUZZER, 0); break; case 56: //Czy wykryto przeszkode w zakresie 0-40 cm if (zmierzOdleglosc() > 40) { leftMotor(40); //Jesli nie, to jedz prosto rightMotor(40); } else { //Jesli przeszkoda stopMotors(); //Zatrzymaj robota serwo.write(20); //Skrec czujnikiem w prawo delay(800); //Poczekaj 800ms dla ustabilizowania konstrukcji //Sprawdz, czy po prawej stronie jest przeszkoda if (zmierzOdleglosc() > 40) { //Jesli jest pusto leftMotor(40); rightMotor(-40); delay(400); //Obracaj w prawo przez 400 ms } else { //Jeśli po prawej jest przeszkoda serwo.write(160); //Obroc czujnik w lewo delay(800); //Poczekaj 800ms dla ustabilizowania konstrukcji //Sprawdz, czy po lowej stronie jest przeszkoda if (zmierzOdleglosc() > 40) { //Jesli jest pusto leftMotor(-40); rightMotor(40); delay(400); //Obracaj w lewo przez 400 ms } else { //Jesli z przodu, z lewej i prawej jest przeszkoda digitalWrite(BUZZER, 1); delay(500); digitalWrite(BUZZER, 0); //Daj sygnal buzzerem } } //Po sprawdzeniu przeszkod po bokach //Ustaw czujnik prosto serwo.write(90); } //Opoznienie 100ms, ponieważ nie ma potrzeby sprawdzać przeszkod czesciej delay(100); } int zmierzOdleglosc() { long czas, dystans; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); czas = pulseIn(echoPin, HIGH); dystans = czas / 58; return dystans; } break; } } } 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 }
  14. Chciałbym połączyć program sterowania pilotem z ostatnim programem sterowania za pośrednictwem czujnika odległości. Po skopiowaniu wszystkich elementów z programu obsługi czujnika, których niema w programie obsługi pilotem, przed void loop(), weryfikacja przebiega pozytywnie. Jednak po wklejeniu pod void loop() po ostatnim Case…. ….. break; case 56: Całość programu obsługi czujnika po void loop() break; weryfikacja wykazuje błąd. Całość programu : #include <RC5.h> //Biblioteka od serwomechanizmu #include <Servo.h> Servo serwo; #define SERWO_PIN 11 #define L_PWM 5 #define L_DIR 4 #define R_PWM 6 #define R_DIR 9 #define PWM_MAX 165 //Piny od czujnika odleglosci #define trigPin 7 #define echoPin 8 #define BUZZER 10 #define LED 13 #define TSOP_PIN 3 RC5 rc5(TSOP_PIN); //Informacja o podłączeniu odbiornika TSOP byte address; byte command; byte toggle; void setup() { //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 //Czujnik odleglosci pinMode(trigPin, OUTPUT); //Pin, do którego podłączymy trig jako wyjście pinMode(echoPin, INPUT); //a echo, jako wejście //Serwo do pinu 11 serwo.attach(SERWO_PIN); //Serwo na pozycje srodkowa 90 (bo zakres 0-180) serwo.write(90); Serial.begin(9600); } void loop() { if (rc5.read(&toggle, &address, &command)){ switch(command) { case 2: //Do przodu leftMotor(40); rightMotor(40); break; case 8: //Do tyłu leftMotor(-40); rightMotor(-40); break; case 5: //STOP stopMotors(); break; case 4: //Obrót w lewo leftMotor(-30); rightMotor(30); break; case 6: //Obrót w prawo leftMotor(30); rightMotor(-30); break; case 12: digitalWrite(BUZZER, 1); delay(500); digitalWrite(BUZZER, 0); break; case 56: //Czy wykryto przeszkode w zakresie 0-40 cm if (zmierzOdleglosc() > 40) { leftMotor(40); //Jesli nie, to jedz prosto rightMotor(40); } else { //Jesli przeszkoda stopMotors(); //Zatrzymaj robota serwo.write(20); //Skrec czujnikiem w prawo delay(800); //Poczekaj 800ms dla ustabilizowania konstrukcji //Sprawdz, czy po prawej stronie jest przeszkoda if (zmierzOdleglosc() > 40) { //Jesli jest pusto leftMotor(40); rightMotor(-40); delay(400); //Obracaj w prawo przez 400 ms } else { //Jeśli po prawej jest przeszkoda serwo.write(160); //Obroc czujnik w lewo delay(800); //Poczekaj 800ms dla ustabilizowania konstrukcji //Sprawdz, czy po lowej stronie jest przeszkoda if (zmierzOdleglosc() > 40) { //Jesli jest pusto leftMotor(-40); rightMotor(40); delay(400); //Obracaj w lewo przez 400 ms } else { //Jesli z przodu, z lewej i prawej jest przeszkoda digitalWrite(BUZZER, 1); delay(500); digitalWrite(BUZZER, 0); //Daj sygnal buzzerem } } //Po sprawdzeniu przeszkod po bokach //Ustaw czujnik prosto serwo.write(90); } //Opoznienie 100ms, ponieważ nie ma potrzeby sprawdzać przeszkod czesciej delay(100); } int zmierzOdleglosc() { long czas, dystans; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); czas = pulseIn(echoPin, HIGH); dystans = czas / 58; return dystans; } 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 } break; } } } 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 } Gdzie popełniam błąd. Jak zapisać po „case 56:” polecenie aby program samoczynnie wykonywał jazdę na podstawie wskazań czujnika.
×
×
  • 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.