피지컬 컴퓨팅
카테고리 기술/공학
지은이 DAN O SULLIVAN (지구문화사, 2008년)
상세보기


저는 전자쪽에 관심은 있으나 전공자가 아니다 보니 회로 보는것도 어렵고, 부품 명칭도 모르겠고 해서 무지 고생하고 있습니다.
카페에서 피지컬 컴퓨팅이라는 책을 소개받았는데, 저같은 초보자를 위한 책인것 같아서 소개합니다.

이 책은 전공자가 아닌 비전공자...특히 미디어 아트를 하는 사람들을 위해 쓰여졌습니다.
arduino를 사용하는 방법은 나와 있지 않지만, 비 전공자로써 필요한 최소한의 전자에 관한 지식을 이해하기 쉽게 설명하고 있습니다.

저자가 처음부터 끝까지 강조하는것은 바로 (미디어아트)작품을 만들기위해 세부적인부분(프로그래밍, 전자회로 원리/구현)에 집착하지 말고 만들어 져있는것을 써라 !! 라는것입니다. 머 원리를 이해까지 하면 좋지만 저같이 취미로 하는 사람에게 회로 공식까지 암기할 필요는 없는것 같습니다. 그때 그때 필요한 부분만 이해 하면 되지 싶습니다.

원래 arduino가 전공자가 아닌 사람도 쉽게 사용하기 위해 만들어진만큼 구현이 아닌 활용에 포커스를 맞추는것이 맞다고 생각합니다.

그런면에서 이 책은 딱 필요한 만큼만 설명하고 더 깊이 있는 부분으로 들어가지 않도록 책의 처음부터 끝까지 그 수위조절을 탁월이 했다는데 높은 점수를 주고싶습니다.

아쉬운 부분이 있다면 이 책에서 사용하는 프로세서들이 저와는 상관 없는 프로세서들이어서 책 나온 많은 소스코드들이 특별한 의미를 주지는 못하지만 소스를 어느정도 이해할수 있는 사람이라면 충분히 응용가능하리라 생각됩니다.

저처럼 비 전공자이면서 전자회로책이 너무 딱딱하다고 느끼시는분들께 적극 추천하는 바입니다. 




[머리말] 

피지컬 컴퓨팅이라는 커다란 분야를 독창적인 시각으로 간단명료하고 명쾌하게 가름지어 갈래마다 차근차근 설명하고 있는 이 책은, 앞으로 기술환경이 어떻게 진보하든 피지컬 컴퓨팅을 공부하고자 하는 모든 사람들에게 기본적인 생각의 틀과 접근방법을 제공해 줄 것이라 믿어 의심치 않는다. - 저자의 말

머리말

차례 

서론 
Chapter 1 전기 
Chapter 2 쇼핑하기 
Chapter 3 회로 만들기 
Chapter 4 마이크로컨트롤러 
Chapter 5 프로그래밍 
Chapter 6 4대회로 
Chapter 7 컴퓨터 간의 통신 
Chapter 8 피지컬 인터액션 디자인, 또는 예의바른 대화의 기술 
Chapter 9 움직임 감지하기 
Chapter 10 움직임 만들기 
Chapter 11 신체와 접촉하기 
Chapter 12 디바이스 간의 여러 가지 통신 
Chapter 13 소리와 빛 제어하기 
Chapter 14 아주 많이 입력 받기, 그리고 아주 많이 출력하기 

부록A 마이크로컨트롤러의 선택 
부록B 추천업체목록 
부록C 회로도에 사용되는 기호들


  1. 2012.03.19 02:03

    비밀댓글입니다

  2. BlogIcon pepsiman 2012.06.14 13:57 신고

    위의 책이 아니라도 지금은 많은 좋은 책이 있습니다.
    참고 하세요.

    http://insightbook.springnote.com/pages/5913571

    전자 전공이 아니시라면 "전자회로 DIY" 이책 꼭 보세요. 정말 이거다 싶은 책이었습니다.

arduino 에서 LCD 구동하기 1에서 해결하지 못한 반쪽만 나오는 버그를 기존 라이브러리로는 도저히 안되서 이것 저것 라이브러리를 봐가며 수정하여 겨우 동작하는 화면을 볼수 있었습니다. 이로써 데이터선 4개로 연결되는 4bit LCD가 완성됐다

그런데 가끔 LCD의 화면이 나오지않거나 문자가 이상하게 찍히는 문제가 있었는데, 원인을 잘 모르겠네요.


16 문자 짜리 LCD인데, 8 x 2 로 2Line LCD로 인식하더군요.
덕분에 스크롤 명령을 실행하면 화면이 둘로 나누어져서 동시에 스크롤 됩니다.

선꽂는게 번거로워 선에 핀해더도 연결하고, 마침 주문한 가변저항도 도착해서 연결하니 깨끗한 LCD 화면을 볼수 있었네요.



선 연결은
LCD 핀 이름 gnd, vcc, vr, rs. rw, e, d4, d5, d6, d7
LCD 핀 번호   1,      2,  3,  4,   5, 6,  11, 12, 13, 14
                                 3 - (가변저항 가운데핀)
아두이노 핀  gnd, vcc,       2,   3, 4,   8,   9, 10, 11

#include <LiquidCrystal_pepsiman.h>
// LiquidCrystal display with:
// rs. rw, e, d4, d5, d6, d7 - LCD pin name
//  4,  5, 6, 11, 12, 13, 14 - LCD pin #
LiquidCrystal lcd(2,3,4,  8,9,10,11); // arduino pin #

void setup()
{
  lcd.clear();
  lcd.print("hello, world!.............");
}

void loop()
{
}

압축 파일을 아두이노 개발툴 설치 폴더의 hardware\libraries\LiquidCrystal_pepsiman 폴더에 풀고 위 소스를 스케치에 실행 하시면 됩니다.

  1. BlogIcon plughouse 2009.06.04 15:54

    팹시맨님 정말 감사합니다 :)

    • BlogIcon pepsiman 2009.06.04 17:07 신고

      네 ^^ 덕분에 아두이노 구입해서 잘 쓰고 있습니다.

    • 나그네.. 2010.08.03 13:14

      글씨 색깔이... 참 보기 힘들군요... 일부러 그렇게 하신건지...

    • BlogIcon pepsiman 2010.08.03 13:18 신고

      일부러 그렇게 한건 아니고요. 원래 스킨에서 수정하지 않았습니다.
      많이 불편하신가요?
      전 아직까지 불편하다는 생각을 못했었는데...함 바꿔봐야겠네요.



먼저 내가 구입한 LCD는 플러그 하우스에서 구입한 16 x 1 의 charactor LCD이다. 모노에 백라이트는 없다.
모델명은 NEL16120 이라고 적혀있다.

내가 구입한 C-LCD는 14핀을 가지고 있는데 이런 LCD를 머라고 부르는지는 아직 모르겠다.
14 ~ 16 핀을 가지고 있는 LCD는 그 핀의 용도가 정해져 있는듯 하다.

C-LCD 핀의 내용

1 - Vss, GND - 전원 - 단자
2 - Vdd, 5v 전원 + 단자
3 - Vee, LCD 밝기 가변 저항 연결
4 - RS, Register Select
5 - R/W, Read/Write
6- E, Enable
7- D0, Data bit 0
8- D1, Data bit 1
9- D2, Data bit 2
10- D3, Data bit 3
11- D4, Data bit 4
12- D5, Data bit 5
13- D6, Data bit 6
14- D7, Data bit 7
15- back light -
16- back light +

핀 구성은 위와 같다. 백라이트를 사용하지 않는다면 15, 16 핀은 필요없다.
7 ~ 14핀의 data bit도 다 연결하지 않아도 된다. 대부분 11 ~ 14핀의 4bit로 구동된다. 4bit구동시 8bit를 둘로 나누어 두번에 걸쳐 보낸다.

H/W 회로연결
본인은 회로도와 연결 사진 찾느라 무지 고생했지만 사실 알고나니 연결은 무지 쉬웠다.
lcd의 1,2번은 각각 GND와 5v에 연결하고 3번은 저항에 연결해서 GND에 연결
4 ~14번 까지 다 연결해도 되고 4, 5, 6, 7, 8, 9, 10 만 연결해도 된다.
간단하게 후자로 하겠다.
LCD의 4, 5, 6, 7, 8, 9, 10핀과 arduino의 2 ~ 8핀을 순서대로 연결한다.


sketch는 LCD4Bit lib과 LiquidCrystal lib이 있는데, LCD4Bit는 기능(함수)이 좀 많은 편이고,
LiquidCrystal는 핀배열이 편하고 프로그램도 심플하다.

아래는 LiquidCrystal 예제이다.
예제 #include <LiquidCrystal.h> // rs, rw, enable, d0, d1, d2, d3 LiquidCrystal lcd(2, 3, 4, 5, 6, 7, 8); void setup() { lcd.print("hello, world!"); } void loop() {}

하지만 문제가 있었다. LCD 16문자중 왼쪽 8문자만 출력되는것이었다. 이 문제를 수정하기 위해선 LCD 초기화시 2줄 LCD로 초기화를 해줘야 하는것 같다. 시간이 없어 문자 출력되는것만 확인하고, 아직 위의 문제는 해결하지 못한 상태이다. LCD4Bit에서는 배선이 다르다. Contr핀은 가변저항, GND와 Vcc에 RS 핀은 12에, R/W 핀은 GND에, E는 2, D0 ~ D3은 arduino의 7 ~ 10 번에 연결해야 한다. 원래는 이게 정석인듯한데, LiquidCrystal lib은 핀 배열을 내가 정의 할수 있어서 연결하기 쉽게 바꾼것이다.


아래는 LCD4Bit의 예제이다.
#include <LCD4Bit.h> //create object to control an LCD. //number of lines in display=2 LCD4Bit lcd = LCD4Bit(2); void setup() { pinMode(13, OUTPUT); //we'll use the debug LED to output a heartbeat lcd.init(); } void loop() { lcd.clear(); // Clear display lcd.printIn("4 bit LCD demo"); // Dislay text on first line lcd.cursorTo(2,0); // Move cursor to second line, position 0 lcd.printIn("www.skpang.co.uk"); // Display text on second line while(1) // Endless loop flashing the LED { digitalWrite(13, HIGH); delay(1000); digitalWrite(13, LOW); delay(1000); } }
내 arduino에서는 LCD4Bit 예제에서 글자가 출력되지 않았다. 현재 원인 파악 중이다.

아르두이노에 필이 꽃힌지 2~3주 되었나....

국내 아르두이노 총판인 플러그 하우스가 회사 근처에 있어 충동 구매를 해버렸다.

처음에는 값싼 AVR보드를 사서 arduino부트로더를 올려볼까 생각했는데 (보드는 싼데 isp케이블과 통신 케이블까지 구입하면)거의 비슷한 돈이 들어가고 호환성은 떨어지기 때문에 정품을 구입했다.

충동구매라곤 하지만 예전부터 해보고 싶다고 생각하던것이 아르두이노로 구현 가능하다는걸 알았기 때문에,
구매에 큰 망설임은 없었다.

Duemilanove는 Diecimila의 다음 버전으로 2009라는 뜻이란다.
개선된점
USB전원과 외부전원의 자동인식 및 전환
Auto-Reset 해제가능
과전류 입력으로부터 보호

arduino와 테스트용 몇가지 부품들을 같이 구입했다.
메인 MCU가 ATmega168에서 ATmega328로 변경되었다.

뒷면 모습
정면 모습
같이 구입한 브레드보드, 저항과 LED, 1줄 문자 LCD, 외부 전원용 잭과 9V 아답터



마직막으로 vega와 연결해보았다.

2009/04/03 - [Arduino] - 마이크로 컨트롤러 용어 및 개념 정리
2009/04/06 - [Arduino] - Arduino와 Wiring

설명도 안읽어 보고 대충 USB 케이블부터 연결했다.
드라이버 설치화면이 떠서 보니 다운 받은 개발 환경의 \arduino-0015\drivers\FTDI USB Drivers 폴더가 있어서 드라이버설치
문제는 이제 부터였다.

개발환경(arduino.exe)을 실행하고 대충 blink 예제(스케치)를 불러왔는데...
어떤게 컴파일 버튼인지 모르겠네...에라 모르겠다 아무거나 눌러보자 .. 플레이 버튼을 누르니 컴파일은 된다...

하드웨어로 프로그램을 다운 받아야하는데 어떤거지....
버튼을 보니 Upload to I/O board 라는 버튼이 있다 [ ->| ] 이렇게 생긴....
다운로드가 아니고 업로드구나.....^^a
엥 ...눌렀으나 오류가 난다. 설명 보자....ㅡㅡ;;;

장치관리자에서 USB Serial port 가 COM 몇번 포트로 잡혀 있는지 확인하고
tool / serial port / com? 에서 똑같이 설정한다.
tool / Board 메뉴에서 자신의 보드를 선택한다.
그리고 다시 업로드....

avrdude: stk500_get sync(): not in sync: resp=0x00
avrdude: stk500_disable(): protocol error, expect=0x14, resp=0x51

이런 시뻘건 오류가 뜬다....무서워라.....^^;

한참 씨름하다 다시보니 보드를 잘못 설정했다.
내 보드가 Duemilanove인데 처음 arduino를 실행하니 Arduino Diecimila or Duemilanove w/ATmega168 이 선택되어 있었는데 Duemilanove만 보고 어라 자동인식(자동은 개뿔ㅡㅡ+)하네 하고 뒤에 168을 확인 안한거다. 너무 많은걸 기대했나보다.
내 보드는 Arduino Duemilanove w/ATmega328 이다.
설정을 다시 하니 업로드가 잘 된다.


개발 환경은 너무 심플하다. 비주얼 스튜디오 쓰다 이거 쓰면 완전 노트패드 수준이다...
하다못해 에러 문구 복사는 가능해야 검색이라도 해볼텐데 그것도 안된다. ㅜㅜ

blink 예제

int ledPin = 13;                // LED connected to digital pin 13

void setup()                    // run once, when the sketch starts
{
  pinMode(ledPin, OUTPUT);      // sets the digital pin as output
}

void loop()                     // run over and over again
{
  digitalWrite(ledPin, HIGH);   // sets the LED on
  delay(1000);                  // waits for a second
  digitalWrite(ledPin, LOW);    // sets the LED off
  delay(1000);                  // waits for a second
}




보드 구성
led 의 긴 다리(+)를 13번핀에 짧은 다리를 GND에 꽂는다.
원래는 저항을 같이 연결해야 led가 타지 않는데 13번 핀은 내부적으로 저항이 들어가 있는것 같다.
또 한가지 보드 내부에 있는 led하나가 똑같이 동작하는 걸 보니 13번 핀에 연결되 있는것 같다.
즉 (arduino Duemilanove 보드의 경우) 아무것도 연결하지 않아도 보드만으로 위 소스의 결과를 확인가능하다.

 

arduino 설정 순서
1. http://arduino.cc/en/Main/Software 에서 개발 환경 다운로드 후 아무 폴더나 압축을 푼다.
2. arduino 보드를 연결, 장치인식 후 \arduino-0015\drivers\FTDI USB Drivers 경로에서 드라이버 설치
3. arduino.exe 실행
4. 장치관리자에서 USB Serial port 가 COM 몇번 포트로 잡혀 있는지 확인
5. arduino(개발환경)메뉴에서 tool / serial port / com? 에서 똑같이 설정한다.
6. tool / Board 메뉴에서 자신의 보드를 선택한다(328인지 168인지 정확히 확인하자 ^^;)
7. file / sketchbook / examples / digital / blink 를 연다.
8. Upload to I/O board 버튼을 누른다. [ ->| ]
9. 결과확인

 

arduino는 단순한 IO 보드로 만들어진 또는 임베디드컴퓨팅) 플렛폼이다.
메인칩은 AVR인 ATmega168을 주로 사용한다.

IO는 디지털 입출력핀이 14개, 아날로그 입력이 6개, PWM 6개, 시리얼 통신포트, usb 단자, 외부 전원단자를 갖추고 있다.

아르두이노의 장점은 전자회로, 또는 프로그래밍에 익숙치않은 사람도 
쉽게 접근 가능하게 그 문턱을 낮췄다는데 의의가 있다. 
기존 AVR 프로그래밍의 경우 코딩하고 컴파일하고, isp 같은 장치로 보드에 프로그램 업로드하고 오류나면 다시 디버깅하고를 반복해야 했으나 ,
아르두이노는 usb에 꽂기만하면 연결되고 개발환경에서 업로드 버튼만 누르면 보드에 프로그램이 업로드 되어 실행된다.
전원도 USB 자체에서 충당한다.
개발 언어도 자체 언어를 사용하여 직관적인 몇개의 명령만으로 원하는 결과를 얻을수 있다.
 


LED에 불을 켜려면 LED를13번 핀에 다리하나 연결하고,GND핀에 다리하나 연결하고 끝

프로그램은
pinMode(13, OUTPUT);
digitalWrite(13, HIGH);
두줄이면 됩니다. 

불을 끄려면 
digitalWrite(13, LOW);





두개를 번갈아 쓰면 불이 깜빡이겠죠?



각종 센서와 아날로그 입력단자를 사용하면 센서도 쉽게 사용할수 있다.
예로 온도 센서를 연결한다면 디지털 온도계가 되고, 나침판 센서나 적외서 거리 센서등도 이용할수 있다.

arduino에는 shield라고 불리는 확장 보드들이 존제한다. 이 보드들은 arduino 보드의 핀에 꽂는 형태로 만들어서 얹기만 하면 기능이 확장되는것으로 무선통신 모듈, 블루투스 모듈, 이더넷 모듈, lcd제어 모듈, 서보모터 제어 모듈등 여러가지가 있다.

소스 코드도 오픈, H/W도 오픈이게 때문에 회로도도 공개되어 있다.
이쯤 되면 머리속에 상상력이 마구마구 생기지 않는가?

평소에 머리속으로 이런게 되면 좋겠다. 싶은것을 arduino는 실생활에 가능하게 해둔다는데 매력이 있다.

당신에게 필요한건 상상력 뿐!!!


"검갈 빨주노초파 보 회백" 이라고 외우면 쉽습니다.

색깔의 숫자는 위와 같습니다.

저항을 보면 금이나 은색을 오른쪽에 오도록 읽습니다.

첫번째 숫자, 두번째 숫자, 세번째 숫자, 10의 승수, 오차  이렇게 구성되어 있습니다.

350K옴에 5% 오차라면 - 3 , 5, 10000(10^4) , 5% - 등, 녹, 황, 금 의 띠가 그려저 있는 저항인 것입니다.



arduino를 검색하다보니 wiring이라는 h/w도 알게되었는데, 내가 보기엔 똑같이 생겼는데 차이점을 알수가 없었다.
그래서 차이점을 알기위해 또 검색....

arduino와 갈등하게 만든 샘플전자에서 팔고 있는 wiring 보드이다.
Wiring이 먼저 만들어지고 나중에 Arduin가 만들어짐.
언어(s/w, 개발도구)는 거의 똑같다.
wiring이 시리얼포트가 하나 더 있다고 한다.
현재 활동하고 있는 사용자는 arduino가 더 많음.
arduino가 좀더 저렴하고 종류가 많다.

아무래도 저렴해서 더 많이 보급된게 아닌가 싶다.



MCU (Micro Control Unit) : 
 마이크로 컨트롤러, 일종의 느린 CPU, 대부분 플래쉬 메모리를 내장하고 있슴. 단독으로 동작가능.
 디지털 입력에는 0V 또는 5V 가, 아날로그 입력에는 0V ~ 5V의 전압이 1024단계로 읽힘. 디지털 출력, PWM출력(256단계).
 Atmel이라는 회사의 AVR시리즈 - Atmega168 : 20MHz, 4,400원 정도.


ISP (In System Programer) : 마이크로 컨트롤러를 프로그램 하는 장치, 프린터포트, 시리얼 포트, USB 포트용이 있다.
 임베디드 프로그래밍.

AVR-ISP 포트는 6핀, 또는 10핀( 모양만 다르고 10핀중 4핀은 GND)




P-AVRISP : ISP 다운로드용 프린터 포트 커넥터
 AVR STUDIO에서는 P-AVRISP를 지원하지 않습니다.(쓰기안됨)
AVR STUDIO에서 헥사파일만 만들고 ponyprog2000에서 라이팅한다.

JTAG(Joint Test Action Group): 임베디드 시스템 개발시 디버깅하기 위한 포트이다. 10핀
임베디드 시스템을 개발하기 위해 통합한 회로로 사용되는 IEEE 1149.1의 일반적인 이름이지만, 보통 디버거를 가리킨다.

MCU에 (arduino 같은)부트로더를 올릴려면 프로그래밍 포트(ISP)를 쓴다. 일단 arduino 부트로더가 올라가면 그 다음 부터는 통신 포트(TTL, UART)를 통해 프로그램을 다운로드 할수 있다. 

PWM (Pulse Width Modulation) : 신호를 주기적으로 출력하는 방식, 디지털을 아날로그 처럼 출력하기 위한방법.
출력의 주기가 빠르면 전압이 높고, 주기가  길어지면 전압이 떨어지는 효과가 있다.


AVR : ATMEL사의 MCU 제품군을 말하나 MCU와 같은 의미로 널리 쓰이는것 같다.


arduino 프로그래밍 언어로는 arduino 개발환경과, atmel사의 AVR Stufdio 등이 있다.


sketch : arduino용 프로그램


※ ATmega128
ATmega128은 8비트 RISC(Reduced Instruction Set Computer)구조의  AVR Core를 가지  
는 마이크로컨트롤러로써 대부분의 명령어를 Single Cycle에서 수행하고 I/O구조는 외부에
추가되는소자를최소화할수있도록설계된마이크로컨트롤러입니다 칩내부에는 발진회
로타이머 UART(Universal Asynchronous Receiver and Transmitter)와 SPI(Serial
Peripheral Interface) 및 풀업 저항과 PWM(pulse Width Modulation), ADC(Analog to
Digital Converter), Analog비교기 Watch-doc 타이머를 가지고 있는 칩 입니다.

ATmega128은 내부에 ISP(In-System Programmable) Flash 메모리와 EEPROM 및 SRAM
을 가지고 있어서 편리한 개발 환경을 제공합니다 그래서 실행할 코드와 동작 중 필요한 .
데이터를 저장할 SRAM 및 EEPROM 등을 추가하지 않아도 되므로 다른 마이크로컨트롤러
에 비하여 경제적이고 회로를 간단하게 설계할 수 있습니다.


일반 ATmega 칩을 사용한 AVR을 이용해서 arduino를 만들수 있다.
일반 AVR은 ISP를 이용하여 프로그래밍을 해야 하는데,  arduino는 ISP없이 시리얼 포트로 통신한다.
하지만 최초에 AVR을 arduino로 만들기 위해 한번은 ISP를 이용해 arduino 부트로더를 다운로드 해야한다.
이후에는 ISP없이 시리얼포트로 arduino용 프로그램인 스케치를 다운로드 할 수 있다.

+ Recent posts