티스토리 뷰

반응형

다른 강의자료는 www.codingnow.co.kr/ 여기를 참고해주세요.!!

 

코딩나우

프로그래밍 교육및 개발의뢰 받습니다.

www.codingnow.co.kr

 

https://youtu.be/egJ6bXiMZJs

 

 

 

 

 

아두이노와 스테핑 모터, 서보모터, 조이스틱을 활용하여 초간단 로봇팔을 만들어 봅니다.

자세한 사항은 첨부된 동영상을 참고해주세요.

 

[회로구성]

초간단 로봇팔 회로구성
초간단 로봇팔

 

[전체 소스코드]

arduino_robot_arm.zip
0.39MB

 

[주요소스코드]

-.main.cpp

초기화 및 반복 실행을 처리합니다.

조이스틱의 값을 read해서 스테핑모터와 서보모터에 키값을 전달하게 됩니다.

#include "global.h"

typedef struct{
    unsigned char keyResult;

    unsigned long timeCurr;
    unsigned long timeDealy;
}valType;

valType val;

void setupMain() 
{
    unsigned char i;
    /*시리얼 초기화*/
    Serial.begin(9600);
    /*변수초기화*/
    memset(&val, 0x00, sizeof(val));
    /*포트 초기화*/
    key_Init();
    stepperInit();
    servoInit();

    /*주기 설정 처음은 1sec*/
    val.timeCurr = millis();
    val.timeDealy = 50;
}

void loopMain()
{
    /*50ms 주기로 slideProcess를 실행한다. */
    if ((millis() - val.timeCurr) > val.timeDealy)
    {
        val.timeCurr = millis();
        val.timeDealy = 50;

        val.keyResult = getKey();
        if(val.keyResult & (dir_left|dir_right))
        {
            stepperRun(val.keyResult);
        }
        if (val.keyResult & (dir_up | dir_down))
        {
            servoRun(val.keyResult);
        }
    }
}

-key.cpp

조이스틱의 값을 read해서 key값으로 변경해줍니다.

#include "key.h"

#define KEY_MAX 2
unsigned char keyMap[KEY_MAX] = {A0, A1};

void key_Init(void)
{
    unsigned i;
    for(i=0; i<KEY_MAX; i++)
    {
        pinMode(keyMap[i], INPUT); //Analog
    }
}

unsigned char getKey(void)
{
    unsigned i, adc, count = 0;
    unsigned char keyResult = 0;

    for (i = 0; i < KEY_MAX; i++)
    {
        adc = analogRead(keyMap[i]);
        if (adc > 700)
        {
            keyResult |= (0x01 << count); //left, up
        }
        else if (adc < 300)
        {
            keyResult |= (0x01 << (count+1));; //right, down
        }else{
            ;
        }
        count+=2;
    }
    return keyResult;
}

-moterStepper.cpp

스테핑 모터를 초기화 하고 제어합니다.

#include <Stepper.h>
#include "moterStepper.h"

const int steps = 45; //2048;

Stepper myStepper(steps, 11, 9, 10, 8);

void stepperInit(void)
{
    myStepper.setSpeed(200); //RPM
}

void stepperRun(unsigned char key)
{
    if (key & dir_left){
        myStepper.step(45);
    }
    if (key & dir_right)
    {
        myStepper.step(-45);
    }
}

-moterServo.cpp

서보모터를 초기화 하고 제어합니다.

#include "moterServo.h"

#include <Servo.h>

int servoPin = 7;
int angle = 90;
Servo servo;

void servoInit(void)
{
    servo.attach(servoPin);
    delay(100);
    servo.write(0);
    delay(100);
    servo.write(angle);
}

void servoRun(unsigned char key)
{
    if (key & dir_up)
    {
        if (angle < 180)
        {
            angle += 10;
        }else{
            angle = 180;
        }
        servo.write(angle);
    }

    if (key & dir_down)
    {
        if (angle > 0)
        {
            angle -= 10;
        }
        else
        {
            angle = 0;
        }
        servo.write(angle);
    }
}
반응형