안녕하세요, 여러분! 오늘은 메카넘 바퀴, Arduino Mega 및 TT 모터를 사용하여 개발한 멋진 로봇 자동차 프로젝트를 소개하려고 합니다. 메카넘 로봇은 12가지 뚜렷한 이동 기능을 활용하여 정밀하고 다재다능한 이동을 가능하게 합니다. 뿐만 아니라 MIT App Inventor를 사용하여 로봇의 움직임을 제어할 수 있는 모바일 애플리케이션을 개발해 사용자 친화적인 작동을 보장합니다. 또한, 안전한 주행을 위한 주차 센서 시스템도 통합했습니다.
프로젝트 개요
이 프로젝트는 메카넘 휠을 사용한 로봇 자동차의 개발 과정과 특징을 다루고 있습니다. 로봇은 정밀한 제어를 위해 커스텀 컨트롤 코드를 사용하며, MIT App Inventor로 개발한 모바일 앱을 통해 쉽게 조작할 수 있습니다. 또한, 주차 센서를 통해 장애물을 감지하고 경고하여 안전한 주행을 돕습니다.
주요 기능
- 전방향 이동성: 메카넘 휠을 통해 12가지 이동 기능을 제공합니다.
- 정밀 제어: 커스텀 컨트롤 코드와 모바일 애플리케이션을 사용하여 로봇의 움직임을 정밀하게 제어합니다.
- 안전 주행: 주차 센서 시스템을 통해 장애물을 감지하고 경고하여 안전성을 높였습니다.
공급
프로젝트 단계
- 하드웨어 구성:
- 메카넘 휠 × 4
- Arduino Mega
- TT 모터 또는 옐로우 기어드 모터 × 4
- 버저
- 220Ω 저항기 × 3
- RGB 다이오드 LED
- 점퍼 케이블
- HC-05 블루투스 모듈
- 작은 브레드보드
- 초음파 센서 (40kHz)
- Arduino 모터 쉴드 (L298N 모터 드라이버 기반)
- 100nF 세라믹 콘덴서 × 4
- LiPo 배터리 팩
- 소프트웨어 개발:
- Arduino IDE와 MIT App Inventor를 사용하여 로봇의 제어 코드를 작성합니다.
- 모바일 앱을 통해 로봇의 움직임을 제어할 수 있도록 프로그래밍합니다.
- 주차 센서 통합:
- 주차 센서를 로봇에 통합하고, 장애물을 감지하여 보라색, 녹색, 노란색 및 빨간색으로 시각적 경고를 제공하는 시스템을 구성합니다.
- 노란색 및 빨간색 경고 시 부저를 활성화하고, 충돌이 임박하면 모터를 정지시키도록 프로그래밍합니다.
안전 기능
이 시스템은 장애물이 감지될 때 색상이 변하고, 노란색과 빨간색 경고 시 부저가 울리며, 빨간색 경고 시 모터가 정지하여 충돌을 방지합니다.
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);
}
Attachments
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
Attachments
결론
MKBUMBLE 프로젝트는 메카넘 휠과 주차 센서를 활용한 다재다능한 로봇 자동차 개발을 목표로 합니다. 정밀한 제어와 안전성을 겸비한 이 로봇은 다양한 환경에서 유용하게 활용될 수 있습니다. 프로젝트의 진행 상황과 업데이트를 계속 공유할 예정이니 많은 관심 부탁드립니다.
이 블로그 포스트가 여러분의 프로젝트에 도움이 되길 바랍니다. 다양한 가능성을 탐구하며 메카넘 로봇의 세계를 즐겨보세요! 🚀🤖
'메카넘 휠 로봇' 카테고리의 다른 글
메카넘 로봇 - MKBUMBLE: 다재다능한 전방향 이동 로봇 프로젝트 🚀 (1) | 2024.12.12 |
---|---|
마이크로 컨트롤러 V의 555 타이머 - 모터 속도 컨트롤러 대결 (4) | 2024.09.30 |
메카넘 휠 설정 및 동작 (0) | 2022.12.17 |
메카넘 휠 로봇 - 블루투스 제어(mecanum wheel robot) (0) | 2022.12.12 |