Hermit Under the Cliff

[Arduino] 아두이노 코딩봇 만들기 (10) - mBlock 업로드 모드 본문

Personal Projects/아두이노 코딩봇

[Arduino] 아두이노 코딩봇 만들기 (10) - mBlock 업로드 모드

AnonymousDeveloper 2022. 2. 28. 16:04

이제는 mBlock의 업로드 모드에 대해서 알아볼 시간입니다.

앞서 설명드린바와 같이 업로드 모드는 mBlock에서 블록코딩으로 작성된 코드를

Arduino C 코드로 변경후 컴파일하여 새로운 펌웨어를 만들어 아두이노에 업로드 해 주는 모드 입니다.

 

우선적으로 설정해 주어야 할 부분은 코드의 템플릿을 작성입니다.

Extension builder메뉴에서 Transcode settings에서 이 템플릿을 작성해 줄 수 있습니다.

아래와 같이 language support에 ArduinoC를 선택해 주시면 됩니다.

아래와 같이 //( setup //) 이런식으로 표시된 부분이 나중에 블럭을 추가하거나 할때 채워지는 부분 입니다.

 

// generated by mBlock5 for <your product>
// codes make you happy

//( include //)
#include <Arduino.h>
//( lib //)

//({
    this.$ALL_VARIABLES.length==0?'':this.$ALL_VARIABLES.map(v=>"float "+v+" = 0;").join('\\n')
}//)

//( declare //)


void _delay(float seconds) {
  long endTime = millis() + seconds * 1000;
  while(millis() < endTime) _loop();
}

//(
void setup() {
  //( setup //)
  //( code //)
}
//)

void _loop() {
  //( _loop //)
}

void loop() {
  _loop();
}

위와 같이 기본적으로 생성된 코드에다가 기존에 작성했던 펌웨어의 코드를 적절히 넣어 줍니다.

자세한 코드는 깃허브에서 mext 파일을 import 하셔서 참조해 주시면 됩니다.

https://github.com/reitn/OlbinBot

 

GitHub - reitn/OlbinBot: Olbin Coding bot based on Arduino and Mblock

Olbin Coding bot based on Arduino and Mblock. Contribute to reitn/OlbinBot development by creating an account on GitHub.

github.com

 

추가로 확장 라이브러리는 아래로 조금 내리면 Source file 섹션에서 추가하실 수 있습니다.

 

한참 고생했던 부분 중 하나가 우리가 템플릿이나 블럭에서 함수를 하나 만들면

mBlock에서 자동으로 함수 선언을 코드의 첫 부분에 추가해 줍니다.

여기서 하나의 문제가 있는데 함수 선언이 include전에 추가되다 보니

확장 라이브러리에 정의된 클래스나 구조체를 인자로 가지는 함수를 선언하면 컴파일 에러가 납니다.

 

/// mBlock에서 생성되는 실제 코드의 예제
#include <Arduino.h>
void write_command(InfoToMakeDXLPacket_t command); // mBlock에서 자동적으로 생성, 위치 변경 안됨

#include <Olbin_Protocol2.0/olbin.h>

....
....

위와 같이 InfoToMakeDXLPacket_t 의 구조체는 olbin.h에서 참조하고 있는 파일에서 정의가 되는데

include 전에 함수 선언이 되다보니 에러가 납니다.

해결 방법은 어쩔 수 없이 함수 중에 기본 구조가 아닌 것들은 사용을 안하게 만들어야 합니다.

(역시 근본 없는 회사! 로보티즈 반만 좀 따라가라)

 

Common code 작업을 마치고 나면 다음에 해줄 부분은 시작 블록을 만들어 주는 것 입니다.

우선 아래와 같이 이벤트 타입의 블록을 추가해 줍니다.

 

 

이후 Upload transcode 탭으로 이동하면 이 블록에 대한 업로드 모드의 코드를 작성할 수 있습니다.

include, declare, lib, setup, code, _loop 등이 구분이 되어있는 것을 볼 수 있고

이 곳에 작성된 코드가 템플릿의 //( include //), //( declare //), //( lib //), //( setup //), //( code //), //( _loop//) 에

끼워져 들어가게 됩니다.

 

 

이 이벤트 블록은 프로그램에서 entry point라고 보시면 되고 이 블록 아래에 여러가지 블록이 붙게 됩니다.

이 블록 아래 붙은 블록들의 코드는 아래와 같이 /*{$BRANCH}*/ 로 가져올 수 있습니다.

이 /*{$BRANCH}*/를 _loop 안에 넣어주시면 동작을 계속 해서 반복을 하게 되는 것이고

code에다가 넣어주시면 한 번만 반복을 하게 됩니다.

저는 계속 반복 블록을 따로 쓸 필요가 없게 하기 위해 _loop에다가 넣어주었습니다.

이벤트 블록의 작성이 끝나면 이제는 각각 동작들을 위한 블록들의 코드를 작성해 주시면 됩니다.

아래 예제와 같이 선택한 방향으로 이동하는 블록들의 코드를 작성하였습니다.

위에서 보시는 바와 같이 블록의 인자들은 this를 통해 접근할 수 있습니다.

위 코드는 direction이 forward면 moveForward(); 가 실제 코드가 되고

아니라면 moveBackward();가 실제 호출되는 코드가 됩니다.

 

이런식으로 각각의 블록들에 대해 Upload transcode를 작성해 주시면

우리가 작성한 로봇을 라이브 모드와 업로드 모드 모두를 지원하게 됩니다.

 

더 자세한 코드는 위에 링크해 놓은 깃허브 페이지에서 mext 파일을 다운받으시면 확인해 보실 수 있습니다.

다음번 포스트에서는 CM-50이 아닌 아두이노에 직접 연결된 센서를 처리하는 부분을 알아볼까 합니다.

Comments