달력

5

« 2024/5 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

'아두이노'에 해당되는 글 18

  1. 2016.02.08 RGB
  2. 2016.02.08 아날로그 출력 밝기 이동시키기
  3. 2016.02.08 기본 1개짜리 아날로그 출력
  4. 2016.02.08 기본 출력 digitalWrite()
  5. 2016.02.08 헤더파일 만들기
  6. 2016.02.08 부트로더
  7. 2016.02.08 최소한의 필수 회로
  8. 2016.02.07 프로세싱
2016. 2. 8. 22:44

RGB 아두이노/출력2016. 2. 8. 22:44




RGB LED에서 Red-> Yellow->Green-> Cyan->Blue -> Magenta 순으로 나타내고 싶다.
/*7.4 
control RGB
cookbook code
1*/

const int redPin = 3;
const int greenPin = 5;
const int bluePin = 6;
const boolean invert = true;

int color = 0;
int R, G, B;

void setup()
{
}

void loop()
{
  int brightness = 255;
  hueToRGB( color, brightness);
  
  analogWrite(redPin, R);
  analogWrite(greenPin, G);
  analogWrite(bluePin, B);
  
  color ++;
  if(color > 255)
  color = 0;
  delay(10);
}

void hueToRGB(int hue, int brightness)
{
  unsigned int scaledHue = (hue*6);
  unsigned int segment = scaledHue / 256;
  unsigned int segmentOffset = scaledHue - (segment*256);
  
  unsigned int complement = 0;
  unsigned int prev = (brightness * (255 - segmentOffset)) / 256;
  unsigned int next = (brightness * segmentOffset) / 256;
  if(invert)
  {
    brightness = 255-brightness;
    complement = 255;
    prev = 255-prev;
    next = 255-next;
  }
  
  switch(segment){
    case 0:
    R = brightness;
    G = next;
    B = complement;
    break;
    case 1:
    R = prev;
    G = brightness;
    B = complement;
    break;
    case 2:
    R = complement;
    G = brightness;
    B = next;
    break;
    case 3:
    R =complement;
    G = prev;
    B = brightness;
    break;
    case 4:
    R = next;
    G = complement;
    B = brightness;
    break;
    case 5:
    R = brightness;
    G = complement;
    B = prev;
    break;
  }
}

/*2
my RGB code*/ 

int color = 0;
const int redPin= 3, greenPin = 5, bluePin = 6;
int R, G, B;
const boolean invert = true;

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  //dicide each brightness of RGB
  brightOfRGB( color);
  
  analogWrite(redPin, R);
  analogWrite(greenPin, G);
  analogWrite(bluePin, B);
  
  color ++;
  if(color > 255)
  color = 0;
  delay(10);
}

void brightOfRGB(int color)
{
  //dicide the color
 long domain = color*6;
 long segment = domain/256;
 long segmentOffset = domain-segment*256;
 
  //value of each kind of brightness
  long brightness=150;
  long prev=(150*(255-segmentOffset))/255;
  long next = (150*segmentOffset)/255;
  int complement =0;
  
  //because of common anode
  if(invert)
  {brightness = 255 - brightness;
   complement = 255 - complement;
   next = 255 - next;
   prev = 255 - prev;}
  
 
  //output each brightness from color
  switch(segment)
  {
    //RED
    case 0:
    R = brightness;
    G = next;
    B = complement;
    break;
    //YELLOW
    case 1 :
    R = prev;
    G = brightness;
    B = complement;
    break;
    //GREEN
    case 2:
    R = complement;
    G = brightness;
    B = next;
    break;
    //CYAN
    case 3:
    R = complement;
    G = prev;
    B = brightness;
    break;
    //BLUE
    case 4:
    R = next;
    G = complement;
    B = brightness;
    break;
    //MAGENTA
    case 5:
    R = brightness;
    G = complement;
    B = prev;
    break;
  }

/*3
analogcode reference*/

const int redPin= 3, greenPin = 5, bluePin = 6;
int R=255, G=0, B=0;
int r=0, g=0, b=0;

void setup()
{
  Serial.begin(9600);
}

void loop()
{

  if(R ==255)
  {r= -1;
   g=1;
   b=0;}
  if(G==255)
  {r=0;
   g=-1;
   b=1;}
  if(B==255)
  {r=1;
   g=0;
   b=-1;}
  
  R +=r;
  G +=g;
  B+=b;
 
  Serial.println(R);
  analogWrite(redPin, 255-R);
  analogWrite(greenPin, 255-G);
  analogWrite(bluePin, 255-B);
  delay(1);  
}

[출처] [아날로그 출력] - RGB|작성자 DEW



:
Posted by youjin.A
문제:
LED 6개를 이용해서, 빛이 지나가면서 뒤에 꼬리가 생기게 하고 싶어요.
 
회로:
아두이노에서 PWM을 지원하는 3,5,6,9,10,11번 핀에 각각 LED를 연결합니다.
 
코드1:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
const int ledpins[] = {3,5,6,9,10,11};
const int SIZE = sizeof(ledpins) / sizeof(ledpins[0]);
int wait = 500;
 
void setup()
{
}
 
void loop()
{
   //first case
  for(int i=0; i<4; i++)
     {
      for(int n=i, m=0; n>=0; n--, m++)
          analogWrite(ledpins[n], 255/pow(3,m));
       
      delay(wait);
      }
      
   //second case   
   for(int n=4, m=0; n>=0; n--, m++)
          {if(n>0)
           analogWrite(ledpins[n], 255/pow(3, m));
           else
           analogWrite(ledpins[n], 0);}
           
   delay(wait);
      
  //third case    
  for(int i=0; i<5; i++)
      {
        for(int limit=i+1, led=5, dark=i; n>=0; led--, dark++)
          {if(led>limit)
           analogWrite(ledpins[led], 255/pow(3, dark));
           else
           analogWrite(ledpins[led], 0);}
           
        delay(wait);
      }
}
코드1 설명:
loop()함수를보면 first case와 second case, third case로 나누어져 있습니다.
first case는 빛의 머리부분이 0~4까지 오는 부분으로 
빛의 개수가 1개에서 4개로 증가하는 부분입니다.
second case는 빛의 머리부분이 5에 오는 부분입니다.
third case는 빛의 꼬리부분이 2~5를 지나 없으질 때까지의 부분으로
빛의 개수가 4개에서 0개로 줄어드는 부분입니다.
 
first case에서는 
i=0일 때, for문의 초기화 부분에서 n=0이니까 ledpins[0]이 머리가 됩니다.
그리고 조건 i>=0 때문에 for문이 종료됩니다.
i=1일 때, for문의 초기화 부분에서 n=1이니까 ledpins[1]이 머리가 되고,
증감연산에 의해 n=0이 되어 ledpins[0]은 밝기가 255/3으로 줄어듭니다.
그리고 조건 i>=0 때문에 for문이 종료됩니다.
i=2일 때, for문의 초기화 부분에서 n=2이니까 ledpins[2]가 머리가 되고,
증감연산에 의해 n=1이 되어 ledpins[1]의 밝기가 255/3으로 줄어들고,
다시 증감연산에 의해 n=0이 되어 ledpins[0]의 밝기가 255/9로 줄어듭니다.
그리고 조건 i>=0 때문에 for문이 종료됩니다.
i=3일 때, for문의 초기화 부분에서 n=3이니까 ledpins[3]이 머리가 되고,
증감연산에 의해 n=2가 되어 ledpins[0]의 밝기가 255/3으로 줄어들고,
다시 증감연산에 의해 n=1이 되어 ledpins[1]의 밝기가 255/9로 줄어들고,
다시 증감연산에 의해 n=0이 되어 ledpins[0]의 밝기가 255/27로 줄어듭니다.
그리고 조건 i>=0 때문에 for문이 종료됩니다. 
 
second case에서는
4~1의 led까지 점점 어두워 지다가 ledpins[0]에서 꺼집니다.
 
third case에서는 
i=0일 때, limit값이 1입니다. 
limit이하의 led는 꺼집니다.
for문의 초기화 부분에서 led=5이고 dark=0이기 때문에 
5번핀이 가장 밝고 다음 led로 갈수록 어두워 집니다.
그러다가 led가 1이되면 led는 꺼집니다.
i=1일 때, limit값은 2입니다.
for문의 초기화 부분에서 led=5이고 dark=1이기 때문에
5번 핀이 조금 어둡고 다음 led로 갈수록 더 어두워 집니다.
그러다가 led가 1이 되면 led는 limit값 이하이기때문에 꺼집니다.
이렇게 되다가 i=4일 때, limit값은 5가 됩니다.
for문의 초기화 부분에서 led=5이고 dark=4이지만 
모든 led가 limit값 이하이기 때문에 꺼집니다.
 
코드2:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
const int ledpins[10] = {3,5,6,9,10,11};
const int SIZE = sizeof(ledpins) / sizeof(ledpins[0]);
int wait = 500;
 
void setup()
{
}
 
void loop()
{
  for(int i=0; i<10; i++)
     {
      if(0<=i<=5)
         analogWrite(ledpins[i],255/ pow(3,0));
      if(1<=i<=6)
         analogWrite(ledpins[i-1], 255/pow(3,1));
      if(2<=i<=7)
         analogWrite(ledpins[i-2], 255/pow(3,2));
      if(3<=i<=8)
         analogWrite(ledpins[i-3], 255/pow(3,3));
      if(4<=i<=9)
         analogWrite(ledpins[i-4],0);
      
      delay(wait);
     }
}

 

 

코드2 설명:

우선 9~6까지의 가상의 LED를 생각해서 총 LED가 10개 있다고 생각합니다.

그리고 for문의 i는 가장 밝은 머리부분의 LED를 나타냅니다.

for문의 증감연산에 의해서 led의 머리부분이 0~9까지 이동하게 됩니다.

이때 각각의 led는 if문에 의하여 선택적으로 켜지게 됩니다. 

선택적으로 켜지는 것은 각자가 생각해 봅시다~ 


:
Posted by youjin.A
2016. 2. 8. 22:42

기본 1개짜리 아날로그 출력 아두이노/출력2016. 2. 8. 22:42

문제:
LED를 점점 밝아졌다가 어두워졌다 하도록 만들고 싶어요.
 
회로:
 
 
코드1: 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
const int led = 3;
int brightness = 0 , i;
 
void setup()
{
}
 
void loop()
{
 if(brightness  < 1)
 i = 1;
 else if(brightness > 254)
 i = -1;
 //light LED as brightness
 analogWrite(led, brightness);
 delay(10);
 
 brightness = brightness + i;
}

 

코드 설명:

loop()함수에서 맨 처음 brightness값은 0이지요?

그래서 if문에 의해서 i=0이 됩니다.

brightness = brightness + i에 의해서 brightness값이 점점 증가하다가,

brightness값이 255가 되면 i=-1이 되어,

brightness값이 점점 감소하게 됨니다.

그리고 다시 brightness값이 0이되면 i=1이되어,

brightness값이 점점 증가하게 됩니다.

 

코드2: 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const int led = 3 ;
 
void setup()
{  
}
 
void loop()
{
 for(int i=0; i<255; i++)
  {analogWrite( led, i);
   delay(10);}
 
 for(int i= 255; i>0; i--)
  {analogWrite( led, i);
   delay(10);}

 

코드2 설명:

첫번째 for문에서 i값이 점점 증가합니다.

i가 255가 되면 첫번째 for문은 끝나고

두번째 for문이 시작됩니다.

두번째 for문에서 i값이 점점 감소합니다.

i가 0이 되면 두번째 for문은 끝나고

첫번째 for문이 시작됩니다. 


:
Posted by youjin.A
2016. 2. 8. 22:41

기본 출력 digitalWrite() 아두이노/출력2016. 2. 8. 22:41

문제:

LED3개를 순서대로 깜박이게 하고 싶어요.

 

부품:

LED3개, 330옴 저항 3개

 

회로:

 

 

코드: 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
const int first = 3; 
const int second = 5; 
const int third = 6; 
 
void setup() 
{
 pinMode(first, OUTPUT); 
pinMode(second, OUTPUT); 
pinMode(third, OUTPUT); 
}
 
 void loop() 
{
  //blink LED one by one  
 blinkLED(first, 1000); 
 blinkLED(second, 500); 
 blinkLED(third, 800); 
 
void blinkLED(int pin, int time) 
 digitalWrite(pin, HIGH); 
 delay(time); 
 digitalWrite(pin, LOW); 
 delay(time); 

 

 

코드설명:

loop()함수 내부를 보면,

first, second, third 순으로 LED를 깜박인다는 것을 알 수 있습니다.

blink함수를 자세하게 보자면,

핀과 시간이 입력되면 해당핀에 입력된 시간만큼의 펄스를 주게되는 것입니다.

[출처] [디지털 출력] 1|작성자 DEW


:
Posted by youjin.A
2016. 2. 8. 21:57

헤더파일 만들기 아두이노/기본2016. 2. 8. 21:57

프로그램을 할때 #include <뭐시기.h> 로 라이브러리를 쓰죠?

이때 직접만든 라이브러리를 쓰려면 어떻게 해야 할까요?

 

라이브러리에다가 저장 시키고 싶은 함수:

예를 들어, 아두이노에서 Serial.print함수를 써서 여러변수의 출력값을 보려면 이렇게 코드를 짜야합니다.

Serial.print(val1);

Serial.print(","); 

Serial,print(val2);

Serial.print(",");

Serial.print(val3);

Serial.print(","); 

Serial,print(val3);

Serial.println(",");

음.. 굉장히 보기 싫고 귀찮네요 전.. 

그래서 visual studio에서 처럼 출력하고 싶은 마음이 간절해 짐니다.

printf("%d, %d, %d, %d ", val1, val2, val3, val4);

 

이때 요 함수를 쓰면  ​위에서 처럼 쓸수 있습니다!!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#define ARDBUFFER 16
 
int printt(char *str, ...)
{
  int i, count=0, j=0, flag=0;
  char temp[ARDBUFFER+1];
  for(i=0; str[i]!='\0';i++)  if(str[i]=='%')  count++;
 
  va_list argv;
  va_start(argv, count);
  for(i=0,j=0; str[i]!='\0';i++)
  {
    if(str[i]=='%')
    {
      temp[j] = '\0';
      Serial.print(temp);
      j=0;
      temp[0] = '\0';
 
      switch(str[++i])
      {
        case 'd': Serial.print(va_arg(argv, int));
                  break;
        case 'l': Serial.print(va_arg(argv, long));
                  break;
        case 'f': Serial.print(va_arg(argv, double));
                  break;
        case 'c': Serial.print((char)va_arg(argv, int));
                  break;
        case 's': Serial.print(va_arg(argv, char *));
                  break;
        default:  ;
      };
    }
    else 
    {
    
        Serial.print(str[i]);
        
    }
  };
  Serial.println();
  return count + 1;
}

이 함수를 아두이노 소스에서 붙여 넣기 하면 되죠. 

그러나!! 이 함수는 자주!! 쓸것이기 때문에 라이브러리에다가 이 함수를 저장해서 계속 쓰고 싶습니다.

 

 

라이브러리 만들기:

자! 그럴때는 일단 아두이노 라이브러리에 폴더하나를 만듭니다. 

저는 myfuc이라고 했습니다.

 

폴더안에 (폴더와 같은 이름.h) 인 메모장을 만듭니다.

저는 myfuc.h 입니다.

이때 생각 하셔야 할께 #incldue의 의미가 단순이 파일을 복사 붙이기 한다는 사실!

 

이 폴더안에 위에 printt함수를 복사해주고 맨~ 위에 #include "Arduino.h"를 써줍니다. 

그러면 완료!!

 

 

 

 

 

출처:

-라이브러리

https://www.inkling.com/read/arduino-cookbook-michael-margolis-2nd/chapter-16/recipe-16-4 

http://arduino.cc/en/Hacking/LibraryTutorial 

http://playground.arduino.cc/code/library

-printt함수

http://jangsalt.tistory.com/entry/%EA%B0%80%EB%B3%80-%EC%9D%B8%EC%88%98-vastart-vaend-vaarg-valist

http://forum.falinux.com/zbxe/index.php?document_srl=406096&mid=gcc 

'아두이노 > 기본' 카테고리의 다른 글

부트로더  (0) 2016.02.08
최소한의 필수 회로  (0) 2016.02.08
:
Posted by youjin.A
2016. 2. 8. 21:56

부트로더 아두이노/기본2016. 2. 8. 21:56

1. 하드웨어 

원리

위에건 뉴시티제품의 usbISP입니다.  

사진처럼 1번 스위치를 왼쪽으로 돌려주세요~ 

USBISP의 6개의 핀을 아두이노의 빨간색 동그라미쳐진 핀에 연결합니다.

USBISP의 VCC는 아두이노의 VCC에

USBISP의 GND는 아두이노의 GND에

USBISP의 RST는 아두이노의 RESET에

USBISP의 SCK는 아두이노의 SCK에... 아시겠죠^^

아두이노에 빨간색 동그라미의 핀순서는 왼쪽 그림과 같습니다.

 

STEP1

그냥 선으로 연결해도 되지만 매번 귀찮기 때문에 납땜을~

초록색선은 점프했습니다~

 

STEP2

이제 USBISP와 아두이노를 연결해보겠습니다~

 

STEP3

다음으로 컴퓨터와 연결하겠습니다~

 

 

 

2. 소프트웨어

우선 USBISP의 드라이버를 설치 안했다면 해야되요!!

http://cafe.naver.com/newtc 

여기서 AD- USDISP V3.5 윈도우용 다운

 

AVR STUDIO4를 사용합니다.

http://blog.naver.com/ryumr?Redirect=Log&logNo=110074109653에서

AVR STUDIO4.18 다운~

클릭
AVR클릭

 

1)메인 설정

장치를 아두이노 328로 설정하고 프리퀀시를 115.2로 낮게 설정. 

 

2)퓨즈 설정

 

3)부트로더 프로그래밍

칩이 328이고, 우노로 부트로더하고 싶다면 파일은

아두이노폴더\hardware\arduino\bootloaders\optiboot\optiboot_atmega328.hex 

 

4. 락비트 설정

 

5. 테스트

Blink예제로 테스트 해보세요~



**다른 방법

http://oogundam.tistory.com/73

'아두이노 > 기본' 카테고리의 다른 글

헤더파일 만들기  (0) 2016.02.08
최소한의 필수 회로  (0) 2016.02.08
:
Posted by youjin.A
2016. 2. 8. 21:55

최소한의 필수 회로 아두이노/기본2016. 2. 8. 21:55

ATmega328의 핀 배치:


 

최소한의 필수 회로: 

 
 
 
1. 전원 공급
2. OSC
3. 리셋에 풀업저항
ATmega328 1개,

100nF 커패시터 1개,

10K 저항 1개,

16MHz 클록 크리스털

 

 

 

 

 

 


 

 FT232 연결:

 

리셋에 0.1uF 커패시터를 달아줘야 한다.

 

 

 

 

-드라이버 다운로드:

http://www.eleparts.co.kr/EPX8N7KL

 

 

 

 

 

참고:

http://plughouseblog.blogspot.kr/2010/03/arduino-breadboard-diy.html

'아두이노 > 기본' 카테고리의 다른 글

헤더파일 만들기  (0) 2016.02.08
부트로더  (0) 2016.02.08
:
Posted by youjin.A
2016. 2. 7. 23:17

프로세싱 아두이노/프로세싱2016. 2. 7. 23:17


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
const int ledPin = 9;      // the pin that the LED is attached to
 
void setup()
{
   // initialize the serial communication:
   Serial.begin(9600);
   // initialize the ledPin as an output:
   pinMode(ledPin, OUTPUT);
}
 
void loop() {
   byte brightness;
 
   // check if data has been sent from the computer:
   if (Serial.available()) {
     // read the most recent byte (which will be from 0 to 255):
     brightness = Serial.read();
     // set the brightness of the LED:
     analogWrite(ledPin, brightness);
   }
}

 

 



3. 프로세싱!!

프로세싱에 아래의 코드를 넣는다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import processing.serial.*;
  Serial port;
  
  void setup() {
  size(256, 150);
  
  println("Available serial ports:");
  println(Serial.list());
  
  // Uses the first port in this list (number 0).  Change this to
  // select the port corresponding to your Arduino board.  The last
  // parameter (e.g. 9600) is the speed of the communication.  It
  // has to correspond to the value passed to Serial.begin() in your
  // Arduino sketch.
  port = new Serial(this, Serial.list()[0], 9600);  
  
  // If you know the name of the port used by the Arduino board, you
  // can specify it directly like this.
  //port = new Serial(this, "COM1", 9600);
  }
  
  void draw() {
  // draw a gradient from black to white
  for (int i = 0; i < 256; i++) {
  stroke(i);
  line(i, 0, i, 150);
  }
  
  // write the current X-position of the mouse to the serial port as
  // a single byte
  port.write(mouseX);
  }



:
Posted by youjin.A