2017년 7월 30일 일요일

로봇 만들기 - 5편 (아두이노)

2주에걸쳐 3D 프린터와 씨름을 하면서 모델 프린팅은 마무리 되어 가고 있다.
마지막으로 팔 2개와 얼굴만 프린팅하면 조립을 완성할 수 있으니 하루만 더 기다리면 되지 않을까..

지금까지 찍어둔 부품으로 할 수 있는 것들을 미리 해 보기로 맘 먹고 'OTIS 설명서'를 살펴 보았다.

그 중에 하단 부품과 모터 / 바퀴를 이렇게 결합하라고 되어있다.
메뉴얼에서 하라고 시키는 모습
M3 스크류 와 너트는 알리에서 주문을 한 것이 도착 하려면 언제 올지 기약이 없어서 일단 다이소에서 파는 케이블 타이로 대체를 했다.
M3 스크류가 없어서 케이블 타이로 대체한 모습
요런 모습. 당장 UNO 가 없어서 모터 쉴드로 테스트 해 봤는데, 저럴거면 뭐하러 L298N 을 또 달겠는가. 그래서 비싼 모터 쉴드를 빼고 아두이노 나노로 바꿔 달았다. 요렇게.
아도위노 나노로 바꾸고 단촐해진 모습

케이블타이가 좀 없어 보이긴 하지만, 그래도 이만한 대체제가 없다.

그럼 배선을 잠깐 살펴 볼까.
L298N 모터 드라이버
(이미지 출처 : 여기)
아두이노로 모터를 갖고 놀려면 이 모터 드라이버가 있어야 한다. 잘 모를 때는 고가의 모터 드라이버 쉴드를 구매하지만, 아두이노에 익숙해지면 드라이버 모듈을 따로 사는게 훨~~~~씬 저렴하다는 것을 알게 된다. 나역시 아두이노를 몰랐을 때 맨처음 구매한 아두이노가 모터 쉴드 였으니...

L298N 을 사용하는 방법은, 2개의 DC 모터를 사용할 때 사진의 번호를 기준으로 설명하면,
1 : 1번 모터 +
2 : 1번 모터 -
13 : 2번 모터 +
14 : 2번 모터 -
3 : 12V 이상의 전원을 사용할때 점퍼를 제거 한다. (9V 를 사용할 것이기 때문에 그냥 둔다)
4 : 9V 배터리 +
5 : 9V 배터리 - , 아두이노 GND
6 : 아두이노 VIN
7 : 점퍼를 제거하고 아두이노 D9
8 : 아두이노 D2
9 : 아두이노 D3
10 : 아두이노 D4
11 : 아두이노 D5
12 :  점퍼를 제거하고 아두이노 D10

이렇게 연결하면 된다.

동작 원리는 7 / 12 (아두이노의 D9 / D10) 을 통해 모터의 속도를 설정 할 수 있다.
설정 값은 0 에서 255 사이의 숫자인데 높을 수록 빠르다.

8 / 9, 10 / 11 (아두이노 D2 / D3, D4 / D5) 는 모터의 회전 방향을 설정 할때 쓰인다.
예를 들어 8 번은 High, 9 번을 Low 로 하면 전진, 그 반대로 하면 후진을 하게 된다.

우선 배선이 제대로 되었는지, 정상 동작을 하는지 예제 코드를 업로드 해서 돌려 본다.

// connect motor controller pins to Arduino digital pins
// motor one
int enA = 9;
int in1 = 2;
int in2 = 3;
// motor two
int enB = 10;
int in3 = 4;
int in4 = 5;
void setup()
{
  // set all the motor control pins to outputs
  pinMode(enA, OUTPUT);
  pinMode(enB, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
}
void demoOne()
{
  // this function will run the motors in both directions at a fixed speed
  // turn on motor A
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  // set speed to 200 out of possible range 0~255
  analogWrite(enA, 200);
  // turn on motor B
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  // set speed to 200 out of possible range 0~255
  analogWrite(enB, 200);
  delay(2000);
  // now change motor directions
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);  
  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH); 
  delay(2000);
  // now turn off motors
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);  
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
}
void demoTwo()
{
  // this function will run the motors across the range of possible speeds
  // note that maximum speed is determined by the motor itself and the operating voltage
  // the PWM values sent by analogWrite() are fractions of the maximum speed possible 
  // by your hardware
  // turn on motors
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);  
  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH); 
  // accelerate from zero to maximum speed
  for (int i = 0; i < 256; i++)
  {
    analogWrite(enA, i);
    analogWrite(enB, i);
    delay(20);
  } 
  // decelerate from maximum speed to zero
  for (int i = 255; i >= 0; --i)
  {
    analogWrite(enA, i);
    analogWrite(enB, i);
    delay(20);
  } 
  // now turn off motors
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);  
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);  
}
void loop()
{
  demoOne();
  delay(1000);
  demoTwo();
  delay(1000);
}

팁이라면 테스트할 때 바퀴가 닿지 않게 박스 같은 것 위에 올려두면 고정된 자리에서 바퀴 회전만 확인 할 수 있다.

여기까지 하고 바닥으로 뒤집어 보면,
메뉴얼에 있는 바닥 사진
메뉴얼에 있는 이 사진처럼 하려면 저 볼 구슬이 있어야 하는데, 이것을 구할 방법이 없다.
그리고 사진에는 1.5V 2개 배터리 팩을 붙여놨는데.. 잘못 된것 같다. 모터를 구동하려면 적어도 9V 이상의 배터리가 있어야 하는데 3V 로는 움직이지 않기 때문이다.
구슬 대신에 대체한 볼캐스터
볼캐스터가 그럴싸 하다. 저기에 9V 배터리 팩도 붙여 주면 되겠지.

여기까지 해 주면 구동부 가 완성 되었다.
Intel Euclid 와 아두이노 Nano 를 USB 로 연결해 주면 Euclid 에서 좌/우 모터를 조정해 주는 방식으로 동작하게 될 것 같다.

추가로 눈을 표시해 주는 구성도 있는데,
눈을 붙여주기 전
8x8 LED 매트릭스를 붙여주면 눈이 된다.
눈 역할을 할 8x8 LED 매트릭스
LED 를 구동하기 위해 4개의 아두이노 PIN 이 필요한데, 메뉴얼에는 Nano 하나 더 달라고 되어 있지만, 나는 그냥 하나로 하기로 했다. 그런데 굳이 눈을 달아야 하나 싶기도 하고...
당장에는 표정을 control 해 주는 코드는 못 찾겠다. 일단 달아만 두자.

이렇게 해서 아두이노와 관련된 모든 작업이 끝났다. 이제 3D 프린팅 끝나기만 기다리면 될 것 같다.

댓글 없음: