ในบทความนี้เราจะเรียนรู้วิธีการใช้งานไฟล์ หุ่นยนต์โฮมเมดขนาดเล็กควบคุมโดยบอร์ด Arduino. วัตถุประสงค์ของหุ่นยนต์คือเพื่อหลีกเลี่ยงอุปสรรคโดยใช้เซ็นเซอร์อัลตร้าซาวด์เมื่อมันไปถึงสิ่งกีดขวางมันจะมองไปที่ทั้งสองด้านและกำหนดตัวเลือกที่ดีที่สุดในการเดินต่อ
ฮาร์ดแวร์
ในส่วนแรกนี้เราจะมุ่งเน้นไปที่การสร้างแพลตฟอร์มหุ่นยนต์ประกอบชิ้นส่วนและเชื่อมต่อเข้าด้วยกัน
วัสดุที่จำเป็น
- บอร์ด Arduino
- สะพาน H สำหรับมอเตอร์สองตัว (ในกรณีของฉันฉันจะใช้ Arduino motor shield จาก dfrobot)
- ปุ่มกดสองปุ่ม
- มอเตอร์กระแสตรงสองตัว (FIT0016 DFROBOT)
- ตัวต้านทาน 10k โอห์มสองตัว
- ตัวเข้ารหัสสองตัว (SEN0038 DFROBOT)
- สองล้อ (FIT0003 DFROBOT)
- ลูกล้อ (ลูกปืน)
- เซอร์โวมอเตอร์
- เซ็นเซอร์ความใกล้เคียงอัลตราโซนิก
- แบตเตอรี่ 7,2v หนึ่งก้อน
- ไม้หรืออลูมิเนียมเพื่อสร้างแพลตฟอร์ม
สะพาน H:
สะพาน H เป็นวงจรอิเล็กทรอนิกส์ที่ช่วยให้มอเตอร์ไฟฟ้ากระแสตรงหมุนได้ทั้งสองทิศทาง
ประกอบด้วยสวิตช์ 4 ตัว (ใช้ทรานซิสเตอร์) และการรวมกันของสิ่งเหล่านี้ทำให้ไปทางใดทางหนึ่งดังที่แสดงในภาพต่อไปนี้
Encoder:
ตัวเข้ารหัสคือเซ็นเซอร์ที่ติดตั้งในมอเตอร์เพื่อให้ทราบตำแหน่งของมอเตอร์ซึ่งทำให้เราสามารถควบคุมการหมุนได้
เซ็นเซอร์ความใกล้เคียงอัลตราโซนิก:
เซ็นเซอร์นี้จะส่งพัลส์อัลตราซาวนด์ซึ่งจะเด้งกลับและกลับไปที่เซ็นเซอร์ ระยะทางสามารถคำนวณได้จากระยะเวลาของเส้นทางพัลส์อัลตราซาวนด์และความเร็วของเสียงในอากาศ ช่วงการวัดโดยปกติคือ 3 ซม. ถึง 4 เมตร
การก่อสร้าง:
ต่อไปฉันจะอธิบายการประกอบแพลตฟอร์มและการเชื่อมต่อของส่วนต่างๆ
สามารถสร้างด้วยอลูมิเนียมหรือด้วยไม้อลูมิเนียมให้ความสมบูรณ์ของโครงสร้างดีกว่า แต่ยากต่อการประมวลผล ในกรณีของฉันฉันทำจากอลูมิเนียม
การวัดทั้งหมดเป็นสิ่งบ่งชี้
ด้านล่างของแพลตฟอร์ม
ในส่วนนี้จะติดตั้งมอเตอร์และแบริ่งก่อนอื่นเราจะตัดวัสดุด้วยการวัดด้านบนถ้าเป็นไม้จะต้องตัด 5 ส่วนและต่อด้วยตะปูในทางกลับกันด้วยอลูมิเนียม สามารถตัดทั้งชิ้นแล้วพับได้
เมื่อเรามีโครงสร้างในส่วนบนแล้วเราจะเจาะ 4 รูประมาณ 3 เมตริกเพื่อให้สามารถเชื่อมต่อส่วนล่างกับส่วนบนด้วยสกรูและน็อตได้ในภายหลัง
ในการวางแบริ่งเราทำรูด้วยเม็ดมะยม 30 เมตริกและสองรูที่ด้านข้างสำหรับสลักเกลียวยึด
เครื่องยนต์จะไปที่ผนังด้านข้างที่ปลายสุด
ด้านบนของแพลตฟอร์ม
ในส่วนนี้จะติดตั้งเซอร์โวมอเตอร์และต่อเข้ากับส่วนล่างด้วยสกรู ก่อนอื่นเราจะตัดวงกลมขนาดเส้นผ่านศูนย์กลาง 170 มม. จากนั้นเราจะทำให้สี่รูสำหรับสกรูและในส่วนหน้าเป็นรูปสี่เหลี่ยมผืนผ้าเพื่อใส่เซอร์โวมอเตอร์ฉันไม่ได้ทำการวัดเหล่านี้เพราะจะขึ้นอยู่กับประเภทของเซอร์โวมอเตอร์ที่คุณใช้ .
แผ่นสำหรับเซ็นเซอร์อัลตราโซนิก
แผ่นจะเชื่อมเซอร์โวมอเตอร์เข้ากับเซ็นเซอร์อัลตร้าซาวด์ถ้าทำด้วยไม้เราจะต้องทำสองส่วนเข้าด้วยกันโดยใช้อลูมิเนียมเพียงส่วนเดียวแล้วพับก่อนอื่นให้ตัดแผ่นและพับเป็นส่วนสั้น ๆ เราสร้างรูประมาณเมตริก 3 สำหรับส่วนรองรับเซอร์โวมอเตอร์ (เมื่อคุณซื้อเซอร์โวมอเตอร์เป็นเรื่องปกติที่คุณจะต้องมีส่วนรองรับที่แตกต่างกันในการยึดในกรณีของฉันฉันจะใช้ไม้กางเขน) จากนั้นเราทำรูในส่วนที่ใหญ่เพื่อ จับเซ็นเซอร์อัลตร้าซาวด์ด้วยสกรูและถั่ว
เมื่อเสร็จแล้วเราก็รวบรวมทั้งหมดเข้าด้วยกัน
แผนภาพการเชื่อมต่อ
Motor shield ใช้หมุด 4, 5, 6, 7 เพื่อควบคุมมอเตอร์ทั้งสองตัว
ซอฟต์แวร์
เราจะเน้นในส่วนของซอฟต์แวร์และการสาธิตการทำงานของหุ่นยนต์
เพื่อให้โปรแกรมมีความยาวเล็กน้อยขอแนะนำให้เสนอขั้นตอนวิธีการดำเนินการซึ่งจะช่วยเราได้มากเมื่อเขียนโปรแกรม อัลกอริทึมคือชุดคำสั่งที่ช่วยให้คุณทำกิจกรรมได้
อัลกอริทึม:
โปรแกรมแบ่งออกเป็นโปรแกรมหลักและโปรแกรมย่อยหลายโปรแกรมโดยโปรแกรมหลักคือตำแหน่งที่ปุ่มเริ่มต้นและหยุดและการเรียกโปรแกรมย่อยสำหรับการวัดระยะทางล่วงหน้าและการเลี้ยวที่แตกต่างกันขึ้นอยู่กับระยะทางด้านข้าง
โปรแกรม:
//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; }
การสาธิต:
[เน้น] บทความนี้เขียนโดย Wk3 สำหรับ Ikkaro [/ highlighted]
ราตรีสวัสดิ์ในซอฟต์แวร์หุ่นยนต์ arduino พร้อม proximity sensor ตัวแปร turn = 1 โปรแกรมเข้าใจว่าหันไปทางขวาหรือเชื่อมโยงกับไลบรารีเพื่อทำความเข้าใจสิ่งนี้
เหมือนกันสำหรับเทิร์น = 2 (หมุนหุ่นยนต์ไปทางซ้าย) และเทิร์น = 3 (ย้อนกลับและหมุน roboT)
โปรดอธิบายคู่นี้ฉันจะขอบคุณคุณ
อีกจุดหนึ่งของหุ่นยนต์ไม่มีโมฆะให้ย้อนกลับและในการตรวจสอบวงดนตรีจะถูกกล่าวถึงว่าในผลตอบแทน = 3 การส่งคืนและการส่งคืนจะถูกนำไปใช้ แต่มันได้รับการสนับสนุนว่าไม่มีโมฆะที่เรียกว่าส่งคืน
ทักทายและฉันมองหาการสนับสนุนจากคุณ
ราตรีสวัสดิ์ในซอฟต์แวร์หุ่นยนต์ arduino พร้อม proximity sensor ตัวแปร turn = 1 โปรแกรมเข้าใจว่าหันไปทางขวาหรือเชื่อมโยงกับไลบรารีเพื่อทำความเข้าใจสิ่งนี้
เหมือนกันสำหรับเทิร์น = 2 (หมุนหุ่นยนต์ไปทางซ้าย) และเทิร์น = 3 (ย้อนกลับและหมุน roboT)
โปรดอธิบายคู่นี้ฉันจะขอบคุณคุณ
อีกจุดหนึ่งของหุ่นยนต์ไม่มีโมฆะให้ย้อนกลับและในการตรวจสอบวงดนตรีจะถูกกล่าวถึงว่าในผลตอบแทน = 3 การส่งคืนและการส่งคืนจะถูกนำไปใช้ แต่มันได้รับการสนับสนุนว่าไม่มีโมฆะที่เรียกว่าส่งคืน
ทักทายและฉันมองหาการสนับสนุนจากคุณ