MAC Address 읽는 함수로 ESP-8266 IC 내부의 2가지 MAC Address 를 읽을 수 있습니다.

참고한 사이트 주소는 다음과 같습니다.

http://www.esp8266.com/viewtopic.php?f=29&t=3587



아직 네트웍 개념이 없어서 잘은 모르겠지만,
1개는 일반 맥 어드레스이고(MAC{STA]) , 또 하나는 Wifi 단독 Server ?(MAC[SOFTAP]) 용 MAC Address 입니다.

Soft AP 는 공유기에 붙이지 않고, 8266가 단독으로 SSID,Password 를 치고 연결할 때
사용하는 방식 으로 알고 있습니다. 
그 뭐시냐... 핸드폰으로 Wifi 스캔하면 SSID가 보이죠. (^^ 공부 좀 더 해야겠네요.)

자 나중에 공부 더 해서 추가할께요.
아뭏든, 아두이노 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
#include <ESP8266WiFi.h>
 
uint8_t MAC_array[6];
char MAC_char[18];
 
 
void setup() {
  char ser_tx_buff[100];
  
  Serial.begin(115200);
 
  Serial.println();
  // put your setup code here, to run once:
 
  Serial.print("MAC[STA] ->");
  WiFi.macAddress(MAC_array);
  for (int i = 0; i < sizeof(MAC_array); ++i){
    sprintf(MAC_char,"%s%02x:",MAC_char,MAC_array[i]);
  }
  Serial.println(MAC_char);  
 
  MAC_char[0]=0;
  Serial.print("MAC[SOFTAP] ->");
  WiFi.softAPmacAddress(MAC_array);
  for (int i = 0; i < sizeof(MAC_array); ++i){
    sprintf(MAC_char,"%s%02x:",MAC_char,MAC_array[i]);
  }
  Serial.println(MAC_char);  
}
 
void loop() {
  // put your main code here, to run repeatedly:
}
cs


원래는 Chip ID 만 알려고 했다가,

구글링을 해 보니, 더 많은 정보를 얻을 수 있었습니다.

다음 사이트에서 참고했습니다.
https://github.com/adafruit/ESP8266-Arduino

그냥 스케치 프로그램만 건드리면 되네요.

소스 코드는 다음과 같습니다.




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
void setup() {
  char ser_tx_buff[100];
  
  Serial.begin(115200);
 
  Serial.println();
//ESP.getFreeHeap();// returns the free heap size.
//ESP.getChipId();// returns the ESP8266 chip ID as a 32-bit integer.
//Several APIs may be used to get flash chip info:
//ESP.getFlashChipId();// returns the flash chip ID as a 32-bit integer.
//ESP.getFlashChipSize();// returns the flash chip size, in bytes, as seen by the SDK (may be less than actual size).
//ESP.getFlashChipSpeed();// returns the flash chip frequency, in Hz.
//ESP.getCycleCount();// returns the cpu instruction cycle count since start as an unsigned 32-bit. This is useful for accurate timing of very short actions like bit banging.
  sprintf(ser_tx_buff,"1. getFreeHeap = %d\n\r",ESP.getFreeHeap());
  Serial.print(ser_tx_buff);
  sprintf(ser_tx_buff,"2. getChipId = %d\n\r",ESP.getChipId());
  Serial.print(ser_tx_buff);
  sprintf(ser_tx_buff,"3. getFlashChipId = %d\n\r",ESP.getFlashChipId());
  Serial.print(ser_tx_buff);
  sprintf(ser_tx_buff,"4. getFlashChipSize = %d\n\r",ESP.getFlashChipSize());
  Serial.print(ser_tx_buff);
  sprintf(ser_tx_buff,"5. getFlashChipSpeed = %d\n\r",ESP.getFlashChipSpeed());
  Serial.print(ser_tx_buff);
  sprintf(ser_tx_buff,"5. getCycleCount = %d\n\r",ESP.getCycleCount());
  Serial.print(ser_tx_buff);
  // put your setup code here, to run once:
}
 
void loop() {
  // put your main code here, to run repeatedly:
 
}
cs


SPI 통신 테스트를 하려고 보니까, 

함수가 크게 2가지로 나눠서 볼 수 있는데, 특히 transferBytes(uint8_t * out, uint8_t * in, uint32_t size)함수는 
설명을 읽어 보아도 잘 모르겠어서 직접 테스트를 해 보게 되었습니다.

먼저 2가지라고 말씀 드린 함수는 대표적으로 다음과 같습니다.
PC의 다음 위치의 SPI.CPP 파일에 정의되어 있습니다.
C:\Users\trion\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\libraries\SPI
1. void SPIClass::transferBytes(uint8_t * out, uint8_t * in, uint32_t size)
2. void SPIClass::writeBytes(uint8_t * data, uint32_t size)

관련된 비슷하거나 파생된 함수는 몇가지 더 있습니다만, 이 2가지 함수가 많은 데이터를 보내면서
테스트하기에 적합해서 2가지 함수로 테스트를 진행했습니다.

하드웨어 구성은 예전에 테스트하다가 중단하고 그냥 놔둔 Serial Nand Flash IC(W25N01GxxIG)를 사용해서
ESP-8266의 HSPI 포트에 연결했습니다. 얼마 전까지 SD-Card 를 연결했던 포트죠.


[ESP-8266 개발 키트에서 사용한 SPI 포트들] 



NAND 랑 연결을 하고 테스트를 크게 2가지로 진행했습니다.
1. 10 바이트 전송.
  - writeBytes() 함수와 transferBytes() 함수의 차이점은 읽기가 되는지 안되는지의 차이 입니다.
    transferBytes() 함수로도 쓰기 기능만 사용할 수 있고 writeBytes() 함수가 약간 더 빠름니다.
  - 쉽게 말하면, writeBytes() 함수는 Write 전용, transferBytes() 함수는 Full Duplex 통신이라고 볼 수 있다.
  - 다음의 그림은 writeBytes() 함수와 읽기/쓰기 겸용(Full Duplex)으로 사용한 transferBytes() 함수의 전송속도 차이를 보여주는 신호 파형이다.




2. 100 바이트 전송.
다음은 이 2개의 함수에서 대용량 바이트를 전송할 경우의 특성을 살펴 보았다.
여러 바이트를 전송할 경우에, ESP IC는 기본으로 다른 칩에서의 DMA 기능처럼 SCLK가 끊어짐 없이 출력되었다.
하지만 64-Byte 마다 약간의 딜레이가 있다. 
이 딜레이는  transferBytes() 함수에서 읽기 기능을 사용했을 경우 크게 늘어난다. 
읽기 기능을 사용하지 않으면 두 함수의 64 Byte 간의 딜레이의 차이는 별로 없다.
[transferBytes() 함수의 특성]




[writeBytes() 함수의 특성]




다음은 아두이노 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
#include <Arduino.h>
#include "SPI.h"
#include "HardwareSerial.h"
 
#define nSPI_CS   4
 
 
void setup() {
 
  int i;
  uint8_t in_buf[100],out_buf[100];
  char ser_tx_buf[100];
  
  delay(1000);
  
  Serial.begin(115200);
  // put your setup code here, to run once:
  digitalWrite(nSPI_CS, HIGH);
  pinMode(nSPI_CS, OUTPUT);
  pinMode(SCK, SPECIAL);  ///< GPIO14
  pinMode(MISO, SPECIAL); ///< GPIO12
  pinMode(MOSI, SPECIAL); ///< GPIO13
 
  SPI1C = 0;
  SPI.setFrequency(20000000); ///< 20MHz
  SPI1U = SPIUMOSI | SPIUDUPLEX | SPIUSSE;
  SPI1U1 = (7 << SPILMOSI) | (7 << SPILMISO);
  SPI1C1 = 0;
 
  for (i=0;i<10;i++)
  {
    out_buf[i] = i;
  }
    out_buf[0= 0x9F;
    out_buf[1= 0;
    out_buf[2= 0;
    out_buf[3= 0;
    out_buf[4= 0;
    
  digitalWrite(nSPI_CS, LOW);
  // 10 Byte Transfer
  //SPI.transferBytes(out_buf,in_buf,10);
  //SPI.writeBytes(out_buf,10);
  // 100 Byte transfer
  //SPI.transferBytes(out_buf,in_buf,100);
  //SPI.transferBytes(NULL,NULL,100);
  //SPI.transferBytes(out_buf,NULL,100);
  //SPI.transferBytes(NULL,in_buf,100);
  SPI.writeBytes(out_buf,100);
  digitalWrite(nSPI_CS, HIGH);
 
  sprintf(ser_tx_buf,"\n\nSPI Test Program in:%02X,%02X,%02X,%02X,%02X\n\r",in_buf[0],in_buf[1],in_buf[2],in_buf[3],in_buf[4]);
  Serial.print(ser_tx_buf);
}
 
void loop() {
  // put your main code here, to run repeatedly:
 
}
cs


100 mm x 100 mm PCB를 10조각에 $10에 제작해 준다고 합니다.


간혹 인터넷에서 이런 곳을 이용하는 사람들을 봤었는데,
요새 Windows 10으로 바꾸고 나서 orcad Layout을 느려서 못 쓰니까 PSB 아트웍을 안하게 되네요.

알레그로 좀 공부해서 한 번 맡겨봐야 겠습니다.



어디서 저장이 된 것인지 잘 모르겠지만,

SSID 와 Password가 저장되어서 지우고 싶을 때가 있다.

그럴 땐, 이렇게.. (ARDUINO IDE 에서 사용하는 함수이다.)

WiFi.disconnect();


PSOC5 는 EEPROM 테스트 관련 글이 없어서 약간 시간을 내서 글을 올려 봅니다.


물론 예제에서도 참고할 수 있는데, 예제가 너무 복잡해 보이네요.
또한 제가 사용할 때는, EEPROM 을 따로 Erase를 할 필요가 없었는데.. 
예제에서는 항상 Erase를 하고 Write를 하는게 좀 이상했습니다.

이번에 테스트한 보드는, Cypress에서 많이 파는 CY8CKIT-059 로 진행했습니다.
사용한 콤포넌트는 Port 입력 1개(TACT Switch)와 UART 만 사용했습니다.

byte(unsigned char) 타입 데이터 2개와 uint(unsigned 16 bit) 타입 데이터 2개를 스위치를 1번 누를 때마다,
1씩 증가하도록 하고 EEPROM 에 저장을 했습니다.
그리고 리셋 버튼을 누르면 EEPROM에 저장된 값을 UART 로 출력해서 EEPROM의 동작을 확인했습니다.

보드의 외형과 사용하는 포트들은 다음과 같습니다.




다음은 PSOC Creeator 의 컴포넌트 설계도입니다. (TopDesign.cysch)



다음은 실제 PSOC5 IC의 사용하는 포트입니다.






다음은 프로그램 테스트 과정입니다.

1. 처음 프로그램을 다운로드하고 UART 로 출력되는 내용 (EEPROM에 저장되는 값들을 초기화하여 Write 한다)




2. 스위치를 3번 눌러서 값을 3증가시켜서 저장하고 UART로 출력. 리셋 버튼을 눌러 EEPROM 값을 읽어 확인.




3. 전원을 OFF --> ON 해서 정말로 데이터가 남아 있는지도 확인.





psoc 소스 코드 첨부합니다.

eeprom_test.Bundle01.zip


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


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


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


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

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


대전력 아마 이 트라이악 소자가 30A 까지 가능 한가 그럴겁니다. 

하지만 제가 감이 안와서 방열판을 얼마나 크게 해야 할지, 회로 패턴 굵기는 얼마로 할지  몰라서 10A 미만 정도로 예상합니다.

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




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


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




+ Recent posts