본문 바로가기
하드웨어/아두이노

[아두이노] i2c 기반 모터쉴드 사용법(Wemos D1 mini motor shield)

by 만들오 2021. 4. 7.

목  차

1. 서론

2. 본론

2.1. Wemos D1 mini motor shield 특징

2.2. 사용 전 세팅

  2.2.1. i2c address 설정

  2.2.2. STBY, RST 모드 설정

  2.2.3. 모터 드라이버 연동

  2.2.4. 제공된 라이브러리 사용

  2.2.5. 해결 방법

3. 결론


Wemos D1 Mini motor shield

1. 서론

  Wemos D1 mini motor shield의 특징을 정리했습니다. 모터 드라이버를 2개 이상 연결한 경우, 제공된 라이브러리로 사용이 불가능 했고, 해결 방법을 정리했습니다.


2. 본론

2.1. Wemos D1 mini motor shield 특징

  • i2c 통신으로 제어
  • 4개의 address 할당 가능
  • 드라이버 당 2개의 DC모터 제어 가능
  • 저렴하다 (2,500원에 구입)
  • 크기가 작다
  • Wemos D1 mini 보드에 적층할 수 있지만, 굳이 적층하지 않아도 된다.

2개의 GPIO 핀(SCL, SDA)으로 총 8개의 DC모터를 제어할 수 있으며, 크기가 작고 저렴하니 제 프로젝트에는 최선의 선택입니다.

 

2.2. 사용 전 세팅

  제가 구매한 제품은 핀이 납땜되지 않은 형태입니다. 또한, i2c address 설정 등을 위해 납땜이 꼭 필요합니다.

 

2.2.1. i2c address 설정

  총 4개의 i2c address로 설정할 수 있고, 다음 표를 참고하시기 바랍니다. 저는 2개의 모터 드라이버를 연결하여 사용하기 위해 1개는 0x30(좌측 사진), 1개는 0x2F(우측 사진)로 설정했습니다.

AD1 AD0 Address 비고
- - 0x2D AD0, AD1 모두 납땜
- x 0x2E AD1 납땜
x - 0x2F AD0 납땜
x x 0x30(default) 아무것도 납땜하지 않음

i2c address 설정 (좌)0x30 / (우)0x2F

2.2.2. STBY, RST 모드 설정

  STBY와 RST 모드는 보드와 연동해 사용할지 여부를 결정합니다. 보드와 연동해 사용하기 때문에 두개의 드라이버 모두 다음 그림과 같이 설정했습니다.

 

2.2.3. 모터 드라이버 연동

  두개의 모터 드라이버를 적층하듯 쌓아 올려주고, 두 보드가 같은 전원을 사용하도록 연결했습니다.

Wemos D1 Mini motor shield 적층 사용

2.2.4. 제공된 라이브러리 사용

  아두이노 IDE에 라이브러리를 설치하고 사용해 보았습니다. 1개의 모터 드라이버 사용은 잘 되었지만, 2개를 적층한 경우 작동하지 않았습니다.

 

2.2.5. 해결 방법

  라이브러리를 열어보니 생각보다 코드가 길지 않아서, 라이브러리 없이 i2c 통신으로 제어하는데 성공했습니다.

#include <Wire.h>
#define _MOTOR_A 0
#define _MOTOR_B 1
#define _SHORT_BRAKE 0
#define _CCW  1
#define _CW   2
#define _STOP 3
#define _STANDBY 4

void init_channel(uint8_t address, uint32_t freq) {
  Wire.begin();
  Wire.beginTransmission(address);
  Wire.write(((byte)(freq >> 16)) & (byte)0x0f);
  Wire.write((byte)(freq >> 16));
  Wire.write((byte)(freq >> 8));
  Wire.write((byte)freq);
  Wire.endTransmission();
  delay(100);
}

void set_motor(uint8_t address, uint8_t motor, uint8_t dir, uint8_t spd) {
  Wire.beginTransmission(address);
  Wire.write(motor | (byte)0x10);
  Wire.write(dir);
  uint16_t _pwm_val = spd * 100;
  _pwm_val = constrain(_pwm_val, 0, 10000);
  Wire.write((byte)(_pwm_val >> 8));
  Wire.write((byte)_pwm_val);
  Wire.endTransmission();     // stop transmitting
}

void setup() {
  Wire.begin();
  init_channel(0x30, 1000);
  init_channel(0x2F, 1000);
}

void loop() {
  for (int i = 50; i <=100; i++) {
    set_motor(0x30, _MOTOR_A, _CW, i);
    set_motor(0x30, _MOTOR_B, _CW, i);
    set_motor(0x2F, _MOTOR_A, _CW, i);
    set_motor(0x2F, _MOTOR_B, _CW, i);
    delay(50);
  }
  
  set_motor(0x30, _MOTOR_A, _STOP, 0);
  set_motor(0x30, _MOTOR_B, _STOP, 0);
  set_motor(0x2F, _MOTOR_A, _STOP, 0);
  set_motor(0x2F, _MOTOR_B, _STOP, 0);
  delay(1000);
  
    for (int i = 50; i <=100; i++) {
    set_motor(0x30, _MOTOR_A, _CCW, i);
    set_motor(0x30, _MOTOR_B, _CCW, i);
    set_motor(0x2F, _MOTOR_A, _CCW, i);
    set_motor(0x2F, _MOTOR_B, _CCW, i);
    delay(50);
  }
  set_motor(0x30, _MOTOR_A, _STOP, 0);
  set_motor(0x30, _MOTOR_B, _STOP, 0);
  set_motor(0x2F, _MOTOR_A, _STOP, 0);
  set_motor(0x2F, _MOTOR_B, _STOP, 0);
  delay(1000);
}

 

3. 결론

  Wemos D1 Mini용 Motor shield를 적층했고, i2c 통신만으로 제어하는데 성공했습니다. 2개의 GPIO 핀으로 최대 8개의 모터를 제어할 수 있고, i2c를 지원하는 보드라면 종류에 상관없이 사용할 수 있습니다.

DC모터를 사용하는 프로젝트에 적극 추천합니다.

[끝].

728x90

댓글