좌충우돌 로봇 만들기 3


집안에 우환이 좀 있어 이번 3번 째 이야기는 하루 늦었습니다.
오늘은 자세한 내용보다는 조금은 일반적인 이야기를 좀 하고 현재까지 진행된
2관절 4족 보행 로봇은 전진 동작 동영상으로 마무리 하겠습니다.

딱히 도움이 될만한 내용은 없을 듯하니 동영상이나 잠시 감상하시길^^
(주의 : 동영상 보다가 답답해서 사망하셔도 책임은 못집니다…-.-)


3주간의 정리


3주 정도 주말 작업을 진행해오면서 참으로 재미있었다.
처음 접해보는 아두이노, 뜬금없는 4족 보행 로봇에 도전,
그리고 좌충우돌…


일단 3주동안 만들어낸 2과절 4족보행 로봇의 외관은 아래 사진과 같다.
지난 번 제 1관절 4개를 테스트할 때 사용했던 나무젓가락을 재활용하여 1관절용 모터와
2관절용 모터를 연결하는데 사용하였다. 아무래도 이놈은 완성되면 중국집 배달용으로
방향을 잡아야겠다(하지만 마지막 동영상에서 보다시피 속도가…ㅠ.ㅠ).


그래도 일단 제법 그럴싸한 이름을 하나 붙여줬다.
SEW-Prototype. SEW는 그 자체로 ‘꿰메다’, ‘깁다’ 라는 의미가 있다.
그렇다. 사진에서 보다시피 누덕누덕 기워서 만든 로봇이다.
하지만 이름을 풀어쓰면 Save the Earth from Waste
즉, 쓰레기로부터 지구를 구하자라는 거창한 의미가 있다.
(이런데서 문돌이의 재능이 발휘된다…-.-)
하지만 고작 나무젓가락과 폐 박스를 재활용한 정도…-.- 



그리고 오늘 간단한 코딩을 통해 드디어 앞으로 전진하는 모습을 볼 수 있었다.
나름 감격이 아닐 수 없다.


하지만…문돌이의 한계에 부딪치다.


물론 아두이노는 취미생활로 하는 것이지만 내 본업은 프로그래머다.
어찌되었건 내가 접하는 것들은 기술이요, 과학이다.
이말인 즉슨 대충 감으로 때려 잡아서 하면 안된다는 말이다.
하지만 아마도 인문계열 전공을 한 개발자들에게서 흔히 보이는 모습이 바로
이런 모습이 아닐까 한다. 


철저한 실험과 테스트를 통해 도출한 정확한 결과가 아닌
그간의 경험과 실무에서 습득된 직관을 통해 개발을 해나가는 것!
물론 국내에서 진행되는 대부분의 프로젝트에서는 이런 직관을 통한 개발도
큰 무리 없이 적응 가능하다.


하지만 자율주행 자동차와 같이 사람의 목숨을 위협할 수도 있는 분야의 개발이라면
결코 그렇게 해서는 안될 것이다.


물론 이런 성향은 문돌이와 공돌이의 차이보다는 개인 성향의 차이일 수도 있다…


어쨌든…
나의 문돌이적 성향이 여실히 드러나는 부분들을 한 번 신랄하게 까발려보자.


우선 로봇의 본체…



제 1관절용 서보모터와 제 2관절용 서보모터를 연결하고나니 두 모터의 축이
바깥으로 향하게 되어버렸다. 물리학을 잘 몰라 설명은 어렵지만 이렇게 되면
제 1관절의 축이 몸통과 연결되어야 하고 그 축에 받는 힘이 커져 내구도가 약한 경우
모터든 몸통이든 쉽게 파손될 우려가 있다. 


이런 생각을 하고 유튜브에서 동영상을 보다보니 역시나 대부분 구조가 모터 몸통이 
로봇 본체에 붙고 축은 바깥으로 향해 2과절의 모터 몸통 또는 축쪽으로 연결이 되는 
형태였다. 이렇게 되어야만 몸통과 제 2과절 사이에서 힘이 적절히 분배 될 것 같다. 


아래 그림에서 1번과 2번은 분명 1번쪽이 빨간 원 안에 있는 축에 힘이 많이 걸릴 것이다.



뿐만아니라 각 관절들의 각도라든지 부분 부분 형태에 의한 장애 등을 판단해야 한다.
보면 위의 사진에는 SEW-Prototype의 다리가 그냥 편면 사각형인데, 동영상을 보면
하단부를 비스듬하게 깎아냈다. 그냥 사각형인 상태에서는 다리를 들어올려도 사각형의
모서리가 바닥에 다아 마찰을 일으키면서 제대로 전진을 못하였다. 그래서 다리를
들었을 때 마찰이 생기지 않도록 잘라내버렸다.


다음은 소프트웨어…


개발자들이 시스템을 개발할 때 많이 간과하는 것 중 하나가 바로 성공 케이스,
정상적인 작동에 많이 집중한다는 것이다. 뭐 목적이 그것이니 그리 뭐라 할 것은 아니지만
정작 중요한 것은 예기치 못한 오작동에 대한 대응이다. 그런데 로봇을 만들다보니
이런 예기치 못한 오류(혹은 오류는 아니지만 제어가 안되는 상태)에 대한 처리에
감이 오질 않는다.


예를들어 한참 잘 돌아가다가 배터리가 소모되어 이상한 위치에서 모터가 정지되는 경우
전원이 공극되기 시작한 이후 그 다음 동작들을 어떻게 처리할까 같은 문제다.
물론 만고의 진리가 있다. 바로 리셋이다. 무조건 초기 상태로 돌려놓고 다시 시작하면
된다. 하지만 뭔가 뒤끝이 찜찜하다.


바로 이러한 이유로 소프트웨어를 개발할 때는 개발자가 설계한 수치보다는 시스템 자체가
리턴해주는 상태 값이 더 중요하다. 시스템 자체의 상태가 시스템의 다음 동작을
결정하는 근거가 되어야 할 것이다.


그런 측면에서 현재 SEW-Prototype이 앞으로 가고는 있지만 언제 이상한
동작(이상한 동작이라고 뭐 헤드스핀을 하거나 그러진 않겠지만…)을 보일지 모른다.
이후 작업은 아마도 이 부분을 개발하는데 거의 모든 시간을 투자하게 될 것 같다.


다시 시작!


앞서 말했듯이 지금까지의 작업은 그냥 아이들 레고놀이에 불과하다.
이제부터가 진짜 작업이 아닌가 싶다. 그리고 내가 해낼 수 있을까도 의문이다.
아직 전진, 그것도 하드코딩으로 된 프로그램을 통한 전진밖에는 못한다.
어떻게 해야 서보 모터 상태를 통한 동작 제어가 가능할지 고민을 좀 해봐야겠다.


마지막으로 인류 최초의 로봇이 이러지 않았을까 싶을 정도로 굼뜬 동작이지만
나름 육중한 맛을 풍기는 SEW-Prototype의 전진 모습이다.
배경음으로 들리는 나의 사적인 단편들은 보너스이니 그냥 들어주시길…-.-



블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^


좌충우돌 로봇 만들기 2


일단 무작정 시작한 로봇 만들기의 시작은 그리 나쁘지 않았다.
블루투스 통신도 성공을 했고, 4개의 서보모터를 외부 전원을 이용하여 구동하는 것도
성공을 했고, 아이폰 앱을 통해 서보모터를 간단하게나마 제어하는 것도 성공을 했다.
그래도 이정도 하고 나니 할만 하겠다는 생각도 든다.


이제 본격적인 작업에 들어가기 위해 몇가지 준비가 필요하다.

  1. 보드 교체 : 총 12개의 관절이 필요하므로 PWM 핀을 여유있게 사용 가능한 아두이노 MEGA로 보드 교체
  2. 로봇 프레임 제작 : 일단은 집안에서 쉽게 구할 수 있는 재료들을 이용할 생각인데…이 글 중간에 언급하겠지만 이게 의외로 쉽지 않다…ㅠ.ㅠ
  3. 응용 프로토콜 설계
  4. 4족 보행 걸음 걸이에 대한 분석 : 이거…참 어렵다. Youtube 동영상을 보니 몇가지 패턴이 보이는데 어떤 식으로 구현해야 할지가 살짝 어려웠다.


일단 오늘의 목표는 위 3가지이다.
그럼 구체적으로 들어가보자.


아두이노 메가로 보드 교체하기


일단 지난 시간 까지의 테스트 진행에는 아두이노 나노를 사용하였다. PWM 핀이 
총 6개이므로 서보모터 4개를 테스트하는데는 무리가 없었다. 하지만 이제 본격적으로
작업을 시작하면서 점차 모터 수를 늘려야 하기에 보드를 메가로 바꾸었다.


아두이노 메가의 핀 배치는 아래 이미지를 참고하시라



하지만 문돌이가 하는데 어디 순순하게 되는게 있으랴…-.-
우선 블루투스(HM-10) 연결에서부터 문제가 생겼다.
아두이노 나노에서 쓰던 스케치 소스를 그대로 이용하여 아두이노 메가의 D2에 TX룰,
D3애 RX를 연결하였다. 그리고 테스트를 하는데…블루투스에서 아이폰 앱으로는
정상적으로 데이터 전송이 되는데 폰에서 HM-10으로의 전송이 안되는 것이었다.


메가가 맛이 갔나? HM-10이 맛이 갔나?
우선 다시 나노를 이용하여 테스트 해보았다. 정상 작동한다.
그럼 메가가 맛이 갔나?
구글링 결과 역시 무지의 소치였다.
다음 유의 사항을 명심하자


유의사항 1.

아두이노 우노/나노의 경우 하드웨어 Serial은 1개 뿐으로 이 것은 주로
하드웨어간 통신(주로 PC와의 USB 연결 등)에 쓰인다. 따라서 가급적면
다른 Serial 통신을 위해서는 SoftwareSerial을 사용한다. 하지만
아두이노 메가 2560의 경우 하드웨어 Serial이 모두 4개로 하드웨어간
통신을 위해 1개를 남겨 두더라도 모두 3개의 추가 Serial을 사용 가능하다.


즉, 아두이노 나노에서 테스트했던 코드는 SoftwareSerial을 이용하여 D2, D3 핀을
이용하는 것이었는데 아우이노 메가에서는 이게 정상 작동하지 않았던 것이다.
결국 하드웨어 시리얼 중 하나인 D14(TX3), D15(RX3)로 연결하여 성공하였다.


참고로 스케치 상에서 TX0과 RX0은 Serial로 TX1과 RX1은 Serial1로 TX2와 RX2는
Serial2로 TX3과 RX3은 Serial3으로 사용하면 된다.


그리고 아두이노 메가의 어떤 핀들이 PWM핀인지 몰라 검색하던 중 위의 이미지를
찾았다. 보시다시피 2~13은 모두 PWM 출력이 가능하며 추가로 D44, D45, D46 핀이
PWM 핀으로 총 15개를 PWM으로 사용 가능하다.

최종 연결 형태는 다음과 같다.


로봇 프레임 제작


일단 인터넷에 보면 너무나 멋진 4 또는 6족 로봇들이 검색된다.
특히 마음에 들었던 것은 종이로 프레임을 만든 ZURI라는 프로젝트였다.
아래 이미지에서 보다시피 마치 공각기동대에 나왔던 로봇 그 느낌이다.


하지만 종이라고 만만하랴…처음에 하드보드지를 이용하여 해보려고 했으나
하드보드는 워낙 자르기가 어렵고 또 두껍다보니 접을 경우 모서리가 갈라지기도 하여
아무래도 어려울 것 같았다. 그렇다고 프레임에 돈을 투자하기도 아깝고…일단
방향은 폐 페트병이나 캔, 스티로폼 등 재활용 가능한 재로를 목표로 하였다.


맨 아래 결과 동영상에서 보다시피 일단 몸통은 공CD 케이스를 선택하였다.
저 밑판이 생각보다 두꺼워서 모터 고정시킬 나사 구명 뚫느라 고생 좀 했다.


결국은 나사보다 조금 가능 간이 드라이버를 불에 지져 구멍을 뚫었다.


이후 숙제는 제 2관절을 어떻게 붙일 것인지 그리고 2관절과 3관절 사이, 3관절
끝의 다리를 어떻게 만들 것인지가 문제다…프레임 만들다 시간 다보내게 생겼다.
배보다 배꼽이 더 큰…


응용 프로토콜 설계

이건 뭐 설계라고 하기엔 뭐하고…
암튼 응용 프로토콜을 나름 만들어 사용하기로 했다. ASCII 코드를 기준으로 하였다. 
간단하게 아래 이미지 참고하시길…

간단하게 아래 이미지 참고하시길…


4족 보행 걸음걸이 분석


역시나 가장 어려운 부분이 아닌가 싶다.
게다가 나는 이제 관절 1개를 붙인 상태이다보니 실제로 전진도 못하고 2번째 관절까지
고려해야 하는데 이 작업을 동영상을 토대로 상상을 하면서 할 수밖에 없었다.
결국 아직은 미완의 작업이다.


Youtube를 통해 검색을 해보면 대체로 3가지 패턴이 보인다.

  1. 다리 4개를 각각 대각선 방향으로 순차적으로 움직이면서 전진
    [https://youtu.be/PL4174oBPTs]
  2. 대각선상의 다리 2개씩을 동시에 번갈아가면서 움직임
    https://youtu.be/Dfke2byJknk
  3. 같은쪽 앞뒤 다리를 순차적으로 움직인 후 전체 1관절을 돌려 몸을 앞으로 밀듯이 전진하는 움직임
    https://youtu.be/87nNW4DgTBc


하지만 동영상을 보면 대체로 하나의 로봇에 2가지 이상의 움직임을 구현하는 경우가
대부분이다.


어쨌든 2번이 조금 쉬울것 같다는 판단에 2번을 우선 구현해 보기로 하고 작업을 하였다.
계획은 대각선 상의 2 다리가 2관절을 들어올려 앞으로 내딛는 동안 바닥에 닿은 나머지
대각선상의 2개의 다리는 1관절만 몸을 앞으로 미는 방식으로 전진하는 것이다.


일단 오늘은 여기까지로 작업 결과는 아래와 같다. 조금 더 부드러운 동작을 표현하고 싶어


for문을 통해 서보모터의 각도를 증감하였다. (나무젓가락 다리가 참 애틋해 보인다...ㅠ.ㅠ)

다음주 부터가 문제인데…도대체 다리를 어떻게 이어붙여야 할지…ㅠ.ㅠ
한 주 동안 열심히 고민을 해봐야겠다.



최종 소스 링크

https://github.com/mazdah/BluetoothController

블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^


좌충우돌 로봇 만들기!


이제 막 걸음마를 뗐는데…
벌써 수퍼맨이 되어 날아가려고 한다고나 할까…
어디서 본 것은 있어가지고…
목표를 3관절의 4족 보행 로봇으로 잡았다…-.-
(일단 기본 지식을 정리하는 내용은 기존의 ‘문돌이의 공돌이 따라잡기’로 계속
포스팅을 할 예정이고 로봇 제작 과정은 ‘좌충우돌 로봇 만들기’로 따로 정리할
생각이다.)


사실 요즘같이 수없이 많은 정보가 공유되는 세상에서
내 것이 아닐 뿐 못만들 것은 없기도 하다.
그래도 최대한 스스로의 연구를 통해 만들어보고자 하지만
시작부터 난관의 연속이다.


우선 오늘의 준비물이다.

  • 아두이노 나노와 빵판
  • 배터리 케이스 2개
  • HM-10 1개
  • 서보모터 MG996R 4개 (사진은 1개만 찍음)




목표 1. 아이폰-아두이노 블루투스 통신


일단 로봇은 무선 통신을 통해 컨트롤하기로 하였다.
무선 통신 중 그래도 가장 무난한(은 무슨…이걸로 하루 그냥 버렸다…ㅠ.ㅠ)
블루투스 통신을 사용하기로 하였다.


첫 번째 난관은 나는 아이폰 사용자인데 미리 구매해놓은 HC-06모듈이
아이폰과 통신이 되지 않는다는 것이었다. 뒤늦게 부랴부랴 블루투스 4.0이
지원되는 HM-10을 새로 구입하여 테스트를 진행하였다.


유의사항 1
참조한 사이트 및 스케치 테스트 코드에서 분명 디지털 2번 핀에 HM-10의 TX를,
디지털 3번 핀에 HM-10의 RX를 연결하라고 되어있음에도 불구하고 나는 아무생각없이
아두이노 나노의 TX와 RX에 연결을 해버렸다. 블루투스 연결 시에는 우선 연결에
주의하도록 하자. 


두 번째 난관은 HM-10을 연결하고 LightBlue Explorer라는 앱을 이용하여
테스트할 때는 정상적으로 데이터 송수신이 잘 되었는데 Swift로 된 샘플 코드를
이용하여 진행하니 커넥팅까지는 잘 되었는데 데이터 송수신이 안되는 것이었다.
일단 HM-10을 scan하고 connect하는 것까지는 잘 되는 것 같은데 이후 작동이
묵묵부답이었다.


확인 결과 CBPeripheral의 discoverCharacteristics 함수에서 파라미터 중
characteristic의 UUID를 정상적으로 설정해주지 않은 것이 원인이었다.
보통의 경우 이 UUID는 0xFFE1으로 표시된다.


이 부분을 제대로 구현하고 나서 앱과 HM-10과의 데이터 송수신이 정상적으로 
처리되는 것을 확인하였다.


확인할 내용 1
CBCentralManager의 scanForPeripheralsWithServices 함수에 첫 번째 인자로
블루투스 기기의 Service UUID를 넣어주면 해당 기기만 스캔한다고 하는데 HM-10의
Service UUID를 넣으면 찾지를 못한다. 인자를 nil로 하여 모든 기기를 찾도록 해야만
HM-10을 찾는데 이 부분은 확인이 필요하다.


목표 2. 서보모터 구동


세 번째 난관은 아두이노 회로 연결 과정에서 발생했다.
아직은 회로 연결에 대한 지식이 부족하다보니 막연히 이렇게 하면 될 것 같다 해서
연결하는 경우가 많다.


처음 HM-10과 서보모터 1개로 테스트했을 때는 아두이노 나노의 5V핀과 GND핀에
바로 연결을 했다. 물론 잘 동작을 하였다. 이제 서보모터 3개를 더 추가하려니 연결할
공간이 모자랐다. 그래서 나름 머리를 굴린 결과 아두이노의 5V를 빵판의 +에 
아두이노의 GND를 빵판의 -에 연결하고 서보모터의 전원을 빵판의 +와 -에 연결을 했다.
결과는…실패였다. 전원이 전혀 들어오지 않는다.


일단 검색을 좀 하고 서보모터 2개 이상인 경우 아두이노의 전원으로는 부족하다는
글들을 보고는 외부 전원을 연결하는 방법을 확인한 후 아래의 그림대로 연결을 하였다.



결과는 성공이었다. 물론 이 과정에서도 아두이노의 GND와 빵판의 -를 연결하지 않아
작동을 하지 않는 실수가 있었다.


확인할 내용 2
아두이노 5V와 GND를 연결하여 다수 기기를 활용하는 방법을 확인한다.


최종 결과


아직은 특정 조건에서 서보모터를 2개씩 짝지어 동일한 각도로 움직이도록 한 것이 다이다.
앞으로 로봇의 움직임을 구현하려면 보다 복잡한 코딩을 해야 할 것 같다.
오늘 작업 결과 동영상으로 이 작업을 마무리 한다.

동영상에서 아이폰을 컨트롤한 사람은 나의 둘 째 공주님이다...^^;;


딸과 함께 하다보니 쓸데없는 목소리가 녹음되어버렸다…-.-


작업에 사용한 스케치 코드 및 Swift 소스 코드
https://github.com/mazdah/BluetoothController


참조 사이트

Swift 소스 참조
https://github.com/0x7fffffff/Core-Bluetooth-Transfer-Demo.git

외부 전원 연결 참조
http://www.hardcopyworld.com/ngine/aduino/index.php/archives/1174

서보모터 배선 참조
http://wiki.vctec.co.kr/opensource/arduino/servocontrol

HM-10 연결 기초 참조
http://bbangpan.tistory.com/17


블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^


아두이노 함수 정리 - 2


출처는 ‘아두이노 상상을 스케치하다’입니다.
간단하게 함수 구조만 정리하고 특별히 내용이 필요한 함수만 추가 내용을 첨부합니다.
자세한 내용은 책을 보시길~
이 부분은 개발하시는 분들이면 많이 보던 함수들입니다.


시간 함수

함수명 : millis
함수 구조 : unsigned long millis (void)
매개변수 : 없음
반환값 : 프로그램이 시작된 이후 경과된 시간 (밀리초 단위)
설명 : 약 50일의 시간이 지나면 오버플로우로 인해 0이 반환됨


함수명 : micros
함수 구조 : unsigned long micros (void)
매개변수 : 없음
반환값 : 프로그램이 시작된 이후 경과된 시간 (밀리초 단위)


함수명 : delay
함수 구조 : void delay (unsigned long ms)
매개변수 : 
‣ ms - 밀리초 단위의 지연 시간
반환값 : 없음
설명 : 지정된 시간(ms)만큼 프로그램을 중지 시킴. 이 함수가 실행 중인 시간 동안 세선의 값을 읽어 들이지 못하는 등 다른 대부분의 작업을 못하므로 10밀리초 이상의 대기시간이 필요하는 경우 사용하지 않는 것이 바람직함


함수명 : delayMicroseconds
함수 구조 : void delayMicroseconds (unsigned long us)
매개변수 : 
‣ us - 마이크로 초 단위의 지연 시간
반환값 : 없음
설명 : 지정된 시간(us)만큼 프로그램을 중지 시킴. 최대 지연 시간은 16383 마이크로 초이며 3마이크로 초 이상에서만 정확하게 동작함


수학 함수

함수명 : min
함수 구조 : min (x, y)
매개변수 : 
‣ x - 첫 번째 비교 값
‣ y- 두 번째 비교 값
반환값 : x, y 중 작은 값


함수명 : max
함수 구조 : max (x, y)
매개변수 : 
‣ x - 첫 번째 비교 값
‣ y- 두 번째 비교 값
반환값 : x, y 중 큰 값


함수명 : abs
함수 구조 : abs (x)
매개변수 : 
‣ x - 데이터
반환값 : x의 절대값


함수명 : constrain
함수 구조 : constrain (x, a, b)
매개변수 : 
‣ x - 데이터
‣ a - x가 가질 수 있는 최솟값
‣ b - x가 가질 수 있는 최댓값
반환값 : x가 범위 내의 값이면 x, a보다 작으면 a, b보다 크면 b를 반환


함수명 : map
함수 구조 : map (long value, long fromLow, long fromHigh, long toLow, long toHigh)
매개변수 : 
‣ value - 데이터
‣ fromLow - 데이터가 가질 수 있는 최솟값
‣ fromHigh - 데이터가 가질 수 있는 최댓값
‣ toLow - 변환하고자 하는 범위의 최솟값
‣ toHigh - 변환하고자 하는 범위의 최댓값
반환값 : 지정한 범위(toLow, toHigh)로 사상된 값
설명 : 주어진 데이터 값을 지정된 범위의 값으로 선형 사상시킨다. fromLow값은 toLow값으로 fromHigh값은 toHigh값으로 사상된다. 입력 범위에서 fromLow와 formHigh가 같은 값인 경우 0으로 나누는 경우가 발생하므로 주의해야 한다.


함수명 : pow
함수 구조 : double pow (double base, double exponent)
매개변수 : 
‣ base - 밑
‣ exponent - 지수
반환값 : base의 exponent승 값


함수명 : sqrt
함수 구조 : double sqrt (double x)
매개변수 : 
‣ x - 데이터
반환값 : x의 제곱근


삼각 함수

함수명 : sin
함수 구조 : double sin (double rad)
매개변수 : 
‣ rad - 라디안 형식의 각도
반환값 : 사인 값


함수명 : cos
함수 구조 : double cos (double rad)
매개변수 : 
‣ rad - 라디안 형식의 각도
반환값 : 코사인 값


함수명 : tan
함수 구조 : double tan (double rad)
매개변수 : 
‣ rad - 라디안 형식의 각도
반환값 : 탄젠트 값


난수 생성 함수

함수명 : randomSeed
함수 구조 : void randomSeed (unsigned int seed)
매개변수 : 
‣ seed - 의사 난수 시작 위치 결정을 위한 값
반환값 : 없음
설명 : 의사 난수 생성기를 초기화 하며 시드는 외부 회로가 연결되지 않은 아날로그 핀으로부터 무작위 값을 입력받아 사용하는 것이 가장 간단한 방법이다.


함수명 : random
함수 구조 : long random (long max), long random (long min, long max)
매개변수 : 
‣ min - 생성될 난수의 최솟값
‣max - max - 1이 생성될 난수의 최댓값
반환값 : [min, max-1] 범위의 난수 값


비트 조작 함수

함수명 : lowByte
함수 구조 : lowByte (x)
매개변수 : 
‣ x - 데이터
반환값 : x의 최하위 바이트(byte)


함수명 : highByte
함수 구조 : highByte (x)
매개변수 : 
‣ x - 데이터
반환값 : x의 두 번째 최하위 바이트(byte)
설명 : 2바이트 데이터에서는 상위 바이트를 반환함


함수명 : bitRead
함수 구조 : bitRead (x, n)
매개변수 : 
‣ x - 데이터
‣ n - 읽어낼 비트의 위치로 LSB부터 0에서 시작
반환값 : 0 또는 1의 비트 값
설명 : x의 n번째 비트 값을 읽어 반환한다.


함수명 : bitWrite
함수 구조 : bitWrite (x, n, b)
매개변수 : 
‣ x - 데이터
‣ n - 기록할 비트의 위치로 LSB부터 0에서 시작
‣ b - 기록할 비트 값. 0 또는 1
반환값 : 없음
설명 : x의 n번째 비트에 b 값을 기록한다.


함수명 : bitSet
함수 구조 : bitWrite (x, n)
매개변수 : 
‣ x - 데이터
‣ n - 기록할 비트의 위치로 LSB부터 0에서 시작
반환값 : 없음
설명 : x의 n번째 비트를 1로 설정한다.


함수명 : bitClear
함수 구조 : bitClear (x, n)
매개변수 : 
‣ x - 데이터
‣ n - 기록할 비트의 위치로 LSB부터 0에서 시작
반환값 : 없음
설명 : x의 n번째 비트를 0으로 설정한다.


함수명 : bit
함수 구조 : bit (n)
매개변수 : 
‣ n - 계산하고자 하는 비트 위치
반환값 : n에 의해 지정된 비트의 비트 값
설명 : 2^n 값을 반환.


외부 인터럽트 함수

함수명 : attachInterrupt
함수 구조 : 
void attachInterrupt (uint8_t interrupt, void (*function)(void), int mode)
void attachInterrupt (uint8_t pin, void (*function)(void), int mode)
매개변수 : 
‣ interrupt - 인터럽트 번호
‣ pin - 핀 번호 (아두이노 두에에서만 사용 가능)
‣ function - 인터럽트를 처리할 인터럽트 서비스 루틴(ISR). 파라미터를 가지지 않고 반환값이 없다.
‣ mode - 인터럽트가 발생하는 시점
반환값 : 없음
설명 : 외부 인터럽트가 발생했을 때 이를 처리할 인터럽트 서비스 루틴을 지정한다.


함수명 : detachInterrupt
함수 구조 : 
void detachInterrupt (uint8_t interrupt)
void detachInterrupt (uint8_t pin)
매개변수 : 
‣ interrupt - 인터럽트 번호
‣ pin - 핀 번호 (아두이노 두에에서만 사용 가능)
반환값 : 없음
설명 : 인터럽트 서비스 루틴을 제거한다.


인터럽트 함수

함수명 : interrupts
함수 구조 : interrupts ()
매개변수 : 없음
반환값 : 없음
설명 : noInterrupts 함수에 의해 금지된 인터럽트의 발생을 허용한다.


함수명 : noInterrupts
함수 구조 : noInterrupts ()
매개변수 : 없음
반환값 : 없음
설명 : 인터럽트 발생을 금지시킨다.

아두이노 함수 정리는 여기까지 입니다~

블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^


아두이노 함수 정리 - 1


출처는 ‘아두이노 상상을 스케치하다’입니다.
간단하게 함수 구조만 정리하고 특별히 내용이 필요한 함수만 추가 내용을 첨부합니다.
자세한 내용은 책을 보시길~


디지털 입출력 함수

함수명 : pinMode
함수 구조 : void pinMode (uint8_t pin, uint8_t mode)
매개변수 : 
‣ pin - 설정하고자 하는 pin 번호
‣ mode - 입출력 설정 (INPUT, OUTPUT, INPUT_PULLUP)
반환값 : 없음
설명 : mode에 INPUT_PULLUP을 사용하면 내부 풀업 저항을 사용함


함수명 : digitalWrite
함수 구조 : void digitalWrite (uint8_t pin, uint8_t value)
매개변수 : 
‣ pin - value를 출력하고자 하는 pin 번호
‣ value - pin으로 출력할 값 (HIGH 또는 LOW)
반환값 : 없음


함수명 : digitalRead
함수 구조 : int digitalRead (uint8_t pin)
매개변수 : 
‣ pin - 입력을 받기 위한 pin 번호
반환값 : pin으로부터 HIGH나 LOW값을 읽어 반환

아날로그 입출력 함수

함수명 : analogReference
함수 구조 : void analogReference (uint8_t type)
매개변수 : 
‣ type - DEFAULT, INTERNAL, INTERNAL1V1, INTERNAL2V56, EXTERNAL중 한가지
반환값 : 아날로그 입력을 위한 기준 전압 설정
설명 : 
‣ DEFAULT - 아두이노 보드의 기본 동작 전압으로 설정 (5V 또는 3.3V)
‣ INTERNAL - 내부 기준 전압으로 설정. 아두이노 메가는 사용 못함
‣ INTERNAL1V1 - 1.1V를 기준 전압으로 설정. 아두이노 메가에서만 사용 가능
‣ INTERNAL2V56 - 2.56V를 기준 전압으로 설정. 아두이노 메가에서만 사용 가능
‣ EXTERNAL - AREF핀에 인가된 0V~5V 사이의 전압으로 설정. AREF핀에 인가된 전압을 기준 전압으로 이용하는 경우 analogRead 함수 호출 이전에 반드시 기준 전압을 EXTERNAL로 설정해야 함


함수명 : analogRead
함수 구조 : int analogRead (uint8_t pin)
매개변수 : 
‣ pin - 아날로그 입력을 받기 위한 pin 번호
반환값 : 0~1023 사이의 정수 값


함수명 : analogWrite
함수 구조 : void analogRead (uint8_t pin, int value)
매개변수 : 
‣ pin - 아날로그 출력을 위한 pin 번호
‣ value - 듀티 싸이클(duty cycle), 0~255 사이의 값
반환값 : 없음
설명 : PWM 방식의 신호를 디지털 핀으로 출력한다. 대부분의 디지털 핀 3, 5, 6, 9, 10, 11의 6개 핀을 통해 PWM 신호를 출력할 수 있다.

고급 입출력 함수

함수명 : tone
함수 구조 : void tone (uint8_t pin, unsigned int frequency, unsigned long duration = 0)
매개변수 : 
‣ pin - 출력을 위한 pin 번호
‣ frequency - 출력 주파수
‣ duration - 출력 지속 시간 (밀리초)
반환값 : 없음
설명 : 50% 듀티 사이클과 지정된 주파수를 가지는 구형파를 출력하며 단음을 재생한다. 특정 시간에 하나의 톤만 재생 가능하다.


함수명 : noTone
함수 구조 : void noTone (uint8_t pin)
매개변수 : 
‣ pin - tone을 출력 중인 pin 번호
반환값 : 없음
설명 : tone 함수 호출로 재생 중인 단음을 정지시킨다.


함수명 : shiftOut
함수 구조 : void noTone (uint8_t dataPin, uint8_t cliockPin, uint8_t bitOrder, uint8_t value)
매개변수 : 
‣ dataPin - 비트 출력이 일어날 pin 번호
‣ cliockPin - 한 비트 출력 후 데이터 출력을 알려주기 위해 펄스가 출력되는 핀
‣ bitOrder - 비트 출력 순서 (MSBFIRST 또는 LSBFIRST)
‣ value - 출력될 데이터(byte)
반환값 : 없음
설명 : 지정한 데이터 값(value)을 비트 단위로 지정한 핀(dataPin)으로 출력하는 함수. 이 함수는 바이트 단위의 출력만 지원하므로 255 이상의 값은 바이트 단위로 나누어 호출해야 함


함수명 : shiftIn
함수 구조 : uint8_t shiftIn (uint8_t dataPin, uint8_t cliockPin, uint8_t bitOrder)
매개변수 : 
‣ dataPin - 비트 입력을 받아들일 pin 번호
‣ cliockPin - 비트 입력을 위한 클록 핀
‣ bitOrder - 비트 압력 순서 (MSBFIRST 또는 LSBFIRST)
반환값 : 입력값(byte)
설명 : 비트 단위로 데이터를 입력 받으며 clockPin이 HIGH 상태로 바뀐 후 입력이 이루어지고 입력이 완료되면 clockPin은 LOW 상태로 바뀐다.


함수명 : pulseIn
함수 구조 : unsigned long pulseIn (uint8_t pin, uint8_t value, unsigned long timeout = 1000000L)
매개변수 : 
‣ pin - 펄스를 읽어들일 pin 번호
‣ value - 읽어들일 펄스의 종류 (HIGH 또는 LOW)
‣ timeout - 펄스의 시작을 기다리는 시간. 마이크로 초 단위이며 기본 값은 1초
반환값 : 펄스의 길이를 마이크로 초 단위로 반환. 타임아웃 시간 이전에 펄스가 시작되지 않으면 0을 반환
설명 : 지정한 핀으로부터 HIGH 또는 LOW 펄스를 읽어들임


블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^


2번째 학습 결과와 짝퉁 길들이기…ㅠ.ㅠ


2번째 학습 결과는 큰 아이와 같이 진행한 별빛 램프 상자이다.
초등학생 대상의 아두이노 학습 서적인 “우당탕탕 IT 탐정단”에 나온 바로 그 것이다.


“우당탕탕 IT 탐정단”은 초등학생을 대상으로 한 만큼 상세한 설명이 많지 않아
역시 성인 대상의 교재로는 적절하지 않았으나 다만 아누이노 나노 보드를 포함한
일부 킷이 함께 따라오기 때문에 한 번에 교재와 아두이노 킷을 준비하기에는 번거롭지 않고
딱 좋다.


우선 별빛 램프 상자 예제는 CDS CELL(조도 센서)를 이용하여 특정 조도 이하에서는
고휘도 LED에 불이 들어오고 그 이상에서는 불이 꺼지는 예제이다.


회로 구성은 거의 초등학교 3학년인 큰 아이가 했다.
초등학생을 대상으로 한만큼 각 부품을 어디에 끼워야 하는지 좌표로 딱딱 알려주어서
작업은 어렵지 않았다.


우선 브래드 보드와 스케메틱 이미지는 아래와 같다.
(여기에서 CDS CELL의 한쪽은 5V에 그리고 다른 한쪽은 A0에 연결하는 것이 
맞는 것 같은데 이상하게 스케메틱에서 CDS CELL과 A0를 연결하면 브레드 보드에서
아래 그림과 같이 CDS CELL과 저항을 연결하라는 점선이 표시된다. 내가 뭘 잘못한건가?)





문제는 스케치를 시작하면서부터였다.
아두이노 나노와 통신할 포트를 못찾는 것이었다…ㅠ.ㅠ
처음 시작하다보니 부딪치는 게 한두가지가 아니다…ㅠ.ㅠ


원인을 찾은 결과 다음과 같은 이유였다.

  1. 아두이노 나도가 중국산 CH341 칩을 사용한 것이다.
  2. 이 칩은 MAC에서도 별도의 드라이버를 설치해줘야 한다.
  3. 특히 MAC OS의 최신 버전인 OSX El Capitan에서는 rootless라는 기능이 생겨서 이 기능을 해제해주어야 한다.


그래서 이 문제를 해결하기 위한 모든 방법을 적용해보았으나 모두 실패였다.
포트는 어찌어찌 잡았으나 업로드가 안되는 상태이다.
그런데 업로드 시 오류도 2가지 케이스가 약간 다르게 발생을 하는데
아래 이미지와 같이 어떤 경우는 avrdude: stk500recv(): programmer is not responding라인이 없고 어떤 경우는 있다는 것이다.



어쩔 수 없이 윈도우에서 다시 작업을 하였고 다행이 윈도우에서는 정상 동작 하였다.


스케치 코딩 작업에서도 교재에서는 조도 센서로부터 들어오는 값의 기준을 800으로
하여 800 이상이면 불이 꺼지고 800 이하면 불치 켜지도록 하고 있는데 시리얼 모니터로
확인한 결과 우리집은 방이 약간 어두워서 그런지 센서를 가리지 않았을 때 대략 300 전후,


센서를 가렸을 때 약 50 이하의 값이 들어왔다. 해서 800이란 값을 50으로 수정하여
사용하였다. 그 결과 잘 작동하였다. 작동 테스트는 아래와 같다.



거실에 장식해놓으니 제법 그럴싸하다^^



ch341 센서 인식 시키는 것이 과제인데…
우선 시험삼아 동일 칩을 쓴 다른 제품을 주문했으니 배송 되면 추가로 확인해봐야겠다.
이번 주에는 꽤 많은 것을 한 것 같다. 그래봐야 MAC에서 연결 안되는 문제 때문에
대부분의 시간을 보냈지만…


다음 포스팅에서는 다시 “아두이노 상상을 스케치하다”에서 아두이노 함수를
정리해보도록 하겠다.

블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^


아두이노 기초 정리 2


이 내용은 허경용 지음, 제이펍 출판 ⎡아두이노 상상을 스케치하다⎦에서 발췌한 내용입니다.
이 책이 기초적인 부분부터 차근차근 정리가 되어있어 처음 시작하는 입장에서는 관련된
많은 지식을 얻을 수 있다는 점에서 좋네요.


◼︎ 디지털 입출력에 대해


  • 총 14개의 디지털 입출력 핀이 있으며 이 중 3, 5, 6, 9, 10, 11의 6개 핀은 PWM 신호를 출력할 수 있다. 
  • 디지털 출력을 위한 함수는 digitalWrite, 디지털 입력을 위한 함수는 digitalRead이다.
  • 13번 디지털 입출력 핀은 내부 LED 보호를 위한 저항이 연결되어있다. 따라서 이 핀을 입력으로 사용하기 위해서는 외부 풀업 저항을 사용해야 한다.
  • 출력 상태로 설정된 디지털 입출력 핀은 로우 임피던스 상태에 있게 되며 과전류 상황 방지를 위해 출력단에 470Ω~1K Ω 정도의 저항을 사용하여 외부 회로를 연결해야 한다.

PWM (Pulse width modulation) : 사각형 펄스의 폭을 조절하여 출력 전압을 변경하는 방식으로 ON 상태인 시간의 비율에 따라 폭이 조절된다. 즉, ON 상태의 시간이 길면 전압이 높아지고 이 시간이 짧으면 전압이 낮아지게 되는 것이다. 이 방식은 디지털 출력을 아날로그 출력과 유사하게 사용할 수 있다.



  • 아두이노에서는 0~255값을 출력 가능하며 디지털 출력이지만 analogWrite 함수를 이용하여 출력한다.


◼︎ 아날로그 입출력에 대해


  • 아날로그 핀은 입력만 가능한 핀이 6개 존재하며 이 핀들은 출력은 안된다.
  • 아날로그 입력에 사용되는 함수는 analogRead이다. analogWrite 함수는 디지털 출력 중 PWM 출력을 위해 사용된다.
  • “아두이노 우노의 ADC는 10비트의 해상도를 가지므로 0~1023 사이의 값을 반환한다.”

ADC (Analog-Digital Converter) : 이름대로 아날로그 전기 신호를 디지털 전기신호로 변환하는 회로. wikipedia

  • 아날로그 핀은 반드시 INPUT 상태로 전환 후 사용해야 한다.
  • 아날로그 핀에 HIGH 값을 출력한 상태에서 입력 상태로 전환하면 내부 풀업 저항이 연결된다.
  • 아날로그 핀을 디지털 모드로 동작시킨 후 다른 아날로그 핀에서 analogRead 함수를 실행하기 전에 는 지연 시간을 주는 것이 좋다.


블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^


LED를 켜다! 아무 것도 모르고…ㅠ.ㅠ


일단 지난 일요일 첫 시도에서 제대로 쓴맛을 봤다…ㅠ.ㅠ
일단 책(아두이노 상상을 스케치하다, P66)에서 보이는대로 연결을 했는데도 불구하고 
아무리 스위치를 눌러도 LED에 불이 들어오지 않는 것이다.


결론부터 말하면 Power쪽에서 5v에 연결을 했어야 하는데 GND에다가 연결을 했다.
그리고 아무래도 스위치를 빵판에 제대로 연결을 못했던가보다. 빵판에 끼워도 헐렁헐렁
하기에 원래 그런가보다 했는데 다른 빵판에 끼우니까 빡빡하게 꼭 맞게 들어갔다…-.-


일단 결과부터 보면 아래와 같이 성공이다…^^


하지만 그저 책을 보고 연결했을 뿐 왜 그렇게 연결해야 하는지
이렇게 연결한 것이 어떻게 흘러가서 스위치가 작동을 하는 것인지 설명하려면
아직 공부가 더 필요하다.


다만 보통 브레드보드 이미지와 스케메틱 이미지를 같이 보여주는데 어느 하나를 보고
다른 하나를 이해하는게 너무 힘들었는데 어느 정도 눈에 들어오게 되었다는 것이
성과라면 성과일까? 이렇게 된 데에는 Fritzing의 힘이 너무 컸다.


처음엔 그저 브레드보드 이미지 그려주는 툴인 줄 알았는데 브레드보드, 스케메틱, PCB 중
어느 하나를 그리면 나머지는 자동으로 연결해 주더라는…
이런 툴들을 무료로 배포하는 개발자들은 정말 천사다~@.@


일단 이번에 구성한 회로에서는 아래 그림과 같은 흐름이었다.
브레드보드와 스케메틱의 같은 색깔 라인이 같은 연결이란 것이다.
아직도 모르는 것 투성이 이지만 이렇게 하나 하나 알아가는 것이 꽤나 재미나다.
그저 차근차근 열심히 해보자~




 










블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^


아두이노 기초 정리


이 내용은 허경용 지음, 제이펍 출판 ⎡아두이노 상상을 스케치하다⎦에서 발췌한 내용입니다.
오늘은 개념 정리의 수준에서의 내용만 포스팅합니다.


◼︎ 아두이노는 마이크로컨트롤러다.


마이크로컨트롤러 (wikipedia 발췌)

마이크로컨트롤러(Microcontroller) 또는 MCU(Micro Controller Unit)는 마이크로프로세서와 입출력 모듈을 하나의 칩으로 만들어져 정해진 기능을 수행하는 컴퓨터를 말한다. 


CPU 코어, 메모리 그리고 프로그램 가능한 입/출력을 가지고 있다. NOR 플래쉬, EPROM2 그리고 OTP ROM등의 메모리를 가지고 있어 정해진 기능을 수행하도록 프로그래밍 코딩하고 이 기계어 코드를 써 넣는다. 기계어 코드가 실행되기 위한 변수나 데이터 저장을 위해 적은 용량의 SRAM을 가지고 있다. 기타 칩에 따라 EEPROM을 내장하기도 한다.


MCU는 임베디드 애플리케이션을 위해 디자인되었으며 임베디드 시스템에 널리 사용된다. 개인용 컴퓨터(PC)가 다양한 요구에 따라 동작하는 일반적인 일에 사용된다면, MCU는 기능을 설정하고 정해진 일을 수행하도록 프로그래밍되어 장치 등에 장착되어 동작한다. 따라서 일반적으로 성능이 PC에 비해 낮고 형상도 다르다. 컴퓨터의 형상과 하는 일 측면에서 PC와 달라 대응되는 개념으로 생각하면 된다.

https://ko.wikipedia.org/wiki/마이크로컨트롤러


마이크로프로세서 (wikipedia 발췌)

마이크로프로세서(영어: microprocessor, 문화어: 극소형처리장치, 미크로처리장치)는 컴퓨터의 중앙 처리 장치(CPU)를 말한다. 기계어 코드를 실행하기 위해 실행과정을 단계별로 나누어 처리를 위한 마이크로 코드를 작성하고, 이 마이크로 코드에 의해 단계적으로 처리하는 논리회로를 말한다.


초기의 마이크로프로세서는 하나의 칩으로 만들어졌으나, 점점 다른 하드웨어 요소들을 집적시키는 경향이 있다. 따라서 CPU-코어라는 말로 다른 요소들과 구별한다.중앙 처리 장치(CPU)가 컴퓨터 전체 시스템의 위치와 입장에서 나온 말이라면, 마이크로프로세서는 동작 방식에서 나온 말로 서로 같은 것 이다.

https://ko.wikipedia.org/wiki/마이크로프로세서


◼︎ 교차 개발 환경 


프로그램 개발 기기와 프로그램 실행 기기가 다르다. PC에서 개발한 프로그램을 아두이노로 업로드하여 아두이노에서 실행. 스마트폰 개발 환경도 마찬가지.


◼︎ setup() 함수와 loop() 함수


setup() : 전원이 켜지거나 리셋버튼이 눌려지면 1번만 호출. 변수의 초기화, 핀 모드 설정, 필요한 라이브러리 적재 등 수행

loop() : 프로그램 실행 중 지속적으로 수행되는 함수. 실제 작업 수행


◼︎ 아두이노 기본 입출력


아두이노 UNO 기준 13개의 디지털 입출력 핀과 6개의 아날로그 아날로그 입력 핀이 있음


◼︎ 디지털 입출력


아두이노에서 디지털 입출력 핀은 기본값으로 입력 상태를 가짐. 
이 상태는 하이 임피던스 상태 임


디지털 회로에서의 논리 표현 (wikipedia 발췌)

  • 참 (True)  : 전압 Vcc[V]
  • 거짓 (False) : 전압 
  • H (논리1) : (Vcc - Vs)~ Vcc
  • L (논리0) : Vs ~ 0V


초기의 논리회로는 5V 기준이였다. 5V를 정해 놓고 이것에 맞추어 논리게이트든 마이크로프로세서든 만들어졌다. 그래서 5V를 Vcc라고 표시한다.


즉 전압이 5V인 경우 1(true)로 전압이 0V인 경우 0(false)로 간주한다.
현재에는 이 전압이 낮아지는 추세라고 하는데 일단 아두이노는 5V가 1이다.


입출력 (wikipedia 발췌)

  • 입력 : 입력 노드에 특정 전압을 유지함으로써 신호가 입력되는 것
  • 출력 : 마찬가지로 출력노드에서 정해진 전압을 나타내는 것
  • 여기서 특정 전압이란 앞서 설명한 H또는 L


하이 임피던스(high impedance : wikipedia 발췌)

…이와 같이 출력 신호선에서 전기적으로 절연된 상태를 하이 임피던스(High Impedance)라고 부르며 H, L 둘 다 아닌 제3의 상태로 취급된다. 하이 임피던스 상태는 기호로 "Z"라고 표기한다.


어떤 입력 단자에 연결되어 있는 모든 출력 단자가 동시에 하이 임피던스 상태가 되면 전기적으로 입력 단자에 아무것도 연결되어 있지 않는 것과 동일한 상태가 되어서 안정적인 논리상태를 구현할 수 없다. 그렇기 때문에 하이 임피던스 상태를 수반하는 신호선은 풀업 또는 풀다운을 하는 것이 보통이다.


플로팅 (wikipedia 발췌)

일반적으로 디지털 회로의 입력 단자는 내부 임피던스가 높기 때문에(전원 회로와 저항이 큼) 입력 단자가 어디에도 연결되어 있지 않으면 근처의 정전기나 전자기 유도에 의하여 예상할 수 없는 전압이 인가될 수 있다. 그렇기 때문에 연결기에 의하여 외부로 연결되는 입력 단자는 커넥터가 잘못 연결되어 비정상적인 전압이 인가되지 않도록 해야 한다. 추가로 입력 단자가 어디에도 연결되어 있지 않은 상태를 「플로팅」란 표현이 널리 사용된다.


풀업과 풀다운 (wikipedia 발췌)

이러한 경우(플로팅 상태)에는 수kΩ ~ 수백kΩ 정도의 높은 저항으로 전원선이나 접지선에 연결시킨다. 전원선에 연결한 것을 「풀업」이라고 하고 접지선에 연결한 것을 「풀다운」이라고 한다.


https://ko.wikipedia.org/wiki/디지털_회로#.ED.95.98.EC.9D.B4_.EC.9E.84.ED.94.BC.EB.8D.98.EC.8A.A4


출력상태로 설정된 핀은 로우 임피던스 상태(low impedance state)를 가짐


로우 임피던스 (책에서 발췌)

많은 양의 전류를 외부로 공급할 수 있는 상태.

  • 최대 40mA까지의 양의 전류를 공급하면 소스(source)
  • 최대 40mA까지의 음의 전류를 공급하면 싱크(sink)


다음부터는 본격 실습과 더불어…

블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^


아두이노…첫 도전 실패


아무래도 너무 만만하게 본 것 같다.


일단 보드와 브레드 보드 그리고 푸시 버튼 스위치와 LED 그리고 저항 등등을 꺼내어
책에 나와있는대로 연결을 해보기로 했다.


그런데…
나도 참 어지간히 무대포였던 것이…브레드 보드가 어떤 식으로 구성되어있는지조차
모른 상태로 뭘 만들겠다고 그러고 있었는지…
하지만 세상은 넓고 지식인은 많다.
다행이 아래 블로그에 너무 상세하게 설명이 되어있어 일단 브레드 보드는 확인!


http://blog.naver.com/entrylabs/220595644207 블로그의
브레드 보드 사용법 항목을 보시라~


그리고 나서 이것 저것 연결을 하는데…
이번엔 저항이 저항을 하네…ㅠ.ㅠ
이런 용어를 들어본 것도 어언 30년…기술, 공업 이런 과목 배울 때 들었던 것 같은데…
지난 번 구매한 아두이노 스타터 킷에 1K/10K/330 오옴짜리가 8개씩 들어있다는데…
당최 그놈이 그놈같고 크기도 워낙 작아서 노안이 다가오는 눈으로는 도저히 실별 불가…ㅠ.ㅠ


일단 폰으로 사진을 찍어 확대해서 확인을 해보는데도 이건 뭐 대한,민국,만세 
구별하기보다 더 어렵네…도대체 누가 누구냐? (암튼 마지막 것이 330인 것 같다...)


역시 아래 사이트에서 도움을 좀 받긴 했는데 330짜리만 조금 구분이 가고
나머지 2개는 여전히 오리무중…


띠 색깔별로 오옴값을 확인해주는 사이트. 4밴드, 5밴드, 6밴드를 선택해서 확인 가능함
http://www.digikey.com/en/resources/conversion-calculators/conversion-calculator-resistor-color-code-5-band


다음은 스위치…
책에는 2발짜리 스위치가 표시되어있는데…내가 가진 것은 4발짜리…꼭 드라군 같은 놈이
들어있네…이건 뭐여…ㅠ.ㅠ (완전 쵸파 모자 쓴 드라군 아닌가?)


어찌어찌 해서 서로 마주보고 있는 굽은 놈들은 스위치의 ON/OFF와 관게 없이
항상 전류가 흐른다는 것을 확인하고 (결국 대각선으로 연결을 해야 한다는 것 같은데
맞나?) 역시 그냥 아전인수로 해석하고 연결…


그럭저럭 하나 둘 정보를 모으고 모아서 이리저리 연결을 했는데…
아무래도 책에 나온대로 동작을 안한다…ㅠ.ㅠㅠ
다른 블로그들을 찾아보며 유사한 동작을 구현해봐도
여전히 동작을 안한다…


역시 문돌이의 공돌이 따라잡기는
시작부터 험난한 앞날을 예상케 하는구나…ㅠ.ㅠㅠ

블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^