로봇 팔 코드는 HCPCA9685 라이브러리(서보 드라이버용)를 사용합니다. 이렇게 여러 서보 모터를 아두이노 하나로 제어할 수 있습니다. 코드에서 라이브러리를 추가하고 서보 변수를 선언합니다.
다음 변수들은 이전/증분 값을 찾고 서보의 현재 위치를 추적하는 데 사용됩니다.
/* HCPCA9685 라이브러리 포함 */
#include "HCPCA9685.h"
/* 장치/모듈의 I2C 슬레이브 주소. HCMODU0097의 기본 I2C 주소는 0x40 */
#define I2CAdd 0x40
/* 라이브러리 인스턴스 생성 */
HCPCA9685 HCPCA9685(I2CAdd);
// 모터 초기 주차 위치
const int servo_joint_L_parking_pos = 60;
// 로봇 서보 민감도 - 간격
int servo_joint_L_pos_increment = 20;
// 모터 위치 현재 값 추적
int servo_joint_L_parking_pos_i = servo_joint_L_parking_pos;
// 서보 모터 최소/최대 각도
int servo_joint_L_min_pos = 10;
int servo_joint_L_max_pos = 180;
블루투스 통신 시작을 위해 시리얼 포트를 보드레이트 4800으로 초기화:
Serial.begin(4800); // 블루투스 모듈 기본 통신 속도 초기화
loop() 섹션에서는 로봇 장갑에서 데이터가 오는지 계속 확인합니다. 참이면 수신 데이터를 'state' 변수에 저장하고, 문자에 따라 모터를 움직입니다.
다음 섹션은 코드 개요입니다:
로봇 팔 코드는 인간 움직임을 시뮬레이션하기 위해 협력하는 서보 모터들의 연속으로 볼 수 있습니다. 코드는 블루투스 값에 기반해 서보 드라이버가 서보를 구동하는 같은 패턴입니다.
// 서보 드라이버 정의. 0x40 주소는 기본 I2C 주소.
#define I2CAdd 0x40
int response_time = 5; // 로봇 장갑에서 값 수신 간격
// 시리얼 포트에서 데이터 오는지 확인
if (Serial.available() > 0) {
state = Serial.read(); // 시리얼 포트에서 데이터 읽기
Serial.print(state); // 전송된 값 출력
// 모터 기능 코드 블록
}
현재 'state' 값에 따라 서보 드라이버가 해당 모터에 신호를 보냅니다.
예: 손가락을 구부리면 로봇 장갑이 'f' 값을 블루투스로 전송 → 로봇 팔이 이 데이터 읽고 해당 서보 모터 회전 함수 트리거. 이 과정이 무한 루프로 반복됩니다.
if (Serial.available() > 0) {
state = Serial.read();
Serial.print(state);
// 모터 명명법은 기사/튜토리얼 참조
// (베이스 회전) 스테퍼 모터 왼쪽으로
if (state == 'S') {
baseRotateLeft();
delay(response_time);
}
}
참고: 모터가 최대 각도를 초과해 기어가 손상되는 것을 방지하는 하드 스톱 구현.
HCPCA9685.Servo(0, servo_joint_L_parking_pos_i); // 채널 0 서보 모터를 원하는 각도로 구동
// 클로 모터 아래쪽으로
if (state == 'f') {
if (servo_joint_3_parking_pos_i < servo_joint_3_max_pos) {
HCPCA9685.Servo(4, servo_joint_3_parking_pos_i);
delay(response_time);
Serial.println(servo_joint_3_parking_pos_i);
servo_joint_3_parking_pos_i = servo_joint_3_parking_pos_i + servo_joint_3_pos_increment;
}
}
void baseRotateLeft() {
digitalWrite(stepPin, LOW); // HIGH, LOW 기반 방향 회전
delayMicroseconds(stepDelay); // 스테퍼 모터 속도 변경
}