[ARDUINO] Oko Cyklopa – ultradźwiękowy „radar” do lokalizacji obiektów
List. 4. Fragment programu sortujący wyniki pomiaru
if(A<=B)
{
if(A<=C)
{
A;
}
else
{
C;
}
}
else
{
if(B<=C)
{
B;
}
}
Podczas analizy schematu napotkałem kluczowy problem. Pierwotnie urządzenie miało być zasilane z wykorzystaniem stabilizatora napięcia zamontowanego na płytce startowej Arduino Leonardo. Jednak wykorzystany w projekcie silnik serwo potrzebował większej mocy niż mógł dostarczyć stabilizatora. Powodowało to znaczne spadki napięcia w układzie, co skutkowało zerowaniem się mikrokontrolera. Aby zabezpieczyć układ przed spadkami napięcia, wykorzystałem układ zasilający step-down, który stał się równoległym źródłem napięcia dla silnika serwo oraz Arduino. Na rysunku 4 znajduje się ostateczny schemat urządzenia.
Rys. 4. Schemat elektryczny finalnego urządzenia
Pamiętając o estetycznym programowaniu zostały przygotowane bloki funkcyjne realizujące główne zadania. Pierwszy realizuje pobranie oraz analizę danych z czujników ultradźwiękowych (listing 5 i listing 6), natomiast drugi blok główny kieruje pracą serwomechanizmu (listing 7).
List. 5. Fragment programu odpowiedzialny za pomiar odległości
void pomiar_odleglosci ()
{
// impuls 10 uS inicjalizujacy - patrz dokumentacja
digitalWrite(TX1, HIGH);
delayMicroseconds(10);
digitalWrite(TX1, LOW);
TIME1 = pulseIn(RX1, HIGH);
digitalWrite(TX2, HIGH);
delayMicroseconds(10);
digitalWrite(TX2, LOW);
TIME2 = pulseIn(RX2, HIGH);
digitalWrite(TX3, HIGH);
delayMicroseconds(10);
digitalWrite(TX3, LOW);
TIME3 = pulseIn(RX3, HIGH);
}
List. 6. Fragment programu sortujący wartości odczytane przez czujniki
if(TIME1<=TIME2)
{
if (TIME1<=TIME3)
{
dx=5;
}
else
{
dx=15;
}
}
else
{
if(TIME2<=TIME3)
{
dx=-15;
}
}
List. 7. Pętla główna programu
void loop()
{
pomiar_odleglosci();
// szerokość odbitego impulsu w uS podzielone przez
// 58 to odleglosc w cm - patrz dokumentacja
Serial.print(" Czujnik 1: ");
TIME1=TIME1/58;
Serial.print(TIME1);
Serial.print(" Czujnik 2: ");
TIME2=TIME2/58;
Serial.print(TIME2);
Serial.print(" Czujnik 3: ");
TIME3=TIME3/58;
Serial.println(TIME3);
if(TIME1<=TIME2)
{
if (TIME1<=TIME3)
{
dx=0;
}
//w przypadku śledzenia obiektu przez oko frontowe brak reakcji
else
{
dx=15;
}
//w przypadku wykrycia obiektu przez oko prawe obrót w prawo
}
else
{
if(TIME2<=TIME3) { dx=-15; } //w przypadku wykrycia obiektu przez oko lewe obrót w lewo } pos=pos+dx; //zabezpieczenie przed osiągnięciem przez silnik wartości skrajnych if(pos>170)
{
pos=170;
}
else
{
if(pos<10)
{
pos=10;
}
}
Serial.println(pos);
myservo.write(pos); // ustawienie silnika serwo w pozycji "pos"
delay(70);
}
Opisywany projekt jest przeznaczony przede wszystkim dla początkujących oraz średnio-zaawansowanych adeptów robotyki. Pozwala zdobyć doświadczenie w dziedzinie wykorzystania czujników ultradźwiękowych w różnych konfiguracjach portów. Realizując ten projekt (fotografia 5) zyskujemy umiejętności wykorzystania silników serwo, które dzięki swej precyzji często są obowiązkowym punktem kolejnych projektów.

Fot. 5. Widok zmontowanego urządzenia


[RAQ] Uproszczenie pokładowych systemów bezpieczeństwa oraz zwiększenie wydajności wideo dzięki zastosowaniu GMSL
Cyfrowa transformacja polskich firm przyspiesza – raport Polcom 2025
MIPS S8200 dostarcza oprogramowanie RISC-V NPU umożliwiające fizyczną AI w autonomicznej sieci brzegowej 





