페이지

글목록

2017년 2월 12일 일요일

[전원 분리제어] #7. 전원 분리 후 전류 싱크 입력(수위 센싱)

이번에 테스트 한 접촉식 수위 센서를 구현해 봤습니다.

물을 감지하면 LED가 켜지는 구조이고 감지가 잘 됩니다. 첨 해 본 건데, 나중에 문제 생기면 후기 올리겠습니다.
요새는 비접촉식 수위 측정 센서들이 조금씩 나오는 듯 한데, 자신 없으면 접촉식.. 
아직 확실한 비접촉식 센서는 없는듯 보입니다.



[전원 분리제어] #6. 전원 분리 후 전류 싱크 입력 기본 회로 및 접점 입력

전원 분리된 24V DC 쪽 접점 입력 회로입니다.

요새는 소자들이 좋아져서 옛날 회로 처럼 복잡하게 구성하지 않아도 되는 것 같습니다.
전 옛날 회로 이해도 못해서 그냥 최신 소자랑 레퍼런스 회로 참고해서 구현했습니다.

지금까지 모두 동작 잘되는 것은 확인했습니다. ^^



[전원 분리제어] #5. 전원 분리 후 전류 소싱 출력(대전력 AC ON/OFF 제어)

대전력 아마 이 트라이악 소자가 30A 까지 가능 한가 그럴겁니다. 
하지만 제가 감이 안와서 방열판을 얼마나 크게 해야 할지, 회로 패턴 굵기는 얼마로 할지  몰라서 10A 미만 정도로 예상합니다.

원래는 5KW 전열기를 직접 제어 하려고 했는데 자신이 없어서.. ^^


[전원 분리제어] #4. 전원 분리 후 전류 소싱 출력(소전력 AC)

이 회로는 소전력 AC 로드(솔밸브,마그네틱 스위치,릴레이)에 사용 가능 합니다.

ISOLATE FET 드라이브만한데, 최대 900mA 까지 출력이 되서 쓰임새가 많을 것 같습니다. ^^


[전원 분리제어] #3. 전원 분리 후 전류 소싱 출력(24V 모터 제어)

얼마 전에 올린 회로인데 다시 전력제어 시리즈니까 ^^ 

아, 참.. 이 회로는 아직 테스트 안해봤으니 해 보고 후기를 올리겠습니다.


[전원 분리제어] #2. 전원 분리 후 전류 소싱 출력 (DC 출력)

이전에 올린 글의 기본 회로에 붙여서 사용하면 DC 출력이 되는 회로입니다.

부저,릴레이,기타 등등으로 소량의 전류를 사용하는 부하에 사용 가능합니다.
앞단의 TR의 스펙을 올리면 좀 더 큰 전력 제어도 가능합니다.


[전원 분리제어] #1. 전원 분리 후 전류 소싱 출력 기본회로

안녕하세요, 저는 전원 분리를 노이즈가 있거나 환경이 열악한 상황에서 중요한 콘트롤 장치를 보호 하려고 사용했습니다.

외부 전력제어 소자들에 의해서 , 특히 모터가 있고 온도 센싱도 열전대를 사용하는 바람에 20비트 ADC 를 써야하니 
노이즈가 커지면 치명적일겁니다.
그렇게 ADC를 해도 노이즈가 많아 디지탈 필터를 프로그램으로 해 넣어야 안정적으로 데이터를 뽑아 낼 수 있었습니다.

제가 우선 전력전자 전공은 아니라서, 여차저차 구글링해서 디지키에서 최근 나온 소자로 회로를 설계해서 
테스트를 해 보고 올려 봅니다.

MCU 전원은 24V 에서 DCDC-CONVERTER 로 5V (400mV)를 만들어서 썼고,
이렇게 분리된 전원으로 24V 쪽에 붙어 있는 DC-Motor,부저,릴레이를 출력으로 제어 했습니다.
입력으로 분리된 24V 로 물에 전기를 통하게 하여 접촉식 수위 센서를 구현했고, 접점입력 들을 구현했습니다.
그리고 제가 좀 약한 대전력 제어인데, 게다가 AC220V 제어입니다.
솔벨브나 마그네틱 스위치는 용량이 얼마 안되서 AC220V,900mA 를 출력할 수 있는 트라이악이 단일 소자로 나와서 간단했습니다.
여기서 5KW 전열기를 제어하는 소자는 자신이 없어서 마그네틱 스위치로 제어했습니다.
그리고 조금 대전력으로 볼 수 있는 1KW 급 약간 못 되는 AC모터는 대용량 트라이악으로 제어를 했습니다.

이 (출력)제어 대상의 기본이 되는 것이 전원 분리 후, 전류를 소싱하는 회로입니다.
(한번에 다 쓰 면 가독성과 찾기가 불편에서 글이 짧아도 이해 바랍니다.)

기본 회로는 다음과 같습니다. 이 출력에 붙이는 회로에 따라 여러가지가 나옵니다.


[ESP8266] SD-Card(SPI-mode) 핀/스피드 설정

아두이노 IDE 툴의 스케치 프로그램에서 SD-Card 설정은 다음의 함수로 설정 가능하다.

1
2
3
4
5
6
7
8
9
10
11
12
boolean SDClass::begin(uint8_t csPin, uint32_t speed) {
  /*
    Performs the initialisation required by the sdfatlib library.
    Return true if initialization succeeds, false otherwise.
   */
  return card.init(speed, csPin) &&
         volume.init(card) &&
         root.openRoot(volume);
}
cs
이전에 Ftp 서버 스케치 프로그램의 void setup(void) 함수 내에서, 다음과 같이 사용했다.
1
2
3
4
  if (SD.begin(4)) {
      Serial.println("SD opened!");
      ftpSrv.begin("esp8266","esp8266");    //username, password for ftp.  set ports in ESP8266FtpServer.h  (default 21, 50009 for PASV)
  }    
cs

즉 MISO,MOSI,SCLK 는 HSPI 포트들을 사용하므로 고정되어 있으므로, CS 핀만 따로 지정해 주면 된다.
현재 위의 소스코드에서 Clock Speed는 사용하지 않았는데, 파라메터를 넣지 않으면 디폴트값이 들어간다.
하지만, 디폴트 값이 얼만지는 잘 모르겠다.
GPIO 4번핀을 CS핀으로 사용하고, Clock speed는 기본이다.

가령, SD.begin(4,40000000) 라고 하면 GPIO 4번핀을 CS핀으로 사용하고, Clock speed는 40MHz 이다.
최대 클럭 스피드는 시스템 클럭의 /2 이다.

[IC 소개] 싸고 간단한 DC Motor Driver IC 2 (DRV8871)

지난 번에 소개해 드린 모터 드라이버는 PCB 를 떠야 동작을 할 수 있어서,
시중에서 Brake 보드로 파는 더 간단한 모터 드라이브를 소개합니다.

DRV8871 은 전류 제한용 저항이 달려 있는데, 
지난번에 소개해 드린 MC34931 은 FB 신호를 보고 콘트롤러에서 직접 제어를 해야 합니다.

저한테는 모터 정역 ON/OFF 제어만을 하기 때문에, DRV8871 이 더 간단하고 좋네요.

최대 구동 전류는 차이가 있지만, DRV8871 이  가격도 더 저렴합니다. (디지키 가격)
1. MC34931(MAX 5A) : $1.944 @ 1K
2. DRV8871(MAX 3.6A) : $1.2125 @ 1K


핀수는 8핀으로 패키지는 SOIC-8P 입니다.



회로 구성은 다음과 같습니다.


쇼핑몰에서 파는 쪽보드인데, 원가의 5배 이상 받는 것 같습니다. ^^
파는 곳 링크입니다. (10,900 원 입니다.)


제가 회로를 잘 못 설계하는 바람에 이 보드를 사용하게 됐는데, 이 보드(IC)의 디지탈 신호 입력 전압은 MAX(7V) 이기 때문에,
현재 24V 로 되어 있는 입력을 저항으로 분주해서 약 4.2V로 낮췄습니다.



회로를 보드에 붙여 연결한 모습입니다.


[ESP8266] WiFi FTP Server with SD-Card[5] (속도 개선)

esp8266 FTP 서버의 전송 속도를 개선하는 방법을 여러가지 찾아보고 적용해 봤습니다.

전송 속도에 관련된 사항은 다음과 같습니다. 
1. WIFI FTP BUFFER 의 크기 : ESP8266FtpServer.h 파일에 FTP_BUF_SIZE 로 정의가 되어 있는데,
   크기가 기본으로 1024 // 512 로 설정되어 있는데 이 설정으로는 너무 느리다.
   512 로 9KB/s , 1024로 18KB/s 밖에 안나온다.
   하지만 이 크기를 1460 의 배수인 1460*2 로 바꾸면 460KB/s 의 속도가 나온다. 
   이 속도는 SD-Card에서 읽어서 PC로 전송하는 속도이고, SPI Single 방식의 SD-Card Write 시에는 약 86KB/s 가 나온다.
   즉, SD 카드를 읽는 데는 엄청 빠른데, 쓸 때는 SPI Single 에다가 Write 할 동안 기다려야 하므로 아주 느리다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <SPI.h>
#include <SD.h>
//#include <FS.h>
#include <WiFiClient.h>
#define FTP_SERVER_VERSION "FTP-2016-01-14"
#define FTP_CTRL_PORT    21       // Command port on wich server is listening  
#define FTP_DATA_PORT_PASV 50009  // Data port in passive mode
#define FTP_TIME_OUT  5      // Disconnect client after 5 minutes of inactivity
#define FTP_CMD_SIZE 255 + 8 // max size of a command
#define FTP_CWD_SIZE 255 + 8 // max size of a directory name
#define FTP_FIL_SIZE 255     // max size of a file name
//#define FTP_BUF_SIZE 1024 //512   // size of file buffer for read/write
#define FTP_BUF_SIZE 2*1460
cs

2. CPU Clock 속도 Up : 80MHz 에서 160MHz 로 올리면 조금 더 빨라진다. 
3. SPI CLK 속도 UP : 현재 24MHz 까지 올렸는데 50MHz 까지 올려 볼 예정이다.
  이 과정은 선 길이에 영향을 많이 받기 때문에, PCB가 나와봐야 알 수 있을 것이다.


버퍼 크기는 1460 배수가 아니면 속도 차가 읽기 모드에서 최대 51배나 차이가 납니다.
쓰실 때, 꼭 알아두세요. ^^

다음은 FTP 서버에서 PC로 전송시 속도를 동영상으로 찍어 봤습니다.


[ESP8266] WiFi FTP Server with SD-Card[4] (디렉토리 읽기 개선)

ESP8266 FTP 서버에서 파일을 전송을 하던지 PC에서 FTP 서버로 전송을 하면
ESP8266 의 디렉토리가 몇개씩 사라지는 현상이 있어서 원인을 한참 찾다가 고쳐졌습니다.

정확한 원인은 잘 모르겠고, SD Card 에서 디렉토리를 읽어서 보여줄 때,
함수를 1개(rewindDirectory) 더 추가해야 이 현상이 없어졌습니다.

어쩌면 SPIFFS 메모리에서는 이런 현상이 안나타날 지도 모르겠습니다.
제가 SPIFFS 메모리로 된 FTP 서버 프로그램을 SD 카드용으로 바꿔서 여러가지 오동작이 많이 발생하는 것 같습니다.

FTP 서버에서 디렉토리를 새로고치는 명령이 "MLSD" 이므로 
ESP8266FtpServer.ccp 의 processCommand 함수에서 "MLSD" 명령을 처리하는 부분을 수정하면 됩니다.
수정한 코드는 다음과 같습니다.
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
  //
  //  MLSD - Listing for Machine Processing (see RFC 3659)
  //
  else if! strcmp( command, "MLSD" ))
  {
    if! dataConnect())
      client.println( "425 No data connection MLSD");
    else
    {
      client.println( "150 Accepted data connection");
      uint16_t nm = 0;
 
      File dir=SD.open(cwdName);
      File entry;
 
      dir.rewindDirectory();
          
      char dtStr[ 15 ];
 
        while(1)
        {
            entry =  dir.openNextFile();
            if (!entry)
                break;
            String fn,fs;
            fn = entry.name();
            fs = String(entry.size());
              data.println( "Type=file;Size=" + fs + ";"+"modify=20000101160656;" +" " + fn);
              nm ++;
        }
        client.println( "226-options: -a -l");
        client.println( "226 " + String(nm) + " matches total");
      }
      data.stop();
      entry.close();
  }
cs

SD.open() 함수 다음에 rewindDirectory(); 함수를 사용하면 됩니다.

[ESP8266] 아두이노 자주 쓰는 함수 및 문법 링크

다음의 링크로 가면 아두이노 IDE 툴에서 사용하는 일반적인 함수와 문법에 관한 내용들이 있다.

사용한지 얼마 안되서, 좀 생소하군요,. ^^

[ESP8266] EEPROM Test (Arduino IDE)

ESP8266 에서 EEPROM 은 실제로는 없고 외부에 있는 SPIFF 플래쉬 메모리의 일부를 사용하는 것이다.

EEPROM 을 다루는 함수들은 Library 에 있는 EEPROM.cpp 에 정의되어 있다.
라이브러리 소스의 위치는 다음과 같다.
C:\Users\trion\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\libraries\EEPROM

함수들의 종류는 다음과 같다.
1. void EEPROMClass::begin(size_t size)
   : 예를 들어 아두이노 스케치 코드에서 begin.EEPROM(512); 라고 코딩을 하면, EEPROM 을 512바이트 할당하고,
     EEPROM 관련 항목들을 초기화한다.
2. uint8_t EEPROMClass::read(int address)
   : 위에서 예를 든 begin 함수와 같이 설명하자면, 어드레스 0~511 까지 512개의 바이트 데이터를 해당 주소에서 읽어 올 수 있다.
3. void EEPROMClass::write(int address, uint8_t value)
   : 해당 주소(address)에 값을 쓴다. 이 때, 실제로 EEPROM에 물리적으로 기록되는 것이 아니고,
     램으로 된 버퍼값을 바꾸는 것이다.
4. bool EEPROMClass::commit()
   : 실제로 물리적으로 EEPROM(외부 플래쉬 메모리)에 값을 기록해서 리셋이나 전원이 꺼져도 값을 유지할 수 있다.

다음은 아두이노 IDE 툴에서 EEPROM 을 테스트한 코드 입니다.
: NODE MCU V3.0 보드의 Flash 버튼을 누르면 EEPROM 의 0번 어드레스의 값의 0번 비트가 토글 되면서,
  값을 기록하고 소프트웨어 리셋을 이용하여 리셋을 한 후,
  EEPROM의 0번 어드레스의 값이 바뀌어 있는지 EEPROM을 읽어서 시리얼 포트에 출력해 본 테스트입니다.

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
#include <EEPROM.h>
 
const int buttonPin = 0;     // the number of the pushbutton pin
int buttonState = 0,buttonState_old=0;         // variable for reading the pushbutton status
byte value;
 
void setup() {
  // put your setup code here, to run once:
  delay(1000);
  Serial.begin(115200);
  EEPROM.begin(512);
  pinMode(buttonPin, INPUT);
  value = EEPROM.read(0);
  Serial.println("");
  Serial.print("EEPROM value = ");
  Serial.println(value,HEX);
 
  buttonState_old = buttonState = digitalRead(buttonPin);
}
 
void loop() {
  // put your main code here, to run repeatedly:
  buttonState_old = buttonState;
  buttonState = digitalRead(buttonPin);
  if (buttonState_old != buttonState)
  {
    if (buttonState == LOW) 
    {
      value = EEPROM.read(0);
      value ^= 1;
      EEPROM.write(0, value);
      EEPROM.commit(); 
      Serial.print("Button Pressed !, EEPROM value = ");
      Serial.println(value,HEX);
      Serial.println("ESP8266 Software Reset");
      ESP.reset();
    }
  }
 
}
cs


다음은 위의 ESP8266 아두이노 IDE 스케치 코드에의해 디버그용으로 시리얼에 표시한 내용 입니다.


[ESP8266] WiFi FTP Server with SD-Card[3] (Soft AP mode)

1. 오류 발생 : 파일을 전송하는데 처음에만 되고 그 이후로는 안되서 오류 분석 중. 추가로 파일 전송을 하고 난 후, 디렉토리가 없어짐.
2. 오류 원인 : 이름이 한글로된 파일이나 이름에 콤마가 2개 이상인 파일이 문제를 일으켜서 FTP 서버가 동작을 안하는 경우가 있었다.
3. 해결책 : 위의 종류의 파일을 취급하지 않거나, LFN(Long File Name)을 지원하거나 UNICODE(한글 지원)이 되도록 프로그램을 고쳐야 함. (디렉토리 해결책은 다음 글에 올려 놨음)


안녕하세요, 이번에는 Soft AP 를 이용한 8266 FTP Server를 만들어 봤습니다.

주변의 공유기에 붙여서 IP를 할당받아서 사용하는 방법이 아니라, 
8266 자체가 Ftp Server가 됩니다.

이것도 FTP Server가 공식적인 예제가 아니여서인지, 처음에는 Soft AP 는 잘 구현되어서 
SSID 와 Password를 치고 들어갔는데 Ftp Server 동작이 안됐었습니다.

많이 고생을 했는데, 알고 보니 SoftAPIP 주소가 아니라 localIP 주소에 의해 Ftp Server가 동작되도록 되어 있었습니다.
아직 Esp8266 과 네트웍 개념도 없고 c++ 문법도 잘 몰라서 SoftIP 주소에 의해 동작하도록 하는 방법으로 수정할 순 없겠고,
localIP 주소를 수정해서 동작하도록 만들었습니다.

예전의 SD 카드에 의해 동작하는 FTP 예제에서 아두이노 스케치 코드만 조금 고쳐주면 됩니다.

SoftAP 로 동작하는 데에는 독립적인 SSID 와 비밀번호가 필요하니 정의해 놓고,
1
2
3
const char* ssid = "FISI_Server";
const char* password = "0317358631";
 
cs

FTP 에서 사용할 IP 및 Gateway,subnetMask 주소를 정의했습니다.
1
2
3
4
5
// config static IP
IPAddress apIP(19216841);  
IPAddress gateway(19216841); // set gateway to match your network
IPAddress subnet(2552552550); // set subnet mask to match your network
 
cs

config 함수로 실제 local IP,Gateway,SubnetMask 주소를 세팅합니다.
그리고 아무 상관은 없지만 기분이 찝찝하니 SoftAP Ip,gateway,subnetmask 주소도 세팅해 주고,
WiFi.softAP 함수로 위에서 정의해 둔, SSID 와  비밀번호로 AP를 만듭니다.
1
2
3
4
5
6
7
8
9
10
  WiFi.config(apIP, gateway, subnet);
  Serial.println();
  Serial.print("Configuring access point...");
  /* You can remove the password parameter if you want the AP to be open. */
  WiFi.mode(WIFI_AP);
  WiFi.disconnect();
  delay(100);
  WiFi.softAPConfig(apIP, gateway, subnet);
  WiFi.softAP(ssid, password);
 
cs


위의 소스코드에서 쓸데없이 들어있는 것도 있을텐데, 또 할일들이 많아서 더 테스트는 못했습니다.

전체 아두이노 IDE의 스케치 파일의 소스 코드는 다음과 같습니다.
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266FtpServer.h>
 
const char* ssid = "FISI_Server";
const char* password = "0317358631";
 
// config static IP
IPAddress apIP(19216841);  
IPAddress gateway(19216841); // set gateway to match your network
IPAddress subnet(2552552550); // set subnet mask to match your network
 
 
ESP8266WebServer server(80);
FtpServer ftpSrv;   //set #define FTP_DEBUG in ESP8266FtpServer.h to see ftp verbose on serial
 
 
 
void handleRoot() {
  server.send(200"text/plain""hello from esp8266!");
 
}
 
void handleNotFound(){
  String message = "File Not Found\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET)?"GET":"POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  for (uint8_t i=0; i<server.args(); i++){
    message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
  }
  server.send(404"text/plain", message);
}
 
void setup(void){
  delay(1000);
  Serial.begin(115200);
 
  Serial.println("");
  Serial.println(WiFi.SSID());
  Serial.println(WiFi.psk());
  WiFi.config(apIP, gateway, subnet);
 
  Serial.println();
  Serial.print("Configuring access point...");
  /* You can remove the password parameter if you want the AP to be open. */
  WiFi.mode(WIFI_AP);
  WiFi.disconnect();
  delay(100);
  WiFi.softAPConfig(apIP, gateway, subnet);
  WiFi.softAP(ssid, password);
 
  IPAddress myIP = WiFi.softAPIP();
  Serial.print("AP IP address: ");
  Serial.println(myIP);
 
  Serial.println("");
  Serial.println("");
 
  WiFi.printDiag(Serial);
  
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(WiFi.SSID());
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  
  server.on("/", handleRoot);
  server.onNotFound(handleNotFound);
  server.begin();
  Serial.println("HTTP server started");
 
  /////FTP Setup, ensure SPIFFS is started before ftp;  /////////
  
  if (SD.begin(4)) {
      Serial.println("SD opened!");
      ftpSrv.begin("esp8266","esp8266");    //username, password for ftp.  set ports in ESP8266FtpServer.h  (default 21, 50009 for PASV)
  }    
      Serial.println("FTP server On!");
  /*
  if (SPIFFS.begin()) {
      Serial.println("SPIFFS opened!");
      ftpSrv.begin("esp8266","esp8266");    //username, password for ftp.  set ports in ESP8266FtpServer.h  (default 21, 50009 for PASV)
  }    */
}
 
void loop(void){
  ftpSrv.handleFTP();        //make sure in loop you call handleFTP()!!  
  server.handleClient();
 
}
cs

다 준비가 됐으니, Wifi 로 미리 설정해 둔 SSID 와 비번으로 Esp8266 에 접속합니다.



접속이 됐으면 이번에는 랜드폰 앱으로 FTP Client 앱을 받아서 설치합니다.
여러가지가 있는데 저는 터보 클라이언트라는 앱을 사용했습니다.


FTP 프로그램을 실행해서 설정을 다음과 같이 했습니다.


그리고 FTP 서버에 접속하니 SD 카드에 들어있는 내용이 나왔습니다. SOFT AP 도 완료. ~` ^^;