레이블이 두에인 게시물을 표시합니다. 모든 게시물 표시
레이블이 두에인 게시물을 표시합니다. 모든 게시물 표시

2015년 4월 27일 월요일

[00101] 아두이노 두에 (arduino due)의 PWM

  아두이노 두에 (arduino due) 의 PWM 핀은 다음 그림의 핀맵에 나온 바와 같이 같이 D2부터 D13까지 12개를 사용할 수 있다. 따라서 우노보다 더 많은 핀을 PWM출력으로 사용할 수 있다.


단순히 핀 수만 많은 것이 아니라 우노와 달리 최대 해상도를 12비트까지 지정해 줄 수 있다. 따라서 우노는 [0, 255]범위의 출력(8비트)을 사용했었는데 두에의 숫자 범위는 최대가 [0, 4095] 이다.

  PWM의 해상도를 조절하려면 다음과 같은 함수를 사용해야 한다.

---------------------------------------------
analogWriteResolution(nBits);
---------------------------------------------

입력인수는 몇 비트를 사용할 것인가를 지정해주면 되며 기본값은 8비트이다. 만약 12비트로 해상도를 높이고 싶다면 다음과 같이 하면 된다.

---------------------------------------------
analogWriteResolution(12);
---------------------------------------------

그런 다음 analogWrite()함수를 사용하면 된다. 예를 들어서

---------------------------------------------
analogWrite(6, 4095); // 6번핀에 4095값을 내보낸다.
---------------------------------------------

  만약 어떤 아날로그 센서의 입력이 [0, 1023] 범위의 값인데 이것을 [0. 4095]범위의 값으로 변환하고 싶다면 map()이라는 함수를 사용하면 된다.

---------------------------------------------
map(sVal, sMin, sMax, cMin, cMax);
---------------------------------------------

이 함수는 sVal 값을 원래의 범위인 [sMin, sMax] 에서 변환하고자 하는 범위 [cMin, cMax]에 해당하는 값으로 바꾸는 함수이다. 만약 (0, 1023)범위의 센서값을 [0,4096]값으로 바꾸고 싶다면 다음과 같이 하면 된다.

---------------------------------------------
map(sVal, 0, 1023, 0, 4095);
---------------------------------------------

이 함수들을 사용해서 PWM을 12비트 해상도로 변경하고 [0,1023]범위의 센서값을 PWM 으로 매핑하는 예는 다음과 같다.

---------------------------------------------
analogWriteResolution(12);
analogWrite(12, map(sensorVal, 0, 1023, 0, 4095));
---------------------------------------------

여기서 sensorVal 변수에는 10비트 아날로그 센서값이 저장되었다고 가정한다.
[#00101]

[00100] 아두이노 두에(Due) 의 PWM 주파수 바꾸기

  아두이노 Due의 PWM 주파수는 1KHz 로 정해져 있다. 그런데 응용 분야에 따라서 이 주파수를 변경해 주어야 하는 경우가 있다. 하지만 아두이노에서 PWM의 주파수를 바꿔주는 공식 API 는 없어서 무척이나 불편하다. 그래도 AVR 계열의 아두이노에서는 이런 불편을 해소하기 위해서 사용자가 작성한 라이브러리 (PWM.h)라도 있는 것 같은데 Due의 경우에는 아직까지 그런 라이브러리는 없는 것 같다.

  구글링을 해본 결과 아주 방법이 없는 것은 아니었다. 일단 다음의 헤더 파일을 연다.(윈도의 경우)

Program Files > Arduino > hardware > arduino > sam > variants > arduino_due_x > variant.h

64비트 윈도라면 Program Files(x86) 폴더 밑을 뒤져야 한다. 이 파일을 열면 다음과 같이 정의된 부분이 나온다.

-------------------------------------------------
/*
* PWM
*/
#define PWM_INTERFACE PWM
#define PWM_INTERFACE_ID ID_PWM
#define PWM_FREQUENCY 1000
#define PWM_MAX_DUTY_CYCLE 255
#define PWM_MIN_DUTY_CYCLE 0
#define PWM_RESOLUTION 8
-------------------------------------------------

이 상수값들을 변경하면 PWM의 주파수나 기본 분해능을 설정할 수 있다고 한다. 예를 들어서 주파수를 10KHz로 변경하고 싶다면 PWM_FREQUENCY 를 10000 으로 바꾸면 된다.

  조그만 장난감 모터는 1KHz 로도 충분하다. 내가 가지고 있는 모터는 조금 용량이 큰데 (12V/12.9W) 이 정도만 되도 주파수를 조금 키워야 한다. 몇 번 실험해보니 12KHz 정도가 적당한 것 같다.

(2V 이상 인가되어야 회전이 시작됨)
[#00100]

[00099] 아두이노두에(arduino due)의 기본 동작

아두이노 두에(이하 두에)보드에는 USB연결단자가 두 개가 있는데 기본적으로 DC잭에 가까운 마이크로USB포트와 PC를 연결하면 전원이 공급되며 프로그램을 업로드할 수 있는 환경이 된다. 이 경우 별도로 DC잭으로 전원을 공급할 필요는 없으나 필요할 경우 7V~12V를 연결해야 한다. (참조페이지)

한 가지 주의할 점은 기존 아두이노보드들은 5V로 구동되는데 비해서 이것은 구동 전압이 3.3V라는 것이다. 입출력 핀에 5V신호를 인가하면 보드에 손상이 올 수 있으니 주의해야 한다. 장점은 라즈베리파이와 같은 리눅스보드의 GPIO핀과 직결할 수 있다는 점이다.

  두에를 프로그래밍하려면 아두이노 IDE 1.5이상의 버전을 사용해야 한다. PC와 USB를 연결하고 스케치를 실행한 후 도구>보드>아두이노Due(Programming port)를 선택하고 도구>포트>COM? 에서 올바른 포트를 선택하면 일단 환경설정이 끝난 것이다. 예제의 Blink 를 열어서 업로드하면 보드상의 LED 가 깜빡이는 것을 볼 수 있다.

핀의 구조를 도시한 다이어그램은 쉽게 찾을 수 있다.












D49번 핀에 부저의 (+)를 연결하고 GND를 연결한 후 실험을 진행했다.

------------------------------------------------
int led = 13;
int buzz = 49;
void setup() {
    pinMode(led, OUTPUT);
    pinMode(buzz, OUTPUT);
}
void loop() {
    digitalWrite(led, HIGH);
    delay(500);
    digitalWrite(led, LOW);
    delay(500);

    digitalWrite(buzz, HIGH);
    delay(50);
    digitalWrite(buzz, LOW);
------------------------------------------------

LED가 한 번 깜박일 때마다 (약 1초 간격으로) 삑- 삑- 거리는 프로그램이다.
[#00099]

[00098] 아두이노 두에(due)의 성능 테스트

  아두이노 두에의 성능 테스트를 위해서 간단한 프로그램을 작성해서 실행해 보았다. 프로그램은 다음과 같이 2번 핀을 연속적으로 on/off 시키는 것이다. 그리고 이 핀의 주파수가 어떻게 나오는가를 스코프로 찍어보는 것이다.

--------------------------------------------------------
void setup() {
    // put your setup code here, to run once:
    pinMode(2, OUTPUT);
}
void loop() {
    // put your main code here, to run repeatedly:
    while(1) {
        digitalWrite(2, HIGH);
        digitalWrite(2, LOW);
    }
}
-----------------------------------------------------

2번 핀을 스코프로 찍어서 본 결과는 다음과 같다. 화질이 안 좋지만 세로 줄 한 칸이 1us이므로 구형파의 한 주기가 5us 이다. 따라서 주파수는 200kHz라는 것을 알 수 있다. 가로줄은 한 칸이 1V이므로 on 상태에서 3.3V 의 값을 갖는것을 알 수 있다. 

 
 

  그런데 똑같은 프로그램을 아두이노 우노에 집어 넣고 실행 시킨 결과 구형파의 한 주기가 8us 가 나왔다. 주파수로 따지면 125kHz이다. 

  이것만으로 단순하게 성능비교를 하기에는 무리지만 두에가 우노보다 약 1.6배의 성능을 보여준다. 우노의 클럭주파수가 16MHz 이고 두에가 84MHz이다. 내부적인 연산 속도는 5배 이상(실수 연산의 경우에는 더 높은 성능을 기대할 수 있을 것이다.)의 성능을 가질 것으로 짐작할 수 있으나 디지털 핀과 같은 하드웨어를 제어하는 경우에는 우노에 비해서 5배 이상의 성능을 기대한다는 것이 무리라는 결론이 나온다.
[#00098]

2015년 4월 26일 일요일

[00094] 아두이노 듀(due) 보드의 스펙

  아두이노 보드 중에 아두이노 Due 가 있다. 이탈리아어로 due 는 두에 라고 읽고 '둘'이라는 뜻이다. (숫자 1, 2, 3 이 uno, due, tre ... 이다.) 보통 아두이노는 AVR 프로세서를 사용해서 최대 클럭 속도(16MHz)나 배정도(double) 실수 사용에 제약이 있으나 이것은 ARM Cortex-M3 프로세서를 사용하여 훨씬 높은 성능을 가지고 있다.

  일단 클럭주파수가 84 MHz이고 우노와(16MHz) 클럭으로만 비교하자면  6배의 성능을 가진다. 내부적으로 동작 전압이 3.3V이다. 또한 DAC도 내장하고 있으며 프로그램에서 64bit double형도 다룰 수 있다고 한다. 우노에서는 float형이나 double형이나 4바이트(32비트)이므로 배정도 실수 계산이 불가능하지만 두에는 그렇지 않다. 성능이 높은 만큼 가격은 비싼 편이다.


스펙은 다음과 같다.

  • Microcontroller : AT91SAM3X8E
  • Operating Voltage : 3.3V
  • Input Voltage (recommended) : 7-12V
  • Input Voltage (limits) : 6-16V
  • Digital I/O Pins : 54 (of which 12 provide PWM output)
  • Analog Input Pins : 12
  • Analog Outputs Pins : 2 (DAC)
  • Total DC Output Current on all I/O lines : 130 mA
  • DC Current for 3.3V Pin : 800 mA
  • DC Current for 5V Pin : 800 mA
  • Flash Memory : 512 KB all available for the user applications
  • SRAM : 96 KB (two banks: 64KB and 32KB)
  • Clock Speed : 84 MHz

  동작 클럭이 84MHz이므로 단순히 비교하면 우노보드보다 5배 이상 성능이 높으며 디지털 핀수가 굉장히 많다. PWM 개수도 우노보드보다 더 많으며 해상도도 12bit까지 지정할 수 있다. 그리고 ADC가 두 개 있다는 점과 모든 디지털핀에 인터럽트를 설정해 줄 수 있다는 것도 큰 장점이다. 우노의 경우 두 개의 외부 인터럽트만 사용할 수 있다.

  핀 동작 전압이 3.3V이므로 레별 변환기 없이 라즈베리파이와 같은 보드와 직결할 수 있다는 점도 장점이다. 우노보드는 디지털포트 전압이 5V라서 라즈베피라이의 핀과 직결할 수 없다.
[#00094]