2017년 8월 22일 화요일

[3] 각 하드웨어를 연결할 수 있는 모듈 만들기(1) – 스캔 파형 신호 생성 방법(아두이노 코드)

[3] 각 하드웨어를 연결할 수 있는 모듈 만들기(1) – 스캔 파형 신호 생성 방법
1. 아두이노 듀를 이용한 톱니파 생성
[make sawtooth wave]
int i = 0;
void setup() {
 // put your setup code here, to run once:
 analogWriteResolution(10);  
}

void loop() {
 // put your main code here, to run repeatedly:
 analogWrite(DAC0, i);

 i = i+2;
 if(i > 1023)
   i = 0;
}

20160906_201034.jpg

2. 스캔 파형 구현 방식
1.png

  1. 라즈베리 파이의 작동 과정
한 프레임의 이미지를 만들 준비가 되어 있으면 enable핀(12번 핀)에서 LOW출력
s_p_signal핀(4번 핀)이 하강 에지가 되면 이미지의 한 행의 데이터를 읽음.
8개의 핀으로 구성된 ADC핀(16~23번 핀)에서8bit 데이터를 병렬로 받는다.
s_p_signal핀이 상승 에지가 되면 데이터 읽는 것을 멈춘다. 다음 행의 데이터를 받을 준비를 한다.
행의 수가 512줄이 될 때까지, (2)번 과정~(4)번 과정을 반복한다.
하나의 이미지를 이루는 데이터를 다 받았으면 enable핀에서 HIGH를 출력한다.

  1. 아두이노의 작동 과정
enable핀(13번과 12번 핀)이 HIGH이면, output핀(DAC0핀)은 가장 낮은 전압 상태를 유지하고 s_p_signal핀(2번 핀)은 HIGH를 출력한다.
enable핀이 LOW이면, output핀에서 톱니파 생성.
그리고 s_p_signal핀에서는 DAC0의 출력이 가장 높은 값일 때 상승에지를 발생시키고, DAC0의 값이 가장 낮은 값일 때 하강에지를 발생시킨다.

3. 아듀이노 듀 프로그래밍

1.png
1.png

개발자가 생각한 기본 작동 원리
아듀이노 듀를 단일 기능을 하는 모듈로 생각하였다. 다시 말해, 단일 기능을 하는 모듈이란 프로그램 가능 하지 않고 정해진 기능만 하는 칩을 의미한다. 예를 들어, 우리가 구매할 수 있는 일정한 기능을 하는 칩들은 NAND 게이트인 4011같은 논리 게이트 칩이나 기울기 센서처럼 기울어진 정도에 따라 데이터를 출력하는 칩들이다. 이러한 칩들은 정해진 기능만 수행할 수 있으며 그 종류는 어마어마하게 많다.
이와 마찬가지로 아두이노 듀를 다음 기능을 하는 단일 칩으로 생각하였다.
스캔을 하기 위해서 톱니파을 만들어 난다.
라즈베리 파이와의 동기화(타이밍을 맞추는 것)를 위해서 상승에지와 하강에지를 만들어 낸다.

[코드]
#define ENABLE 0
#define DISABLE 1
#define START 0
#define STOP 1
#define MAXDIGITAL 1024

#define ENABLE_PIN 13
#define DISABLE_PIN 12
#define S_P_SIGNAL_PIN 2
#define OUTPUT_PIN DAC0

int enablePinState;

void makeSawtooth();
void enableISR();
void disableISR();

void setup(){
 Serial.begin(9600);
 //output
 analogWriteResolution(10);
 analogWrite(OUTPUT_PIN, 0);
 //s_p_signal
 pinMode(S_P_SIGNAL_PIN, OUTPUT);
 digitalWrite(S_P_SIGNAL_PIN, STOP);
 //enable
 pinMode(ENABLE_PIN, INPUT_PULLUP);
 pinMode(DISABLE_PIN, INPUT_PULLUP);
 attachInterrupt(ENABLE_PIN, enableISR, FALLING); //http://m.blog.naver.com/yuyyulee/220310875023
 attachInterrupt(DISABLE_PIN, disableISR, RISING);
 if(digitalRead(ENABLE_PIN))
   enablePinState=DISABLE;
   else
   enablePinState=ENABLE;
}

void loop(){
 while(enablePinState == DISABLE){
   Serial.println(1);
 }

 delayMicroseconds(100);

 digitalWrite(S_P_SIGNAL_PIN, START);  
 makeSawtooth();
 digitalWrite(S_P_SIGNAL_PIN, STOP);
}

void makeSawtooth(){
 int i;

 for(i=0; i<MAXDIGITAL; i+=2){
   if(enablePinState == DISABLE){
     analogWrite(OUTPUT_PIN, 0);
     return;
   }

    analogWrite(OUTPUT_PIN, i);
 }

 analogWrite(OUTPUT_PIN, 0);
}


void enableISR(){
 enablePinState = ENABLE;
}

void disableISR(){
 enablePinState = DISABLE;
}

[결과]
CH1 - output
CH2 - s_p_signa

1)enable 상태
20161027_172600.jpg

2)disable 상태
20161027_174515_001.jpg

댓글 없음:

댓글 쓰기

clear images were obtained