14-04-2021, 00:03
Cześć wszystkim!
Od dłuższego czasu głowię się nad rozwiązaniem swojego problemu, związanego ze zdalnym sterowaniem i w końcu postanowiłem poprosić o pomoc na tym forum.
Próbuję zbudować własnego robota na bazie Arduino UNO. Większość mojej wiedzy i kodu pochodzi ze strony forbot.pl.
Robot zbudowany jest z dwóch silników - każdy napędza jedno koło oraz wyposażony jest w czujnik odległości imitujący czujnik parkowania.
Problem polega na tym, że wywołując razem dwie funkcje Pilot i Buzzer w pętli, mój robot przestaje reagować na polecenia z pilota natomiast działa sam brzęczyk (imitacja czujnika parkowania). Natomiast kiedy wywołam samą funkcję Pilot, robot reaguje na polecenia jazdy zgodnie z założeniami. Po wielu testach doszedłem w końcu do tego, że zawadza mi instrukcja PulseIn pośrednio biorąca udział w funkcji Buzzer (w funkcji Buzzer zamieszczona jest funkcja DistanceSensor, która korzysta z PulseIn). Czy jest to możliwe, że biblioteka RC5 i instrukcja PulseIn jakoś się zakłócają? Jak można sobie z tym poradzić?
SERDECZNIE PROSZĘ O POMOC
Z góry bardzo dziękuję za pomoc i wskazówki
Od dłuższego czasu głowię się nad rozwiązaniem swojego problemu, związanego ze zdalnym sterowaniem i w końcu postanowiłem poprosić o pomoc na tym forum.
Próbuję zbudować własnego robota na bazie Arduino UNO. Większość mojej wiedzy i kodu pochodzi ze strony forbot.pl.
Robot zbudowany jest z dwóch silników - każdy napędza jedno koło oraz wyposażony jest w czujnik odległości imitujący czujnik parkowania.
Problem polega na tym, że wywołując razem dwie funkcje Pilot i Buzzer w pętli, mój robot przestaje reagować na polecenia z pilota natomiast działa sam brzęczyk (imitacja czujnika parkowania). Natomiast kiedy wywołam samą funkcję Pilot, robot reaguje na polecenia jazdy zgodnie z założeniami. Po wielu testach doszedłem w końcu do tego, że zawadza mi instrukcja PulseIn pośrednio biorąca udział w funkcji Buzzer (w funkcji Buzzer zamieszczona jest funkcja DistanceSensor, która korzysta z PulseIn). Czy jest to możliwe, że biblioteka RC5 i instrukcja PulseIn jakoś się zakłócają? Jak można sobie z tym poradzić?
SERDECZNIE PROSZĘ O POMOC
Kod:
Kod:
#define L_DIR 4 // pin 4 - kierunek obrotów silnik lewy (0 do przodu; 1 do tyłu)
#define L_SPD 5 // pin 5 - prędkość obrotów silnik lewy
#define R_DIR 9 // pin 9 - kierunek obrotów silnik prawy (0 do przodu; 1 do tyłu)
#define R_SPD 6 // pin 6 - prędkość obrotów silnik prawy
#define SPD_MAX 150 // maksymalna prędkość robota, która nie uszkodzi silników
#define BZR 10 // pin 10 - buzzer
#define TRIG 7 // pin 7 - wyzwolenie czujnika odległości (YELLOW)
#define ECHO 8 // pin 8 - pomiar odległości (GREEN)
#define IR 3 // pin 3 - odbiornik podczerwieni
#include <RC5.h> // biblioteka odpowiedzialna za sterownie pilotem
RC5 RC5(IR);
//zmienne do komunikacji IR
byte adress_device;
byte command_for_device;
byte toggle;
//zmienne do obsługi czujnika odległości
long measured_time;
long measured_distance;
void setup()
{
//uruchomienie komunikacji UART
Serial.begin(9600);
// ustawienie zdefiniowanych pinów mostka H jako wyjścia (sterowanie silnikami)
pinMode (L_DIR, OUTPUT);
pinMode (L_SPD, OUTPUT);
pinMode (R_DIR, OUTPUT);
pinMode (R_SPD, OUTPUT);
// ustawienie pozostałych pinów
pinMode (BZR, OUTPUT);
pinMode (TRIG, OUTPUT);
pinMode (ECHO, INPUT);
}
// funkcja do sterownia lewym silnikiem - za pomocą parametru SPEED określamy prędkość i kierunek obrotu lewego silnika
void LeftMotor (int SPEED)
{
if (SPEED > 100 || SPEED < -100 ) {goto speedError;} // zabezpieczenie prędkości maksymalnej
else {goto speedControl;}
speedError: // jeśli prędkość silnika będzie z innego zakresu niż (-100; 100) to ERROR
digitalWrite (BZR, HIGH);
delay (500);
digitalWrite (BZR, LOW);
Serial.println(" SpeedERROR - niebezpieczna prędkość ");
delay (10000);
goto speedError;
speedControl:
if (SPEED > 0) { // jeśli zmienna SPEED jest dodatnia to lewy silnik obraca się "do przodu"
map (SPEED, 0, 100, 0, SPD_MAX); // skalowanie wartości SPEED
digitalWrite (L_DIR, 0); // ustawienie kierunku obrotów silnika (0 - do przodu)
analogWrite (L_SPD, SPEED); // ustawienie prędkości silnika lewego
}
else { // jeśli zmienna SPEED jest ujemna to lewy silnik obraca się "do tyłu"
SPEED = abs(SPEED); // zwrócenie wartości absolutnej (bez znaku)
map (SPEED, 0, 100, 0, SPD_MAX); // skalowanie wartości SPEED
digitalWrite (L_DIR, 1); // ustawienie kierunku obrotów silnika (1 - do tyłu)
analogWrite (L_SPD, SPEED); // ustawienie prędkości silnika lewego
}
}
// funkcja do sterownia prawym silnikiem - za pomocą parametru SPEED określamy prędkość i kierunek obrotu prawego silnika
void RightMotor (int SPEED)
{
if (SPEED > 100 || SPEED < -100 ) {goto speedError;} // zabezpieczenie prędkości maksymalnej
else {goto speedControl;}
speedError: // jeśli prędkość silnika będzie z innego zakresu niż (-100; 100) to ERROR
digitalWrite (BZR, HIGH);
delay (500);
digitalWrite (BZR, LOW);
Serial.println(" SpeedERROR - niebezpieczna prędkość ");
delay (10000);
goto speedError;
speedControl:
if (SPEED > 0) { // jeśli zmienna SPEED jest dodatnia to prawy silnik obraca się "do przodu"
map (SPEED, 0, 100, 0, SPD_MAX); // skalowanie wartości SPEED
digitalWrite (R_DIR, 0); // ustawienie kierunku obrotów silnika (0 - do przodu)
analogWrite (R_SPD, SPEED); // ustawienie prędkości silnika lewego
}
else { // jeśli zmienna SPEED jest ujemna to prawy silnik obraca się "do tyłu"
SPEED = abs(SPEED); // zwrócenie wartości absolutnej (bez znaku)
map (SPEED, 0, 100, 0, SPD_MAX); // skalowanie wartości SPEED
digitalWrite (R_DIR, 1); // ustawienie kierunku obrotów silnika (1 - do tyłu)
analogWrite (R_SPD, SPEED); // ustawienie prędkości silnika lewego
}
}
// funkcja do zatrzymania silnika prawego
void StopRightMotor()
{
analogWrite (R_SPD, 0);
}
// funkcja do zatrzymania silnika lewego
void StopLeftMotor ()
{
analogWrite (L_SPD, 0);
}
// funkcja do obsługi czujnika odległości zwracająca odległość do przeszkody
int DistanceSensor ()
{
digitalWrite (TRIG, LOW); // zmiana stanu sygnału z wysokiego na niski na wyjściu TRIG powoduje wyzowlenie pomiaru
delayMicroseconds (5);
digitalWrite (TRIG, HIGH);
delayMicroseconds (15);
digitalWrite (TRIG, LOW);
measured_time = pulseIn(ECHO, HIGH); // dokonanie pomiaru czasu na wyjściu ECHO
measured_distance = measured_time / 58 ; // zmierzony czas podzielony przez 58 daje odległość w cm
return measured_distance;
}
// funkcja do wyzwolenia alarmu w zależności od odległości od przeszkody
void Buzzer()
{
if (DistanceSensor() < 15)
{
digitalWrite (BZR, HIGH);
}
if ((DistanceSensor() > 15) && (DistanceSensor() < 35))
{
digitalWrite (BZR, HIGH);
delay (200);
digitalWrite (BZR, LOW);
}
if (DistanceSensor() > 35)
{
digitalWrite (BZR, LOW);
}
}
void Pilot ()
{
// dokonuje odcztu z pilota po wciśnięciu przycisku
RC5.read(&toggle, &adress_device, &command_for_device);
{
switch (command_for_device)
{
// jazda do prozdu po wciśnięciu przycisku "2"
case 2:
LeftMotor (90);
RightMotor (90);
break;
// jazda do tyłu po wciśnięciu przycisku "8"
case 8:
LeftMotor (-90);
RightMotor (-90);
break;
// jazda w prawo po wciśnięciu przycisku "6"
case 6:
LeftMotor (90);
RightMotor (-90);
break;
// jazda w lewo po wciśnięciu przycisku "4"
case 4:
LeftMotor (-90);
RightMotor (90);
break;
// zatrzymanie silników po wciśnięciu przycisku "5"
case 5:
StopLeftMotor();
StopRightMotor();
break;
}
}
}
void loop()
{
Pilot ();
Buzzer ();
}
Z góry bardzo dziękuję za pomoc i wskazówki