'본좌급 분류'에 해당되는 글 168건
- 2010.06.25 리눅스(우분투)에서 심비안 개발
- 2009.12.30 미크로 콥터 소스 컴파일...
- 2009.12.30 PWM TO PPM 소스
- 2009.12.30 쿼드 콥터..재료비
- 2009.11.05 SHG (세컨드 하모닉 제너레이션)
- 2009.10.30 타워프로 40A esc 를 pwm 에서 i2c 로 개조 노트
- 2009.10.27 NSOM 제작 노트 #3 - 회로의 구성
- 2009.10.27 NSOM 제작 노트 #2 - 튜닝 포크에 대하여..
- 2009.10.27 NSOM 제작 노트 #1 - 팁에 대하여
- 2009.10.14 atiny2313 - 테스트 소스.
리눅스(우분투)에서 심비안 개발
거의 다 깔려 있으나 몇개는 빠져있네요
g++
libSM-dev
libxext-dev
libxcursor-dev
libxi-dev
Make
libxrender-dev
libfreetype6-dev
libxfixes-dev
libxrandr-dev
libglib2.0-dev
libfontconfig1-dev
libx11-dev
libxft-dev
libgl-dev and libglu-dev (if using QtOpenGL)
다만 open gl 사용 시에 libgl-dev 는 시냅틱 관리자에서 찾아볼 수가 없네요.
어쨌든
http://www.forum.nokia.com/info/sw.nokia.com/id/e920da1a-5b18-42df-82c3-907413e525fb/Nokia_Qt_SDK.html
사이트에서 linux 32비트 파일을 받습니다.
다운로드 받은 후에는 파일을 실 행 가능하게 만 듭니다.
$ chomd 777 Nokia...
# ./Nokia...
실 행 시키면 됩니다.
귀찮아서 전 온라인 방식을 다운로드 했네요.
뭐 동의하고 어쩌고 저쩌고 하면, 다운로드가 시작됩니다.
ps. 참고로 한글 입력 방식에 문제가 있어 입력시에 한글이 깨진다면
http;//www.spoonzero.com/archives/177
을 참조하라.
미크로 콥터 소스 컴파일...
Q. avrstudio 에서 첫 컴파일이 안됩니다.
A.
Project 메뉴 -> configuration Options -> General 탭
Use external Makefile 을 체크한 후에, 같은 폴더 내의 Makefile 을 선택
* 참고로, Makefile 에서 hex 파일의 출력을 소스 폴더 내로 지정하였기에,
더이상 hex가 dep 폴더 밑으로 가지 않는다.(에러처럼 나타나지만 에러아님)
PWM TO PPM 소스
#include <avr/io.h>
#define sbi(PORT,BIT) PORT|=_BV(BIT) //set bit
#define cbi(PORT,BIT) PORT&=~_BV(BIT) //clear bit
// use 20MHz clock for high resolution..
void send_100us()
{
register unsigned char i;
for(i=0;i<11;i++)
{
asm volatile("PUSH R0");
asm volatile("POP R0");
asm volatile("PUSH R0");
asm volatile("POP R0");
}
}
int main()
{
unsigned char pd;
unsigned char pb;
// out port : PB4
// input port : PB,PD except PD4
DDRB =0x10;
DDRD = 0x00;
// asm volatile("cli");
// asm volatile("sei");
PORTB = 0xef; // for internal pull up
PORTD = 0Xff;
pb = PINB;
pd = PIND;
while(1) {
if(pd != PIND) {
sbi(PORTB,4);
send_100us();
cbi(PORTB,4);
pd = PIND;
} else if(pb != PINB) {
sbi(PORTB,4);
send_100us();
cbi(PORTB,4);
pb = PINB;
}
}
return 1;
}
SHG (세컨드 하모닉 제너레이션)
높은 피크 파워를 가지는 잘 편광된 빔은 크리스탈 내에서 이러한 효과를 발생하는데 가장 적절하다. 두개의 편광 설정이 가능하다. 타입 1은 두개의 빔이 같은 편광을 같는 경우이고 타입 2는 두개의 빔의 편광 방향이 서로 직교하는 경우이다. 타입 1은 다이 레이저에서 파장을 튀기기 가장 적절하다. 인풋 광이 복굴절 크리스탈의 ordinary 방향으로 입사하면 출력광은 extraordinary 방향에서 발진된다. (따라서 두개의 편광 방향은 서로 직교하게 된다)
입사광과 출력광의 위상 가간섭성에 의한 제한으로 SHG는 두 개의 빔의 위상이 잘 매칭된 경우에 이루어진다. 이는 모멘텀 보존으로 설명할 수 있다. 크리스탈의 유전율은 주파수에 관한 함수이므로(굴절율은 유전율의 함수이다), 빔의 입사각 또한 주파수에 의존하게 된다.
크리스탈의 굴절율은 온도에도 의존한다.
타워프로 40A esc 를 pwm 에서 i2c 로 개조 노트
먼저 사용하지 않는 BEC를 제거한다.
두개의 LM317을 제거하고 47uF 탄탈 cap 과 100nF 세라믹 캡을 제거한다.
2.
원래의 esc는 전류를 탐지하기 위하여 두개의 adc 를 사용한다.
만약 adc로 사용할 핀이 i2c 로 사용하는 sda, scl 단자와 겹친다면,
겹치는 라인은 제거해주고, 겹치지 않는 adc 단자와 다시 연결해줄 필요가 있다.
http://www.rcgroups.com/forums/attachment.php?attachmentid=2825156&d=1255965726
빨간 동그라미 친 부분이 sda, scl 라인이 되며 파란 동그라미가 컷팅된 라인이다.
새롭게 하단의 두 adc핀 adc6,adc7 에서 연결 한다.
3.
따라서 원래 수신기와 연결되는 signal,vcc,gnd 커넥터는
sda,scl,gnd 가 되며 VCC와 GND 는 따로 공급해줘야 한다.
4. ISP용 단자를 땜질하여 꺼낸다.
5.퓨즈비트 설정
포니 포크 퓨즈 비트 설정 창을 띄우고
ckopt, bootsz1,bootsz0,boden,sut1 에만 체크한다.
6.헥사 파일 다운로드
NSOM 제작 노트 #3 - 회로의 구성
1. 회로의 구성
NSOM을 구성하는 데에 필요한 회로는 크게 음귀환 회로, 대역 통과 필터, 프리 앰프 등이 있다.
모든 기기를 배터리를 사용하지 않는 이상 60Hz의 전원 노이즈가 꽤나 크게 나타난다. 튜닝 포크를 사용하는 경우엔 더욱 심한데, 이를 없애주기 위해서는 대역 통과 필터가 필요하다. 대략 통과 영역을 25~35 kHz 사이로 디자인 하며, 물론 2차, 3차로 걸러주면 더 좋다. 회로는 인터넷 상에 널려 있는 버터워쓰 필터로 디자인 한다.
튜닝 포크에서 나오는 전압은 매우 약하기 때문에 프리 앰프를 사용하여 어느 정도 증폭해줘야 한다. 증폭된 output 이 음귀환 회로의 입력 전압으로 들어가기 때문에, 음귀환 회로의 인풋 레인지만큼 증폭시켜야 할 것이다. 대략 우리가 흔히 쓰는 op-amp 의 입력전압이 -15V ~15V 이므로 이에 맞게 해준다.
음귀환 회로는 PID 이다. 그러나 우리는 적분 회로만을 사용한다. 프리 앰프에서 나온 신호와 레퍼런스 전압(이는 가변 저항으로 조절할 수 있게 디자인한다) 를 디퍼런셜 앰프로 받는다. 디퍼련셜 앰프로 받은 전압을 적분 회로로 적분하여 출력한 후에, 그 출력을 피에조 스테이지의 Z축에 넣어주면 된다. 피에조 스테이지는 대략 전압이 0~100V 입력을 받으므로 고전압 앰프가 필요한 경우가 있다. 하지만 우리가 가진 피에조 스테이지는 대략 비싼 것으로, 고전압 앰프 없이도 사용할 수 있다. 100V 에 20um를 움직이므로 대략 10V 정도로 2um 의 움직임을 가질 수 있는 것이다. 샘플의 토폴로지가 어느 정도인지는 모르겠지만 2um 보다 러프한 경우는 극히 드물 것이다.
NSOM 제작 노트 #2 - 튜닝 포크에 대하여..
장벽에 부딪히면 익스포넨셜하게 파동 함수가 감소하는 걸 배우셨을겁니다.
광학에서도 마찬가지입니다. 물론 고체 물리에서와 같은 장벽은 아니더라도
여러 가지 경우에(예를 들어 반사) 빛은 익스포넨셜하게 감소합니다.
빛이 경계면에서 반사되지 않고 좀 더 진행한다는 놀라운 특성은 구스-한센 쉬프트 등을 생각하시면 쉽게 이해하실 겁니다.
광학에서도 마찬가지로 파동 함수의 해인 전기장의 절대값 제곱은 바로 빛의 세기가 됩니다. 이러한 빛이 어떤 상황에 의하여 익스포넨셜하게 감소하기 전에 경계면에서 대략 100nm 이하의 거리에서는 전자장이 존재하며 이를 탐지하는 것에서부터 근접 광학은 출발합니다. 이러한 영역에서 사물을 볼 수 있게 해주는 것이 바로 NSOM 입니다.
따라서 NSOM 에서 가장 중요한 기술은 팁을 물체의 표면과 100nm 이하의 거리를 계속 유지 시켜 주는 것이 가장 중요합니다. 하지만 걱정할 필요 없습니다. 우리는 AFM 이라는 기술을 이미 가지고 있습니다. AFM 은 말 그대로 아토믹 포스 마이크로스코프로, 원자간의 인력을 이용합니다. 이러한 힘을 우리는 쉐어 포스라고 부릅니다. 이는 반데어 발스 힘의 일종인데 팁 끝의 원자와 표면의 원자간의 힘을 일정하게 유지시킬 수 있다면 그 거리가 일정하게 될 것입니다.
이를 위해서는 원자간의 힘에도 반응하는 - 정말 민감하겠지요? - 아주 민감도가 좋은 센서가 필요한데, 상용 AFM 에서는 캔티레버라는 것을 사용합니다. 하지만 우리는 주변에서 구하기 쉬운 튜닝 포크를 이용합시다.
튜닝포크는 주변 전자 부품 점에서 손쉽게 구할 수 있는 시계 크리스탈 내에 들어 있습니다. 튜닝 포크는 주파수 특성이 매우 좋은 석영을 이용하여 고유 파장수만큼 진동하는 소자입니다. 그러나 매우 민감하여 주변의 환경이 변하면 고유 파장이 조금씩 쉬프트 합니다. 주변의 환경이라 함은 여러 가지가 있지만, 우리는 튜닝 포크 끝에 걸리는 미세한 힘에도 민감하게 반응하는 성질을 이용하면 됩니다.
시계용 크리스탈을 롱노우즈를 이용하여 원통의 뿌리 부분을 살살 돌려가며 눌러주면, 원통형 껍질 내부에 결합되어 있던 접착제가 부서지며 껍질을 벗겨낼 수 있습니다. 그러면 두 개의 막대가 나란히 나와 있는 튜닝 포크가 보일 것이다. 주의할 점은 일단 껍질을 벗겨내면 내부에 들어 있는 수자가 매우 연약하여 튜닝 포크의 각도 등을 조절하기 어려우므로, 껍질을 벗겨내기 전에 수평을 맞춥니다.
그 후에 튜닝 포크 옆에 나란히 팁을 붙입니다.
튜닝 포크에 팁을 붙일 때에는 5분 에폭시를 이용해야 합니다.. 순간 접착제 등을 사용하면, 공진이 발생하기 어렵습니다. 에폭시의 양은 조금 많아도 상관없지만, 사용한 에폭시의 양에 의하여 튜닝 포크의 Q 값이 결정되므로 이는 많은 시행 착오를 거쳐야 할 것입니다.
일단 튜닝 포크와 파이버를 붙인 후에는 바뀐 공진 주파수를 찾아야 합니다. 아무래도 튜닝 포크 옆에 무게가 나가는 무언가가 덧붙여져 잇으므로 고유 진동수가 변하는게 당연합니다. 제대로 붙인 팁이라면 공진 주파수가 원래의 고유 주파수인 32.768 kHz 근처에 존재하게 된다. 튜닝 포크에 펑션 제너레이터를 이용하여 사인파를 인가한 후에 31.00 kHz 에서부터 주파수를 스캔하여 오실로스코프로 아웃풋 전압이 최대가 되는 공진 주파수를 찾습니다. 원래의 튜닝 포크는 Q값이 매우 크므로 피크가 샤프하나, 팁을 붙인 후에는 많이 브로드해집니다. 그러나 너무 브로드하면 팁의 민감도가 떨어졌다는 의미이므로, 적절히 붙이는 것이 중요합니다. 이는 손맛을 매우 타는 작업으로 작업자의 숙련도가 중요한 요소가 됩니다.
Q값을 측정하는 방법은 다음과 같다. 먼저 공진 주파수를 찾아 공진 주파수에 맞춘니다. 이때에 주파수를 1kHz 단위로 바꾸면, 게인이 변하므로 오실로스코프 상 아웃풋 전압이 뚝 떨어지게 됩니다. 그 때의 시간을 재면 됩니다. 이러한, Transient 타임이 대략 100 us 정도면 적절합니다. 이 시간은 한마디로 스캔 시에 표면의 변화에 따라서 팁이 쫓아갈 수 있는 시간이라고 볼 수 있습니다. 그렇다면 빠르면 빠를수록 좋은 거 아닌가 생각이 되겠지만, 막상 시간이 너무 짧으면 오버댐핑을 일으켜 stable 해지는데 시간이 더 걸리게 됩니다. 이 때부터는 제어의 얘기가 되겠네요 ㅎ
NSOM 제작 노트 #1 - 팁에 대하여
NSOM 은 여러 가지 형태로 만들 수 있습니다.
그 중 가장 전형적인 형태는 포인트 소스 혹은 포인트 디텍터로써의 사용입니다.
포톤 터널링을 하지 않는 이상, 이러한 포인트 소스 또는 포인터 디텍터로써
nsom을 구현하기 위해서는 먼저 아퍼쳐가 매우 작은 팁이 필요합니다.
파장 이하의 사이즈의 스트럭쳐를 보기 위해는 마찬가지로 파장 이하 사이즈의 구멍이 난 팁이 필요한데, 이를 제작하는 일반적인 방법은 보통 광파이버의 클래딩을 벗기고 코어 부분을 뽀족하게 한 후에 알루미늄이나 금 혹은 은 등으로 코팅을 한 후에 FIB(포커싱된 이온빔) 등의 장비를 이용해서 100nm 가량의 구멍을 뚫습니다.
여기서 끝이 매우 뽀족한 팁을 taperd tip 이라고 부릅니다. 이러한 팁을 만드는 방법은 두 가지가 있습니다.
하나는 케미컬 에칭의 방법이며, 하나는 CO2 레이저를 쏘이며 양 옆으로 당기는 방법이다. 전자는 불산을 이용하기 팁을 에칭하기 때문에, 일반적으로 웨트 스테이션이 없는 랩의 경우에는 쉽게 만들 수 없고, 이렇게 만들어진 팁을 구매를 해야 한다. 후자는 서울대학교 물리학과 제원호 교수님의 방에 장비가 있기 때문에, 부탁을 하여 직접 만들 수 있습니다. 제대로 만들어진 팁은 그 끝이 100nm 정도로 얇게 떨어집니다. 이 때 레이저의 세기와 양 옆으로 당기는 세기(속도) 등은 기울기를 결정짓습니다. 기울기가 너무 가파르면 안되며 그 이유는 빛이 파이버로 커플링된 후에 도파로를 지나는 동안에 손실이 커지기 때문입니다.
이렇게 만들어진 팁은 스퍼터 등의 장비를 통해서 은 박막을 올립니다. 팁 둘레로 균일하게 올리기 위해서 디포짓을 하는 동안 팁을 뱅글 뱅글 돌려줘야 합니다.
스퍼터가 없는 경우 이빔 증착기나 써멀 증착도 가능합니다.
red 쪽에서 은의 광학적 특성이 좋기 때문에 대게 은으로 코팅을 합니다.
이렇게 늘여진 파이버를 끝을 코팅하는 이유는 sub-wavelength 의 aperture를 만들기 위함입니다. 빛을 원하는 부분으로만 들어오도록 하기 위함이죠.
따라서 이렇게 코팅된 팁에 구멍을 뚫어줘야 합니다. 100nm 정도의 3차원 물체에 구멍을 뚫는 방법은 딱히 FIB 말고는 생각나지 않네요. 서울대학교 이병호 교수님 연구실에 fib 장비가 있습니다.
atiny2313 - 테스트 소스.
#include <avr/io.h>
#include <avr/eeprom.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#define sbi(PORT,BIT) PORT|=_BV(BIT) //set bit
#define cbi(PORT,BIT) PORT&=~_BV(BIT) //clear bit
void delay_us(unsigned int delay) // 1us
{
register unsigned int i;
for(i=0;i<delay;i++)
{
asm volatile("PUSH R0");
asm volatile("POP R0");
asm volatile("PUSH R0");
asm volatile("POP R0");
}
}
void delay_ms(unsigned int time_ms) // 1ms
{
register unsigned int i;
for(i=0;i<time_ms;i++)
{
delay_us(250);
delay_us(250);
delay_us(250);
delay_us(250);
}
}
/********************************************************************************************
string 처리 함수들
*******************************************************************************************/
void __strcpy(char* str1,char* str2)
{
int i = 0;
while(*(str2+i)!= 0) {
*(str1+i) = *(str1+2);
i++;
}
*(str1+i) = '\0';
}
// str : string
// return : size of str
char __strlen(char *str) // verified
{
char ret = 0;
while( (*(str+ret)) != '\0') {
ret++;
if (ret > 100) {
break;
}
}
return ret;
}
void __strcatc(char* str,char c)
{
char j;
j = __strlen(str);
*(str+j) = c;
*(str+j+1) = '\0';
}
void __clrstr(char* str,char size)
{
int i;
for(i = 0; i< size;i++) *(str+i) = '\0';
}
unsigned int __atoi(char* str) // verified
{
char i;
unsigned c;
unsigned int ret =0;
char s = __strlen(str);
for(i=0;i < s;i++) {
c = (*(str + i)) - '0';
ret = ret*10 + c;
}
return ret;
}
void __itoa(char* str,char s,long i) // verified
{
char c;
*(str+s -1) = '\0';
if(i < 0) {
*str = '-';
i = i * -1;
} else {
*str = '+';
}
for(c = s - 2 ;c >= 1;c--) {
*(str+c) = i % 10 + '0';
i = i / 10;
}
}
void __putch(char data)
{
while(!(UCSRA &0X20));
UDR=data;
UCSRA |= 0X20;
}
void send_hex(char data)
{
__putch(data/10 + '0');
__putch(data%10 + '0');
}
void __puts(char* str)
{
do{
__putch(*(str));
str++;
} while(*(str) != '\0');
}
volatile short angle[8] = {0,0,0,0,0,0,0,0};
volatile unsigned char buff[16];
volatile unsigned char buff_offset = 0;
#define DELAY_TIME 2
#define PULSE_WIDTH 50
// 0xffff - 625 = 0xfd82
#define FREQ_TIME 0xfd82
#define MAX_SERVO_VAL 99
SIGNAL(SIG_TIMER1_OVF)
{
asm volatile("cli"); // disable interrupt
int i;
TCNT1=FREQ_TIME;
__putch('s');
PORTB = 0xff;
delay_us(220);
for(i = 0 ;i < 254;i++) {
delay_us(2);
if(i == angle[0]) {
cbi(PORTB,1);
}
if(i == angle[1]) {
cbi(PORTB,2);
}
if(i == angle[2]) {
cbi(PORTB,3);
}
if(i == angle[3]) {
cbi(PORTB,4);
}
}
asm volatile("sei"); // disable interrupt
}
SIGNAL(SIG_USART0_RX )
{
asm volatile("cli"); // disable interrupt
unsigned char c;
c=UDR;
UCSRA |= 0X80;
*(buff + buff_offset) = c;
if(c == 0) {
buff_offset = 0;
angle[0] = buff[0];
angle[1] = buff[1];
angle[2] = buff[2];
angle[3] = buff[3];
angle[4] = buff[4];
angle[5] = buff[5];
angle[6] = buff[6];
angle[7] = buff[7];
}
asm volatile("sei"); // enable interrupt
}
int main()
{
unsigned char c;
// unsigned char buff[30];
unsigned char offset;
asm volatile("cli"); // disable interrupt
DDRB = 0xff; // 1111 1111
DDRD = 0xFE;
// serial set
UCSRA=0X00;
UCSRB=0X98; // (1<<RXEN) | (1<<TXEN); // recieve enalbe, trnas enable..
UCSRC= 0X06; //(1<<USBS) | (3 << UCSZ0); // async, no parity, 1 stop bit
// BAUD = 16M / 16 /(UBRR+1)
// UBRR = 20M / 16 / BAUD - 1
UBRRH=0X00;
UBRRL=0X67; //9600 bps
PORTB = 0x00;
TCCR1B |= 0X05; // pre-scaler : clk/ 1024 = 31250 hz
// 31250 / 625 = 50Hz (20ms)
TCNT1=FREQ_TIME;
// OCR1A=0X001;
TIMSK=(1<<TOIE1); // TOIE1에 인터럽트허용
angle[0] = angle[1] = angle[2] = angle[3] = 120;
asm volatile("sei"); // enable interrupt
c = 'f';
offset = 0;
do {
} while(1);
return 1;
}