1. 4 Digit 7 Segment 1개

 

배선

Arduino 74HC595 4 digit 7 segment
  1 (Q1) 7 (B segment)
  2 (Q2) 4 (C segment)
  3 (Q3) 2 (D segment)
  4 (Q4) 1 (E segment)
  5 (Q5) 10 (F segment)
  6 (Q6) 5 (G segment)
  7 (Q7) 3 (DP segment)
GND 8 (GND)  
  9 (Q7')  
VCC 10 (MR)  
D10 11 (SH_CP)  
D11 12 (ST_CP)  
GND 13 (OE)  
D9 14 (DS)  
  15 (Q0) 11 (A segment)
VCC 16 (VCC)  
D2   12 (D1)
D5   9 (D2)
D6   8 (D3)
D13   6 (D4)

아두이노와 4 Digit 7 Segment 사이에 74HC595를 넣고 연결한다.
 
소스

//a,b,c,d,e,f,g 상태값
byte segValue[10] = {
  0b11111100, //0
  0b01100000, //1
  0b11011010, //2
  0b11110010, //3
  0b01100110, //4
  0b10110110, //5
  0b10111110, //6
  0b11100000, //7
  0b11111110, //8
  0b11110110, //9
};

byte digitPin[4] = { 2, 5, 6, 13 }; //segment 위치 핀
int dataPin = 9; //DS Pin
int clockPin = 10; //SH_CP Pin
int latchPin = 11; //ST_CP Pin

unsigned long readTime = 0; //현재시간
int d1 = 0; //1의 자리
int d2 = 0; //10의 자리
int d3 = 0; //100의 자리
int d4 = 0; //1000의 자리

void setup()
{
    for (int j = 0; j < 4; j++)
    {
      pinMode(digitPin[j], OUTPUT);
      digitalWrite(digitPin[j], HIGH);
    }
    pinMode(dataPin, OUTPUT);
    pinMode(clockPin, OUTPUT);
    pinMode(latchPin, OUTPUT);
}

void loop()
{
    readTime = millis() / 1000;
    d1 = readTime % 10; //1의 자리
    d2 = (readTime / 10) % 10; //10의 자리
    d3 = (readTime / 100) % 10; //100의 자리
    d4 = (readTime / 1000) % 10; //1000의 자리

    segOutput(3, d1, 0); //1의 자리
    if (readTime >= 10) segOutput(2, d2, 0); //10의 자리  
    if (readTime >= 100) segOutput(1, d3, 0); //100의 자리  
    if (readTime >= 1000) segOutput(0, d4, 0); //1000의 자리  
}
//LED 초기화
void segClear()
{
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, LSBFIRST, 0);
    digitalWrite(latchPin, HIGH);    
}
//LED 출력
void segOutput(int d, int Number, int dp)
{
    segClear();
    digitalWrite(digitPin[d], LOW);
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, LSBFIRST, segValue[Number]);
    digitalWrite(latchPin, HIGH);    
    delayMicroseconds(1000);
    digitalWrite(digitPin[d], HIGH);
}

 
프로그램을 실행하면 0부터 시작하여 1초에 1씩 증가한다.


복잡도가 증가하여, 디버깅하는데 시간이 많이 걸렸다.
 
shiftOut 함수 참고
https://www.arduino.cc/reference/ko/language/functions/advanced-io/shiftout/

 

shiftOut() - 아두이노 참조

설명 한번에 한 비트씩의 바이트를 옮긴다. 최고(가장 왼쪽) 또는 최저(가장 오른쪽) 비트부터 시작한다. 각 비트에, 클락 핀은 하이로 풀 되고, 다음 비트는 데이터 라인에서 읽히고, 클락 핀은

www.arduino.cc

 
74HC595 참고
https://bbangpower-blog.blogspot.com/2021/03/74hc595.html

 

[아두이노] 74HC595 시프트 레지스터 연동

PLC, Factory Automation

bbangpower-blog.blogspot.com

 

2. 4 Digit 7 Segment 2개

 

배선

Arduino 첫 번째 74HC595 두 번째 74HC595 두 번째 4 digit 7 segment
    1 (Q1) 7 (B segment)
    2 (Q2) 4 (C segment)
    3 (Q3) 2 (D segment)
    4 (Q4) 1 (E segment)
    5 (Q5) 10 (F segment)
    6 (Q6) 5 (G segment)
    7 (Q7) 3 (DP segment)
GND   8 (GND)  
    9 (Q7')  
VCC   10 (MR)  
D10   11 (SH_CP)  
D11   12 (ST_CP)  
GND   13 (OE)  
  9 (Q7') 14 (DS)  
    15 (Q0) 11 (A segment)
VCC   16 (VCC)  
D2     12 (D1)
D5     9 (D2)
D6     8 (D3)
D13     6 (D4)

첫 번째 4 Digit 7 Segment와 첫 번째 74HC595는 1. 배선과 동일하다.
첫 번째 74HC595의 9 (Q7')에서 두 번째 74HC595와 연결하는 점이 다르다.
아두이노와 두 번째 4 Digit 7 Segment 사이에 두 번째 74HC595를 넣고 연결한다.
 
소스

//a,b,c,d,e,f,g 상태값
byte segValue[11] = {
  0b11111100, //0
  0b01100000, //1
  0b11011010, //2
  0b11110010, //3
  0b01100110, //4
  0b10110110, //5
  0b10111110, //6
  0b11100000, //7
  0b11111110, //8
  0b11110110, //9
  0b00000000, //10
};

byte digitPin[4] = { 2, 5, 6, 13 }; //segment 위치 핀
int dataPin = 9; //DS Pin
int clockPin = 10; //SH_CP Pin
int latchPin = 11; //ST_CP Pin

/*
data[0] : 첫 번째 7 Segment 출력값
data[1] : 두 번째 7 Segment 출력값
*/
unsigned long data[2] = { 0, 0 };
/*
d[0][0] : 첫 번째 7 Segment 1 자리 숫자
d[0][1] : 첫 번째 7 Segment 10 자리 숫자
d[0][2] : 첫 번째 7 Segment 100 자리 숫자
d[0][3] : 첫 번째 7 Segment 1000 자리 숫자
d[1][0] : 두 번째 7 Segment 1 자리 숫자
d[1][1] : 두 번째 7 Segment 10 자리 숫자
d[1][2] : 두 번째 7 Segment 100 자리 숫자
d[1][3] : 두 번째 7 Segment 1000 자리 숫자
*/
int d[2][4] = {{ 0, 0, 0, 0 }, { 0, 0, 0, 0 }}; 

void setup()
{
    for (int j = 0; j < 4; j++)
    {
      pinMode(digitPin[j], OUTPUT);
      digitalWrite(digitPin[j], HIGH);
    }
    pinMode(dataPin, OUTPUT);
    pinMode(clockPin, OUTPUT);
    pinMode(latchPin, OUTPUT);
}

void loop()
{
    data[0] = millis() / 1000;
    setNumber(data[0], d[0]);
    data[1] = data[0] + 123;  //두 번째 7 Segment 출력값은 첫 번째 7 Segment 출력값에 123을 더한 값이다.
    setNumber(data[1], d[1]);

    segOutput(3, d[0][0], d[1][0], 0); //1의 자리
    segOutput(2, d[0][1], d[1][1], 0); //10의 자리  
    segOutput(1, d[0][2], d[1][2], 0); //100의 자리  
    segOutput(0, d[0][3], d[1][3], 0); //1000의 자리  
}

void setNumber(long number, int* dArray)
{
      dArray[0] = number % 10; //1의 자리
    if (number >= 10)
      dArray[1] = (number / 10) % 10; //10의 자리
    else
      dArray[1] = 10;
    if (number >= 100)
      dArray[2] = (number / 100) % 10; //100의 자리
    else
      dArray[2] = 10;
    if (number >= 1000)
      dArray[3] = (number / 1000) % 10; //1000의 자리
    else
      dArray[3] = 10;
}

//LED 초기화
void segClear()
{
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, LSBFIRST, 0);
    shiftOut(dataPin, clockPin, LSBFIRST, 0);
    digitalWrite(latchPin, HIGH);    
}
//LED 출력
void segOutput(int d, int Number1, int Number2, int dp)
{
    segClear();
    digitalWrite(digitPin[d], LOW);
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, LSBFIRST, segValue[Number1]);
    shiftOut(dataPin, clockPin, LSBFIRST, segValue[Number2]);
    digitalWrite(latchPin, HIGH);    
    delayMicroseconds(1000);
    digitalWrite(digitPin[d], HIGH);
}

 
오른쪽에 첫 번째 숫자가 왼쪽에 두 번째 숫자가 출력된다.
값을 쉬프트 하므로 두 번째 7 Segment에 첫 번째 숫자가 출력되고, 첫 번째 7 Segment에 두 번째 숫자가 출력된다.
두 번째 숫자가 첫 번째 숫자보다 123이 크다.

 

3. 4 Digit 7 Segment 2개, LED 9개, 버튼 2개

 

배선

Arduino 두 번째 74HC595 세 번째 74HC595 Led Button
    1 (Q1) 2 + 330 Ohm  
    2 (Q2) 3  + 330 Ohm  
    3 (Q3) 4  + 330 Ohm  
    4 (Q4) 5  + 330 Ohm  
    5 (Q5) 6  + 330 Ohm  
    6 (Q6) 7  + 330 Ohm  
    7 (Q7) 8  + 330 Ohm  
GND   8 (GND)    
    9 (Q7')    
VCC   10 (MR)    
D10   11 (SH_CP)    
D11   12 (ST_CP)    
GND   13 (OE)    
  9 (Q7') 14 (DS)    
    15 (Q0) 1  + 330 Ohm  
VCC   16 (VCC)    
D12     0  + 330 Ohm  
D7       1 + 10K Ohm
D8       2  + 10K Ohm

두 번째 74HC595의 9 (Q7')에서 세 번째 74HC595와 연결한다.
아두이노와 LED 8개 사이에 세 번째 74HC595를 넣고 연결한다.
LED 0은 아두이노와 연결한다.
버튼 두개를 아두이노와 연결한다.
 
소스

//a,b,c,d,e,f,g 상태값
byte segValue[11] = {
  0b11111100, //0
  0b01100000, //1
  0b11011010, //2
  0b11110010, //3
  0b01100110, //4
  0b10110110, //5
  0b10111110, //6
  0b11100000, //7
  0b11111110, //8
  0b11110110, //9
  0b00000000, //10
};

byte bitValue[9] = {
  0b00000001, //0
  0b00000010, //1
  0b00000100, //2
  0b00001000, //3
  0b00010000, //4
  0b00100000, //5
  0b01000000, //6
  0b10000000, //7
  0b00000000, //8
};
int bitIndex = 0;
bool isButton1Pressed = false;
bool isButton2Pressed = false;

byte digitPin[4] = { 2, 5, 6, 13 }; //segment 위치 핀
int dataPin = 9; //DS Pin
int clockPin = 10; //SH_CP Pin
int latchPin = 11; //ST_CP Pin

int bitPin = 12;
int button1Pin = 7;
int button2Pin = 8;

int mode = 0;

/*
data[0] : mode 0 = 1초에 1씩 자동 증가
data[1] : mode 1 = B버튼을 눌러 1 증가
data[2] : mode 2 = B버튼을 눌러 1 감소
mode 3 = bit LED 1 이동
*/
unsigned long data[3] = { 0, 0, 9999 };
/*
d[0][0] : 첫 번째 7 Segment 1 자리 숫자
d[0][1] : 첫 번째 7 Segment 10 자리 숫자
d[0][2] : 첫 번째 7 Segment 100 자리 숫자
d[0][3] : 첫 번째 7 Segment 1000 자리 숫자
d[1][0] : 두 번째 7 Segment 1 자리 숫자
d[1][1] : 두 번째 7 Segment 10 자리 숫자
d[1][2] : 두 번째 7 Segment 100 자리 숫자
d[1][3] : 두 번째 7 Segment 1000 자리 숫자
*/
int d[2][4] = {{ 0, 0, 0, 0 }, { 0, 0, 0, 0 }}; 

void setup()
{
    for (int j = 0; j < 4; j++)
    {
      pinMode(digitPin[j], OUTPUT);
      digitalWrite(digitPin[j], HIGH);
    }
    pinMode(dataPin, OUTPUT);
    pinMode(clockPin, OUTPUT);
    pinMode(latchPin, OUTPUT);

    pinMode(bitPin, OUTPUT);
    pinMode(button1Pin, INPUT);
    pinMode(button2Pin, INPUT);
}

void loop()
{
    data[0] = millis() / 1000;

    if(digitalRead(button1Pin) == HIGH)
    {
      if(isButton1Pressed == false)
      {
        isButton1Pressed = true;
        if(mode == 3) 
          mode = 0;
        else
          mode++;
      }
    }
    else
    {
      if(isButton1Pressed == true)
      {
        isButton1Pressed = false;
      }
    }

    if(digitalRead(button2Pin) == HIGH)
    {
      if(isButton2Pressed == false)
      {
        isButton2Pressed = true;
        switch(mode)
        {
          case 1:
            data[1]++;
            break;
          case 2:
            data[2]--;
            break;
          case 3:
            if(bitIndex == 8) 
              bitIndex = 0;
            else
              bitIndex++;
            break;
        }
      }
    }
    else
    {
      if(isButton2Pressed == true)
      {
        isButton2Pressed = false;
      }
    }

    switch(mode) {
      case 0:
        setNumber(data[0], d[0]);
        break;
      case 1:
        setNumber(data[1], d[0]);
        break;
      case 2:
        setNumber(data[2], d[0]);
        break;
      case 3:
        setNumber(-1, d[0]);
        break;
    }
    setNumber(mode, d[1]); //두 번째 7 Segment 출력값은 mode 값이다.

    segOutput(3, bitValue[bitIndex], d[0][0], d[1][0], 0); //1의 자리
    segOutput(2, bitValue[bitIndex], d[0][1], d[1][1], 0); //10의 자리  
    segOutput(1, bitValue[bitIndex], d[0][2], d[1][2], 0); //100의 자리  
    segOutput(0, bitValue[bitIndex], d[0][3], d[1][3], 0); //1000의 자리

    if(bitIndex == 8) 
    {
      digitalWrite(bitPin, HIGH);
    } 
    else 
    {
      digitalWrite(bitPin, LOW);
    }
}

void setNumber(long number, int* dArray)
{
    if (number >= 0)
      dArray[0] = number % 10; //1의 자리
    else
      dArray[0] = 10;
    if (number >= 10)
      dArray[1] = (number / 10) % 10; //10의 자리
    else
      dArray[1] = 10;
    if (number >= 100)
      dArray[2] = (number / 100) % 10; //100의 자리
    else
      dArray[2] = 10;
    if (number >= 1000)
      dArray[3] = (number / 1000) % 10; //1000의 자리
    else
      dArray[3] = 10;
}

//LED 초기화
void segClear()
{
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, LSBFIRST, 0);
    shiftOut(dataPin, clockPin, LSBFIRST, 0);
    shiftOut(dataPin, clockPin, LSBFIRST, 0);
    digitalWrite(latchPin, HIGH);    
}
//LED 출력
void segOutput(int d, byte bitValue, int Number1, int Number2, int dp)
{
    segClear();
    digitalWrite(digitPin[d], LOW);
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, LSBFIRST, bitValue);
    shiftOut(dataPin, clockPin, LSBFIRST, segValue[Number1]);
    shiftOut(dataPin, clockPin, LSBFIRST, segValue[Number2]);
    digitalWrite(latchPin, HIGH);    
    delayMicroseconds(1000);
    digitalWrite(digitPin[d], HIGH);
}

버튼 1을 누르면 모드가 변경된다. 왼쪽(두 번째) 7 Segment에 모드가 표시된다.

모드 0~2 값은 오른쪽(첫 번째) 7 Segment에 표시된다.

모드 0은 0부터 1초에 1씩 자동 증가한다.

모드 1은 0부터 시작하여 두 번째 버튼을 누르면 값이 증가한다.

모드 2는 9999부터 시작하여 두 번째 버튼을 누르면 값이 감소한다.


모드 3은 두 번째 버튼을 누르면 LED가 왼쪽으로 이동한다.

Arduino 4 digit 7 segment
D8 1 (E segment)
D9 2 (D segment)
D10 3 (DP segment)
D11 4 (C segment)
D12 5 (G segment)
D13 6 (D4)
D7 7 (B segment)
D6 8 (D3)
D5 9 (D2)
D4 10 (F segment)
D3 11 (A segment)
D2 12 (D1)

아두이노와 4 Digit 7 Segment를 연결한다.

//a,b,c,d,e,f,g 상태값
byte segValue[10][7] = {
    { 1,1,1,1,1,1,0}, //0
    { 0,1,1,0,0,0,0}, //1
    { 1,1,0,1,1,0,1}, //2
    { 1,1,1,1,0,0,1}, //3
    { 0,1,1,0,0,1,1}, //4
    { 1,0,1,1,0,1,1}, //5
    { 1,0,1,1,1,1,1}, //6
    { 1,1,1,0,0,0,0}, //7
    { 1,1,1,1,1,1,1}, //8
    { 1,1,1,1,0,1,1}  //9  
};

byte segPin[8] = { 3, 7, 11, 9, 8, 4, 12, 10 }; //사용핀{a,b,c,d,e,f,g,dp} 순서대로임
byte digitPin[4] = { 2, 5, 6, 13 }; //segment 위치 핀

unsigned long readTime = 0; //현재시간
int d1 = 0; //1의 자리
int d2 = 0; //10의 자리
int d3 = 0; //100의 자리
int d4 = 0; //1000의 자리

void setup()
{
    for (int i = 0; i < 10; i++)
    {
        pinMode(segPin[i], OUTPUT);
    }
    for (int j = 0; j < 4; j++)
    {
        pinMode(digitPin[j], OUTPUT);
        digitalWrite(digitPin[j], HIGH);
    }
}

void loop()
{
    readTime = millis() / 1000;
    d1 = readTime % 10; //1의 자리
    d2 = (readTime / 10) % 10; //10의 자리
    d3 = (readTime / 100) % 10; //100의 자리
    d4 = (readTime / 1000) % 10; //1000의 자리

    segOutput(3, d1, 0); //1의 자리
    if (readTime >= 10) segOutput(2, d2, 0); //10의 자리  
    if (readTime >= 100) segOutput(1, d3, 0); //10의 자리  
    if (readTime >= 1000) segOutput(0, d4, 0); //10의 자리  
}
//LED 초기화
void segClear()
{
    for (int i = 0; i < 8; i++)
    {
        digitalWrite(segPin[i], LOW);
    }
}
//LED 출력
void segOutput(int d, int Number, int dp)
{
    segClear();
    digitalWrite(digitPin[d], LOW);
    for (int i = 0; i < 7; i++)
    {
        digitalWrite(segPin[i], segValue[Number][i]);
    }
    digitalWrite(segPin[7], dp);
    delayMicroseconds(1000); // 1 milisecond
    digitalWrite(digitPin[d], HIGH);
}

 

프로그램을 실행하면 0부터 시작하여 1초에 1씩 증가한다.

 

소스 출처

https://steemit.com/kr-arduino/@codingman/4-digit-7-segment-display

 

4-Digit 7-Segment Display 제어(아두이노) — Steemit

마무리 오늘은 실제 4-Digit 7-Segment Display 부품에 카운트 결과를 출력해 보았습니다. 지난 시간에 시리얼모니터로 결과를 출력했던 것과 다르게 좀 복잡해 보였을 꺼에요. 하나하나 뜯어보면 어렵

steemit.com

 

배선 출처

https://m.blog.naver.com/gbtec/221337841703

 

4-Digit 7-Segment

안녕하세요:> 이번에 알아볼 센서는! 4-Digit 7-Segment  입니다! 그럼 바로 시작하겠...

blog.naver.com

Arduino IDE version: 2.2.1 에서 FND 라이브러리를 검색할 수 없어 배선만 참조하였다.

0. 개요

하나의 아두이노에서 다른 아두이노로 PWM을 전송한다.  아두이노 PWM 쓰기와 PWM 읽기 양쪽을 개발한다.  OpenPLC 아두이노에서 PWM 쓰기를 하면 일반 아두이노에서 PWM 읽기를 하려고 한다.

 

1. 연결

  쓰기 아두이노 핀 읽기 아두이노 핀
data 9 A0
GND GND GND

 

 

2. PWM 쓰기

const int analogOutPin = 9;  // Analog output pin that the LED is attached to
int outputValue = 124; // 0 ~ 255

void setup() {
  analogWrite(analogOutPin, outputValue);
}

void loop() {
}

 

3. PWM 읽기

const int analogInPin = A0;  // Analog input pin that the potentiometer is attached to

int sensorValue = 0;  // PWM value read from the port
int inputValue = 0;  // 0 ~ 255

void setup() {
  Serial.begin(115200);
  pinMode(analogInPin, INPUT);
}

void loop() {
  sensorValue = pulseIn(analogInPin, HIGH);
  // map it to the range of the analog out:
  inputValue = map(sensorValue, 0, 2016, 0, 254);

  if (inputValue == 0) {
    int val = digitalRead(analogInPin);
    if (val == 1) {
      inputValue = 255;
    }
  }

  // print the results to the Serial Monitor:
  Serial.print("sensor = ");
  Serial.print(sensorValue);
  Serial.print("\t input = ");
  Serial.println(inputValue);

  delay(1000);
}

 

읽기 아두이노를 시리얼 모니터링 하여 결과를 확인한다.

 

목표 : ATmega 328p에 아두이노 부트로더 펌웨어를 올려 원칩 아두이노로 활용한다. 이때내부 8M 헤르쯔 크리스탈을 사용한다.
 
1. MiniCore 설치

메뉴 > 파일 > 기본 설정 을 선택한다.

추가 보드 관리자에 URL 에 아래 URL을 붙여 넣는다.  확인 버튼을 누른다.
https://mcudude.github.io/MiniCore/package_MCUdude_MiniCore_index.json
 
참조 : Github > MiniCore
https://github.com/MCUdude/MiniCore

 

GitHub - MCUdude/MiniCore: Arduino hardware package for ATmega8, ATmega48, ATmega88, ATmega168, ATmega328 and ATmega328PB

Arduino hardware package for ATmega8, ATmega48, ATmega88, ATmega168, ATmega328 and ATmega328PB - GitHub - MCUdude/MiniCore: Arduino hardware package for ATmega8, ATmega48, ATmega88, ATmega168, ATme...

github.com

 

메뉴 > 도구 > 보드 > 보드매니저... 를 실행한다.

검색 입력박스에 mini를 입력한다. MiniCore 보드를 설치한다.
 
2. 빵판과 아두이노를 연결한 배선을 준비하자.
 

아두이노 <-> 빵판
10 번핀 <-> reset
11 번핀 <-> 11번핀
12 번핀 <-> 12번핀
13 번핀 <-> 13번핀
+ <-> +
- <-> -
 
출처 : 아두이노 > From Arduino to a Microcontroller on a Breadboard
https://docs.arduino.cc/built-in-examples/arduino-isp/ArduinoToBreadboard

 

From Arduino to a Microcontroller on a Breadboard | Arduino Documentation

From Arduino to a Microcontroller on a Breadboard Migrating an Arduino board to a standalone microcontroller on a breadboard. This tutorial explains how to migrate from an Arduino board to a standalone microcontroller on a breadboard. It's similar to this

docs.arduino.cc

 
3. 보드를 세팅하고 부트로더를 굽는다.

메뉴 > 도구 > 보드 > MiniCore > ATmega328
포트를 설정한다.
 
아래 내용을 설정한다.
BOD : BOD 4.3V
Clock : Internal 8 MHz
프로그래머 : Arduino as ISP
 
부트로더 굽기를 선택한다.

4. Blink 예제를 실행한다.

기존 빵판 아두이노에서 외부 크리스탈과 22 피코패럿을 제외한 기판을 사용한다.

메뉴 > 도구 > 보드 > MiniCore > ATmega328 인 상태에서 Blink 예제를 업로드한다.
LED가 1초 켜짐과 1초 꺼짐을 반복한다.

 

5. 만능기판에 빵판과 같은 배선을 한다.


 
장점 : 회로가 간결해진다.
단점 : 펌웨어를 프로그램하는 컴퓨터에 MiniCore를 설치해야 한다.  기존 보드(외부 크리스탈 버전)와 혼동을 줄 수 있다.

목표 : ATmega 328p에 아두이노 부트로더 펌웨어를 올려 원칩 아두이노로 활용한다.
 
준비 물
ATmega 328p 1개
16 MHz 크리스탈 1 개
10 K Ohm 저항 1개
22 피코패럿 콘덴서 2 개
아두이노 우노
빵판
점퍼 케이블 다수

 

1. 위 배선도와 같이 빵판 위에  준비물들을 배선한다.

 
참고
1. docs.arduino.cc > Built-in Examples > From Arduino to a Microcontroller on a Breadboard
https://docs.arduino.cc/built-in-examples/arduino-isp/ArduinoToBreadboard

 

From Arduino to a Microcontroller on a Breadboard | Arduino Documentation

From Arduino to a Microcontroller on a Breadboard Migrating an Arduino board to a standalone microcontroller on a breadboard. This tutorial explains how to migrate from an Arduino board to a standalone microcontroller on a breadboard. It's similar to this

docs.arduino.cc

 
2. 아두이노와 PCB 블로그 > Atmega328u 에 부트로더 굽기
https://arduino.tistory.com/12

 

Atmega328u 에 부트로더 굽기

ATMEGA328P 또는 ATMEGA328 에 부트로더 굽기 아두이노 우노에 사용되는 MCU 아두이노 우노에 사용되는 MCU 는 ATMEGA328P 이다. 즉, ATMEGA328P-PU 이거나 ATMEGA328P-AU가 일반적으로 사용된다. 보통 DIP 타입의 ATME

arduino.tistory.com

 

2. ArduinoISP 프로그램을 아두이노에 업로드한다.

- 아두이노 IDE 프로그램을 실행한다.

- 메뉴 > 파일 > 예제 > 11.ArduinoISP > ArduinoISP 예제를 선택한다.

ArduinoISP 예제를 아두이노에 업로드한다.

 

3. Atmega328p 칩에 아두이노 부트로더를 올린다.

프로그래머를 선택한다.

- 메뉴 > 도구 > 프로그래머 : "Arduino as ISP"를 선택한다.

- 부트로더 굽기를 실행한다.

 

3. 원칩 아두이노를 배선한다.

빵판에 부트로더가 구워진 Atmega 328p 칩을 꽂고 배선한다.

1. 아두이노 부트로더를 구운 Atmega 328p

2. 105 콘덴서(1 마이크로패럿) 콘덴서

3. 13번 핀에 led와 330 Ohm 저항
  

4. Blink 예제를 올린다.

시리얼 to USB를 빵판에 배선하고 컴퓨터 USB에 연결한다.

Blink 예제를 업로드 하여 실행한다.

 

5. 만능기판에 빵판과 같은 배선을 한다.

빵판 버전의 아두이노를 만능 기판 버전의 아두이노로 만든다.

핀 이름을 인쇄하여 칩위에 붙여준다.

리셋버튼을 추가한다.

 

5. 아두이노 부트로더를 굽는 장치를 만든다.

아두이노 부트로더 굽는 장치를 만들어 보았다.

오른쪽에 부트로더가 필요한 칩을 꼽고 굽기만 하면 편하게 아두이노 부트로더가 구워진 Atmega 328p 칩을 만들게 된다.

이 장치를 이용하여 6개 칩에 굽기를 하였다.

 

1. 아두이노 IDE를 다운로드하고 설치한다.

아두이노 IDE 다운로드 페이지에서 Windows MSI installer를 다운로드한다.

"JIST DOWNLOAD" 버튼을 눌러 다운로드한다.

설치 프로그램을 실행하여 설치한다.

아두이노 IDE를 실행한다.

 

2. 프로그램 언어를 한글로 바꿔보자.

메뉴 > File > Preferences... 를 선택한다.

Settings 탭에서 Languages를 한국어로 설정하고 OK 버튼을 누른다.

Arduino IDE 프로그램 언어가 한국어로 변경되었다.
 

3. 아두이노를 연결하고 Blink 예제를 실행해 보자.

보드를 선택한다.

메뉴 > 도구 > 보드 > Arduino AVR Boards > Arduino Uno를 선택한다.

포트를 선택한다.

메뉴 > 도구 > 포트 > COM3 (본인 컴퓨터에 잡힌 포트 선택)를 선택한다.

보드와 포트가 선택된 화면이다.

Blink 예제를 선택한다.

메뉴 > 파일 > 예제 > 01.Basics > Blink를 선택한다.

Blink 예제가 새 창에서 열린다.

프로그램 업로드 버튼 누른다.

 

4. 아두이노 보드에서 Blink 프로그램이 실행된다.

1초 동안 13번 핀 옆 L LED가 꺼진다.

1초 동안 LED가 켜진다.

켜지고 꺼짐을 반복한다.

+ Recent posts