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.
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 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.
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:
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
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.
Szczyt platformy
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 .
Płytka do czujnika ultradźwiękowego
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.
Kiedy to zrobimy, połączymy to wszystko razem.
Schemat podłączenia
Piny 4, 5, 6, 7 są używane przez osłonę silnika do sterowania dwoma silnikami
Software
Skoncentrujemy się na części oprogramowania i demonstracji działania robota.
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:
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]
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.
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.