안녕하세요?


하다보니 드디어 지난주의 수요일 수업 내용을 정리해야 하는 단계에 왔는데, 이번에는 아두이노 보드를 이용해서 이 스탭모터만을 제어하는 것이 아니라, 아날로그 입력과 출력을 다루어 보았고, 이를 더 응용해서 센서가 감지하는 값에 따라서 스탭모터의 회전 속도를 제어하는 것 까지 실습하였습니다.



지난번에도 보여드린 적이 있는 것처럼 먼저 스탭모터를 제어하기 위해서 L293이라는 IC칩과 스탭모터를 연결 하도록 합니다.


가장 먼저 할일은 위 그림에서 나와 있는 것처럼 가속 운동과 감속 운동을 추가하는 것입니다. 1개의 회전 cycle안에 최대 속도까지 가속하고, 1개의 회전 cycle안에 0까지 감속을 하는 것이 목적인데, 일단 위 그림에서 나오는 것처럼 최저속도를 16Hz로 잡은 다음, 이 속도를 맞추는 delay()함수값에서 서서히 2상 여자운전의 4펄스 사이클 하나 돌때마다. 딜레이를 의미하는 값을 빼주기만 하면 됩니다.


이게 가능한 이유가 왜냐하면 최대속도가 100Hz로 delay()함수의 값이 10인데, 그냥 60에서 50만 빼주면 되는 것입니다. 그런데 공교롭게도 1사이클이 끝나기 위해서는 그냥 j의 값이 50이 되어야 하기 때문에 이런 계산이 가능한 것입니다. 감속운전의 경우에는 회전속도에 관계하는 delay()값을 증가시키기만 하면 되는데, 최저 속도 16Hz에 해당하는 delay()값이 60이라서 그냥 j의 값을 더해주기만 하면 되는 것입니다.



먼저 위 스크린샷과 같이 아두이노 IDE툴에서 코딩을 하도록 합니다. 이렇게 코딩이 완료가 되고 나면, 이제 실제로 작동을 하는지를 알아볼 필요가 있습니다.



실제로 제대로 작동을 하는 것까지 확인을 했습니다. 처음 한바퀴때는 가속운동을 하다가, 완전히 가속이 된 다음에는 3바퀴 회전을 한 다음에, 다시 1바퀴 감속운동을 하는 것을 볼 수 있습니다.




그리고 다음으로는 가변-볼륨 저항을 이용해서 LED의 밝기를 조절하는 실습을 하기 위해서 일단 아두이노 보드와 브래드 보드의 결선을 다르게 했습니다. 가변/볼륨 저항에 대해서는 일단 아래의 포스팅을 참조해 주시기 바랍니다.


링크 : http://netpilgrim.tistory.com/432



먼저 위에서 처럼 코딩을 했습니다. 그런데 여기서 중요한 것이 빠져서 값이 제대로 반영이 안 되었는데....



바로 map()라는 함수입니다. 이 함수는 바로 스케일이 다른 값을 스케일이 같도록 맞추어 주는데 사용하는 방법은 아래의 글과 같습니다.


map=(변수,범위1의 최소값,범위1의 최대값,범위2의 최소값, 범위2의 최대값);


이렇게 하면, 골치아프게 일일히 계산할 필요없이, 그냥 범위 2개만 지정해 주면 스케일 값을 알아서 맞춰주기 때문에 상당히 편합니다.


그래서 실제로 LED의 밝기가 달라지는 지를 알아보고자 합니다. 위 동영상을 보시면 실제로 달라지는 것을 보실 수 있으실 것입니다. 그리고 특이할 점으로는 아두이노 우노보드에서는 아날로그 출력이 가능한 핀은 ~무늬 표시가 있기 때문에 이를 조심해서 작업해야 합니다.



그리고 여기서 상당한 의문이 하나 나올 수 있는것이, 일단 아날로그 출력을 했는데, 왜 최소값에서도 LED에 불이 들어오는 문제가 발생 하느냐 하는 것입니다. 실제로는 아두이노는 아날로그 출력을 할 수 없고, 엄밀히 말하면 PMW출력이라고 해서, 0~5V를 순간적으로 때리는데, 문제는 PMW출력의 값이 커지면 커질수록 때리는 빈도가 많아 진다는 것입니다.


그래서 실제로 아날로그 출력이 아니라, 비슷한 PMW출력이라는 것에 유의를 해야만 합니다. 



다음 단계로는 이제 조이스틱을 연결해서 아날로그 입력의 값이 바뀌는 것을 살펴볼 차례입니다. 일단 X축 좌표의 값은 A0핀에 연결이 되도록 하고, Y축의 값은 A1핀에서 입력을 받도록 결선을 합니다. 그리고 조이스틱이 중앙에 있을 때는 정확한 값을 모르지만, 최대한으로 이동을 하면 위쪽과 왼쪽으로 갈수록 최소값인 0이 입력이 되고, 아랫쪽과 오른쪽으로 가면 아두이노 입력의 최대값인 1023이 됩니다.




여기서도 위와 같이 코딩을 하고, map()함수를 이용해서 0~1023의 값 범위를 0~255값의 번위로 바꾸어 주도록 합니다. 왜 이렇게 PMW출력-아두이노 우노에서는 주로 아날로그 출력의 대용으로 받아들여지는 이 출력이 왜 입력과는 다르게 255가 한계냐 하면, 입력은 2의 10승으로 연결이 되기 때문에, 1024가 최대값이 될 수 있는데, PMW출력/아날로그 출력은 2의 8승이기 때문에 최대가 255가 되는 것입니다.



일단 시리얼 모니터 상에서는 조이스틱을 움직이는 만큼 값이 제대로 변하는 것을 볼 수 있습니다.



이게 제대로 회로를 결선해서 만들어 진 것이라는 것을 일단 사진을 찍어서 증명을 하며....



조이스틱이 실제로 X축 좌표의 값을 변화시키는 것에 따라서 제대로 LED의 밝기가 변하는 것을 볼 수 있습니다. 이제 이렇게 아날로그 값의 입력과 이에 따라서 출력되는 PMW값의 제어가 되었으니, 이를 스탭모터의 제어에 한번 응용할 차례가 되어 옵니다.



먼저 가변/볼륨 저항의 값이 변하는 것에 따라서-즉, 아날로그 입력의 값이 달라지는 것에 따라서 스탭모터의 회전수가 커지도록 했습니다. 그래서 loop()문에 보면, delay()함수에 들어갈 값도 달라지는 것을 보실 수 있으실 것입니다. 하지만 위 코딩은 한가지 문제가 있었으니, 모터의 회전이 1바퀴가 다 끝나기 전까지는 어떻게 해도 스탭모터의 회전 주파수를 변경할 수 없었습니다.



위 스크린샷에서 붉은색 밑줄을 친 곳처럼 수정을 해주어야 했습니다. 그러면 이제 볼륨저항의 값을 바꾸는 대로 그 즉시, 스탭모터의 회전수가 달라지는 것을 볼 수 있었습니다.



실제로 스탭모터의 회전 속도가 달라지는 것을 위 동영상을 보시면 알 수 있습니다. 이제 볼륨저항을 했으니, 다음으로는 광 센서를 이용, 센서에 감지되는 값이 변하는 것에 따라서, 스탭모터의 회전 속도가 달라지도록 조절하는 회로를 만들 차례입니다.



이전에 나왔던 것처럼, 광센서를 브래드 보드에 결선을 하였습니다. 그리고 나서 이제 코딩을 시작합니다.



다만 여기서 하나 문제인 것은, 바로 광센서가 그늘에 가려졌을 경우와 빛이 비추어질 경우에 어떻게 아날로그 입력의 값이 달라지는 것인지를 알아내는 것이였습니다. 이것만 어떻게 되면 나머지는 간단했습니다.



실제로 이 값을 알아내는 것은 시행착오 노가다에 가까웠습니다. 아무튼 이렇게라도 해서, 값을 알아냈으니, 이제 map()함수로 스케일만 변경하면 큰 문제가 없습니다.



이렇게 해서 수요일에 있었던 수업의 내용을 다 정리하는데 성공했습니다. 빛을 비추자, 스탭모터의 회전 속도가 빨라지는 것을 보실 수 있습니다. 이렇게 해서 스탭모터의 건은 해결을 했는데, 매번 수요일 수업을 정리-거의 아두이노 보드의 수업을 정리하면서 느끼는 것이지만, 이게 가장 정리하기 어렵다는 생각이 듭니다. 그런데 이걸 독학으로 여기까지 가려고 하면....... 난이도는 얼마나 올라갈지 상상하기 어렵습니다.



+ Recent posts

티스토리 툴바