'아두이노'에 해당되는 글 91건

  1. 2019.07.07 Hardware | bluetooth 모듈 HC-06 / HC-05 사용해 보기 - 1
  2. 2019.05.05 Hardware | tilt sensor 를 사용해 보자
  3. 2019.04.14 Hardware | touch sensor 를 이용하여 놀아보기
  4. 2019.03.18 Hardware | PN523 - RFID / NFC breakout 보드
  5. 2019.01.25 Book | 훤히 보이는 RFID/USN - Get to know RFID/USN
  6. 2018.12.31 Hardware | ESP-01 or ESP8266 사용기 - 2 2
  7. 2018.12.21 Hardware | Breadboard Jumper 구입하기
  8. 2018.12.14 Hardware | ATtiny85 개발 보드를 이용하여 Digispark 를 DIY 하기
  9. 2018.12.02 Hardware | MAX30105 파티클 센서 - 2
  10. 2018.11.23 Hardware | MAX30105 파티클 센서 - 1

Hardware | bluetooth 모듈 HC-06 / HC-05 사용해 보기 - 1

|

1. Bluetooth 통신


룰루~ arduino 로 놀 수 있는 센서나 모듈이 뭐가 있을까~ 하고 AliExpress 를 둘러 보던 중,

HC-05, HC-06, SPP-C 가 bluetooth 연결에 사용할 수 있는 모듈이라는 것을 알았습니다.


아직 쌓여있는 센서가 많지만, 일단 구매해 봅니다.


* SPP-C Bluetooth serial pass-through module wireless serial communication from machine Wireless SPPC Replace HC-05 HC-06

https://www.aliexpress.com/item/32755550889.html




* HC-05 HC 05 hc-06 HC 06 RF Wireless Bluetooth Transceiver Slave Module RS232 / TTL to UART converter and adapter

https://www.aliexpress.com/item/32523867394.html








2. 도착


한 업자에게서 구매 해서 동시에 배달되었습니다.



HC-05 이구요.



HC-06 이구요.



응? HC-05 랑 보드는 같고, 다른점은 오른쪽 밑에 스위치와 pin 갯수가 다른 것 뿐이네요.



뒷면에 세겨진 pin out 배열도 동일합니다.



SPP-C 만 다른 보드를 사용합니다.






3. HC-06


일단 오늘은, Slave 만으로 사용할 수 있는 가장 간단한 HC-06 구동을 시험해 보기로 합니다.

HC-05 는 Master / Slave 양쪽으로 사용할 수 있고, HC-06 은 Slave 만 가능하다 하네요.


보드가 동일한 것을 미리 알았더라면, HC-05 만 두개 살껄 그랬습니다.

SPP-C 는 완전 다른 모양이라 HC-05 / HC-06 을 가지고 놀아 보고 그 다음애 해보려 합니다.


구동 전원 Vcc 는 3.6v~5V 라서 arduino nano 의 3.3v 로는 조금 부족하고 5v 로 확실하게 구동됩니다.


HC-06 의 RXD, TXD 는 3.3v 를 이용한 입출력이므로. level shift 회로가 필요합니다만, 출력 (TXD) 은 그대로 하고,

입력 (RXD) 에 저항을 연결하여 회로를 보호해 줍니다.

사실 그대로 연결해도 됩니다만, 저항을 연결해 주는게 느낌상 좋습니다.


실제로 전용회로를 꾸미게 되면, 입출력 전압을 측정하여 거기에 맞는 저항을 달아 주는 것이 좋겠죠?

사양은 다음과 같습니다.


- Bluetooth protocol: Bluetooth V2.0 protocol standard

- Power Level: Class2(+6dBm)

- Band: 2.40GHz—2.48GHz, ISM Band   

- Receiver sensitivity: -85dBm

- USB protocol: USB v1.1/2.0

- Modulation mode: Gauss frequency Shift Keying

- Safety feature: Authentication and encryption

- Operating voltage range:+3.3V to +6V

- Operating temperature range: -20ºC to +55ºC

- Operating Current: 40mA


* Specification : hc06.pdf





4. pin out


여러 연결 방법이 있을 수 있으나,

우선 가장 간단한 arduino nano 를 통해서 PC 와 통신을 시도해 봅니다.

Pin out 정보 입니다.


 HC-06 | Arduino Nano
-----------------------
  RXD  |      D2
  TXD  |      D3
  GND  |      GND
  VCC  |      3.3V
-----------------------



아두이노에서 받는 3.3v 전원은 조금 약한 감이 있고, 5v 를 받자니 arduino nano 가 버거울 것 같아,

외부 전원을 사용하면 안정적으로 3.3v 인가 가능할 것 같습니다.


실제로 arduino nano 의 3.3v 에 연결하면, 되었다 안되었다 불안한 동작을 보여 줍니다.





5. layout


연결 diagram 입니다.



실제로 아래와 같이 연결했습니다.



삽질한 부분은 arduino nano 와 추가 전원의 ground 는 서로 연결해줘야 하는 것이였습니다.

그렇지 않으면, 정상적으로 통신이 되지 않습니다.

Ground 는 꼭 서로 맟춰 줘야 합니다.





6. sketch


아래는 arduino nano 를 PC 와 연결 할 경우에 사용한 소스 입니다.


#include "SoftwareSerial.h"
 
#define HC06_RXD 2
#define HC06_TXD 3
SoftwareSerial bluetooth(HC06_RXD, HC06_TXD);
 
void setup(){
  Serial.begin(9600);
  bluetooth.begin(9600);
}
 
void loop(){
  if (bluetooth.available()) {
    Serial.write(bluetooth.read());
  }
  if (Serial.available()) {
    bluetooth.write(Serial.read());
  }
}





7. AT commands


HC-06 과 연결되면 AT 명령어를 통해서 상태 확인이 가능합니다. 



Arduino IDE > Tools > Serial Monitor 를 띄우고 위의 AT 명령어들을 쳐 봅니다.



통신 속도 = baud rate 는 9600 으로 해야 합니다.

HC-06 은 공장 출하 설정이 9600 bps 로 되어 있습니다.


Bluetooth 이름은 "HC-06" 이구요, ROLE 은 0, 즉 SLAVE 로 되어 있습니다.


* AT+ROLE: See role of bt module(1=master/0=slave)



Password 는 기본 "1234" 로 되어 있습니다.


통신 속도 UART 는 9600 으로 되어 있네요.

바꾸고 싶을 경우는 아래와 같이 설정하면 됩니다.


* 1 set to 1200bps

* 2 set to 2400bps 

* 3 set to 4800bps 

* 4 set to 9600bps (Default) 

* 5 set to 19200bps 

* 6 set to 38400bps 

* 7 set to 57600bps 

* 8 set to 115200bps

  ex) AT+BAUD4 will set the baud rate to 9600



다른 명령어도 다 쳐 봤습니다.





8. Windows 10 과 연결해 보기


Windows 10 에서 블루투스 장치로 연결해 봅니다.



HC-06 을 연결하면 비번을 물어봅니다.



블루투스다 보니 잘 연결됩니다.



장치관리자에서 연결된 HC-06 의 주소를 확인해 보면, 가지고 있는 HC-06 의 address 인 것을 알 수 있습니다.

동일한 장치임을 확인 할 수 있는 부분이죠.



COM 포트를 확인해 보면, 송신 port 가 COM8 임을 알 수 있네요.



시리얼 포트 리스트에도 떠 있습니다.



putty 를 이용하여 COM8 에 연결합니다.



오호라. putty 에서 타이핑 한 것은 보이지 않지만, 글씨를 타이핑 후,

"Ctrl + M, J" 를 치면 arduino IDE 의 Serial Monitor 에서 송신된 단어를 확인할 수 있습니다.



반대로, Serial Monitor 에서 글씨를 치고 Send 를 누르면, putty 화면에 나타나는 것을 확인 할 수 있어요.






9. USB UART CP2102


Serial 연결은, USB Serial 장치인 CP2102 를 통해서도 연결해 봅니다.



RXD 는 저항을 달아서 보호해 주면서, 그림과 같이 연결해 줍니다.


 HC-06 | CP2102
----------------
  RXD  |  TXD
  TXD  |  RXD
  GND  |  GND
----------------

실제 연결은 다음과 같습니다.



역시 putty 를 이용해서 확인해 봅니다.



모든 AT commands 가 잘 먹힙니다. 정상적으로 통신이 가능하네요.





FIN


HC-06 / HC-05 은 해볼 것이 여러가지 있는것 같습니다.

일단 오늘은 HC-06 의 여러가지 연결법과 AT commands 를 사용해 봤습니다.


다음은 HC-05  HC-06 을 사용하여 Master / Slave 연결 등을 활용해 볼께요.




Update - 20210124


사진 정리를 하다, 예전 경주에 놀러갔을 때, 3D 놀이공간 건물 한켠에 전자 공방에서 찍은 사진을 발견.

HC-06 / HC-05 는 bluetooth 에 있어서 널리 사용되는 모듈임을 새삼 다시 알게 되었네요.



And

Hardware | tilt sensor 를 사용해 보자

|

이 글은 아래 포스트와 연결되는 글 입니다. 


* Hardware | vibration sensor 를 사용해 보자

https://chocoball.tistory.com/entry/Hardware-vibration-sensor


저번에 잘못 배송되어 온 센서가, 이 Tilt Sensor 입니다.

원래는 Vibration Sensor 를 구매하려 했는데, 사양이 다른 이 기울기 센서가 왔던 것이죠.


동작 방식도 다르다 보니, 이렇게 따로 구분하여 글을 올립니다.




1. SW-520D tilt sensor


이 Tilt 센서는 의도치 않게 구매하게 되었습니다.

아래 링크에서 보이듯이 SW-18015P 라고 되어 있는데 거짓말 입니다.


* 3pin KY-002 SW-18015P Shock Vibration Switch Sensor Module for arduino Diy Kit 1PCS

https://www.aliexpress.com/item/3pin-KY-002-SW-18015P-Shock-Vibration-Switch-Sensor-Module-for-arduino-Diy-Kit-1PCS/32843226927.html



도착은 합니다만...



Vibration Sensor 의 특징인 한쪽 다리가 가는게 아니라, 이놈은 두가닥 모두 두껍습니다.



음?!!!



센서 표기를 보니 SW-18015P 가 아니라, SW-520D 라고 되어 있네요?

제품 사양을 확인해 보니, SW-180 계열의 스프링 형태가 아니라 굴러다니는 공이 안에 들어있는 구조 입니다.



SW-520D.pdf


원리가 다르다 보니 센싱에 있어서도 차이가 있어 보입니다.





2. Layout


센서의 연결은 간단합니다. 전원 +/- 와 신호선 1개.


기울기 센서는 안에 들어가 있는 볼이 리드선과 접촉했냐 안했냐에 따라서 센싱을 합니다.

그래서, 세워졌을 때 중력으로 두 개의 볼과 리드선이 모두 접촉해 있을때를 기준으로 ON 으로 인식합니다.


접속은 다음과 같습니다.


 SW-520D | Arduino Nano
------------------------
    S    |     D8
   GND   |     GND
   VCC   |     3.3V
------------------------


회로도는 다음과 같습니다.



실재 구성 모습니다.






3. Sketch


Source 는 다음과 같습니다.


int LED = 3; // define the LED Pin
int shock = 8; // define the sensor Pin 
int val; // define a numeric variable val 

void setup () {
	Serial.begin(9600);      // Only for debugging
	pinMode (LED, OUTPUT); // LED pin as output
	pinMode (shock, INPUT); // input from KY-002 sensor
}

void loop () {
	val = digitalRead(shock); // read the value from KY-002
	
	if (val == HIGH ) { // when sensor detects shock, LED flashes
		digitalWrite(LED, HIGH);
		Serial.println(val);
	} else {
		digitalWrite(LED, LOW);
		Serial.println(val);
	}
}




4. 결과


디지털 pin 에 입력이 연결되어 있다 보니, 1 or 0 으로 표시됩니다.



사양서 처럼, 세워져 있는 형태가 기준이 됩니다.

손가락으로 튕겨 진동을 주면 흔들리는 정도에 따라 센싱을 합니다.


옆으로 뉘이면 계속 센싱을 하는것 처럼 되어 버리니, 이 센서를 사용함에 있어서는 세우는 것이 중요해 보입니다.






FIN


뉘거나 기울이면, 오작동 하지만, 세워 놓기만 하면 꽤나 민감하게 반응해 줍니다.

Vibration Sensor 와는 다르게 Tilt Sensor 도 괜찮아 보입니다.


처음 제품이 잘못 온것도 있지만, 이렇게 테스트 해볼 수 있어서 행운이었습니다.


And

Hardware | touch sensor 를 이용하여 놀아보기

|

오늘은 머리도 식힐 겸, touch sensor 를 가지고 놀아 봤습니다.




1. 구입


터치 센서로는 몇가지가 있지만, RobotDyn 사에서 만든 센서를 선택했습니다.

RobotDyn 사의 기판색이 블렉이고 마무리가 깔끔해서 좋습니다.


* Digital capacitive touch switch sensor. Double side touch area. Module.

https://www.aliexpress.com/item/Digital-capacitive-touch-sensor/32570170116.html






2. 도착


워낙 저렴하고 간단한 부품이라 잊어버리고 있으니 도착해 있더랬습니다.



이 부품은 특이하게 "Capacitive" 라는 단어가 들어가네요.

유도체적인 성질을 가지는 것인가? 라는 생각을 잠시 해봅니다.



외형은 요렇습니다.

Touch Sensor 라고 표시된 밑부분에서 감지를 하도록 되어 있습니다.

Digital Out 이라고 표기해 놔서 arduino 의 digital pin 에 연결하면 된다는 것을 알 수 있네요.



신기하게도 뒷면의 동일한 부분도 터치인식을 합니다.






3. layout


Pin 연결은 digital pin 과 연결하면 됩니다.

전압은 3.3V 줬습니다.


 Touch Sensor | Arduino Nano
-----------------------------
      Out     |     D4
      GND     |     GND
      VCC     |     RX
-----------------------------


회로도는 다음과 같습니다.

그냥 터치센서만 연결하면 어떻게 인식되는지 알 수가 없으니, LED 와 Piezo Buzzer 를 추가했습니다.

Piezo buzzer 사용하는 법은 아래를 참고해 보세요.


* Hardware | Arduino 로 buzzer 소리내기

https://chocoball.tistory.com/entry/HardwareArduinoBuzzer


LED는 220 ohm 저항을 달아주는 것을 잊지 마시구요.



실제 사진은 다음과 같습니다.






4. Sketch


소스는 다음과 같습니다.

각 digital pin 을 정의하고, touch sensor 에 입력이 들어오면 LED 와 buzzer 를 on 하는 구조 입니다.


입력이 없어지면, LED 및 buzzer 오 off 를 꼭 만들어 줘야 합니다.


int T_IN = 4;
int LED = 3;
int PIEZO = 2;

void setup()
{
	pinMode(T_IN, INPUT);
	pinMode(LED, OUTPUT);
}

void loop()
{
	if(digitalRead(T_IN)) {
		digitalWrite(LED, HIGH);
		tone(PIEZO, 600);
	}
	digitalWrite(LED, LOW);
	noTone(2);
}





5. 결과


너무 단순한 내용이라 틀리고 자시고 할 것이 없습니다.

동영상 갑니다.



신기한 것은 손가락이 직접 닿지 않더라도 가까이 대기만 해도 인식합니다. 한 1.5mm 정도?






FIN


요즘 항공무선통신 자격증을 준비하면서, 예전 실기 과목으로는 모르스 부호도 했었다는 것을 알게 되었습니다.

항공무선통신 자격증 시험 준비에 대해서는 다른 포스트에 있습니다.


* Life | 항공무선통신사 도전기 - 1

https://chocoball.tistory.com/entry/Life-airnav-comm-cert-1


나중에 시간 되면, 이번에 했던것을 조금 발전시켜 morse code + arduino 도 한번 도전해 보겠습니다.





* Morse code

https://en.wikipedia.org/wiki/Morse_code


Morse code is usually heard at the receiver as a medium-pitched on/off audio tone (600–1000 Hz), so transmissions are easier to copy than voice through the noise on congested frequencies, and it can be used in very high noise / low signal environments.


And

Hardware | PN523 - RFID / NFC breakout 보드

|

이 글은, 아래 포스트에서 예고 했듯이, RFID / NFC 를 arduino 를 이용하여 tag를 인식시켜 보는 글 입니다.


* Book | 훤히 보이는 RFID/USN - Get to know RFID/USN

https://chocoball.tistory.com/entry/Book-Get-to-know-RFID-USN





1. 대응 가능한 chip


RFID / NFC 를 읽을 수 있는 chip 중에 PN532 가 FeliCa 도 인식할 수 있으며, 대중적으로 구입 가능하다는 것을 알게 되었습니다. (범용)


* RFID Selection Guide - Adafruit Industries

https://cdn-shop.adafruit.com/datasheets/rfid+guide.pdf

rfid+guide.pdf



PN5xx 시리즈 중에서 시중에서 구입 가능한, 그리고 xx 부분의 숫자가 큰 것으로는 PN532 가 있더군요.

가장 우수한 chip 으로는 PN544 입니다만, 관련 breakout 은 5만원 이상이었습니다.


저렴하게 AliExpress 에서 골라서 구입합니다.


* 1Set GREATZT PN532 NFC RFID Wireless Module V3 User Kits Reader Writer Mode IC S50 Card PCB Attenna I2C IIC SPI HSU For Arduino

https://www.aliexpress.com/item/1Set-GREATZT-PN532-NFC-RFID-Wireless-Module-V3-User-Kits-Reader-Writer-Mode-IC-S50-Card/32859551116.html



- User manual : PN532_Manual_V3.pdf


[Features]

1. Gilt PCB and Small dimension and easy to embed into your project

2. Support I2C, SPI and HSU (High Speed UART), Change between those modes

3. Support RFID reading and writing

  1) SupportP2P communication with peers

  2) Support NFC with Android phone


4. Typical Operating Distance have been updated to 5cm~7cm reading distance

5. Work in NFC Mode or RFID reader/writer Mode

6. RFID reader/writer supports:

  1) 1k, 4k, Ultralight, and DesFire cards

  2) ISO/IEC 14443-4 cards such as CD97BX, CD light, Desfire, P5CN072 (SMX)

  3) Innovision Jewel cards such as IRT5001 card

  4) FeliCa cards such as RCS_860 and RCS_854


7. Plug and play, for compatible

8. Built in PCB Antenna, with 4cm~6cm communication distance

9. On-board level shifter, Standard 5V TTL for I2C and UART, 3.3V TTL SPI

10. Work as RFID reader/writer

11. Work as 1443-A card or a virtual card

12. Exchange data with other NFC devices such as smartphone



[Package Included]

1 x1PCS*PN532 NFC RFID Module

1x 2.54mm spacing 4pin Cable

1xMifare One S50 White Card

1xMifare One S50 Key Card

1x12P bended male pins


사양을 보면 FeliCa 도 읽을 수 있다고 되어 있습니다.

FeliCa 는 일본 지하철 / 국철에서 사용할 수 있는 Suica / PASMO 카드에 사용된 기술입니다.

마침 일본에서 사용했던 Suica / Pasmo 카드를 가지고 있으니, FeliCa 대응 가능한 이 breakout 을 이용할 수 있겠네요.


다만, fake 제품은 읽을 수 없다고 합니다. (나중에 안 사실)

AliExpress 에서 구매할 수 있는 저가품이다 보니, 아마 불가능할 것 같다는 느낌은 듭니다.





2. 도착


배송에 한달정도 소요되었습니다.



구성품은 다음과 같습니다.

Tag 종류가 둥그런 것과 카드형식, 두가지가 들어 있네요.



Breakout 보드의 확대 사진입니다.



뒷면입니다. I2C 용 pin head 와 SPI 용이 따로 구분되어 있습니다.



Arduino 와 연결하기 위해서 pin head 들을 납땜 했습니다.

납땜 팁이 오래 쓰면서 산화되어 버려 이제는 납볼이 잘 생성되지 않았지만, 어떻게든 이쁘게 된것 같네요.







3. Library 설치


이 보드에 관한 제작 / 판매하는 사이트를 따라가다 보면 Seeed Studio 라는 회사가 떠오릅니다.

관련한 source 들은 아래 GitHub 에서 공유되어 있습니다.


* elechouse/PN532

https://github.com/elechouse/PN532


위의 사이트에서 설명되어 있기론, 아래 두 파일을 Arduino libraries 폴더에 압축을 풀어서 copy 하라고 합니다.

결국 위의 GitHub 의 파일과, 추가로 Don 이라는 사람이 만든 NDEF 파일을 Arduino > libraries 에 설치하면 준비는 끝납니다.


PN532-PN532_HSU.zip

NDEF-master.zip


위에서 시키는 대로 하면, PN532 directory 가 많아지므로, 구분을 위해 prefix "elechouse" 를 붙여서 아래처럼 저장했어요.



다른 source 로는, 가장 유명한 adafruit 에서 나온 PN532 library 를 설치하면 됩니다.


* adafruit/Adafruit-PN532

https://github.com/adafruit/Adafruit-PN532


위에서 파일을 다운로드 받아 libraries 에 copy 해도 되고, 아래처럼 Library Manager 를 이용하여 install 해도 됩니다.



다만, adafruit 소스에는 HSU (High Speed UART) 연결방식이 지원되지 않습니다.

그러니 HSU 를 사용하고 싶으면, 처음에 소개된 elechouse source 가 필요합니다.





4. I2C 연결


이제 소스를 올리고 RFID 인식을 시켜 봅니다.

Arduino 와 연결 방식은 I2C / SPI / HSU 가 있으니, 먼저 가장 단순한 I2C 를 이용해 봅니다.


아래처럼 DIP switch 를 I2C 방식으로 변경합니다.



문제 없이 I2C 통신이 이루어 지는지 I2C detect 소스로 확인해 봅니다.

방법은 예전에 올렸던 아래 포스트에서 확인해 보세요.


* Hardware | Gyroscope GY-521 MPU-6050 을 사용해 보자

https://chocoball.tistory.com/entry/Hardware-Gyroscope-GY521-MPU6050



PN532 breakout 의 측정된 주소로 "0x24" 가 나왔네요.

연결은 다음과 같이 합니다.


   PN531  | Arduino Nano
-------------------------
    VCC   |     5V
    GND   |     GND
    SDA   |     A4
    SDL   |     A5
-------------------------


연결 layout 은 다음과 같습니다.

구매한 breakout 보드와 동일한 fritzing 파트를 찾을 수 없어서 adafruit 에서 나온 것을 사용하였습니다.



여타 I2C 연결이 그러하듯 동일합니다.



아래 sample source 를 arduino 에 로드합니다. iso14443a_uid 가 처음 시작하기에 가장 평범한 소스라고 하네요.


File > Examples > elechouse_PN532 > iso14443a_uid



Serial Monitor 에서 확인하면 다음과 같이 인식합니다!



위의 소스의 단점은 준비 상태로 되는 것과 카드를 태킹하면 인식에 시간이 좀 걸린다는 것 입니다.

실생활에 전혀 사용할 수 없는 수준이네요.


그럼 이번에는 Adafruit 의 동일한 소스를 사용해 봅니다.


File > Examples > Adafruit PN532 > iso14443a_uid


adafruit 소스는 먼저번 소스와는 다르게, IRQ 와 RESET (RSTO) 를 추가로 연결하는 부분이 존재합니다.


// If using the breakout or shield with I2C, define just the pins connected
// to the IRQ and reset lines.  Use the values below (2, 3) for the shield!
#define PN532_IRQ   (2)
#define PN532_RESET (3)  // Not connected by default on the NFC Shield

// Uncomment just _one_ line below depending on how your breakout or shield
// is connected to the Arduino:

// Use this line for a breakout with a SPI connection:
//Adafruit_PN532 nfc(PN532_SCK, PN532_MISO, PN532_MOSI, PN532_SS);

// Use this line for a breakout with a hardware SPI connection.  Note that
// the PN532 SCK, MOSI, and MISO pins need to be connected to the Arduino's
// hardware SPI SCK, MOSI, and MISO pins.  On an Arduino Uno these are
// SCK = 13, MOSI = 11, MISO = 12.  The SS line can be any digital IO pin.
//Adafruit_PN532 nfc(PN532_SS);

// Or use this line for a breakout or shield with an I2C connection:
Adafruit_PN532 nfc(PN532_IRQ, PN532_RESET);


위의 소스의 일부분에서 보여주는 것 처럼 SPI 부분을 주석처리 하고, I2C 부분을 활성화 시킵니다.

두개의 pin 연결이 아래처럼 추가되었습니다.


   PN531  | Arduino Nano
-------------------------
    VCC   |     5V
    GND   |     GND
    SDA   |     A4
    SDL   |     A5
    IRQ   |     D2
   RSTO   |     D3
-------------------------


결과는 인식률과 인식 속도가 엄청 빨라졌습니다.

결국 IRQ / RESET 핀이 준비상태 및 인식 처리를 추가로 담당한다는 것을 예상할 수 있습니다.

Serial Monitor 결과는 다음과 같습니다.



참고로 위의 소스로 신용카드 (버스카드) 를 인식 시키면 "Mifare Classic" 으로 읽어보라고 메시지가 뜹니다.


File > Examples > Adafruid PN532 > readMifareClassic 을 로드 시켜 봅니다.



뭔가 정보를 더 많이 뿌려줌과 동시에, "Mifare Classic" 이라고 이야기 해 줍니다.


조금 벗어난 이야기 이지만,

RFID / NFC 분야도 존재하는 규격이 많아서 chip 제조사로서는 골치가 아플 듯 합니다.


이것도 결국 기술 로열티와 표준 제정 이권싸움의 결과겠죠.

Thunderbolt 도, 결국은 Thunderbolt 3 = USB Type-C 로 통합되듯, 언젠가 RFID / NFC 도 통합이 되었으면 좋겠습니다.





5. SPI 연결


이제 SPI 연결을 시도해 봅니다. 역시 많은 데이터 교환은 I2C 보다는 SPI 방식입니다.

먼저, Software SPI 연결법 입니다.


   PN531  | Arduino Nano
-------------------------
    VCC   |     5V
    GND   |     GND
    SCK   |     D2
    MISO  |     D5
    MOSI  |     D3
    SS    |     D4
-------------------------


소스는 adafruit 의 것을 이용해 봅니다. (elechouse 것도 상관 없슴)


File > Examples > Adafruit PN532 > readMifare


이미 소스에서 SCK / MOSI / SS / MISO 의 pin 번호를 정희해 놨으므로, 그에 맞게 arduino 와 연결해 줍니다.



TIMEOUT! 이 뜨긴 합니다만, 결과는 아래와 같이 잘 나옵니다.

아무래도 Software SPI 여서 그런 듯 합니다.



역시 SPI 는 Hardware SPI 죠. Hardware SPI 법으로 구동해 봅니다.


   PN531  | Arduino Nano
-------------------------
    VCC   |     5V
    GND   |     GND
    SCK   |     D13
    MISO  |     D12
    MOSI  |     D11
    SS    |     D4
-------------------------


SS pin 은 어느 digital IO pin 이나 상관 없습니다.

이미 PN532_SS 를 4 번 pin 으로 정의해 놨으니, 그 pin 을 그대로 사용합니다.



나머지 pin 들은 각각의 arduino 에 맞게 연결하면 됩니다.

참고로 arduino nano 는 위의 주석에 설명되어 있는 것처럼 SCK = 13, MOSI = 11, MISO = 12 로 맞추면 됩니다.

이는 아래 그림처럼 실제 nano 의 pin out 과 동일합니다.



결과는 다음과 같이 나옵니다. TIMEOUT! 도 없고 인식도 가장 빠른것 같아요.



동영상도 올려 봅니다.






6. FeliCa 인식


FeliCa 가 된다고 하니, electhouse 소스의 FeliCa_Card_Read 를 실행해 봅니다.


File > Examples > elechouse_PN532 > FeliCa_Card_Read


실망스럽게도 PASMO 는 인식되지 않았습니다.

당연하게도 Mifare (ISO14443A) 카드들에게는 전혀 반응하지 않았구요.


단, 희한하게도 일본에서 사용했던 Times (한국의 SOCAR 같은 서비스) 카드는 이 소스로 읽혔습니다.



FeliCa 도 여러 종류가 있는 듯 합니다.

아쉽게도 지하철에 사용되는 FeliCa 인, 일본의 PASMO 와 싱가포르의 EZ-Link 는 어떤 소스에도 읽히지 않았습니다.





7. High Speed UART 연결


특이하게 HSU 라는 연결 방법을 제공합니다. 이는 High Speed UART 의 약자.

이 HSU 는 Hardware Serial (Serial1) 을 바탕으로 소스가 만들어졌습니다.



다만, 위의 표에서 보이듯이, Hardware Serial 를 사용하는 지라, 일부 arduino 에서는 Serial Monitor 를 열어서 확인할 수 없게 됩니다.

Arduino Nano 도 Hardware Serial 은 USB 통신에 점유되어 있어서 "Serial1" 을 사용할 수 없었습니다.



하늘이 무너져도 솟아날 구멍은 있다던가요, 가지고있는 arduino micro 에서는 사용 가능했습니다.

그럼 아래 source 를 arduino micro 에 업로드 해봅니다.


File > Examples > electhouse_PN532 > iso14443a_uid


PN532_HSU 쪽을 활성화면서 "Serial1" 을 사용하게 합니다.



Arudino micro 와의 pin 연결은 다음과 같습니다.


   PN531  | Arduino Micro
--------------------------
    VCC   |     5V
    GND   |     GND
    SDA   |     RX
    SDL   |     TX
--------------------------


잊지 말아야 할 것은, DIP switch 를 HSU 으로 설정해 둬야 합니다.



Arduino micro 의 RX / TX 와 연결하여 HSU 인겁니다.



오오오오! 느낌적으로 SPI 보다 더 빠른 듯 합니다. 이게 가장 빠르네요.




결과는 이렇게 보이구요.



동영상도 올려 봅니다.



그럼 arduino nano 처럼 Hardware Serial 여유가 없는 arduino 는 안되는거냐!

찾아보니 방법을 GitHub 의 설명에서 친절하게 알려주고 있었습니다.


아래 소스처럼 "SoftwareSerial.h" 를 이용하여 구현이 가능합니다.

우선 바로 아래는 Hardware Serial 로 구현된 부분을...


#include "PN532_HSU.h"
#include "PN532.h"

PN532_HSU pn532hsu(Serial1);
PN532 nfc(pn532hsu);

void setup(void)
{
	nfc.begin();
	//...
}


아래처럼 SoftwareSerial.h 를 추가하고 관련된 pin 을 정의해 주면 됩니다.

뭐, 관련된 함수를 "PN532_SWHSU.h" 에서 구현해 줘서 가능한 것이지만 말입니다.


#include "SoftwareSerial.h"
#include "PN532_SWHSU.h"
#include "PN532.h"

SoftwareSerial SWSerial( 10, 11 ); // RX, TX

PN532_SWHSU pn532swhsu( SWSerial );
PN532 nfc( pn532swhsu );

void setup(void)
{
	nfc.begin();
	//...
}


최종적으로 Hardware Serial 관련 부분을 주석처리 하고, SoftwareSerial 을 활성화 하는 코드를 추가하면 됩니다.



Pin 연결은 위에서 정의한 D10 과 D11 에 각각 연결하면 됩니다.

참고로, SDA 는 TX 이고, SDL 은 RX 이므로, SDA(TX) <--> D10 (RX), SDL(RX) <--> D11(TX) 가 됩니다.


   PN531  | Arduino Nano
-------------------------
    VCC   |     5V
    GND   |     GND
    SDA   |     D10
    SDL   |     D11
-------------------------


잘 구동합니다만, 뭔가 타이밍이 맞지 않은지 authentication fail 이 뜹니다.

소스코드에서 수정해야 할 부분이 있는듯 보입니다만, 확인이 어느정도 되었으니 패스.






8. 확인한 RFID / NFC 카드들


마지막으로, 본 포스트에서 확인용으로 사용된 카드들을 소개합니다.



위는 PN532 breakout board 를 구입하면 기본으로 딸려오는 tag 들 입니다. 하나는 원형, 하나는 카드 모양입니다.



위는 싱가포르 출장때 구입해서 사용했던 지하철 패스카드 입니다. 충전식이죠.

아쉽지만, 구입한 PN532 가 짝퉁이라서 못 읽는 것인지 모든 소스와 연결 방법에서 읽기를 실패했습니다.



마찬가지 FeliCa 인식에서 실패한 일본 PASMO 입니다. 일본에서 거주할때 신세를 졌었죠.



저의 회사 출입 카드 입니다. 5년전에 찍은 거라 얼굴이 지금보다 젊어 보이네요. ㅠㅠ



버스카드 겸용인 신용카드 입니다. Mifare Classic 입니다. 잘 읽힙니다.

전용 어플을 이용하면 RFID 정보도 덮어 씌기가 될 듯 한데, 이번에는 도전하지 않았습니다.



유일하게 읽힌 FeliCa 카드 입니다!

다른 소스에서는 전혀 읽히지 않았고, FeliCa Read 소스에서만 유일하게 읽힌 놈입니다.

일본에서 자가용을 운용할 여유가 안되어서, 잘 빌려서 타고 다녔습니다. (SOCAR 같은 서비스)





9. FIN


역시 아쉬운 점은 지하철용 FeliCa 를 읽을 수 없었다는 점 입니다.

뿌듯한건 모든 인터페이스 - HSU, Software HSU, I2C, I2C with RST, Hardware SPI, Software SPI - 모두를 확인해 봤다는 점 입니다.


기회가 되면, 아래 스샷처럼 NXP 에서 나온 어플을 가지고 완벽하게 debugging 을 해보고 싶습니다.

다만, PN544 breakout 보드가 5만원 이상이라는 것 때문에, 일단 여기서 멈춥니다.



And

Book | 훤히 보이는 RFID/USN - Get to know RFID/USN

|

조만간 AliExpress 에서 주문한 RFID reader 와 tag 가 도착하기 전에 RFID 에 조금이라도 알고 싶어서 이 책을 도서관에서 빌렸습니다.

ETRI 관련된 박사님들이 각자 잘 아시는 영역의 글을 모아 만든 RFID/USN 관련된 서적입니다.



아래는 목차입니다.




이 책은 8분이 공동으로 저술한 책 입니다.





1. 책 정보


* 시리즈 : ETRI easy IT 의 6번째 책

* 제목 : 훤히 보이는 RFID/USN

* 발행 : 초판 2008년 6월 25일

* 지은이 : 표철식, 박상준, 김기일, 김동균, 이문규, 김관중, 김선진, 서정해

* 펴낸곳 : 전자신문사

* ISBN 978-89-92885-05-8 03560

* 값 : 20,000원


꼭 알아야 할것은, 이 책이 발간된 해가 2008 년도 라는 부분입니다.


지금은 NFC 나 RFID 가 일상생황에 많이 쓰이고 있어서, 독자에게 별다른 감흥을 못주는 책이 될 수 있습니다.

또한 일본에서는 이미 NFC 기능의 Suica 를 2001년부터 시험 운용하고 있었다는 점을 보면, 2008년에 이 책이 나온것도 조금 늦은 감이 없지않아 있습니다.





2. 용어


알아둬야 할 용어는 당연히 다음과 같겠습니다.


* RFID : Radio Frequency Identification

https://en.wikipedia.org/wiki/Radio-frequency_identification


* USN : Ubiquitous Sensor Network

T23010000040001PDFE.pdf


* NFC : Near Field Communication

https://en.wikipedia.org/wiki/Near-field_communication


지금에 와서는 USN 은 IoT 의 일부가 되겠네요.

요즘은 USN 이라고 이야기 하면 알아듣는 사람은 거의 없을꺼예요.

이 출판물이 나왔던 2008년에 ITU 에서 발간한 문서에서 USN 이라는 용어가 쓰였습니다.


또한 비슷한 것끼리는 RFID 와 NFC가 있습니다만, 개발된 흔적에 따라 쓰임이 조금 다릅니다.

아래 website 에서 잘 설명되어 있네요.


* RFID vs. NFC: What’s the Difference?

https://blog.atlasrfidstore.com/rfid-vs-nfc


infographic 으로 된 그림이 있어서 여기에 개제해 봅니다.



iPhone 끼리 근거리 통신을 통하여 사진을 전송받는 기술이 NFC 였군요.





3. 원리


긴 이야기를 짧게 해본다면 다음과 같습니다.



- 전자기파를 reader 에서 쏴주면, tag 코일에서 발생하는 유도전류를 통해 생성된 전기

- 그 전기를 이용하여 tag ID 를 reader 에 부하변조를 통하여 정보 전달

- 변조 방식은 ASK, FSK, PSK 등을 사용



실제 tag 를 까 보면, transponder 와 chip 및 회로로 되어 있습니다.



가로세로 1mm 의 저 작은 칩이 모든 것을 관장한다니 너무 신기합니다.



저 chip 의 제조에 대해서는 아래 Youtube 를 참고해 보세요.


* How I Made My Own RFID tag - From Shenzhen, China to New York City

https://www.youtube.com/watch?v=PWzyPZAPbt0



사실 저도 이 영상을 보고 RFID 와 arduino 를 연결해서 확인해 보고 싶다는 생각을 한 계기가 되었습니다.

저 위의 Youtube 주인공은 (오른쪽 - Scotty Allen), iPhone 을 부품을 개별적으로 구입해서 하나의 완성 iPhone 을 만들어서 큰 반향을 일으켰던 사람입니다.


이번에는 RFID 를 쫒아, 중국의 Shenzehen 으로부터 New York 까지의 일정이 담겨있습니다.





4. 활용


활용되는 분야는 너무 많습니다.

물류부터 시작하여, 뭔가 추적해야 하는 것이라면 모두 사용될 수 있겠습니다.



등록된 주차장에 들어갈 때도 사용되구요.



마라톤을 뛸 때, 신발에 부착하여 저 바닥면을 지나갈 때, 선수 기록용으로도 활용됩니다.

확실하게 저 위에만 밟고 지나가면 시간이 등록되고 휴대폰 SMS 로 전송되어서 신기했습니다.





5. chip 선택


이미 완성된 기술이기 때문에 그만큼 규격도 다양하게 나왔습니다.

그 규격에 따라 사용되는 tag chip 과 reader 종류가 많습니다.

사실 규격이라고 하기보단, 필요에 따라 발전시킨 버전들이라고 봐야겠죠.


마침 "RFID Selection Guide" 라는 PDF 를 인터넷에서 발견해서 여기에 링크를 걸어 봅니다.


* RFID Selection Guide

rfid+guide.pdf



위에서 보이는 PN532 가 마켓에서 쉽게 구할 수 있고, NFC 및 RFID 양쪽에 대응하면서 그럭저럭 쓸만한 대상으로 보입니다.

인터넷에서 찾아보면 RFID 만 되고, 상용 NFC 가 안되는 것들도 있거든요.


SONY 가 개발한 FeliCa (Suica) 및 iPhone 의 FeliCa 대응 NFC 도 될 듯도 하니,

AliExpress 에서 도착하면 따로 글을 작성해 보겠습니다.






FIN


책 이야기는 별로 하지 않고, RFID 와 NFC 에 대해서 조사해본 이야기가 주가 되었네요.


이 책의 아쉬운 부분은, 이미 한창 발전해버린 RFID 가 주제이다 보니, 지금의 2019 년에 읽기에는 조금 old 한 느낌입니다.


또 하나를 더 들자면, 저자가 8명이나 관여하다 보니 서로 겹치는 내용이 다뤄져 있어, 읽는데 지겹습니다. (사공이 많음)

어떤 챕터는 너무 기본 기술에 치중되어 있고, 다른 챕터는 활용성에만 치중되어 있어서, 이게 기술서적인지 마케팅 서적인지 혼란스러운 부분도 있습니다.


다만 일관성이 없다보니, 전반적으로 "응~ 그렇구나" 정도로 넓은 범위로 지식을 얻기에는 좋은 책이네요. (궂이 들자면...)


And

Hardware | ESP-01 or ESP8266 사용기 - 2

|

이 글은 전편이 있습니다.


* Hardware | ESP-01 or ESP8266 사용기 - 1

http://chocoball.tistory.com/entry/Hardware-ESP01-or-ESP8266-using-1


이번에는 전편에서 풀지 못했던, ESP8266 chip 을 생산하는 ESPRESSIF SYSTEMS 사의 정식 firmware 를 입혀보는 포스트 입니다.

AI-Thinker 사는 firmware 를 한뭉텅이로 만들어 줘서 쉽게 firmware 를 입혔지만,

ESPRESSIF SYSTEMS 사는 address 라던지 파일 순서와 선택이 중요합니다.




1. ESP8266 adapter


전편에서도 사용했지만, 구매 정보를 올리지 않아서 여기에 기록으로 남깁니다.


* 2PCS For ESP-01 Esp8266 ESP-01S Model Of The ESP8266 Serial Breadboard Adapter To WiFi Transceiver Module Breakout UART Module

https://www.aliexpress.com/item/Breadboard-Adapter-for-ESP8266-ESP-01-ESP-01S-Wifi-Transceiver-Module-Breakout/32775467213.html



두개 구입했고 1달정도 걸렸던것 같습니다.

기다리는 것이 익숙해 지긴 했지만, 빨리 확인해보고 싶은 경우는 조금 고통스럽네요.



양 다리는 스스로 납땜해야 합니다.

DIY 임을 명확하게 인지시켜주는 제품입니다.



DIY MORE 라는 회사가 눈에 자주 띄네요.



ESP8266 모듈을 끼우면 이렇게 됩니다.

가로를 세로로 변경해주는 방법입니다.






2. Flash Download Tool


그 사이 3.6.5 로 버전업을 했습니다.


* ESPRESSIF > Support > Download > Tools

https://www.espressif.com/en/support/download/other-tools



아무래도 새로운 버전을 사용하는게 좋겠죠?

그리고 baud rate 도 처음엔 9600 만 사용해야 하는줄 알았는데, 이제는 115200 이 일반화 된것 같습니다.

그래서 요즘 버전들이 지원하는 115200 이상은 큰 문제가 없는듯 합니다.





3. NON-BOOT mode


이제 ESPRESSIF SYSTEMS 에서 내놓은 firmware 를 올려볼 차례 입니다.

여러 버전들이 존재하지만, 단순히 ready 상태를 띄워놓고 프로그래밍 하는 방법과, AT command 를 활용하는 두가지 방법이 있습니다.


우선 NON-BOOT mode 의 firmware 를 올려보겠습니다.


8Mbit = 1MiB 를 지원하는 NON-BOOT 버전은 2.0.0 이 마지막 버전인 듯 합니다.

(다른 버전에는 noboot 라는 디렉토리와 관련된 파일이 아예 없슴)


* ESP8266 NONOS SDK V2.0.0 20160810

https://www.espressif.com/en/support/download/sdks-demos

esp8266_nonos_sdk_v2.0.0_16_08_10.zip



위의 압축파일을 풀어보면, "README.md" 파일에 address 정보가 나와 있습니다.


esp8266_nonos_sdk_v2.0.0_16_08_10\ESP8266_NONOS_SDK\bin\at\README.md



# NON-BOOT MODE
## download
    eagle.flash.bin              0x00000
    eagle.irom0text.bin          0x10000
    blank.bin
        Flash size 8Mbit:        0x7e000 & 0xfe000
        Flash size 16Mbit:       0x7e000 & 0x1fe000
        Flash size 16Mbit-C1:    0xfe000 & 0x1fe000
        Flash size 32Mbit:       0x7e000 & 0x3fe000
        Flash size 32Mbit-C1:    0xfe000 & 0x3fe000
    esp_init_data_default.bin (optional)    
        Flash size 8Mbit:        0xfc000
        Flash size 16Mbit:       0x1fc000
        Flash size 16Mbit-C1:    0x1fc000
        Flash size 32Mbit:       0x3fc000
        Flash size 32Mbit-C1:    0x3fc000


플러쉬 tool 에서 메모리 사이즈에 맞는 파일과 address 를 지정해 주면 됩니다.

저는 8Mbit = 1MiB 플레쉬 메모리 이므로 해당하는 값을 챙깁니다.



위의 설정에서 참고로, "CrystalFreq" 부분을 26M 로 하는 것은, 실제로 ESP8266 에서 26MHz 오실레이터를 사용하기 때문입니다.



플레쉬 회로 구성은 1편에서 자세히 다뤘습니다.

주의할 점은, flashing 할 때에는 아래처럼 "추가 전원" 이 꼭 필요하다는 점 잊지 마시구요.



Flash Download Tools 의 콘솔 화면입니다.



문제 없이 완료되면 위의 그림처럼 보입니다.

putty 로 접속하고, 만들어지 회로에서 RST 버튼을 누르면 아래처럼 ready 상태를 확인할 수 있습니다.






4. BOOT mode


BOOT mode 로 사용하게 되면 AT command 를 통해서 직접 ESP8266 을 컨트롤 할 수 있습니다.

1MiB 짜리 ESP8266 에 대응하는 BOOT mode 의 최신버전은 현재 기준 V2.2.1 인것 같습니다.

V3.0.0 이상으로 올라가면, flash memory 가 1MiB 초과하는 버전만 대응한다고 문서에 나와 있어요.


* ESP8266 NONOS SDK V2.2.1

https://www.espressif.com/en/support/download/sdks-demos

ESP8266_NONOS_SDK-2.2.1.zip



아래 AT Instruction Set 문서의 1.2.4 섹션을 보면 8Mbit Flash address 에 대해 나와있습니다.


* ESP8266 AT Instruction Set

https://www.espressif.com/en/support/download/documents?keys=&field_type_tid%5B%5D=14

4a-esp8266_at_instruction_set_en.pdf



위의 정보에서 boot.bin 부분을 boot_v1.6.bin 으로 바꿔서 flashing 하면 됩니다.

물론 동일한 디렉토리에 존재하는 boot_v1.7.bin 도 해봤습니다. 그치만 booting 되면 1.6 으로 뜨더군요.

아마 내부 로직으로 인하여 v1.7 은 overwrite 가 되지 않는것 같습니다.



Flash 잘 되었구요.

동영상도 올려 봅니다.



확인해 보니, 완전 최신으로 업데잇 되었습니다 (얏호~).



그치만 Ai-Thinker 는 web server 가 기본 장착되어 있지만, ESPRESSIF SYSTEMS 의 firmware 에는 없나 봅니다.

IP 를 얻고 접속해 봐도 web page 가 뜨지 않습니다.





FIN


이제 ESP8266 에 대한 firmware 방법은 마스터 한것 같습니다.

다음에는 AT command 활용과 sketch 올리는 법, 그리고 메모리 업그래이드 하는 방법을 시도해 보겠습니다.


And

Hardware | Breadboard Jumper 구입하기

|

1. 전자 취미의 시작


Arduino 와 Sensor 들을 연결할 때에는 빵판이 필수 입니다.

처음 이 취미를 시작한게 2016년이고, 그때 당시 구입했던 빵판과 전선을 아직 잘 사용하고 있습니다.


* 3.3V/5V MB102 Breadboard power module+MB-102 830 points Solderless Prototype Bread board kit +65 Flexible jumper wires

https://www.aliexpress.com/item/Breadboard-830-Point-Solderless-PCB-Bread-Board-MB-102-MB102-Test-Develop-DIY/32339925888.html



Jumper wire 는 당시 구성품을 한꺼번에 구입했을 때, 딸려오는 부품 정도였습니다.

오늘의 메인 주제는 아니지만, 해당 제품을 배송 받았을 때 사진이 있어, 기록용으로 올려봅니다.



한꺼번에 여러개를 주문했더니만 A4 용지만한 봉투로 배송되었습니다.



55 USD 가격의 물품을 한꺼번에 구입했었네요.

가족에 눈치가 보여서 정말 고민고민 하고 비교하여 주문했던게 생각나네요.



봉투가 찟어져 있었지만, 다행히 구성품에는 문제가 없었습니다.






2. Jumper Wire


다만, 2년간 사용하면서 점퍼의 문제점들을 느끼게 됩니다.


* 철심 끝단 마무리가 되어 있지 않아서 빵판에 꼽을 때, 자꾸 걸림

* 걸리게 되면 빵판 안쪽 점점도 그렇고 철심 자체도 휘게 됨

* 어떤 것은 'ㄷ' 자 형태의 철심이어서 속이 비어있는 박스같음

* 속이 빈 철심은 내구성도 약하여 쉽게 부러짐

* 빵판에 꼽힌 상태에서 부러지면 철심이 빵판에 꽂힌 상태가 되어, 그 자리는 못쓰게 됨

* 전선의 형태가 기존의 곧은 모양을 유지하려고 해서, 전선 10개정도만 넘어가도 빵판이 스파게티가 됨

* 플라스틱 가이드가 자꾸 벗겨져서 가끔 손으로 밀어 넣어줘야 함


쓰고보니 꽤 문제가 있었네요.

Jumper wire 는 좀 괜찮은 것으로 사용해 보고자 AliExpress 를 뒤지게 됩니다.





3. SOLID Jumper Wire


네, 딱딱한 jumper wire 가 팔리고 있네요.

플라스틱 가이드도 없고, 구부리는 모양으로 유지될 만한 두께인 듯 합니다.


* 140pcs Solderless Breadboard Jumper 22 AWG Solid Wires Cable Kit with Box 165 x 55 x 10mm For Arduino

https://www.aliexpress.com/item/140pcs-Solderless-Breadboard-Jumper-22-AWG-Solid-Wires-Cable-Kit-with-Box-165-x-55-x/32847326551.html



가격적인 부담이 워낙 적은 부품이라 크게 기대하지는 않았습니다.



배송은 잘 되었습니다.



첫 인상은 괜찮았습니다.

길이별로 따로 구분되어 있구요.


다만, 심의 두께는 빵판에 알맞게 들어가지만,

재질의 강도가 너무 연질이어서 심하게 구부렸다 피거나 자주 구부리면, 빵판 안에서 끊어질 가능성이 있어 보입니다.


동영상으로 조금 느껴 보아요.



또한 빵판에 꼽을 때, 어디엔가 조금이라도 걸리면 쉽게 구부러져 버리는게 단점입니다.

조금 값을 줘도 되니, 좀더 강질의 breadboard jumper 를 사용하고 싶네요.





4. 비교


처음 구입한 jumper 와 비교샷 입니다.



전선이 조금밖에 없는데도 수직으로 꼽혀서 왔다갔다 해야하니, 밑에 깔리는 센서나 OLED 의 시인성도 나빠집니다.


반면, 새로 구입한 jumper 는 빵판 상면에 붙어있다 싶이 하고,

구부리면 그 모양 그대로 유지해 주니, 회로 구성 시 새로운 세상이 열립니다.



조금 많이 연질이긴 하지만, 잘 구입한것 같아요.

조금 더 강질의 jumper 를 발견하면 또 올려보겠습니다.


And

Hardware | ATtiny85 개발 보드를 이용하여 Digispark 를 DIY 하기

|

마침내 깡통 ATtiny85 를 Digispark 버전으로 만드는 방법을 찾아서 포스팅 합니다.

Digispark 란, ATtiny85 에 직접 소스를 올려서 편하게 ATtiny85 을 이용한 개발을 할 수 있도록 한 Kickstarter 프로젝트 였습니다.

현재는 클라우드 펀딩에 성공하여 기성품으로 판매되고 있습니다.


* Digispark - The tiny, Arduino enabled, usb dev board!

https://www.kickstarter.com/projects/digistump/digispark-the-tiny-arduino-enabled-usb-dev-board


프로젝트로 성공하여 기성품도 나와 있을 정도니, 당연하게도(?) AliExpress 에서 clone 으로도 판매되고 있어요.

(Open source 이기도 하니 뭐...)

1,500 원 정도면 바로 살 수 있지만, 혼자 힘으로 만들어 보고자 궂이 힘든 방법을 택해 봅니다.


참고로, 지금까지 ATtiny85 를 이용하여 놀았던 포스팅은 다음과 같으니 먼저 참고해 주세요.

지금까지 놀았던 것은, 모두 이 Digispark clone 을 만들어 보기 위한 전단계 들이었습니다.


* Hardware | ATtiny85 를 사용해 보자 - 1

http://chocoball.tistory.com/entry/Hardware-ATtiny85-1


* Hardware | ATtiny85 를 사용해 보자 - 2

http://chocoball.tistory.com/entry/Hardware-ATtiny85-2





1. Digispark Bootloader 입히기 - Arduino ISP


ATtiny85 를 뭔가 작업을 걸려면 interfacing 해주는 arduino 가 필요합니다.

이 arduino 를 programmer 라고도 하기도 합니다만, 여튼 Arduino ISP 라는 소스를 올려놔야 동작합니다.


지금까지 여러 포스팅에서 다루었으므로 여기서는 간단하게 설명하겠습니다.

일단 "ArduinoISP" 소스를 arduino 에 올립니다.


File > Examples > 11.ArduinoISP > ArduinoISP






2. Digispark Bootloader 입히기 - ATtiny85 와 연결


Arduino 와 연결은 일반적인 ArduinoISP 시에 사용하는 연결법과 동일합니다.



  ATtiny85  | Arduino Nano
---------------------------
    VCC     |     5V
    GND     |     GND
    Reset   |     D10
    Pin 0   |     D11
    Pin 1   |     D12
    Pin 2   |     D13
---------------------------


실제 연결된 모습은 아래와 같아요.



이제 Arduino IDE 에서 ATtiny85 를 인식시켜야 합니다.

Boards Manager 에서 ATtiny85 가 떠서 선택할 수 있도록, 우선 Preferences 에서 다음과 같이 작업합니다.


File > Preferences > Additional Boards Manager URLs


https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json


그러면, 아래처럼 Boards Manager 에서 attiny 보드들을 선택할 수 있도록 해주는 파일들을 인스톨 할 수 있습니다.


Tools > Board > Boards Manager > Type : Contributed > attiny



여기까지 오면, Board 선택시 ATtiny 가 아래처럼 보입니다.


Tools > Board > ATtiny



ATtiny85 의 설정은 다음과 같이 맞춥니다.


* Board : ATtiny

* Processor : ATtiny85

* Clock : 1 MHz (internal)

* Port : Arduino ISP 가 연결된 Port

* Programmer : Arduino as ISP






3. micronucleus 부트로더 입히기


Digispark 는 Pin 숫자가 적어 제약이 많기 때문에 USB chip 따로 있지 않습니다.

그 대신에 bootloader 가 가상 USB 를 만들어서 PC 와 연결을 해주죠.


그 bootloader 가 micronucleus 라는 부트로더 입니다.

Digispark 는, 이 micronucleus 부트로더를 채용하고 있습니다.


지금까지 시행착오는 EEPROM 프로그램을 이용하여 직접 ATtiny85 에 쓰기를 시도했었지만,

아래 동영상을 보니, Arduino IDE 가 사용하는 "avrdude.com" 을 이용하는 방법이었습니다.


FUSE bit 도 정확하게 알려주더군요.

아래 동영상 제작자에게 감사를.


* Load Micronucleus to attiny85 using Arduino uno

https://www.youtube.com/watch?v=o7711jBQxmY


이 Fuse 설정이 중요한데, 잘못하다가는 ATtiny85 가 벽돌이 될 수 있습니다.

벽돌된 ATtiny85 를 복구하는 방법도 있는데, 이는 다른 기회에 다뤄 보기로 하겠습니다.


일단, 여기에 성공한 Fuse 설정을 적어 놓습니다.


   Fuse type  | value
----------------------
Low Fuse      | 0xe1
High Fuse     | 0xdd
Extended fuse | 0xfe
----------------------


Digispark 에서 사용하는 부트로더 파일인 micronucleus 를 다운로드 받아 놓습니다.


* Micronucleus V2.04

https://github.com/micronucleus/micronucleus

micronucleus-master.zip


다음으로, 최종 avrdude 실행 코드를 만들기 위해, 아무 소스나 uploading 이 성공한 소스를 arduino 에 올려 봅니다.



위에서 마지막 command 를 카피해서 notepad 등에 붙여서 avrdude 의 프로그램 위치나, config 파일의 장소를 확인합니다.

그리고 command 줄의 마지막 부분을 sketch 파일이 아닌, flash 문구를 붙여서 하나로 만듭니다.


C:\Users\chocoball\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino14/bin/avrdude -CC:\Users\chocoball\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino14/etc/avrdude.conf -v -pattiny85 -cstk500v1 -PCOM7 -b19200 -Uflash:w:C:\Users\chocoball\Documents\Arduino\libraries\micronucleus-master\firmware\releases\t85_default.hex:i -U lfuse:w:0xe1:m -U hfuse:w:0xdd:m -U efuse:w:0xfe:m


저의 경우 최종 모습이 위 command 입니다.

각 부분을 분리해 보면 다음과 같이 3개로 분해됩니다.


C:\Users\chocoball\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino14/bin/avrdude -C
C:\Users\chocoball\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino14/etc/avrdude.conf -v -pattiny85 -cstk500v1 -PCOM7 -b19200 -Uflash:w:
C:\Users\chocoball\Documents\Arduino\libraries\micronucleus-master\firmware\releases\t85_default.hex:i -U lfuse:w:0xe1:m -U hfuse:w:0xdd:m -U efuse:w:0xfe:m


위의 제일 마지막 부분이 micronucleus 부트로더인 t85_default.hex 와 fuse bit 를 지정한 command line 입니다.

이제 준비가 완료 되었습니다.


지금까지 해온 과정을 정리해 보면,

* Arduino ISP 로 연결

* micronucleus 부트파일 다운로드

* avrdude command line 생성


avrdude command line 이 완성되었으므로, 이제 실행시키면 됩니다.

실행은 Arduino IDE 에 복사하여 실행할 방법이 없으므로, command line 창에서 실행합니다.

Windows OS 의 경우는 다음과 같아요.


시작 > 검색 > Windows PowerShell



avrdude command 를 카피하여 PowerShell 에 붙여놓기 합니다.

두둥~!!!!!



실행!!!



Boom Boom Boom !!!


PS C:\> C:\Users\chocoball\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino14/bin/avrdu
de -CC:\Users\chocoball\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino14/etc/avrdude.
conf -v -pattiny85 -cstk500v1 -PCOM7 -b19200 -Uflash:w:C:\Users\chocoball\Documents\Arduino\libraries\micro
nucleus-master\firmware\releases\t85_default.hex:i -U lfuse:w:0xe1:m -U hfuse:w:0xdd:m -U efuse:w:0xfe:m

avrdude.exe: Version 6.3-20171130
             Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
             Copyright (c) 2007-2014 Joerg Wunsch

             System wide configuration file is "C:\Users\chocoball\AppData\Local\Arduino15\packages\arduino
\tools\avrdude\6.3.0-arduino14/etc/avrdude.conf"

             Using Port                    : COM7
             Using Programmer              : stk500v1
             Overriding Baud Rate          : 19200
             AVR Part                      : ATtiny85
             Chip Erase delay              : 400000 us
             PAGEL                         : P00
             BS2                           : P00
             RESET disposition             : possible i/o
             RETRY pulse                   : SCK
             serial program mode           : yes
             parallel program mode         : yes
             Timeout                       : 200
             StabDelay                     : 100
             CmdexeDelay                   : 25
             SyncLoops                     : 32
             ByteDelay                     : 0
             PollIndex                     : 3
             PollValue                     : 0x53
...


...
avrdude.exe: Device signature = 0x1e930b (probably t85)
avrdude.exe: safemode: lfuse reads as E1
avrdude.exe: safemode: hfuse reads as DD
avrdude.exe: safemode: efuse reads as FE
avrdude.exe: NOTE: "flash" memory has been specified, an erase cycle will be performed
             To disable this feature, specify the -D option.
avrdude.exe: erasing chip
avrdude.exe: reading input file "C:\Users\chocoball\Documents\Arduino\libraries\micronucleus-master\firmwar
e\releases\t85_default.hex"
avrdude.exe: writing flash (8124 bytes):

Writing | ################################################## | 100% 0.22s
...


...
Reading | ################################################## | 100% 0.01s

avrdude.exe: verifying ...
avrdude.exe: 1 bytes of efuse verified

avrdude.exe: safemode: lfuse reads as E1
avrdude.exe: safemode: hfuse reads as DD
avrdude.exe: safemode: efuse reads as FE
avrdude.exe: safemode: Fuses OK (E:FE, H:DD, L:E1)

avrdude.exe done.  Thank you.


Raw log 를 첨부해 놓습니다.


* Digispark bootloader log

Digispark_bootloader_upload.txt


성공 동영상이 빠지면 섭섭하겠죠?


여기까지 오면 다 성공한 것이나 마찬가지예요.





4. Digispark 드라이버 인스톨


Digispark 드라이버 설치 과정은 아래 동영상을 참고하였습니다.


* Installing Drivers and Programming the DigiSpark ATtiny85 dev boards - Tutorial

https://www.youtube.com/watch?v=MmDBvgrYGZs


Digispark 는 USB 계열의 device 이므로, 드라이버 인스톨이 필요합니다.

우선 최신 드라이버를 다운로드 받아 놓습니다.


* Digistump Arduino Release 1.6.7

https://github.com/digistump/DigistumpArduino/releases

Digistump.Drivers.zip




그러면, 아래처럼 장치 관리자에서 잠깐 떳다가 사라집니다.

장치 관리자 메뉴에서 "숨겨진 장치 보이기"로 하면, 불분명한 장치로 인식되어 있습니다.



해당 장치에서 마우스 오른쪽 클릭으로 드라이버 설치를 선택 후,

아까 다운로드 받은 드라이버를 해동시킨 폴더를 선택해 줍니다.



짜잔~~~!!!

Digispark 장치 디바이스 드라이버 인스톨에 성공했습니다.




그러면 장치 관리자에서 아래와 같이 등록된 것을 확인할 수 있습니다.



이제 다 왔네요.





5. Digispark 에 직접 소스 올리기


Digispark 가 정상적으로 인식되었으면, Arduino as ISP 나 중간 장치를 거치지 않고,

직접 USB 에 연걸하여 Arduino IDE 에서 직접 소스를 uploading 할 수 있습니다.


Digispark 보드를 Arduino IDE 에서 선택될 수 있도록 아래 과정을 거칩니다.


File > Preferences > Additional Boards Manager URLs



URLs 부분에, official 한 Digispark 링크를 걸어 줍니다.


http://digistump.com/package_digistump_index.json


이제 Boards Manager 로 가서 관련 파일을 등록해 줍니다.


Tools > Board > Boards Manager



Digistump 라고 검색하면 인스톨 할 페키지가 뜹니다.



위의 과정까지 마치면, 아래처럼 Board 메뉴에서 Digispark 를 선택할 수 있게 됩니다.


Tools > Boards > Digispark (Default - 16.5mhz)



Programmer 를 USBasp 로 바꾸고 소스를 uploading 합니다.



업로딩을 시작하면 소스를 컴파일 하고, 최종적으로 아래 문구가 뜨면서 IDE 가 대기합니다.


Running Digispark Uploader...

Plug in device now... (will timeout in 60 seconds)



이는 Digispark 는 USB 인터페이스 chip 을 가지고 있지 않고,

micronucleus 부트로더가 virtual USB 로 처리하므로, 장치관리자에서 지속적으로 인식하지 못합니다.

그래서 이렇게 필요시에 PC 가 준비단계가 되었을 때, USB 에 연결해 주면 됩니다.



연결하면, 위처럼 Digispark 를 IDE 내에서 인식하고 Digispark / ATtiny85 내장 EEPROM 을 지운 다음 새로운 코드를 쓰게 됩니다.





FIN


Digispark 가 ATtiny85 를 사용한다는 점에 착안하여,

깡통 ATtiny85 를 이용하여 Digispark 를 직접 만들어 보자고 한지 어언 6개월...


다른 포스트에서 다뤘듯 bootloader 에 대한 경험이 쌓이고 난 후가 되서야 완료할 수 있었습니다.


이제 소형/단순 control 을 위한 ATtiny85 이용시에는,

이 Micronucleus 가 사용된 Digispark clone 으로 직접 USB 와 연결하여 개발할 수 있겠네요.


모두 FUN Arduino~!!!

And

Hardware | MAX30105 파티클 센서 - 2

|

이 글은 이전 MAX30105 파티클 센서를 활용하여 OLED 에 심전도를 그려보는 도전기 입니다.

이전 글은 아래 link 를 참고하세요.


* Hardware | MAX30105 파티클 센서 - 1

http://chocoball.tistory.com/entry/Hardware-MAX30105-particle-sensor-1





1. min, max 와 scalar


일단 MAX30105 에서 입력받는 값은 5만에서 많게는 10만도 넘어갑니다.

이를 32 pixel 너비를 갖는 OLED 에 표현하려면 그 값에 맞도록 축소시켜야 합니다.



이에 더하여, 값들의 기준이 아래 그림처럼 널을 뛰므로 기준값을 잡기가 여간 쉽지 않습니다.



기준값을 잡기 위해 min, max 값을 한 사이클당 판별하여 scale in 치환값을 잡아줘야 합니다.


이를 위해 일단, 이전 사이클에서 얻은 제일 작은 min 값을 이용하여,

입력받는 값에서 빼면 그래프가 아래 그림처럼 내려갑니다.



OLED 폭이 128 pixel 이므로, 이 폭을 한 사이클로 잡습니다.

EXCEL 을 통하여 위의 방식을 검증해 본 결과 문제 없이 표현되는 것을 확인할 수 있었습니다.



OLED 의 y 값에 해당하는 값을 EXCEL 에서 32 pixel 기준으로 변환된 값을 array 에 입력하고

순서대로 출력해서 OLED 에 맞는지 최종 확인해 봅니다.



요리조리 검증해 본 결과 아래 식을 통해서 min, max 값과 한 사이클을 OLED 폭인 128 에 표현하고

다시 0 부터 시작하는 - 화면이 바뀌는 방법을 확인하였습니다.


	irValue = particleSensor.getIR();
	
	if( x > 127) { //refresh OLED screen
		display.clearDisplay();
		lastx=0;
		x=1;
		
		scaler = (max_irValue - min_irValue) / 32;
		pre_min_irValue = min_irValue;
		
		// reset min, max value
		max_irValue = irValue;
		min_irValue = irValue - 1;
	}





2. y값 reverse


OLED 에 표현시, x/y 값은 우리가 일반적으로 배운 왼쪽 아래에서 시작되는 것이 아니라,

왼쪽 위로부터 값의 증가를 표현합니다.



즉, sensor 로부터 값을 입력 받으면, 상하 전치를 시켜줘야 합니다.

제가 쓰고 있는 것은 상하 32 pixel 이므로, 아래 한 pixel 을 빼면 31 이므로,

31 에서 입력받은 값을 빼주면 표현하고자 하는 위치로 바꿀 수 있습니다. 



	// invert y values to fit OLED display
	if ( pre_min_irValue > irValue) {
		y = 31;
	} else {
		y = 31 - ((irValue - pre_min_irValue) / scaler);
	}

값이 너무 적어지면, 값이 역전하여 아래 그림같이 튀어버립니다.

그래서 전 사이클에서 확인 되었던 min value 보다 적어지면 강제적으로 최저값을 할당합니다.

여기서 "y = 31" 은 OLED 상에서는 제일 밑에 표시되는, 일상의 0 값과 같습니다.






3. BPM 과 piezo buzzer


심전도의 값이 가장 높아지면 buzzer 를 울리게 하는 소스 입니다.

또한 BPM 값도 표현해 줍니다.


BPM 값은 심전도의 한 사이클 평균을 내어 1분동안 얼마나 맥박이 뛰는지를 수치화 한 값입니다.



소스는 다음과 같고, 아래 blog 를 전면 참고하였습니다.


* Heart beat Sensor and “ECG” Display

http://www.xtronical.com/basics/heart-beat-sensor-ecg-display/


	ThisTime=millis();
	if( y < UpperThreshold ) {
		if(BeatComplete) {
			BPM=ThisTime-LastTime;
			BPM=int(60/(float(BPM)/1000));
			BPMTiming=false;
			BeatComplete=false;
			tone(2,1000,250);
		}
		if(BPMTiming==false) {
			LastTime=millis();
			BPMTiming=true;
		}
	}
	if((y > LowerThreshold) && (BPMTiming))
		BeatComplete=true;






4. source


지금까지의 작업을 모두 합하여 하나의 소스로 만들었습니다.


#include "Wire.h"
#include "MAX30105.h"

#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_SSD1306.h"

// Hardware SPI
#define OLED_DC     6
#define OLED_CS     7
#define OLED_RESET  8
Adafruit_SSD1306 display(OLED_DC, OLED_RESET, OLED_CS);

MAX30105 particleSensor;

unsigned int irValue;
unsigned int max_irValue;
unsigned int min_irValue;
unsigned int x = 0;
unsigned int y;
unsigned int lastx = 0;
unsigned int lasty = 0;
unsigned int scaler;
unsigned int pre_min_irValue;
int BPM;
int LastTime = 0;
int ThisTime;
bool BPMTiming=false;
bool BeatComplete=false;
#define UpperThreshold 10
#define LowerThreshold 25

void setup() {
  Wire.begin();
  display.begin(SSD1306_SWITCHCAPVCC);
  display.clearDisplay();
  
  // initialize sensor
  if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) { //Use default I2C port, 400kHz speed
    display.println("MAX30105 was not found. Please check wiring/power.");
    while (1);
  }
  
  //Setup to sense a nice looking saw tooth on the plotter
  byte ledBrightness = 0x1F; //Options: 0=Off to 255=50mA
  byte sampleAverage = 8; //Options: 1, 2, 4, 8, 16, 32
  byte ledMode = 3; //Options: 1 = Red only, 2 = Red + IR, 3 = Red + IR + Green
  int sampleRate = 1000; //Options: 50, 100, 200, 400, 800, 1000, 1600, 3200
  int pulseWidth = 411; //Options: 69, 118, 215, 411
  int adcRange = 4096; //Options: 2048, 4096, 8192, 16384
  
  particleSensor.setup(ledBrightness, sampleAverage, ledMode, sampleRate, pulseWidth, adcRange); //Configure sensor with these settings
  
  // initiate min, max values
  irValue = particleSensor.getIR();
  max_irValue = irValue;
  min_irValue = max_irValue - 1; 
  for (int ini ; ini < 100 ; ini++) {
	  irValue = particleSensor.getIR();
	  
	  if (max_irValue < irValue) {max_irValue = irValue;}
	  if (min_irValue > irValue) {min_irValue = irValue;}
  }
  
  display.display();
}

void loop() {
	irValue = particleSensor.getIR();
	
	if( x > 127) { //refresh OLED screen
		display.clearDisplay();
		lastx=0;
		x=1;
		
		scaler = (max_irValue - min_irValue) / 32;
		pre_min_irValue = min_irValue;
		
		// reset min, max value
		max_irValue = irValue;
		min_irValue = irValue - 1;
	}
	
	display.setTextColor(WHITE);
	ThisTime=millis();

	// invert y values to fit OLED display
	if ( pre_min_irValue > irValue) {
		y = 31;
	} else {
		y = 31 - ((irValue - pre_min_irValue) / scaler);
	}
	
	// draw heartbeat lins
	display.drawLine(lastx, lasty, x, y, WHITE);
	lasty = y;
	lastx = x;
	
	// update min, max values
	if (max_irValue < irValue) {max_irValue = irValue;}
	if (min_irValue > irValue) {min_irValue = irValue;}
	
	ThisTime=millis();
	if( y < UpperThreshold ) {
		if(BeatComplete) {
			BPM=ThisTime-LastTime;
			BPM=int(60/(float(BPM)/1000));
			BPMTiming=false;
			BeatComplete=false;
			tone(2,1000,250);
		}
		if(BPMTiming==false) {
			LastTime=millis();
			BPMTiming=true;
		}
	}
	if((y > LowerThreshold) && (BPMTiming))
		BeatComplete=true;
	
	// display BMP
	display.fillRect(0,24,64,32,BLACK);
	display.setCursor(0,24);
	display.print("      BPM");
	display.setCursor(0,24);
	display.print(BPM);
	
	// check finger is on the sensor
	if (irValue < 10000) { display.setCursor(1,1); display.print("NO Finger?"); }
	
	// display all data to OLED
	display.display();
	x++;
}


결과 동영상을 올려 봅니다.







FIN


이걸 구현해 보려고 3주간 주말 = 토, 일 이틀간 x 3 = 6일 동안 삽질의 연속이었습니다.

이 문제는 소스에서 scalar 를 구하기 위한 나누기를 해야 하는데, % 연산자를 사용했기 때문이었습니다.


* Modulo

https://www.arduino.cc/reference/en/language/structure/arithmetic-operators/modulo/


% 연산자는 몫을 구하는 것이 아니라, 나머지를 구하는 연산자지요!!!

반대로 알고 있었던 것. 이걸 알아 차리는데 6일이나 걸렸습니다!!!



변수의 갯수도 줄여 보기도 하고, 각 값을 먼저 scale in 해서 결과를 내보기도 하고, 하여간 별짓 다 했습니다.

처음에 디버깅만 잘 했어도 이렇게 오래 걸리지는 않았을 듯 하네요.

디버깅 작업이 얼마나 중요한지 새삼 깨닳았습니다.



이렇게 하면 Serial Monitor 에도 이렇게 나오니 환장할 노릇이었습니다.


이 덕에 Hardware SPI 활용과 OLED refresh rate 등등을 공부하게 되었네요.

아이고야... 좀 쉬자.


SpO2 농도 값이나, 그래프를 좀더 안정적으로 보여줄 수 있도록 소스를 더 다듬고 싶었지만,

에너지를 너무 많이 써서 이번 작업은 여기까지 하겠습니다.


나중에 다시 생각나면, 소스코드를 다시 잡아 볼께요.


And

Hardware | MAX30105 파티클 센서 - 1

|

1. 파티클 센서


인터넷을 돌아다니다 particle sensor 라는 것을 알게 되었습니다.

이게 단순히 공기중의 입자를 확인하는것 뿐만아니라, 혈중 농도 및 심전도까지 확인할 수 있다고 합니다.


나중에 도플러 효과를 이용한 원격 심전도 확인 시스템을 만들 예정이라,

기초적인 지식을 습득하기 위해 일단 이런 류의 센서 사용법을 익혀 보기로 합니다.






2. 주문


물론 AliExpress 에서 주문했습니다.


* CFsunbird High Accuracy I2C MAX30105 Particle Optical Sensor Photodetectors Board Module 1.8V power supply

https://ko.aliexpress.com/item/CFsunbird-High-Accuracy-I2C-MAX30105-Particle-Optical-Sensor-Photodetectors-Board-Module-1-8V-power-supply/32819571918.html




여타 센서류보다 단일 부품으로는 꽤나 비싼편 입니다.

이는 다양한 기능이 들어가 있으며, 기본 소자 자체가 좀 있어 보입니다.


SparkFun 에서 팔고 있는 제품인데, AliExpress 에서 구입하다 보니, 조금 변형된 중국 제품입니다.

단, 소스는 완벽하게 호환됩니다.


* SparkFun Particle Sensor Breakout - MAX30105

https://learn.sparkfun.com/tutorials/max30105-particle-and-pulse-ox-sensor-hookup-guide


보통 정식 제품보다는 AliExpress 가 싼 편인데, 이 제품은 자비가 없군요.

AliExpress 에서 약 12 USD, SparkFun 제품은 13 USD 정도 합니다.





3. 도착


크게 무리없이 2주만에 도착.



납땜이 되지 않은 상태로 배달이 됩니다. 이제 AliExpress 에서 오는 것은 이게 당연한 거죠?



핵심이 되는 센서 부품을 클로즈 업 해봤습니다.



범상치 않아 보이는군요.





4. 연결


Arduino 와의 연결은 다음과 같습니다.


 MAX30105 | Arduino Nano
-------------------------
    VCC   |     3.3V
    GND   |     GND
    SDL   |     A5
    SDA   |     A4
-------------------------


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

Fritzing 에서 그려 보는데, 아쉽게도 아직 Fritzing 에서는 MAX30105 부품이 리스트에 존재하지 않습니다.

아직 아무도 만들지 않았나 봅니다.



Datasheet 입니다 - MAX30105_3.pdf





5. sketch - Red, IR, Green reading


이후 나오는 소스는 모두 아래 site 를 참고하였습니다.


* SparkFun Particle Sensor Breakout - MAX30105

https://learn.sparkfun.com/tutorials/max30105-particle-and-pulse-ox-sensor-hookup-guide


Library 를 인스톨 하고 가장 간단한 스케치를 로드하여 확인해 봅니다.

소스는 소자의 기본 동작인 빨간색, 적외선, 녹색을 감지하고 수치화 하는 스케치 입니다.


File > Examples > MAX3010x Pulse and Proximity Sensor > Example1_Basic_Readings



실제 소스를 여기에 옮겨 봅니다.


/*
  MAX30105 Breakout: Output all the raw Red/IR/Green readings
  By: Nathan Seidle @ SparkFun Electronics
  Date: October 2nd, 2016
  https://github.com/sparkfun/MAX30105_Breakout

  Outputs all Red/IR/Green values.

  Hardware Connections (Breakoutboard to Arduino):
  -5V = 5V (3.3V is allowed)
  -GND = GND
  -SDA = A4 (or SDA)
  -SCL = A5 (or SCL)
  -INT = Not connected

  The MAX30105 Breakout can handle 5V or 3.3V I2C logic. We recommend powering the board with 5V
  but it will also run at 3.3V.

  This code is released under the [MIT License](http://opensource.org/licenses/MIT).
*/

#include "Wire.h"
#include "MAX30105.h"

MAX30105 particleSensor;

#define debug Serial //Uncomment this line if you're using an Uno or ESP
//#define debug SerialUSB //Uncomment this line if you're using a SAMD21

void setup() {
  debug.begin(9600);
  debug.println("MAX30105 Basic Readings Example");

  // Initialize sensor
  if (particleSensor.begin() == false)
  {
    debug.println("MAX30105 was not found. Please check wiring/power. ");
    while (1);
  }

  particleSensor.setup(); //Configure sensor. Use 6.4mA for LED drive
}

void loop() {
  debug.print(" R[");
  debug.print(particleSensor.getRed());
  debug.print("] IR[");
  debug.print(particleSensor.getIR());
  debug.print("] G[");
  debug.print(particleSensor.getGreen());
  debug.print("]");

  debug.println();
}


우선 구동을 시작하면, 녹색과 빨간색 빛이 빠르게 점멸합니다.



저렇게 빛을 쏜 다음 반사되는 값을 읽는것이겠죠?



손가락을 센서 근처로 가져가면 값의 변동이 일어납니다.


센서의 불빛을 슬로우 모션으로 9초동안 찍어 봤습니다.

그랬더니 51초짜리 동영상이 되었네요.



얼마나 빨리 점멸을 하는지, 슬로모션으로 찍어도 실제로 보는것과 그리 차이나지 않습니다.





6. sketch - 물체 인식


IR 의 delta 값을 이용하여 물체가 일정 이상 안에 들어와 있는지 없는지를 판단합니다.

소스는 아래 path 에서 확인할 수 있습니다.


File > Examples > MAX3010x Pulse and Proximity Sensor > Example2_Presense_Sensing






7. sketch - 온도


SparkFun 사에서 제공되는 library 에서 "readTemperature()" 함수를 그대로 이용한 것 입니다.

그럼 위의 함수는 어떻게 되느냐 하면 아래와 같습니다.


// Die Temperature
// Returns temp in C
float MAX30105::readTemperature() {
  // Step 1: Config die temperature register to take 1 temperature sample
  writeRegister8(_i2caddr, MAX30105_DIETEMPCONFIG, 0x01);

  // Poll for bit to clear, reading is then complete
  // Timeout after 100ms
  unsigned long startTime = millis();
  while (millis() - startTime < 100)
  {
    uint8_t response = readRegister8(_i2caddr, MAX30105_DIETEMPCONFIG);
    if ((response & 0x01) == 0) break; //We're done!
    delay(1); //Let's not over burden the I2C bus
  }
  //TODO How do we want to fail? With what type of error?
  //? if(millis() - startTime >= 100) return(-999.0);

  // Step 2: Read die temperature register (integer)
  int8_t tempInt = readRegister8(_i2caddr, MAX30105_DIETEMPINT);
  uint8_t tempFrac = readRegister8(_i2caddr, MAX30105_DIETEMPFRAC);

  // Step 3: Calculate temperature (datasheet pg. 23)
  return (float)tempInt + ((float)tempFrac * 0.0625);


센서 내부에 register 값을 읽어와서 표현하는 것이군요.

구동 소스는 아래 path 에서 확인할 수 있습니다.


File > Examples > MAX3010x Pulse and Proximity Sensor > Example3_Temperature_Sense







8. sketch - 심전도


손가락을 센서에 대고 있으면 심전도를 그려주는 소스 입니다.


File > Examples > MAX3010x Pulse and Proximity Sensor > Example4_HeartBeat_Plotter


읽어들인 IR 값에 대한 변화를 plottor 을 이용해 그려주는 것이죠.
소스를 보면 setup 과 기준값 등을 정해주는 부분이 있을 뿐, 단순히 IR 값을 불러옵니다.

아래처럼 보려면, Tools > Serial Plotter 를 통해서 확인할 수 있습니다.


저의 심전도 모양입니다. 두근두근...





9. sketch - 심박수


대체로 심전도와 비슷한데, 이걸 1분에 몇분 정도 뛰는지를 확인해 주는 소스 입니다.

보통 병원이나 건강검진시 확인해 보는 심박수 겠죠?


구동 소스는 아래 path 에서 확인할 수 있습니다.


File > Examples > MAX3010x Pulse and Proximity Sensor > Example5_HeartRate







FIN


MAX30105 센서는 주로, 심박수 모니터링에 사용되는게 가장 적절해 보입니다.

인터넷에서 어느 분이, 이와 비슷한 센서를 이용하여 심박수를 OLED 에 표시해주는 것까지 해놓은 글이 아래 입니다.


* Heart beat Sensor and “ECG” Display

http://www.xtronical.com/basics/heart-beat-sensor-ecg-display/


저도 따라해 봤는데,

일단 센서에서 나오는 값 자체가 MAX30105 처럼 큰 값으로 나오지 않을 뿐더러,

값의 변화가 딱 OLED 크기만큼 잘 구현이 되어 있어서 잘 하신것 같은데, 도저히 따라해도 안되는군요.



겨우겨우 우겨 넣어서 OLED 에 보여주는 것 까지는 해 봤습니다.

이것 가지고는 만족스럽지 못하여, 못하는 코딩을 이용하여 한번 도전해 보겠습니다.


병원에서 보는 듯 한 모습으로 될 때까지 만들어서 공유해 볼께요.



And
prev | 1 | 2 | 3 | 4 | 5 | 6 | ··· | 10 | next