루덴스코드 Blog

메이커활동/HW&SW +54

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

아두이노를 PC 에 USB 케이블로 연결하고 PC 에서 아두이노 IDE 를 실행시키면 보통 알아서 드라이버가 설치되고 아두이노와 PC는 연결된다.



[툴]-[포트]를 선택하면 COM5(Arduino/Genuino Uno) 가 나온다. 그런데 이 부분에서 [툴]-[포트]를 선택해도 아무것도 나오지 않는다면 자신의 아두이노가 저가형 USB 칩인 CH340 계열의 칩을 사용한것이 아닌지 의심을 해야 한다. 그 경우 별도로 CH340 드라이버를 설치한 후 다시 아두이노 IDE 를 실행시키면 이 부분은 해결된다.


구글에서 "ch340 driver windows 10"을 검색한 후 필요한 드라이버를 다운받아서 설치한다.



현재 http://www.wch.cn/download/CH341SER_ZIP.html 에서 다운받을 파일을 아래에 둔다.


CH341SER.ZIP


압축을 풀면 CH341SER 폴더가 생기고, 그 아래에 또 CH341SER 만들어진다. 그 안에 있는 SETUP.EXE 를 실행시킨다.







Comment +0

This is the broken TFT LCD Shield for Arduino.






The TFT shield has some problem, it is broken.


Order ID : 73010957057680 

Tracking Number : 1080719990

Store: Cathy's Online Store



Comment +0

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 를 이용해서 하는 방법을 익히실 수 있을 겁니다.

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

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

1. Capture video from camera


import numpy as np
import cv2

cap = cv2.VideoCapture(0)

while(True):
# Capture frame-by-frame
ret, frame = cap.read()

# Our operations on the frame come here
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

# Display the resulting frame
cv2.imshow('frame',gray)
if cv2.waitKey(1) & 0xFF == ord('q'):
break

# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()



2. Saving a video

저장을 위해 필요한 코덱이 미리 설치되어 있어야 한다. 모니터화면을 동영상으로 저장하는 oCam 을 설치하면 Xvid 코덱이 설치된다. 일반 동영상플레이어 설치시 설치되는 Xvid 코덱은 읽기용 코덱이라 여기에서 사용되는 것과 다르다. Xvid 쓰기용 코덱을 설치한다. ( http://goo.gl/v63QJ5 )


import numpy as np
import cv2

cap = cv2.VideoCapture(0)

# Define the codec and create VideoWriter object
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))

while(cap.isOpened()):
ret, frame = cap.read()
if ret==True:
frame = cv2.flip(frame,0)

# write the flipped frame
out.write(frame)

cv2.imshow('frame',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break

# Release everything if job is finished
cap.release()
out.release()
cv2.destroyAllWindows()



3. Playing video from file


import numpy as np
import cv2

cap = cv2.VideoCapture('output.avi')

while(cap.isOpened()):
ret, frame = cap.read()

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

cv2.imshow('frame',gray)
if cv2.waitKey(1) & 0xFF == ord('q'):
break

cap.release()
cv2.destroyAllWindows()


Comment +0

두번째 장에서는 이미지를 다룬다.

cv2.imread(), cv2.imshow() , cv2.imwrite() 세 함수를 사용해본다.


1. 이미지 읽기 : cv2.imread()


import numpy as np

import cv2


img = cv2.imread('promini.png',0)


cv2.imshow('image',img)

cv2.waitKey(0)

cv2.destroyAllWindows()


img = cv2.imread('promini.png',0) : 회색(gray)으로 이미지 읽기

img = cv2.imread('promini.png',1) : 원색으로 이미지 읽기



2. 이미지 디스플레이 : cv2.imshow()


import numpy as np

import cv2


img = cv2.imread('promini.png',0)


cv2.namedWindow('image', cv2.WINDOW_NORMAL)

cv2.imshow('image',img)

cv2.waitKey(0)

cv2.destroyAllWindows()


cv2.namedWindow('image', cv2.WINDOW_NORMAL) : 윈도우 사이즈 조절 가능



3. 이미지 쓰기 :  , cv2.imwrite()


import numpy as np
import cv2

img = cv2.imread('promini.png',0)
cv2.imshow('image',img)
k = cv2.waitKey(0)
if k == 27:         # wait for ESC key to exit
    cv2.destroyAllWindows()
elif k == ord('s'): # wait for 's' key to save and exit
    cv2.imwrite('prominigrey.png',img)
    cv2.destroyAllWindows()





Comment +0

오픈CV 를 사용해 보려고 Python 을 시작한다. OpenCV 도 Python 도 잘 모른다. 하지만 둘다 그리 어렵지는 않으리라는 생각을 하면서 우선 OpenCV-Python tutorial 의 내용을 따라하기로 한다.


파이썬의 버젼은 2.7 대의 구버젼과 3.0 대의 신버젼이 있다. 신버젼이 오히려 많이 사용되지 않고 있다. 예전 버젼으로 나온 많은 라이브러리가 사용되지 않기 때문이고, 문법적으로 상당한 변화가 있다. 언젠가는 바뀌겠지라고 생각을 하지만 정말 바뀔지는 모르겠다. 굳이 100 원짜리 연필로 가능한 낙서를 10만원짜리 만년필로 대체할 필요는 없고, 2.7 대에서 굳이 큰 문제없이 - 문제가 전혀없는 것은 아니지만 - 사용하는 것을 3.0 대로 바꾸면서 파이썬을 사용하려는 사람이 얼마나 될지 모르겠다. 어쩌면 게임에서 지금까지 모은 모든 보호장비와 무기를 벗어던지고 근육만 두꺼운 신캐릭으로 바꾸라고 할때 처음 시작하는 사람이라면 당연히 가진 장비가 없으니 초기치가 든든한 신캐릭을 쓰겠지만 이미 많은 투자를 통해 무기와 방어구를 제대로 갖춰둔 사람이 그 모든 장비를 버릴수 있을까?


그래서 OpenCV 를 사용하기 위해서 Python 은 2.7 버젼을 사용한다.


1. Python2.7 버젼대를 다운 받고,

2. 에디터로 PyCharm Community 버젼 (무료)을 다운받아 설치한다.

3. PyCharm 을 실행시키고, New Project 를 만들어본다. 

4. File >> Setting >> Project >> Project Interpreter 에서 기존에 설치된 플러그인들을 최신버젼으로 설치한다. 

5. 설치시 에러가 나면 에러가 난 부분을 잘 찾아 읽어본다. Microsoft Visual C++ Compiler Package for Python 2.7 을 설치하라는 메시지가 있으면 그곳에 나온 링크를 따라가서 파일을 다운받아 설치한다.  (링크 : https://goo.gl/E9EAkI )

6. + 키를 눌러 numpy, matplotlib 를 검색한 후 찾아서 설치한다. 

7. OpenCV 를 다운받아서 설치한다. ( http://goo.gl/ZnEZiW )

8. PC 의 opencv/build/python/2.7/ 아래 폴더(32비트와 64비트 두가지 폴더가 있음)에서 cv2.pyd 파일을 C:/Python27/lib/site-packeges 에 복사한다.

9. 완성. 제대로 되었는지 확인하기 위해


import cv2

print cv2.__version__


결과로 버젼값이 화면에 나오면 완성


python, opencv 로 구글검색하면 나오는 사이트 OpenCV Python Tutorial 을 시작한다. (https://goo.gl/pFZA0g)



Comment +0

제목 : 아두이노 INPUT, OUTPUT 핀의 내부
부제 : floating 현상에 대한 이해

아두이노는 AVR 이라는 MCU 를 사용한다. 
MCU 는 내부적으로 레지스터라는 일종의 스위치를 가지고 있다. 이 레지스터를 어떻게 조작하느냐에 따라 여러가지 기능을 끄거나 켜서 사용자가 원하는 행동을 하게 한다. 쉽게 예를 들면 전기밥통과 같다. 전기밥통에 쌀을 썻어서 잘 넣어두었다고 밥이 되지는 않는다. 전기를 연결해야 하고 뚜껑을 닫은 다음 밥을 짓는 스위치를 눌러야한다. 그러면 일정시간 열이 들어와 밥이 된다. 일정시간이 지나면 다시 전열장치는 꺼진다. MCU 도 마찬가지다. 조금 더 많을 뿐이다.




위 그림은 아두이노 우노에 사용된 ATMEGA328P 의 데이터시트[LINK] 80페이지에 있는 그림이다.
이 그림에서 보여지듯 핀을 통해 어떤 데이터가 들어올때와 나갈때 상당히 많은 장치를 통과하게 된다. 이것들을 보통 논리회로라고 부르는데, 이런 논리회로들의 조합으로 일종의 스위치가 만들어진다. 이것을 MCU 에서는 '레지스터' 라고 부른다.

레지스터를 조작함으로 MCU 는 내부적으로 어떤 핀을 통해 데이터가 들어올 것인지 나갈 것인지를 결정한다. 데이터가 나갈때는 (편의상 디지털핀에 국한해서 설명한다) 전원만큼의 전기를 보내거나(VCC, 우노에서는 5V), 혹은 전기가 들어오게(GND, 0V) 한다. 이것을 1과 0으로 표현한다. 즉, OUTPUT 상태의 핀에서는 1 또는 0의 상태가 확실하게 결정되어 있다. 1이 출력되거나 혹은 0이 출력된다. 그래서 OUTPUT 상태에서는 플로팅현상이 없다.

아두이노의 핀이 INPUT 상태인 경우를 생각해보자. INPUT 상태이므로 외부에서 오는 신호를 읽기 위해 준비를 하고 있다. 즉, 핀에 연결된 신호가 0V가 되거나 혹은 5V 가 되어야 한다. 그런데 이때 만약 INPUT 에 연결된 신호선이 단선되었다면 어떻게 될까? 항상 연결되어 읽어들여야 할 값이 순간적이라도 끊어졌을때도 INPUT 핀은 여전히 끊어졌다는 것을 알지못한채 계속 신호를 읽게 된다. 끊어진 선은 0V 일까 5V 일까? 아무것도 아니다. 5V 라 함은 전위차가 기본이 되는 GND 보다 5V 만큼 높다는 것을 의미하고, 0V 라 함은 전원의 기준을 의미한다. GND(0V)는 전기가 흘러들어갈 수 있는 곳이다. 하지만 끊어진 선은 전기를 내보내지도, 받아들이지도 않는다. 그래서 floating 이라는 말을 사용한다. 전기를 받아들이지도 내보내지도 못하는 곳은 언뜻 보면 0V 와 비슷하게 보이지만 실제로 0V가 아니다. 

현실적으로 floating 된 곳에 아주 작은 전하가 모일 수 있다. 그래서 floating 된 곳은 0 과 1 을 의미없이 반복하게 된다. 주기적인것도 아니고, 특별한 이유가 있는 것도 아니다. 주변에 생기는 자기장의 변화때문에, 정전기 때문에 이러한 현상이 반복된다. 그래서 INPUT 모드에서는 기본적으로 PULLUP 또는 PULLDOWN 을 해준다. AVR 의 경우 외부에 PULLUP저항을 추가하는 대신 내부에서 레지스터를 건드리는 것 만으로 PULLUP 이 가능하게 해 두었다. 




13번 핀을 LED 를 켜고 끄기 위한 OUTPUT 으로 사용할때 AVR 에서 여러가지 레지스터를 다루어야 했던 것과 달리 아두이노는 아래와 같이 간단한 한줄로 설정이 끝난다.

     pinMode(13, OUTPUT);

하지만 이 한줄을 컴파일하면 보이지 않는 내부에서는 위에 그려진 여러 레지스터를 조작하게 된다. 
INPUT 모드에서 두가지가 있다. 

     pinMode(12, INPUT);
     pinMode(12, INPUT_PULLUP);

두가지는 내부 풀업저항을 사용하느냐 아니냐에 따라 달라진다. 외부에 풀업저항, 혹은 풀다운저항을 사용한다면 pinMode(12, INPUT); 을 사용하면 되고, 내부 풀업을 사용한다면 pinMode(12, INPUT_PULLUP); 을 사용하면 된다.

실제 아두이노 IDE 에서 레지스터의 조작에 관해서는 데이터시트의 75페이지 이하 부분과 아래 링크를 참고하라.



Comment +0


TI 의 LaunchPad TM4C123G 를 sketch 와 유사한 프로그램인 energia 에서 사용하기


1. 모든 자료는 다음 링크에서 가져올 수 있다.
>> http://www.ti.com/tool/EK-TM4C123GXL?DCMP=stellaris-launchpad&HQS=tm4c123g-launchpad

2. 간단하게 LaunchPad 를 사용하는 방법

* PC와 USB로 연결(보드의 윗부분에 있는 Programming & Debugging 을 위한 USB 커넥터에 연결)
왼쪽 위의 스위치를 Debug 쪽으로 전환
ti.com/tmc4c123g-launchpad 에서 아래 그림처럼 나오는 부분에서 LaunchPad Drivers 를 선택, 설치

www.energia.nu >> dawnload >> 최선버젼의 energia 를 다운 받아 설치
[energia] >> Tools >> Board >> LaunchPad(Tiva C) w/tm4c123 (80MHz) 선택
[energia] >> Tools >> Serial Port >> Com__ (자신에게 맞는 것) 선택
energia 실행 >> File >> Examples >> Basics >> Blink 클릭
->] 업로드 실행 후 결과 관찰



Comment +0



(위) 구글드라이브에 수집된 자료로 바로 그린 그래프


(위) 아두이노 메가와 이더넷실드를 연결하고, 센서와 스위치를 연결, 공유기를 통해 인터넷에 연결된 상태

[개요]
설문조사등에 사용되는 구글양식(Form) 을 이용하여 정해진 양식의 데이터를 구글문서 spreadsheet 에 등록할 수 있다. 이것을 이용하면 간단한 DAQ 즉, 데이터를 얻어서 정해진 장소에 저장시키는 기능을 아두이노로 구현할 수 있겠다는 생각이 들었다. 

기본적으로 DAQ 는 센서의 입력을 받아 그것을 저장하는 역할을 한다. 가격이 비쌀수록 더 정밀한 센서값을 읽어들일 수 있고, 저장 간격 즉 sampling rate 를 작게 할수 있다. 그리고 충분히 오랜기간동안 데이터를 누적시킬 수 있어야 한다.

하지만 Arduino 로 그러한 성능의 DAQ를 모방한다는 것은 세발자전거타고 페라리하고 경주하는 것이나 다를바 없으니 그러한 것을 기대하지는 말자. 그저 여기서 한다는 것은 아두이노라는 매우 편리하지만 저렴한 장비를 이용해 개인적인 필요에 의해 아주 저렴하게 DAQ 시스템을 만들어보겠다는 것이다. 직접 테스트한 결과 sampling rate 는 10초에 3회 정도로 약 3~4초 정도의 간격으로 데이터를 받게 된다. 1Hz 도 아니고 0.3Hz 정도다. 이정도면 어디서 DAQ 라는 말은 꺼내지 못한다. 그래도 아두이노와 이더넷실드만 있으면 SD카드도 아니고, PC 서버를 쓰는 것도 아니니 집의 온도를 측정한다든지, 조도센서를 달아서 빛의 양을 측정하든지 등등의 개인적 용도로 사용하는 방법은 각자가 알아서 고민하면 상당히 나올법하다. 

서론이 이쯤하고 이제 제작 방법을 공개한다. 제작은 순수하게 개인의 힘으로 한 것이 아니라 구글을 통한 검색과 이미 이러한 가능성을 먼저 고민하고 나름대로 고민한 많은 이들의 힘으로 이루어진 것이다. 난 거기에 숟가락 하나 더 얹었을뿐...
 
간단하게 아두이노와 주변 회로를 그려보면 다음과 같다. 아두이노는 5개의 센서입력을 받고, 3개의 스위치가 연결되며, 그중 2개는 슬라이드(혹은 토글)스위치이고 하나는 택트스위치(혹은 푸쉬버튼)이다.
아두이노는 Mega2560을 사용하였으며 이더넷실드와 연결되어있다. 우노로는 작은 플래시메모리 때문에 처음부터 시도하지 않았다. 가능할 거라 여겨지지만 혹시나 안되면 굳이 프로그램코드를 줄이려하지 말고 그냥 메가2560 을 구입하길 권한다. 이베이 가격은 국내 판매가격의 절반 이하다. 필자도 거기서 메가2560과 이더넷실드를 구입했다. 

[물리적환경]
서입력 ------>> [아두이노+이더넷실드] --- 공유기
SW1/SW2/SW3--->>
 
[Sensor1]-----+      +-----[A0]----------------+=+------------+
[Sensor2]-----+      +-----[A1]-               |=|            |
[Sensor3]-----+======+-----[A2]-   [ARDUINO]   |=|   Ethernet |
[Sensor4]-----+      +-----[A3]-               |=|   Shield   |
[Sensor5]-----+      +-----[A4]-               +=+------------+
                           [  ]-               |      ||
VCC-----+                  [  ]-               |      || LAN
        +--[SW_TACT1]-+----[03]-               |      ||
        +--[SW_SLDR2]-+    [  ]-               | +-------------+
GND--------[10k]------+   [  ]-               | |             |
GND-----[220ohm]---[LED]---[04]-               | |   Router    |
GND--------[10k]------+----[05]-               | |             |
VCC--------[SW_SLDR3]-+        ----------------+ +-------------+


[사용법]
아두이노 메가 2560 과 이더넷실드를 결합한다.
이더넷실드와 공유기를 LAN 연결한다. 공유기는 IPTIME 을 사용하였다.(다른 것을 사용하여도 문제없을것이다. 단 IP설정과 기타 등등 알아서 해야한다.)
공유기에서 이더넷실드의 mac 주소를 ip 와 연결한다. 


그림처럼 자신의 이더넷실드의 mac 주소와 ip 주소를 연동시킨다. 이렇게 하지 않고도 되기도 하던데, 정확히 어떤때 되고 어떤때 문제가 되는지는 확실하지 않다. 그 부분은 차후에 시간이 되면 구글 검색해가면 공부해 볼 생각이다. 우선 위 그림처럼 처리해두자. 그리고 위 사진에는 없지만 등록한 ip 의 포트 60번을 열고 포트포워딩을 해둔다. [NAT/라우터관리]에 들어가서 처리할 수 있다. [포트포워딩]으로 검색하면 상당히 많은 자료들이 나올것이다.


소스를 컴파일&업로드한다. 이 부분은 이미 아두이노를 사용하고 있는 사람이라면 아무런 문제없을 것이라 생각되어 더 이상의 설명은 생략한다.

--[소스시작]---

더보기


--[소스끝]---

스위치는 총 3개이지만 1개는 버튼식으로 누를때만 ON 이 되는 것이고, 두개가 슬라이드 혹은 토글 스위치로 방향(ON/OFF)를 정해두어야 하는 것이다.

** SW_SLDR2 == ON & SW_SLDR3 == ON -->> continuous sampling 
** SW_SLDR2 == OFF & SW_TACT1 -->> discrete sampling when tact switch pushed

2번 3번 스위치를 둘다 ON 시키면 자동으로 계속 센서값을 읽은 후 바로 저장한다.
2번 스위치가 OFF 상태이면 택트스위치가 눌려질때만 한번씩 값을 읽고 저장한다. 

연속 샘플링 저장은 SW_SLDR2 와 SW_SLDR3 를 모두 ON 시키면 되고, 하나씩 저장할 때는 SW_SLDR2 를 OFF 시킨 상태에서 택트스위치 SW_TACT1 를 누르면 된다.


[프로그램 설명 전 알아야 할 내용들]

작동시 미리 구글양식으로 저장할 센서값을 받도록 해 두어야 하며, 구글문서 스프레드시트에서 결과를 볼수 있게 해 두어야 한다.


구글 계정이 없다면 구글 계정을 만든다. 구글 양식을 사용하기 위해서다.


5개의 센서값을 받아서 저장할 것이므로 총 5개의 질문을 만든다. 질문은 [온도], [조도] 처럼 짧게 만들어두는게 보기 편하다. 질문이 완성되었으면 [응답 >> 미리 작성된 URL 생성하기 >>]로 가서 5개의 질문에 대한 기본 답을 적는다. 



위의 링크부분을 복사해 둔다. 여기서 필요한 몇가지 정보를 꺼내야 한다.

https://docs.google.com/forms/d/1Bm0aiZU-5BtFmbkdq43iusDKzkpoNy3ci-XzG8jLrq4/viewform?entry.1187211743=1&entry.1887603566=2&entry.545717569=3&entry.740437495=4&entry.802468911=5


[분석순서]

1. 양식의 keyid : docs.google.com/forms/d/ 뒤에 있는 id
1Bm0aiZU-5BtFmbkdq43iusDKzkpoNy3ci-XzG8jLrq4
 
2. 입력받는 내용의 번호 : &entry.에 불어있는 번호숫자, 5개의 입력을 받으므로 총 5개 번호
   1187211743
   1887603566
   545717569
   740437495
   802468911

3. url 상태에서 전송하기 위해서 두가지 내용이 수정, 추가됨 
맨끝에 추가될 것 : &submit=Submit
수정될 것 : viewform -> formResponse

4. 결과
https://docs.google.com/forms/d/1Bm0aiZU-5BtFmbkdq43iusDKzkpoNy3ci-XzG8jLrq4/formResponse?entry.1187211743=1&entry.1887603566=2&entry.545717569=3&entry.740437495=4&entry.802468911=5
&submit=Submit

5. 센서값 입력할 곳
위에서 '&entry.[숫자]='다음에 오는 텍스트가 입력값이 됨, 즉 위의 경우 5개의 입력값은 각각 1, 2, 3, 4, 5 가 되고, 입력값만 변경해 주면 변경된 값으로 추가됨.

6. http 가 아닌 https 이므로 아두이노에서 직접 사용하기에는 무리임, 별도의 방법을 찾음
www.pushingbox.com 에서 계정을 만듬(구글계정으로 사용)

7. [in PushingBox] MY SERVICES >> Add a service >> CustomURL >> [Name / Root URL / POST 입력]
여기서 Root URL 에 



https://docs.google.com/forms/d/[...이부분은 자신의 google keyid...]/formResponse?
를 입력

https://docs.google.com/forms/d/1Bm0aiZU-5BtFmbkdq43iusDKzkpoNy3ci-XzG8jLrq4/formResponse?


8. MY SCENARIOS >> [자신의 시나리오 이름(ex. GDocs)] Add
DeviceID 를 기록해 둘 것 (ex. v478626023164DCD)
>> Add an action >> Google Driver for Arduino [Add an action with this service] >> Data [아래방식으로 텍스트입력] [Submit]

&entry.(2의 첫번째번호)=$first$&entry.(2의 두번째번호)=$second$&entry.(2의 세번째번호)=$third$&entry.(2의 네번째번호)=$fourth$&entry.(2의 다섯번째번호)=$fifth$&&submit=Submit

번호를 직접 입력하면 다음과 갈다.

&entry.1187211743=$first$&entry.1887603566=$second$&entry.545717569=$third$&entry.740437495=$fourth$
&entry.802468911=$fifth$&&submit=Submit



여기서 $first$ 부터 $fifth$ 까지 다섯개의 변수를 둔다. 
MENU 의 API 를 클릭, 내용을 참고하여 다음과 같이 http 주소창에 써넣어주면 된다.

http://api.pushingbox.com/pushingbox?devid=(8의 DeviceID)&(변수1)=(변수1의값)&(변수2)=(변수2의값)...

이것을 적용하면 다음과 같다.

http://api.pushingbox.com/pushingbox?devid=v478626023164DCD&first=100&second=200&third=300&fourth=400&fifth=500

[기타]
  1. 속도가 매우 늦다. 구글 드라이브에 직접 연결하는 것이 아니라 PushingBox 에서 제공하는 API 를 통해서 연결하는 것이므로 샘플하나를 전송하는데 걸리는 시간이 3~4초 정도 된다.

  2. 구글측에서 자신들의 양식(form)을 이런식으로 사용하는 것에 대해 막을 가능성이 있다. 과거에도 그러했던것처럼. 즉, 구글 드라이브로 DAQ를 만들어 쓰는 것은 지극히 개인적인 것으로 그치는 것이 좋다.

  3. 이더넷실드는 100M 의 속도를 제공하지만 정작 인터넷 연결시 속도가 그보다 못할경우 아예 작동을 안하기도 한다. 공유기와 실드간 상당한 거리를 두고 연결해보려고 하였지만 계속 실패하였다. 성공했다가 실패하기를 반복해서 처음엔 코드를 살폈고, 나중에는 하드웨어가 문제가 있는지도 살폈다. 하지만 원인은 10m 정도 되는 랜선이었다. 공유기를 실드 바로 옆으로 옮기고 짧은 랜선을 사용하자 모든 문제가 해결되었다. 

  4. 구글드라이브 스프레드시트는 40만개 셀, 최대 256개 열, 수식 4만개의 제한이 있다. 최근들어 새로운 스프레드시트는 200만개의 데이터셀을 지원한다고 하지만 Simple DAQ 사용시 약 2만개를 넘었을때 경고문이 뜨는 것을 보았을때 현재 한국에서 사용하는 구글드라이브 스프레드시트는 시트당 40만개가 최대 한계인 듯 하다. 그래서 구글 스프레드시트에서 사용하지 않는 컬럼을 삭제하면 그만큼 사용가능한 셀의 갯수가 늘어난다. 즉, 100개 열이 있다면 5개의 데이터가 10번 들어오면 사용되는 것은 50개의 셀이지만 그 옆에 사용하지 않는 950개의 셀이 낭비된다. 이 낭비를 줄이는 방법은 사용하지 않는 컬럼을 삭제하는 것이다.

  5. 데이터가 누적되는 동안 스프레드시트를 열지 않는 것이 정신 건강에 좋다. 화면에 멈춘듯이 보이고, 때로는 원하지 않는 작동을 하게 된다. 스프레드시트는 DAQ 작동을 멈춘 다음 확인 한다.







Comment +0

LabVIEW 를 이용한 Arduino 활용

Arduino 는 그 자체로도 꽤나 괜찮은 도구이다. 하지만 그 도구가 PC와 만나면 더 큰 활용이 가능해진다. 그래서 보통은 Processing 이라는 프로그램을 사용한다. 이유는 기존의 PC용 프로그램을 만든다는 것이 그리 만만하지 않기 때문이다. 특히 Windows 운영체제에서 프로그램을 한다는 것은 전공자가 아닌 이상은 쉽지 않다.

그래서 아두이노를 이용하된 컴퓨터공학을 전공하지 않은 이들을 위해 특히 예술계통에서 컴퓨터 그래픽등으로 작업을 하는 이들을 위해 나온 것이 Processing 이라는 프로그램툴이다. C++, C# 등보다 어렵지 않고, 윈도우 프로그램도 며칠만 배우면 가능해진다. Visual C++ 을 배워야하고, API 니, MFC 니 이런것들을 몰라도 된다는 것이 얼마나 다행인가.

그 Processing 외에 또 몇가지 방법들이 있다. 그 중 하나로 LabVIEW 를 이용한 아두이노의 활용을 여기서는 다루고자 한다.

PC 프로그램을 LabVIEW 라는 툴로 하면 된다. LabVIEW 는 NI 에서 나온 제어용 프로그램툴이다. 그래픽으로 되어 있어 기존의 타이핑하는 방식이 아닌 선으로 각 블럭을 이어주는 방식이다. 프로그램을 전공하지 않은 공학자나 엔지니어들에게는 상당히 편한 프로그램방식이다. 효율도 많이 좋아졌다. 

순서대로 하나씩 진행해보도록 한다.

우선 준비물이 필요하다. 

준비물 : LabVIEW 프로그램, Arduino Uno 또는 Mega2560

1. PC 에 LabVIEW 를 설치한다. NI-VISA 드라이버도 설치한다. 보통 LabVIEW 를 설치하고 이어서 Device Driver 를 설치한다. 그때 NI-VISA 를 꼭 선택해서 설치한다. 혹시 빠뜨렸더으면 나중에 Device Driver 만 따로 설치하면서 NI-VISA를 설치해주면 된다. 

2. LIFA 를 설치해 준다. LIFA 는 LabVIEW Interface For Arduino 의 약자로 랩뷰프로그램안에서 아두이노모듈을 가져올 수 있게 해준다. 위치는 http://sine.ni.com/nips/cds/view/p/lang/ko/nid/209835 이다. 만약 이 글 이후에 링크위치가 바뀌었을 경우 랩뷰홈페이지나 혹은 구글등에서 LabVIEW 와 LIFA 를 함께 검색하면 쉽게 찾을 수 있다.

3. 혹은 2번을 쉽게 하기 위해서 VIPM 이라는 프로그램을 설치해서 사용할 수도 있다. VIPM 은 VI Package Manager 의 약자로 랩뷰에서 추가 설치되는 VI 들을 관리하는 툴이다. VIPM 은 http://jki.net/vipm/download 에서 다운받아 설치할 수 있으며 필요한 툴을 쉽게 설치 할수 있다. 

4. 이제 사용하는 아두이노에 맞는 IDE 와 드라이버를 설치한다. 이미 아두이노를 사용중이면 이 과정을 필요없다. 참고로 LabVIEW 로 아두이노를 사용하기 전에 우선 아두이노로 먼저  LED 깜박이는 정도까지는 하기 바란다. 

5. 이제 아두이노 IDE 를 열고 NI LabVIEW 사에서 준비해준 Firmware 인 
LIFA_Base.ino를 아두이노안에 써준다. LIFA_Base
.ino 파일은 다음 위치
에 있다.
  • C:\Program Files\National Instruments\LabVIEW 2013\vi.lib\LabVIEW Interface for Arduino\Firmware\LIFA_Base
필자의 경우 LabVIEW 버젼이 2013 이다. 버젼이 2010 이라면 ...\
LabVIEW 2010\... 에서 찾으면 된다.

6. ni 사에서 준비한 예제들은 다음 링크로 가면 있다. 하나씩 실행해보고 그 다음 자신에게 맞게 고쳐주면 된다.
  • https://decibel.ni.com/content/groups/labview-interface-for-arduino
** 참고로 우노와 메가는 보드타입이 다르다. 보통 예제들은 UNO 를 중심으로 되어 있으니 메가를 사용하는 사람은 참고하기 바란다.


메가보드에 LED 와 가변저항을 연결하여 저항값에 따라 LED 점멸 속도를 조절하는 가벼운 예제를 만들어보았다. 디지털 출력과 아날로그 입력 사용시 정상적으로 작동하는지 알기 위해서 만들어본 예제이고, 정상적으로 작동되었다.


NI 에서 제공하는 기본예제는 UNO 를 기준으로 한다. 그리고 PC 와 Arduino 가 연결되는 COM포트도 달라진다. 필자의 PC 에서는 COM6 를 사용하고 있으며 Mega 2560 보드를 사용했다.

 
LED 불빛이 점멸하는 것을 동영상으로 찍을까하다가 무슨 대단한 프로젝트를 한것도 아니데 이런것까지 동영상을 찍을 필요가 있나 싶어 그만둔다.

참고로 몇가지 시험결과로 디지털 및 아날로그 입출력과 관련되어 샘플을 PC 쪽으로 가져오는데 걸리는 시간은 기본 25ms 정도로 보인다. 이정도면 100ms 에 4번, 1초에 40번의 샘플링이 가능해진다. 40Hz 짜리 DAQ 라는 셈인데.... 내부의 레지스터를 조금 더 최적화시키든가하면 속도는 조금 더 빨라지긴하겠지만 솔직히 8비트 마이크로프로세서에 이보다 더한걸 바란다는 건 지나친 욕심이다. 속도가 더 빨라지려면 8비트짜리 MPU를 쥐어짜기보다는 32비트 Cortex-M3 쪽으로 넘어가는게 답이다.
 
현재 LabVIEW 에서 제공하는 LIFA 는 32비트 Arduino Due 의 사용은 제공하지 않는다. 굳이 사용하려면 방법이 없는 것은 아니다. 이를테면 DUE 를 Ethernet Shield 를 통해 PC 와 TCP/IP 통신이 가능하게 하고 LabVIEW 에서 TCP/IP 통신으로 DUE 를 통해 들어오는 값을 읽어주면 된다. 

 

Comment +4

  • 랩뷰 글 잘 읽었습니다~ 아두이노에 연결할 수 있는지는 처음 알았네요. 갖고 있는거로 언제 한번 도전해봐야겠네요. ^^

  • 장발장 2015.07.20 20:25 신고

    안녕하세요.
    Arduino due와 pc는 Ethernet 쉴드로만 연결할 수 있는 건가요? xbee로 연결하려고 하는데,,

  • 2016.11.25 19:35

    비밀댓글입니다

    • 예전 소스는 지금은 없습니다.
      그리고 지금 PC 에는 LabVIEW 가 설치되어 있지 않습니다.
      그냥 위의 그림을 보고 그대로 똑같이 만들면 됩니다.

윈도우 프로그램을 고심하던 중 알게된 QT 라는 것을 이용해 보기로 하였다.
C 는 어느정도 하고, C++도 문법은 알고 있는 정도지만 실제로 윈도우 프로그램을 작성하기엔 많이 부족하다.
MFC 보다는 공개소프트웨어인 QT 를 이용해 보려고 한다.

가끔 C 로 필요한 소스를 만들곤 하는데 그때도 QT 가 유용하게 이용될 것으로 보인다.

혹시 Cortex-M3 프로그램을 만드는데 QT 를 사용할 수 있을지도 알아보아야겠다. 우선 이곳은 설치하면서 찍은 사진을 올린다. 나중을 위해 참고할 자료다.

설치일 : 2013.11.18.

[##_http://electoy.tistory.com/script/powerEditor/pages/1C%7Ccfile9.uf@21307150528955781648E8.png%7Cwidth=%22620%22%20height=%22418%22%20alt=%22%22%20filename=%22MWSnap131118_084202.png%22%20filemime=%22image/jpeg%22%7C_##]


이곳에서 QT 를 다운로드 받는다. 반전된 부분을 클릭하여 작은 설치파일을 다운 받고, 그것을 실행한다. 실행하여 순서대로 진행하는데 큰 어려움은 없다.

[##_http://electoy.tistory.com/script/powerEditor/pages/1C%7Ccfile26.uf@2430715052895577139A00.png%7Cwidth=%22620%22%20height=%22382%22%20alt=%22%22%20filename=%22MWSnap131118_083749.png%22%20filemime=%22image/jpeg%22%7C_##]
다운로드받은 파일의 이름이다. 
 


기본설정대로 설치하는것이 좋을 듯 하다. 하드디스크 사정상 모든 것을 인스톨하지 못하고 우선적으로 필요하다고 생각되는 최소한을 설치하였다.

[##_http://electoy.tistory.com/script/powerEditor/pages/1C%7Ccfile9.uf@223071505289557711EC37.png%7Cwidth=%22500%22%20height=%22491%22%20alt=%22%22%20filename=%22MWSnap131118_083529.png%22%20filemime=%22image/jpeg%22%7C_##]
설치가 끝났다. 네트웍 상태가 좋지 않아 도중에 몇번 중단되었고, 다시 재실행을 시키는 작업을 반복하였다. 



 여기까지 설치가 끝나고 QT Creator 가 실행된 모습이다. 

Comment +0

종종 유투브영상에서 모니터를 설명하면서 한 부분을 확대하고 다시 축소하면서 설명을 진행한다. 무슨 특별한 줌인, 줌아웃 프로그램이 있을거라고 생각하고 찾아보았더니 오늘 우연하게도 윈도우7 에서 윈도우키와 + 키를 누르면 화면이 확대되고 - 키를 누르면 화면이 축소되는 것을 알았다.

앞으로 모니터 영상을 자료로 하는 동영상 자료를 만들때 유용한 팁이다. 별도의 프로그램 구동없이 자체 기능으로 된다는 것은 뜻밖의 행운(?)이다.

한가지 링크를 추가한다. 윈도우7 에서의 단축키들이다. 상당히 재미있는 것들이 많다. 다 실행해 본 것은 아니고, 시간날때 하나씩 해보면 재미있을듯 하다.

https://synecnet.wordpress.com/2009/09/10/windows-7-shortcuts/


Comment +0






LS 산전의 MC(Magnetic Switch or Magnetic Contact)를 사용해보려고 자료를 찾던 중 MC가 전자접촉기, 전자계폐기 등으로 불리며 릴레이와 유사하다는 것을 알았다. 그런데 정작 MC 를 구동하기 위한 외부 제어용 전압과 전류에 대해서 나와있지 않아 여러곳을 뒤진 끝에 발견한 내용을 여기 정리한다.




사용하려는 것은 MC-09b 이고, 이는 GMC-9 와 동일한 사양임을 알수 있다. 그리고 아래의 표를 발견했다.










GMC-9 의 경우 투입시 95, 유지시 9 VA 만큼 필요하고 그때의 소비전력은 2W 가 된다. 이로서 계산해보면 솔레노이드로 인한 역률은 0.22 가 됨을 알수 있다. 코일전류는 41mA가 흐른다. 이에 맞는 릴레이를 찾아서 사용하면 된다.


MC 를 8개 사용한다고 하면 그때 MC 에만 소비되는 전력은 16W 가 된다. 역회전을 고려, 16개를 사용한다면 32W가 사용된다. 


MC의_동작원리_및_제품선정.pdf



Comment +2

Cortex-M3 를 처음 사용해보게 되었다. 8051 이후 오랜만에 만져보는 마이크로프로세서다. 8비트만 사용해보다가 (80196 16비트 마이컴도 잠시 써보긴 했다), 32비트 ARM을 사용하게 되었다.


우선 공개된 프로그램으로 Cortex-M3 를 사용하도록 하는 것이 목표다. 그 다음에 몇가지 프로그램들을 할 예정이다.


1. Sourcery CodeBench Lite Edition 
보통 GCC 로 잘 알려진 공개툴이다. 

다운 : 
http://www.mentor.com/embedded-software/sourcery-tools/sourcery-codebench/editions/lite-edition/


참고문서:

http://layright.blogspot.kr/2012/05/open-source-arm-sw-3.html



Comment +0


윈도우에서 펄을 사용해본다. Perl 은 프로그래밍을 하는 사람들에게는 익숙하겠지만 일반 사용자는 잘 모른다. 굳이 알려고 할 필요없다. Perl 로 프로그램하되 윈도우에서 하는 사람에겐 일반적으로 액티브펄을 추천한다.

1. 다음의 사이트에서 액티브펄을 다운 받아 설치한다.
http://www.activestate.com/activeperl

2. 펄만 있으면 되는게 아니다. 좋은 텍스트에디터가 있어야 한다. 사용하는게 있으면 그걸로 쓰면 되고 아니면 적당한 것을 찾으면 된다. 울트라 에디트, 에디트 플러스 등이 많이 애용되는 상용 프로그램이고, 기타 공개 프로그램, 무료 프로그램 중에 잘 찾아도 좋은게 많다. notepad++과 Acroedit 가 많이 추천된다. 이 외에도 많다.
내 컴퓨터에 설치한 것은 notepad++, Acroedit, DesyEdit 이렇게 세개다.



Comment +0

A microprocessor incorporates most or all of the functions of a computer's central processing unit (CPU) on a single integrated circuit (IC, or microchip). The first microprocessors emerged in the early 1970s and were used for electronic calculators, using binary-coded decimal (BCD) arithmetic in 4-bit words. Other embedded uses of 4-bit and 8-bit microprocessors, such as terminals, printers, various kinds of automation etc., followed soon after. Affordable 8-bit microprocessors with 16-bit addressing also led to the first general-purpose microcomputers from the mid-1970s on.

During the 1960s, computer processors were often constructed out of small and medium-scale ICs containing from tens to a few hundred transistors. The integration of a whole CPU onto a single chip greatly reduced the cost of processing power. From these humble beginnings, continued increases in microprocessor capacity have rendered other forms of computers almost completely obsolete (see history of computing hardware), with one or more microprocessors used in everything from the smallest embedded systems and handheld devices to the largest mainframes and supercomputers.

Since the early 1970s, the increase in capacity of microprocessors has been a consequence of Moore's Law, which suggests that the number of transistors that can be fitted onto a chip doubles every two years. Although originally calculated as a doubling every year, Moore later refined the period to two years.

In the late 1990s, and in the high-performance microprocessor segment, heat generation (TDP), due to switching losses, static current leakage, and other factors, emerged as a leading developmental constraint.

[전문링크] http://en.wikipedia.org/wiki/Microprocessor

설명을 보면 8비트부터 64비트까지 마이크로프로세서가 소개된다. 실제로 32비트 이상의 프로세서를 마이크로프로세서로 분류하기에는 지나치게 고성능이기도 하다. 보통 16비트까지를 마이크로프로세서로 본다. 그 이상의 이름으로 직접 부르곤 한다.



Comment +0

인터넷에서 공개된 있어서 기본 소스가 Visual Basic 으로 되어 있는 것을 사용해서 간단한 Led On/Off & Shifter 프로그램을 만들어 보았다. 내용은 간단하지만 기본적으로 USB 를 사용해서 외부장치를 이용할 수 있게 되었다는 것이 중요하다. 이제 기존의 패리얼포트(예전 구형 프린터 사용 포트)가 없는 노트북에서도 외부에 어떤 장비를 달고 그것을 USB 를 이용해 제어하고, 센서 입력을 받거나 모터 출력을 보낼 수 있게 되었다.

FT245 는 이런 점에서 쉽고 간단한 칩이다. 이것에 MCU를 포함한 새로운 칩들이 출시되었고, 조만간 그런 칩들이 더욱 활개를 칠(?) 것으로 예상된다. 실제로 가격이 있고 없고 별 차이가 없으니 보다 많은 IO 를 가진 칩을 선호할 것이라는 것은 당연한 예상이다.

어쨌거나 간단한 FT245 의 사용법을 익히는 것은 나중에 어떤 식으로 변형되더라도 별 무리없이 사용할 수 있게 될 것이다.

Visual Studio 6.0 에서 작업하였으며 기본 소스는 nexp에서 가져왔다.
[VIA:nexp]

USB 를 사용하기 위한 기본적인 순서는 다음과 같다.

1. 장치를 연다, 초기화 한다.

2. 모드를 설정한다. BitBang, BaudRate

3. 데이타를 쓴다.

4. 장치를 닫는다.



열고 닫는 것은 FT_Open 과 FT_Close 를 사용한다.
모드 설정에는 SetBitMode, 보레이트 설정에는 SetBaudRate, 데이타 쓰기는 WriteByte 를 쓴다. 모두 앞에 FT_ 가 붙어있다.

사용자 삽입 이미지


이렇게 만들어진 프로그램의 모습이다. Init Device 를 클릭하면,

Private Sub Command1_Click()
    If FT_Open(DEVICE_NO, m_DeviceHandle) <> FT_OK Then
        Label1.Caption = "장치 열기 실패"
        Exit Sub
    Else
        Label1.Caption = "장치 열기 성공"
    End If

    If FT_SetBitMode(m_DeviceHandle, &HFF, &H1) <> FT_OK Then
        Label1.Caption = "모드설정 실패"
        Exit Sub
    End If

    FT_SetBaudRate m_DeviceHandle, 57600
End Sub

위와 같이 초기화를 진행한다.

초기화가 성공하면,

사용자 삽입 이미지

장치 열기 성공이라는 메시지가 보여진다.

이제 LED 를 켜고, 끄고, Shift 시킬 수 있다.

Private Sub Command2_Click()
    Dim ret As Long
    'LED Light On
    ret = FT_WriteByte(m_DeviceHandle, &HFF, 1, 0)
End Sub

LED ON

Private Sub Command3_Click()
    Dim ret As Long
    'LED Light Off (0x00)
    ret = FT_WriteByte(m_DeviceHandle, &H0, 1, 0)
End Sub

LED OFF

Private Sub Command4_Click()
    Timer1.Interval = 100
    Timer1.Enabled = True
  
End Sub

LED SHIFT ON

Private Sub Command7_Click()
    Timer1.Enabled = False   
End Sub

LED SHIFT OFF

Private Sub Command6_Click()
    If FT_Close(m_DeviceHandle) <> FT_OK Then
        Label1.Caption = "장치닫기 실패"
        Exit Sub        
    Else
        Label1.Caption = "장치닫기 성공"        
    End If
End Sub

CLOSE DEVICE

Private Sub Command5_Click()
    Dim ret As Long
    Dim data As Byte

    If FT_SetBitMode(m_DeviceHandle, &H0, &H1) <> FT_OK Then
        Label1.Caption = "모드설정 실패"
        Exit Sub
    End If
   
    ret = FT_GetBitMode(m_DeviceHandle, data)    
    Label2.Caption = data    
    ret = FT_SetBitMode(m_DeviceHandle, &HFF, &H1)
End Sub

READ DATA


이런 과정을 거쳐 LED 를 켜고, 끄고, 순차적으로 점멸하도록 만들어보았다. 사실 Visual Basic 은 써보지 않았던 툴이라 익숙하지 않다. 그나마 소스가 이것으로 되어 있기에 이것을 억지로 끼워맞춰가며 프로그램을 해보았다. 다행히 별 문제없이 작동한다. 어떻게 돌아가는지 알았으니 이제 다음엔 Visual C++ 로 작업을 해볼까 한다.




Visual Basic 으로 작성한 FT245 LED 점멸 프로그램이다. 소스는 공개되어 있는 것을 조금 수정했을 뿐이니 공부하기 어렵지 않을 것이다.

[LINK FROM : USB 장치사용 실험시작 – FT245 ]
[LINK THIS : FT245BM 을 사용해 만든 간단한 USB through Led On/Off Program ]
[LINK TO.. :  ]
[LINK ALL. :
USB 를 이용한 제어 실험 - 첫번째, 자료모음 ]
[LINK URL. : http://electoy.tistory.com/134 ]
[MEMO .... : JelicleLim(2008.10.27.)]

Comment +2

USB Convert / Port 장치 PC 연결시 바로 하드웨어 인식이 자동으로 이루어짐

PC 사양 : XP sp3 상태

       

현재 매뉴얼에 있는 대로가 아닌 XP sp3 의 영향으로 USB 연결 후 바로 USB Serial Converter 가 설치되었다. 이것이 제대로 작동하는지 여부를 먼저 살펴보아야 한다.


검사를 위해 브레드보드를 이용, 8개의 데이타라인에 LED를 연결하고 프로그램을 실행시켜 보았다. 대부분의 FT245 를 쓰는 회로는 거의 동일하다. 심지어 외부확장핀까지도 동일하다. 우선 제품을 구입한 회사의 프로그램을 실행시켜보았다. [LINK:M2CV]

인간적으로 너무 심하다. 관련자료도 하나 없이 달랑 보드하나 보내주고는 끝이다. 회사 자료실에도 일반적으로 구할 수 있는 정도의 자료가 전부다. 정작 PC 에서 어떻게 USB 포트를 제어할 수 있는지에 대해서는 전혀 자료가 없다. 물론 FT245 보드가 더 거기서 거기니 직접 FT245 관련 자료를 찾으면 다 알수는 있다. 그럴거면 뭐하려 이 보드를 사나, ...


STEP 1 : Driver 설치

우선 드라이버를 설치해야 한다. 물론 맨 처음 언급한 것처럼 USB로 연결하기만 하면 알아서 USB Serial Converter 라는 것이 설치된다. 별도로 하드웨어 드라이버를 설치하지 않아도 XP sp3 의 경우 별 문제 없이 작동하는 듯 하다.


STEP 2 : 시험용 프로그램

FT245BM_BitBang.exe 프로그램을 실행시켜 보았다. USB 가 연결된 상태에서 다른 외형적 변화는 없지만 연결이 된다는 메시지를 보는 것으로 충분하다. 아마도 별 문제없이 연결은 되는 듯 하다. 이제 다음 단계다. LED 를 붙여서 정말 제대로 되는지를 눈으로 확인해 보는 단계다.


STEP 3 : 보드구성

브레드보드에 LED 와 저항을 연결, 출력신호를 LED 로 확인할 수 있게 한다.

사용자 삽입 이미지


[LINK FROM : USB 를 이용한 제어 실험 - 첫번째, 자료모음]
[LINK TO : FT245BM 을 사용해 만든 간단한 USB through Led On/Off Program]
[LINK ALL : USB 를 이용한 제어 실험 - 첫번째, 자료모음]

USB 장치사용 실험시작 – FT245
http://electoy.tistory.com/133
JelicleLim(2008.10.27)

Comment +0

잉크 프린터의 경우 프린트를 일정기간 하지 않으면 잉크의 노즐이 막히게 된다.
무한 리필잉크제품을 사용하다보니 잉크 가격은 그다지 무리가 되지 않지만 정작 프린트하는 양이 뜨문뜨문되다보니 노즐 청소하는데 사용되는 잉크의 양이 오히려 더 많아졌다. 한번 노즐 청소하는데 사용되는 잉크의 양이 정작 두주 정도 사용하는 정도의 잉크가 소요되는 듯 하다. 그리고 한번 노즐이 막히면 예전처럼 깨끗하게 잘 나오지도 않는 것 같기도 하고 말이다...

그래서 매일, 심지어 컴퓨터를 사용하지 않더라도 한장씩 프린트하는 방법을 생각해 보았다.

시작 >> 모든프로그램 >> 보조프로그램 >> 시스템도구 >> 예약된작업


이렇게 들어가면 내가 원하는 시간에 어떤 프로그램을 실행시킬 수 있다. 여기서 매일 정해진 시간에 어떤 프로그램을 실행하도록 하면 된다. 문제는 내가 원하는 어떤 파일을 프린트시키는 것인데 필자의 경우 HWP 로 만들어 둔 한장짜리 문서(여러개의 박스로 되어 있고 각각의 박스는 여러가지 색깔로 되어 있는 모든 잉크를 조금씩 사용하게 되어 있다)를 프린트하게 하려고 한다. 이것은 보통 한글을 실행시키고 거기서 문서를 불러들인 다음 프린트명령을 주게 되어 있다. 하지만 조금만 신경을 쓰면 HNC 폴더에 HwpPrnMng.exe 라는 파일을 볼수 있다. 이 파일이 프린트와 관계된 파일이다.

프롬프트 상에서
 
HwpPrnMng.exe /p PRTTEST.hwp


라고 치면 이미 만들어 둔 PRTTEST.hwp 라는 파일을 바로 프린트한다.

이것을 정리해서 D 드라이브에 TEMP 라는 폴더를 만들고 거기에 PRTTEST.hwp 를 만들어서 저장해둔다.
그 다음 일반 텍스트 문서를 만들고 그 문서의 내용으로

C:\HNC\Hwp70\HwpPrnMng.exe /p PRTTEST.hwp


위와 같이 한줄의 명령행을 쳐 넣어 둔다. 여기서 HwpPrnMng.exe 앞의 부분은 한글이 설치된 곳이다.
이제 이 텍스트 문서의 이름을 PRTHWP.bat (확장자까지 txt 대신 bat 로 해야 함!)하고 이 배치파일(bat)을 실행시키기만 하면 묻지도 않고 알아서 PRTTEST.hwp 를 바로 프린트하게 된다.

[정리]
Step 1. D 드라이브에 TEMP 폴더를 만들고 거기에 PRTTEST.hwp 파일을 만들어 저장해 둔다.
Step 2. D:\TEMP 에 PRTHWP.bat 을 만들고 내용을 다음과 같이 편집해 둔다.


C:\HNC\Hwp70\HwpPrnMng.exe /p PRTTEST.hwp


Step 3. 예약작업을 등록한다. 이때 매일 정해진 시간에 PRTHWP.bat  가 실행되도록 하면 된다. 주의할 것은 작업야약 마법사에서 보이는 아이콘을 클릭하는 것이 아니라 [찾아보기(R)] 을 클릭하여 D:\TEMP 에 있는 PRTHWP.bat 를 클릭해야 한다.

시작 >> 모든프로그램 >> 보조프로그램 >> 시스템도구 >> 예약된작업 - 예약 작업 추가

[찾아보기(R)] - PRTHWP.bat - 매일 ...


P.S. 굳이 매일 프린트의 필요가 없는 경우 이 내용을 따를 필요는 없다. 하지만 매일 혹은 매주 반복되는 귀찮은 일을 컴퓨터에 맡길 때, 특히 단순한 작업인 경우 아직도 BAT 파일을 이용하는 것은 매우 편리한 방법이다. !!
이 방법으로 이제 내 프린터에서 노즐 청소를 할일은 없어질 것을 기대해 본다. ^^




Comment +0

PC를 사용하다보면 내가 사용하고 있는 CPU나 메모리, 메인보드 등의 정보를 나중에 다시 기억하기 어렵기도 하다. 간단한 것은 제어판에서 하드웨어 정보를 보면 되지만 그보다는 조금 더 자세한 내용을 원할때 주로 사용할 수 있는 유틸리티로 CPU-Z 가 있다.

사용자 삽입 이미지

CPU 의 속도가 어떤지, 정확한 Specification 을 알려준다. 이것만 있으면 혹시나 메인보드를 다시 바꾸거나 혹은 업그레이가 필요한지의 여부를 굳이 케이스를 뜯지 않고도 알수 있다. 보드의 사양이나 현재 메모리 상태, 혹시 1G 지만 두개의 메모리를 사용하는지 하나의 메모리를 사용하는지 등도 알수 있다.

그리고 그곳에서 나온 또 하나의 유틸이 있다.

사용자 삽입 이미지

이 프로그램은 CPU의 온도를 알기 위해서 검색하던 중 발견했다. CPU의 온도와 하드 디스크의 온도등을 모니터링 해준다. 얼마나 PC가 혹사당하고 있는지를 알수 있게 해주는 프로그램이기도 하다.
두 프로그램모두 설치할 필요없이 압축을 풀고 거기 있는 실행파일을 실행시키기만 하면 되는 프로그램이다. 설치하고 삭제할 염려 없고, 애매하게 레지스트리등을 건드리지도 않으니 컴퓨터에 이상한 코드가 쌓여서 점점 느려지는 것을 두려워하는 사람들을 위해서는 딱인 유틸리티기도 하다.
국내 여러 자료실에서는 아직 CPU-Z 의 버젼이 1.442 지만 실제 홈페이지에서 공개된 것은 1.46까지 나와있다. HWMonitor 은 버젼 1.10 으로 최근에 나온 유틸리티다. 모두 한 곳에서 다운받을 수 있다.

[DOWN:CPUID]

직접 다운 받기 원한다면 다음 링크를 클릭하면 된다.

1. CPU-Z 1.46 Down
2. HWMonitor 1.10 32 Bit Down
3. HWMonitor 1.10 64 Bit Down

PC의 온도 모니터링과 PC에 설치된 내용물을 모니터하는 방법
http://electoy.tistory.com/113
JelicleLim(2008.7.22)

Comment +1



사용자 삽입 이미지

처음 실행시키면 나오는 화면이다. 블로그에 맞게 캡춰하기 위해 창의 크기를 작게 잡았다.

사용자 삽입 이미지

새로 프로젝트를 하나 만든다.

사용자 삽입 이미지

프로젝트는 Win32 콘솔 응용 프로그램이다. 예전 도스창에서 직접 명령어를 치는 식의 프로그램을 짜는 것이다. 아래쪽에 프로젝트 이름을 넣는다. 편의상 TEST03 이라고 했다.

사용자 삽입 이미지

Win32 프로그램 응용 마법사가 나온다. 왼편에 [개요] 와 [응용 프로그램 설정] 을 클릭할 수 있다.

사용자 삽입 이미지

거의 바뀔부분은 없다. 이미 win32 콘솔 응용 프로그램으로 선택했을 때와 동일하다. 필요에 의해 설정은 바꿀수 있다. [마침]을 누르면 본격적으로 프로그램 코드를 넣는 창이 뜬다.

사용자 삽입 이미지

보통 공개 컴파일러의 경우 IDE 가 지원되지 않는 경우가 많다. 그래서 텍스트 에디터를 별도로 사용하곤 했었는데 Visual C++ Express Edition 에서는 비싼 상용만큼은 아니지만 그래도 일반적으로 사용이 가능한 IDE 환경을 제공해 준다. (IDE : Integrated Development Environment, 통합개발환경)

사용자 삽입 이미지

두 줄의 코드만 삽입했다. 하나는 stdio.h 전처리기를 넣는 행이고, 다른 하나는 printf 문이다. C++ 문법과는 어울리지 않지만 이 프로그램으로 앞으로 할 일은 C 를 배우는 것이기 때문에 printf 문을 사용해서 Hello World 를 출력해보도록 했다.

사용자 삽입 이미지

기본적으로 [빌드] 메뉴에서 빌드를 해주면 된다.

사용자 삽입 이미지

[빌드] 결과가 아래 창에 나온다. [출력] 탭을 보면 성공했다는 메시지가 나온다.

사용자 삽입 이미지

직접 실행파일이 있는 곳을 찾아가도 되고, 아니면 [Ctrl+F5], 즉 [디버그] 메뉴의 [디버깅하지 않고 시작] 항목을 클릭해도 된다. 앞에서 빌드를 하지 않았다면 여기서 빌드되지 않았다는 메시지와 함께 빌드를 할 것인지를 묻는다. 여기서 빌드와 실행을 한꺼번에 해도 된다. 즉, 코드가 완성되었으면 [Ctrl+S] 로 저장하고, [Ctrl+F5]로 빌드와 실행을 한꺼번에 하면 된다.
[Ctrl+S] 와 [Ctrl+F5] 정도는 필수적으로 외워둘만한 단축키다. 그리고 반드시 빌드전에 저장을 하는 습관을 갖도록 하자, 가끔 빌드와 실행을 한꺼번에 하다가 PC가 다운되거나 하는 경우를 만난다. 물론 코드가 잘못된 것이다. 그때 저장해두지 않은 상태라면 한참을 넋을 잃고 허탈한 심정을 달래야 할수도 있다. ^^

사용자 삽입 이미지

Hello World 의 실행화면이다. 이제 이것으로 기본적인 C 언어의 공부를 시작하면 된다.
물론 Visual C++ Express Edition 의 기능은 여기 소개한 것보다 훨씬 풍부하다. 더 공부하면 더 많이 알게 될 것이다.

단, MFC 는 Express Edition 에 포함되어 있지 않다. 더 깊은 공부를 원한다면 Visual Studio 나 .NET 을 구해서 사용하면 된다. 참고로 회사등에서 업무용으로 쓰기 위해서는 등록을 하고 정식 구매를 해야 하겠지만 학교등에서는 교육용으로 사용가능한 것으로 교내에서 사용하는 PC에 설치해서 사용 가능하도록 지원해주는 경우가 있다. 이런 경우들을 잘 찾아보면 얼마든지 프로그램을 구해서 사용해 볼수 있을 것이고, 그리고 그 정도까지는 아니더라도 간단한 C언어에 대한 공부는 Express Edition 으로 얼마든지 가능하다.


Visual C++ Express Edition 으로 Hello World 화면에 출력하기
http://electoy.tistory.com/106
JelicleLim(2008.7.18)

Comment +0

사용자 삽입 이미지

차근 차근 순서대로 설치하면 된다. 다운받은 파일을 더블클릭하면 Visual C++ 2008 Express Edition 이 설치된다. 윈도우 에러 메시지 날때마다 뭘 보내겠냐는 질문이 지겨워서 이제는 아예  보내지 않기로 하고 맘 편하게 지낸다. ^^

사용자 삽입 이미지

동의 하고 [다음(N)>]을 누르면 프로그램이 설치된다.
 
사용자 삽입 이미지

필요한 것이 있으면 선택하면 된다. 굳이 필요한 것이 없어서 아무것도 선택하지 않았다. 아무것도 선택하지 않아도 무방하다.

사용자 삽입 이미지

폴더를 정해준다. 폴더는 특별한 경우가 아니면 그냥 초기치 그대로 두는 것이 맘 편하다. 혹시나 모를 버그에 대해서도 초기치에 대해서만큼은 이상이 발생하지 않도록 조처가 된 상태이니, 웬만한 프로그램 설치시 초기 폴더 변경은 그다지 좋은 선택은 아니라는 것이 개인적인 의견이다. 그대로 두고 설치를 선택한다.

사용자 삽입 이미지

프로그램은 설치를 시작하면서 인터넷으로 필요한 파일을 가져온다. 대략 아무것도 선택하지 않은 상태에서 99MB 였으니, 위에서 다른 옵션을 선택했다면 조금 더 시간이 걸릴 것이다. 한국은 인터넷 환경이 좋아서 이정도 파일 다운에는 그다지 많은 시간이 걸리지 않는다.

사용자 삽입 이미지

설치 완료 메시지 아래쪽에 등록혜택을 클릭하며 30일 이내에 등록해야만 계속해서 프로그램을 사용할 수 있다는 문구가 나온다. 거기서 등록이 가능하고, 물론 등록은 무료로 진행된다. 간단한 이름과 메일 주소, 하는 일등을 입력하면 등록된 메일 주소로 등록키가 전송된다. 그것을 복사해서 Expression Edition 의 도움말 항목에서 제품등록을 하면 된다.

사용자 삽입 이미지

처음 실행한 화면이다. 캡처관계상 창의 작게 만들었다.

사용자 삽입 이미지

도움말에서 제품등록 항목을 선택하면 나오는 창이다. 여기에 메일로 전송받은 등록번호를 넣으면 된다.

사용자 삽입 이미지

이런 식으로 등록번호를 넣으면 된다. 무료고 공개된 프로그램이나 등록키가 별 의미가 없으리라 생각되지만 그래도 화면에 캡춰된 등록키는 무작위로 집어넣은 것이다. 이것으로는 등록이 되지 않을 것이다.

사용자 삽입 이미지

등록이 끝났다는 메시지가 뜨고 이제 Visual C++ Express Edition 은 정식등록이 되어 사용이 가능하다. Visual Studio 처럼 MFC 를 사용하지는 못하지만 win32 콘솔프로그램과 win32 응용프로그램 컴파일이 가능하다.


Visual C++ Express Edition 설치하기
http://electoy.tistory.com/105
JelicleLim(2008.7.18)

Comment +0

MS에서 Visual C++ 2008 Express Edition 을 공개했다.
학교에서 C언어를 종종 가르치는데 마땅한 컴파일러가 없어서 조금 고민을 했다.
이번 학기에도 C언어를 가르치기로 되어 있다. Visual Studio 에 포함된 C++ 이야 학교에서 정식으로 계약한 것이라 별 문제가 없기는 하지만 종종 학생들이 집에서도 공부할 수 있는 방법을 알려달라고 한다. 그냥 한카피해줘도 별 문제는 없겠지만(개인적으로 사용하는 프로그램 툴에 대해서 벌금을 물릴 회사는 없을게다. 차라리 권장을 했으면 몰라도), 그래도 공개적으로 해적판 소프트웨어를 부추기는 형세는 곤란하다 싶어 GCC 나 볼랜드 계열의 컴파일러를 찾았다. 그런데 이게 웬일인가!

MS에서 Express Edition 이라고 무료로 공개하는 버젼의 컴파일러가 있다. 사실 C언어 자체는 IDE 나 기타 윈도우 프로그램, MFC 등이 필요하지는 않다. 덕분에 이것으로 학생들에게 알려주고 숙제도 맘편하게 낼수 있게 되었다. ^^

http://www.microsoft.com/express/

위 링크로 들어가면 다운받을 수 있는 Express Edition 의 목록이 나온다. 그중 C++ 도 물론 있다.

사용자 삽입 이미지

파일은 영어로도 받을 수 있고, 한글버젼도 받을 수 있다. 편한대로 받으면 된다.


Visual C++ Express Edition 무료 다운 받기
http://electoy.tistory.com/104
JelicleLim(2008.7.18)


Comment +1

ASCIImathML.js 을 사용 tistory에서 수식을 사용 하는 방법이다.

1. ASCIImathML.js 파일을 다운 받는다. [LINK]

2. 다운받은 파일을 홈페이지나 블로그에 올린다. 티스토리의 경우 [admin]으로 들어가서 [스킨]->[직접올리기] 를 통해 파일을 올리면 된다. 그 경우 image/ 라는 폴더에 ASCIImathML.js 가 올라간다.

3. 스킨에서 html/css 를 직접 코드로 수정한다. skin.html 을 수정할 때 <body> 윗부분에 있는 <head> </head> 사이에 다음의 코드를 삽입한다.

<script type="text/javascript" src=" ./images/ASCIIMathML.js"></script>

이때 src="파일의 경로" 에서 ./images/ASCIIMathML.js 이 부분이 ASCIImathML.js 파일의 경로를 포함한 전체 이름이 된다.

4. 사용시 앞과 뒤에 amath endamath 를 넣으면 된다.
즉,
amath y = 1/2a x^2 + 1/3  endamath 
위 수식은 이렇게 보여진다.
amath y = 1/2a x^2 + 1/3 endamath
더 자세한 수식표현법은 다음 사이트의 주소를 참고해서 보면 된다.



http://www1.chapman.edu/~jipsen/mathml/asciimath.html
http://www1.chapman.edu/~jipsen/mathml/asciimathsyntax.html


홈페이지에서 수식사용하는 법
http://electoy.tistory.com/99
JelicleLim(2008.7.11)

Comment +0

Silabs ToolStick 관련 자료 모음

ToolStick Led Blink 프로그램
ToolStick 회로도 & PDF
Silabs의 ToolStick 1 Paper Manual
Silabs ToolStick IDE 와 SDCC 연결하기
Silabs ToolStick 사용 기초
Silicon Laboratories 에서 나온 8051 데모 키트 사용 후기
SDCC 현재 나온 최신버젼


Comment +0

ToolStick Led Blink 프로그램은 다음과 같다.
프로그램코드는 제공되는 CD안에 들어있으며, 역시 인터넷으로 Silabs 홈페이지에서 검색하여 사용이 가능하다.
컴파일은 Keil C51을 사용하였다.

--- 프로그램코드 ---

more..


컴파일과 링크 후 작동되는 모습의 동영상을 함께 올려본다.





ToolStick Led Blink 프로그램
http://electoy.tistory.com/92
JelicleLim(2008.7.1)

Comment +0

사용자 삽입 이미지


Part 1 : C8051F321 - USB 를 통한 PC와 연결 및 디버깅 담당
회로도는 두 부분으로 나눠져 있다. 간단히 USB 를 통해 PC와 연결되는 부분이 있다. 이 부분에 사용되는 칩이 C8051F321 이라는 칩이다. 역시 8051 칩인데 이건 PC와의 USB 통신을 통해 프로그램을 올리거나 디버깅용으로 사용된다.

Part 2 : C8051F300 - 직접 제어하는 8051 코어
또 다른 부분이 직접 사용하는 부분이다. C8051F300 칩이 사용된다. 회로도를 보면 알겠지만, F300 보다는 차라리 F321 을 위한 회로였으면 하는 마음이 든다. 그래도 이건 StoolStick 의 Evaluation 버젼이고 간단한 테스트로 LED 를 깜박이는 것을 주로 하는 것이니 더 이상의 주문을 바라는 것은 무리다. 원한다면 Evaluation 버젼이 아닌 ToolStick 을 구입해야 한다. 그것 역시도 구입이 가능하고 다른 종류의 칩을 사용할 수 있도록 이것과는 조금 다른 모습으로 만들어져 있다. 그건 다음번에 설명해본다.

그런데 이 회로를 보고 느끼는 건데, 생각보다 아주 단순하게 USB와의 통신을 가능하게 하고 있다. 별도의 이렇다할 코일 하나 없이 그냥 다이렉트로 4개의 선을 잇는 것으로 끝내버린다. 아마도 USB포트에 직접 꼽는 다는 것때문에 노이즈에 대한 외부 회로를 생략한 것 같기도 하다. 어쨌거나 이 칩 C8051F321 을 잘 사용하면 USB 사용이 무척 간단해 질것 같다.

사용자 삽입 이미지PC 의 USB 를 통한 연결을 담당하는 부분 회로

사용자 삽입 이미지C8051F300 이라는 작은 칩


Comment +0



사용자 삽입 이미지


사용자 삽입 이미지



실제로 ToolStick 은 이보다는 조금 더 복잡하다. 하지만 이정도로 작은 크기다.
데모버젼의 ToolStick 은 작은 한장의 종이로 된 메뉴얼이 있다. Quick Start Tools Demo 라고 이름 붙여진 이 1-Paper Quick Start Guide 혹은 1-Paper Manual 은 간단하게 CD를 통해 프로그램을 설치하는 것부터 기본적 프로그램 디버깅까지 과정을 나타내고 있다.


Silabs의 ToolStick 1 Paper Manual
http://electoy.tistory.com/87
JelicleLim(2008.6.25)

Comment +0