motor.ino 2.99 KB
#include <Stepper.h>

// 스텝당 1.8도 회전함. 360/1.8
const int stepsPerRevolution = 200;

Stepper myStepper(stepsPerRevolution, 2, 3, 4, 5);

// 블루투스 모듈
#include <SoftwareSerial.h>
#define BT_RX 7
#define BT_TX 8

// RX핀(7번)은 HM10의 TX에 연결 
// TX핀(8번)은 HM10의 RX에 연결  
SoftwareSerial HM10(BT_RX,BT_TX);

// 동작 수신용
char receivechar;

// at 설정용
char recv_str[100];

void setup()
{
    // 1분에 n바퀴 회전
    myStepper.setSpeed(60);

    Serial.begin(9600);
    HM10.begin(9600);

    // 블루투스 작동 확인
    while(1)
    {
        if(sendBlueToothCommand("AT") == 0)
        {
            if(strcmp((char *)recv_str, (char *)"OK") == 0)
            {
                Serial.println("Bluetooth exists\r\n");
                break;
            }
        }
        delay(500);

    }
    sendBlueToothCommand("AT+NAMEMOTOR"); // 블루투스 장치 이름설정
    sendBlueToothCommand("AT+MODE3"); // 블루투스 모드 설정
    sendBlueToothCommand("AT+TYPE3");
}


void loop() 
{
    if(HM10.available())
    {
        receivechar = HM10.read();
        if(receivechar == 'y'){
            // 이상태에서는 360도 회전.
            // 회전수 조절시 아래 함수 추가
            myStepper.step(stepsPerRevolution);
            myStepper.step(stepsPerRevolution);
            myStepper.step(50);

            
            delay(1500);
        }
        if(receivechar == 'n'){
            // 이상태에서는 -360도 회전. 
            // stepsPerRevolution = 200일때 1초대기. -> 360도 회전.
            myStepper.step(-stepsPerRevolution);
            myStepper.step(-stepsPerRevolution);
            myStepper.step(-20);
   

            delay(1500);
        }
    }
     
}

// at 설정용 함수
int sendBlueToothCommand(char command[])
{
    Serial.print("send: ");
    Serial.print(command);
    Serial.println("");
#if NLCR
    HM10.println(command);
#else
    HM10.print(command);
#endif    
    delay(300);

    if(recvMsg(200) != 0) return -1;

    Serial.print("recv: ");
    Serial.print(recv_str);
    Serial.println("");
    return 0;
}

int recvMsg(unsigned int timeout)
{
    //wait for feedback
    unsigned int time = 0;
    unsigned char num;
    unsigned char i;

    //waiting for the first character with time out
    i = 0;
    while(1)
    {
        delay(50);
        if(HM10.available())
        {
            recv_str[i] = char(HM10.read());
            i++;
            break;
        }
        time++;
        if(time > (timeout / 50)) return -1;
    }

    //read other characters from uart buffer to string
    while(HM10.available() && (i < 100))
    {                                              
        recv_str[i] = char(HM10.read());
        i++;
    }
#if NLCR    
    recv_str[i-2] = '\0';       //discard two character \n\r
#else
    recv_str[i] = '\0';
#endif
    return 0;
}