본문 바로가기
메카넘 휠 로봇

메카넘 로봇 - MKBUMBLE: 전방향 이동 로봇 프로젝트 🚀

by 모빌리티키즈 2024. 12. 12.
728x90
반응형

안녕하세요, 여러분! 오늘은 메카넘 바퀴, Arduino Mega 및 TT 모터를 사용하여 개발한 멋진 로봇 자동차 프로젝트를 소개하려고 합니다. 메카넘 로봇은 12가지 뚜렷한 이동 기능을 활용하여 정밀하고 다재다능한 이동을 가능하게 합니다. 뿐만 아니라 MIT App Inventor를 사용하여 로봇의 움직임을 제어할 수 있는 모바일 애플리케이션을 개발해 사용자 친화적인 작동을 보장합니다. 또한, 안전한 주행을 위한 주차 센서 시스템도 통합했습니다.

프로젝트 개요

이 프로젝트는 메카넘 휠을 사용한 로봇 자동차의 개발 과정과 특징을 다루고 있습니다. 로봇은 정밀한 제어를 위해 커스텀 컨트롤 코드를 사용하며, MIT App Inventor로 개발한 모바일 앱을 통해 쉽게 조작할 수 있습니다. 또한, 주차 센서를 통해 장애물을 감지하고 경고하여 안전한 주행을 돕습니다.

주요 기능

  • 전방향 이동성: 메카넘 휠을 통해 12가지 이동 기능을 제공합니다.
  • 정밀 제어: 커스텀 컨트롤 코드와 모바일 애플리케이션을 사용하여 로봇의 움직임을 정밀하게 제어합니다.
  • 안전 주행: 주차 센서 시스템을 통해 장애물을 감지하고 경고하여 안전성을 높였습니다.

공급

프로젝트 단계

  1. 하드웨어 구성:
    • 메카넘 휠 × 4
    • Arduino Mega
    • TT 모터 또는 옐로우 기어드 모터 × 4
    • 버저
    • 220Ω 저항기 × 3
    • RGB 다이오드 LED
    • 점퍼 케이블
    • HC-05 블루투스 모듈
    • 작은 브레드보드
    • 초음파 센서 (40kHz)
    • Arduino 모터 쉴드 (L298N 모터 드라이버 기반)
    • 100nF 세라믹 콘덴서 × 4
    • LiPo 배터리 팩
  2. 소프트웨어 개발:
    • Arduino IDE와 MIT App Inventor를 사용하여 로봇의 제어 코드를 작성합니다.
    • 모바일 앱을 통해 로봇의 움직임을 제어할 수 있도록 프로그래밍합니다.
  3. 주차 센서 통합:
    • 주차 센서를 로봇에 통합하고, 장애물을 감지하여 보라색, 녹색, 노란색 및 빨간색으로 시각적 경고를 제공하는 시스템을 구성합니다.
    • 노란색 및 빨간색 경고 시 부저를 활성화하고, 충돌이 임박하면 모터를 정지시키도록 프로그래밍합니다.

안전 기능

이 시스템은 장애물이 감지될 때 색상이 변하고, 노란색과 빨간색 경고 시 부저가 울리며, 빨간색 경고 시 모터가 정지하여 충돌을 방지합니다.

 

1단계: Ardunio에서 코딩하기

#include <AFMotor.h> // Adafruit motor kütüphanesi

 

// Motor tanımlamaları

AF_DCMotor motorFrontRight(3);

AF_DCMotor motorFrontLeft(4);

AF_DCMotor motorBackRight(2);

AF_DCMotor motorBackLeft(1);

 

// mesafe_on sens. ön

int trigPin_on = 33;

int echoPin_on = 31;

 

// mesafe_on sens. arka

int trigPin_arka = 32;

int echoPin_arka = 34;

 

// Buzzer

int buzzerPin = 38;

 

// sağ ön

int redPin_sag_on = A13;

int bluePin_sag_on = A14;

int greenPin_sag_on = A15;

 

// sağ arka

int redPin_sag_arka = A12;

 

// sol arka

int redPin_sol_arka = A6;

 

 

// sol ön

int redPin_sol_on = A9;

int bluePin_sol_on = A8;

int greenPin_sol_on = A7;

 

 

 

 

 

char currentCommand = 's'; // Varsayılan olarak durma komutu

 

long sure_on;

long mesafe_on;

 

long sure_arka;

long mesafe_arka;

 

// Zamanlama için değişkenler

unsigned long previousMillis = 0;

const long ledInterval = 100; // LED'ler için zaman aralığı

 

void setup() {

 Serial.begin(9600); // USB üzerinden iletişim

 Serial1.begin(9600); // Bluetooth modülü ile iletişim

 Serial.println("Bluetooth motor kontrol sistemi başlatıldı.");

 

 // Motor başlangıç ayarları

 motorFrontRight.setSpeed(0);

 motorFrontLeft.setSpeed(0);

 motorBackRight.setSpeed(0);

 motorBackLeft.setSpeed(0);

 

 motorFrontRight.run(RELEASE);

 motorFrontLeft.run(RELEASE);

 motorBackRight.run(RELEASE);

 motorBackLeft.run(RELEASE);

 

 // Sensör ve LED pinlerini çıkış olarak ayarla

 

 //mesafe_on ön

 pinMode(trigPin_on, OUTPUT);

 pinMode(echoPin_on, INPUT);

 

 //mesafe_on arka

 pinMode(trigPin_arka, OUTPUT);

 pinMode(echoPin_arka, INPUT);

 

 pinMode(buzzerPin, OUTPUT);

 //sağ ön çıkış pinleri

 pinMode(redPin_sag_on, OUTPUT);

 pinMode(bluePin_sag_on, OUTPUT);

 pinMode(greenPin_sag_on, OUTPUT);

 //sağ arka

 pinMode(redPin_sag_arka, OUTPUT);

 

 //sol ön

 pinMode(redPin_sol_on, OUTPUT);

 pinMode(bluePin_sol_on, OUTPUT);

 pinMode(greenPin_sol_on, OUTPUT);

 //sol arka

 pinMode(redPin_sol_arka, OUTPUT);

 

}

 

void loop() {

 // Bluetooth üzerinden komut al

 if (Serial1.available()) {

  char command = Serial1.read();

  Serial.print("Gelen komut: ");

  Serial.println(command);

  currentCommand = command; // Gelen komutu kaydet

  kontrolHareketleri(currentCommand); // Motor kontrol fonksiyonunu çağır

 }

 

 // mesafe_on sensörü ölçümünü güncelle

 mesafe_onOlc_on();

 

 // LED ve buzzer kontrolü (zamanlama ile)

 unsigned long currentMillis = millis();

 if (currentMillis - previousMillis >= ledInterval) {

  previousMillis = currentMillis; // Zamanlayıcıyı sıfırla

  ledVeBuzzerKontrol_on(); // LED ve buzzer kontrolü

 }

}

 

// Hareket Fonksiyonları

void kontrolHareketleri(char(komut)) {

 switch (komut) {

  case 'f':

   hareketIleri();

   break;

  case 'x':

   hareketGeri();

   break;

  case 'e':

   hareketSagyukarikay();

   break;

  case 'q':

   hareketSolyukariKay();

   break;

  case 's':

   Dur();

   break;

  case 'd':

   SagaGit();

   break;

  case 'a':

   SolaGit();

   break;

  case 't':

   Don();

   break;

  case 'k':

   SolaDon();

   break;

  case 'u':

   SagaDon();

   break;

  case 'c':

   SagaArkaKay();

   break;

  case 'z':

   SolaArkaKay();

   break;

 

  default:

   Dur();

   break;

 }

}

 

void hareketIleri() {

 motorFrontLeft.setSpeed(200);

 motorFrontRight.setSpeed(200);

 motorBackLeft.setSpeed(200);

 motorBackRight.setSpeed(200);

 

 motorFrontLeft.run(FORWARD);

 motorFrontRight.run(FORWARD);

 motorBackLeft.run(FORWARD);

 motorBackRight.run(FORWARD);

}

 

void hareketGeri() {

 motorFrontLeft.setSpeed(200);

 motorFrontRight.setSpeed(200);

 motorBackLeft.setSpeed(200);

 motorBackRight.setSpeed(200);

 

 motorFrontLeft.run(BACKWARD);

 motorFrontRight.run(BACKWARD);

 motorBackLeft.run(BACKWARD);

 motorBackRight.run(BACKWARD);

}

 

void hareketSolyukariKay() {

 motorFrontLeft.setSpeed(0);

 motorFrontRight.setSpeed(200);

 motorBackLeft.setSpeed(200);

 motorBackRight.setSpeed(0);

 

 motorFrontLeft.run(RELEASE);

 motorFrontRight.run(FORWARD);

 motorBackLeft.run(FORWARD);

 motorBackRight.run(RELEASE);

}

 

void hareketSagyukarikay() {

 motorFrontLeft.setSpeed(200);

 motorFrontRight.setSpeed(0);

 motorBackLeft.setSpeed(0);

 motorBackRight.setSpeed(200);

 

 motorFrontLeft.run(FORWARD);

 motorFrontRight.run(RELEASE);

 motorBackLeft.run(RELEASE);

 motorBackRight.run(FORWARD);

}

 

void Dur() {

 motorFrontLeft.setSpeed(0);

 motorFrontRight.setSpeed(0);

 motorBackLeft.setSpeed(0);

 motorBackRight.setSpeed(0);

 

 motorFrontLeft.run(RELEASE);

 motorFrontRight.run(RELEASE);

 motorBackLeft.run(RELEASE);

 motorBackRight.run(RELEASE);

}

 

void SagaGit() {

 motorFrontLeft.setSpeed(200);

 motorFrontRight.setSpeed(200);

 motorBackLeft.setSpeed(200);

 motorBackRight.setSpeed(200);

 

 motorFrontLeft.run(FORWARD);

 motorFrontRight.run(BACKWARD);

 motorBackLeft.run(BACKWARD);

 motorBackRight.run(FORWARD);

}

 

void SolaGit() {

 motorFrontLeft.setSpeed(200);

 motorFrontRight.setSpeed(200);

 motorBackLeft.setSpeed(200);

 motorBackRight.setSpeed(200);

 

 motorFrontLeft.run(BACKWARD);

 motorFrontRight.run(FORWARD);

 motorBackLeft.run(FORWARD);

 motorBackRight.run(BACKWARD);

}

 

void Don() {

 motorFrontLeft.setSpeed(200);

 motorFrontRight.setSpeed(200);

 motorBackLeft.setSpeed(200);

 motorBackRight.setSpeed(200);

 

 motorFrontLeft.run(FORWARD);

 motorFrontRight.run(BACKWARD);

 motorBackLeft.run(FORWARD);

 motorBackRight.run(BACKWARD);

}

 

void SolaDon() {

 motorFrontLeft.setSpeed(0);

 motorFrontRight.setSpeed(200);

 motorBackLeft.setSpeed(0);

 motorBackRight.setSpeed(200);

 

 motorFrontLeft.run(RELEASE);

 motorFrontRight.run(FORWARD);

 motorBackLeft.run(RELEASE);

 motorBackRight.run(FORWARD);

}

 

void SagaDon() {

 motorFrontLeft.setSpeed(200);

 motorFrontRight.setSpeed(0);

 motorBackLeft.setSpeed(200);

 motorBackRight.setSpeed(0);

 

 motorFrontLeft.run(FORWARD);

 motorFrontRight.run(RELEASE);

 motorBackLeft.run(FORWARD);

 motorBackRight.run(RELEASE);

}

 

void SagaArkaKay() {

 motorFrontLeft.setSpeed(0);

 motorFrontRight.setSpeed(200);

 motorBackLeft.setSpeed(200);

 motorBackRight.setSpeed(0);

 

 motorFrontLeft.run(RELEASE);

 motorFrontRight.run(BACKWARD);

 motorBackLeft.run(BACKWARD);

 motorBackRight.run(RELEASE);

}

 

void SolaArkaKay() {

 motorFrontLeft.setSpeed(200);

 motorFrontRight.setSpeed(0);

 motorBackLeft.setSpeed(0);

 motorBackRight.setSpeed(200);

 

 motorFrontLeft.run(BACKWARD);

 motorFrontRight.run(RELEASE);

 motorBackLeft.run(RELEASE);

 motorBackRight.run(BACKWARD);

}

 

 

// Ön mesafe_on ölçüm fonksiyonu

void mesafe_onOlc_on() {

 digitalWrite(trigPin_on, LOW);

 delayMicroseconds(2);

 digitalWrite(trigPin_on, HIGH);

 delayMicroseconds(10);

 digitalWrite(trigPin_on, LOW);

 

 sure_on = pulseIn(echoPin_on, HIGH, 30000);

 mesafe_on = (sure_on / 2) / 29.1;

}

 

// Arka mesafe_on ölçüm fonksiyonu

void mesafe_onOlc_arka() {

 digitalWrite(trigPin_arka, LOW);

 delayMicroseconds(2);

 digitalWrite(trigPin_arka, HIGH);

 delayMicroseconds(10);

 digitalWrite(trigPin_arka, LOW);

 

 sure_arka = pulseIn(echoPin_arka, HIGH, 30000);

 mesafe_arka = (sure_arka / 2) / 29.1;

}

 

 

 

 

 

 

 

// LED ve buzzer kontrolü

void ledVeBuzzerKontrol_on() {

 if (mesafe_on > 0 && mesafe_on <= 5) {

  motorFrontLeft.setSpeed(0);

  motorFrontRight.setSpeed(0);

  motorBackLeft.setSpeed(0); // DURDUR

  motorBackRight.setSpeed(0);

 

  motorFrontLeft.run(RELEASE);

  motorFrontRight.run(RELEASE);

  motorBackLeft.run(RELEASE);

  motorBackRight.run(RELEASE);

 

  ledKontrol_on(255, 0, 0); // Kırmızı LED

  digitalWrite(buzzerPin, HIGH);

  delay(100);

  ledKontrol_on(0,0,0); //kapat

  digitalWrite(buzzerPin, LOW);

  delay(100);

 

 } else if (mesafe_on > 5 && mesafe_on <= 15) {

  ledKontrol_on(255, 255, 0); // Sarı LED

  digitalWrite(buzzerPin, HIGH);

  delay(200);

  ledKontrol_on(0,0,0); //kapat

  digitalWrite(buzzerPin, LOW);

  delay(200);

 } else if (mesafe_on > 15 && mesafe_on <= 25) {

  ledKontrol_on(0, 255, 0); // Yeşil LED

  digitalWrite(buzzerPin, LOW);

  delay(300);

  ledKontrol_on(0,0,0); //kapat

  digitalWrite(buzzerPin, LOW);

  delay(300);

 } else if (mesafe_on > 25) {

  ledKontrol_on(255, 0, 255); // Mor LED

  digitalWrite(buzzerPin, LOW);

 }

}

 

 

// ARKA LED ve buzzer kontrolü

void ledVeBuzzerKontrol_arka() {

 if (mesafe_arka > 0 && mesafe_arka <= 10) {

 

  digitalWrite(redPin_sag_arka, HIGH);

  digitalWrite(redPin_sol_arka, HIGH); // Kırmızı LED

  digitalWrite(buzzerPin, HIGH);

  delay(100);

  digitalWrite(redPin_sag_arka, LOW);

  digitalWrite(redPin_sol_arka, LOW);

  digitalWrite(buzzerPin, LOW);

  delay(100);

 

 }

}

 

// Ön LED kontrol fonksiyonu

void ledKontrol_on(int red, int green, int blue) {

 analogWrite(redPin_sag_on, red);

 analogWrite(greenPin_sag_on, green);

 analogWrite(bluePin_sag_on, blue);

 

 analogWrite(redPin_sol_on, red);

 analogWrite(redPin_sol_on, green);

 analogWrite(redPin_sol_on, blue);

 

}

 

 

 

Step 2: ThinkerCad

// Pin tanımlamaları

const int trigPin = 7;

const int echoPin = 6;

const int ledPin = 8;

 

void setup() {

pinMode(trigPin, OUTPUT);

pinMode(echoPin, INPUT);

pinMode(ledPin, OUTPUT);

Serial.begin(9600); // Seri haberleşme başlat

}

 

void loop() {

// Mesafe ölçümü

digitalWrite(trigPin, LOW);

delayMicroseconds(2);

digitalWrite(trigPin, HIGH);

delayMicroseconds(10);

digitalWrite(trigPin, LOW);

 

long duration = pulseIn(echoPin, HIGH);

int distance = duration * 0.034 / 2; // Mesafeyi cm cinsinden hesapla

 

// Mesafe bilgisine göre yanıp sönme hızını ayarla

int delayTime;

if (distance <= 10) { // Çok yakın

delayTime = 100; // Hızlı yanıp sönme

} else if (distance <= 30) { // Orta mesafe

delayTime = 300; // Orta hız

} else { // Uzak

delayTime = 700; // Yavaş yanıp sönme

}

 

// LED'i yanıp söndür

digitalWrite(ledPin, HIGH);

delay(delayTime);

digitalWrite(ledPin, LOW);

delay(delayTime);

 

// Mesafeyi seri monitöre yazdır

Serial.print("Distance: ");

Serial.print(distance);

Serial.println(" cm");

}

 

Step 3: MIT App Inventor

결론

MKBUMBLE 프로젝트는 메카넘 휠과 주차 센서를 활용한 다재다능한 로봇 자동차 개발을 목표로 합니다. 정밀한 제어와 안전성을 겸비한 이 로봇은 다양한 환경에서 유용하게 활용될 수 있습니다. 프로젝트의 진행 상황과 업데이트를 계속 공유할 예정이니 많은 관심 부탁드립니다.

이 블로그 포스트가 여러분의 프로젝트에 도움이 되길 바랍니다. 다양한 가능성을 탐구하며 메카넘 로봇의 세계를 즐겨보세요! 🚀🤖

728x90
반응형