루덴스코드 Blog

아두이노 +32

드디어 책이 나왔습니다.

시중에 많이 나와있는 아두이노 책들과는 조금 다르게 쓰려고 노력했습니다.

한번 봐 주세요. ^^

http://www.yes24.com/24/Goods/38002956?Acode=101




Comment +0

ESP8266 와 PMS7003 을 사용한 IOT 미세먼지 측정기



사진에는 개발 중 테스트를 위한 별도의 NodeMCU 가 하나 더 있습니다. 




PMS7003 이 Fritzing 에 없으므로 10 핀 짜리 커넥터와 만능기판을 사용해서 비슷하게 만들어 사용했다.


ESP8266 에서 할 일 


1. nodeMCU 를 사용하여 PMS7003 의 먼지데이터를 가져온다.

2. nodeMCU 를 사용하여 AP 에 연결한다.(스마트폰으로 nodeMCU 를 AP 에 연결한다.)

3. AP 와 연결된 nodeMCU 는 Thingspeak 와 sparkfun 서버에 값을 전송한다.

4. Lua 언어를 사용하지 않고 아두이노 IDE 를 사용하여 작업한다.

5. PUT/GET 을 사용하여 서버에 값을 전달한다.





세부 작업 내용


## Arduino IDE 에서 ESP8266 보드 사용을 위한 준비 


1. Arduino IDE 실행

2. 파일(FILE)

3. 환경설정(Preference)


Additional Board Manager URLs : 에   http://arduino.esp8266.com/stable/package_esp8266com_index.json  입력 


4. Tools 에서 Board : >> Board Manager 실행

5. esp8266 검색 후 설치(Install)

6. Tools >> Board >> NodeMCU 1.0 (ESP-12E Module) 선택

7. Sketch >> Include Library >> Manage Libraries 선택

8. WiFiManager 검색 후 설치






esp8266 검색


NodeMCU 1.0 (ESP-12E Module) 선택



WiFiManager 검색 후 설치 (ESP8266 보드 설치 후 자동으로 설치되는 예제와 라이브러리 외에 필요)




## PMS7003 와 NodeMCU 연결


NodeMCU 는 1개의 하드웨어 시리얼을 가지고 있으며, 이 시리얼이 다른 포트로 연결되어 사용할 수 있다. 이때 Serial.swap() 함수를 사용한다.


단, 사용해 보았으나 펌웨어의 안정성문제인지 지나치게 노이즈가 많아서 도저히 사용할 수 없을 정도로 판단되었다. Serial.swap() 함수는 사용하지 않았다.


소프트웨어 시리얼의 사용은 아두이노에서 사용했던 방법이다. NodeMCU 에서도 이 방식을 사용해보려고 하였으나 제대로 된 값을 받아내지 못했다. 다른 작업을 하면서 소트프웨어시리얼로 통신을 하는 것이 아직까지 안정적이지 못해 보인다.


하드웨어 시리얼 사용하기로 결정.


결국 RX, TX 를 사용하기로 결정했다. 단, USB 로 PC 와 연결해서 프로그램실행파일을 업로드해야 하므로 PMS7003 은 실행파일업로드가 마쳐진 다음에 NodeMCU 와 연결하면 된다. 개발과정중에 이러한 작업을 반복해야 하므로 두개의 슬라이드 스위치를 두었다. 두개의 스위치는 NodeMCU 의 RX/TX 와 PMS7003 의 TX/RX 를 연결하거나 끊는 용도로 사용한다. 즉, NodeMCU 에 프로그램을 업로드할 때는 스위치를 끄고, 업로드후에는 다시 스위치를 켜서 PMS7003 과 NodeMCU 가 서로 통신이 되도록 하였다.




AP-SW 는 D3 (GPIO0) 의 핀에 해당되며 여기에 들어오는 입력값에 따라 AP 선택이 가능해진다.



## NodeMCU Firmware


아두이노의 max(), min() 이 ESP8266 에서 제대로 작동하지 않는 문제를 발견하고 재정의하여 사용하였다. #include <ESP8266WiFi.h> 이후에 다음의 내용을 넣으면 된다.


#undef max

#define max(a,b) ((a)>(b)?(a):(b))

#undef min

#define min(a,b) ((a)>(b)?(b):(a))


전체 프로그램이 많아 져서 ino 파일과 h 파일로 나눠서 저장하였다. 각각의 다음과 같다.



아두이노 소스

/*


  PMS7003 - ESP8266 (nodeMCU)

  WiFi Selectable AP & Clients

     D3 (GPIO0) --- > PULLUP 

CLIENT 1 - Thingspeak

CLIENT 2 - data.sparkfun.com 

  made by winduino.co.kr (2016.10.28.)

  

*/


#include <ESP8266WiFi.h>

#include <ESP8266WebServer.h>

#include <DNSServer.h>

#include <WiFiManager.h>          //https://github.com/tzapu/WiFiManager


#include "ThingSpeak.h"

#include "PMS7003s.h"


    // Thingspeak

    unsigned long myChannelNumber = 111111;

    const char * myWriteAPIKey = "11111111111111";


    // sparkfun client using get

    const char* host = "data.sparkfun.com";

    const char* streamId   = "11111111111112";

    const char* privateKey = "11111111111113";


#define TRIGGER_PIN   0

#define  DEBUG        1

#define  MEAN_NUMBER  10

#define  MAX_PM       0

#define  MIN_PM       32767

#define  VER          20161025


#ifndef    MAX_FRAME_LEN

#define    MAX_FRAME_LEN   64

#endif


#undef max

#define max(a,b) ((a)>(b)?(a):(b))

#undef min

#define min(a,b) ((a)>(b)?(b):(a))


int status = WL_IDLE_STATUS;


//const int MAX_FRAME_LEN = 64;


int pm1_0=0, pm2_5=0, pm10_0=0;

unsigned int tmp_max_pm1_0, tmp_max_pm2_5, tmp_max_pm10_0; 

unsigned int tmp_min_pm1_0, tmp_min_pm2_5, tmp_min_pm10_0; 

byte i=0;


unsigned long previousMillis = 0;

const long interval = 1000;

bool ledState = LOW;

bool startNumber =  true;



WiFiClient  client;


void setup() {

  pinMode(LED_BUILTIN, OUTPUT);     

  pinMode(TRIGGER_PIN, INPUT);

  Serial.begin(9600);

}


void loop() {

  digitalWrite(LED_BUILTIN, LOW);     delay(500);                     

  digitalWrite(LED_BUILTIN, HIGH);    delay(500); 


  if ( digitalRead(TRIGGER_PIN) == LOW ) {

    wifiManagerStart();

    startNumber = ~startNumber;

  }


  else {

    if (startNumber == true ) { 

      ThingSpeak.begin(client);

      startNumber = false;

    }


  if(i==0) { 

    tmp_max_pm10_0 = tmp_max_pm2_5 = tmp_max_pm1_0  = MAX_PM;

    tmp_min_pm10_0 = tmp_min_pm2_5 = tmp_min_pm1_0  = MIN_PM;

  }

  

  if (pms7003_read()) {

    tmp_max_pm1_0  = max(PMS7003S.concPM1_0_CF1, tmp_max_pm1_0);

    tmp_max_pm2_5  = max(PMS7003S.concPM2_5_CF1, tmp_max_pm2_5);

    tmp_max_pm10_0 = max(PMS7003S.concPM10_0_CF1, tmp_max_pm10_0);

    tmp_min_pm1_0  = min(PMS7003S.concPM1_0_CF1, tmp_min_pm1_0);

    tmp_min_pm2_5  = min(PMS7003S.concPM2_5_CF1, tmp_min_pm2_5);

    tmp_min_pm10_0 = min(PMS7003S.concPM10_0_CF1, tmp_min_pm10_0);

    pm1_0 += PMS7003S.concPM1_0_CF1;

    pm2_5 += PMS7003S.concPM2_5_CF1;

    pm10_0 += PMS7003S.concPM10_0_CF1;

    i++;

  }


  if(i==MEAN_NUMBER) {


    pm1_0 = ((pm1_0-tmp_max_pm1_0-tmp_min_pm1_0)/(MEAN_NUMBER-2));

    pm2_5 = ((pm2_5-tmp_max_pm2_5-tmp_min_pm2_5)/(MEAN_NUMBER-2));

    pm10_0= ((pm10_0-tmp_max_pm10_0-tmp_min_pm10_0)/(MEAN_NUMBER-2));


    thingSpeakClient(pm1_0, pm2_5, pm10_0);

    sparkfunClient(pm1_0, pm2_5, pm10_0);

    

    delay(20000); // ThingSpeak will only accept updates every 15 seconds. 

    

    pm1_0=pm2_5=pm10_0=i=0;

    }     

  }

}


void wifiManagerStart() {

    WiFiManager wifiManager;

    if (!wifiManager.startConfigPortal("OnDemandAP")) {

      delay(3000);

      ESP.reset();

      delay(5000);

    }

}


void thingSpeakClient(int pm1_0, int pm2_5, int pm10_0) {

    ThingSpeak.setField(1,pm1_0);

    ThingSpeak.setField(2,pm2_5);

    ThingSpeak.setField(3,pm10_0);

    ThingSpeak.setField(4,VER);

    ThingSpeak.setLatitude(42.0000);

    ThingSpeak.setLongitude(-71.0000);

    ThingSpeak.setElevation(100);

    ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);  

}


void sparkfunClient(int pm1_0, int pm2_5, int pm10_0){

  const int httpPort = 80;

  if (!client.connect(host, httpPort)) {

    return;

  }

  

  String url = "/input/";

  url += streamId;

  url += "?private_key=";

  url += privateKey;

  url += "&dust10=";

  url += pm1_0;

  url += "&dust100=";

  url += pm10_0;

  url += "&dust25=";

  url += pm2_5;


  client.print(String("GET ") + url + " HTTP/1.1\r\n" +

               "Host: " + host + "\r\n" + 

               "Connection: close\r\n\r\n");

  unsigned long timeout = millis();

  while (client.available() == 0) {

    if (millis() - timeout > 5000) {

      client.stop();

      return;

    }

  }

}

본문 내용 중 myChannelNumber, myWriteAPIKey, streamId, privateKey 는 각각 Thingspeak 와 sparkfun 에서 부여된 번호를 넣으면 된다. (SPARKFUN 은 별도의 회원가입절차 없이 사용할 수 있다)


헤더파일 PMS7003s.h
#ifndef    MAX_FRAME_LEN
#define    MAX_FRAME_LEN   64
#endif

struct PMS7003_framestruct {
    byte  frameHeader[2];
    unsigned int  frameLen = MAX_FRAME_LEN;
    unsigned int  concPM1_0_CF1;
    unsigned int  concPM2_5_CF1;
    unsigned int  concPM10_0_CF1;
    unsigned int  checksum;
} PMS7003S;

bool pms7003_read() {
    bool packetReceived = false;
    unsigned int calcChecksum = 0;
    bool inFrame = false;
    int detectOff = 0;
    char frameBuf[MAX_FRAME_LEN];
    int frameLen = MAX_FRAME_LEN;

    while (!packetReceived) {
        if (Serial.available() > 32) {
            int drain = Serial.available();
            for (int i = drain; i > 0; i--) {
                Serial.read();
            }
        }
        if (Serial.available() > 0) {
            int incomingByte = Serial.read();
            if (!inFrame) {
                if (incomingByte == 0x42 && detectOff == 0) {
                    frameBuf[detectOff] = incomingByte;
                    PMS7003S.frameHeader[0] = incomingByte;
                    calcChecksum = incomingByte; // Checksum init!
                    detectOff++;
                }
                else if (incomingByte == 0x4D && detectOff == 1) {
                    frameBuf[detectOff] = incomingByte;
                    PMS7003S.frameHeader[1] = incomingByte;
                    calcChecksum += incomingByte;
                    inFrame = true;
                    detectOff++;
                }
                else {

                }
            }
            else {
                frameBuf[detectOff] = incomingByte;
                calcChecksum += incomingByte;
                detectOff++;
                unsigned int val = (frameBuf[detectOff-1]&0xff)+(frameBuf[detectOff-2]<<8);
                switch (detectOff) {
                    case 4:
                        PMS7003S.frameLen = val;
                        frameLen = val + detectOff;
                        break;
                    case 6:
                        PMS7003S.concPM1_0_CF1 = val;
                        break;
                    case 8:
                        PMS7003S.concPM2_5_CF1 = val;
                        break;
                    case 10:
                        PMS7003S.concPM10_0_CF1 = val;
                        break;
                    case 32:
                        PMS7003S.checksum = val;
                        calcChecksum -= ((val>>8)+(val&0xFF));
                        break;
                    default:
                        break;
                }

                if (detectOff >= frameLen) {
                    packetReceived = true;
                    detectOff = 0;
                    inFrame = false;
                }
            }
        }
    }
    return (calcChecksum == PMS7003S.checksum);
}


## 실행파일 업로드 방법

위 두개의 파일을 하나의 폴더에 넣는다. .ino 파일(아두이노파일)은 폴더 이름과 동일하게 만들어 둔다. 아두이노 IDE 를 사용해서 .ino 파일을 연다. 파일이 열리고 파일이름 택 옆에 또 하나의 택이 있고 그 이름이 PMS7003s.h 인지 확인한다. 


두개의 슬라이드 스위치를 모두 OFF 시킨 후 (연결이 끊어진 쪽) 컴파일-업로드를 진행한다.



## AP 설정방법

NodeMCU 에는 프로그램이 실행되는 상태이다. 이 상태에서 AP-SW 를 누른 상태에서 NodeMCU 를 리셋(RST버튼) 시킨다. 


AP-SW 누름 -> NodeMCU RST 누름 ->  NodeMCU RST 뗌 -> (약 3초후)AP-SW 뗌


1. 스마트폰으로 OnDemandAP 에 접속


스마트폰이나 기타 WiFi 에 연결이 가능한 기기로 주변 AP 를 찾아보면 OnDemandAP 라는 AP 를 찾을 수 있다. 크롬등의 웹브라우저로 접속한다.

2. 브라우저에서 192.168.4.1 을 쳐서 NodeMCU 에 접속한다. 192.168.4.1 은 고정된 IP 주소이므로 기억해두어야한다.

3. 화면에 나온 버튼을 클릭해서 자신이 사용하는 AP 에 접속한다. (AP는 공유기를 의미)

      


        





공유기에 접속하게 되면 이후 자동적으로 Thingspeak 와 Sparkfun 서버에 접속하여 20초마다 한번씩 3개의 미세먼지데이터를 보내준다. 각각의 사이트로 가서 데이터를 확인한다. AP 정보는 NodeMCU 의 EEPROM 에 저장되므로 AP 가 변경될 때 한번만 설정하면 된다.


Thingspeak 는 데이터를 그래프화해서 쉽게 확인할 수 있게 해 준다.


sparkfun 에서 제공하는 서비스는 별도의 로그인이 필요없다. 데이터를 저장하고 json 이나 csv 등의 형식으로 다운로드 할 수 있다.



NEXT. 라즈베리 서버로 Thingspeak 나 data.sparkfun.com 과 유사한 서비스를 제공해보자. (진행중)







Comment +0

CEA-014 아두이노 2개로 신호등 2개 연결하기

인터넷에서 "아두이노 신호등" 으로 검색해 보면 상당한 많은 자료들을 얻을 수 있습니다. 대부분 아두이노 우노에 LED 3개를 연결해서 신호등 하나를 만드는 내용입니다. 혹은 5개를 연결해서 차량용 신호등 하나와 보행자용 신호등하나를 만드는 것도 있습니다.

이 정도의 신호등은 지난시간까지 공부한 내용으로 여러분이 혼자서도 충분히 만들수 있습니다.

오늘 여러분에게 소개할 신호등은 아두이노 우노 2개를 사용해서 만들게 됩니다. 하나의 아두이노에서 LED 3개를 순차적으로 점멸시키는 것은 대부분의 신호등 프로그램과 비슷합니다. 그런데 거기에 두가지를 추가했습니다.




1. 시작시간을 초기화 하는 신호등 리셋 스위치

이 리셋스위치를 누르면 신호등의 신호는 처음으로 초기화됩니다. 초기화되서 맨 처음부터 정해진 순서대로 다시 순서대로 불이 들어옵니다.

2. 설정된 시간이 되면 작동하는 타이머

가변저항, 포텐셔미터의 값을 읽어서 1 에서 100 사이의 값으로 만듭니다. 그 값을 시간으로 계산합니다. 리셋스위치를 누른 후 정해진 시간이 지나면 다른 아두이노의 리셋스위치를 작동시킵니다.




신호등 1개는 너무 쉬워서 2개를 만들어서 연결해 보겠습니다.



그냥 막 연결하지 말고, "제대로" 연결해 봅시다. 보행자도 차를 탄 사람도 불편하지 않게 신호등 체계를 만들어 봅시다.



신호등간 신호를 주는 방식을 간단하게 고안해봤습니다. 하나의 신호등을 초기화하면 옆에 붙은 신호등이 일정한 시간간격을 두고 같이 초기화됩니다. 이 시간간격을 차량이동 예상 시간으로 만들어두면 됩니다.



3개의 아두이노를 꾸며봤습니다. 저항을 잘 보면 색띠가 있습니다. 색띠를 읽으면 저항값을 알 수 있습니다. 참고로 위에서부터 330, 330, 330, 10k, 1k 값을 가집니다. 맨 마지막 저항은 왜 들어갔을까요? 영상에서는 설명해주지 않습니다만 들어가지 않으면 안되는 저항입니다. 나중에 조금 더 아두이노를 공부한 다음에 이 저항에 대해서 설명할 기회가 되면 그때 설명하겠습니다.



Notepad++ 를 사용해서 편집합니다. 제가 주로 사용하는 텍스트에디터는 노트패드++ 입니다. 무료라서 쓰고 있지만 성능도 결코 왠만한 다른 에디터에 떨어지지 않습니다. 플러그인이 많고 다양해서 만족하면서 쓰고 있습니다. 



맨 위의 영상을 꼭 확인해보세요. 여기 전체 소스코드를 올립니다.



#define SIGNAL_RED  5

#define SIGNAL_YELLOW  6

#define SIGNAL_GREEN  7

#define TIMEPIN   A0

#define STARTSWITCH  10 // 스위치 입력

#define NEXTSIGNAL  11 // 다음 신호등 스위치 출력

#define BUTTON_ON   0

#define BUTTON_OFF  1


#define LED_RED_TIME  3000

#define LED_YELLOW_TIME  2000

#define LED_GREEN_TIME  3000



bool buttonState = 1;

bool lastButtonState = 1;

bool resetFlag = 0;

unsigned long timeValue = 0;

byte i=0;

unsigned long nowTime, oldTime;

  

void setup(){

  Serial.begin(9600);

  pinMode(SIGNAL_RED, OUTPUT);

  pinMode(SIGNAL_YELLOW, OUTPUT);

  pinMode(SIGNAL_GREEN, OUTPUT);

  pinMode(STARTSWITCH, INPUT);

  pinMode(NEXTSIGNAL, OUTPUT);

}


void loop(){

  buttonState = digitalRead(STARTSWITCH);


  if(buttonState != lastButtonState ) {

    lastButtonState = buttonState;

    delay(100);

i++;

if(i%2==1) {

signalTowerReset();

Serial.print("timeValue = ");

Serial.println(timeValue);

}

  }

  if(resetFlag) sendTimeSignal();

  ledSignalTower();

}




void signalTowerReset()

{

ledBlink3(); // 전체 신호등이 3번 깜박


resetFlag = 1;

    timeValue = map(analogRead(TIMEPIN), 0, 1023, 1, 100); // 신호등간 시간간격 [0~1023] => [0~99]

nowTime = millis();

oldTime = nowTime;

}



void sendTimeSignal(){

if((nowTime-oldTime)<timeValue*1000){

digitalWrite(NEXTSIGNAL, HIGH);

}

if(((nowTime-oldTime)>=timeValue*1000) && ((nowTime-oldTime)<(timeValue+1)*1000)) {

digitalWrite(NEXTSIGNAL, LOW);

}

if((nowTime-oldTime)>=(timeValue+1)*1000) {

digitalWrite(NEXTSIGNAL, HIGH);

resetFlag = 0;

}

}


void ledSignalTower(){

  nowTime = millis();

  if((nowTime-oldTime>=0)&&(nowTime-oldTime<LED_RED_TIME)) {

 digitalWrite(SIGNAL_RED, HIGH);

 digitalWrite(SIGNAL_YELLOW, HIGH);

 digitalWrite(SIGNAL_GREEN, LOW);

 }


  if((nowTime-oldTime>=LED_RED_TIME)&&(nowTime-oldTime<LED_RED_TIME+LED_YELLOW_TIME+LED_GREEN_TIME)) {

 digitalWrite(SIGNAL_RED, HIGH);

 digitalWrite(SIGNAL_GREEN, HIGH);

 for(byte i=0;i<6;i++ ){

   if((nowTime-oldTime>=LED_RED_TIME+LED_YELLOW_TIME*i/6)&&(nowTime-oldTime<LED_RED_TIME+LED_YELLOW_TIME*(i+1)/6))

 {  digitalWrite(SIGNAL_YELLOW, i%2); }  

 }

  }  

 

 

  if((nowTime-oldTime>LED_RED_TIME+LED_YELLOW_TIME)&&(nowTime-oldTime<LED_RED_TIME+LED_YELLOW_TIME+LED_GREEN_TIME)) {

 digitalWrite(SIGNAL_RED, LOW);

 digitalWrite(SIGNAL_YELLOW, HIGH);

 digitalWrite(SIGNAL_GREEN, HIGH);  

 }

  if(nowTime-oldTime>LED_RED_TIME+LED_YELLOW_TIME+LED_GREEN_TIME) oldTime = nowTime;

}


 

void ledBlink3(){

  for(int tempi=0;tempi<3;tempi++){

digitalWrite(SIGNAL_RED, 1);

digitalWrite(SIGNAL_YELLOW, 1);

digitalWrite(SIGNAL_GREEN, 1);

delay(200);

digitalWrite(SIGNAL_RED, 0);

digitalWrite(SIGNAL_YELLOW, 0);

digitalWrite(SIGNAL_GREEN, 0);

delay(200);

  }

}


Comment +0

[CEA-009~13] LED 3개를 스위치로 점멸시키기











지난 시간에 이어 3개의 LED 를 점멸시켜보겠습니다. 아두이노 우노에는 0 번에서 13번까지 총 13개의 디지털 입출력이 가능한 핀이 있습니다. 여기에 A0 에서 A5 까지 6개의 아날로그 입력 핀이 있습니다. 합치면 19개의 핀이 있고 모두 디지털입출력이 가능합니다.



3개의 LED 를 2, 3, 4번에 연결하고, 스위치는 9번에 연결합니다. 스위치를 연결할 때 주의항 내용이 있습니다. 플로팅(Floating) 상태에 두지 않기 위해서 풀업 또는 풀다운 상태를 만들어주어야 합니다.



하드웨어 연결이 끝났으면 소프트웨어를 만들어봅시다. 코딩의 시작입니다.



LED 는 초기에 켜져있다가 스위치를 누르면 LED 가 꺼지게 만들어봅시다. 



앞에서 만들어 본 코드를 조금씩 고쳐서 원하는 대로 LED 불빛이 바뀌게 해봅시다.



스위치가 눌려있는 동안 2, 3, 4 번에 연결된 LED 는 순서대로 켜지고 꺼지게 됩니다. 간단한 조건인 if 문을 사용할 수 있으면 됩니다. 변수를 하나 만들어 두고 반복할 때마다 1씩 증가하게 합니다. 1일대는 첫번째 LED를, 2일때는 두번째 LED를, 3일때는 세번째 LED를 켜고, 그 외의 다른 수(4)일때는 0이 되게 합니다.



위에서 만들었던 코드를 수정해봅시다.



% 연산은 나누고 남은 수, 나머지를 반환합니다. 그래서 i 를 계속 증가시킬때 i%3 은 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, ... 이렇게 세개 숫자를 반복해서 보내줍니다. 

여기에 버튼을 누를 때마다 LED의 빛을 하나씩 옆으로 이동하게 해봅시다. 위 소스를 실행시키면 약간 이상합니다. 그 부분을 찾아보세요.



앞에서 내준 숙제의 답입니다. 미리 보지 마시고 꼭 세번째 동영상을 보고 프로그램을 고쳐본 다음에 보세요.



답은 동영상을 확인하세요. 잘 보면 보입니다.

Comment +0

CEA-008 LED 1개 점멸하기 (하드웨어해석)


LED 를 1개 점멸시키는 회로를 구성하고 아두이노로 프로그램을 직접 짜 보았습니다. 이제 지난시간에 만들었던 회로에 대해서 조금 더 깊이있게 살펴보겠습니다. 초등학생이라면 이 부분은 건너뛰어도 됩니다. 시간은 오래 걸리지 않으니까 한번 보기는 하시구요, 잘 이해가 안되면 억지로 이해하려고 하지 마세요. LED 에 맞는 저항값을 어떻게 구하는지를 선생님께 물어보시면 선생님이 그 값을 계산해서 주실겁니다. 



영상에 나오는 사진을 몇장 첨부합니다.



LED 에 불을 켜는 프로그램과 회로를 구성했습니다. 구성한 회로가 어떤 것인지를 한번 살펴보겠습니다.



전기의 속도는 30만km/s 입니다. 1 초에 30만 km 를 간다는 뜻입니다. 빛과 속도가 같습니다. 하지만 전자의 이동 속도는 도체의 종류, 전압, 기타 환경에 따라서 많이 달라지는데 일반적으로 가정에서 사용하는 전선을 쓴다고 가정했을때 전자의 속도는 7~8mm/s 정도가 됩니다. 1 초에 7~8mm 밖에 움직이지 못합니다.  



전기가 흐를때 LED 를 통과하면서 전기에너지는 빛에너지로 바뀝니다. LED 는 전기에너지를 열에너지로 허비하는 것이 거의 없습니다. 백열등이나 형광등에서 LED 등으로 바뀌는 가장 큰 이유가 바로 효율때문입니다.



LED 는 2V 정도의 전압강하가 있습니다. 그리고 20mA 정도의 전류가 흐를때 최적의 빛을 냅니다. 물론 이 수치는 LED 마다 다릅니다. 일반적으로 20mA 는 LED 에게는 안전한 전류입니다. 이정도의 전류를 만들기 위해서 필요한 저항을 구하는 방법입니다.



태그 : CEA, 코딩교육, 아두이노, ARDUINO, UNO, 아두이노 강의, 키트, 부품, LED, BLINK, LED_BUILTIN, 전압강하

Comment +0

CEA-007 LED 1개 점멸하기 (소프트웨어)


LED 를 1개 점멸시키는 프로그램을 직접 짜 보겠습니다. 지난 시간에 하드웨어 구성을 마쳤습니다. 아두이노는 하드웨어와 소프트웨어를 동시에 다룰 수 있어야 합니다. 하드웨어가 어떻게 구성되었는지 모른다면 소프트웨어를 만들 수 없습니다.



영상에 나오는 사진을 몇장 첨부합니다.



LED 점멸하는 소프트웨어입니다. 기본 소스는 다음과 같습니다. 


void setup() {

  pinMode(12, OUTPUT);

}


void loop() {

  digitalWrite(12,0);

  delay(100);

  digitalWrite(12,1);

  delay(100);

}


12는 LED 가 연결된 아두이노의 핀번호 이고, 1 은 그 핀으로 전기가 흐른다(5V 출력)는 것, 0 은 그 핀으로 전기가 흐르지 않는다(0V 출력)는 것을 의미합니다.



예제에 나오는 LED_BUILTIN 은 13을 의미합니다. LED_BUILTIN 이 사용된 장소를 위 그림에 담았습니다.



태그 : CEA, 코딩교육, 아두이노, ARDUINO, UNO, 아두이노 강의, 키트, 부품, LED, BLINK, LED_BUILTIN

Comment +0

CEA-006 LED 1개 점멸하기 (하드웨어 구성)


LED 를 1개 점멸시키는 프로그램을 직접 짜 보겠습니다. 아직 정식으로 C 언어를 공부한 것이 아니라서 많은 부분을 설명하지는 못합니다. 하지만 우선은 그냥 따라서 해보는 것이 중요합니다.




해보면 생각보다 그렇게 어렵지도 복잡하지도 않습니다. 단지 아직 모를뿐이지요.


제대로 프로그래밍 언어를 공부하려면 시간도 걸리고 어려움이 있겠지만 아두이노를 가지고 사용하기 위해 프로그램을 익한다면 시간도 그렇고 오래걸리지는 않습니다. 당신이 조금만 똑똑하면 한주일이면 가능하고, 조금 명석한 편이 아니라면 3주일이면 됩니다. 


영상에 나오는 사진을 몇장 첨부합니다.



기본 예제에 나오는 LED Blink 프로그램을 살펴봅시다.



LED 를 사용할 때 극성에 주의하셔야 합니다. 내부를 잘 보면 굵은 쪽이 있습니다. 그 쪽에 - 또는 GND 쪽을 연결합니다.



실제 회로를 기호로 그린 그림입니다. LED 와 저항 330 또는 220 옴을 연결해주면 됩니다.



아두이노에서 LED 에 불을 켜 봅시다.


태그 : CEA, 코딩교육, 아두이노, arduino, 아두이노 강의, 키트, 부품

Comment +0

CEA-005 아두이노 IDE 보드 업데이트, 라이브러리 설치와 업데이트 



지난 시간에 아두이노 IDE 를 설치했습니다. 그리고 BLINK 라는 첫번째 예제 프로그램을 실행해 봤습니다. 이제 본격적으로 아두이노를 사용해서 프로그램을 해보는 시간이 되었습니다.


그런데 혹시나 예전에 아두이노 IDE 를 설치하셨던 분이 계시면 최신버젼으로 업데이트를 해주는 것이 필요합니다. 보드가 변경되거나 혹은 보드에 더 잘 맞는 펌웨어가 나오거나 할때마다 개개인이 알아서 이 부분을 고쳐주는 것은 쉽지 않습니다. 사실 아두이노 이전에는 그렇게 했습니다. 무엇인가 변경이 되면 플로피디스크나 CD 를 넣고, 펌웨어 업데이트를 했습니다. 하는 방법도 쉽지 않았습니다. 하다가 잘못되면 하드웨어가 망가지기도 했습니다.


아두이노는 전문가들을 위해서 세부적으로 조작 가능한 개발환경을 제공하는 대신에 일반인들을 대상으로 쉽고 편하게 개발할 수 있도록 한다는 철학이 있습니다. 그래서 아두이노 IDE 프로그램을 관리하는 곳에서 일괄적으로 클릭 한두번으로 보드 업데이트, 라이브러리 설치, 라이브러리 업데이트가 가능하게 해두었습니다.




본격적으로 프로그램에 들어가기 전에 라이브러리 설치와 업데이트, 보드 업데이트 방법을 익혀보겠습니다.



태그 : CEA, 코딩교육, 아두이노, arduino, 아두이노 강의, 아두이노 IDE, 업데이트, 라이브러리, 보드

Comment +0

CEA-004 아두이노 IDE 설치와 첫 프로그램 


아두이노 IDE 를 설치해 봅시다. 그리고 첫번째 프로그램을 실행해보겠습니다.



STEP 1. 아두이노 홈페이지에 방문해서 아두이노 프로그램(IDE)을 다운받습니다.


홈페이지 주소 : http://www.arduino.cc/

다운받을 프로그램 : https://www.arduino.cc/en/Main/Software



저 주소로 접속하면 다운받을 프로그램의 링크가 다시 나옵니다. 영어를 읽을 수 있으면 읽어서 그대로 따라하시면 됩니다. 아니면 아래에 있는 링크를 따라갑시다


STEP 2. 다운받은 프로그램을 PC 에 설치합니다.


STEP 3. 아두이노와 PCUSB 케이블로 연결합니다.


STEP 4. 설치된 아이콘을 더블클릭하면 IDE 가 실행됩니다.


STEP 5. IDE 내부에서 보드와 포트를 설정합니다.


아두이노 IDE 를 실행시킨 상태에서 [파일]-[예제]-[01.Basics]-[Blink] 를 선택해서 클릭합니다. 


제 아두이노 우노보드를 잘 보면 1초 간격으로 LED 가 깜박이는 것을 볼 수 있습니다.

 

 

 



 




태그 : CEA, 코딩교육, 아두이노, arduino, 아두이노 강의, 아두이노 IDE, blink

Comment +0

CEA-003 아두이노 기본프로그램과 실습 준비물



아두이노 공부를 위해 필요한 기본 준비물들을 소개합니다.


지난 시간에 만들었던 아두이노 우노와 소형브레드보드를 올린 상자를 사용하겠습니다. 상자안에는 필요한 부품들을 보관할 수 있습니다. 상자만드는 법은 이전 동영상을 보시고 따라하시면 됩니다.


아두이노 우노, 브레드 보드와 함께 다음의 부품들을 준비하셔서 간단한 실습을 진행하면서 아두이노를 학습할 수 있습니다. 물론 아두이노를 공부하는 것은 단지 공부를 위한 것이 아니라 해결하기 원하는 문제를 해결할 수 있는 수단을 갖는 것입니다. .


다음 준비물을 준비합시다.



1. 아두이노 우노 + USB  케이블

2. 브레드보드


3. 저항 220, 330, 1k, 2k, 10k 각 20개씩

4. LED 10개

5. 택트스위치 4개

6. 점퍼와이어 혹은 듀폰케이블 1 set

7. 가변저항 혹은 포텐셔미터 1개

8. CDS 센서

9. 초음파센서


10. 이더넷실드 (+ LAN 케이블)

11. 9-12V 어댑터

12. 인터넷 공유기 (가정에서 사용하고 있는 것)



이 외에도 여러가지 센서들과 액츄에이터가 있습니다. 그 부분은 기초과정을 마치고 난 다음에 기회를 보아서 설명하도록 하겠습니다.



아두이노 우노와 브레드보드입니다. 빈 상자에 붙여두었습니다. 작고 휴대가 간편하게 구축한 개발환경입니다. 



필요한 부품들 중 저항의 모습입니다. 220, 330, 1k, 2k, 10k 저항을 준비하시면 실습뿐만 아니라 앞으로 사용하는데 큰 지장이 없습니다. 



중앙 아래에 있는 CDS 센서는 빛의 밝기를 감지하는 센서입니다. 오른쪽에 있는 가변저항은 포텐셔미터로 불립니다. 생긴 모양은 다양하게 있습니다. 브레드보드에 꼽아서 사용하기 편한 타입으로 저렴한 것을 구하시면 됩니다. 가변저항은 10k오옴까지 변할 수 있을 것을 구합니다. 위에 있는 것은 초음파센서입니다. 왼쪽에 있는 스위치는 택트스위치입니다.



LED 의 종류는 다양합니다. 용도에 따라 맞는 것을 사용하면 됩니다. 왼쪽 빨간색 LED 를 보시면 원통형으로 지름 3mm 짜리가 있고 그 옆에 원통형 5mm 와 2x5mm 짜리 사각 LED 가 있습니다. 저렴하면서 신호확인용으로 가장 많이 사용되는 종류입니다. 밝은 빛을 필요로 하는 플래시를 만드는 것이 아니라면 이 세 종류 중 하나를 사용하면 됩니다. 개인적으로 2x5mm 짜리 사각 LED 를 좋아합니다. 2mm 짜리라서 여러개를 일렬로 늘어놓기 좋습니다. 만능기판이나 브레드보드에 사용하기도 좋습니다.



점퍼선 혹은 듀폰케이블이라고 불리는 케이블입니다. 3가지 종류가 있습니다. 일반적으로 가장 많이 쓰이는 것이 가장 오른쪽에 있는 양쪽이 M-M 타입인 케이블입니다. 하지만 센서를 사용할 때 M-F 타입이나 F-F 타입도 있으면 유용하게 사용됩니다. 이 세 종류를 꼭 구입하시기 바랍니다.



이더넷실드입니다. 아두이노 우노의 통신용 모듈이나 실드가 여러개 있습니다. 그 중 블루투스와 이더넷실드를 가장 많이 사용합니다. 블루투스는 스마트폰이나 다른 기기가 있어야 합니다. 하지만 이더넷실드는 그 자체로 인터넷에 바로 연결이 됩니다. IOT 를 위한 기본 통신 모듈로 이더넷실드를 사용합니다. 블루투스는 다음번에 스마트폰용 앱을 제작하면서 그때 아두이노와 블루투스로 통신하는 것을 해보겠습니다. 아두이노 프로그램을 할 수 있고, 이더넷실드까지 사용할 수있다면 블루투스 통신은 30분이면 충분히 이해할 수 있습니다. 더 필요한 것은 앱(App)개발이지요.



제가 가지고 있는 것 중에 아두이노 우노와 브레드보드를 올린 상자 두개를 사진으로 올립니다. 왼쪽처럼 조금 큰 상자를 사용하면 안에 들어갈 수 있는 것들이 많습니다. 오른쪽처럼 작은 상자를 만들면 가지고 다니기 편합니다.



모두 수납한 사진입니다.


태그 : CEA, 코딩교육, 아두이노, arduino, 아두이노 강의, 키트, 부품

Comment +0

CEA-002 arduino Paper Box


아두이노 작업환경을 만드는 동영상입니다.






준비물은 적당한 크기의 택배상자와 M2.5 볼트, 너트, 와셔입니다. 와셔는 M2.5 의 것을 써도 괜찮고 아니면 M3 의 와셔를 써도 좋습니다.










동영상을 보시면 쉽게 따라하실 수 있을겁니다. 저렴한 종이 상자로 개발환경과 부품수납공간을 만들어보세요. 



태그 : CEA, 코딩교육, 아두이노, arduino, 개발환경, 수납공간, 종이상자

Comment +1

  • 박진만 2017.10.08 22:45 신고

    멋지네요.
    저도 만들어서 공부할 때,
    수업할 때 사용해야겠네요.
    좋은 동영상 고맙습니다.

CEA-001 코딩교육 아두이노 따라잡기 시작 





확대


1. 코딩교육, 아두이노 따라잡기

2. 아두이노란?

3. 아두이노 우노 / 마시모밴지 / 오픈소스, 오픈하드웨어

4. 코딩교육 VS 프로그램교육



Comment +0

누구나 따라하는 아두이노 프로그램 - 6장. 프로그램방법


누구나따라하는아두이노프로그램_v2_내용_CH06.pdf





Comment +0

누구나 따라하는 아두이노 프로그램 - 5장. 하드웨어연결


누구나따라하는아두이노프로그램_v2_내용_CH05.pdf



Comment +0

누구나 따라하는 아두이노 프로그램 - 4장. 기본구조


누구나따라하는아두이노프로그램_v2_내용_CH04.pdf






Comment +0

누구나 따라하는 아두이노 프로그램 - 3장. 아두이노문법 II


누구나따라하는아두이노프로그램_v2_내용_CH03B.pdf




Comment +0

누구나 따라하는 아두이노 프로그램 - 3장. 아두이노문법 I


누구나따라하는아두이노프로그램_v2_내용_CH03A.pdf



Comment +0

누구나 따라하는 아두이노 프로그램 - 2장. 초등학생도 따라할 수 있는 아두 이노 따라잡기


누구나따라하는아두이노프로그램_v2_내용_CH02.pdf



Comment +0

유튜브 강의 목록입니다. 링크를 따라가시면 목록이 있습니다. 목록은 계속 업데이트 중입니다. 매주 1 ~ 4 편까지 강의를 만들고 있습니다.



누구나 따라하는 아두이노 프로그램 (초딩도 따라하는 아두이노 프로그램) 책의 내용이 거의 완성되었습니다. 

물론 앞으로 고칠 부분이 많이 있을 것입니다.

하지만 우선 공개하고 추가로 보완하면서 계속 수정해 나가기로 마음 먹었습니다.


수정이 필요한 부분은 다음 사이트로 접속해서 댓글로 피드백을 주시기 바랍니다.


http://winduino.co.kr/212



누구나따라하는아두이노프로그램_v2_20160522_여백무.pdf




P.S.1. 책에 대한 질문사항이나 기타 잘못된 부분을 발견해셨다면 네이버 카페 "윈두이노"에서 내용을 적어주세요.  (LINK : http://cafe.naver.com/winduino )


P.S.2. 블로그에 댓글을 적어보았는데, 해외에서 유입되는 다양한 스팸성 광고글들이 너무 많습니다. 그렇다고 로그인한 사람만 댓글을 쓸수 있게 하려니 그것도 불편해져서 차라리 한국사람이 제일 많은 네이버에 카페를 만들어 사용하고자 합니다.


카페까지 가서 글을 쓰고 기타 활동을 하는 것이 불편하시더라도 자신이 알고 있는 것은 다른 사람들과 공유하고, 모르는 것을 쉽게 물어볼 수 있는 그런 커뮤니티가 되기를 바랍니다.




Comment +4

  • 이현석 2016.04.30 04:02 신고

    저도 대안학교에서 고등학생을 상대로 짧은 강의 경험이 있으며 책 제작까지 생각해본 입장에서 제 개인적인 생각을 말씀드리겠습니다.
    학교에서 저는 아이들에게 C, JAVA, 아두이노, 알고리즘등 여러가지 가르쳐 보았지만 대다수의 아이들은 이해하기 힘들어 했었습니다. 즉 초등학생도 몇몇 아이를 제외하고는 이해하기 힘들거라고 생각합니다.
    선생님께서 만드신 책의 내용은 좋으나 초등학교 고학년아이들부터 조금이나마 이해할수 있다고 생각이 듭니다.
    제가 이런 생각을 하는 이유는 그림설명이 많이 없다는 것입니다. 아이들은 말과 글보다 그림이나 실습으로 가르치는 방법이 이해가 빠르다고 전 느꼈습니다.
    제가 생각했던 책의 내용을 말씀드리겠습니다. 저의 경우 스크래치 -> 작동원리 -> 스케치 순으로 생각을 했었습니다. 물론 예제들도 많이 있어야 되구요.
    스크래치부분은 무작정 따라하기입니다. 그런다음 작동원리를 이해합니다. 여기까지 된다면 아이들 스스로 스크래치를 사용하여 개인 작품을 만드는 것입니다. 이 과정을 마친후 스케치로 넘어와 스크래치에서 했던 예제들을 스케치로 이해하는 방식입니다. 물론 이 많은 내용들을 하기위해서는 많은 시간이 필요로 합니다만, 이러한 방식으로 배운다면 나중에 혼자서 작품을 만들기에는 충분하다는 제 개인적인 생각입니다.
    솔직히 전 아직 실력이 미숙하며 요즘 아이들 수준을 모르기 때문에 제가 생각한 부분들이 틀리 수 있다고 생각합니다. 하지만 선생님께서 만드신 책을 보고 조금이라도 도움이 될까 싶어 글을 남겨 봅니다.
    참고로 아두이노 스토리 카페에서 선생님께서 쓰신 글을 보고 왔습니다. 수고하십시오.

    • 좋은 댓글을 남겨주셔서 고맙습니다. C, 자바등을 가르치기는 쉽지 않았을 거라고 생각됩니다. 사실 PC 프로그램을 가르치는 것은 대학생에게도 쉽지 않습니다. 특히 책을 위주로 진도를 고려해야하면 더욱 더 그렇지요.

      대안학교에서 스크래치와 아두이노를 가르쳐봤습니다. 초등학교 4학년 이상을 대상으로 했고, 대부분 영어는 전혀 모르는 아이들이었습니다. 스크래치는 그래픽 블록이어서 아무런 어려움이 없었고, 오히려 아이들은 쉬는 시간도 잊고 게임은 만든다고 열심이었습니다. 중간 점심시간을 가지고 4시간 수업을 했었는데, 거의 쉬는 시간 없이 계속 질문을 하면서 자신들이 만들고 싶어하는 게임을 만들어갔습니다.

      아두이노도 비슷합니다. 복잡한 프로그램을 하지는 않았지만 LED 를 켜고 끄는 하나의 예제만 알려주고 아이들은 스스로 LED 를 8개나 혹은 그 이상 붙여서 전체를 점멸시키거나, 순차적으로 점멸시키면서 푹 빠져들었습니다.

      보통 4시간짜리 강의로 토요일마다 해서 총 4번 합니다. 그러면 아이들은 거의 처음 4시간 정도만 강의를 듣고 나머지는 직접 알아서 합니다. 하면서 모르는 것, 하고 싶은 것을 제게 가져옵니다. 그러면 그 부분을 알려줍니다. 아는 아이는 다른 아이들에게 자랑스럽게 자기가 한 것을 보이고, 가르쳐줍니다.

      물론 책에는 그런 내용을 다 담을 수 없고, 실제 강의를 할때는 칠판에 온갖 그림을 그려가면서 강의합니다. 말과 그림이 강의의 대부분을 차지합니다. 텍스트는 사실 큰 비중이 없지요. 하지만 책으로 만들다보니 어쩔수 없이 말이 빠지고, 말이 빠진 상태에서 그림을 넣는 것도 쉽지 않더군요. ^^

      다음번에는 이런 부분들을 더 보완해서 강의를 책으로만이 아니라 동영상으로만들어볼까 생각하고 있습니다.

  • 셜레노 2016.06.02 17:58 신고

    안녕하세요, 바람님...
    제가 바람님께서 공개해 주신 가이드 학습내용을 보고 아두이노를 시작하려고 합니다.
    그런데, 시작부터 꼬이네요...
    증상은 제가 사용하는 PC가 Win7 X64입니다.
    그리고 알려주신 대로 IDE를 설치하기 위해 공시사이트에 가서 다운로드를 받아 설치하였습니다.
    그런데, 사이트에는 X86밖에 보이지 않습니다.
    64는 리눅스에만 구분되어 있더라구요.
    이렇게 설치 후 아두이노 보드에 USB를 연결하면 드라이버가 깔리지 않았다는 메세지가 뜹니다.
    그리고 혹시나 해서 CH24X 드라이버도 깔아보았습니다. 하지만 달리지는 것이 없습니다.
    IDE를 실행하면 드라이버가 감지 되었을 경우 포트에 아두이노가 연결된 상태를 확인 할 수 있다는 설명이 있는데 이와 연관된 문제인듯 포트라는 글자가 활성화 되지 않은 상태 입니다.
    이러한 문제를 어떻게 해결해야 할지 도움 요청 드립니다.

    그리고... 아직 돌아오지 못한 9명의 아이들 위해 저도 마음으로 기도 합니다.
    그리고, 이러한 지식의 나눔 거듭 감사드립니다.

    • 조금 더 자세히 써주시겠습니까? 우노보드 연결한 것인지, 호환보드라면 usb 연결되는 칩이 어떤것인지 알려주세요.
      윈도우쪽에 문제가 있을수 있고 오래 사용한 pc 경우 usb 포트 자체에 문제가 있을수도 있습니다.

LINX 를 사용하여 LabVIEW 와 Arduino 를 연결하는 것을 해보았다. 여기서는 아두이노와 이더넷실드를 결합한 후 UDP 통신으로 PC 에 일정한 데이터를 보내고, PC 에서 아두이노 쪽으로 일정 데이터를 보내는 작업을 해본다.


UDP 혹은 TCP 통신으로 아두이노를 사용하는 것은 일종의 제약을 뛰어넘는 일이다. 이제는 아두이노 혹은 다른 어떤 것이라도 UDP / TCP 통신만 지원된다면 LabVIEW 를 사용하여 제어가 가능하다는 뜻이다.


여기서는 Arduino UNO 뿐만 아니라 Arduino DUE 를 Ethernet Shield 와 결합하여 LabVIEW 와 통신하는 것을 보여준다. 


구글 유투브에 몇개의 동영상이 이러한 통신으로 LabVIEW 와 Arduino 간 신호를 전달하는 것을 보여주고 있다. 하지만 정작 제대로 된 정보는 찾기 어려웠다. 그래서 최대한 간단하게 UDP 를 이용하여 LabVIEW 와 Arduino 간의 신호전달을 만들어 보았다.


하드웨어와 소트드웨어는 다음과 같다. 


PC - LabVIEW with LINX

Arduino UNO + Ethernet Shield + 가변저항(SLIDE Potentiometer) 10k




하드웨어는 최대한 단순하게 해두었다. 가변저항의 양끝은 5V 와 GND 에 연결되었으며, 중간부분은 A0 아날로그 포트로 연결해 두었다. 이더넷실드의 아래에 아두이노 우노가 있다.


실험을 위해 두가지 예제를 여기에 둔다. 


I. 슬라이드 저항 없이 아두이노에서 랜덤하게 나온 값을 LabVIEW 로 전송하는 예제


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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
/*
 Communication with LabVIEW by UDP Protocol:
 This sketch send udp signal to LabVIEW (PC)
 created 24 Feb 2016
 by JelicleLim 
 http://www.winduino.com
 */
 
#include <SPI.h>         
#include <Ethernet.h>
#include <EthernetUdp.h>  
 
// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {  0xDE0xAD0xBE0xEF0xFE0xED };
IPAddress ip(1921680151);
 
unsigned int localPort = 8888;      // local port to listen on
long randomNumber;
 
// buffers for receiving and sending data
char packetBuffer[UDP_TX_PACKET_MAX_SIZE];  //buffer to hold incoming packet,
String  ReplyBuffer;       // a string to send back
char sendBuf[10];
 
 
// An EthernetUDP instance to let us send and receive packets over UDP
EthernetUDP Udp;
 
void setup() {
  Ethernet.begin(mac, ip);    // start the Ethernet and UDP:
  Udp.begin(localPort);
 
  Serial.begin(9600);
  randomSeed(analogRead(5));
}
 
void loop() {
  static int intPulse = 0;
  intPulse++;
  int bufLength;
  // if there's data available, read a packet
  int packetSize = Udp.parsePacket();
  if (packetSize) {
    Serial.print("Received packet of size ");
    Serial.print(packetSize);
    Serial.print(" From ");
    IPAddress remote = Udp.remoteIP();
    for (int i = 0; i < 4; i++) {
      Serial.print(remote[i], DEC);
      if (i < 3) {
        Serial.print(".");
      }
    }
    Serial.print(", port ");
    Serial.print(Udp.remotePort());
 
    // read the packet into packetBufffer
    memset(packetBuffer, 0, UDP_TX_PACKET_MAX_SIZE);
    Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
    Serial.print(" Contents:");
    Serial.println(packetBuffer);
 
    // send a reply to the IP address and port that sent us the packet we received
    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
    randomNumber = random(5);
    
    if (intPulse%50<25)     ReplyBuffer = String(5+randomNumber);
    else    ReplyBuffer = String(50+randomNumber);
    
    bufLength = ReplyBuffer.length();
    ReplyBuffer.toCharArray(sendBuf,bufLength+2);
    Udp.write(sendBuf);
    Udp.endPacket();
  }
  delay(10);
}
 
 
 
cs


아두이노 IDE 에서 위 예제를 아두이노로 다운로드한다. mac, ip, localport 등은 자신의 환경에 맞게 다시 설정한다.

아두이노 프로그램은 외부에서 아두이노로 UDP 패킷을 보내면 그것을 받아서 보낸쪽으로 다시 회신하는 방식이다. 보낼때 잡음이 섞인 구형파를 만들기 위해 25개의 Low Value 와 25 개의 High Value 를 순차적으로 보낸다.


2. LabVIEW 프로그램


랩뷰쪽 프로그램은 Graphic 기반의 프로그램이라 소스를 설명하거나 보이는 것이 쉽지 않다. 여기에 간단하게 짠 프로그램 화면을 첨부한다.




실제로 프로그램을 만든다면 위와 같이 만들지는 않는다. 여기서는 이렇게 하면 된다는 것만 보이기 위해 모든 랩뷰적 프로그램 방법은 빼고 순차적으로만 넣었다.


a.UDP 를 연다 --> b.아두이노IP를 원하는 값을 쓴다 --> c.UDP를 닫는다. --> d.UDP를 연다 --> e.아두이노에서온값을읽는다 --> f.UDP를 닫는다. --> a로 돌아간다.


기본적으로 데이터전송은 [UDP열기-UDP쓰기-UDP닫기] 로 구성한다. 데이터확인은 [UDP열기-UDP읽기-UDP닫기] 로 구성된다. 여기서 실제 프로그램을 한다면 이렇게 매변 UDP 를 열고 닫을 필요는 없다. 한번 열고 계속 데이터를 읽거나 쓴 후 마지막에 닫아주면 된다. 다시 말하지만 위의 그림은 순서를 보이기 위해 억지로 만들어 둔 그림이다.



실행중인 화면이다. 아두이노에서 데이터를 받아서 그래프를 그린다. 




확인을 위해 아두이노쪽에서도 시리얼통신으로 전송받은 값을 보이도록 프로그램해 두었다. (위 그림 오른쪽 상단)




II. 슬라이드 저항으로 아날로그 인풋 값을 아두이노에서 LabVIEW 로 전송하는 예제


이 예제는 위 I 번에서 아두이노에서 나오는 값이 아날로그포트 0 번에서 나오는 값으로 하고, LabVIEW 쪽 프로그램은 동일하다.


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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/*
 Communication with LabVIEW by UDP Protocol:
 This sketch send Analog Value of A0 using udp signal to LabVIEW (PC)
 created 24 Feb 2016
 by JelicleLim 
 http://www.winduino.com
 */
 
#include <SPI.h>         
#include <Ethernet.h>
#include <EthernetUdp.h>  
 
// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {  0xDE0xAD0xBE0xEF0xFE0xED };
IPAddress ip(1921680151);
 
unsigned int localPort = 8888;      // local port to listen on
 
// buffers for receiving and sending data
char packetBuffer[UDP_TX_PACKET_MAX_SIZE];  //buffer to hold incoming packet,
String  ReplyBuffer;       // a string to send back
char sendBuf[10];
 
 
// An EthernetUDP instance to let us send and receive packets over UDP
EthernetUDP Udp;
 
void setup() {
  Ethernet.begin(mac, ip);    // start the Ethernet and UDP:
  Udp.begin(localPort);
 
  Serial.begin(9600);
}
 
void loop() {
  int bufLength;
  // if there's data available, read a packet
  int packetSize = Udp.parsePacket();
  if (packetSize) {
    Serial.print("packet size ");
    Serial.print(packetSize);
    Serial.print(" From ");
    IPAddress remote = Udp.remoteIP();
    for (int i = 0; i < 4; i++) {
      Serial.print(remote[i], DEC);
      if (i < 3) {
        Serial.print(".");
      }
    }
    Serial.print(":");
    Serial.print(Udp.remotePort());
 
    // read the packet into packetBufffer
    memset(packetBuffer, 0, UDP_TX_PACKET_MAX_SIZE);
    Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
    Serial.print(" Received:");
    Serial.print(packetBuffer);
 
    // send a reply to the IP address and port that sent us the packet we received
    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
    ReplyBuffer = String(analogRead(A0));
 
    bufLength = ReplyBuffer.length();
    ReplyBuffer.toCharArray(sendBuf,bufLength+2);
 
    Serial.print(" A0:");
    Serial.print(sendBuf);
    Serial.println();
        
    Udp.write(sendBuf);
    Udp.endPacket();
  }
  delay(10);
}
 
 
 
cs



analogRead(A0) 로 받은 값은 String() 을 통해 문자열로 만들고, 그것을 다시 toCharArray() 로 문자배열로 만들어서 UDP로 전송했다. 나머지는 위 I 번의 예제와 거의 비슷하다.


2. LabVIEW 프로그램


위 I 번 예제와 동일하다. 실행 후 나오는 그래프는 아두이노에서 나오는 신호에 따라 달라진다. 슬라이드로 된 가변저항을 움직이면 그래프는 위와 아래로 변화한다.





III. Arduino DUE 와 Ethernet Shield 의 결합


아두이노 우노와 이더넷 실드를 결합하여 사용한 것과 동일한 방식으로 아두이노 두에(DUE)와 이더넷실드를 결합한 후 UDP 로 LabVIEW 와 통신할 수 있다.


이때 아두이노 프로그램은 동일하다. 

PC 에 Arduino DUE 를 USB로 연결한 후 아두이노 IDE 에서 프로그램한다. [툴 >> 보드] 에 Arduino DUE 가 없다면 [툴>>보드>>보드매니저] 로 들어간 후 DUE 를 검색하여 나오는 것을 설치하면 된다.


보드 설치 후 보드는 Arduino DUE (Programming Port)로 맞추고, 포트는 아두이노 DUE 가 연결된 포트로 맞춘다음 업로드한다. 업로드할 프로그램은 위 I, II 번의 예제 어느 것이든 상관없다. 


LabVIEW 프로그램도 I, II 번의 것과 동일하다.


단 한가지 주의할 것은 Arduino DUE 는 3.3V 전압을 사용하므로 아날로그 인풋에 들어가는 전압이 3.3V 를 넘어서는 안된다. 즉, 슬라이드 가변저항의 양단 끝은 각각 3.3V 와 GND 로 연결 한 후 중간부분을 A0 에 연결해야한다. 5V 에 연결할 경우 DUE 보드가 파손될 수 있다. 전원 부분은 두번, 세번 주의를 기울이도록 한다.







IV. UDP 통신을 이용한 아두이노와 LabVIEW 사용에 관한 소고


TCP 통신을 이용해서도 이와 비슷한 실험이 가능하다. 하지만 UDP 통신을 선택한 것은 두가지 이유인데, 첫째 TCP 보다 쉽다는 것과 둘째, 약간의 전송 에러가 발생해도 괜찮을 데이터라는 가정에서 효율적이기 때문이다.


TCP 통신에 비해 UDP 는 중간에 패킷이 없어져도 크게 신경쓰지 않는다. 그래서 충분히 많은 데이터가 전송될 때, 이를테면 CCTV 같은 영상신호가 갈때, 중간에 한두 프레임정도 빠진다고 해서 크게 문제가 되지는 않는다. 마찬가지로 날씨 데이터를 얻어온다고 할때 1분에 하나씩 데이터가 갈때 한두개 빠진다고 해서 크게 문제가 되지는 않는다.


LabVIEW 를 통해 아두이노라는 지극히 저렴한 장비 - NI 의 하드웨어 가격과 비교하면 아두이노 정말로 껌값이다 - 를 사용할 수 있게 되고, UDP 통신을 통해 멀리 떨어진 곳에 있는 것도 충분히 제어할 수 있다. 물론 여기에 Modbus 등을 추가한다면 더 신뢰성있는 통신이 되겠지만 우선 이것만으로도 개인이 사용하기에는 충분히 괜찮은 장비임에 분명하다.



http://winduino.co.kr

made by JelicleLim (바람)






Comment +6

  • 제이 2016.10.20 21:38 신고

    글 잘봤습니다 저도 이거와비슷한걸 이용해 만드려는데 아두이노로 프로그래밍한거의 값을
    랩뷰로 읽을수있나요? 아두이노메가.이더넷실드 와이파이. 이 두개의 장비로만요

    • 아두이노와 이더넷실드의 조합으로 TCP/UDP 통신이 가능하고, 랩뷰에서도 TCP/UDP 통신이 가능합니다.
      양쪽에서 통신이 되면 당연히 통신 연결로 값을 전달할 수 있지요.

  • 1 2017.02.03 20:20 신고

    감사합니다

  • 따라쟁이 2017.03.22 18:12 신고

    자료 정말 감사 합니다.
    공유해 주신 덕분에 큰 도움이 되었습니다.

  • 글 잘 읽었습니다. 제가 하려는 것과 비슷한 포스팅이네요.
    하지만 저는 udp통신으로 스위치를 가지고 클라이언트 아두이노에서 서버 아두이노로 명령을 전달해서 릴레이를 제어하고싶습니다.

    1.스위치를 누른다.
    2. 클라이언트 아두이노가 udp 신호를 전송한다.
    3. 서버 아두이노가 udp 신호를 받아서 릴레이를 작동시킨다.

    이렇게 하는 것이 가능할까요?
    가능하다면 예제를 한번 포스팅 해 주실 수 있나요?

기본적으로 아두이노 우노와 아두이노 메가2560 에 대해서 LabVIEW 와 연결해서 사용하기 위해서는 시리얼통신을 사용했다. 몇년전 관련된 글을 쓸 때만 해도 LIFA 라는 도구를 사용해서 LabVIEW 와 Arduino 를 연결해서 사용할 수 있었다.


최근에 다시 LabVIEW 를 돌아볼 일이 있어 LIFA 를 함께 살펴보았다. LINX 라는 새로운 톨이 그 자리를 차지하고 있었고, 생각보다 간편하게 잘 만들어져 있었다. 


PC 에 LabVIEW 가 설치되어 있다고 가정하면 LINX 를 설치하고 그대로 따라가기만 하면 아두이노에 펌웨어를 넣어주고 기본 예제까지 실행시켜준다. 




구글에서 Arduino Labview LINX 를 검색하면 다운받을 수 있는 사이트로 쉽게 연결된다.

(사이트링크)


위 링크를 클릭했으면 화면중앙의 [리소스] - [LINX 다운로드] 를 클릭한다.





클릭하면 일반 링크에 대한 것과는 달리 VIPM 을 설치했는지 설치할것인지 등을 묻는다. VIPM 은 VI Package Manager 의 약자로 Labview 의 vi 와 관련된 라이브러리를 관리하는 프로그램이다. 설치되어 있으면 그냥 다운이 진행되고 다음과 같은 화면이 나오게 된다. 아직 설치되지 않았다면 설치하면 된다. 화면에 설치방법과 링크가 있으니 읽으면서 진행한다.




위 화면에는 Uninstall 이라는 버튼이 있다. 하지만 여러분의 PC는 VIPM 은 설치되었지만 아직 LINX를 설치하기 전이므로 Uninstall 이 아니라 Install 이란 버튼이 있을 것이다. Install 을 눌러 인스톨을 진행하면 된다. 약간의 시간이 걸리고, 몇번 PC 를 재부팅하라는 메시지가 나온다. 그대로 따라하면 된다. 


설치가 끝났으면 모든 창을 닫고 Labview 프로그램을 실행시킨다. 

새프로젝트를 만들고, 새 vi 를 만들고, 도구(T)를 클릭하면 MakeHub 라는 항목이 추가되었고 그 안을 보면 LINX 가 만들어졌다. 여기서 두번째 LINX Firmware Wizard 를 클릭한다.




LINX Firmware Wizard 라는 창이 뜬다.




자신이 가지고 있는 아두이노를 PC 에 연결한다. 필자는 Arduino , Arduino Uno , Serial/USB 를 선택했다. 과거 LIFA 가 아두이노만을 지원했다면 LINX 는 아두이노 외에 몇가지 보드를 추가로 지원한다.


모두 설정했으면 Next 를 누른다. 그러면 PC 에서 아두이노로 펌웨어가 전송된다. 이때 주의할 것은 호환보드 사용시 드라이버를 PC 에서 인식하지 못할 수 있다. 호환보드를 사용하고 있다면 미리 그에 맞는 드라이버를 설치해 두고 아두이노 IDE 에서 아두이노를 프로그램이 제대로 전동되는지를 확인해 보아야한다.


다시말해서 이 과정을 시작하기 전에 Labview 에 대해서 기본 프로그램을 할 줄 알아야하며, 아두이노도 IDE 를 사용해서 예제정도는 아두이노에 전송해 넣고 제대로 작동하는지 확인해야한다. 




Next 를 누르면 COM 포트를 정하는 칸이 화면 중앙에 보인다. 오른쪽 작은 삼각형을 클릭해서 자신의 아두이노 포트를 선택해준다. 이 포트는 아두이노 IDE 에서 사용하던 포트다. 혹시 모른다면 


제어판 >> 시스템 및 보안 >> 시스템 >> 장치관리자 >> 포트 를 클릭해서 자기 아두이노가 연결된 포트를 확인할 수 있다. 이 사진은 윈도우10 환경에서 찍은 것이라 조금 다를 수 있으니 자신의 운영체제에서 장치관리자를 찾아서 포트를 확인하도록 한다.





Next 를 클릭하면 다음과 같은 화면이 나오며 펌웨어 전송이 시작된다.




펌웨어전송이 끝난 화면이다. 여기서 Launch Example 를 클릭해서 제대로 되었는지 확인해본다.




클릭하면 다음과 같은 vi 가 화면에 뜬다.




여기서부터는 vi 를 가지고 알아서 블럭다이어그램을 보고, 라이브러리를 구경하고, 예제를 살펴보면 된다.




간단한 예제이다. 버튼 클릭으로 13번 LED 를 ON/OFF 한다.




http://winduino.co.kr

made by JelicleLim (바람)


Comment +9

  • yoom 2016.09.20 17:04 신고

    아두이노 스케치에서는 포트인식되고 예제 실행도 되는데 랩뷰에서는 안되는데 어떻게해야할까요?

  • 1 2017.02.03 19:59 신고

    감사합니다

  • 1 2017.02.04 12:59 신고

    사진을 못올려서 첨부 합니다
    Open Serial.vi >>
    Initialize.vi >>
    Initialize Device.vi >>
    Serial Open.vi
    이라는 에러가 뜨는데,,, 도움을
    받을수 있을까요?

    • https://www.labviewmakerhub.com/doku.php?id=libraries:linx:start

      사이트를 확인해보십시오.

      1. 결과 중 일부로 문제를 해결할 수 없습니다. 원인을 알아야하는데, 그러기위해서는 사용한 PC 에 대한 것 - 운영체제, 설치된 프로그램, 악성코드 감염여부 등 - 을 알아야합니다.

      2. LabVIEW 버젼도 확인해야 하고, 어떻게 설치되어있는지 확인해 보세요. 가능하면 다시 처음부터 설치해 보세요.

      3. LINX 를 설치하셨다면 그것도 처음부터 여러 가이드에서 지시한 것을 그대로 따라하셨는지도 확인해 보세요.

      4. 아래 링크를 보시면서 빠진 부분이 있는지 확인해보세요. 랩뷰와 외부 장치가 연결되어야 하는데, 일반적으로 Com 포트를 사용하는 장치가 설치되어 있어야 합니다. 보통 NI-VISA 를 설치하면 됩니다. 그게 빠져 있을수도 있습니다.

      https://www.labviewmakerhub.com/doku.php?id=libraries:labview:start

  • Yoon 2017.06.04 21:06 신고

    예제 실행은 되는데 저희가 MPU-6050으로 가속도계를 만들어서 진동을 측정하려고합니다.
    아두이노(ide)에 코드를 입력해서 하면 측정이됩니다.
    랩뷰로는 어떻게 해야 측정이되는지 알 수 있을까요?

    • LINX 로는 별도의 아두이노 코딩을 사용할 수 없습니다. 아두이노는 랩뷰 프로그램에서 읽어들일수 있게 되어 있는 포트로 아날로그 값이나 디지털값을 전달만하게 합니다. 즉, 가속도센서등을 달고, I2C, SPI 통신등을 사용하려면 LINX 를 쓰시면 안됩니다.

      아두이노와 ethernet 실드를 결합해서 TCP/UDP 통신을 이용해서 랩뷰와 통신을 해야 합니다.

  • Yoon 2017.06.04 21:50 신고

    IDE에 코드를 입력해서 arduino compatible compiler for labview 를 통해서 시리얼 모니터로 값을 읽는 것까지는 가능한데
    arduino compatible compiler for labview 에서 읽은 값을 그래프로 보고 싶은데 어떻게 해야하는지를 모르겠습니다. 아예 초보라...

    • 질문에 도움을 드리지 못할것 같습니다. arduino compatible compiler for labview 는 제가 사용해 본적이 없습니다. 그래서 그 프로그램을 이용해서 아두이노에서 읽은 값을 LabVIEW 쪽으로 보내는 것은 제가 도움을 드리지 못할것 같네요.

      그리고 아직 LabVIEW 프로그램에 익숙하지 않으시다면 아두이노가 아니라 먼저 LabVIEW 부터 공부를 하셔야 할것 같습니다. 다른 언어에 비해서 쉽기는 하지만 그렇다고 아무 준비없이 막 사용할 수 있는 정도는 아닙니다. 적당한 책을 고르셔서 두번 정도는 살펴보시기 바랍니다.

      그 다음에 하드웨어 연결을 위해서 VISA 와 TCP/UDP 통신 부분을 공부하시면 아두이노와 PC 간 통신을 LabVIEW 를 이용해서 하는 방법을 익히실 수 있을 겁니다.

      솔직히 책에는 바로 나오지 않는 조금은 깊은 부분입니다. 책부터 천천히 살펴보셔야 할것 같습니다. ^^

      마지막으로 초보라고 스스로 느끼시면 이건 포기하시는게 좋습니다. 스스로 초보딱지를 뗄 정도는 되었다고 판단되었을때 다시 시도해 보세요.

KiCad 기초과정 6


 KiCad 기초과정 1

 KiCad 기초과정 2

 KiCad 기초과정 3

 KiCad 기초과정 4

 KiCad 기초과정 5

 KiCad 기초과정 6


계속해서 전자부품의 모양을 만듭니다. 이시간에는 footprints 를 만들어봅니다.

라이브러리를 하나 만들고, 그 다음부터는 계속해서 만들어진 라이브러리에 부품을 추가해서 넣으면 됩니다. 

 

마지막부분을 조금 정정하겠습니다. 11분 45초 정도에 나오는 부분에 대한 설명이 틀렸습니다. 
PCB 의 foorprints 가 저장되는 곳은 하나의 파일안이 아니라 어떤 폴더에 저장이 됩니다. 저장될때의 각 footprint 의 이름이 그대로 사용되고 확장자는 .kicad_mod 가 됩니다.

Comment +1

  • 유민재 2015.12.30 10:59 신고

    강좌 감사하게 듣고 있습니다. 아트웍을 처음 접해보는데 선택한 KiCAD 가 자료가 별로 없어서 많이 도움이 되고 있습니다.

    혹시, 덧글 다는 김에 질문 하나 드려도 될런지요? 송구스럽지만 답변 부탁드립니다.

    SOT-23-6 타입의 MAX4238AUT+T 라는 OPAMP 부품을 추가해야 하는데.

    라이브러리 툴 메뉴에서 OPAMP 모양도 그리고. 핀도 그려넣고.

    다 했는데.. PCB 에서 이제 실장이 가능하도록 SOT-23-6 규격으로 풋프린트를 그려야 하지 않습니까?

    그런데.. 도저히.. CAD 프로그램처럼 치수 수치 표기해가며 그릴 수도 없고..

    눈에 보이는건 그리드와 그리드 간격뿐...

    어제 하루동안 한번 그려본다고 시간 다보냈네요..

    답변 부탁드립니다. ㅠㅠ.

KiCad 기초과정 5


 KiCad 기초과정 1

 KiCad 기초과정 2

 KiCad 기초과정 3

 KiCad 기초과정 4

 KiCad 기초과정 5

 KiCad 기초과정 6


만들어진 부품을 라이브러리에 추가시킵니다.

1. 그러기 위해 우선 라이브러리를 만듭니다.

2. 만들어진 라이브러리에 부품을 추가시킵니다.

3. Eeschema 에서 만들어진 라이브러리를 등록시킵니다.

 

Comment +0

KiCad 기초과정 4


 KiCad 기초과정 1

 KiCad 기초과정 2

 KiCad 기초과정 3

 KiCad 기초과정 4

 KiCad 기초과정 5

 KiCad 기초과정 6


회로도 그릴때 사용하는 부품을 만들어 봅시다.

아두이노 프로 미니를 부품처럼 만들어 봅시다.

(단, 여기서 만들어진 것은 그대로 사용하면 나중에 문제가 될수 있습니다. 이 장에서 만드는 것은 가능한 빨리 전체를 살펴보기 위해서 가능한 세부적인 것들을 그냥 넘어갔습니다. 참고하시고 꼭 KiCad 홈페이지에 있는 문서를 보고 자세히 공부하시기 바랍니다.)

 

 

핀의 이름과 번호를 붙일때 마우스를 사용하지 말고 가능한 키보드만으로 그려봅시다.

대부분의 CAD 프로그램들은 몇가지 단축키를 외워두면 사용이 많이 쉬워집니다.

 

100 mil

= 2.54 mm

= DIP 타입 IC 들의 다리사이 간격

= 일반적으로 많이 사용하는 만능기판의 hole 간격

= 브레드보드의 hole 간격

 

 

 

 

Comment +0

KiCad 기초과정 3


 KiCad 기초과정 1

 KiCad 기초과정 2

 KiCad 기초과정 3

 KiCad 기초과정 4

 KiCad 기초과정 5

 KiCad 기초과정 6


PCB 를 완성시켜봅시다.

Copper Pour 를 만들어서 GND 와 연결해 줍니다.

 


거버데이타(gerber) 를 만들어 봅시다. 만들어진 거버파일을 PCB 제작회사에 넘겨주면 PCB 를 만들수 있습니다. 

 

Comment +3

  • 김이근 2017.08.30 16:09 신고

    제가 KiCad를 포함해서 pcb 관련된 소프트웨어는 전혀 할줄 모르는데, 좋은 강의 잘 봤습니다.
    지금 저는 ring 타입 pcb를 제작할려고 하는데, 기존에 있는 제품의 gerber 파일을 구했습니다.
    하지만 사이즈가 제가 필요한 것보다 작아서 좀더 크게 만들고 싶은데, 혹시 KiCad 로 수정 가능한가요??

    • gerber 는 출력되어 나온 결과물입니다. 이를테면 한글워드로 pdf 를 출력한 것과 비슷합니다. 좀더 정확하게는 한글 워드로 글을 쓰고 그것을 그림파일로 만들 것이라고 보시면 됩니다.
      즉, 거버는 그 자체로는 프린트(플로터를 통한 인쇄)만 가능하지 편집은 되지 않습니다. 사이즈나 기타 수정이 필요하다면 거버가 아닌 다른 저장된 데이터가 필요합니다.
      대체로 pcb 데이터 자체를 공개하는 경우는 많지 않습니다. 수정할 수 없고, 다시 만드셔야 합니다.

  • 잠팅이 2018.02.09 14:23 신고

    안녕하세요 Kicad 강의가 정말 많은 도움이 되고있습니다.

    한가지 궁금한 것이 있습니다.

    부품과 부품 사이의 거리 조절은 어떻게 해야하는건가요???

    CAD 처럼 정밀한 거리 조절을 하고싶은데 어렵습니다..

KiCad 기초과정 2


 KiCad 기초과정 1

 KiCad 기초과정 2

 KiCad 기초과정 3

 KiCad 기초과정 4

 KiCad 기초과정 5

 KiCad 기초과정 6


지난 시간에 이어 계속 KiCad 를 사용해 봅시다.

이 시간에는 간단한 PCB 를 만들어보도록 하겠습니다. 

 

components 와 footprints 를 이해합니다. 

components 는 회로도에 보이는 심볼입니다.

foorprint 는 실제 부품의 크기와 동일하게 만들어진 PCB 위에 올려질 부품의 다리받침입니다.

cvpcb 를 사용해서 회로도에서 사용한 components 들을 각각의 부품의 실제크기와 동일한 footprints 와 1:1로 매칭시켜줍니다.

네트리스트를 만들어줍니다.

PCB 를 만들기 위해 네트리스트에 있는 부품(footprints)들을 가져옵니다.

PCB 의 외형을 만들어줍니다.

전기적으로 연결되는 부분을 연결해줍니다.

 

 

 

Comment +0

KiCad 기초과정 1


 KiCad 기초과정 1

 KiCad 기초과정 2

 KiCad 기초과정 3

 KiCad 기초과정 4

 KiCad 기초과정 5

 KiCad 기초과정 6



KiCad 사용법을 익혀보겠습니다.

 

  1. kicad-pcb.org 에서 자신에게 맞는 파일을 다운받아서 설치한다.
  2. KiCad 를 실행시킨다.
  3. 간단한 회로를 그려본다.
    1. LED 를 라이브러리에서 가져온다.
    2. 저항을 라이브러리에서 가져온다.
    3. 전원커넥터를 라이브러리에서 가져온다.

 

Comment +2

  • 정의동 2016.08.24 14:05 신고

    kicad로 작업한 파일들이 pads와 호환이 되나요?
    즉, kicad로 작업해서 pads로 열 수 있나요?
    아니면 호환이 되지 않나요??

    • 모든 CAD 쪽 라이브러리나 데이터파일은 다른 CAD 와 호환이 되지 않는다고 보시면 거의 맞습니다. 심지어 같은 CAD 데이터와 라이브러리라도 버젼이 틀리면 못쓸수도 있습니다.
      호환되지 않습니다.

CH.03.아두이노 LED 깜박이기

이제 아두이노 IDE 설치까지 마쳤을테니 LED 를 깜박거려보겠습니다.

PC용 프로그램에서 가장 먼저하는 것이 Hello World 를 출력하는 것이라면 MCU(Micro Controller Unit) 프로그램에서 가장 먼저하는 것은 LED 를 켜고 끄는 것입니다. 이걸 할 수 있으면 절반은 한 것입니다.

즉, 컴파일러(크로스컴파일러)를 설치하고, 그것으로 프로그램을 짜서 실행코드를 만들고 만들어진 실행코드를 원하는 정해진 타켓(여기서는 아두이노)에 넣어서 정상적으로 작동(LED가 켜지고 꺼지게 하는 일)하게 하는 것까지 할 수 있으면 그 다음부터는 혼자서 천천히 하면 다 됩니다.

그러면 위의 한 문단에 적힌 말을 차분히 되새김질해 보겠습니다.

우리는 아두이노 IDE 를 가지고 아두이노에 사용될 수 있는 프로그램을 짭니다. 다시말해서 우리가 아두이노 IDE 를 가지고 짜는 프로그램은 PC 에서는 전혀 사용할 수 없는 프로그램이라는 뜻입니다. 그래서 아두이노와 같이 PC 가 아닌 것들을 있고, 그것들 안에 PC를 사용해서 실행시키고자 하는 명령코드를 넣을때 우리는 크로스컴파일한다고 말합니다. 아두이노 우노 보드에 붙어있는 MCU 는 ATMEGA328P 라는 칩입니다. 이 칩은 PC에 들어있는 인텔칩과는 전혀 다른 칩입니다. 그래서 PC 에 명령을 주듯이 명령을 주면 알아듣지 못합니다. 

이를테면 한국에서는 나이 어린 아이의 머리에 손을 올리는 것은 아이를 귀엽게 보고 있다는 뜻입니다. 하지만 상당수의 다른 나라에서는 얼굴이나 머리에 손을 대는 것을 극도로 싫어합니다. 어떤 문화권에서 엄지 손가락을 올리는 것은 최고라는 뜻을 나타내지만 호주 같은 곳에서는 욕이 됩니다. 미국에 가서 발표를 하려면 당연히 영어로 원고를 써야하겠지요. 아두이노에 명령을 주려면 아두이노가 알아들을 수 있는 명령어로 된 지시를 내려야 합니다. 그런데 그 지시문을 만들때 한국에서 만든 노트에, 한국에서 만든 펜을 사용한다고 이해하시면 좋을듯 합니다.

즉, PC 에 있는 문서편집기를 사용해서 아두이노에 줄 명령을 씁니다. 우선은 C 는 C++ 을 이용해서 명령을 기록합니다. 그리고 그것을 번역합니다. 보통 PC 프로그램에서 많이 했던 것처럼 PC가 알아듣는 말로 번역하는 대신 아두이노에 있는 ATMEGA328P 라는 칩이 알아들을 수 있는 말로 번역합니다. 그 번역기가 바로 AVR-GCC 가 됩니다. AVR-GCC 를 통해 나온 번역된 명령문은 bin 파일 또는 hex 파일로 저장이 됩니다. 단, 아두이노를 사용한다면 이 부분은 신경쓸 필요가 없습니다. 아두이노를 사용하기 전, 보통 bin 파일이나 hex 파일을 별도의 장치를 통해 MCU 안으로 강제로 밀어넣었습니다. 아주 오래전에는 롬라이터라는 기계를 써서 롬에 프로그램을 넣고 그 롬을 보드에 장착시켰습니다. 조금 시간이 지나면서 플래시메모리가 나왔습니다. 롬은 단 한번만 쓰고 다시는 지우거나 수정이 불가능했습니다. 그런데 플래시메모리는 약간의 제한은 있지만 쓰고 지우는 것이 가능했습니다. 현재 사용되는 대부분의 MCU 는 내부에 플래시메모리와 SRAM 을 가지고 있습니다. 보통 PC 에서 부르는 램은 SRAM 과 동일합니다. 그리고 PC 의 HDD 대신 MCU 는 플래시메모리를 가지고 있다고 보시면 됩니다. PC 는 내부에 CPU, HDD, RAM 을 가지고 있습니다. 반면 MCU 는 하나의 칩 안에 CPU, HDD, RAM 이 다 들어있습니다. 그래서 MCU 라고 부릅니다. MCU 안에 있는 플래시메모리에 어떤 명령문을 기록하기 위해 MCU 마다 특별한 방법을 제시합니다. 그런데 아두이노를 쓸때는 우리는 그것을 신경쓰지 않아도 됩니다. 아두이노안에 있는 하드웨어와 기본펌웨어에서 그것을 처리해줍니다. 대신 우리는 USB 선을 통해서 아두이노로 명령문을 보내주기만 하면 됩니다. 그러면 아두이노는 알아서 그 명령문을 받아서 내부에 있는 플래시메모리에 저장해둡니다.

이 내용은 추후 필요하다면 보충해보도록 하겠습니다. 그러면 이제 LED 를 켜고 끄는 프로그램을 작동시켜 보겠습니다.

아두이노 IDE 를 엽니다.


'파일' - '예제' - '01.Basic' - 'Blink' 를 선택합니다.


주석처리된 부분을 삭제하면 다음과 같습니다.

void setup() {
     pinMode(13, OUTPUT);
}

void loop() {
    digitalWrite(13, HIGH); 
    delay(1000); 
    digitalWrite(13, LOW); 
    delay(1000); 
}


이 프로그램 코드를 보면 C 나 C++ 을 사용하셨던 분들은 처음에 많이 이상했을겁니다. 일반적으로 C , C++ 에서는 main() 이라는 함수가 처음에 나와야 하는데 아두이노엔 main() 이 없습니다. 

아두이노는 main() 을 없애고 대신 setup() 과 loop() 를 둡니다. setup() 은 처음 한번만 실행되는 함수입니다. 여기엔 처음 한번만 실행되면 충분한 설정값을 넣게 됩니다. loop() 는 전기가 흐르는 한 계속해서 해야 할 일을 넣게 됩니다. 위에서는 핀 13 번을 LED 를 켜고 끌수 있도록 출력으로 설정했습니다. 설정은 한번만 하면 되니까 setup() 함수 안에 넣었습니다.

void setup() {
     pinMode(13, OUTPUT);
}

그 다음 1초 간격으로 LED 를 켜고 끄는 작업을 무한 반복 합니다. 전기가 흐르는 한 이 일은 계속됩니다. 

a. 13번 핀에 +5V 를 흐르게 합니다.
b. 그 다음 1초동안 그 상태 그대로 있게 합니다.
c. 그리고 난 다음 13번 핀을 0V 가 되게 합니다.
d. 다시 1초동안 현재 상태를 유지하게 합니다. 그리고 다시 처음, a 로 갑니다.

    digitalWrite(13, HIGH); 

13번 핀을 현재 아두이노에 들어온 가장 높은 전압에 연결하라는 명령입니다. 아두이노에 들어온 전압이 5V 라면 핀에서 나오는 전압은 5V 가 될 것이고, 만약 3.3V 라면 핀이서 나오는 전압은 3.3V가 될 것입니다. 아두이노 우노는 5V 이므로 13번 핀은 5V 가 걸려있게 됩니다. 마찬가지로 가장 낮은 전압에 연결할 때는 digitalWrite(13, LOW) 를 사용합니다.

    delay(1000); 

이 내용은 delay() 함수를 이해해야 합니다. 일반적으로 PC 에서 프로그램을 한다면 이런 식으로 일부러 시스템의 자원을 낭비하는 일을 하지 않습니다. 하지만 때론 MCU 에서는 몇가지 이유로 이렇게 의도적으로 시간을 버리는(?) 코드를 쓰곤 합니다. 우선은 위의 경우 처럼 1초 동안 아무것도 하지 않아야 할 때 사용합니다. 또 다른 경우는 하드웨어적으로 하나의 신호가 들어간 후 일정시간이 지나야만 그 신호가 적용될 때 의도적인 delay() 를 사용하게 됩니다. 이 부분은 다음에 별도로 다루도록 하겠습니다.

setup() 는 단 1회만 실행되지만 loop() 는 무한반복됩니다. 우선 아두이노 프로그램을 처음하시는 분은 이걸 그냥 기억해두시면 좋겠습니다. 그리고 조금 더 깊이 main() 이 어디 갔는지 궁금하시 분들을 위해 사라진 main() 의 위치를 여기 적어두겠습니다.

C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino

제 PC 의 경우 64비트 윈도우10 운영체제를 사용합니다. 아두이노는 위와 같은 경로에 설치되어 있고, 그 경로를 따라 들어가면 

\Arduino\hardware\arduino\avr\cores\arduino\main.cpp

가 있습니다. 주석과 일부를 제거하고 setup(), loop()와 관련된 부분을 보면,

#include <Arduino.h>

int main(void)
{
    init();
    initVariant();
    setup();


    for (;;) {
        loop();
        if (serialEventRun) serialEventRun();
    }


    return 0;
}

위와 같습니다. 결국 보이지는 않았지만 main() 안에 setup() 은 1회 실행으로, loop() 은 무한반복으로 운명지워져 있었던 것입니다.


이제 프로그램이 제대로 작동하는지 살펴보겠습니다.

우선 아래 그림처럼 아두이노우노를 선택하십시오.


그 다음 포트를 선택합니다. USB 케이블로 아두이노와 PC 가 연결되어 있다면 COM 포트가 하나 만들어졌을 것입니다.
 

아두이노 보드 설정이 바르게 되었고, 포트까지 바르게 연결되었다면 이제 프로그램을 컴파일해서 아두이노로 보내면 됩니다. 이 과정은 아래 사진에 있는 화살표를 클릭하면 됩니다. IDE 에서 컴파일을 하고 실행파일을 만든 다음 그것을 바로 USB 케이블 통해 시리얼통신으로 보냅니다. 아두이노 보드에서는 전송되어 온 값을 받아서 플래시메모리에 기록하게 됩니다.


아래 사진은 컴파일이 정상으로 되었고, 전송까지 잘 완료되었음을 보여줍니다.
 


이제 보드를 잘 보면 보드에 붙어있는 LED 하나가 1초 간격으로 깜박이고 있을 겁니다. 여기까지 하셨으면 아두이노 절반은 하신 겁니다. 축하합니다.


Comment +0

CH.02.아두이노 IDE 설치하기

아두이노 IDE 를 설치해보겠습니다. 우선 IDE 란 것이 무엇인지부터 살펴보겠습니다.

IDE 는 Integrated Development Environment 의 약자로 번역하면 '통합개발환경'이 됩니다. 
그런데 보통 통합개발환경이라고 불릴 정도가 되면 편집과 컴파일, 디버깅, 배포까지 소프트웨어에 관해서는 모든 작업이 그 안에서 다 이루어질수 있는 것으로 보아도 틀리지 않습니다. 

아래 두 그림은 각각 Code Composer Studio 라는 IDE 와 IAR 이라는 IDE 입니다.



창(window)의 갯수가 거의 10개에 이릅니다. 필요하면 이보다 더 많은 창을 열어서 사용할 수도 있습니다. 각각의 창이 하는 역할은 모두 다릅니다. 소스를 편집하는 것, 내부 레지스터의 값을 보이는 것, 결과값을 보이는 것, 로그를 보이는 것, 코드를 어셈블한 것을 보이는 것 등등 상당히 많은 창들이 사용됩니다. 

그에 비해 아두이노 IDE 는 다음과 같이 매우 단순합니다.

다른 IDE 들과 비교해보면 얼마나 단순한지 알 수 있습니다.
왜 이렇게 단순할까? 사용하다보면 더 필요한 기능들이 얼마나 많이 있는데, 이렇게 조촐하게 만들어진 IDE 를 가지고 쓸 사람이 있기나할까? 사실 처음 아두이노가 세상에 나왔을때 많은 사람들이 아두이노의 모습을 보고 던진 비웃음이 있었을 겁니다.

처음 소프트웨어가 세상에 나왔을때 이런 IDE 는 없었습니다. "통합"이라는 말이 붙는 개발환경 자체가 없었습니다. 개발하려는 사람은 매우 열악한 문서편집 소프트웨어(이를테면 지금의 윈도우 메모장보다 훨씬 불편한 vi 같은 문서편집 프로그램)를 썼습니다. 소스코드를 만들고 그것을 컴파일하고, 컴파일 된 파일들을 모아 다시 링크를 해서 실행파일을 만들었습니다. 종종 문제가 생기면 열심히 소스코드를 들여다보면서 어디가 잘못되었는지 찾았습니다. 눈으로 말이지요.

그러다가 소스편집과 컴파일, 링크를 통해 실행파일을 한번에 만드는 개발환경을 만들고 그 안에 디버깅할 수 있는 내용도 추가했습니다. 조금 더 편리하게 개발할 수 있는 환경을 프로그래머들이 만든것이지요. 그런데 전문적인 프로그래머의 입장에서는 가능한 많은 창을 한꺼번에 띄워두고 자기가 원하는 정보를 빨리 보는 것이 좋았습니다. 시간이 갈수록 IDE 는 복잡해졌습니다. 나중에는 IDE 자체를 사용하는 것이 쉽지 않은 일이 되고 맙니다.

예전에 8051 이라는 MCU 를 사용하기 위해 KEIL 과 IAR 이라는 컴파일러를 사용할 기회가 있었습니다. 프로그램을 쉽게 하기 위해 만들어진 IDE 를 이해하기 위해 상당히 두꺼운 메뉴얼을 프린트로 출력해서 영어로 된 원서를 더듬거리며 읽어야 했던 기억이 납니다. 

매일 이런 프로그램을 사용하는 전문가들에게는 어렵더라도 기능이 강력한 이런 IDE 가 아주 좋은 도구가 됩니다. 일주일이 걸릴 작업을 사나흘만에 해낼수도 있습니다. 하지만 이런 프로그램을 자주 사용하지 않는 일반인들에게는 오히려 강력한 IDE 의 등장은 현재 진행중인 기술과 담을 쌓게 되는 원인이 됩니다. 그저 전구에 불을 켜고 끄는 일을 1초에 한번씩 반복하는 간단한 작업을 하고 싶어도 수백페이지가 넘는 영어로 된 메뉴얼을 읽어야만 한다면 그는 차라리 다른 전문가에게 그 일을 의뢰하거나 혹은 포기하고 말겁니다. 게다가 KEIL 이나 IAR 같은 컴파일러들은 개인이 구입해서 사용해보기에는 많이 비쌉니다. 윈도우나 한글, 오피스 같은 범용 프로그램들은 일반인을 상대로 개발하고 많은 판매를 하기 때문에 구입하기로 마음먹어도 큰 부담은 없습니다. 하지만 KEIL, IAR, Code Composer 같은 전문가들이 사용하는 프로그램들은 부르는게 값이었고, 사용하기도 만만치 않았습니다.

하지만 다행스럽게도 gcc 라는 GNU 프로젝트에 의해 만들어진 공개된 컴파일러가 등장합니다. gcc 는 처음 리눅스환경에서 사용되었지만 지금은 거의 모든 환경에서 사용됩니다. 보통은 PC 환경만 생각합니다. 하지만 SDCC 라는 8051용 컴파일러도 있고, AVR-GCC 라는 AVR용 컴파일러도 있습니다. 이런 공개된 무료 컴파일러를 통해 누구라도 비용에 대한 걱정없이 8051 이나 AVR 을 사용할 수 있게 되었습니다. 

하지만 여전히 일반인이 넘기에는 어려운 벽이 있었습니다. SDCC 나 AVR-GCC 는 무료로 사용할 수 있었지만 통합개발환경이 아닌 컴파일러였기에 제대로 사용하기 위해서는 makefile 이라는 것을 만들어야 했습니다. 이 makefile 을 만드는 것이 무척 어렵고 성가신 일입니다. 이미 많이 만들어본 사람에게는 별것이 아니겠지만 처음 사용하는 사람에게는 makefile 을 만드는 것만 해도 머리에 쥐가 나는 것은 물론이고 "그냥 나 이대로 살래"란 말이 자연스럽게 나오게 만들 정도였습니다.

mcu 는 점점 속로가 빨라지면서 고성능화 되어가고, IDE 는 점점 비싸지면서 일반인들은 감히 건드리기도 힘든 아우라를 갖춘 복잡한 모양이 되어갑니다. SDCC 나 AVR-GCC 는 읽기도 힘든 영문매뉴얼을 읽어야하고, 게다가 makefile 이라는 난생 처음 들어보는 이상한 컴파일-링크 시스템을 사용자가 알아서 만들어줘야만 합니다. 에러가 나면 어디서 문제가 생겼는지 찾기도 힘들었습니다.

사실 그런 환경속에서 아두이노는 태어납니다. AVR-GCC 를 컴파일러로 사용하지만 외형은 전혀 그렇지않고 깔끔하고 간단하게 갖췄습니다. AVR 을 프로그램한다면 당연히 했어야하는 레지스터에 대한 것도 묻지 않습니다. 포트를 읽는 것으로 할 것인지 쓰는 것으로 할 것인지도 간단하게 바꿨습니다. 

예전식으로 프로그램을 하면 다음과 같습니다.

DDRA = 0x00;    //Set port a as input
x = PINA;       //Read contents of port a 
첫줄은 A 포트를 입력으로 사용하겠다고 레지스터를 설정하는 것입니다.
둘째줄은 포트A 로 들어온 값을 x 라는 변수에 입력시키는 것입니다. 포트 A 는 8개의 입력핀이 모인 곳이라고 하면 x 에 들어온 값은 이진수로 00000000 부터 11111111 까지의 어떤 값이 됩니다. 결국 x 들어온 값으로 각 핀의 값을 알려면 다시 x 를 비트연산자를 통해 각 핀의 값으로 읽어줘야만 합니다. 

DDRB = 0b11111111;        //set all pins of port b as outputs
PORTB = 0xFF;             //write data on port 

첫줄은 포트 B 의 모든 핀을 출력으로 설정하는 것입니다. 위에 입력으로 할때와 비교하면 이해가 될 것입니다. 그리고 두번째 줄은 포트 B에 값을 넣어서 각 핀을 통해 5V 또는 0V 를 보내는 것입니다. 여기서는 포트 B 의 8개 핀 모두에서 +5V 가 나오게 했습니다.

이것을 아두이노에서는 이렇게 프로그램합니다.

pinMode(13, OUTPUT);          // 13번 핀을 출력으로 설정
digitalWrite(13, HIGH);          // 13번 핀에 5V 출력
digitalWrite(13, LOW);          // 13번 핀에 0V 출력

pinMode(12, INPUT);                            // 12번 핀을 입력으로 설정
int buttonState = digitalRead(12);      // 12번 핀을 읽어 변수 buttonState 에 저장

이전 방식의 AVR 프로그램과 비교하면 아두이노의 프로그램은 훨씬 인간적입니다. 물론 이렇게 인간적인 프로그램이 되기 위해서 포기한 것이 있습니다. 레지스터를 직접 다루는 것을 포기했습니다. 결과적으로 프로그램의 속도나 효율도 떨어졌습니다. 하지만 프로그램이 쉬워졌습니다. IDE 도 복잡하면서 막강한 기능을 가지는 대신 단순하면서 최소의 기능에 만족했습니다. 마친 모든 MP3 들이 이퀼라이저에 칼라 LCD 에 심지어 움직이는 동영상까지 넣으려던 때에 애플이 동그랗고 커다란 버튼 하나만 달랑 붙은 아이팟을 내놓았을 때처럼 아두이노의 IDE 는 혁신적이었습니다.

기능의 부족함이 오히려 일반인들에게는 더 가까이 다가갈 수 있는 매력이 된 것입니다. 

지금 다수의 컴파일러들은 아두이노 IDE 와 유사해집니다. Ti 는 Code Composer Studio 라는 IDE 를 판매하고 있습니다. 아두이노의 열기가 뜨거워지고 현재 TI의 일부 범용 MCU (C2000, MSP430, etc.) 를 프로그램 할 수 있는 Energia 라는 오픈소스 IDE 가 나왔습니다. 모양은 아두이노 IDE 와 똑같습니다. 색깔만 빨간색입니다.


단순하기 때문에 성공한 것, 그것이 아두이노의 매력입니다.

이제 이 단순한 IDE 를 설치해 보겠습니다.

https://www.arduino.cc/ 로 가서 Download 라고 되어 있는 메뉴를 클릭하고 윈도우나, 맥, 리눅스 중 자신의 운영체제에 맞는 것을 다운받으시면 됩니다. 설치는 다운 받은 파일을 더블클릭해서 순서대로 따라가기만 하면 됩니다. [바로가기 링크]




Comment +0

CH.01.아두이노와 PC연결

다음과 같이 준비합니다.

1. 아두이노 우노
2. USB포트가 있는 컴퓨터로 리눅스, 맥, 윈도우 운영체제가 갖추어진 것
3. USB 케이블 (보통 우노를 구입할 때 함께 오는 것)
4. 브레드보드
5. 브레드보드용 케이블









우선 준비된 아두이노 Uno 를 PC 에 연결합니다. 다음 그림과 같이 USB 포트를 연결하면 됩니다.


연결이 되면 아두이노에 불이 들어옵니다. 


Comment +0