티스토리 뷰

이번 포스팅에서는 프로세싱으로 GUI를 구성해서 ESP8266과 연결된 아두이노를 이용하여 마우스 휠을 움직이면 움직인 만큼 모터의 속도를 조절하게 하는 프로젝트를 작성해보겠습니다.


여기서 파일명은 throttle라고 설정을 해주세요 그 이유는!!




이러한 의미때문입니다. throttle가 모터 등의 추력을 조절하기 위한 조종장치를 의미한다고 하네요




해야할 순서는 '아두이노 IDE 프로그램 작성하기 -> 프로세싱 스케치 프로그램 작성하기 -> AP 모드의 ESP8266과 연결하기 -> 최종 테스트



1. 아두이노 IDE 프로그램 작성하기


여기서는 사용자(클라이언트)로부터 모터의 속도를 입력을 받아서 모터의 속도를 직접적으로 조절을 해주기 위한 목적이 있습니다.[ESP8266 WiFi 모듈과 연결해서 속도를 제어한다는 전제하에 합니다.]



void setup(){
  Serial1.begin(115200);
  initMotorSpeed(); //모터 속도 초기화 함수  -> 처음에는 THROTTLE_INI값으로 동작
}

void loop(){
  controlMotorSpeed();
}

//analogWrite() 함수의 듀티값을 설정한 매크로
#define THROTTLE_MAX 255
#define THROTTLE_MIN 0
#define THROTTLE_INI 5

int throttle = THROTTLE_MIN;  //모터의 속도(듀티값)을 저장할 변수

//아두이노와 연결된 PWM 핀
int motorA_Pin = 6;
int motorB_Pin = 10;
int motorC_Pin = 9;
int motorD_Pin = 4;

//PWM5의 값으로 모터의 속도를 처음에 초기화
void initMotorSpeed(){ 
  analogWrite(motorA_Pin, THROTTLE_INI); delay(1000);
  analogWrite(motorB_Pin, THROTTLE_INI); delay(1000);
  analogWrite(motorC_Pin, THROTTLE_INI); delay(1000);
  analogWrite(motorD_Pin, THROTTLE_INI); delay(1000);
}

//모터의 속도가 바뀌었는지 확인하는 함수
void controlMotorSpeed(){
  if(isMotorSpeedChanged()) //만약 속도가 바뀌었다면 모터의 속도를 수정
    updataMotorSpeed();
}

enum{ //T를 누르면 모터의 속도 값을 보내겠다는 의미
  IDLE = 'I',  //사용자 입력이 없는 상태
  THROTTLE = 'T', //사용자 입력이 있는 상태 -> TELNET 형태의 프로그램으로 문자 형태로 전달됨
};


int inputState = IDLE;

//모터의 속도가 바뀌었는지 알 수 있는 함수 (bool형으로 참 거짓 판별)
bool isMotorSpeedChanged(){
  bool throttle_changed = false;  //flase로 초기화
  int inputData;

  if(Serial1.available() > 0){
    inputData = Serial1.read();
    if(inputState == IDLE){
      if(inputData == THROTTLE)
        inputState = THROTTLE;
    }
    else{ //if(inputState == THROTTLE)
      throttle = inputData; //텔넷 형태로 문자를 저장함, throttle:모터의 속도(듀티값)을 저장할 변수
      throttle_changed = true;  //속도가 바뀌었는지 알려주는 변수
      inputState = IDLE;
    }
  }

  return throttle_changed;
}

void updataMotorSpeed(){
  analogWrite(motorA_Pin, throttle);
  analogWrite(motorB_Pin, throttle);
  analogWrite(motorC_Pin, throttle);
  analogWrite(motorD_Pin, throttle);
}

 

아두이노 IDE에서 프로그램 실행 순서는 무조건 setup() -> loop() 입니다.


3번째줄 : setup()함수에서 initMotorSpeed() 함수를 이용해서 초기 모터속도를 초기화 시켜주었습니다.

7번째줄 : loop()구문입니다. 이거는 무한으로 프로그램이 계속 반복적으로 실행이 됩니다. 일면 무한루프라고 불리웁니다. controlMotorSpeed 함수를 실행하는데 이 함수가 정의되어 있는 구문은 32번째 줄 입니다.


32번째줄 : controlMotorSpeed함수는 모터의 스피트를 제어하는 함수 입니다.

33~34번째줄 : 만약 모터의 속도가 바뀌었다면(isMotorSpeedChanged) 모터 속도를 갱신해라(updateMotorSpeed)

이 경우는 if 구문을 만족하지 못하면 그냥 빠져나와 또 loop구문을 돌다가 if문을 충족할때 그 이하의 구문들이 실행되는 것 입니다.


if 구문이 만족(true)한다고 가정하고


46번째 줄 : bool형이 나왔습니다. 간단하게 정리를 해보겠습니다.


bool형


C에는 없고 C++에만 있는 내용, 참(0이 아닌 모든 값) or 거짓을 담을 수 있다.

boolean 타입으로 논리 값이 true와 false를 넣는 타입으로 변ㅅ의 메모리 할당은 1byte이다.


계속 이어서 설명을 하겠습니다. throttle_changed라는 bool형 변수를 초값으로 false(0)으로 초기화를 시켜주었습니다.


50번째줄 : available()함수를 이용해서 Serial1에 사용자 데이터가 도착을 했는지 확인을 합니다. 도착을 했다면 true니까 1이겠지요~?

51번째 줄 : 도착을 했으면 inputData에다가 Serial1에 사용자 데이터가 도착한 값을 읽어드립니다.


37번째 줄 : enum 이라는 녀석이 나왔는데요 이것에 대해 간단하게 설명을 해드리겠습니다.


enum


열거형 선언 함수, 어떤 유사한 성질을 가지는 내용들을 정수로 표현할때 유용함


소스코드에 보시면 IDLE는 사용자 입력이 없는 상태이고 THROTTLE는 사용자 입력이 있는 상태입니다.

[나중에 프로세싱 프로그램을 이용해서 GUI상에서 슬라이더를 움직여 주면 T값을 TELNET 형태로 보내지게 됩니다. 그렇게 되면 아두이노는 와이파이를 통해서 그 데이터를 받게 되고 동작을 하게 되어지는 원리입니다.]



52번째 줄 : 입력상태(inputstate)가 없고

53번째 줄 : 입력데이터(inputData)가 있다면(THROTTLE)즉, GUI상에서 스크로를 움직여서 속도 조절을 시켜주었다면

54번째 줄 : 입력 상태가 있어지게 되는것이니까 inputState를 THROTTLE로 바꾸어 준다.


56번째 줄 : 만약 그게 아니라면(inputState가 THROTTLE 인 상태)  모터 속도(듀티값)을 저장할 변수 throttle에다가 inputData 값을 저장시켜줍니다. 그리고 속도가 변했는지 알려주는 변수 throttle_changed에 속도가 바뀌었으니 true를 저장하고 입력 데이터가 이제 끝났으니 inputState는 다시 IDLE로 저장해줍니다.


63번째 줄 : 그리고 리턴을 throttle_changed를 해줍니다. 속도가 변경 되었다면 true가 리턴될것입니다.


34번째 줄 : if구문이 true니까 속도를 변경시켜서 모터회전을 해줍니다.

66번째 줄 : inputData값을 저장시킨 throttle변수에 값에 따라서 각 모터의 속도가 갱신되어 동작을 하게 됩니다.








Comments