로그인회원등록 내글장바구니주문조회현재접속자
 상품 검색








 게시판 검색





 
 
회원등록 비번분실


온라인 입금계좌
ㆍ기업은행
ㆍ219-043192-01-028
ㆍ이건영

      거래은행 바로가기
 
 Sensor Applications
아듀이노 공개소스
작성자 avrtools™        
작성일 2012/03/29
첨부#1 tiny-oscope.zip (599KB) (Down:638)
ㆍ추천: 0  ㆍ조회: 17511   
  Arduino 고속 오실로스코프 #3
아듀이노 고속 오실로스코프와 프로세싱
아듀이노에 내장된 10비트 ADC를 8 비트 고속으로 읽어서 프로세싱으로 표시하는 방법이다.
이번에 사용한 M328-mini V2.0 과 USB2serial V2.0 으로 UNO방식의 아듀이노 기판이다. 
 
아듀이노 기판의 10 비트 ADC는 고속 오실로스코프용으로 적당하지않다.
오히려 8비트로 전송해도 충분히 파형을 표현할 수 있으며, 속도도 더욱 빠르게 된다.
 
아듀이노 기판의 펌웨어 소스
//
// Arduino OscilloScope.pde
// 참조 : Arduino Forum › General › Exhibition › Arduin-O-Scope를 고속으로 개조 .
 
unsigned char adc_value;
unsigned char adc_result;
unsigned char sample =0;

// ADC 초기화 함수 (고속 설정)
void adc_init(){  
  ADMUX = B01100000;  // VRef =AVCC, Left Adjust, channel =0
  ADCSRB = B00000000; // Analog Input bank 1
  // ADC enable, ADC start, manual trigger mode, ADC interrupt enable,
  ADCSRA = B11001100;   // 마지막 3비트는 ADC의 변환속도를 설정한다, prescaler 100 = 1/4,
}

// ADC 가로채기 처리함수 
#pragma vector =ADC_vect
ISR(ADC_vect) {
    adc_result =adc_value;
    adc_value =ADCH;  // store ADC result (8-bir precision)
    sample =1;
    ADCSRA |= B11000000;  // manually trigger the next ADC
}

// 초기화 함수 
void setup(){ 
  adc_init();  // internal ADC init
  Serial.begin(115200); // uart init for 115.2K bps
}

// 주 함수 
void loop() { 
 if (sample ==1) {
     Serial.write(adc_result);  // send 8 bit binary
     sample =0;
 } 
}

이상 스케치 소스를 아듀이노 IDE 편집창으로 복사해서 붙혀 넣고, 컴파일한 다음 업로드하면
지금까지 소개한 어떤 아듀이노 오실로스코프보다 빠르게 작동한다.
다음은 이 펌웨어와 연동시킬 PC측의 프로세싱을 소개한다.
 
아듀이노 프로세싱 소스
// 참조 사이트 : http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1233536778
// Arduino Forum › General › Exhibition ›
// Arduin-O-Scope (a tiny oscilloscope project)
// 저자 : Autor : estiers

// 프로세싱 변수 선언 
import processing.serial.*;
Serial inPort;                           // the port to read from
int BAUD_RATE = 115200;                  // set baud rate here, needs to be the same value as in the arduino code
int BUFFER_SIZE=200;                     // data buffer size
int GRIDS=10;                            // number of grids to draw
int inVal;                               // y-data read in from the arduino
int lastVal;                             // old value of y-data
int[] yVals = new int[BUFFER_SIZE];      // y-data buffer, scaled to the screen size
int[] xVals = new int[BUFFER_SIZE];      // x-data buffer, scaled to the screen size
int trigger;                             // trigger, when the incoming data passes this value a frame starts
int timeOut;                             // if no trigger is detected by timeOut samples, plot what is at input port
int i;                                   // counter
boolean blinker;                         // blinks a light on each frame update so you know when program is running   
boolean noTrigger;                       // true until trigger is detected
boolean noTimeOut;                       // true until timeout runs out if no trigger is found first

// 적색으로 된 숫자 2 는 아듀이노에 사용된 직렬포트의 등록순서다. (나타난 포트순서로 0, 1, 2, 3,,,,을 설정)
// 아듀이노 스케치의 통신포트 목록에 com3, com4, com5 중에서, com5를 사용한다면 2로 설정한다.

void setup(){
  inPort = new Serial(this, Serial.list()[2], BAUD_RATE);   
  size(600, 400);                                           
  background(0);
  stroke(255);
  trigger=127;  //  2.5V
  timeOut=2*BUFFER_SIZE;
}

// 화면 표시 함수 
void draw()
{
  inPort.clear();   // 직렬포트의 버퍼를 지운다.
  noTrigger =true;
  noTimeOut =true;
  lastVal =255;
  i=0;

 // 트리거 제어 (표시시작 시점의 결정)
  while(noTrigger & noTimeOut){
     if (inPort.available()>1){                                    // 직렬포트의 데이터 입력을 대기
         inVal=(inPort.read());                                    // 이제 직렬포트의 데이터를 읽는다.
         if((inVal>trigger)&(lastVal<=trigger)) noTrigger=false;   // check for trigger event
         lastVal=inVal;
         i++;
         if (i>timeOut) noTimeOut=false;                           // 신호가 없으면 시간초과다.
      }
      else{
        delay(1);
      }
  }
 
  // 파형 데이터를 수집
  i=0;
  while(i<BUFFER_SIZE){                                            // read a buffer full of date                 
    if (inPort.available()>1){                                          // 통신포트에서 파형을 수신한다.
          inVal=( inPort.read());
          yVals[i]=height-((height)* (inVal+1))/255;                    // scale data to screen height
          xVals[i]=(width*i)/BUFFER_SIZE;                          // scale x-value to screen width
          i++;
      }
      else{
        delay(1);
      }
  }
 
  // 녹색 보조눈금, 모눈을 먼저 그린다.
  background(0);
  stroke(0,64,0);
  for(i=1;i<GRIDS;i++){
    line((width*i)/GRIDS,0,(width*i)/GRIDS,height);
    line(0,(height*i)/GRIDS,width,(height*i)/GRIDS);
  }
 
  // 오렌지 색으로 트리거된 레벨을 표시
  stroke(128,0,128);
  line(0,height-(height*trigger)/254,width,height-(height*trigger)/255);
 
  // 황색으로 측정한 파형을 그린다
  stroke(255,255,0);
  for (i=1;i<BUFFER_SIZE;i++){
    line(xVals[i-1],yVals[i-1],xVals[i],yVals[i]);
  }
 
  // 좌측상단의 첫번째 트리거된 상태를 보여주는 백색 점을 그린다.
  // 깜빡이지 않으면 오류가 있는 것이다.
  stroke(255);
  if (blinker) ellipse(10,10,5,5);
  blinker=!blinker;
 
  // 트리거 되면 바로 우측 2번째에 녹색 점을 그린다. 
  if (!noTrigger){
    stroke(0,255,0);
    ellipse(20,10,5,5);
  }

  // 시간초과시 우측 3번째에 적색 점을 그린다.
  if (!noTimeOut){
    stroke(255,0,0);
    ellipse(30,10,5,5);
  }
 
  // 전체 프로세싱의 다른 부분을 위해 이 프로세싱이 쉬는 시간
  delay(50);
}

// 마우스로 화면을 클릭하면 트리거 레벨을 변경한다.
void mousePressed() {
  trigger =(height-mouseY) *255/height;
}

프로세싱 평가
이 프로세싱 소스를 프로세싱 편집창에 넣고 작동시키면 오실로스코프로 표시된다.
이 프로세싱의 성능은 1 바이트만 파형 데이터로 사용하므로 빠르다.
또한 마우스로 트리거 레벨을 변경하면, 좌우로 흐르는 파형을 정지시켜 볼 수도 있다.
트리거가 되면 좌측 상단의 작은 트리거 표시가 깜빡이는 변화도 있다. 
그외에 0.5V 눈금이 있어, 진짜 오실로스코프를 사용하는 화면과 같다. 멋지다. !!!

공개된 프로세싱 소스는 0V와 5V에서 선이 안보이므로, 결국 프로세싱을 수정하였다.

수정후 0V 와 5V의 신호의 라인이 보인다. 트리거 레벨도 초기값을 0.5V로 변경하였다.
0.5V로 트리거된 오픈된 1Vpk의 입력잡음의 신호파형이 화면에서 흐르지 않고 정지된다.

위의 프로세싱 소스를 바꾸려면, 아듀이노 프로세싱 사용법을 참조.
http://www.avrtools.co.kr/technote7/board.php?board=download&command=body&no=122
 
기타
PC에 연결하는 오실로 스코프의 한계는 PC로 전송하는 측정 파형의 전송속도이다.
115.2K bps로는 아무리 ADC가 빠르더라도, 전송속도의 한계로 측정하는 주파수가 빠르면 불리해 진다.

아듀이노 기판과 프로세싱의 전송속도를 250K bps나 500K bps로 바꾸면 일부 해결이 가능하다.
그러나 느린 주파수의 표시에 불리해 진다. 4개로 보이던 주변잡음의 60Hz 주기가 1개로 보인다.


 
결국 프로세싱 화면에서 시간축을 변경할 수 있는 시간축 조절기능이 필요하다.
가능성은 아듀이노 스케치와 프로세싱의 통신속도를 500K bps즉 500000으로 바꾸고
int BUFFER_SIZE =500; 을 int BUFFER_SIZE =1680; 으로 바꾸어 보니 X축의 시간이 변경된다.

 
 
프로세싱 소스의 맨 위, BUFFER_SIZE =500;을 BUFFER_SIZE =200000; 으로 변경하고,
프로세싱 소스의 맨 아래, void mousePressed() 함수를 마우스 클릭으로 감소하도록 수정한다.
수정된 함수는 버퍼크기가 200 보다 작아지면, 자동으로 20,000으로 변경된다.
 
// move the trigger level to wherever the user clicks the mouse
void mousePressed() {
  trigger =(height-mouseY) *255/height;
  if (10000 <=BUFFER_SIZE) BUFFER_SIZE -=1000;  // decrease buffer -1000
  else if (1000 <=BUFFER_SIZE) BUFFER_SIZE -=500;  // decrease buffer -500
  else if (200 <=BUFFER_SIZE) BUFFER_SIZE -=100;  // decrease buffer -100
  else if (200 >BUFFER_SIZE) BUFFER_SIZE =20000;  // restore buffer size

}
 
이렇게 수정한 프로세싱은 아래와 같이 낮은 주파수를 측정하는 설정으로 시작한다.
 
마우스를 화면위에 놓고 마우스 단추를 누르면 높이에 따라서 트리거 레벨이 바뀌고,
마우스 단추를 누르는 횟수만큼 버퍼의 크기를 감소시켜 높은 주파수의 파형을 확대한다.
소스에서 mouseY 혹은 마우스의 좌측, 우측 단추를 구분하여 버퍼크기를 가산 혹은 감산 하면 더욱 좋다.

프로세싱 컴파일러 편집기는 File 매뉴에서 Export Application을 누르면, 실행파일 o-scope.exe를 만든다.
다음 첨부파일은 버퍼를 2000으로 변경하고, 트리거 전압과 버퍼크기를 마우스로 변경할 수 있는
아듀이노 기판의 펌웨어와 PC측 프로세싱 소스와 프로세싱 편집기 없이 작동가능한 실행파일이다.
소스의 통신속도는 16MHz 우노에서 500Kbps를 사용하고 있다. tiny-oscope.zip(598.5KB)
 
교류신호 입력
-2.5V ~ +2.5V의 교류파형을 측정할 때는 아래의 회로를 추가해야 한다.
이보다 큰 신호를 받으려면, 입력측에 저항감쇄기를 넣거나,
OP Amp의 Feedback 저항(-in과 out 사이에 연결된 저항)을 줄일 수도 있다.  


OP AMP는 LM358, LM2904, TL082, TL062 등등 단전원 Dual OP Amp는 대부분 사용할 수 있다.
OP Amp의 전원 +VC 8번 핀은 5V에 연결하고, -VC 4번핀은 GND로 연결한다.
 
10K 가변저항은 스코프의 0V 레벨의 표시위치를 바꾸는 DC OFFSET ADJ 이다.
중간의 스위치는 AC-DC를 전환하는 스위치이며, 470nF 캐패시터가 없으면 스위치 없이 쇼트시켜도 된다.

3.3V Vcc를 Vref로 사용하여 1.65V의 Bias를 추가하여 60Hz 교류파형을 측정한 예  (완결판)
 
사진에서 수직축 1칸은 0.5V이고, 0V는 중심이며 -1.5V ~ +1.5V의 파형을 분석할 수 있다.
입력핀에 저항 분압회로를 추가하면, 얼마든지 높은 전압을 측정하는 것이 가능하다.

M328-mini V2.0 기판은 전원점퍼를 3.3V로 변경하기만 하면, FS 이 바로 3.3V로 변경되고 감도도 올라간다.
더 작은 신호를 크게 표시하려면, AREF를 내부 1.1V로 변경하면, ADC의 FS(입력전압범위)이 1.1로 변경된다.

이 프로그램은 무료 소프트웨어로, 신체와 재산 상의 어떤 위험과 손해를 보상하지 않습니다.
이 프로그램은 GNU 무료 소프트웨어 배포규정을 따릅니다.
Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
 AVRTOOLS™

   
윗글 비접점식 QTouch 방식 근접검출 스위치
아래글 아날로그 8ch 데이터 로거
    N         제목    글쓴이 작성일 조회 추천
61 비접점식 QTouch 방식 근접검출 스위치 leeky 2016/01/21 (목) 488 0
60 Arduino 고속 오실로스코프 #3 avrtools™ 2012/03/29 (목) 17511 0
59 아날로그 8ch 데이터 로거 avrtools™ 2012/03/29 (목) 2654 0
58 Arduino DMX512 송신기 제작 avrtools™ 2012/03/15 (목) 2749 0
57 nRF24L01 무선모듈의 사용방법 avrtools™ 2012/03/07 (수) 5490 0
56 초음파 거리 측정기의 제작 avrtools™ 2011/09/18 (일) 4592 0
55 3축 가속도 센서 ADXL335 avrtools™ 2011/09/09 (금) 3144 0
54 Arduino Uno USBserial 펌웨어의 변경 avrtools™ 2011/08/27 (토) 2815 0
53 Arduino MIDI의 소개 avrtools™ 2011/08/19 (금) 3173 0
52 Arduino 고속 Oscillo Scope #2 avrtools™ 2011/08/12 (금) 2798 0
51 Arduino Uno 및 USB2serial Uno의 소개 [2] avrtools™ 2011/07/30 (토) 3043 0
50 Arduino IDE에서 AVRISP-mkII 사용방법 avrtools™ 2010/10/22 (금) 7632 0
49 아듀이노 초음파 거리측정 및 응용 avrtools™ 2010/03/14 (일) 3963 0
48 M328-USB의 비밀 온도센서 avrtools™ 2010/01/02 (토) 3398 0
47 M168-mini로 만드는 USBasp avrtools™ 2009/10/10 (토) 4996 0
46 OBDuino ISO9141 소스의 설명 avrtools™ 2009/10/08 (목) 3928 0
45 아듀이노 0017 업그레이드 avrtools™ 2009/08/18 (화) 3459 0
44 Arduino 0015 업그레이드 avrtools™ 2009/06/01 (월) 3159 0
43 CC2500 Zigbee RF Modem #1 [4] avrtools™ 2008/11/20 (목) 6315 0
42 아듀이노 소프트웨어 Ver 0012 avrtools™ 2008/09/23 (화) 3823 0
41 Arduino 소프트웨어 설치방법 avrtools™ 2008/08/31 (일) 5341 0
40 아듀이노 PC 카메라 제작 avrtools™ 2008/10/28 (화) 6941 0
39 아듀이노 AVR-ISP V2의 제작 [6] avrtools™ 2008/10/22 (수) 7902 0
38 아듀이노 J1850-PWM 스캐너 avrtools™ 2008/10/15 (수) 4356 0
37 아듀이노 MPGduino의 제작 avrtools™ 2008/10/11 (토) 4617 0
36 아듀이노 OBD-II PID 처리함수 avrtools™ 2008/10/12 (일) 5243 0
35 아듀이노 OBD-II PID 송수신 함수 avrtools™ 2008/10/09 (목) 9313 0
34 아듀이노 ODB-II 스캐너 제작 [9] avrtools™ 2008/10/04 (토) 16506 0
33 아듀이노 AC전원 THD 측정 [2] avrtools™ 2008/09/30 (화) 6443 0
32 아듀이노 소프트방식 16Bit ADC avrtools™ 2008/09/23 (화) 5327 0
31 아듀이노 초음파 모듈의 제작. avrtools™ 2008/09/22 (월) 4588 0
30 아듀이노 Wii 프로세싱 avrtools™ 2008/09/20 (토) 3940 0
29 아듀이노 초음파 거리측정 avrtools™ 2008/09/20 (토) 5814 0
28 아듀이노 8x5 초소형 전광판 avrtools™ 2008/09/11 (목) 4421 0
27 아듀이노 4선식 터치패널 avrtools™ 2008/09/10 (수) 4469 0
26 아듀이노 2색 8x8 LED avrtools™ 2008/09/10 (수) 4652 0
25 아듀이노 24x6 LED 전광판 avrtools™ 2008/09/10 (수) 5179 0
24 아듀이노 8x8 LED 프로세싱 avrtools™ 2008/09/10 (수) 3935 0
23 아듀이노 32x16 RGB 전광판 avrtools™ 2008/09/06 (토) 13440 0
22 아듀이노 맥박검출기 avrtools™ 2008/09/03 (수) 9154 0
21 아듀이노 적외선 거리센서 avrtools™ 2008/09/01 (월) 5631 0
20 아듀이노 DMX 수신장치 [7] avrtools™ 2008/08/31 (일) 6482 0
19 아듀이노 AVR-ISP 만들기 avrtools™ 2008/08/30 (토) 3973 0
18 아듀이노 POV #3 avrtools™ 2008/08/30 (토) 3283 0
17 아듀이노 POV #2 avrtools™ 2008/08/30 (토) 3091 0
16 AVR 병렬포트 굽기장치 avrtools™ 2008/08/30 (토) 4949 0
15 아듀이노 DMX 송신기 avrtools™ 2008/08/28 (목) 4910 0
14 아듀이노 부트로더의 개조 [1] avrtools™ 2008/08/28 (목) 5594 0
13 아듀이노 병렬포트 굽기장치 avrtools™ 2008/08/26 (화) 4026 0
12 아듀이노 POV #1 avrtools™ 2008/08/26 (화) 3320 0
11 아듀이노 MIDI 드럼 leeky 2008/08/24 (일) 4533 0
10 아듀이노 SD/MMC 카드 avrtools™ 2008/08/24 (일) 9565 0
9 아듀이노 MIDI 플륫 avrtools™ 2008/08/24 (일) 3395 0
8 아듀이노 RGB LED avrtools™ 2008/08/23 (토) 4825 0
7 아듀이노 USB 오실로스코프 [2] leeky 2008/08/21 (목) 6201 0
6 가속도계 ADXL202 응용소스 avrtools™ 2008/08/20 (수) 4688 0
5 아듀이노 가속도센서 avrtools™ 2008/08/18 (월) 4633 0
4 아듀이노 RC서보 제어 avrtools™ 2008/08/17 (일) 4985 0
3 아듀이노 910-ISP 만들기 avrtools™ 2008/08/16 (토) 4509 0
2 아듀이노 온도센서, XBee 송수신 avrtools™ 2008/08/15 (금) 7205 0
1 아듀이노 기본명령 avrtools™ 2008/08/07 (목) 6312 0
1

바구니 : 0
 보관함 : 0
오늘뷰 : 0
HOME   |   회사소개   |   제휴안내   |   회사위치   |   서비스이용 약관   |   개인정보 보호정책   |   사이트맵
17015 경기도 용인시 기흥구 동백중앙로16번길 16-25, 508호. 전화 : 031-282-3310
사업자 등록번호 : 697-47-00075 / 대표 : 이건영 / 업태 : 제조업 / 종목 : LED조명, LED전원, 제어장치.
개인정보 관리책임자 : 홈페이지 관리자 . Copyright ⓒ2016 아크레즈 (ACLEDS INC.)
HOME TOP PREVNEXT 0 0 0