Bit-banging을 이용한 AVR과 Optical Mouse Sensor간의 통신 :: 2009/01/06 06:28   by 조준희(18기)

안녕하세요. 18기 조준희입니다.
이번 글에서는 AVR과 광마우스 센서의 일종인 ADNS-2051간의 통신을 설명하려고 합니다.

먼저 AVR과 ADNS-2501간의 연결 도식도입니다.



 ADNS-2051은 2선식 동기식 직렬통신 방법을 사용하며, 이 통식 방법을 이용하여 ADNS-2051안의 파라미터(레지스터)를 설정하거나 값을 읽어 올 수 있습니다. 포트는 2선이며, 반이중 방식이며, 호스트 마이크로 컨트롤러(avr)는 항상 통신을 초기화합니다.


- SCLK : The serial port clock. 항상 마스터에 의해 발생합니다.

- SDIO : The data line.


 기본적으로 2선식 직렬통신 포트는 필립사에서 제안한 근거리용 표준 직렬통신 방식인 I2C 버스로 통신하는 방식이 있으며, Avr에서도 이와 같은 방식으로 동작하는 TWI(Two-Wire Serial Interface)가 존재합니다. 이것은 2선식 직렬통신 방식으로 항상 마스터와 슬레이브 사이에서 직렬로 데이터를 송수신할 수 있습니다. 하지만 ADNS-2051에서는 안타깝게도 이와 같은 통식 방식을 지원하지 않습니다. 따라서 몇몇의 레지스터 설정을 통한 미리 정의되어 있는 프로토콜 사용하는 대신에 소프트웨어적으로 직렬 통신방식을 구현해야 합니다. 이와 같이 미리 지정된 하드웨어적인 방법 대신 소프트웨어 만을 사용하여 직렬 통신을 구현하는 기법을 Bit-banging이라 합니다.


 다음은 wikipedia에서 Bit-banging을 설명한 내용입니다.

 Bit-banging is a technique for serial communications to use software instead of dedicated hardware such as a UART or shift register. A software routine handles the UART transmit function by alternating a pin on the microcontroller by given time intervals. A receiver function is implemented by sampling a pin on the microcontroller by a given time interval. The technique can be applied in very low cost embedded systems.

 SCLK와 SDIO에 연결된 핀은 미리 지정된 핀이 아니므로 임의로 지정할 수 있습니다. 여기서는 연결 도식도에 나타난 바와 같이 SCLK는 PB0, SDIO는 PC0에 연결하였습니다.

Write Operation


 Write operation(마이크로컨트롤러 → ADNS-2051)은 항상 마이크로컨트롤러에 의해 초기화 되며, 2bytes로 구성되어 있습니다. 첫 번째 바이트는 주소(seven bits)이며, 데이터 방향을 가리키기 위하여 MSB 값으로 1을 가집니다. 두 번째 바이트는 데이터이며, 전송은 SCLK에 의해 동기됩니다. 마이크로컨트롤러는 SCLK의 falling edge일 때 SDIO를 change하며, ADNS-2051은 SCLK의 rising edge에서 SDIO를 읽습니다.


 다음은 Bit-banging 기법을 사용하여 Write 동작을 구현한 코드입니다. byte단위로 함수를 구현하였기 때문에 Write에서는 주소와 데이터를 나누어 총 2번을 write합니다.



Read Operation

 Read operation(ADNS-2051 → 마이크로컨트롤러)도 항상 마이크로컨트롤러에 의해 초기화 되며, 2bytes로 구성되어 있습니다. 첫 번째 바이트는 주소이며, 마이크로컨트롤러에 의해 write되고 데이터 방향을 가리키기 위하여 MSB 값으로 0을 가집니다. 두 번째 바이트는 데이터이며, ADNS-2051에 의해 driven됩니다. 전송은 역시 SCLK에 의해 동기되며, SDIO는 SCLK의 falling edge일 때 change되고 SCLK의 모든 rising edge에서 읽습니다. 또한 ADNS-2051은 마지막 데이터 비트를 보낸 후에 high Z 상태로 가기 때문에 마이크로컨트롤러는 마지막 주소 비트를 보낸 후에 high Z 상태로 가야합니다. read operation에서 특히 주의해야 하는 것은 마지막 주소 비트는 보낸 후에 ADNS-2051이 데이터를 준비하는데 적어도 100μs 필요하기 때문에 SCLK를 delay해줘야 하는 것입니다.




 다음은 Bit-banging 기법을 사용하여 Read 동작을 구현한 코드입니다. 역시 byte단위로 함수를 구현하였고 주소는 마이크로컨트롤러가 보내며 데이터는 ADNS-2051이 보내기 때문에 1번의 write와 1번의 read가 발생합니다.



 이 밖에 고려되어야 할 사항으로는 Read와 Write 명령 사이에 요구되는 시간(delay)이 있으며, Write operation과 read operation을 통하여 ADNS-2051의 register들을 설정하거나 읽음으로서, AVR과 ADNS-2051간의 통신을 할 수 있습니다.  

☆ 글쓴이 소개☆
조준희(18기)님의 글입니다.

Trackback Address :: http://blog.swssm.org/trackback/310
Name
Password
Homepage
Secret

GPS Data :: 2009/01/05 23:37   by 이슬희(17기)

안녕하세요. 삼성소프트웨어 멤버십 17-2기 이슬희 입니다. 저희 Driver Management System팀에서는 GPS를 사용하였습니다. 그래서 이번에는 GPS Data에 대해서 써보려고 합니다.

사용하고 있는 GPS 수신기의 데이타 인터페이스 포맷이 NMEA-0183 입니다.
NMEA-0183 포맷은 아래와 같습니다다.

NMEA: National Marine Electronics Association
NMEA 에서는 GNSS, GPS, Loran, Omega, Transit 등 다양한 애플리케이션을 위한 데이타셋을 정의하고 있습니다.

- GPS 를 위한 7가지 데이타 셋 -

1. GGA: GPS Fix Data,
2. GLL: Geographic Position - Latitude/Longitude
3. GSA: GNSS DOP 와 Active Satellites
4. GSV: GNSS Satellites in View
5. RMC: Recommended Minumun Specific GNSS Data
6. VTG: Course over Ground
7. ZDA: Time and Date

NMEA 프로토콜의 구조

8비트 아스키 문자를 사용하여 4800 Baud 로 데이타를 전송합니다. 패리티 비트는 사용하지 않습니다.
각 GPS 데이타셋은 다음과 같은 구조로 이루어져 있습니다.

$GPDTS,Inf_1,Inf_2,Inf_3,Inf_4,Inf_5,Inf_6,Inf_n*CS<CR><LF>


$ : 데이타셋의 시작을 나타낸다.
GP : GPS 정보를 나타낸다.
DTS : 데이타셋의 식별자.
Inf_1 bis Inf_n : 1 ... n 정보 (예, course data 를 위한 175.4)
, : 서로 다른 정보를 나타내는 아이템간의 구분문자
* : checksum 을 위한 구분 문자
CS : 전체 데이타셋을 검사하기 위한 첵섬(Control Word)                            
<CR><LF> :
데이타셋의 끝.
GPS 데이타셋의 문자열은 시작과 끝을 나타내는 문자를 제외하고 79자를 초과해서는 안됩니다.

1. GGA 데이타 셋
GGA 데이타셋은 시간, longitude, latitude, 시스템의 품질, 사용중인 위성의 수, Height 에 대한 정보를 나타냅니다.

데이타 예제
           $GPGGA,004952,3723.8259,N,12655.3071,E,1,04,04.7,00046.9,M,018.1,M,,*4F

2. GLL 데이타 셋
GLL 데이타 셋은 Latitude, Longitude, time, health 정보를 갖고 있습니다.

데이타 예제
          $GPGLL,4717.115,N,00833.912,E,130305.0,A,*32

3. GSA 데이타 셋
측정 모드(2D, 3D)에 대한 정보, 위치 결정에 사용된 위성의 수, DOP 등의 정보를 갖고 있습니다.

데이타 예제  
      $GPGSA,A,3,13,16,19,23,,,,,,,,,19.3,04.7,18.7*08

4. GSV 데이타 셋
위성의 수

데이타 예제
      $GPGSV,2,1,05,13,33,295,40,16,57,043,41,19,42,212,41,23,40,249,38*7B

5. RMC 데이타 셋
Recommended Minumum Specific GNSS, 시간, latitude, longitude, height, system status, speed, course, date 등의 정보를 갖고 있습니다.

데이타 예제
      $GPRMC,004952,A,3723.8259,N,12655.3071,E,000.0,088.7,291107,,,A*72

6. VTG 데이타 셋
경로와 속도에 기반한 지상 경로와 속도 정보를 갖고 있습니다.

데이타 예제
      $GPVTG,088.7,T,,M,000.0,N,000.0,K,A*0A

7. ZDA 데이타 셋
시간 정보가 들어 있습니다.

데이타 예제
     $GPZDA,130305.2,20,06.2001,,,*57


 아! 마지막으로 GPS를 측정할때는 건물안처럼 사방이 둘러쌓인 곳에서는 측정이 안된다는 사실을 명심해주세요 ^ ^

☆ 글쓴이 소개☆
이슬희(17기)님의 글입니다.

Trackback Address :: http://blog.swssm.org/trackback/309
Name
Password
Homepage
Secret

Otical Mouse Scanner - Software part :: 2008/12/31 18:58   by 박병훈(18기)

안녕하세요~

Optical Mouse Scanner 프로젝트에서 소프트웨어를 담당하고 있는 박병훈입니다.

저희 프로젝트 현재 각종 기기의 소형화와 기능의 복합화 트렌드를 이어받아 마우스와 스캐너를 하나로

만들어 보고자 했습니다.

기본 원리는 광마우스의 센서를 이용해서 바닥에 있는 부분을 스캔하는 것입니다. 그리고 더나아가 스캔된
 
이미지에 문자가 있으면 문자를 추출하고 Open API를 이용한 네이버 사전을 연동해서 뜻을 검색할 수 있도록

만들었습니다. 그럼 제가 담당한 문자인식, 이미지프로세싱를 소개하겠습니다.


1. Tesseract OCR Engine

프로젝트를 계획 할 때 문자인식을 직접 개발하려 했으나 짧은 일정과 문자인식 자체만으로도
 
큰 프로젝트이기 때문에 대안으로 오픈 소스인 Tesseract OCR 엔진을 선택했습니다.

그래서 문자를 인식하는 부분만 오픈 소스를 이용하고 나머지 부분( 이미지 프로세싱 )을 직접

구현하였습니다.

Tesseract OCR 엔진은 문자인식을 위한 엔진으로서 HP에서 개발된 엔진으로 현재는 Google Code의
 
지원을 받을 받으며 계속 개발 중에 있습니다.  이 엔진은 binary, 흑백, 컬러 이미지에서 문자를 추출할 수

있고 uncompressed
TIFF 이미지를 읽을 수 있는 tiff 리더가 포함되어 있으며, compressed 이미지를
 
읽기위해 libtiff를 추가할 수도 있습니다. 문자 인식 과정은 다음과 같습니다.

1. 스캔된 이미지에서 각종 선들을 읽습니다.
2. 읽어선 선의 검정색 픽셀들을 픽셀보다 더작은 점 단위로 쪼갭니다.
3. 쪼갠 점들로부터 윤곽을 추출하기 위해 처리를 합니다.
4. 윤곽과 연속된 쪼갠 점들로 부터 문자의 외곽선을 추출합니다.
5. 점들을 문자 단위로 구분합니다.
6. 구분된 모든 문자의 특징들을 파악합니다.
7. 저장되어 있는 문자셋과 그 특징들을 비교 분석합니다.
8. 가장 적합한 문자를 뽑아 냅니다.

위와 같은 과정을 거치면 문자가 나오게 되는데 하지만 정확도가 뛰어 나려면 문자의 기울기, 선명도,
 
노이즈 등 과 같은 많은 부분을 고려해야합니다. 그런 부분을 교정하기 위해 이미지 전처리 과정을

거치게 되는데 어떤 방법으로 전처리를 했는지 보여드리겠습니다.


2. 이미지 전처리

이미지의 노이즈를 제거 하기위해 이진화와 모폴로지 기법을 사용했고 기울기를 조절했으며 작은 글씨

를 인식하기 위해 확대 및 축소 기능을 추가 하였습니다. 각종 기법들을 차례로 보겠습니다.


■ 이진화

이진 영상은 0과 1의 값만 갖는 2레벨 영상입니다. 다른말로는 1비트 영상이라고도 하는데요, 명암도
 
영상은 0 ~ 255까지의 256레벨을 가지는데 다음과 같은 공식응 적용해서 이진화 영상을 만들게

됩니다.

                               ┌    1 if          gray_image[x][y] ≥ threshold
binary_image[x][y]    │
                               └    0 else if   gray_image[x][y] ≤ threshold

                             
                                      <처리 전>                                         <처리 후>

위 그림 처럼 왼쪽의 그림의 명암도가 오른쪽 그림처럼 사라진것을 알수가 있습니다. 따라서 좀더 나은 문자

인식을 위한 그림을 얻게 됩니다.


■ 모폴로지

모폴로지는 영상 내 객체의 형태적인 면을 표현 또는 서술하는 관계로, 영상의 전처리 작업인 영상내

객체 분류 등과 같은 과정을 거쳐 객체를 뚜렷이 하는 데 이용합니다. 저는 그 중에서는 침식 연산과

팽창 연산 순으로 조합하는 열림 연산 모폴로지 기법을 사용했습니다. 아래와 같은 경우에는 희미한

글자들의 빈공간을 채우면서 글씨가 더욱 또려해 지는 효과를 얻을 수 있습니다.

 
                             <처리 전>                                                           <처리 후>


■ 확대

일반적으로 이미지를 확대하면 아래의 그림과 같은 방법으로 합니다.


그림에서 2배 확대에 대한 것이 두 가지로 나뉜 것을
볼 수 있는데, 이것은 첫 인덱스가 (0,0)이냐 아니면

(1, 1)이냐에 따라 구분한 것입니다. 전자의 경우 C, Java 계열에서 주로 쓰이고 후자는 Visual Basic, MATLAB

등에서 쓰여집니다. 그러므로 2배 확대한다는 공식자체는 불변한데, 인덱스 처리 방법이 다른 관계로 프로그래

밍 언어별로 실제 코딩 내용이 달라질 수 있음에 유의해여합니다. 확대 공식은 아래와 같습니다.

x_target_pixel = scale * x_source_pixel
y_target_pixel = scale * y_source_pixel
Target_image[x][y] = Source_image[x*scale][y*scale]

x_target_pixel과 y_target_pixel은 목적 영상의 화소 위치, x_source_pixel과 y_source_pixel은 원 영상의 위치,

scale은 확대 비율을 가리킵니다.

그런데 그림에보면 확대함으로써 새로운 공간이 생기는데 이 화소를 가르켜 hole이라고 합니다. 이런 홀에는

어떤값을 넣어야 할까요? 네~ 적당한 값;;을 채워 넣어야지요. 바로 이 적당한 값을 채워 넣는 방법이 보간법

입니다. 저는 보간법 중에서는 양선형 보간법을 사용했는데 원리는 아래와 같습니다.


양선형 보간법은 보간 대상 위치 주변에 있는 주어진 4개 화소를 이용하여 2차례 보간법으로 보간한 값을 구하

여 사상하는 것입니다. 다시 간략히 양선형 보간법 과정을 표현하면 아래와 같습니다.



■ 회전

회전은 원 영상을 원하는 각도만큼 변환하는 것을 가르키는데 공식은 다음과 같습니다.

x' = x·cosθ - y·sinθ         x'= (x - centerX)·cosθ - ( y - centerY)·sinθ
y' = x·sinθ - y·cosθ         y'= (x - centerX)·sinθ - ( y - centerY)·cosθ


그런데 위의 공식을 비트맵 방식에 적용을 한다면 에지 부근에 날카로운 톱니 모양으로 나타납니다. 이것은

화소의 위치와 cos(), sin() 함수를 연계하여 얻은 값이 실수인 관계로 목적 영상의 화소에 정확히 사상되지

않기 때문입니다. 또한 영상은 비트맵 방식이라는 한계를 가지고 있기 때문에 이런 현상이 나타납니다. 따라서

이를 위한 해결책으로는 아까 위에서 언급한 보간법이나 영상 개선 알고리즘을 적용해야 합니다.
☆ 글쓴이 소개☆
박병훈(18기)님의 글입니다.

Trackback Address :: http://blog.swssm.org/trackback/308
Name
Password
Homepage
Secret

입출력 구조의 이해와 SSES의 위치 :: 2008/12/31 02:49   by 이정훈(18기)

해당 프로젝트를 수행하기 위해서 무엇보다도 커널의 입출력 구조를 명확하게 이해 하고 있어야 합니다.

커널의 입출력 구조는 단순하 구조가 아닌 복잡한 구조로 되어 있고, 이것의 이해를 바탕으로, 개발된 모듈을 원

하는 입출력 구조의 부분에 위치 시키므로서 얻고자 하는 효과를 얻을 수 있습니다.



SSES의 대략적인 위치를 그림으로 나타 내어 보면 다음과 같습니다.








User Application단에서 Read 또는 Write 요청이 일어나게 되면, 해당 요청들은 VFS단으로 흘러 들어 오게 됩

니다. 이 VFS는 가상 파일 시스템의 약자로, 다른 파일시스템을 가지고 있는 장치 들의 파일 시스템을 추상적으

로 나타낸것으로, 다른 파일시스템을 마운트 하여 사용 할수 있다는것을 의미 합니다.




VFS를 거쳐, 각장치의 파일시스템을 통해 Read, Write의 요청이 있게 되고 , 각장치의 IO가 발생하게 되면 기본

적으로는 I/O Scheduler에 등록이 되어 처리를 기다리게 됩니다. 이 I/O Scheduler의 역할은 상대적으로 속도

가 느린 입출력 장치의 처리를 위해, 한꺼번에 관련된 데이터를 모아서 처리를 하는 형태를 취하게 되어, 한번의
Access로 많은 데이터를 처리 할수 있는 기반을 만들어 주게 됩니다.




해당 시스템은 I/O Scheduler의 위쪽에 위치하여 입출력을 Hooking하는과정을 통해 Read, Write를 할 Target

을 제어 하게 됩니다. 제어를 통해 필요한 Page정보들을 외부 장치에 해당하는 NAND로 흘러 들어가거나, 아니

면 기존의 HDD로의 제어를 유지하게 됩니다.



좀더 세부적인 구조를 나타내어 보도록 하겠습니다.





 





















세부적인 구조는 커널소스상에서 불려지는 함수 레벨 까지의 분석을 도식화 하였습니다.



먼저 SSES의 위치적인 내용은 위쪽 그림에서는 I/O Scheduler의 상위에 위치한다고 적었습니다. 하지만 실제

적으로 Hooking을 하는 부분은 그 밑부분의 HDD에서 Request를 처리 하는 부분입니다.



장치디바이스에 Access할때, 각 장치 디바이스를 위한 큐가 존재하게 되는데 이때의 큐에 흘러 들어온

Request를 가져와 해당 Page 정보가 흘러 들어갈 Target의 위치를 수정하고, 다시 I/O Scheduler에 등록을 하

게 되면, 변환된 Target설정으로 인해, 다른 목적지로 데이터가 흘러 들어가게 됩니다.



다른곳에서는 외부장치에 흘러 들어가는 Data들의 메타데이터를 유지하여 관리하고, 관리된 정보들을 통해 어

느곳을 Target으로 정할 것인지를 결정 하게 됩니다.




이런 과정을 통해 IO입출력의 흐름을 제어 하게 됩니다.





☆ 글쓴이 소개☆
이정훈(18기)님의 글입니다.

Trackback Address :: http://blog.swssm.org/trackback/307
Name
Password
Homepage
Secret

Introduction to 손글씨 A2Z :: 2008/12/31 02:37   by 조일용(17기)

안녕하십니까 16년동안 손글씨만 써온 손글씨의 달인 악필 조일용입니다.

우리 악필팀은 17기 조일용과 18기 김정훈 두명이구요 손글씨 A2Z 프로젝트를 진행하고 있습니다.

이번 포스팅에선 손글씨 A2Z를 소개하도록 하겠습니다.


우선 시작발표회때 사용한 PPT를 보시겠습니다.

확대



간단히 말해 프로젝트의 목적은 사름의 손글시를 컴퓨터상의 폰트로 만들어 주는 프로그램을 작성하는 것입니다.

현재 폰트를 만드는 프로세스는 폰트 디자이너의 각고의 수작업을 통한 노력끝에 하나의 폰트가 만들어지기까지 수주에서 길게는 몇 달이 걸리는데, 우리는 누구든지 자기 글씨를 쉽고 빠르게 폰트로 만들수 있게끔 하고 싶었고 이 프로젝트는 이런 목적을 가지고 시작되었습니다.


프로젝트가 완료되면 다음의 과정을 통해 폰트를 만들 수 있습니다.


1. 손글씨 서식 출력

우선은 자신의 글씨를 종이에 써야겠죠? 사용자는 아래 프로그램을 이용하여 손글씨 서식을 출력한 후 그 위에 글씨를 씁니다.



2. 스캔

서식을 완성 했으면 스캐너를 이용하여 이미지파일을 만듭니다.


이제 이미지 파일이 완성되었으면 '손글씨 A2Z' 프로그램이 본격적으로 사용자의 손글씨를 폰트로 변환합니다.

아래 그림은 '손글씨 A2Z'의 구성을 보여줍니다. 음영으로 진하게 표시된 부분은 포스팅을 하는 현재까지 진행된 상태를 나타냅니다.




3. 이미지 프로세싱

우선은 스캔한 이미지에서 사용자의 글씨와 문자코드를 이미지프로세싱을 하여 추출해냅니다. 서식에는 약간의 트릭이 있는데 바로 글씨를 써야하는 박스는 파란색, 문자코드는 빨간색으로 출력하고 사용자의 글씨는 검정색으로 쓰도록 합니다. 이는 색상값을 이용하여 각각을 구분할 수 있으므로 이미지 프로세싱 과정을 상당히 단순화시켜 줍니다.

이미지 프로세싱과 글립분석은 아래 순서로 진행됩니다.



위의 모식도에서 푸른색은 글씨가 쓰여진 의 영역을 찾는 부분이고 붉은색은 문자코드를 확인하는 부분입니다. 회색은 사용자가 쓴 글씨를 추출해내는 부분입니다. 마지막으로 녹색은 글립의 형태를 분석하고 완성하는 부분입니다.

각각에 대한 자세한 설명은 추후 따로 포스팅을 하겠습니다.


4. 폰트파일 생성

트루타입폰트 파일은 폰트를 정의하는 여러개의 테이블로 구성되어 있습니다. Microsoft와 Adobe에서 표준화하고 유지하고 있는 트루타입스팩에 따르면 모든 트루타입 폰트는 11개의 필수 테이블을 정의하고 있어야 하며 그 외에 추가적으로 옵션테이블을 가질 수 있습니다.

아래 테이블은 트루타입 폰트에 반드시 포함되어야 할 11개의 필수 테이블 목록입니다.

Required Tables

Tag

Name

cmap

character to glyph mapping

glyf

glyph data

head

font header

hhea

horizontal header

hmtx

horizontal metrics

loca

index to location

maxp

maximum profile

name

naming table

post

PostScript information

OS/2

OS/2 and Windows specific metrics


필수 테이블 중 가장 중요한 테이블은 역시 글립을 구성하는 베지어 곡선을 정의하는 glyf 테이블입니다. 포스팅을 하고 있는 현재 스팩의 기준에 따라 glyf 테이블을 구현하고 있는 중입니다.

필수테이블에 대해서는 추후 따로 포스팅을 통해 더 자세히 설명하도록 하겠습니다.



5. 폰트를 사용

폰트가 완성되었다면 이제 사용하는 일만 남았습니다. 다음달 과제가 완료되면 아래 그럼처럼 응용프로그램에서 자유롭게 자신의 글씨를 사용하는 기쁨을 누릴 수 있을 것입니다.