Sut i wneud robot cartref gydag Arduino

Yn yr erthygl hon, rydyn ni'n mynd i ddysgu sut i berfformio a robot cartref bach a reolir gan fwrdd Arduino. Amcan y robot fydd osgoi rhwystrau trwy gyfrwng synhwyrydd uwchsain, pan fydd yn cyrraedd rhwystr bydd yn edrych i'r ddwy ochr ac yn pennu'r opsiwn gorau i barhau â'i orymdaith.

caledwedd

Yn y rhan gyntaf hon byddwn yn canolbwyntio ar adeiladu'r platfform robot, cydosod y rhannau a chysylltu.

robot_arduino

Deunydd angenrheidiol

  • Bwrdd Arduino
  • Pont H ar gyfer dau fodur (Yn fy achos i, byddaf yn defnyddio tarian modur Arduino o dfrobot)
  • Dau fotwm gwthio
  • Dau fodur DC (FIT0016 DFROBOT)
  • Dau wrthydd 10k Ohm
  • Dau amgodiwr (SEN0038 DFROBOT)
  • Dwy olwyn (FIT0003 DFROBOT)
  • Caster pêl (dwyn)
  • Servomotor
  • Synhwyrydd agosrwydd ultrasonic
  • Un batri 7,2v
  • Pren neu alwminiwm i adeiladu'r platfform

Pont H:

H bont

Cylched electronig yw pont-H sy'n caniatáu i fodur trydan DC gylchdroi i'r ddau gyfeiriad.
Mae'n cynnwys 4 switsh (gan ddefnyddio transistorau) ac mae'r cyfuniad o'r rhain yn gwneud iddo fynd un ffordd neu'r llall fel y dangosir yn y ddelwedd ganlynol.

H gweithrediad y bont

Amgodiwr:

encoder

Mae amgodiwr yn synhwyrydd sydd wedi'i osod yn y modur i wybod lleoliad y modur, mae hyn yn caniatáu inni reoli ei gylchdro.

Synhwyrydd agosrwydd ultrasonic:

synhwyrydd ultrasonic

Mae'r synhwyrydd hwn yn anfon corbys uwchsain, mae'r rhain yn bownsio'n ôl ac yn dychwelyd i'r synhwyrydd. Gellir cyfrifo'r pellter o hyd llwybr pwls uwchsain a chyflymder sain mewn aer. Ei amrediad mesur fel arfer yw 3cm i 4 metr.

Adeiladu:

Nesaf, byddaf yn egluro cynulliad y platfform a chysylltiad y gwahanol rannau.
Gellir adeiladu hyn gydag alwminiwm neu bren, mae alwminiwm yn rhoi gwell cyfanrwydd i'r strwythur ond mae'n anoddach ei brosesu. Yn fy achos i, rydw i wedi'i wneud o alwminiwm.

Mae'r holl fesuriadau yn ddangosol

Gwaelod y platfform

mesurau platfform robot

Yn y rhan hon bydd y moduron a'r dwyn yn cael eu cartrefu, yn gyntaf byddwn yn torri'r deunydd gyda'r mesuriadau uchod, os yw wedi'i wneud o bren, bydd yn rhaid torri 5 rhan a'u huno ag ewinedd, ar y llaw arall, ag alwminiwm y gellir torri darn cyfan ac yna ei blygu.

Ar ôl i ni gael y strwythur yn y rhan uchaf, byddwn yn drilio 4 twll oddeutu 3 metrig er mwyn gallu ymuno â'r rhan isaf â'r rhan uchaf yn ddiweddarach gyda sgriwiau a chnau.

I osod y dwyn rydym yn gwneud twll gyda choron fetrig 30 a dau dwll ar yr ochrau ar gyfer y bolltau angor.

Bydd yr injans yn mynd ar y waliau ochr ar y diwedd.

platfform gwaelod


Ar ben y platfform

mesurau platfform robot

Yn y rhan hon bydd y modur servo yn cael ei gartrefu a bydd sgriwiau'n ymuno â'r rhan isaf. Yn gyntaf byddwn yn torri cylch diamedr 170mm, yna byddwn yn gwneud y pedwar twll ar gyfer y sgriwiau ac yn y rhan flaen yn betryal i fewnosod y modur servo, nid wyf yn rhoi'r mesuriadau hyn oherwydd byddant yn dibynnu ar y math o fodur servo rydych chi'n ei ddefnyddio. .

platfform uchaf

Plât ar gyfer synhwyrydd ultrasonic

mesurau platfform robot

Bydd y plât yn cysylltu'r modur servo â'r synhwyrydd uwchsain, os caiff ei wneud â phren bydd yn rhaid i ni wneud dwy ran ac ymuno â nhw, gydag alwminiwm dim ond un rhan a'i blygu, yn gyntaf fe wnaethon ni dorri'r plât ac unwaith ei blygu yn y rhan fer. rydym yn gwneud twll o oddeutu metrig 3 ar gyfer y gefnogaeth servomotor (Pan fyddwch chi'n prynu servomotor mae'n gyffredin i chi feddwl am gynhaliaeth wahanol i angori yn fy achos i, byddaf yn defnyddio croes un), yna rydyn ni'n gwneud y tyllau yn y mawr rhan i ddal y synhwyrydd uwchsain gyda sgriwiau a chnau.

bwrdd synhwyrydd

Ar ôl gwneud hyn rydyn ni'n rhoi'r cyfan at ei gilydd.

platfform wedi'i osod

platfform wedi'i osod

platfform wedi'i osod

Diagram cysylltiad

cynllun cysylltu

Defnyddir pinnau 4, 5, 6, 7 gan y darian Modur i reoli'r ddau fodur

pinnau cysylltu

Meddalwedd

Byddwn yn canolbwyntio ar y rhan feddalwedd ac arddangosiad gweithrediad y robot.

Robot Arduino

I wneud rhaglen ychydig yn hir, fe'ch cynghorir i gynnig yr algorithm gweithredu, bydd hyn yn ein helpu llawer wrth raglennu. Mae algorithm yn set o gyfarwyddiadau sy'n eich galluogi i berfformio gweithgaredd.

Algorithm:

Algorithm robot

Rhennir y rhaglen yn brif raglen ac yna sawl is-raglen, yn y brif un yw lleoliad y botymau cychwyn a stopio a'r galwadau i'r is-raglenni ar gyfer mesur pellter, ymlaen llaw a'r gwahanol droadau yn dibynnu ar y pellteroedd ochrol.

Rhaglen:

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

Arddangosiad:

[amlygwyd] Ysgrifennwyd yr erthygl hon yn wreiddiol gan Wk3 ar gyfer Ikkaro [/ amlygwyd]

Os ydych chi'n berson aflonydd fel ni ac eisiau cydweithio i gynnal a chadw a gwella'r prosiect, gallwch chi wneud cyfraniad. Bydd yr holl arian yn mynd i brynu llyfrau a deunyddiau i arbrofi a gwneud tiwtorialau

2 sylw ar "Sut i wneud robot cartref gydag Arduino"

  1. Nos da, yn y feddalwedd robot arduino gyda synhwyrydd agosrwydd, y tro newidiol = 1, mae'r rhaglen yn ei ddeall fel troi i'r dde neu mae hyn yn gysylltiedig â'r llyfrgelloedd i ddeall hyn.
    yr un peth ar gyfer troi = 2 (trowch y robot i'r chwith) a throwch = 3 (ewch yn ôl a throwch y roboT),
    ESBONIO'R DWBL HON, BYDDWN YN DIOLCH YN FAWR.

    PWYNT ARALL NAD YW'R ROBOT YN CAEL LLEISI I DARPARU AC YN ARGRAFFU BANDIAU GWIRIO, MAE'N RHAID I'R DYCHWELYD A DYCHWELYD YN Y DYCHWELYD = 3, OND MAE'N CYFLWYNO NAD OES UNRHYW UN SY'N DALU.

    CYFREITHIAU AC Rwy'n HOPE EICH CEFNOGAETH.

    ateb
  2. Nos da, yn y feddalwedd robot arduino gyda synhwyrydd agosrwydd, y tro newidiol = 1, mae'r rhaglen yn ei ddeall fel troi i'r dde neu mae hyn yn gysylltiedig â'r llyfrgelloedd i ddeall hyn.
    yr un peth ar gyfer troi = 2 (trowch y robot i'r chwith) a throwch = 3 (ewch yn ôl a throwch y roboT),
    ESBONIO'R DWBL HON, BYDDWN YN DIOLCH YN FAWR.

    PWYNT ARALL NAD YW'R ROBOT YN CAEL LLEISI I DARPARU AC YN ARGRAFFU BANDIAU GWIRIO, MAE'N RHAID I'R DYCHWELYD A DYCHWELYD YN Y DYCHWELYD = 3, OND MAE'N CYFLWYNO NAD OES UNRHYW UN SY'N DALU.

    CYFREITHIAU AC Rwy'n HOPE EICH CEFNOGAETH.

    ateb

Gadael sylw