메이킹 일지 (진행 중)/하이퍼랩스 게임기

하이퍼랩스 게임기 제작 - 8. 부품 별 코딩 주의사항

  • -

https://bker001.tistory.com/409

 

하이퍼랩스 게임기 제작 - 7. 전체 조립 및 가동 + 멀티 스레드 이야기

https://bker001.tistory.com/403 하이퍼랩스 게임기 제작 - 6. Nema17과 A4988, Accelstepper https://bker001.tistory.com/395 하이퍼랩스 게임기 제작 - 5. 중간 점검 https://bker001.tistory.com/392 하이퍼랩스 게임기 제작 - 4.

bker001.tistory.com

 

 

일단 멀티스레드를 해야 하는 이유와 원리에 대해 설명하고 이번에는 코딩을 실행했습니다.

 

코딩은 사실 어렵지 않게 예제를 많이 볼 수 있었는데, 접속하고 있는 센서와 장치들이 많다보니 어느 부분에서 에러가 생긴것인지 파악이 되어지지 않아서 이번에는 시간이 매우 오래걸렸습니다.

 

 

#include <AccelStepper.h>

#define DIR 12
#define STEP 14
#define sWitch 33
#define VRX_PIN 25 // joystick X
AccelStepper stepper = AccelStepper(1, STEP, DIR);//드라이버를 쓸때는 1을쓴다!

int relay = 15;
#define limitswitch1 26
#define limitswitch2 27

TaskHandle_t Task1;
TaskHandle_t Task2;


void setup() {
  // put your setup code here, to run once:
    // 리밋 스위치 설정
  pinMode(sWitch, INPUT_PULLUP);
  pinMode(limitswitch1, INPUT_PULLUP);
  pinMode(limitswitch2, INPUT_PULLUP);
  pinMode(relay, OUTPUT); //릴레이
  Serial.begin(115200);//결과를 시리얼모니터에서 볼거야~
  pinMode(DIR,OUTPUT);
  pinMode(STEP,OUTPUT);
  stepper.setMaxSpeed(10000); //
  stepper.setAcceleration(6000); //
  stepper.setCurrentPosition(0); //현재 스탭을 설정

  xTaskCreatePinnedToCore(
    Runsolenoid,         // 태스크 함수
    "Task1",           // 테스크 이름
    8192,             // 스택 크기(워드단위)
    NULL,              // 태스크 파라미터
    1,                 // 태스크 우선순위
    &Task1,            // 태스크 핸들
    0);                // 실행될 코어

 xTaskCreatePinnedToCore(
    RunJoy,          // 태스크 함수
    "Task2",           // 테스크 이름
    10000,             // 스택 크기(워드단위)
    NULL,              // 태스크 파라미터
    1,                 // 태스크 우선순위
    &Task2,            // 태스크 핸들
    1);                // 실행될 코어

}

void Runsolenoid( void *pvParameters ){
  for(;;){
    if(digitalRead(sWitch)==LOW){
      Serial.println("sWitchOn");
      digitalWrite(relay, HIGH);
      delay(200);
      digitalWrite(relay, LOW);
      delay(200);
      }
    }
  }

void RunJoy( void *pvParameters ){
 for(;;){
    int joystick = analogRead(VRX_PIN); //0~1023
  if(joystick < 300){
    //왼쪽으로 제낀경우 
    if(digitalRead(limitswitch2)==LOW){
      Serial.println("sWitch2");
    } //목표지점 설정
    else {
      stepper.moveTo(stepper.currentPosition()+10);
    }
  }else if(joystick > 3800){
    //오른쪽으로 제낀경우
    if(digitalRead(limitswitch1)==LOW){
      Serial.println("sWitch1");
    } //목표지점 설정
    else {
      stepper.moveTo(stepper.currentPosition()-10);
      }
    }
      stepper.run();
  }
}

void loop(){

}

 

 

일단 보이시는 것처럼 코딩을 구성했습니다만 대강 좀비처럼 여기저기서 기워 맞춘 코딩 형태라는 것을 알아주셨으면 합니다. 

 

이번에 아두이노에서 ESP32로 MCU를 변경하면서 너무나도 많은 모름이 존재했습니다. 거기에 내 ESP32는 어떤 종류인지 몰라서 열심히 찾아다니며 호환이 가능한지 찾아 해매야 했습니다.

특히 어디에 어느 핀은 사용하면 안되고 어느 핀은 Analog핀이 상호작용하지 않고,,,,

 

그래서 수정된 것이 매우 많습니다.

 

 


 

ESP32 + 리미트 스위치 

 

https://esp32io.com/tutorials/esp32-limit-switch

 

 

거두절미하고 리미트 스위치는 Esp32에서 3개 전부 연결하는게 아닌 2개만 연결하면 되는 것이었습니다. 따로 5v가 필요한 것이 아니라 자체 GIOP핀에서 사용이 가능합니다.

이것을 모르기 전까지 정말 많은 오류가.. 있었습니다..

 

정리해보자면,

① 리미트 스위치는 GIOP 26,27로 꼽은 다음

② 핀모드는 일반 INPUT이 아닌, INPUT_PULLUP

③ loop문에 digitalRead == LOW로 정리하였더니 잘 작동해줬습니다.

 

 

 


 

ESP32 + A4988 + NEMA17

 

https://microcontrollerslab.com/stepper-motor-a4988-driver-module-esp32/

 

보이시는 그대로 진행했습니다. 특히 DIR과 STEP을 12와 14로 두었더니 전혀 문제되는 것 없이 깔끔히 작동합니다

그렇지만 특히 사항으로 12V power supply 라고 적혀있는 곳에 어느정도 V가 들어가느냐에 따라 힘 차이가 매우 심합니다.

 

 


 

ESP32 + 릴레이 모듈

 

https://esp32io.com/tutorials/esp32-relay

 

 

이것도 위와 같이 구성하였는데 저는 릴레이를 GPIO15에 연결하여 주었습니다. 3.3v로 연결했을때와 5v로 연결했을 때의 차이가 매우 심해서 유의하셔야겠습니다.

 

 

 


 

ESP32 + 조이스틱

 

https://esp32io.com/tutorials/esp32-joystick

 

 

 

조이스틱은 아두이노있때 0~1000까지의 범위를 가지고 있었는데, ESP32에서는 0부터 4092의 범위를 가지고 있었습니다. 그래서 그에 맞게 범위를 책정하시고 if문에 넣으시면 되겠습니다.

 

 

 

 

저는 300, 3800으로 여유롭게 두고 설정했습니다.

 

 


 

 

 

이제 이거를 전부 연결시킨 것이 위의 코드입니다.

여기까지 잘 작동하는 것이 확인되었으니 이제는 추가 스위치와 LCD 코딩, 공치는 부분 모델링 교체, 몸체 3D프린팅 및 가공 정도가 남았습니다.

 

와씨 빡센데요 이거

반응형
Contents

포스팅 주소를 복사했습니다!

이 글이 도움이 되었다면 추천 부탁드립니다!