Jak zrobić robota domowej roboty za pomocą Arduino

W tym artykule dowiemy się, jak wykonać plik mały robot domowej roboty sterowany płytką Arduino. Zadaniem robota będzie omijanie przeszkód za pomocą czujnika ultradźwiękowego, gdy dotrze do przeszkody spojrzy w obie strony i wskaże najlepszą opcję kontynuowania marszu.

sprzęt komputerowy

W tej pierwszej części skupimy się na budowie platformy robota, montażu części i ich łączeniu.

robot_arduino

Niezbędny materiał

  • Płyta Arduino
  • Mostek H dla dwóch silników (w moim przypadku użyję osłony silnika Arduino firmy dfrobot)
  • Dwa przyciski
  • Dwa silniki prądu stałego (FIT0016 DFROBOT)
  • Dwa rezystory 10k Ohm
  • Dwa enkodery (SEN0038 DFROBOT)
  • Dwa koła (FIT0003 DFROBOT)
  • Kółko kulkowe (łożysko)
  • Serwomotor
  • Ultradźwiękowy czujnik zbliżeniowy
  • Jedna bateria 7,2 V.
  • Drewno lub aluminium do budowy platformy

Mostek H:

Mostek H.

Mostek H to obwód elektroniczny, który umożliwia obracanie się silnika elektrycznego prądu stałego w obu kierunkach.
Składa się z 4 przełączników (wykorzystujących tranzystory), a ich kombinacja sprawia, że ​​działa w jedną lub drugą stronę, jak pokazano na poniższym obrazku.

Obsługa mostka H.

Koder:

koder

Enkoder to czujnik, który jest zainstalowany w silniku, aby poznać położenie silnika, co pozwala nam kontrolować jego obroty.

Ultradźwiękowy czujnik zbliżeniowy:

czujnik ultradźwiękowy

Ten czujnik wysyła impulsy ultradźwiękowe, które odbijają się z powrotem do czujnika. Odległość można obliczyć na podstawie czasu trwania ścieżki impulsu ultradźwiękowego i prędkości dźwięku w powietrzu. Jego zakres pomiarowy wynosi zwykle od 3 cm do 4 metrów.

Konstrukcja:

Następnie wyjaśnię montaż platformy i połączenie różnych części.
Można go zbudować z aluminium lub z drewna, aluminium zapewnia lepszą integralność konstrukcji, ale jest trudniejsze w obróbce. W moim przypadku zrobiłem to z aluminium.

Wszystkie pomiary mają charakter orientacyjny

Spód platformy

środki platformy robota

W tej części będą osadzone silniki i łożysko, najpierw wycinamy materiał z powyższymi wymiarami, jeśli jest wykonany z drewna, 5 części trzeba będzie wyciąć i połączyć gwoździami, z drugiej strony aluminium, cały kawałek można wyciąć, a następnie złożyć.

Gdy już mamy konstrukcję w górnej części, wywiercimy 4 otwory około 3 metryczne, aby później móc połączyć dolną część z górną za pomocą śrub i nakrętek.

Aby umieścić łożysko, wykonujemy otwór z koroną metryczną 30 i dwoma otworami po bokach na śruby kotwiące.

Silniki trafią na boczne ściany na samym końcu.

dolna platforma


Szczyt platformy

środki platformy robota

W tej części zostanie umieszczony serwomotor i połączony z dolną częścią za pomocą śrub. Najpierw wycinamy okrąg o średnicy 170mm, następnie zrobimy cztery otwory na śruby iw przedniej części prostokąt do wstawienia serwomotoru, nie umieszczam tych pomiarów ponieważ będą one zależały od typu używanego serwomotoru .

najwyższa platforma

Płytka do czujnika ultradźwiękowego

środki platformy robota

Płytka połączy serwomotor z czujnikiem ultradźwiękowym, jeśli jest wykonana z drewna będziemy musieli wykonać dwie części i połączyć je, z aluminium tylko jedną część i złożyć, najpierw wycinamy płytkę i po złożeniu krótszą część robimy otwór około metryczny 3 na wspornik serwomotoru (przy zakupie serwomotoru często masz różne wsporniki do zakotwiczenia w moim przypadku użyję krzyżowego), następnie wykonujemy otwory w dużej części do trzymania czujnika ultradźwiękowego za pomocą śrub i nakrętek.

płyta czujnika

Kiedy to zrobimy, połączymy to wszystko razem.

zamontowany na platformie

zamontowany na platformie

zamontowany na platformie

Schemat podłączenia

schemat połączeń

Piny 4, 5, 6, 7 są używane przez osłonę silnika do sterowania dwoma silnikami

piny połączeniowe

Software

Skoncentrujemy się na części oprogramowania i demonstracji działania robota.

Robot Arduino

Aby program był trochę długi, warto zaproponować algorytm działania, to nam bardzo pomoże przy programowaniu. Algorytm to zestaw instrukcji, który umożliwia wykonanie czynności.

Algorytm:

Algorytm robota

Program jest podzielony na program główny, a następnie kilka podprogramów, w głównym z nich znajdują się przyciski startu i stopu oraz wywołania podprogramów do pomiaru odległości, postępu i różnych zakrętów w zależności od odległości bocznych.

Program:

//Librerias
#include <Servo.h>

//Declaración E/S
int EM1 = 2; //Encoder motor 1 (Izquierda)
int EM2 = 3; //Encoder motor 2 (Derecha)
int M2D = 4; //Motor 2 control de dirección (Derecha)
int M1P = 6; //Motor 1 control PWM
int M2P = 5; //Motor 2 control PWM
int M1D = 7; //Motor 1 control de dirección (Izquierda)
int SU = 8; //Sensor de distancia por ultrasonidos
Servo servo1; //Servomotor
int BI = 10; //Boton de inicio
int BP = 11; //Boton de paro

//Declaración variables
int CRI = 0; //Contador rueda izquierda
int CRD = 0; //Contador rueda derecha
int EBI = 0; //Estado boton inicio
int velocidad = 200; //Velocidad de los motores
long dist = 0; //Distancia del robot (cm)
long duracion = 0; //Duración del recorrido del ping (microsegundos)
int VEA = 0; //variable encendido/apagado
int EBP = 0; //Estado boton de paro
long distizq = 0; // Distancia del robot (cm) a su izquierda
long distder = 0; // Distancia del robot (cm) a su derecha
byte giro = 0; //Variable para saber por donde girar
byte caso = 0; //Para seleccionar el caso de giro
int estadoAnterior = 0; //variables para cambio de estado del encoder izquierdo
int estadoActual;       //variables para cambio de estado del encoder izquierdo
int estadoAnterior1 = 0; //variables para cambio de estado del encoder derecho
int estadoActual1;      //variables para cambio de estado del encoder izquierdo

void setup() {
pinMode(M1D, OUTPUT);
pinMode(M2D, OUTPUT);
pinMode(EM1, INPUT);         //encoder 1 como entrada
digitalWrite(EM1, HIGH);    //resistencia pull-up para encoder
pinMode(EM2, INPUT);          //encoder 2 como entrada
digitalWrite(EM2, HIGH);    //resistencia pull-up para encoder
servo1.attach(9);  //inicializamos servo
servo1.write(100);   //lo colocamos en una posición media
pinMode(BI, INPUT);  //Boton de inicio como entrada
pinMode(BP, INPUT);  //Boton de paro como entrada
}

void loop() {
EBP=digitalRead(BP);    //lee los estados del boton
EBI=digitalRead(BI);    //lee los estados del boton
if (EBI == HIGH){        //si el estado del boton de inicio esta on
VEA = 1;              //variable encendido/apagado = 1

}
else if(EBP == HIGH) {    //si esta el de paro on
VEA = 0;               //variable encendido/apagado = 0
}
dist = sensorultrasonidos(); //Llama a la función para saber la distancia
if (VEA == 1 && dist > 15){  //Si la variable encendido/apagado tiene valor high y hay distancia suficiente
avanzar();  //Ir a la función avanzar
}
if (VEA == 1 && dist < 15){  //Si la variable encendido/apagado tiene valor high y no hay distancia suficiente
caso = comprobarbandas();  //Comprobamos bandas y depende el caso ira a una función determinada
switch(caso) {
case 1:
derecha();
break;
case 2:
izquierda();
break;
case 3:
giro180();
break;
}
}
}
void avanzar () {  //Función de avanzar hasta que haya una distancia de 15cm con el objeto en frente
digitalWrite(M1D,LOW);
digitalWrite(M2D, LOW);
analogWrite(M1P, velocidad);
analogWrite(M2P, velocidad);
while(dist >15){
dist = sensorultrasonidos(); //Llama a la función para saber la distancia
}
frenar();
}

int sensorultrasonidos() { //Función para medir la distancia con el sensor de ultrasonidos (cm)
pinMode(SU, OUTPUT);              //Configuramos el sensor de ultrasonidos como salida
digitalWrite(SU, LOW);            //Hacemos ping LOW-HIGH-LOW
delayMicroseconds(2);
digitalWrite(SU, HIGH);
delayMicroseconds(15);
digitalWrite(SU, LOW);
delayMicroseconds(20);
pinMode(SU, INPUT);               //Configuramos el sensor de ultrasonidos como entrada
duracion = pulseIn(SU, HIGH);     //Leemos la duración del pulso
delay(50);
return duracion / 29 / 2;     // Conversión de microsegundos a la distancia cm (velocidad del sonido 340m/s o 29 microsegundos por centimetro y son ida y vuelta /2)
}

void frenar (){    //funcion para frenar el robot
digitalWrite(M1D,HIGH);
digitalWrite(M2D, HIGH);
analogWrite(M1P, 0);
analogWrite(M2P, 0);
}

void derecha() {    //función para girar a la derecha teniendo en cuenta la rotacion de los encoders
digitalWrite(M1D,LOW);
digitalWrite(M2D, HIGH);
analogWrite(M1P, velocidad);
analogWrite(M2P, velocidad);
while (CRI <= 15 && CRD <=15 ){
contador_izq();
contador_der();
}
frenar();
}

void izquierda() {    //función para girar a la izquierda teniendo en cuenta la rotacion de los encoders
digitalWrite(M1D,HIGH);
digitalWrite(M2D, LOW);
analogWrite(M1P, velocidad);
analogWrite(M2P, velocidad);
while (CRI <= 15 && CRD <=15 ){
contador_izq();
contador_der();
}
frenar();
}

void giro180() {    //función para girar 180º teniendo en cuenta la rotacion de los encoders
digitalWrite(M1D,LOW);
digitalWrite(M2D, HIGH);
analogWrite(M1P, velocidad);
analogWrite(M2P, velocidad);
while (CRI <= 30 && CRD <=30 ){
contador_izq();
contador_der();
}
frenar();
}

void contador_izq(){    //Contaje de los estados del encoder izquierdo
estadoActual = digitalRead(EM1);
if (estadoAnterior != estadoActual)  // ha habido un cambio de estado
{
CRI++;                          // cuenta los cambios de estado
estadoAnterior = estadoActual;
}
}

void contador_der(){    //Contaje de los estados del encoder derecho
estadoActual1 = digitalRead(EM1);
if (estadoAnterior1 != estadoActual1)  // ha habido un cambio de estado
{
CRD++;                          // cuenta los cambios de estado
estadoAnterior1 = estadoActual1;
}
}

int comprobarbandas() {    //Función para comprovar bandas, mide la distancia de la izquierda y la derecha
CRI = 0;
CRD = 0;
servo1.write(5);
delay(500);
distizq = sensorultrasonidos();
servo1.write(175);
delay(500);
distder = sensorultrasonidos();
servo1.write(100);
delay(500);
if (distder >= distizq && distder > 15) {    //si la distancia derecha es mayor o igual a la distancia izquierda, girara a la derecha
giro = 1;
}
else if(distizq >= distder && distizq > 15) {  //si la distancia izquierda es mayor o igual a la distancia derecha, girara a la izquierda
giro = 2;
}
else if(distizq < 15 && distder < 15) {
giro = 3;
}
return giro;
}

Pokaz:

[wyróżnione] Ten artykuł został pierwotnie napisany przez Wk3 dla Ikkaro [/ wyróżniony]

2 komentarze na temat „Jak zrobić robota domowej roboty za pomocą Arduino”

  1. Dobranoc, w oprogramowaniu robota Arduino z czujnikiem zbliżeniowym, zmienna obrót = 1, program rozumie ją jako skręt w prawo lub jest to połączone z bibliotekami, aby to zrozumieć.
    to samo dla turn = 2 (obróć robota w lewo) i turn = 3 (wróć i obróć roboT),
    PROSZĘ WYJAŚNIĆ TE WĄTPLIWOŚCI, DZIĘKUJĘ.

    KOLEJNA WSKAZÓWKA, ROBOT NIE MA PUSTY NA ODWRÓCENIE SIĘ I SPRAWDZANIE OPASEK, NALEŻY ZWRÓCIĆ UWAGĘ, ŻE NA POWROCIE = 3 ZWROT I ZWROT JEST ZASTOSOWANY, ALE DOMNIEMUJE SIĘ, ŻE NIE MA LICZBY, KTÓRA JEST NAZWANA ZWROTEM.

    POZDRAWIAM I ŻYCZĘ WSPARCIA.

    odpowiedź
  2. Dobranoc, w oprogramowaniu robota Arduino z czujnikiem zbliżeniowym, zmienna obrót = 1, program rozumie ją jako skręt w prawo lub jest to połączone z bibliotekami, aby to zrozumieć.
    to samo dla turn = 2 (obróć robota w lewo) i turn = 3 (wróć i obróć roboT),
    PROSZĘ WYJAŚNIĆ TE WĄTPLIWOŚCI, DZIĘKUJĘ.

    KOLEJNA WSKAZÓWKA, ROBOT NIE MA PUSTY NA ODWRÓCENIE SIĘ I SPRAWDZANIE OPASEK, NALEŻY ZWRÓCIĆ UWAGĘ, ŻE NA POWROCIE = 3 ZWROT I ZWROT JEST ZASTOSOWANY, ALE DOMNIEMUJE SIĘ, ŻE NIE MA LICZBY, KTÓRA JEST NAZWANA ZWROTEM.

    POZDRAWIAM I ŻYCZĘ WSPARCIA.

    odpowiedź

Zostaw komentarz