본문 바로가기
PLC 자동제어 학습/아두이노 보드 수업

비동기식 카운터를 가지고서, 아두이노 보드와 PC의 연결 part1

by 인터넷떠돌이 2017. 11. 6.
반응형

안녕하세요?


가지가지 일이 있어서 포스팅을 제때에 올리지 못하고, 지난주에 했던 일을 이제서야 올리게 되었습니다. 아무튼 이번 수업시간에서는 그동안 아두이노 보드를 가지고서 독학을 할 때는 3개월간 했어도 전혀 진도가 나가지 않았던 것을 7시간 수업 안에 진도가 나간 것을 포스팅 하고자 합니다.



먼저 Proteus상에서 pulse를 주는 것을 만들기 시작합니다. 여기서 나오는 High voltage는 일단 5V로 설정을 하도록 합니다. 그렇지 않으면 전압이 너무 낮아서 아무런 변화도 안 보입니다.



위 스크린샷에 나오는 회로도는 비동기식 카운터가 되는 분주회로 중에서 4분주의 모습입니다. 여기서 비동기식이라는 말의 뜻은 간단하게 순차적으로 동작을 한다는 의미이며, 반대로 동기식 카운터라고 하면 모두 일시에 동작을 맞춰서 한다는 의미가 됩니다.



비록 여기 스크린샷에서는 LED에 불이 동시에 들어온 것처럼 보이기는 하지만, 실제로는 두 LED의 깜빡이는 빈도에 차이가 있다는 것을 지난번 포스팅에서도 언급을 하였습니다만, 두번째 LED가 2배 느린 빈도로 깜빡이게 됩니다.



이번에는 16분주회로를 만들어서 비동기식 카운터로 만들어 보았습니다.



하다보니 Hz를 너무 약하게 지정해서 변화가 너무 없기에, 10Hz로 올리도록 하기도 했습니다.



이제서야 어느정도 비동기식 카운터 16분주 회로가 제대로 작동하는 것을 볼 수 있었습니다.



그런데 여기서 NAND 게이트를 쓰면, 재미있게도 비동기식 16분주 카운터를 10진수 카운터로 바꿀 수 있다고 합니다. 이게 무슨 말이냐 하면, 지금까지는 그냥 LED나 깜빡이는 용도로만 생각했지만, 사실은 저 4개의 LED가 계속 깜빡이는 경우가 모두 달라서, 실제로는 16진수의 수가 나온다고 합니다. 그래서 이걸 FND와 연결하면 16진수의 수를 표현할 수 있는 것입니다.


 

 4번LED(Qd)

 3번LED(QC)

2번LED(QB) 

1번LED(QA) 

 0

0

0

0

0

 1

0

0

0

1

 2

0

0

1

0

 3

0

0

1

1

 4

0

1

0

0

 5

0

1

0

1

 6

0

1

1

0

 7

0

1

1

1

 8

1

0

0

0

 9

1

0

0

1

 10

1

0

1

0

 11

1

0

1

1

 12

1

1

0

0

 13

1

1

0

1

 14

1

1

1

0

 15

1

1

1

1


위 도표를 보시면, 어째서 16분주 회로가 16진수의 수를 만들어 낼 수 있으며, 이를 10진수의 카운터로 바꿀 수 있는 방법을 소개하고 있습니다. 자세히 보면, 10진수가 되려면 10이 되는 시점에서 0으로 수가 넘어가야 합니다. 그래서 도표를 자세히 보시면 4번LED인 QD와 2번LED인 QB만이 1인 상태에서 도로 초기화를 시키면 10진수 카운터가 완성이 됩니다.



그래서 J-K F/F회로를 만들어 주는 IC칩인 74LS73에서는 위 그림에 R이라는 부분이 있는데, 여기에 0이 들어오면-자세히 보면 원이 그려져서 NOT라고 하는데, 이런 부분은 0이 들어오면 반응을 하는 부분입니다. 이 부분에 0이라는 신호가 들어오면 칩이 완전히 초기화 됩니다. 그 원리를 이용해서 위 스크린샷은 Proteus상에서 16진수 카운터를 10진수 카운터로 바꾼 것입니다.



하지만, 이렇게 J-K Flip-Flop 칩을 4개씩 이용해서 만들면 실제로는 굉장히 복잡해서 작동시키기 어렵습니다. 그래서 하는 수 없이, 전용 IC칩이 있는데, 이를 사용해야 합니다.


10진수 - 74LS90

12진수 - 74LS92

16진수 - 74LS93


그래서 위 스크린샷은 16진수의 IC칩을 가지고서 16진 카운터를 만든 회로도입니다. 이제 이를 10진수의 카운터로 만들기 위해서는 해야 할 일은 딱 하나 입니다.



74LS93칩의 R0(1)과 R0(2)가 있는데, 이 두 군데 다 신호가 들어오게 되면 리셋이 되어서 도로 0으로 돌아가게 됩니다. 그것을 이용해서 QD와 QB에 해당하는 핀을 연결, 둘다 신호가 들어오는 경우가 생기면 그 즉시 리셋이 되어 0으로 돌아가게 되는 것입니다.




이와 같은 작용이 어째서 가능한 것인지 의문이 드실 건데요, 그 이유는 간단하게도, Flip-Flop회로가 일종의 1비트 기억소자라고 합니다.그래서 이런 작용이 가능하다고 합니다.



그리고 여기서 74LS93의 중요한 점이 하나 나오게 됩니다. 우선 전용 칩을 쓰게 되면, 반드시 12번 핀에서 나오는 신호는 LED로 가는 것과 동시에 74LS93의 1번 핀으로 연결이 되어야 합니다. 그래야 제대로 작동을 하는 것으로 나오게 됩니다. 이제 Proteus상에서 연습을 했으니, 일단 실습으로 직접 회로를 연결해 보아야 하는데, 그러기 위해서 설치해야 하는 프로그램이 있습니다.



일단 구번전의 아두이노 통합 개발환경인 IDE를 다운로드 받도록 합니다. 최신버젼을 써도 크게 상관이 없으리라 생각이 들지만, 오류가 적고, 작동이 안정적이라고 하니, 일단은 구버젼을 쓰는 것으로 했습니다.



그리고 나서 제어판을 열어서 장치관리자에 들어가면, 기타장치라는 항목에 USB2.0-Serial이라는 것이 보이고 있습니다. 이게 바로 USB를 통해서 연결이 된 아두이노 우노 보드인데, 이게 오리지널과 호환품이라고 해서 2종류의 버젼이 있습니다. PC에서 인식되는 방법의 차이가 있을 지언정, 성능에는 차이가 없다고 합니다.


일단 이렇게 귀찮아 보이는 과정을 거쳐야 하는 이유로는 라즈베리 파이라는 것과는 다르게 아두이노에는 운영체제가 깔리지 않는 특징이 있다고 합니다. 그래서 이러한 과정을 거쳐서 PC에서 프로그램을 짜서 아두이노 보드에 업로드를 시켜야 한다는 차이가 있습니다.



일단 좌클릭을 해서 속성에 들어가도록 합니다.



일단 드라이버 업데이트를 선택해서 하드에 미리 받아놓은 아두이노 보드의 드라이브를 설치하도록 합니다.



컴퓨터에서 직접 찾아보기를 해서




이렇게 설치를 하고 나서도, 아두이노 보드가 오리지널, 그러니까 이탈리아 버젼이 아니라, 중국이나 이런데서 만든 호환성이 있는 버젼으로 만든 것이기 때문에, 그러한 버젼은 이러한 방법으로는 인식이 안된다고 합니다. 하는 수 없이 여기서는 추가로 해줘야 하는 것이 있다고 합니다.



제 경우에는 학원에서 제공해준 CH341이라는 것을 설치하도록 했습니다.



일단 저는 이게 정확히 무엇인지는 모릅니다. 다만 듣자니 PLC 보드를 인식하기 위해서도 종종 사용이 된다고 하니, 나중에 한번 검색을 해봐도 괜찮을 것이라는 생각이 듭니다.




그러한 과정을 거치고 나서야 제어판의 장치관리자에서 포트라는 것을 볼 수 있었습니다. 여기서 표시가 되어 있는 COM3라는 것은 언제나 같은 게 아니라 USB에 아두이노 보드를 연결하고 나서, 항상 변하기 때문에 이를 장치 관리자에서 확인해야 할 필요성이 있습니다. 이 점에서 예전에 배웠는 3D 프린터도 이러한 점이 있었기 때문에, 언제나 이를 확인해야 하는 것은 비슷했습니다.



이제서야 arduino.exe라는 것을 실행시켜서 본격적인 코딩에 들어가 보도록 하겠습니다.



먼저 시리얼 포트 설정인데, 이게 방금 장치관리자에서 봤던 것과 일치해야 합니다. 안 그러면 나중에 기껏 짜놓은 프로그램이 제대로 아두이노에 들어가지 않는 것을 볼 수 있습니다.



그리고 나서 아두이노 우노라고 보드를 설정하는 작업을 하도록 합니다.



기본적으로 위 스크린샷에 나오는 것처럼 지정을 합니다. 마치 유니티5의 코딩하고 비슷한데, 듣자니 아두이노는 C언어를 사용한다고 합니다. 그래서 어느정도 비슷한 것이 나오는 것 아닌가 합니다. 일단 setup() 이라는 함수안에 들어간 내용은 딱 1번만 실행이 되고, loop()안에 들어간 내용은 계속해서 실행이 된다고 합니다. 


그래서 setup에서 몇번 핀이 입출력을 담당하는 지를 설정하도록 하고, 그 다음에는 loop에서 반복적으로 실행할 내용을 담당하는 것으로 하는 것입니다.



먼저 위 스크린샷에서 보이는 것처럼 아두이노 우노의 2번 핀을 출력으로 설정을 하도록 하는 것입니다. setup에만 설정을 해서, 딱 한번만 지정이 되면 되는 것입니다. 함수는 pinMode()라는 함수를 사용하며, 여기서는 비주얼 베이직과는 다르게 대소문자를 구분하니, 이거 조심해야 합니다.



다음에는 digtalWrite라는 함수를 사용해서 2번 핀의 출력을 5V 나오도록 HIGH라고 설정을 하도록 합니다.



위 그림에서 하이라이트 된 좌측 상단의 체크 표시는 이 코딩에 문법적인 에러가 있는지 여부를 살펴보는 역할을 하는 것입니다. 여기서 에러가 발생하지 않는다면, 아두이노 우노에 업로드를 해도 된다는 것입니다.



그리고 나서 체크표시 옆에 있는 화살표를 누르면 아두이노 보드로 업로드가 되는 것을 볼 수 있습니다. 이렇게 하는 것으로 2번 핀을 이용해서 5V의 출력을 낼 수 있게 된느 것입니다.



HIGH로 있던걸 LOW로 바꾸면 0V가 되어서 아무런 전력이 없다. 즉, 꺼진 상태가 되도록 하는 것입니다.



일단 이렇게 코딩을 해서 브래드 보드에 연결이 된 LED를 깜빡이도록 했지만, 전혀 눈에는 아무것도 안 들어옵니다.



그래서 하는 수 없이 delay()라는 함수를 이용해야 하는데, 여기서는 밀리세컨드 단위를 사용하니, 1000이 1초 입니다. 이제 이렇게 아두이노 우노에 업로드를 해서, 점멸하는 기능을 줄 수 있는 것입니다.




직접 브래드 보드에 연결해서 어떻게 작동을 하는 것을 확인한 모습입니다. 이렇게 해서, 이래저래 어떻게 하는 데는 성공했고, 이어서 수업의 내용도 있지만, 내용이 너무 길어져서 여기서 끊어야만 겠습니다. 조만간에 나머지 부분에 대해서도 포스팅을 올리도록 하겠습니다.

반응형