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.
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:
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.
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:
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
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.
Top fan it platfoarm
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.
Plaat foar ultrasone sensor
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.
As dit ien kear dien is, sette wy it allegear byinoar.
Ferbiningsdiagram
Pins 4, 5, 6, 7 wurde brûkt troch it Motor-skyld om de twa motors te kontrolearjen
Software
Wy sille rjochtsje op it softwarediel en de demonstraasje fan 'e robotbedriuw.
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:
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]
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.
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.