[아두이노] 엔트리로 초음파레이더 졸작

IOT/아두이노|2019. 10. 8. 09:00

[아두이노] 엔트리로 초음파레이더 졸작



스크래치로 뭔가 표현한 작품을 하나 만들면 좋을 것 같아요. 엔트리에 초음파센서와 서보모터를 제어하는 블록이 있기에 이 두 블록을 가지고 표현할 수 있는 작품으로 떠오르는 것은 초음파레이더가 있더군요. 멋지고 좀 더 깔끔하게 블록을 만들면 좋은데 대충 post 주제를 정하고 막코딩을 해서 느낌만 비슷하게 초음파 레이더 원리 동작만 수행하는 간단한 졸작을 하나 만들어 봤네요.

1. 스크래치로 초음파레이더 설계


설계 :

  • 초음파센서 값 읽기
  • 초음파센서로 반경 180도 범위의 100미만 거리에 장애물을 감지하기 위해서 서보모터 회전
  • 엔트리 화면에 레이더 각도 바 표시
  • 초음파센서로 물체 감지했을 때 감지한 위치에 물체 표시

대충 4가지 형태로 나누어 표현 하겠습니다.

초음파센서 값 읽기


지난시간에 초음파센서값을 읽기를 했었습니다. 아래와 같은 표현을 하시면 됩니다.


변수블록에서 거리라는 변수를 만드시고 거리 블록에다가 초음파센서 센서값 블록을 배치하면 계속 반복하기로 실시간으로 현재 거리변수에 초음파센서 값이 저장되게 됩니다.

초음파센서로 반경 180도 범위의 100미만 거리에 장애물을 감지하기 위해서 서보모터 회전


서보모터를 제어하는 블록을 가지고 180도 회전을 좌/우로 왔다 갔다 해보도록 합시다.


위 블록을 보시면 우선 각도라는 변수 블록을 만들어 주세요. 그리고 초기값으로 0으로 처음 정하게 됩니다. 그리고 서보모터오 0도로 초기각도를 잡아 주는데 다음 동작을 수행하지 않도로 3초의 대기시간을 부여 합니다.

계속 반복하기로 각도는 1씩 증가하고 그 각도를 1도씩 증가한 각도로 회전을 하게 됩니다. 그리고 180도까지 회전했다가 반대로 180도에서 0도로 1도씩 감소시켜 0도가 될때까지 반복하게 됩니다 이렇게 해서 0~180도 회전을 왔다 갔다 하게 됩니다.

엔트리 화면에 레이더 각도 바 표시




회전을 시키면 그 회전된 각도를 엔트리에 표시하기 위해 하나의 바 이미지를 붓으로 그리는 표현을 했습니다.

초기 위치는 좌표(0,-100)로 레이더 바의 시작 위치가 됩니다 방향은 0도로 했기에 오른쪽에서 왼쪽으로 회전하게 됩니다. 초기 상태니 붓(펜)이 그려져 있으면 모두 지우라는 명령이고
붓의 색과 굵기를 초기로 지정합니다.

그다음 계속 반복하기 블록이 반시계방향으로 180도 회전했다가 시계방향으로 180도 회전하는 반복문이 안에 표현되어 있어 왔다 갔다 반복하면서 레이더 바의 움직임을 표시합니다. 이 바는 현재의 각도 위치만 표시 되어 야 하기 때문헤 한번 그리고 난뒤 다음 바를 그릴 때 먼저 모든 붓 지우기로 바을 지우고 나서 다시 그립니다.

반시계 방향으로 180도 회전


모든 붓 지우기는 이전 그려진 레이더 바를 지우는 명령이고 그리기 시작과 그리기 멈추기 사이에 붓으로 그리는 작업이 수행됩니다. 시작위치는 좌표(0,-100) 지점에서 이동방향이 200이면 좌표(0,-100)꼭지점에서 이동방향쪽으로 200지점까지 붓으로 그리게 됩니다. 즉, 하나의 선이 그려집니다. 그 선을 -1도 각도회 회전시키는 명령입니다. 이걸 180번 하기 때문에 1도씩 오른쪽에서 왼쪽으로 하나의 선이 그려집니다. 이전 선을 지우고 새로운 선이 그려지는 과정을 반복하게 됩니다. +1도 씩 180번 회전하면 반대로 왼쪽에서 오른쪽으로 레이더 바가 회전하겠죠.

초음파센서로 물체 감지했을 때 감지한 위치에 물체 표시


초음파센서로 장애물을 감지하면 장애물이 감지한 위치에 장애물임을 표시하는 오브젝트를 표시를 하겠습니다.


빨간 상자가 물체 표시 마크입니다. 그리고 총 세 블록으로 나누어서 블록코딩을 하였습니다.

첫번재 블록은 시작하면 장애물 표시가 엔트리 화면에 표시되면 안되겠죠. 그래서 모양을 숨겨야 합니다. 이 숨긴 본체 오브젝트 이미지는 사용하지 않고 복제본을 사용 할 꺼에요. 복제본을 사용하는 이유는 일정시간이 되면 소멸 시키기 위혀서 입니다. 무한으로 장애물 표시를 화면에 표시하면 안되겠죠. 일정 시간이 되면 자동으로 사라져야 하기 때문에 이 본체 이미지는 숨기고 복제본 이미지로 만들었다 삭제했다 이런식으로 해서 필요할 때만 생성하도록 하여 물체 그리기의 낭비를 줄입니다.

두번째 블록은 계속 반복하기가 있는데 만일 거리값이 100이하면은 100미만의 장애물만 감지하겠다는 의미가 100미만의 장애물리 감지되면 자신을 즉 모양숨기기를 했던 본체 원을 복제본을 만들겠다는 명령입니다. 복제본을 무한으로 연속 만들면 컴퓨터에 무리가 가기 때문에 0.5간격으로 체크해서 복제본을 만들게 됩니다.

세번째 블록은 복제본이 생성이 되면 수행되는 블록입니다. 장애물 감지된 위치에 복제본을 이동시켜야 하기 때문에 초기 지점인 좌표(0,-100)에거 장애물 감지한 거리값을 토대로 이동 방향으로 "거리x2"만큼 움직이기라는 블록으로 감지된 위치로 원을 표시합니다. 왜! 2를 곱했냐면 엔트리 창 화면의 100까지의 거리는 너무 짧아서 좀 더 크게 보기 위해서 2배 거리를 키워 화면상에 좀 크게 보이게 표시 했다고 생각하시면 됩니다. 여기서, 복제본을 이동시켰지만 원본 모양이 숨겨져 있기 때문에 숨겨진 복제본으로 이동하여 화면에 표시가 되지 않습니다. 그래서 모양보이기로 화면에 보여지게 하고 2초동안 장애물 표시를 하다가 해당 복제본이 삭제하기로 소멸시키게 표현 했네요.

이러헥 해서 초음파센서로 장애물이 감지되면 그 위치에 장애물 표시를 하고 표시된 마크는 2초후 소멸된다고 생각하시면 됩니다.

[결과]


2. 엔트리 초음파 레이더 회로도




3. 엔트리 블록 코딩



위 오브젝트 창에 전부 블록 코딩합니다.

[1단계] 초음파센서로 장애물 감지 블록 코딩


[2단계] 서보모터 회전과 붓으로 레이더 바 표시 블록 코딩


[3단계] 장애물 감지 시 장애물 표시 마크를 복제본을 생성하여 해당 위치에 장애물을 표시 했다가 2초 후 소멸 시키는 블록 코딩


4. 결과


한손에 폰을 들고 한돈에 초음파센서를 들고 찍다보니 영상이 많이 흔들리고 정확히 촬영이 되지 못했네요. 간단히 레이더 바로 현재의 각도를 표시하고 100 미만의 장애물 감지시 장애물 표시가 되게 나오도록 했네요. 참고로 서보모터의 회전은 위 블록코딩은 불안전 합니다. 그 이유는 지속적으로 회전을 시키라는 메시지를 아두이노에 보내고 아두이노는 그 메시지가 누족되기 때문입니다. 만약 딜레이 대기시간이 없다면 엔트리의 회전 레이더바가 180도 회전이 끝더라고 서보모터가 90도도 회전을 못하는고 회전이 누적되어 있게 됩니다. 180도를 왔다 갔다 한바퀴 돌고 난뒤에도 서보모터는 일정 각도뿐이 회전을 못하게 됩니다. 만약 중지 명령을 내리면 누적된 서보모터는 중지 명령이 떨어져도 누적된 회전만큼 계속 회전 동작을 수행합니다. 서보모터 따로 엔트리 따로 동작하는 결과가 발생하게 됩니다. 위 블록도 그냥 0.5초 대기를 줘서 서보모터의 회전각을 유사하게 맞춘 것이지 정확히 일치하지 않습니다. 단지 원리를 이해하기 위한 실험이여서 대충 블록 코딩을 했을 뿐이지 감안하시고 보시기 바랍니다.


노이즈 값도 장애물로 인식해서 장애물 표시가 뜨네요.

마무리


엔트리를 사용하면서 엔트리 따로 아두이노 따로 동작하는 현상이 발생하였습니다. 엔트리 블록 코딩은 엔트리 기준으로 동작하기 때문에 아두이노가 엔트리에 맞게 동작을 하는지 확인을 할 수 없습니다. 물론 엔트리가 중간의 특정핀에 전류가 공급되게 하고 그 전류를 다시 특정핀에서 확인하여 전류가 흐르는 상태인지 체크를 통해 중간에 체크 블록을 만들면 해결 되기는 합니다. 너무 복잡해지기 때문에 그 부분은 생략합니다.

아무튼 위 블록 코딩은 불안전환 코딩이고 엔트리가 무조건적인 명령문을 수행 할 뿐 아두이노의 서보모터 동작이 정상적으로 작동하는지 체크하지 못했기 때문에 졸작이라는 문구를 붙이게 되었네요. 그리고 초음파센서 거리 측정을 서보모터가 회전 했을 때 그 안에서 측정을 했어야 했는데 블록 코딩을 설명을 하기 위해서 분류했는데 그상태로 두고 말았네요. 완성하고 나니 이 부분이 참 아쉬운 부분이네요.


댓글()

[아두이노] 엔트리로 아두이노 제어

IOT/아두이노|2019. 10. 7. 09:00

[아두이노] 엔트리로 아두이노 제어



지난 시간까지 해서 S4A 스크래치와 ScratchX로 아두이노와 연결하여 제어를 해보았습니다. 오늘은 마지막으로 국산 엔트로로 아두이노를 연결하여 제어해 보는 시간을 갖도록 하겠습니다. 엔트리도 ScratchX 마찬가지로 온라인상에서 웹브라우저로 아두이노를 연결하여 제어를 하게 됩니다 ScratchX 플러그인을 설치하여 연결했다면 엔트리는 따로 PC에 연결 프로그램을 설치해야 연결 할 수 있습니다. 엔트리를 이용한 아두이노 제어는 의외로 간단하여 사용하기 편합니다.

이제부터 엔트리로 아두이노를 제어를 해봅시다.

1. 엔트리



엔트리 공식 사이트에 들어가사 작품만들기를 누르면 아래와 같이 기본 창이 뜹니다.


스크래치를 먼저 공부한 분들은 창이 처음에 좀 불편할 수 있고 블록들이 좀 더 많은데 스크래치는 간단히 최소 블록만 제공하는데 약간 엔트리는 약간 상황들을 더 추가한 블록들로 블록의 갯수가 좀 더 많습니다. 스크래치는 어떤 프로그램을 쓰더라고 기본베이스는 전부 동일합니다. 선택은 여러분들이 편한 걸 사용하시면 됩니다.

2. 엔트리에서 하드웨어 연결 프로그램 설치 및 연결


1) 하드웨어 연결 프로그램 설치


엔트리에 아두이노우노와 연결을 하기 위해서는 하드웨어 연결 프로그램을 설치해야 합니다.

하드웨어 블록은 누르면 아래와 같은 5개의 선택 항목이 나타납니다.


  • 연결 프로그램 다운로드 : 이 프로그램을 PC에 다운로드 받으시면 됩니다.
  • 연결 안내 다운로드 : 일반 PC 설치와 블루투스 설치에 관한 자세한 안내서입니다.
  • 엔트리 아두이노 소스 : 펌웨어 소스인데 안받으셔도 됩니다.
  • 하드웨어 연결하기 : 연결프로그램을 열고 연결하면 되기 때문에 구지 사용하지 않습니다.
  • 연결 프로그램 열기 : PC에 연결프로그램이 설치되어 있으면 이걸 클릭하면 연결프로그램이 실행 됩니다.

첫번째 연결 프로그램을 다운로드 받아서 설치하면 끝납니다.

2) 하드웨어 연결


연결 프로그램 열기를 클릭 하시면 PC에 설치된 연결 프로그램이 실행 되고 아래와 같은 창이 뜹니다.


위 그림을 보면 다양한 보드를 제공합니다. 아두이노 Uno 정품보드로 처음에 사용해 보세요. 그리고 초음파센서나 Servo모터를 사용할 경우 아두이노 Uno 확장모드를 사용하시면 됩니다.

아두이노 Uno 정품보드를 클릭을 해보세요. 아래와 같은 창으로 넘어갑니다.


현재 아두이노를 연결 안해서 연결중으로 표시되는 데 연결되면 연결성공이라고 뜹니다. 여기서, 처음 한번만 펌웨어 설치를 누르시면 됩니다. 연결이 제대로 안되면 드라이버 설치를 처음 한번 눌러서 설치하시면 됩니다. 참고로 이 창은 닫으시면 안되고 계속 열어놓으셔야 엔트리와 아두이노 간의 연결이 유지 됩니다.

3) 엔트리에서 아두이노가 인식 상태




위 그림처럼 "하드웨어가 연결되었습니다"라는 멘트가 뜨고 아두이노 Uno 정품보드 블록들이 생성 됩니다. 5개의 블록 뿐이 없습니다. 스크래치 블록과 5개의 블록을 가지고 블록코딩을 하시면 됩니다.

4) 엔트리에서 아두이노 Uno 정식보드 블록


5개의 블록들을 간단히 살펴보도록 하죠.ㅁ


analogRead(pin);

아날로그 입력으로 0~1023 사이의 값을 가져옵니다.



digitalRead(pin);

디지털 입력으로 해당핀에 0 or 1의값을 가져옵니다.



digitalWrite(pin, value)

디지털 출력으로 HIGH(켜기) or LOW(끄기)의 출력을 표현 하니다.



analogWrite(pin, value)

0~255사이의 아날로그 출력을 할 수 있습니다.



map(analogRead(pin), 0, 1023, 0, 100);

입력 숫자만 원하는 형태로 바꾸면 됩니다.

2. 엔트리와 아두이노 실험


실험은 아두이노 Uno 확장모드에서 이루어집니다. 아두이노 Uno 확장모드를 선택하고 펌웨어 설치를 다시 한번 해주세요.

그러면, 아래 그림처럼 블록이 몇개 더 생성 됩니다. 확장모드에서는 초음파센서와 서보모터와 피에저부조를 제어할 수 있는 블록이 추가되었네요.


1) 회로도





2) 블록 코딩



위 블록 코딩은 간단한 테스트 입니다.

첫번째 블록 코딩은 디지털 13번 핀을 1초 단위로 깜박이는 "Blink예제" 입니다.
두번째 블록 코딩은 거리라는 변수에 만들고 그 변수에 초음파센서값을 저장합니다. 그리고 엔트리봇이 1초동안 초음파센서로 측정한 거리 만큼 x좌표로 이동시키라는 블록 코딩입니다.

지난 시간에 다른 스크래치 프로그램에서 변수 선언에 배웠고 엔트리에서도 동일하니깐 설명은 생략합니다. 초음파센서는 아두이노에 연결하는 Trig, Echo핀만 주의해서 연결하고 해당 핀 값을 블록코딩에 정확히 기입하셔야 정확한 결과가 나옵니다.

3) 결과


영상을 보시면 왼쪽에 원이 있습니다. 이 원은 1초 단위로 색이 바뀝니다. 아두이노 Red LED와 같은 시간으로 동작합니다. 즉, 엔트리의 원와 아두이노 LED를 동일한 시간대에 동작을 수행합니다. 엔트리와 아두이노의 표현을 일치시키는 느낌이지요. 나중에 이런 느낌의 표현은 엔트리를 가지고 아두이노를 제어 할 때 많이 사용합니다.

그리고 거리는 제가 가지고 있는 초음파센서가 최대 145정도 거리 값이 나오더군요. 0~145사이를 앞에 장애물이 감지 될때 거리를 측정 할 수 있네요. 0~145사이의 x좌표로 엔트리봇이미지가 이동하게 됩니다. 별 의미 없고 초음파 센서로 엔트리봇을 움직이게 하는 간단한 테스트 입니다.


마무리


이렇게 해서 S4A 스크래치, ScratchX, 엔트리에서 아두이노를 연결하는 방법을 간단히 알아 보고 간단한 예제로 제어까지 하였습니다. 얼핏 보면은 스크래치로 아두이노 제어하는게 편해 보일꺼에요. 그냥 해당 블록을 배치하고 아두이노를 코딩하지 않고 쉽게 제어가 되기 때문에 구지 아두이노를 C언어를 공부하고 코딩 할 필요가 있을가 하고 생각하시는 분들도 있을 거에요. 그런데 실상은 전혀 그렇지 않습니다. 더 복잡하고 더 어렵습니다.

그 이유는 간단한 제어는 이미 블록이 제공 되기 때문에 그 블록을 사용하여 쉽게 아두이노 동작을 수행 했을 뿐 조금만 변화를 주면 블록 코딩은 너무 복잡해 집니다. 오늘 배운 아두이노 Uno 정품보드의 블록을 보시면 5개 블록만 제공합니다. 이 블록을 가지고 초음파센서와 Servo모터를 제어한다고 생각해 보세요. 답이 안보이죠. 다행히 아두이노 Uno 확장모드에서 해당 블록을 제공하기 때문에 쉽게 제어 할 수 있는 것 뿐이죠.

즉, 스크래치로 아두이노를 제어하기 위해서는 제어 할 블록이 없다면 그 블록은 여러분들이 만드셔야 합니다. 그리고 만들기 힘들 경우는 해당 펌웨어 소스에 가서 일부 소스 내용을 수정을 해야 합니다. 아니면 누군가 만들어 놓은 펌웨어 소스를 가져다가 사용해야 합니다. 스크래치로 수많은 부품을 제어를 할 때 쉽게 딱 만든 블록으로 코딩하기 힘듭니다. 오픈 블록이나 펌웨어 소스를 쉽게 찾을 수 없고 찾는 다 해도 단적인 제어만 가능하고요 여러 부품들을 연계해서 제어 한다면 무지 힘들꺼에요. 어느 순간이 되면 그냥 프로그램언어를 배우고 함수 단위 코딩을 하는게 더 쉽다는 것을 느끼게 될 꺼에요.

C언어 기본 문법을 배우고 오픈 라이브러리 함수들을 사용하여 함수 단위로 C언어 코딩을 하는게 나을 거라 생각 됩니다. 처음에는 C문법을 배우는게 좀 버거울 수 있지만 기본 개념만 잡아 놓으면 오히려 스크래치를 제어하는 것보다 쉽게 다양한 전자부품을 제어 할 수 있을 거에요. 스크래치는 그냥 어린아이들에게 전자 공부를 쉽게 하기 위한 도구로만 생각하시면 됩니다.

그리고, 스크래치와 아두이노 연계는 프로세싱과 아두이노 연계과 유사힙니다. 프로그램 언어에 관심이 있으면 처음부터 프로세싱과 아두이노로 나아가는 걸 추천 드려요. 처음에는 프로세싱와 아두이노 연계 표현이 어렵지만 나중에 어느정도 궤도에 오르시면 오히려 자유로운 표현을 쉽게 할 수 있어 편하게 느끼실 꺼에요. 참고로, 프로세싱과 순수 아두이노 소스는 오히려 오픈 소스가 더 많고 쉽게 찾을 수 있기 때문에 프로그램 언어 독해력만 있으면 충분히 독학으로 공부 할 수 있으니깐 한번 도전해 보세요.


댓글()