Hoe meitsje jo in selsmakke robot mei Arduino

Yn dit artikel sille wy leare hoe't jo in kinne útfiere lytse selsmakke robot regele troch Arduino board, It doel fan 'e robot sil wêze om obstakels te foarkommen troch in ultrasoan sensor, as hy in obstakel berikt sil it nei beide kanten sjen en de bêste opsje bepale om syn mars troch te gean.

Hardware

Yn dit earste diel sille wy ús rjochtsje op it bouwen fan it robotplatfoarm, it gearstallen fan de dielen en it ferbinen.

robot_arduino

Nedich materiaal

  • In Arduino-boerd
  • In H-brêge foar twa motors (Yn myn gefal sil ik it Arduino-motorskerm brûke fan dfrobot)
  • Twa drukknoppen
  • Twa DC-motors (FIT0016 DFROBOT)
  • Twa wjerstannen fan 10k Ohm
  • Twa kodearders (SEN0038 DFROBOT)
  • Twa tsjillen (FIT0003 DFROBOT)
  • In kûgel (lager)
  • In servomotor
  • In ultrasone neite-sensor
  • Ien 7,2v batterij
  • Hout as aluminium om it platfoarm te bouwen

H-brêge:

H brêge

In H-brêge is in elektroanyske sirkwy wêrtroch in DC-elektryske motor yn beide rjochtingen kin draaie.
It bestiet út 4 skakelaars (mei transistors) en de kombinaasje dêrfan makket dat it de iene of oare kant giet lykas werjûn yn 'e folgjende ôfbylding.

H brêge operaasje

Encoder:

encoder

In kodearder is in sensor dy't yn 'e motor is ynstalleare om de posysje fan' e motor te kennen, dit stelt ús de rotaasje te kontrolearjen.

Ultrasone neite-sensor:

ultrasone sensor

Dizze sensor stjoert echografiepulsen út, dy stuitere werom nei de sensor. De ôfstân kin wurde berekkene fanút de doer fan it ultrasoanpulspaad en de snelheid fan lûd yn loft. It mjitberik is normaal 3cm oant 4 meter.

Bouw:

Folgjende sil ik de gearstalling fan it platfoarm en de ferbining fan 'e ferskate dielen útlizze.
Dit kin wurde boud mei aluminium as hout, aluminium jout bettere yntegriteit oan 'e struktuer, mar is lestiger te ferwurkjen. Yn myn gefal haw ik it makke fan aluminium.

Alle mjittingen binne oanwizend

Underkant fan platfoarm

robot platfoarm maatregels

Yn dit diel sille de motors en it lager wurde húsfeste, earst sille wy it materiaal snije mei de hjirboppe mjittingen, as it is makke fan hout, sille 5 dielen moatte wurde knipt en mei neils gearfoege, oan 'e oare kant, mei aluminium de hiel stik kin wurde knipt en dan folje.

As wy ienris de struktuer yn it boppeste diel hawwe, boarje wy 4 gatten sawat 3 metriken om letter mei skroeven en moeren it ûnderste diel mei it boppeste diel te ferbinen.

Om it lager te pleatsen meitsje wy in gat mei in metrike kroan fan 30 en twa gatten oan 'e kanten foar de ankerbouten.

De motoren sille oan 'e ein fan' e sydmuorren gean.

ûnderste platfoarm


Top fan it platfoarm

robot platfoarm maatregels

Yn dit diel sil de servomotor ûnderbrocht wurde en wurdt mei skroeven ferbûn mei it ûnderste diel. Earst sille wy in sirkel mei in diameter fan 170 mm snije, dan meitsje wy de fjouwer gatten foar de skroeven en oan 'e foarkant in rjochthoek om de servomotor yn te foegjen, ik set dizze mjittingen net, om't se ôfhinklik wêze fan it type servomotor dat jo brûke.

top platfoarm

Plaat foar ultrasone sensor

robot platfoarm maatregels

De plaat sil de servomotor keppelje mei de echografie sensor, as hy is makke mei hout sille wy twa dielen moatte meitsje en har oanslute, mei aluminium mar ien diel en it foldje, earst snije wy de plaat en ienris yn 't koarte diel wy meitsje in gat fan likernôch metryk 3 foar de servomotorstipe (As jo ​​in servomotor keapje, is it gewoan dat jo ferskillende stipen hawwe om te ankerjen yn myn gefal sil ik in dwers brûke), dan meitsje wy de gatten yn it grutte diel om de ultrasoan-sensor mei skroeven en moeren te hâlden.

sensor board

As dit ien kear dien is, sette wy it allegear byinoar.

platfoarm monteard

platfoarm monteard

platfoarm monteard

Ferbiningsdiagram

ferbiningsskema

Pins 4, 5, 6, 7 wurde brûkt troch it Motor-skyld om de twa motors te kontrolearjen

ferbiningspinnen

Software

Wy sille rjochtsje op it softwarediel en de demonstraasje fan 'e robotbedriuw.

Arduino robot

Om in programma wat lang te meitsjen, is it oan te rieden om it operaasjealgoritme foar te stellen, dit sil ús in protte helpe by programmearjen. In algoritme is in set ynstruksjes wêrmei jo in aktiviteit útfiere kinne.

Algoritme:

Robotalgoritme

It programma is ferdield yn it haadprogramma en dan ferskate subprogramma's, de wichtichste is wêr't de start- en stopknoppen sitte en de subprogramma's foar ôfmjitting, foarútgong en de ferskillende bochten ôfhinklik fan de sydôfstannen.

Programma:

//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;
}

Demonstraasje:

[markearre] Dit artikel is oarspronklik skreaun troch Wk3 foar Ikkaro [/ markearre]

2 opmerkingen oer "Hoe meitsje jo in selsmakke robot mei Arduino"

  1. Goede nacht, yn 'e arduino-robotsoftware mei neite-sensor, de fariabele turn = 1, it programma begrypt it as draai nei rjochts of dit is keppele oan de biblioteken om dit te begripen.
    itselde foar beurt = 2 (draai de robot nei links) en draai = 3 (gean werom en draai de roboT),
    FERLIEDJE DIT TWYFEL, Ik soe DANKE wêze.

    NOCH EEN PUNT hat de robot gjin leechte om werom te reitsjen en by it kontrolearjen fan bannen, wurdt neamd dat yn 'e weromreis = 3 in weromkear en in weromkearing tapast wurdt, Mar it wurdt foarsteld dat d'r gjin leechte is dy't neamd wurdt as weromkear.

    GROETJES EN ik HOOP JOU SUPPORT.

    antwurd
  2. Goede nacht, yn 'e arduino-robotsoftware mei neite-sensor, de fariabele turn = 1, it programma begrypt it as draai nei rjochts of dit is keppele oan de biblioteken om dit te begripen.
    itselde foar beurt = 2 (draai de robot nei links) en draai = 3 (gean werom en draai de roboT),
    FERLIEDJE DIT TWYFEL, Ik soe DANKE wêze.

    NOCH EEN PUNT hat de robot gjin leechte om werom te reitsjen en by it kontrolearjen fan bannen, wurdt neamd dat yn 'e weromreis = 3 in weromkear en in weromkearing tapast wurdt, Mar it wurdt foarsteld dat d'r gjin leechte is dy't neamd wurdt as weromkear.

    GROETJES EN ik HOOP JOU SUPPORT.

    antwurd

Leave a comment