이번에 판매가 시작되는 Palm Pre의 기능중 하나가 iTunes에 연결해 아이팟/아이폰과 동일하게 뮤직 라이브러리를 싱크할 수 있는 것이다.

다만 애플에서 허가해 주지 않았는데 어떻게 구현했는가가 궁금했는데 Jon Lech Johansen의 블로그에 올라온 디바이스 리포트에 그 비밀이 밝혀졌다.

Palm Pre에는 'USB Drive' 모드와 'Media Sync' 모드가 있는데 각 모드인 경우 USB 디바이스 리포트가 달라진다. 위의 그림에서 볼 수 있는것처럼 Media Sync모드에서는 Palm Pre를 아이팟이라고 리포트를 해서 iTunes에게는 아이팟이 연결된 것 처럼 속여주는 것이다.
이렇게 되면 iTunes는 아이팟이 연결되었다고 생각하고 동작하게 된다.

다 만 이 방법은 mass storage device를 iPod이라고 이야기하는 것 뿐 저 화면에는 나오지 않았지만 root USB node (IOUSBDevice)는 'Palm Pre'라고 알려주고 있기 때문에 IOUSBDevice와 위의 4번 엔트리 값을 비교하면 매우 쉽게 이 편법을 쓸 수 없게 만들어 줄 수 있다. 아마 조만간 아이튠 업데이트에 이 부분이 추가될 가능성이 상당히 크다고 본다. (현재 iTunes 8.2에서는 아직까지 이 편법이 동작한다.)
Posted by nautes

인터넷에 상당히 자주 올라오는 질문이기도 하고 잘못된 정보가 상당히 널리 퍼져있는 질문이기도 하다.

SD는 마츠시타, 토시바, San Disk등이 휴대용 장비에서 사용하기 위해 개발한 메모리 카드 포맷이다.
일반적으로 10~20MB/s 정도의 전송속도를 가지고 추후 MiniSD, MicroSD(또는 Transflash라고도 불린다) 타입이 발표되었다.

각각의 크기는 위의 그림과 같다. SD는 최대 4G까지 지원하고 파일 시스템으로 FAT16 또는 FAT32를 사용할 수 있다.
SD 카드에는 3가지 전송모드(1-bit SD, 4-bit SD, SPI mode)가 있고 각 카드는 3가지 전송방식을 모두 지원한다. (단 MicroSD인 경우 SPI모드는 옵션이다.) 일반적인 경우 25MHz 클럭까지 지원해야 하고 High speed인 경우 50MHz 클럭을 지원해줘야 한다.

각각의 pinout은 다음과 같다.

먼저 SD카드의 pinout이다.

MiniSD카드의 pinout이다.

MicroSD카드의 pinout이다.

물리적인 pin 갯수는 달라도 비교해보면 실제 신호선은 동일하고 나머지는 사용하지 않는다.

SDHC(SD 2.0)는 SD의 용량 제한을 해결하기 위해 나온 표준이다. SD(SD 1.x)와 물리적, 전기적 form factor는 동일하다. 가장 큰 차이는 어드레싱 범위를 확장하기 위해 SD에서 사용하던 byte addressing 대신 sector addressing을 사용하는 것이다. 이를 통해 이론상 최대 2T까지 addressing이 가능하지만 현재 SDHC 스펙(SD 2.0)으로는 32GB가 최대고 새로 나올 리비젼 (SD 2.x)에서는 더 확장될 예정이다.
SDHC는 SD에 대해 backward compatibility를 가지고 있기 때문에 SDHC리더기에서 SD를 그대로 사용할 수 있다. 이전의 SD장비들은 SDHC의 sector addressing을 지원하지 않기 때문에 SDHC를 사용할 수 없다. 다만 일부 장비들은 SD 컨트롤러의 펌웨어 업그레이드를 통해 SDHC를 지원하도록 할 수 있는 경우도 있다.

SDHC는 일반적으로 FAT32로 포맷하지만 UFS2/ext2 또는 exFAT같은 파일 시스템도 사용할 수 있다.

또하나의 표준은 SDIO(Secure Digital I/O)이다. 이 역시 물리적 form factor는 SD와 동일하다. SD는 메모리를 위한 표준인데 비해 SDIO는 그 이외 다른 주변기기들을 연결하는데 사용한다.

아주 널리 사용되지는 않지만 무선랜카드, 블루투스, GPS수신기, 카메라, 바코드리더 등등 다양한 종류의 제품이 나와 있고 몇년 전에 주로 PDA에서 많이 사용되었었다.

SDIO와 SD의 가장 큰 차이는 SPI모드에 IRQ(인터럽트) 신호가 추가된 것이다. 그렇기 때문에 SDIO 카드는 SD슬롯이 SDIO도 지원하는 장비가 아니면 사용할 수가 없다.

--
인 터넷에 가장 널리 퍼져있는 잘못된 정보로는 'SD에 비해 SDHC는 핀이 하나 추가되기 때문에 SD에서 SDHC를 사용할 수 없다.'는 것이다. 위에도 써 놓은것처럼 SD와 SDHC의 물리적, 전기적 form factor는 동일하다. 차이는 SD컨트롤러가 SDHC에 추가된 sector addressing을 할 수 있는가 여부이기 때문에 일부 장비의 경우는 펌웨어 업그레이드를 통해 SDHC를 지원하게 만들어 줄 수 있는 경우도 있다. 아마 저 헛소문의 근원은 SDHC와 SDIO를 잘못 알고 있는게 아닌가 싶다. (SDIO는 IRQ 신호가 추가된다.)

그리고 파일시스템도 SD의 경우 일반적으로 FAT16을 사용하고 SDHC는 일반적으로 FAT32를 사용하 는것 뿐 꼭 그렇게 해야 한다는 법은 없다. SD나 SDHC 모두 FAT16, FAT32 뿐 아니고 UFS2/ext2 또는 exFAT같은 파일시스템을 사용할 수 있다. (다만 SDHC는 용량문제때문에 FAT16을 사용하는 경우 전체 용량을 다 사용할 수 없게 되기 때문에 FAT16을 사용하는 경우는 거의 없다.)

* 심지어 인터넷 기자라는 사람의 기사에 "SD카드와 SDHC카드의 가장 큰 차이점은 파일시스템이다. SD카드는 구식인 FAT16 파일시스템을 사용하고, SDHC카드는 신식인 FAT32 파일 시스템을 사용한다."까지 이런 소리를 써 놓고 있다. 잘 모르는 사람들이야 그렇다고 쳐도 기술담당 기자라면 자기가 쓰는 기사 내용에 대해서 최소한의 공부는 해서 잘못된 정보를 퍼트리지는 말아야 하는데 이건 오히려 앞장서서 혼란을 일으키고 있으니.... -_-;;;

* 마이크로SD를 아뒤노에 연결시키기 (MicroSD interface for Arduino)

--
추가된 부분 - SD카드 최대용량에 관한 내용

원래 SD1.0에서는 128bit의 CSD(Card Specific Data) register를 가지고 있는데 이 중 12비트(C_SIZE[73:62])가 메모리 클러스터 갯수(1~4096)를 나타내고 3비트(C_SIZE_MULT[49:47])가 클러스터 내의 블럭 갯수(000부터 111까지가 각각 4,8,16,32,64,128,256,512을 나타냄)를 나타낸다. 표준 블럭 크기는 512바이트라 초기 SD에서는 최대 4096*512*512 = 1GB까지 가능하다.
그 후 4비트(READ_BL_LEN[83:80], WRITE_BL_LEN[25:22])를 통해 블럭사이즈를 1024, 2048 바이트로 할 수 있게 되어 2G, 4G (4096*512*1024, 4096*512*2048)도 가능하게 되었다. (원래는 이 값이 일반적으로 512로 고정되어 있었음)

다만 오래된 장비들은 이 부분이 스펙에 추가되었어도 2G, 4G를 인식하지 못하는 경우도 있다. SD Association의 스펙에 보면 다음의 문구가 들어있다.
"2G짜리 카드를 만들기 위해서는 Maximum Block Length(READ_BL_LEN, WRITE_BL_LEN)을 1024로 만들어 줘야 한다. 하지만 CMD16에 의해 설정되는 Block Length는 최대 512 byte Block length를 가진 카드와 일관성을 유지하기 위해 최대 512까지만 사용할 수 있다."
Posted by nautes

얼마전에 만들었던 팬-틸트 유닛은 가위로도 자를 수 있는 얇은 알미늄판을 사용해서 구조적으로 튼튼하지 못했고 카메라등을 올려놓을 암(arm)의 길이가 짧아 90도밖에 틸트를 할 수 없는 문제가 있었다.

그래서 이번에는 문제점들을 모두 해결한 버젼 2 팬-틸트 유닛을 만들어 보았다.
설명을 쉽게 하기 위해 부품마다 이름을 붙여주었다.
팬, 틸트를 해야 하기 때문에 당연히 2개의 서보모터가 필요하다.

이번에는 충분한 두께의 철판을 사용하였다. 4개의 부품을 각각 붙여야 하는 부품에 맞춰 구멍을 뚫어 주었다.


P4위에 W1을 위의 사진과 같이 붙일 것이다. 다만 저렇게 먼저 고정시켜 버리면 W1을 S1에 고정시켜주는 볼트를 돌릴 수가 없게 된다.

그러므로 위의 사진과 같이 두개의 볼트를 먼저 W1에 끼워넣고 W1을 S1에 끼운 다음 볼트로 고정해 준다.

그 다음 W1위에 P4를 맞춰 올려놓고 넛트로 조여준다.

다음은 틸트 부분의 조립이다. P2, P3에 S2를 위의 그림과 같이 고정해주면 된다.

P2, P3를 나사로 고정시켜 주었다. 아래쪽 구멍도 고정해줘야 하는데 위쪽 2개만 해도 충분할거 같아 여기서는 그냥 놔두었다.

위에서 조림한 틸트 서보를 P4위에 올려준다. P2, P3의 구멍과 P4의 구멍을 일치시켜 나사로 고정한다.

W2를 S2에 끼워주고 나사로 고정한다.

W2에 P1을 올려 구멍을 일치시켜서 나사로 고정해 준다.


바로 위 2장의 사진이 완성된 팬-틸트 유닛을 각각 옆쪽과 앞쪽에서 본 모습이다.


최대한 앞, 뒤쪽으로 틸트 한 모습이다. 이번에는 암이 충분히 길기 때문에 서보나 다른 프레임에 걸리지 않고 180도를 움직일 수 있다.


이건 좌우로 최대로 팬 한 모습이다.

아뒤노에 연결해서 데모용으로 동작시켜 본 동영상이다. 상당히 빠르고 정확하게 움직여 준다.

* 조만간 이번에 제작한 팬-틸트 유닛 위에 웹캠이나 위 모트의 앞부분에 있는 적외선 추적 카메라를 붙여 볼 생각이다.
Posted by nautes



아뒤노가 임베디드 환경을 처음 접하는 사람들에게 매우 쉬운 환경임에 틀림없지만 조금만 복잡한 작업을 하려고만 하면 제약사항이 꽤 많아진다.
특히 가장 아쉬운게 attachInterrupt()를 통해서 외부 인터럽트 2개(Arduino Mega에서는 6개로 늘어났다)만 사용할 수 있다는 점이다.

단순하게 센서값을 읽어서 그 값에 따라 LED나 모터를 구동하는건 별 문제가 없지만 동시에 여러개의 입력을 기다리면서 그와 별도로 작업을 처리하거나 해야 한다면 타이머 인터럽트는 거의 필수적이 되어 버린다.

물론 atmega의 타이머 관련 레지스터(TCCR2, ASSR 등등)를 직접 제어하면 인터럽트를 사용할 수 있지만 이 경우 아뒤노의 장점(?)이 사라져 버린다.
그 래서 아뒤노 라이브러리 섹션의 contributed libraries (아뒤노 사용자들이 만든 라이브러리들)에 보면 MsTimer2가 있다. Atmega의 timer 2를 사용해서 ms 단위의 해상도로 타이머 인터럽트를 걸어줄 수 있다.
현재 Atmega 1280, 328, 48/88/168, 128/8을 사용한 arduino 및 arduino clone에서 사용할 수 있다.

이 라이브러리를 사용하려면 MsTimer2를 다운받아 압축을 해제한 다음 만들어 진 폴더를 아뒤노가 설치된 폴더 내의 hardware/libraries 에 복사해 주면 그것으로 설치가 끝난다. 그리고 스케치북에 #include <MsTimer2.h> 를 넣어주면 된다.

set, start, stop 이렇게 단 3개의 메쏘드만 있어 사용법은 매우 쉽다.
먼저 MsTimer2::set(unsigned long ms, void (*f)()) 을 사용해서 타이머를 설정해 준다. 이 함수에는 두개의 파라메터가 필요하다. 첫번째는 타이머 시간(ms 단위, 즉 여기에 1000을 넣어주면 1초마다 한번씩 타이머 인터럽트가 발생한다.), 두번째는 인터럽트 서비스 루틴(인터럽트가 발생했을 때 호출할 함수) 이름이다.
set()을 이용해서 타이머를 설정했으면 MsTimer2::start() 를 호출해주면 타이머가 동작하기 시작해 정해진 시간마다 인터럽트 서비스 루틴이 실행된다.
타이머 동작을 멈추려면 MsTimer2::stop()을 호출해주면 된다.

타이머 인터럽트가 왜 유용한가는 아래의 예제를 보면 잘 알수있다.
0.5초마다 LED를 깜빡이게 하는 프로그램이다.

boolean output = HIGH;
void setup() {
  pinMode(13, OUTPUT);
}

void loop() {
digitalWrite(13, output);
output = !output;
delay(500);
}
---------------------------------------
// Toggle LED on pin 13 each second
#include <MsTimer2.h>

void flash() {
static boolean output = HIGH;

digitalWrite(13, output);
output = !output;
}

void setup() {
pinMode(13, OUTPUT);

MsTimer2::set(500, flash); // 500ms period
MsTimer2::start();
}

void loop() {
}

둘 다 같은 동작을 한다. 그런데 위의 경우와 같이 타이머 인터럽트를 사용하지 않은 경우 0.5초동안 다른 일을 하지 못하고 단지 기다려야 한다. 그에 비해 아래쪽 프로그램의 경우는 LED를 토글하는걸 인터럽트 서비스 루틴(여기서는 flash())에서 처리해주기 때문에 따로 0.5초를 기다릴 필요가 없이 그 동안 다른 일을 할 수 있게 된다. (loop() 함수에서 아무일도 하지 않는걸 확인할 수 있다. 여기에 다른 작업을 넣어주면 된다.)

예를 들어 동작중에 시리얼 포트를 통해 시간을 입력받아 LED가 깜빡이는 간격을 조정하도록 만들려면 상당히 힘들어 지지만 아래쪽 프로그램의 경우 시리얼 포트를 통해 데이터를 입력받는 부분은 loop() 안에서 처리하게 하고 그 입력받은 값에 따라 타이머 설정만 바꿔주면 실제 깜빡이는건 타이머 인터럽트가 담당해 주기 때문에 매우 간단해진다.
Posted by nautes




네트웍을 조금 깊이 공부하다 보면 필요한 툴 중에 하나가 패킷 스니핑(packet sniffing) 소프트웨어이다. 패킷 스니핑이란 네트웍 상에 오가는 모든 패킷들의 내용을 보는걸 말한다. (평상시에는 자신에게 오는 패킷만 받아 처리한다) 예전 텍스트 환경에서 많이 사용되던 프로그램으로는 snoop (SunOS에서 사용)과 지금도 거의 표준적으로 사용되고 있는 tcpdump가 있다.

GUI 환경의 툴로는 보통 tcpdump/pcap을 사용하고 거기에 graphic back-end를 붙여준 형태가 많다.


Ethereal 에서 이름이 바뀐 Wireshark이다. 현재 패킷 스니핑 툴에서는 거의 de-facto standard의 지위를 차지하고 있다. 물론 Windows/Linux/Mac OS X 모두 지원한다. 다만 아래 화면에서 볼 수 있는것처럼 Linux/X Windows를 맥에 포팅한 형태이기 때문에 맥 고유의 UI를 사용하지 않아서 맥 어플리케이션의 깔끔한 느낌이 없다.

그에 비해 Cocoa Packet Analyzer는 처음부터 네이티브 맥 OS X와 코코아 환경에서 구현한 패킷 스니핑 툴이라 맥 UI가 깔끔하게 적용되어 있다. 산업표준인 pcap 패킷 캡춰 포맷을 지원하기 때문에 다른 패킷 스니핑 툴과도 트레이스 파일이 호환된다. 또한 libpcap/tcpdump 의 packet filter expression을 사용할 수 있기 때문에 tcpdump에 익숙한 사람은 별도로 공부할 필요가 없다.
그리고 cocoa bundle technology를 지원하기 때문에 애널라이져 플러그인을 만들어 붙일 수도 있다. 현재 SIP 프로토콜은 3rd party의 플러그인으로 구현되어 있다.

* 예전에는 보통 libpcap/tcpdump를 먼저 깔아준 다음 프로그램을 설치하는 형태가 많았는데 Cocoa Packet Analyzer도 최근 다른 프로그램들과 마찮가지로 필요한 모든걸 한꺼번에 설치해주기 때문에 편리하다.








L2TP 패킷의 내용을 보는 화면이다.

IP v6도 당연히 지원한다.

컬럼에 어떤 필드를 보여줄 지 선택할 수 있다.


캡춰된 패킷을 쉽게 검색할 수 있도록 되어있다.


지원하는 프로토콜 타입은 다음과 같다.
  • Ethertype ARP
  • Ethertype IP (v4/ v6)
  • Ethertype PPP
  • Ethertype PPPoED/S
  • Ethertype 802.1Q VLAN
  • Linktype Loopback
  • Linktype PPP
  • IP-Protocol IP
  • IP-Protocol TCP
  • IP-Protocol UDP
  • IP-Protocol ICMP
  • IP-Protocol IGMP
  • IP-Protocol L2TP
  • PPPoE Discovery and Sessionstages
  • PPP-Protocols: IP, LCP, IPCP, CCP, PAP, CHAP
  • L2TP-Protocol (port based detection)
  • RADIUS-Protocol (port based detection)
  • SIP-Protocol (third party analyzer plugin)
현재 버젼은 0.60.1이다.
Posted by nautes

이전버튼 1 이전버튼