วิธีสร้างหุ่นยนต์โฮมเมดด้วย Arduino

ในบทความนี้เราจะเรียนรู้วิธีการใช้งานไฟล์ หุ่นยนต์โฮมเมดขนาดเล็กควบคุมโดยบอร์ด Arduino. วัตถุประสงค์ของหุ่นยนต์คือเพื่อหลีกเลี่ยงอุปสรรคโดยใช้เซ็นเซอร์อัลตร้าซาวด์เมื่อมันไปถึงสิ่งกีดขวางมันจะมองไปที่ทั้งสองด้านและกำหนดตัวเลือกที่ดีที่สุดในการเดินต่อ

ฮาร์ดแวร์

ในส่วนแรกนี้เราจะมุ่งเน้นไปที่การสร้างแพลตฟอร์มหุ่นยนต์ประกอบชิ้นส่วนและเชื่อมต่อเข้าด้วยกัน

หุ่นยนต์_arduino

วัสดุที่จำเป็น

  • บอร์ด Arduino
  • สะพาน H สำหรับมอเตอร์สองตัว (ในกรณีของฉันฉันจะใช้ Arduino motor shield จาก dfrobot)
  • ปุ่มกดสองปุ่ม
  • มอเตอร์กระแสตรงสองตัว (FIT0016 DFROBOT)
  • ตัวต้านทาน 10k โอห์มสองตัว
  • ตัวเข้ารหัสสองตัว (SEN0038 DFROBOT)
  • สองล้อ (FIT0003 DFROBOT)
  • ลูกล้อ (ลูกปืน)
  • เซอร์โวมอเตอร์
  • เซ็นเซอร์ความใกล้เคียงอัลตราโซนิก
  • แบตเตอรี่ 7,2v หนึ่งก้อน
  • ไม้หรืออลูมิเนียมเพื่อสร้างแพลตฟอร์ม

สะพาน H:

สะพาน H

สะพาน H เป็นวงจรอิเล็กทรอนิกส์ที่ช่วยให้มอเตอร์ไฟฟ้ากระแสตรงหมุนได้ทั้งสองทิศทาง
ประกอบด้วยสวิตช์ 4 ตัว (ใช้ทรานซิสเตอร์) และการรวมกันของสิ่งเหล่านี้ทำให้ไปทางใดทางหนึ่งดังที่แสดงในภาพต่อไปนี้

การทำงานของสะพาน H

Encoder:

encoder

ตัวเข้ารหัสคือเซ็นเซอร์ที่ติดตั้งในมอเตอร์เพื่อให้ทราบตำแหน่งของมอเตอร์ซึ่งทำให้เราสามารถควบคุมการหมุนได้

เซ็นเซอร์ความใกล้เคียงอัลตราโซนิก:

เซ็นเซอร์อัลตราโซนิก

เซ็นเซอร์นี้จะส่งพัลส์อัลตราซาวนด์ซึ่งจะเด้งกลับและกลับไปที่เซ็นเซอร์ ระยะทางสามารถคำนวณได้จากระยะเวลาของเส้นทางพัลส์อัลตราซาวนด์และความเร็วของเสียงในอากาศ ช่วงการวัดโดยปกติคือ 3 ซม. ถึง 4 เมตร

การก่อสร้าง:

ต่อไปฉันจะอธิบายการประกอบแพลตฟอร์มและการเชื่อมต่อของส่วนต่างๆ
สามารถสร้างด้วยอลูมิเนียมหรือด้วยไม้อลูมิเนียมให้ความสมบูรณ์ของโครงสร้างดีกว่า แต่ยากต่อการประมวลผล ในกรณีของฉันฉันทำจากอลูมิเนียม

การวัดทั้งหมดเป็นสิ่งบ่งชี้

ด้านล่างของแพลตฟอร์ม

มาตรการแพลตฟอร์มหุ่นยนต์

ในส่วนนี้จะติดตั้งมอเตอร์และแบริ่งก่อนอื่นเราจะตัดวัสดุด้วยการวัดด้านบนถ้าเป็นไม้จะต้องตัด 5 ส่วนและต่อด้วยตะปูในทางกลับกันด้วยอลูมิเนียม สามารถตัดทั้งชิ้นแล้วพับได้

เมื่อเรามีโครงสร้างในส่วนบนแล้วเราจะเจาะ 4 รูประมาณ 3 เมตริกเพื่อให้สามารถเชื่อมต่อส่วนล่างกับส่วนบนด้วยสกรูและน็อตได้ในภายหลัง

ในการวางแบริ่งเราทำรูด้วยเม็ดมะยม 30 เมตริกและสองรูที่ด้านข้างสำหรับสลักเกลียวยึด

เครื่องยนต์จะไปที่ผนังด้านข้างที่ปลายสุด

แพลตฟอร์มด้านล่าง


ด้านบนของแพลตฟอร์ม

มาตรการแพลตฟอร์มหุ่นยนต์

ในส่วนนี้จะติดตั้งเซอร์โวมอเตอร์และต่อเข้ากับส่วนล่างด้วยสกรู ก่อนอื่นเราจะตัดวงกลมขนาดเส้นผ่านศูนย์กลาง 170 มม. จากนั้นเราจะทำให้สี่รูสำหรับสกรูและในส่วนหน้าเป็นรูปสี่เหลี่ยมผืนผ้าเพื่อใส่เซอร์โวมอเตอร์ฉันไม่ได้ทำการวัดเหล่านี้เพราะจะขึ้นอยู่กับประเภทของเซอร์โวมอเตอร์ที่คุณใช้ .

แพลตฟอร์มชั้นนำ

แผ่นสำหรับเซ็นเซอร์อัลตราโซนิก

มาตรการแพลตฟอร์มหุ่นยนต์

แผ่นจะเชื่อมเซอร์โวมอเตอร์เข้ากับเซ็นเซอร์อัลตร้าซาวด์ถ้าทำด้วยไม้เราจะต้องทำสองส่วนเข้าด้วยกันโดยใช้อลูมิเนียมเพียงส่วนเดียวแล้วพับก่อนอื่นให้ตัดแผ่นและพับเป็นส่วนสั้น ๆ เราสร้างรูประมาณเมตริก 3 สำหรับส่วนรองรับเซอร์โวมอเตอร์ (เมื่อคุณซื้อเซอร์โวมอเตอร์เป็นเรื่องปกติที่คุณจะต้องมีส่วนรองรับที่แตกต่างกันในการยึดในกรณีของฉันฉันจะใช้ไม้กางเขน) จากนั้นเราทำรูในส่วนที่ใหญ่เพื่อ จับเซ็นเซอร์อัลตร้าซาวด์ด้วยสกรูและถั่ว

บอร์ดเซ็นเซอร์

เมื่อเสร็จแล้วเราก็รวบรวมทั้งหมดเข้าด้วยกัน

ติดตั้งแพลตฟอร์ม

ติดตั้งแพลตฟอร์ม

ติดตั้งแพลตฟอร์ม

แผนภาพการเชื่อมต่อ

โครงร่างการเชื่อมต่อ

Motor shield ใช้หมุด 4, 5, 6, 7 เพื่อควบคุมมอเตอร์ทั้งสองตัว

หมุดเชื่อมต่อ

ซอฟต์แวร์

เราจะเน้นในส่วนของซอฟต์แวร์และการสาธิตการทำงานของหุ่นยนต์

หุ่นยนต์ Arduino

เพื่อให้โปรแกรมมีความยาวเล็กน้อยขอแนะนำให้เสนอขั้นตอนวิธีการดำเนินการซึ่งจะช่วยเราได้มากเมื่อเขียนโปรแกรม อัลกอริทึมคือชุดคำสั่งที่ช่วยให้คุณทำกิจกรรมได้

อัลกอริทึม:

อัลกอริทึมของหุ่นยนต์

โปรแกรมแบ่งออกเป็นโปรแกรมหลักและโปรแกรมย่อยหลายโปรแกรมโดยโปรแกรมหลักคือตำแหน่งที่ปุ่มเริ่มต้นและหยุดและการเรียกโปรแกรมย่อยสำหรับการวัดระยะทางล่วงหน้าและการเลี้ยวที่แตกต่างกันขึ้นอยู่กับระยะทางด้านข้าง

โปรแกรม:

//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]

หากคุณเป็นคนใจร้อนเหมือนเราและต้องการร่วมมือในการบำรุงรักษาและปรับปรุงโครงการ คุณสามารถบริจาคได้ เงินทั้งหมดจะไปซื้อหนังสือและวัสดุเพื่อทดลองและทำแบบฝึกหัด

2 ความคิดเห็นเกี่ยวกับ "วิธีสร้างหุ่นยนต์โฮมเมดด้วย Arduino"

  1. ราตรีสวัสดิ์ในซอฟต์แวร์หุ่นยนต์ arduino พร้อม proximity sensor ตัวแปร turn = 1 โปรแกรมเข้าใจว่าหันไปทางขวาหรือเชื่อมโยงกับไลบรารีเพื่อทำความเข้าใจสิ่งนี้
    เหมือนกันสำหรับเทิร์น = 2 (หมุนหุ่นยนต์ไปทางซ้าย) และเทิร์น = 3 (ย้อนกลับและหมุน roboT)
    โปรดอธิบายคู่นี้ฉันจะขอบคุณคุณ

    อีกจุดหนึ่งของหุ่นยนต์ไม่มีโมฆะให้ย้อนกลับและในการตรวจสอบวงดนตรีจะถูกกล่าวถึงว่าในผลตอบแทน = 3 การส่งคืนและการส่งคืนจะถูกนำไปใช้ แต่มันได้รับการสนับสนุนว่าไม่มีโมฆะที่เรียกว่าส่งคืน

    ทักทายและฉันมองหาการสนับสนุนจากคุณ

    คำตอบ
  2. ราตรีสวัสดิ์ในซอฟต์แวร์หุ่นยนต์ arduino พร้อม proximity sensor ตัวแปร turn = 1 โปรแกรมเข้าใจว่าหันไปทางขวาหรือเชื่อมโยงกับไลบรารีเพื่อทำความเข้าใจสิ่งนี้
    เหมือนกันสำหรับเทิร์น = 2 (หมุนหุ่นยนต์ไปทางซ้าย) และเทิร์น = 3 (ย้อนกลับและหมุน roboT)
    โปรดอธิบายคู่นี้ฉันจะขอบคุณคุณ

    อีกจุดหนึ่งของหุ่นยนต์ไม่มีโมฆะให้ย้อนกลับและในการตรวจสอบวงดนตรีจะถูกกล่าวถึงว่าในผลตอบแทน = 3 การส่งคืนและการส่งคืนจะถูกนำไปใช้ แต่มันได้รับการสนับสนุนว่าไม่มีโมฆะที่เรียกว่าส่งคืน

    ทักทายและฉันมองหาการสนับสนุนจากคุณ

    คำตอบ

แสดงความคิดเห็น