일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 올로
- CM-50
- testautomation
- hutc
- mysql4
- chromedriver
- 무명의개발자
- NocoDB
- arduino
- 다이나믹셀
- 업로드모드
- 효용감
- c#
- 아두이노코딩봇
- 로보티즈
- 크롬드라이버
- Robotis
- 테스트자동화
- 코딩봇
- 절벽아래은둔자
- automation
- 엠블록
- MBLOCK
- 아두이노
- QA
- 테스트 자동화
- TP4056
- ChatGPT
- Ollo
- Dynamixel
- Today
- Total
Hermit Under the Cliff
[Arduino] 아두이노 코딩봇 만들기 (12) - 속도조절을 위한 버튼 본문
[Arduino] 아두이노 코딩봇 만들기 (12) - 속도조절을 위한 버튼
AnonymousDeveloper 2022. 3. 8. 14:35mBlock의 업로드 모드로 사용을 하다보니
중간 중간 로봇의 속도를 조절해서 가지고 놀고 싶다는
따님의 요구가 있었습니다.
그래서 푸쉬 버튼을 달아 누를 때 마다 속도를
저속 - 중속 - 고속으로 변경해 주는 기능을 넣기로 했습니다.
현재의 구조에서 버튼이 눌려진 이벤트를 처리하기에는
인터럽트를 사용하는 것이 제일 편하고 쉬울 것 같아서
이 부분을 알아보았습니다.
인터럽트는 특정한 인터럽트 신호가 들어오면
기존에 실행하던 코드들의 동작을 정지하고
인터럽트로 정의된 코드를 실행 후
다시 기존 실행하던 코드로 돌아오는 행동을 말합니다.
쉽게 예를 들자면
회사에서 쇼핑몰에서 열심히 지름 목록을 추가하고 있다가
부장님이 자리로 가까이 오시는 듯 하면 (인터럽트 신호)
쇼핑몰 창을 빠르게 내리고 (기존 코드 동작을 정지)
비주얼 스튜디오 창을 재빨리 띄우는(인터럽트로 정의된 코드)
그런 동작을 말합니다.
물론 부장님이 돌아가시면
다시 쇼핑몰 창으로 돌아가게 되죠. (기존 실행하던 코드)
인터럽트의 처리를 블록코딩으로 하게 하는 것은
저도 고려해야할 것이 많아 귀찮고
아이도 이 개념을 아직은 이해하기 힘들 듯 하여,
저는 그냥 아두이노 코드에 바로 넣어주기로 했습니다만
mBlock의 이벤트 브로드캐스팅 기능으로 구현을 할 수도 있을 듯 합니다.
아두이노 우노 보드의 경우
인터럽트 신호로 인지할 수 있는 부분은 핀 2,3번의 입력입니다.
기존에 Software Serial을 2,3번으로 지정해 놓았었는데
이를 일단 4,5번으로 변경을 우선 해주어야 했네요.
그리고 2번 핀에 Pull down 저항을 이용하여 버튼을 연결해 준 뒤
코드를 작성해 줍니다.
전체 인터럽트 관련 코드는 아래와 같고
아래 부분에서 한 부분씩 자세히 알아봅시다.
int button = 2;
bool button_clicked = false;
void setup() {
pinMode(button, INPUT);
attachInterrupt(digitalPinToInterrupt(button), catchInterrupt, RISING);
}
void catchInterrupt()
{
button_clicked = true;
}
void loop() {
if(button_clicked)
{
change_speed_by_button();
button_clicked = false;
}
}
void change_speed_by_button()
{
speed_factor = (speed_factor+50)%150; // Rotate 0 - 50 - 100
change_speed(200 + speed_factor); // Speed rotate 200 - 250 - 300
switch(robot_speed)
{
case 200:
turnRedLEDOn();
turnBlueLEDOff();
break;
case 250:
turnRedLEDOff();
turnBlueLEDOff();
break;
case 300:
turnRedLEDOff();
turnBlueLEDOn();
break;
}
stopMoving();
}
처음으로 볼 부분은 인터럽트 등록 부분입니다.
int button = 2;
void setup() {
pinMode(button, INPUT);
attachInterrupt(digitalPinToInterrupt(button), catchInterrupt, RISING);
}
아두이노 우노 보드는 인터럽트를 두 개 지원한다고 말씀 드렸는데
코드에서 인식을 하는 것은 0번째 인터럽트 (2번핀), 1번째 인터럽트 (3번핀) 으로 인식합니다.
이렇게 핀번호랑 인터럽트 번호랑 맞지를 않아서
이를 일치시켜 주는 함수가 digitalPinToInterrupt 함수 입니다.
attachInterrupt 함수는 인터럽트를 등록해 주는 함수이며
인터럽트 번호, 인터럽트 시 실행해줄 함수(void형) 및 조건이 인자로 들어가게 됩니다.
조건은 LOW, CHANGE, RISING, FALLING, HIGH 중 하나가 되어야 하고
차례대로 입력이 0일때, 변경되었을때, 0->1로가는 시점, 1->0으로 가는시점, 1일때 가 됩니다.
그 다음 인터럽트를 처리할 부분을 살펴봅니다.
bool button_clicked = false;
void catchInterrupt()
{
button_clicked = true;
}
catchInterrupt 함수는 위에 attachInterrupt 함수에서 지정해준
인터럽트 발생 시 수행할 함수 입니다.
bool 형태의 button_clicked 변수를 설정해주어
버튼이 눌렸을 경우 true로 설정하는 간단한 코드 입니다.
처음에는 여기에 실제 속도변경 코드를 다 넣었었는데
이상하게도 인터럽트 코드가 끝까지 실행이 되지 않는 문제가 있었습니다.
검색을 통해서도 딱히 해결책을 찾을 수 없어서
일단 인터럽트 실행시 수행할 코드를 위와 같이 최소화 하였습니다.
그래서 다음의 loop시에 button_clicked 값에 따라 원하는 동작을 하게 됩니다.
void loop() {
if(button_clicked)
{
change_speed_by_button();
button_clicked = false;
}
}
void change_speed_by_button()
{
speed_factor = (speed_factor+50)%150; // Rotate 0 - 50 - 100
change_speed(200 + speed_factor); // Speed rotate 200 - 250 - 300
switch(robot_speed)
{
case 200:
turnRedLEDOn();
turnBlueLEDOff();
break;
case 250:
turnRedLEDOff();
turnBlueLEDOff();
break;
case 300:
turnRedLEDOff();
turnBlueLEDOn();
break;
}
stopMoving();
}
loop 문 처음에서 button_clicked 의 값을 체크해서 true이면
원래 원하던 change_speed_by_button 함수를 호출해 줍니다.
change_speed_by_button 함수에서는 로봇의 속도를
200 - 250 - 300 순서로 rotation을 해주고 있으며
로봇의 속도에 따라 Red/Blue Led의 On/Off를 변경해서 현재의 속도를
쉽게 알아볼 수 있게 하였습니다.
이렇게 작성된 코드를
로봇의 펌웨어와 mBlock 업로드 모드의 코드에다가 추가를 해주면
이제 버튼으로 로봇의 속도를 조절할 수 있게 됩니다.
다시한번, 모든 코드들은 아래 Github에서 확인하실 수 있음을 알려드립니다.
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
'Personal Projects > 아두이노 코딩봇' 카테고리의 다른 글
[Arduino] 아두이노 코딩봇 만들기 (14) - 서보모터를 이용해 회전하는 머리 달아주기 (0) | 2022.03.21 |
---|---|
[Arduino] 아두이노 코딩봇 만들기 (13) - 8x8 LED Dot Matrix 장착 (0) | 2022.03.18 |
[Arduino] 아두이노 코딩봇 만들기 (11) - 초음파 센서 추가하기 (0) | 2022.03.03 |
[Arduino] 아두이노 코딩봇 만들기 (10) - mBlock 업로드 모드 (0) | 2022.02.28 |
[Arduino] 아두이노 코딩봇 만들기 (9) - mBlock 라이브 모드 (0) | 2022.02.25 |