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.
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:
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.
Amgodiwr:
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:
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
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.
Ar ben y platfform
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. .
Plât ar gyfer synhwyrydd ultrasonic
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.
Ar ôl gwneud hyn rydyn ni'n rhoi'r cyfan at ei gilydd.
Diagram cysylltiad
Defnyddir pinnau 4, 5, 6, 7 gan y darian Modur i reoli'r ddau fodur
Meddalwedd
Byddwn yn canolbwyntio ar y rhan feddalwedd ac arddangosiad gweithrediad y robot.
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:
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]
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.
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.