산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

아두이노 & 블루투스로 레고 파워 펑션 마스터하기

부품 및 소모품

아두이노 우노 (Arduino UNO) ×1
텍사스 인스트루먼트 L293D 듀얼 H-브리지 모터 드라이버 ×1
브레드보드 (일반) ×1
9V 배럴 잭 커넥터 ×1
레고 파워 펑션 연장선 (품번: 8886) ×3
HC-05 블루투스 모듈 ×1

프로젝트 소개

전기 모터와 서보 모터가 있는 멋진 레고 파워 펑션 모델이 있으신가요? 이 튜토리얼에서는 최소한의 전자 부품으로 아두이노로 레고 모델을 제어하는 방법을 보여드립니다. 초보자도 이해하기 쉽게 회로와 프로그래밍을 자세히 설명합니다. 레고 모델은 직접 만드셔야 합니다(아들이 있다면 아들이 맡아주겠죠).

MIT 앱 인벤터로 직접 안드로이드 리모컨 앱을 만드는 법도 배웁니다. 곧 여러분의 뒷마당에 레고 화성 탐사선이 생길 거예요!

이건 제 첫 아두이노 프로젝트입니다. 아들이 레고 테크닉 4x4 크롤러(9398)를 가지고 있는데, 레고 파워 펑션으로 서보 모터 1개(조향), L-모터 2개(주행)를 사용합니다. 아들이 차를 빌려줬어요(모터 케이블 자르지 않는 조건으로). 완성된 프로토타입 테스트 영상입니다.

파워 펑션 배선 이해하기

먼저 레고 파워 펑션 연장선(품번 8886)을 구입하세요. 그리고 잘라버리세요(진심). 한쪽 끝에 레고 브릭, 다른 쪽에 핀이 있는 '브레이크아웃' 케이블을 만듭니다. 핀은 납땜하세요. 배선 설명:

아두이노 & 블루투스로 레고 파워 펑션 마스터하기

TechnicRobot의 상세 설명 영상 참고. (경고: 본인 책임 하에 진행. 파손 시 책임지지 않음!)

L293D 칩으로 레고 모터 제어하기

DC 모터는 가변 속도 제어, 레고 서보는 위치 제어가 필요합니다. 이는 PWM(펄스 폭 변조)로 달성합니다. 아두이노에서 analogWrite(pin, dutyCycle)로 간단하게 사용 가능 (dutyCycle: 0~255). PWM 핀은 ~ 표시가 있습니다.

아두이노 출력 핀은 5V, 최대 30mA지만 레고 모터는 9V, 100mA 이상 필요. 중간에 '스위칭 소자' 필요. 양방향 회전도 필요. 이 기능을 H-브리지가 해결합니다. L293D는 한 칩에 H-브리지 2개가 있어, 레고 모터 2개를 병렬로 한쪽에, 레고 서보를 다른 쪽에 연결 가능. (모터 2개를 독립 제어하려면 L293D 하나 더 필요). 레고 서보는 GND와 레고 +9V도 연결 필요.

칩은 레고 +9V와 아두이노 +5V를 완전히 분리합니다. 절대 연결하지 마세요! 손상됩니다! 하지만 모든 그라운드 라인은 L293D 그라운드 핀과 함께 연결해야 합니다.

아두이노 & 블루투스로 레고 파워 펑션 마스터하기

아두이노 핀 사용:

전역 상수로 핀 정의 및 제어 변수 선언:

// 모터 제어 디지털 출력 핀 상수
const int controlPin1A = 2;
const int controlPin2A = 5;
const int ENablePin = 9;

// 서보 제어 디지털 출력 핀 상수
const int controlPin3A = 6;
const int controlPin4A = 8;
const int servoENablePin = 3;

// 모터 제어 전역 변수
int motorSpeed = 0;        // 모터 속도 0..255
int motorDirection = 1;    // 전진(1) 또는 후진(0)

// 서보 제어 전역 변수
int steering = 0;          // 서보 위치 0..255
int steeringDirection = 0; // 좌(0), 우(1)

setup()에서 핀을 OUTPUT으로 설정하고 0V로 초기화:

void setup() {
  pinMode(controlPin1A, OUTPUT); // 1A
  pinMode(controlPin2A, OUTPUT); // 2A
  pinMode(ENablePin, OUTPUT);    // EN1,2
  pinMode(controlPin3A, OUTPUT); // 3A
  pinMode(controlPin4A, OUTPUT); // 4A
  pinMode(servoENablePin, OUTPUT); // EN3,4
  digitalWrite(ENablePin, LOW);     // 모터 끄기
  digitalWrite(servoENablePin, LOW); // 조향 중앙
}

L293D로 모터 회전 방향 제어 로직 (High=5V, Low=0V):

전역 변수를 읽어 모터/서보 제어하는 서브루틴:

void SetMotorControl() {
  if (motorDirection == 1) { // 전진
    digitalWrite(controlPin1A, HIGH);
    digitalWrite(controlPin2A, LOW);
  } else { // 후진
    digitalWrite(controlPin1A, LOW);
    digitalWrite(controlPin2A, HIGH);
  }
  analogWrite(ENablePin, motorSpeed); // 속도
  
  if (steeringDirection == 0) { // 좌
    digitalWrite(controlPin3A, HIGH);
    digitalWrite(controlPin4A, LOW);
  } else { // 우
    digitalWrite(controlPin3A, LOW);
    digitalWrite(controlPin4A, HIGH);
  }
  analogWrite(servoENablePin, steering); // 서보 위치
}

조이스틱이 있는 심플 RC 안드로이드 앱

MIT 앱 인벤터 2로 안드로이드 앱 제작. (완성 앱 테스트 원하면: 구글 플레이 스토어 링크)

MIT 앱 인벤터는 구글 마크 프리드먼과 MIT 할 아벨슨 교수가 공동 개발한 초보자용 프로그래밍/앱 제작 도구. MIT 모바일 러닝 센터에서 웹 서비스로 운영.

  1. 안드로이드 폰에 MIT AI2 Companion 앱 설치 (구글 플레이)
  2. 컴퓨터에서 파이어폭스/크롬으로 내 RC 앱 링크 열기 (IE 미지원). 지메일로 로그인 후 계정 생성하여 소스 코드 확인
  3. 폰에서 컴패니언 앱 실행하면 브라우저에서 소스 코드 보고 수정 후 즉시 폰에서 테스트 가능

앱 디자이너 뷰: 하단 주황색 패드에 파란색 조이스틱 볼.

블록 뷰에서 프로그램 확인. 핵심은 손가락으로 조이스틱 볼을 터치/드래그할 때 동작을 추적하는 when-블록.

손가락 위치는 currentX, currentY 변수에 저장되고 steering, speed 값 계산에 사용 (범위: -100~0~+100). 패드 밖이면 ±100으로 제한, 안이면 steering/speed 계산. 명령 문자열 생성:

"RC,steering,speed,\n"

'RC'로 시작(향후 명령 확장 대비), 콤마로 구분, steering/speed 값 전송. 줄바꿈 문자('\n')로 명령 완료 신호. 블루투스로 아두이노 전송. 화면에도 문자열 표시.

블루투스 명령을 아두이노로 읽기

HC-05 블루투스 모듈 연결 필요. 모듈 핀 확인:

아두이노 & 블루투스로 레고 파워 펑션 마스터하기

제 모듈은 6핀. VCC(양극 전원), GND(그라운드), TXD, RXD 4핀만 사용. 6V까지 허용하므로 아두이노 5V 핀에 연결 가능. TXD/RXD는 크로스 연결: TXD → 아두이노 RXD(핀 0), RXD → 아두이노 TXD(핀 1).

주의: 'LEVEL: 3.3V' 표기 → RXD를 5V 아두이노 TXD(핀 1)에 직접 연결 불가. 1kΩ 저항 3개로 전압 분배기 구성해 5V의 2/3(≈3.3V) 출력 (회로도 참조). 반면 TXD 3.3V 신호는 아두이노 RXD에 직접 연결 가능 (아두이노는 3.3V를 HIGH로 인식).

핀 0, 1은 USB 포트와 공유되므로 USB로 프로그램 업로드 시 RXD/TXD 케이블을 분리해야 함. 안 그러면 업로드 안 됨.

HC-05와 안드로이드 기기 페어링: 블루투스 켜기 → 앱 시작 → 'Bluetooth connect' → 폰 가시성 ON → 'HC-05' 검색 → 선택 → 코드 '1234' 입력 → 조이스틱 화면에서 'connected' 녹색 표시 확인.

코드 분석:

#define INPUT_SIZE 30
void loop() {
  char input[INPUT_SIZE + 1]; // C-string with null-termination
  byte size = Serial.readBytesUntil('\n', input, INPUT_SIZE);
  input[size] = 0; // null-termination
  
  // 형식: "RC,steering,speed,\n\0"
  char* command = strtok(input, ","); // "RC" (현재 무시)
  char* RCsteering = strtok(NULL, ","); // -100(좌)..0..100(우)
  char* RCspeed = strtok(NULL, ",");    // -100(후진)..0..100(전진)
  
  int iRCsteering = atoi(RCsteering);
  int iRCspeed = atoi(RCspeed);
  // 이 후 SetMotorControl() 호출 부분 생략
}

안드로이드 앱에서 보낸 문자열을 줄바꿈('\n')까지 읽어 C-string으로 저장. strtok()로 콤마 기준 분할. atoi()로 정수 변환. 값에 2.55 곱해 0~255 범위로 변환 후 SetMotorControl() 전달.

나머지 코드는 코드 섹션 참조. 회로 구성 후 레고 모델 원격 제어 테스트!

다음 단계는?

아두이노로 레고 모델 제어가 가능해졌으니 로봇 플랫폼으로 확장해보세요: 초음파 센서 추가, 장애물 회피 로직 프로그래밍, 자율 주행 화성 탐사선 만들기. 또는 리모컨 명령/모델 기능 추가. 하지만 먼저 블루투스 통신 범위 벗어나면 아두이노가 감지하고 모델을 정지시키는 방법 찾아보세요. 해결책 공유해주세요!

브레드보드와 헐거운 케이블은 움직이는 모델에 부적합. 에이다프루트 모터 실드(대형 터미널 블록)로 배선 교체 및 재프로그래밍 권장. 디지털 핀 확보로 센서 입력용으로 활용 가능. 센서 실드도 고려해보세요.

여러분의 멋진 프로젝트 소식 기대합니다!

코드

아두이노

/* 레고 파워펑션 자동차 블루투스 제어
   아두이노 우노가 모터와 서보 제어
   MIT 앱 인벤터 2로 개발한 안드로이드 앱으로 원격 제어
   회로:
   * 시리얼 통신 (우노 핀 0,1 사용) 블루투스 모듈 연결 (USB 업로드 시 분리 필요)
   * L293D + 모터 (우노 디지털 핀 2,5,9)
   * L293D + 서보 (우노 디지털 핀 6,8,3)
*/
#include 
#include  // strtok 함수 포함

#define INPUT_SIZE 30

const int controlPin1A = 2;
const int controlPin2A = 5;
const int ENablePin = 9;

const int controlPin3A = 6;
const int controlPin4A = 8;
const int servoENablePin = 3;

int motorSpeed = 0;
int motorDirection = 1;
int steering = 0;
int steeringDirection = 0;

void setup() {
  Serial.begin(9600);
  Serial.setTimeout(1000);
  
  pinMode(controlPin1A, OUTPUT);
  pinMode(controlPin2A, OUTPUT);
  pinMode(ENablePin, OUTPUT);
  pinMode(controlPin3A, OUTPUT);
  pinMode(controlPin4A, OUTPUT);
  pinMode(servoENablePin, OUTPUT);
  digitalWrite(ENablePin, LOW);
  digitalWrite(servoENablePin, LOW);
}

void loop() {
  char input[INPUT_SIZE + 1];
  byte size = Serial.readBytesUntil('\n', input, INPUT_SIZE);
  input[size] = 0;
  
  char* command = strtok(input, ",");
  char* RCsteering = strtok(NULL, ",");
  char* RCspeed = strtok(NULL, ",");
  
  int iRCsteering = atoi(RCsteering);
  int iRCspeed = atoi(RCspeed);
  
  if (iRCsteering > 0) steeringDirection = 1;
  else steeringDirection = 0;
  steering = int(2.55 * abs(iRCsteering));
  
  if (iRCspeed > 0) motorDirection = 1;
  else motorDirection = 0;
  motorSpeed = int(2.55 * abs(iRCspeed));
  
  SetMotorControl();
}

void SetMotorControl() {
  if (motorDirection == 1) {
    digitalWrite(controlPin1A, HIGH);
    digitalWrite(controlPin2A, LOW);
  } else {
    digitalWrite(controlPin1A, LOW);
    digitalWrite(controlPin2A, HIGH);
  }
  analogWrite(ENablePin, motorSpeed);
  
  if (steeringDirection == 0) {
    digitalWrite(controlPin3A, HIGH);
    digitalWrite(controlPin4A, LOW);
  } else {
    digitalWrite(controlPin3A, LOW);
    digitalWrite(controlPin4A, HIGH);
  }
  analogWrite(servoENablePin, steering);
}

GitHub 레고-카-아두이노: 아두이노 소스코드, 프리칭 다이어그램, MIT 앱 인벤터 업로드용 안드로이드 앱 소스코드 포함

회로도

GitHub 레고-카-아두이노: 아두이노 소스코드, 프리칭 다이어그램, MIT 앱 인벤터 업로드용 안드로이드 앱 소스코드 포함

제조공정

  1. SaaS 마스터하기: 클라우드 활용하면서 통제권 유지 전략
  2. 자연상수 e를 밑으로 하는 지수함수 미분하기
  3. 지수 거듭제곱 함수의 역도함수 구하기
  4. 동력 전달 부품 신뢰성 높이기: 광산·제조·산업 현장을 위한 검증된 전략
  5. 전기 제어 패널: 안전성과 ROI를 위한 설계 필수 요소
  6. 풍력 발전: 공기 움직임을 청정 전기로 변환하기
  7. 영국 제조업체, 자동화 프로젝트 설계 오류 수정에 연 250만 파운드 지출
  8. 안정적인 전력 및 HVAC 렌탈: 완벽한 기후 제어를 위한 솔루션
  9. 프로세스 제어 시스템 진단 및 수리를 위한 8가지 검증된 단계
  10. 웹 핸들링 텐션 제어 마스터하기: 필수 구성 요소 완벽 해설