flexSensor에 해당하는 글 1

[아두이노] 구부림(flex) 센서와 관절 제어

IOT/아두이노|2019. 7. 26. 09:00

[아두이노] 구부림(flex) 센서와 관절 제어



지난 시간까지 주변 사물을 관찰하는 실험을 하였는데 문득 손을 보고 손의 움직임을 관찰하다가 한번 아두이노 시각으로 표현하고 싶은더군요. 그래서 손가락 관절을 제어하는 실험에 대해 상상하다가 예전에 공부했던 손가락의 움직임을 감지 할 수 있는 센서가 떠올랐네요. 실제 구부림 센서가 없어 실제로 실험은 못하지만 구부림 센서을 대해 간단히 이야기만 하고 가상시뮬레이터로 구부림 센서를 대신 할 부품으로 가변저항을 이용하여 가상시뮬레이터에서 손가락 관절 제어 실험을 해 보겠습니다.

1. 구부림(flex) 센서


구부림 센서는 구부림의 정도에 따라서 저항값이 달라집니다. 이 값을 통해서 구부림의 각도를 계산해 낼 수 있습니다.

int val = analogRead(A0);
int angle = map(val,입력최소값,출력최대값,0,90);

위와 같이 설정하면 구부림 값에 따라 0~90도의 각도를 만들어 낼 수 있습니다. 이 값을 통해서 Servo모터의 회전 시킬 수 있습니다.

2. 손가락 관절 제어


관철의 관찰 대상은 인간의 손으로 하겠습니다.


위 사진을 보시면 집게손가락을 보시면 세개의 관절이 있습니다. 이 부분의 동작을 관찰해 볼까요.

이제 주먹을 쥐어 볼까요.



자세히 보시면 각 마디의 관절이 약 90도 각도로 회전되어 있는 걸 보실 꺼에요.

이 관찰을 통해서 여러분들은 아두이노시각으로 표현한다면 뭐가 있을까요. 각도를 제어할 수 있는 Servo모터가 떠오르지 않나요.

집게손가락의 관절의 각도를 손이 쫙 펴진 상태에서 0도라면 주먹이 쥐어지는 과정은 서서히 3개의 관절의 각도를 증가시켜 90도 회전을 하게되면 주먹이 쥐어지는 형태가 됩니다. 이 원리를 잘 이용하게 손가락의 관절 제어를 할 수 있게 되겠죠.

오늘 다루게 되는 구부림센서를 이용하여 구부림의 각도값을 통해 3개의 관절(Servo모터)을 이용하면 손가락을 움직이게 할 수 잇겠죠.

이제 좀 더 자세히 알아보도록 하죠.

3. 구부림센서를 이용한 손가락 관절 제어


  • 준비물 : Servo모터 3개, 구부림센서, 저항 1m옴, 아두이노 우노
  • 내용 : A0는 구부림센서값을 읽기 위한 핀이고, Servo모터는 5,6,7핀을 이용한다.

실제 구부림 센서가 없기 때문에 회로도만 간단히 소개합니다.


위 회로도로 만들게 된다면 구부림의 정도에 따라서 3개의 Servo모터를 회전시키면 손가락 관절을 회전시키는 결과를 얻게 됩니다.

4. 가상시뮬레이터에서 손가락 관절 제어 실험


  • 준비물 : Servo모터 3개, 가변저항 1개, 아두이노 우노
  • 내용 : A0는 구부림센서값을 읽기 위한 핀이고, Servo모터는 5,6,7핀을 이용한다.

가상시뮬레이터에서는 구부림 센서는 없습니다. 예전에 post로 이야기 했듯이 없는 부품은 유사한 같은 느낌의 부품을 이용해서 실험을 하라고 했죠. 이번에는 가변저항을 이용하여 구부림 센서의 값을 대신하면 유사한 실험을 할 수 있게 됩니다.

위 회로도에서 보는 것처럼 가변저항의 Vcc, Gnd 핀을 연결하면 가변저항을 회전시키면 1023~0의 아날로그 신호의 변화가 일어나고가 발생합니다. 반대로 연결하면 0~1023의 아날로그 신호 변화가 일어납니다. 이 부분을 주위해주세요.

5. 코딩


손가락 과절 제어는 가상시뮬레이터에서 가변저항의 값을 각도로 바꾸기 위해서는 1023~0의 아날로그 신호값을 0~90도의 각도값을 만들고 그 각도만큼 회전시키면 됩니다.

int angle = map(analogRead(A0),0,1023,0,90);  

map()함수로 0~1023의 아날로그값을 0~90의 각도값으로 변환시킵니다. angle값으로 Servo모터를 회전시키면 됩니다.

servo1.write(angle);     
servo2.write(angle);     
servo3.write(angle);     

이렇게 가변저항을 통해 얻은 회전각을 3개의 Servomotor의 회전값으로 실행시켜면 자연스럽게 손가락 관절을 움직이게 됩니다.

종합해보면,

#include <Servo.h>

Servo servo[3];
const byte servoPin[3] = {5,6,7};

void setup()
{ 
  for(int i=0;i<3;i++){
    servo[i].attach(servoPin[i]); 
    servo[i].write(0);
  }  
  delay(1000);
}

void loop()
{  
  int angle = map(analogRead(A0),0,1023,0,90);  
  for(int i=0;i<3;i++){
    servo[i].write(angle);     
  }
  delay(50);
}

손가락 관절 제어라고 했는데 거창한 코딩을 기대하고 post를 보셨다면 크게 실망하셨을 거라 생각됩니다. 이걸로 손가락 관절이 제어가 되는지 의구심을 갖을 수 있겠죠.

시뮬레이터 결과로 간단히 설명 드리겠습니다.

6. 결과





위 결과를 보면 저게 손가락 관절이야 하실 꺼에요. 손가락 위치로 한번 재 배치 해 볼까요.


위 그림이 어느정도 회전에 대한 손가락 관절을 이해하셨나요.


7. 구부림 센서의 한계


구부림 센서는 손가락 한개의 구부림 각도 한개만 만들어 냅니다. 즉, 3개의 관절을 같은 각도로 제어하기 때문에 단순한 움직임만 만들어 냅니다. 정교한 손가락 움직임을 만들어 낼 수 없습니다. 손가락 3개의 관절 중 2개의 관절만 구부려도 구부림 센서는 이 값을 가지고 3개의 관절을 동일한 각도로 회전시키는 문제가 발생합니다.

처음에는 구부림 센서와 같은 부품으로 간단히 손가락을 움직이게 하고 나중에 능력이 된다면 근육센서로 신경값을 분석하여 손가락을 움직이는 실험을 해보세요. 나중에 기회가 된다면 꼭 해보고 싶은 실험입니다. 문제는 근육센서가 비싸고 단순히 Servo모터로 손가락을 제어하는것도 좀 부자연 스럽고 어느정도 로봇손에 관련된 고급 모터 부품을 쓴다면 재미로 실험하기에는 가격 부담이 크네요.

마무리


구부림 센서를 이용한 손가락 관절 제어는 구글검색을 하시면 쉽게 post들을 찾아 볼 수 있습니다. 대개 장갑에 구부림 센서를 부착하여 장갑을 낀 상태로 주먹을 쥐면 주먹을 쥔 각도만큼 구부림 센서는 구부러지고 그 구부림 각도만큼 아두이노에서 센서값을 읽고 회전각을 만들어서 구부린 각도만큼 회전을 시키면 실제 센서가 부착된 장갑에서 손동작과 유사하게 로봇손을 움직이게 할 수 있게 됩니다.

실제로 Servo모터가 16개가 있고 다수 Servo모터를 컨트롤 할 수 있는 모터쉴드랑 다섯개의 구부림 센서가 있다면 로봇손 전부를 움직이게 하는 실험을 할 수 있을 꺼에요. 하지만 제가 가지고 있는 부품이 Servo모터 1개뿐이라 실제 관절 실험을 못해 봤네요. 하지만 가상시뮬레이터로 어느정도 유사한 실험을 할 수 있는 것에 만족합니다.

댓글()