'분류 전체보기'에 해당되는 글 335건

  1. 2018.03.01 Hardware | HC-SR501 PIR motion sensor - 2 2
  2. 2018.02.28 Hardware | Arduino 로 Photoresister 가지고 놀기 - 2
  3. 2018.02.19 Hardware | Digitial Compass - HMC5883L 사용기 - 1
  4. 2018.02.11 Hardware | MAX4466 마이크 앰프 breakout board 사용해 보기
  5. 2018.02.11 Hardware | 2.54mm pin header 구매하기
  6. 2018.02.04 Life | 샤오미 미밴드 1S 손목밴드 교환기
  7. 2018.01.27 Hardware | LED 구매하기
  8. 2018.01.19 Hardware | Flight Feeder 를 신청해 보자 15
  9. 2018.01.12 Hardware | SSD1309 128x64 1.54" yellow OLED 2
  10. 2017.12.28 Hardware | HY-SRF05 초음파 거리 측정기를 사용해 보자

Hardware | HC-SR501 PIR motion sensor - 2

|

1. 시작


HC-SR501 을 가지고 움직임이 있을 시 반응하는 센서를 가지고 놀아 봤더랬습니다.


* Hardware | HC-SR501 PIR motion sensor

http://chocoball.tistory.com/entry/Hardware-HCSR501-PIR-motion-sensor


그러던 중, Photoresistor 단자를 발견합니다.



아래는 HC-SR501 회로도 입니다.



제조사의 사이트에 올라와 있는 회로도와 실제 기판을 봐도 이미 R3 (1MΩ) 이 실장되어 있어서,

제대로 된 값의 photoresistor 만 달면 기능하게 되어 있네요.


좀더 찾아 보니, 아예 세트로 파는 업자도 있습니다.



요는 photoresistor 를 이용하여, 항상 모션 탐지를 하는 것이 아니라,

어두워졌을 때에만 작동하도록 하는 것 입니다.


흠흠, 그럼 photoresistor 를 구입해야 겠죠?





2. Photoresistor 가지고 놀기


HC-SR501 에 photoresistor 를 붙여서 구동하기 위해, 우선 photoresistor 를 가지고 놀아봅니다.


* Hardware | Arduino 로 Photoresister 가지고 놀기 - 1

http://chocoball.tistory.com/entry/Hardware-Arduino-Photoresister-1


이때 구입한 제품이 GL5528.

간단한 동작을 확인 했으니, 본격적으로 HC-SR501 에 붙여 봅니다.





3. HC-SR501 에 납땜하기


Photoresistor 는 RL 이라는 자리에 납땜하면 됩니다.

+/- 전극 구분이 없어서 그냥 두 다리 고정하고 납땜하면 됩니다.



높이 잘 계산해서 올려주고요.



장착되면 위와 같은 모습이 됩니다.



다리를 옆으로 벌려서 흔들리지 않게 하고 납땜합니다.



짜잔 !!!




4. Layout 및 Sketch


구성은 예전 글에서 사용했던 구성과 sketch 와 완벽히 동일합니다.


HC-SR501 PIR sensor | Arduino Nano
----------------------------------
         S          |     D8
         +          |     5V
         -          |     GND
----------------------------------
 
    Piezo busser    | Arduino Nano
----------------------------------
         S          |     D11
         +          |     5V
         -          |     GND
----------------------------------


회로 구성입니다.



Sketch 입니다.


/*******************************************************
 
Uses a PIR sensor to detect movement, sounds a buzzer
 
*******************************************************/
//the time we give the sensor to calibrate (10-60 secs according to the datasheet)
int calibrationTime = 30;
 
int ledPin = 13; // choose the pin for the LED
int inputPin = 8; // choose the input pin (for PIR sensor)
int pirState = LOW; // we start, assuming no motion detected
int val = 0; // variable for reading the pin status
int pinSpeaker = 11; //Set up a speaker on a PWM pin (digital 9, 10, or 11)
 
void setup() {
pinMode(ledPin, OUTPUT); // declare LED as output
pinMode(inputPin, INPUT); // declare sensor as input
pinMode(pinSpeaker, OUTPUT);
 
//give the sensor some time to calibrate
Serial.begin(9600);
Serial.print("Calibrating sensor ");
  for(int i = 0; i < calibrationTime; i++) {
    Serial.print(".");
    delay(1000);
  }
  Serial.println(" Done!");
  Serial.println("SENSOR is ACTIVE now");
  delay(50);
}
 
void loop() {
  val = digitalRead(inputPin); // read input value
  if (val == HIGH) { // check if the input is HIGH
    blinky(); // blink LED when motion haas been detected
    // digitalWrite(ledPin, HIGH); // turn LED ON
    playTone(300, 160);
    delay(150);
     
    if (pirState == LOW) {
    // we have just turned on
      Serial.println("Motion detected!");
      // We only want to print on the output change, not state
      pirState = HIGH;
    }
  } else {
    digitalWrite(ledPin, LOW); // turn LED OFF
    playTone(0, 0);
    delay(300);
 
    if (pirState == HIGH){
    // we have just turned off
      Serial.println("Motion ended!");
      // We only want to print on the output change, not state
      pirState = LOW;
    }
  }
}
 
void playTone(long duration, int freq) {
  // duration in mSecs, frequency in hertz
  duration *= 1000;
  int period = (1.0 / freq) * 1000000;
  long elapsed_time = 0;
 
  while (elapsed_time < duration) {
    digitalWrite(pinSpeaker,HIGH);
    delayMicroseconds(period / 2);
    digitalWrite(pinSpeaker, LOW);
    delayMicroseconds(period / 2);
    elapsed_time += (period);
  }
}
 
void blinky() {
  for(int i=0; i<3; i++) {
    digitalWrite(13, HIGH);
    delay(200);
    digitalWrite(13, LOW);
    delay(200);
  }
}





5. 흠...


손으로 photoresistor 를 가리면 동작은 하는데, 기민하게 동작하지 않았습니다.


원래 회로는 short 된 회로인데,

photoresistor 를 연결하면 광원이 있는 곳에서 close 상태로 만들어 주어 모션 감지를 하지 않게 (disable) 됩니다.


주위가 어두워 지면 photoresistor 의 dark resistance 가 올라가

원래 회로가 가지고 있던 short 상태를 만들어 주는 것인데,

어정쩡하게 저항이 발생하면 제대로 short 된 상태로 넘어가지 못하는 것이었습니다.


뭔가 Photoresistor 가 망가졌나? 생각하고 다른 GL5528 센서로 교환하다, 옆에 있던 캐패시터 옆구리를 지져버렸습니다.

아놔...


다행히 기존에 구입해 놨던 capacitor 가 있어서 교체합니다.


* Hardware | AliExpress 에서 condenser 를 구입해 보자

http://chocoball.tistory.com/entry/Hardware-AliExpress-condenser-buy



기존의 capacitor 보다는 굵은 소자라 뭔가 신뢰가 가네요.






6. 다른 Photoresistor


Capacitor 를 교환했고, photoresistor 도 교환했음에도 불구하고 여전히 기민하게 동작하지 않습니다.

Photoresistor 를 가리고 한참 기다리고 있어도 운 좋으면 detecting 하고, 그렇지 않으면 아무 반응이 오지 않았습니다.


결국 구입한 photoresistor 의 수치적인 한계라고 확신하고, 다른 photoresistor 를 구입해서 테스트 해보기로 합니다.


처음 구입할때는 보이지 않았던, 5가지 묶음 세트가 있네요.

바로 구입합니다. (아니 왜 저 세트로 처음부터 안파냐고...)


* Photoresistor Kit 5Kindsx10pcs 5506 5516 5528 5537 5539 Light Dependent Resistor LDR Pack Photoresistor Package for Arduino

- https://ko.aliexpress.com/item/Photoresistor-Kit-5Kindsx10pcs-5506-5516-5528-5537-5539-Light-Dependent-Resistor-LDR-Pack-Photoresistor-Package-for/32812625860.html



각 소자 번호에 따라 어떤 값을 보이는지 테스트 해봤습니다.


* Hardware | Arduino 로 Photoresister 가지고 놀기 - 2

http://chocoball.tistory.com/entry/Hardware-Arduino-Photoresister-2


수치를 그래프화 해본 결과, 처음 구입한 GL5528 (녹색) 은 가장 어둡게 해도

dark resistance 가 조금 높게 나옵니다. (스펙상으로는 1MΩ 이긴 한데...)



확인 결과 새로 구입한 세트에 있는 5539 (하늘색) 이 더 높은 dark resistance 를 보여 줬습니다.

어둡게 하면 거의 short 상태를 만들어 줄 수 있을 것 같습니다.



수치적으로도 5MΩ 정도면 short 상황을 만들 수 있겠네요. 





7. 구동 확인


기존 GL5528을 제거하고 새로 구입한 5539 를 납땜해 주었습니다.

이제 대망의 마지막 확인 입니다.



5539 photoresistor 는 센서의 구불구불이 더 촘촘하네요.



어둡게 하면 의도대로 잘 동작합니다.



Photoresistor 에 샤프심 캡을 씌워, 어두운 상황을 만들어 동작 시키니 예상대로 반응합니다.




FIN


작년 7월에 처음 photoresistor 를 구매하여 실패의 실패를 거듭하여 겨우 확인 했습니다.

HC-SR501 센서는 이제 서랍으로 들어갈 수 있게 되었습니다.


Photoresistor 는 종류와 가용 범위가 많아서 잘 선택하고 사용해야겠습니다.


이제야 마음 편하게 다른 센서들 공부를 할 수 있겠네요.


And

Hardware | Arduino 로 Photoresister 가지고 놀기 - 2

|

1. 시작


Photoresistor 를 가지고 놀아 봤더랬습니다. (아래 글)


* Hardware | Arduino 로 Photoresister 가지고 놀기 - 1

http://chocoball.tistory.com/entry/Hardware-Arduino-Photoresister-1



다만, 위의 사진에서 보이듯 광원을 받는 센서부의 홈 갯수가 적어 보이는 것 같았습니다.

밑의 사진처럼 촘촘하면, 뭔가 더 예민하게 반응할 것 같았습니다.



이미 PIR motion sensor 에도 GL5528 을 가지고 적용해 봤으나 (아래 글),

완벽한 어둠이 있지 않으면 동작하지 않아, 적당한 어둠에도 동작하도록 하기 위해 위와 같이 촘촘한 센서를 찾아보게 됩니다.


* Hardware | HC-SR501 PIR motion sensor

http://chocoball.tistory.com/entry/Hardware-HCSR501-PIR-motion-sensor





2. 주문


AliExpress 를 뒤져 봅니다.

제가 GL5528을 구입할 때만 해도 다양한 센서를 한묶음으로 파는 경우를 못본것 같은데, 이제는 팔고 있네요.


* Photoresistor Kit 5Kindsx10pcs 5506 5516 5528 5537 5539 Light Dependent Resistor LDR Pack Photoresistor Package for Arduino

https://ko.aliexpress.com/item/Photoresistor-Kit-5Kindsx10pcs-5506-5516-5528-5537-5539-Light-Dependent-Resistor-LDR-Pack-Photoresistor-Package-for/32812625860.html




미리 이런게 있었더라면...

하면서 바로 주문을 넣습니다.


다양한 센서라 그런지, 다른 부품들보다는 다소 비싼 편 입니다. 한, 500원 정도 ?! :-)





3. 도착


한 2주 걸려서 도착했습니다. 알리에서 주문한 것 치곤 빠른 편 입니다.



스폰지 형태로 잘 포장되어 왔구요.



한뭉텅이로 왔구요.



각 부품이 10개씩 포장되어 들어 있구요.



네 그렇습니다.

이렇게 촘촘한 photoresistor 센서를 얻기 위해, 첫번째 시행착오를 거쳐 두번째 구매를 하게 된 것이죠.


다만, 각 센서의 감도 차이를 알고 싶어졌습니다.

물론 spec. 문서를 보면 나와 있습니다만, 주변의 빛의 세기에 따라 어떤 형태의 값들로 움직이는지 보고 싶었습니다.


또한 예전에 구입한 GL5528 이 다른 센서들과 비교하여,

PIR 센서에 적합한 센서를 찾기 위해 값을 비교해 보기로 합니다.





4. Layout


입력은 5V 이지만, 0~1023 레벨로 결과값을 받을 수 있게, 3.3V 를 AREF pin 에 연결합니다.

저도 이번에 AREF를 사용하면서 AREF 의 용도를 알게 되었습니다.


AREF 에 대해서는 따로 정리해 봤습니다.


* Hardware | Arduino 의 AREF pin 에 대해 알아보자

http://chocoball.tistory.com/entry/Hardware-Arduino-AREF-pin



아래는 구성도 입니다.



아래는 실제 배선 샷 입니다.



사진에는 마지막에 추가한 GL5528 이 없습니다.

이 테스트를 하기 전에 사진을 찍은 후, 자고 일어났더니 예전 GL5528 이 생각이 나, 추가하여 결과값을 추출하였습니다.



저항은 10k ohm 입니다.

이는 아래 사양서에서 볼 수 있듯이, 일반적인 낮의 100 lux 에서 대략 10k ohm 의 값을 가지기 때문입니다.






5. Sketch


원리는 다음과 같습니다.


V = IR


* case 1 : 10KΩ

  - 10KΩ + 10KΩ = 20KΩ

  - I = 5V / 20KΩ = 0.25mA

  - 0.25mA * 10KΩ = 2.5V

  - 5V - 2.5V = 2.5V --> analog input


* case 2 : 30KΩ

  - 30KΩ + 10KΩ = 40KΩ

  - I = 5V / 40KΩ = 0.125mA

  - 0.125mA * 30KΩ = 3.75V

  - 5V - 3.75V = 1.25V --> analog input


* case 3 : 100KΩ

  - 100KΩ + 10KΩ = 110KΩ

  - I = 5V / 110KΩ = 0.045mA

  - 0.045mA * 100KΩ = 4.54V

  - 5V - 4.54V = 0.54V --> analog input


less light --> more resistance --> less analog input

more light --> less resistance --> more analog input


결론은,

많은 광량일 경우는 높은 치수를, 즉 낮은 저항 수치를 가지고,

적은 광량일 경우는 낮은 치수를, 즉 높은 저항 수치를 가지고 서로의 성능을 비교하는 과정입니다.


지금까지의 과정과 아래 소스는 다음 blog 를 참조하였습니다.


* Photo resistors, in depth

https://piandmore.wordpress.com/2016/10/14/photo-resistors-in-depth/


예전에 구입한 GL5528 를 A5 에 추가 연결하였으므로, 소스에서도 입력과 출력에 대해 A5 를 추가하였습니다.


////////////////////////////////////////////////////////////////////////////////////
//
//                               PI and more
//                      Photo resistors in depth
//
// https://piandmore.wordpress.com/2016/10/14/photo-resistors-in-depth/
//
////////////////////////////////////////////////////////////////////////////////////
//
// The number of steps after which the header is repeated
//
#define STEPCOUNT 10
//
// The current step count
//
byte step = STEPCOUNT;

void setup() {
  //
  // Setup serial
  //
  Serial.begin(115200);
  Serial.println("Ready");
  //
  // Set the reference for measuring the analog signals
  // For some reason I got incorrect readings without connecting
  // the 3.3v (on my Arduino Nano) to AREF and setting this
  // reference
  analogReference(EXTERNAL);
  //
  // Setup all analog inputs. We are using 5 which is the maximum
  // for the Nano on which I tested.
  //
  pinMode(A0,INPUT);
  pinMode(A1,INPUT);
  pinMode(A2,INPUT);
  pinMode(A3,INPUT);
  pinMode(A4,INPUT);
  pinMode(A5,INPUT);
}

void loop() {
  //
  // Increase our counter
  //
  step++;
  //
  // If we are over our STEPCOUNT then we repeat the header
  //
  if (step>STEPCOUNT) {
    //
    // The reference to the different photo resistors
    // GL5506, GL5516, GL5528, GL5537 and GL 5539
    //
    Serial.println("* 5506  5516  5528  5537  5539  GL5528");
    step = 0;
  }
  //
  // Print all analog values to serial
  //
  Serial.print("  ");
  Serial.print(analogRead(A0));
  Serial.print("   ");
  Serial.print(analogRead(A1));
  Serial.print("   ");
  Serial.print(analogRead(A2));
  Serial.print("   ");
  Serial.print(analogRead(A3));
  Serial.print("   ");
  Serial.print(analogRead(A4));
  Serial.print("   ");
  Serial.print(analogRead(A5));
  Serial.println();
  delay(250);
}


위의 sketch 를 실행시키면 다음과 같이 "Serial Monitor" 를 통해서 값을 확인할 수 있습니다.







6. 결과


제조사의 사양서는 찾을 수 없었지만, 5506 부터 나와있는 사양 테이블은 아래와 같습니다.

그래프를 보면 결과값과 비슷하게 나온것 같습니다.



강한 불빛인 휴대폰 플레쉬부터, 거실 불 하나만의 광량, 손으로 그늘을 만들고,

마지막에 손으로 가리는 순간들의 값을 EXCEL 정리해 봤습니다.


* EXCEL

photoresistor_record_20180225.xlsx


숫자로만 보면 들쑥날쑥 하여 알아보기 힘듭니다.

아래의 그래프로 그려봤습니다.



EXCEL 숫자만 보면, 과연 순서대로 나열해서 했나 싶을 정도로 들쑥날쑥 합니다만,

그래프로 그리면 확실히 그 경향을 알 수 있습니다.




FIN


예전에 구입한 GL5528 (녹색) 은, 이번에 구입한 5528 (회색) 과 확연한 값의 차이를 나타냅니다.

오히려 5537 (노랑) 과 더 비슷해 보이는군요.


위의 결과를 가지고 생각해 보면, photoresistor 를 직접 사용하기 전에는 측정을 통하여 사용처에 맞는 센서를 골라야 하겠군요.


And

Hardware | Digitial Compass - HMC5883L 사용기 - 1

|

1. 시작하기


지구의 자력을 측정할 수 있는 digital compass 센서가 있다는 소문을 들었습니다.


센서 내부에 코일을 감은 자석에 +/- 극을 지속적으로 변화시켜,

자기장의 변화에 따른 저항을 측정하는 방식으로 방위를 파악한다고 합니다.



* Magnetoresistance

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



지표를 기준으로 기울기까지 파악할 수 있습니다.

X/Y 로만 측정하면 방위를 측정할 수 있겠죠.



지구는 위의 그림처럼 자기작을 가지고 있습니다.

위의 그림의 출처는 다음에 있는 블로그를 참조하였습니다.


* Arduino: simple compass with HMC5883L + Library

http://bluelemonlabs.blogspot.kr/2013/08/arduino-simple-compass-with-hmc5883l.html


정확히는 "Anisotropic Magnetoresistance" 현상을 이용한 것이라고 합니다.

더 자세히 알고싶으시면 구글링~.





2. 센서 구입


이런 현상을 이용하여 digital compass 를 쉽게 만들 수 있는 센서를 구입하지 않는 이유를 찾을 수 없었습니다.


* GY-273 3V-5V HMC5883L Triple Axis Compass Magnetometer Sensor Module Three Axis Magnetic Field Module For Arduino

https://ko.aliexpress.com/item/GY-273-3V-5V-HMC5883L-Triple-Axis-Compass-Magnetometer-Sensor-Module-Three-Axis-Magnetic-Field-Module/32826264150.html



센서류 치고는 좀 비싸지만 그렇게 많이는 아니여서 망설임 없이 구입합니다.

(이게 나중에 화근이 됩니다)





3. 도착


무난하게 도착하였습니다.



뽁뽁이 봉지에 잘 넣어서 왔으며, 전자파 방지 비닐에 싸아서 왔습니다.



Header pin 은 납땜되지 않은 채로 왔습니다.

아무래도 운송시 휠수도 있고, 튀어나온 곳으로 힘을 받을 수 있으니까요.



중국 제조사의 이름은 GY-273 인듯 합니다.





4. Layout


Pinout 정보는 다음과 같습니다.


  HMC5883L  | Arduino Nano
---------------------------
    VCC     |     3.3V
    GND     |     GND
    SCL     |     A5
    SDA     |     A4
---------------------------


회로 배선은 다음과 같습니다.



실제 배선은 다음과 같습니다.






5. WTF


순서상으론 이 부분에서 소스를 보여줘야 하나, 다음과 같이 정상적으로 구동이 되지 않는 화면을 먼저 보여드립니다.



Arduino 자체가 망가졌나 해서, 가지고 있던 다른 Arduino Nano 클론 및 Arduino Micro 도 사용해 봤습니다.



가능한 모든 방법을 동원해 봤습니다.

그래도 안되더군요.


정말 가끔 있는 breakout 보드가 망가졌나 했습니다.


한가지 의심스러운 것은 HMC5883L breakout 보드의 I2C address 가, 보통 sample sketch 에서는 "0x1E" 으로 표현되어 있는데,

제가 구입한 보드는 "0x0D" 라고 표시되는 것이였습니다.


뭐, 중국 카피품일 경우, 이 address 가 다르게 나오는 경우가 있어, sketch 에서 변경만 하고 실행했더랬습니다.



위에서 3c 는 OLED 를 같이 접속시켜 확인한 결과 입니다.

문제 없이 "0d" 부분에 연결이 되어 있다고 뜹니다.


인터넷에서 가능한 다른 sample sketch 를 구해서 해봤으나 실패했습니다.





6. i2c scanner


혹여 i2c scanner 의 문제인가 하고, 다른 i2c scanner 도 구해서 해봤으나, 결과는 같았습니다.


// --------------------------------------
// i2c_scanner
//
// Version 1
//    This program (or code that looks like it)
//    can be found in many places.
//    For example on the Arduino.cc forum.
//    The original author is not known.
// Version 2, Juni 2012, Using Arduino 1.0.1
//     Adapted to be as simple as possible by Arduino.cc user Krodal
// Version 3, Feb 26  2013
//    V3 by louarnold
// Version 4, March 3, 2013, Using Arduino 1.0.3
//    by Arduino.cc user Krodal.
//    Changes by louarnold removed.
//    Scanning addresses changed from 0...127 to 1...119,
//    according to the i2c scanner by Nick Gammon
//    http://www.gammon.com.au/forum/?id=10896
// Version 5, March 28, 2013
//    As version 4, but address scans now to 127.
//    A sensor seems to use address 120.
// 
//
// This sketch tests the standard 7-bit addresses
// Devices with higher bit address might not be seen properly.
//

#include "Wire.h"

void setup() {
	Wire.begin();
	
	Serial.begin(9600);
	Serial.println("\nI2C Scanner");
}

void loop() {
	byte error, address;
	int nDevices;
	
	Serial.println("Scanning...");
	
	nDevices = 0;
	
	for(address = 1; address < 127; address++ ) {
		// The i2c_scanner uses the return value of
		// the Write.endTransmisstion to see if
		// a device did acknowledge to the address.
		
		Wire.beginTransmission(address);
		error = Wire.endTransmission();
		
		if (error == 0) {
			Serial.print("I2C device found at address 0x");
			if (address<16) Serial.print("0");
			Serial.print(address,HEX);
			Serial.println("  !");
			
			nDevices++;
		} else if (error==4) {
			Serial.print("Unknow error at address 0x");
			if (address<16) Serial.print("0");
			Serial.println(address,HEX);
		}
	}
	
	if (nDevices == 0) Serial.println("No I2C devices found\n");
	else Serial.println("done\n");
	
	delay(5000);           // wait 5 seconds for next scan
}


결과는 다음과 같이 동일하게 "0x0D" 라고 명확하게 표시됩니다.



참고로 앞으론 이 i2c scanner 도 사용해봐야겠네요.
연결된 I2C 부품을 깔끔하게 HEX address 를 표현해 줍니다.





7.  QMC5883L


진심으로 보드가 고장난 것이라 생각하고 재구매를 생각하고 있었습니다.


그러다가 다음과 같은 블로그 글을 읽게 됩니다.

결론은 HMC5883L 이 모두 동일한게 아니라 중국발 QMC5883L 이라는 제품이 있고, 전혀 동일하지 않다는 내용입니다.

허거걱 !!!


* Problem with HMC5883L magnetometer

https://www.reddit.com/r/AskElectronics/comments/5xo3md/problem_with_hmc5883l_magnetometer/



* PROBLEMS WITH GY-271 MAGNETOMETER (HMC5883L != QMC5883L)

http://www.esp8266.com/viewtopic.php?f=13&t=15445


Chip 자체가 다르고 identical 하지 않다고 하니, 한번 살펴 봅니다.



사진으로는 잘 모르겠으나, 일반적인 HMC5883L 과는 다른 마킹임에는 틀림 없어 보입니다.

구매 사이트에서 사진을 퍼와 봤습니다.



완전히 다르네요. "DA 5883 6014" 라고 되어 있습니다.

Sparkfun 에서의 HMC5883L 의 제품은 다음 그림과 같습니다. "L883 2105" 라고 되어 있습니다.


* Sparkfun

https://www.sparkfun.com/products/retired/10494



AliExpress 의 구매 사이트를 더 뒤져 보니 다음과 같은 문구를 발견했습니다.

"Note: It is Domestic Chip HMC5883, the program is not compatible ...."



아놔...


어떤 사이트에는 "Bad Sensor" 라고도 올려져 있습니다.



위의 사진을 보면 정말 main chip 만 다를 뿐, 완벽하게 동일한 구성품과 회로도 입니다.


* HMC5883L(Or QMC5883L) Electronic Compass

http://wiki.epalsite.com/index.php?title=HMC5883L(Or_QMC5883L)_Electronic_Compass


QMC5883L 의 Datasheet 는 다음과 같습니다.

QMC5883L-Datasheet-1.0.pdf





8. Sketch


cpp 및 h 파일은 다음 사이트에서 가져 왔습니다.

arduino/library/ 디렉토리에 "QMC5883L" 이라고 만들고, 그 안에 cpp 와 h 파일을 넣었습니다.


* HMC5883L Compass Module Comunicating but all zero's for x,y,z

https://forum.arduino.cc/index.php?topic=482179.0


Library 소스를 보면 address 가 이미 "0x0D" 라고 박혀 있네요.


QMC5883L 의 sample sketch 를 옮겨 봅니다.


/*
QMC5883L_Example.ino - Example sketch for integration with an QMC5883L triple axis magnetometer.
Copyright (C) 2017 Andy Barnard based on an original for the QMC5883L by Love Electronics (C) 2011

This program is free software: you can redistribute it and/or modify
it under the terms of the version 3 GNU General Public License as
published by the Free Software Foundation.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

See .

*/

// Reference the I2C Library
#include "Wire.h"
// Reference the QMC5883L Compass Library
#include "QMC5883L.h"

// configure the compass as reqiured
#define OSR 0b00               // over sampling rate set to 512. 0b01 is 256, 0b10 is 128 and 0b11 is 64
#define RNG 0b00               // Full Scale set to +/- 2 Gauss, 0b01 is +/- 8.
#define ODR 0b00               // output data rate set to 10Hz, 0b01 is 50Hz, 0b10 is 100Hz, 0b11 is 200Hz
#define MODE 0b01              // continuous measurement mode, 0b00 is standby
#define CR2 0b00000000          // control register 2: disable soft reset and pointer rollover, interrupt pin not enabled
#define RESETPERIOD 0b00000001  // datasheet recommends this be 1, not sure why!

// Store our compass as a variable.
QMC5883L compass;
// Record any errors that may occur in the compass.
int error = 0;

// Out setup routine, here we will configure the microcontroller and compass.
void setup() {
	// Initialize the serial port.
	Serial.begin(9600);
	
	Serial.println("Starting the I2C interface.");
	Wire.begin(); // Start the I2C interface.
	TWBR = 12;    //Set the I2C clock speed to 400kHz - only works with Arduino UNO
	
	Serial.println("Constructing new QMC5883L");
	compass = QMC5883L(); // Construct a new HMC5883 compass.
	
	// Check that a device responds at the compass address - don't continue if it doesn't - 
	do {
		delay(100);
		Wire.beginTransmission(QMC5883L_Address);
		error = Wire.endTransmission();
		if (error) Serial.println("Can't find compass - is it connected and powered up?");
	} while (error);
	
	// configure the control registers using static settings above
	// compass autoranges, but starts in the mode given
	compass.dataRegister.OSR_RNG_ODR_MODE = (OSR << 6) |(RNG << 4)  | (ODR <<2) |  MODE;
	compass.dataRegister.CR2_INT_ENABLE = CR2;
	compass.dataRegister.SET_RESET_PERIOD = RESETPERIOD;
	
	Serial.println("Configuring QMC5883L - OSR 512, range +/-2 Gauss, ODR 10, Continuous");
	error = compass.Configure(compass.dataRegister); // use static settings from above - can access register data directly if required..
	if (error != 0) // If there is an error, print it out, although no way to get error with this sensor....
	Serial.println(compass.GetErrorText(error));
}

// Our main program loop.
void loop() {
	// Retrive the raw values from the compass (not scaled).
	MagnetometerRaw raw = compass.ReadRawAxis(&compass.dataRegister);
	// Retrived the scaled values from the compass (scaled to the configured scale).
	MagnetometerScaled scaled = compass.ReadScaledAxis(&compass.dataRegister);
	
	// Values are accessed like so:
	int MilliGauss_OnThe_XAxis = scaled.XAxis;     // (or YAxis, or ZAxis)
	
	// Calculate heading when the magnetometer is level, then correct for signs of axis.
	// heading (degrees): 0 = +X, 90 = +Y, 180 = -X, 270 = -Y
	float heading = atan2(scaled.YAxis, scaled.XAxis);
	
	// Once you have your heading, you must then add your 'Declination Angle', which is the 'Error' of the magnetic field in your location.
	// Find yours here: http://www.magnetic-declination.com/
	// Example is: 2� 37' W, which is 2.617 Degrees, or (which we need) 0.0456752665 radians, I will use 0.0457
	// If you cannot find your Declination, comment out these two lines, your compass will be slightly off.
	// float declinationAngle = 0.0457;
	
	float declinationAngle = 0;
	heading += declinationAngle;
	
	// Correct for when signs are reversed.
	if (heading < 0)
		heading += 2*PI;
	
	// Check for wrap due to addition of declination.
	if (heading > 2*PI)
		heading -= 2*PI;
	
	// Convert radians to degrees for readability.
	float headingDegrees = heading * 180/M_PI;
	
	// Output the data via the serial port.
	Output(raw, scaled, heading, headingDegrees);
	
	// Normally we would either:
	// 1. delay the application by 100ms to allow the loop to run at 10Hz (default bandwidth for the QMC5883L)
	// 2. poll the dataready flag in the dataRegister.OVL_DRDY register
	// 3. set the interrupt flat and set a hardware interrupt on the DRDY pin 
	// The first of these options is the easiest.
	delay(100);
}

// Output the data down the serial port.
void Output(MagnetometerRaw raw, MagnetometerScaled scaled, float heading, float headingDegrees)
{
   Serial.print("Raw (X,Y,Z): (");
   Serial.print(raw.XAxis);
   Serial.print(", ");   
   Serial.print(raw.YAxis);
   Serial.print(", ");   
   Serial.print(raw.ZAxis);
   
   Serial.print(")\tScaled (X,Y,Z): (");
   Serial.print(scaled.XAxis, 4);
   Serial.print(", ");   
   Serial.print(scaled.YAxis, 4);
   Serial.print(", ");   
   Serial.print(scaled.ZAxis, 4);
   Serial.println(")");

 
   Serial.print("Magnitude (0.25 to 0.6 on Earth surface): ");
   Serial.print(sqrt(scaled.XAxis * scaled.XAxis + scaled.YAxis * scaled.YAxis + scaled.ZAxis * scaled.ZAxis));
   Serial.print(" Heading: ");
   Serial.print(headingDegrees);
   Serial.print(" Bearing: ");
   Serial.print(bearingDegrees(headingDegrees));
   Serial.println(" (Degrees)");
}

  // Cacluate bearing from heading.
  // bearing 0 = Y pointing North, 90 = Y pointing E, 180 = Y pointing S, 270 = Y pointing W
  float bearingDegrees(float headingDegrees) {
     
     float bearing = 450 - headingDegrees;
     if (bearing >= 360)
     {
      bearing -= 360;
     }
     return bearing;
  }





9. 결과


QMC5883L 이라고 안 이상, 그 뒤는 문제 없이 구동까지 확인할 수 있었습니다.






FIN


여기까지 걸린 시간은 대략 이틀.

구매 사이트에 처음부터 QMC5883L 이라고 표기했으면 이렇게까지 고민하지 않았을 터인데.

역시 알아서 쓰라는 AliExpress 와 대륙의 기상이 느껴집니다.


인터넷을 보면 QMC5883L 에 대해서는 꽤나 여러가지 시도가 있습니다.

사실 접근 address 및 쓰고 읽는 부분만 다를 뿐, 구동 방식은 같다고 합니다.


* QMC5883L Electronic Compass

http://wiki.epalsite.com/index.php?title=QMC5883L_Electronic_Compass



Mecha 라는 ID 를 사용하시는 분이 만든 library 도 있습니다.


* Arduino lib for QMC5883

https://github.com/mechasolution/Mecha_QMC5883L


QMC5883L 임을 안 이상, 다음에는 좀더 철저하게 사용해 보도록 하겠습니다.

And

Hardware | MAX4466 마이크 앰프 breakout board 사용해 보기

|

1. 시작


아두이노와 친해지면서 다음 센서는 뭐할까 하다가,

스피커처럼 생겼지만 사실은 마이크인 "Electret Microphone Amplifier" 를 알게 되었습니다.



특이하게 Electret 이라는 단어가 눈에 띕니다.

의미는 Electricity 와 Magnet 의 합성어라고 하네요.


* 일렉트릿

http://100.daum.net/encyclopedia/view/b18a1451a


전계를 가했을 때 생긴유전 분극이 전계를 없앤 다음까지 잔류하는 물질로 만든 하전체.

자기에서의 영구 자석에 대응하는 것이다. 폴리프로필렌이나 마일러 등의 플라스틱으로 만들며, 소형 마이크로폰 등에 이용된다.


소형 마이크로폰에 사용된다고 하네요. 외관 모양 그대로의 기능을 가지고 있습니다.

Wikipedia 에서 설명은 다음에서 하고 있습니다.


* Electret

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





2. 구매


용돈 생활인의 안식처, 알리에서 찾아 봅니다.

adafruit 에서는 6.95 USD 입니다만, 알리는 1.66 USD 입니다.


* Electret Microphone Amplifier MAX4466 Adjustable Gain Breakout Board For Arduino MAX4466 Module

https://ko.aliexpress.com/item/Electret-Microphone-Amplifier-MAX4466-Adjustable-Gain-Breakout-Board-For-Arduino/32786459312.html



제품 설명에서는 홈페이지에서는 스펙에 대해 잘 설명되어 있습니다.


- 20 ~ 20KHz

- DC 2.4 ~ 5V


Add an ear to your project with this well-designed electret microphone amplifier. This fully assembled and tested board comes with a 20-20KHz electret microphone soldered on. This breakout is best used for projects such as voice changers, audio recordingmpling,

and audio-reactive projects that use FFT.

On the back, we include a small trimmer pot to adjust the gain.

Using it is simple: connect GND to ground, VCC to 2.4-5VDC. The output pin is not designed to drive speakers or anything but the smallest in-ear headphones you'll need an audio amplifier (such as our 3.7W stereo amp) if you want to connect the amp directly to speakers. [Specification] For the amplification, we use the Maxim MAX4466, an op-amp specifically designed for this delicate task! The amplifier has excellent power supply noise rejection, so this amplifier sounds really good and isn't nearly as noisy or scratchy as other mic amp breakouts we've tried! You can set the gain from 25x to 125x. That's down to be about 200mVpp (for normal speaking volume about 6" away) which is good for attaching to something that expects 'line level' input without clipping, or up to about 1Vpp, ideal for reading from a microcontroller ADC. The output is rail-to-rail so if the sounds gets loud, the output can go up to 5Vpp! For the best performance, use the "quietest" supply available (on an For Arduino, this would be the 3.3V supply). The audio waveform will come out of the OUT pin. The output will have a DC bias of VCC/2 so when its perfectly quiet, the voltage will be a steady VCC/2 volts (it is DC coupled).


If the audio equipment you're using requires AC coupled audio,

place a 100uF capacitor between the output pin and the input of your device.

If you're connecting to an audio amplifier that has differential inputs or includes decoupling capacitors,

the 100uF cap is not required.





3. adafruit 과의 비교


원본은 adafruit 의 MAX4466 breakout 로 보입니다.

이래는 비교 입니다.


* Electret Microphone Amplifier - MAX4466 with Adjustable Gain

https://learn.adafruit.com/adafruit-microphone-amplifier-breakout/assembly-and-wiring




마이크 부분을 제외하고 뒷면을 보면, 숫자 표기는 달라도 저항의 값은 모두 같은 것을 사용한 것으로 보입니다.



앞부분은 평범합니다.



처음 도착시 동봉되어 있던, male pin 이 어디로 가버려 

따로 구매한 핀 중에서 이쁜 색으로 나온 노란색 male pin 을 사용합니다.


Male pin 구매기는 아래를 참고하세요.


* Hardware | 2.54mm pin header 구매하기

http://chocoball.tistory.com/entry/Hardware-254mm-pin-header






4. Layout


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


   MAX4466  | Arduino Nano
---------------------------
    VCC     |     3.3V
    GND     |     GND
    OUT     |     A0
---------------------------


  SSD1306   | Arduino Nano
---------------------------
    GND     |     GND
    VDD     |     3.3V
    SCK     |     A5
    SDA     |     A4
---------------------------


VU meter 를 같이 이용하기 위해 SSD1306 도 같이 연결하였습니다.






5. Sketch


아래 보이는 sketch 는 adafruit 가 제공하는 기본 소스 입니다.


/****************************************
Example Sound Level Sketch for the 
Adafruit Microphone Amplifier
****************************************/

const int sampleWindow = 50; // Sample window width in mS (50 mS = 20Hz)
unsigned int sample;

void setup() 
{
   Serial.begin(9600);
}


void loop() 
{
   unsigned long startMillis= millis();  // Start of sample window
   unsigned int peakToPeak = 0;   // peak-to-peak level

   unsigned int signalMax = 0;
   unsigned int signalMin = 1024;

   // collect data for 50 mS
   while (millis() - startMillis < sampleWindow)
   {
      sample = analogRead(0);
      if (sample < 1024)  // toss out spurious readings
      {
         if (sample > signalMax)
         {
            signalMax = sample;  // save just the max levels
         }
         else if (sample < signalMin)
         {
            signalMin = sample;  // save just the min levels
         }
      }
   }
   peakToPeak = signalMax - signalMin;  // max - min = peak-peak amplitude
   double volts = (peakToPeak * 5.0) / 1024;  // convert to volts

   Serial.println(volts);
}


이 소스를 이용하면, 입력된 voltage 값을 Serial Monitor 를 통해 확인할 수 있습니다.



그래프로 그려보면 다음과 같습니다.



그래프가 튀는 부분은 "아~" 라고 소리를 질러 변화를 준 부분입니다.




6. VU meter 와 연동하기


 아래 링크는 SSD1306 OLED 를 이용한 VU meter 연동 글입니다.


* Hardware | SSD1306 monochrome OLED 를 가지고 VU meter 를 만들어보자

http://chocoball.tistory.com/entry/Hardware-VU-meter-using-SSD1306-monochrome-OLED


Pin 연결은 동일하기 때문에 그대로 사용했습니다.


/*  OLEDMeter was written to utilize any 128x64 display. I have only seen marginal attempts to
 *  animate meters and I hope this one will set a standard. Please feel free to modify and share
 *  this code for any 128x64 LCD or OLED. OLEDMeter sketch was written for use with I2C SH1106.
 *  This code must be modified to work with other display devices.
 * 
 *  Working portion of code was taken from Adafruit Example Sound Level Sketch for the
 *  Adafruit Microphone Amplifier
 *  https://learn.adafruit.com/adafruit-microphone-amplifier-breakout/measuring-sound-levels
 * 
 *  Remaining code was written by Greg Stievenart with no claim to or any images or information
 *  provided in this code. Freely published May 26, 2016.
 * 
 *  Software to convert background mask to 128x64 at: http://www.ablab.in/image2glcd-software/
 * 
 *  IMPORTANT: Sound source must be grounded to the Arduino or other MCU's to work. Usually the
 *  base sleeve contact on TRS or TRRS connector is the ground.
 */
 
#include "Wire.h"						// requried to run I2C SH1106
#include "SPI.h"						// requried to run I2C SH1106
#include "Adafruit_GFX.h"				// https://github.com/adafruit/Adafruit-GFX-Library
#include "Adafruit_SSD1306.h"			// https://github.com/wonho-maker/Adafruit_SH1106
 
#define OLED_RESET 4					// reset required for SH1106
 
Adafruit_SSD1306 display(OLED_RESET);	// reset required for SH1106
 
int analogInput = A0;					// analog input for outside audio source
int hMeter = 65;						// horizontal center for needle animation
int vMeter = 85;						// vertical center for needle animation (outside of dislay limits)
int rMeter = 80;						// length of needle animation or arch of needle travel
 
const int sampleWindow = 50;			// sample window width in mS (50 mS = 20Hz)
unsigned int sample;
 
// VU meter background mask image
static const unsigned char PROGMEM VUMeter[] = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x03, 0x00, 0x60, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x09, 0x04, 0x80, 0x21, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x01, 0x98, 0x08, 0x06, 0x03, 0x80, 0x21, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0xA4, 0x10, 0x09, 0x00, 0x80, 0x21, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0xA4, 0x10, 0x06, 0x03, 0x00, 0x20, 0xC0, 0x00, 0x80, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x71, 0x80, 0xA4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x0A, 0x40, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3C, 0x00, 0x00,
  0x00, 0x00, 0x3A, 0x40, 0x00, 0x00, 0x02, 0x01, 0x00, 0x40, 0x80, 0x07, 0x00, 0x20, 0x00, 0x00,
  0x00, 0x00, 0x42, 0x40, 0x00, 0x08, 0x02, 0x01, 0x08, 0x40, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00,
  0x00, 0x00, 0x79, 0x80, 0x04, 0x08, 0x02, 0x01, 0x08, 0x81, 0x10, 0x00, 0x00, 0x04, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x02, 0x01, 0x08, 0x81, 0x11, 0x04, 0x00, 0x38, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x02, 0x01, 0x08, 0x81, 0x21, 0x04, 0x00, 0x00, 0x08, 0x00,
  0x00, 0x00, 0x00, 0x84, 0x02, 0x04, 0x0F, 0xFF, 0xFF, 0xC3, 0xE2, 0x04, 0x00, 0x00, 0x08, 0x00,
  0x00, 0x00, 0x00, 0xC2, 0x01, 0x07, 0xF0, 0x00, 0x00, 0x3B, 0xFE, 0x08, 0x40, 0x40, 0x08, 0x00,
  0x00, 0xFE, 0x00, 0x62, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xE8, 0x40, 0x80, 0x7F, 0x00,
  0x00, 0x00, 0x00, 0x21, 0x1E, 0x00, 0x04, 0x00, 0x80, 0x00, 0x7F, 0xFE, 0x80, 0x80, 0x08, 0x00,
  0x00, 0x00, 0x03, 0x31, 0xE0, 0x00, 0x04, 0x00, 0x80, 0x04, 0x01, 0xFF, 0xC1, 0x00, 0x08, 0x00,
  0x00, 0x00, 0x07, 0x1E, 0x00, 0x40, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFA, 0x00, 0x08, 0x00,
  0x00, 0x00, 0x07, 0xF0, 0x00, 0x40, 0x3B, 0x07, 0x60, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x34, 0x81, 0x90, 0xCC, 0xC0, 0x00, 0x3F, 0xC0, 0x00, 0x00,
  0x00, 0x00, 0x0C, 0x00, 0x03, 0x30, 0x0C, 0x82, 0x90, 0x53, 0x20, 0x00, 0x07, 0xF8, 0x00, 0x00,
  0x00, 0x00, 0x70, 0x40, 0x00, 0xC8, 0x3B, 0x02, 0x60, 0x53, 0x20, 0x00, 0x00, 0xFE, 0x00, 0x00,
  0x00, 0x01, 0x80, 0x20, 0x01, 0xC8, 0x00, 0x00, 0x00, 0x4C, 0xC0, 0x00, 0x00, 0x3F, 0x80, 0x00,
  0x00, 0x06, 0x00, 0x00, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0x00,
  0x00, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00,
  0x00, 0x30, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00,
  0x00, 0x00, 0x40, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
  0x00, 0x00, 0xA0, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x02, 0x02, 0x30, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x03, 0x06, 0x30, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x8C, 0x30, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0xD8, 0x30, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x70, 0x19, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x20, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
 
void setup() {
	pinMode(analogInput, INPUT);					// analog input for outside audio source
	display.begin(SSD1306_SWITCHCAPVCC, 0x3C);		// needed for SH1106 display
	display.clearDisplay();							// clears display from any library info displayed
	Serial.begin(9600);
}
 
void loop() {
 
/***********************************************************************
 Start of code taken from Adafruit Example Sound Level Sketch for the
 Adafruit Microphone Amplifier
************************************************************************/
	
	unsigned long startMillis= millis();	// Start of sample window
	unsigned int peakToPeak = 0;			// peak-to-peak level
	
	unsigned int signalMax = 0;
	unsigned int signalMin = 1024;
	
	// collect data for 50 mS
	while (millis() - startMillis < sampleWindow) {
		sample = analogRead(0);
		if (sample < 1024) {			// toss out spurious readings
			if (sample > signalMax) {
				signalMax = sample;		// save just the max levels
			} else if (sample < signalMin) {
				signalMin = sample;		// save just the min levels
			}
		}
	}
	
	peakToPeak = signalMax - signalMin;	// max - min = peak-peak amplitude
	float MeterValue = peakToPeak * 330 / 1024;		// convert volts to arrow information
	double volts = (peakToPeak * 5.0) / 1024;		// convert to volts

/****************************************************
 End of code taken from Adafruit Sound Level Sketch
*****************************************************/
	
	MeterValue = MeterValue - 34;								// shifts needle to zero position
	display.clearDisplay();										// refresh display for next step
	display.drawBitmap(0, 0, VUMeter, 128, 64, WHITE);			// draws background
	int a1 = (hMeter + (sin(MeterValue / 57.296) * rMeter));	// meter needle horizontal coordinate
	int a2 = (vMeter - (cos(MeterValue / 57.296) * rMeter));	// meter needle vertical coordinate
	display.drawLine(a1, a2, hMeter, vMeter, WHITE);			// draws needle
	display.display();
	Serial.println(volts);
}


연결되어 VU meter 가 잘 표시되네요.



구동 동영상 입니다.






7. VCC 와 GND


처음에 VU meter 의 바늘이 널띄면서 도저희 측정할 수 있는 상태가 아니였습니다.



Pin 들의 접점이 문제인가 여러번 빼고 꼽고 했지만 개선이 이루어지지 않았습니다.

최종적으로 생각한 것은 예민한 센서이다 보니, 잡음이 원인이 아닌가 하는 것이였습니다.


위의 사진처럼 SSD1306 과 동일하게 사용하는 공통 VCC/GND 에 연결한 것을,

아래처럼 각각 arduino 의 VCC/GND 에 연결하니 해결되었습니다.



예민한 센서류는 공통 VCC/GND 에 연결하면 안되는 거군요.

이렇게 하나 배워 봅니다.




FIN


소형 마이크에는 Electret 소자가 사용된다 합니다.

Arduino 를 위한 소리 감지용 breakout 보드도 나와 줘서 필요시 잘 사용할 것 같습니다.


And

Hardware | 2.54mm pin header 구매하기

|

1. 시작


아두이노와 연결할 센서들을 구입하다 보면, pin 들이 납땜되지 않은 상태로 오다 보니,

분실되는 경우도 있고, 상태적으로 꺾인 pin 이 더 적합해 보는 경우가 있습니다.


이참에 여러가지 구입해 보려고 찾아 봤습니다.

2.54mm 는 빵판 간격이기도 하고 딱 맞는 것들이 많이 있네요.




2. 구입


기왕 구입하는거 이쁜것으로 구입하자 하여, 색이 입혀진 것으로 선택합니다.


* 10pcs/lot 2.54mm Black + White + Red + Yellow + Blue Single Row Male 1X40 1*40 Pin Header Strip ROHS CGKCH090

 - https://ko.aliexpress.com/item/10pcs-lot-2-54mm-Black-White-Red-Yellow-Blue-Single-Row-Male-1X40-1-40-Pin/32701752788.html




위치를 올려서, 2층으로 센서를 올려야 할 때에는 female pin 도 필요하여 이참에 구입합니다.


* Free Shipping 1lot=10pcs 1x40 Pin 2.54mm Single Row Female + 10pcs 1x40 Male Pin Header connector

https://ko.aliexpress.com/item/20pcs-1x40-Pin-2-54mm-Single-Row-Female-Male-Pin-Header-connector/32713495010.html





90도 꺾인 것도 가끔은 필요 하겠죠?


* Hot Sale 10pcs 40 Pin 1x40 Single Row Male 2.54mm Breakable Pin Header Right Angle Connector Strip bending

https://ko.aliexpress.com/item/Hot-Sale-10pcs-40-Pin-1x40-Single-Row-Male-2-54mm-Breakable-Pin-Header-Right-Angle/32812273133.html



모두 합하여 3 USD 조금 넘는 가격에 구입했습니다.




3. 도착


우선 색이 있는 male pin 입니다.



도착은 3주정도 걸렸습니다.



생각한 것보다 색이 이쁘게 잘 나왔네요.



Female pin 과 같이 있어 센서들을 적층할 수 있는 pin header 입니다.



바로 생산한 것을 보내서 그런지, 처음 개봉했을 시 약품 냄새가 진동해서 머리가 좀 아팠습니다.



요로코롬 연결이 됩니다.

Female pin 은 밑의 기판과 연결되구요.



마지막 꺾인 pin 입니다.



센서를 세워야 할 때에는 이 pin header 가 잘 쓰일것 같습니다.




4. 사용해 보기


마침 Electret Microphone 의 pin header 를 분실해 버려,

노란색 male pin 을 사용해 봤습니다.



사진에서처럼 니퍼로 살짝 힘 주니, 톡 하고 부러집니다.

사용하기 쉽네요.



흠흠 만족스럽습니다.




FIN


이제 pin header 없는것들, 다덤벼!

And

Life | 샤오미 미밴드 1S 손목밴드 교환기

|

1. 시작하기


샤오미 미밴드 1S 을 가지고 있습니다.

어이쿠... 이게 언제적거야?


2015년 말에 출시되었고, 실제 구매는 2016년 초였으니, 딱 2년 사용했네요.


어찌어찌 테이프로 붙여보고 했지만, 실리콘 스트렙이 완전 삭아버렸습니다.

하긴 바다에 가나 눈이오나 샤워하나 항상 차고 있었으니. 



조금만 더 사용하면 완전 끊어질것 같습니다.



그냥 Xiaomi Mi Band 2 로 갈까... 3까지 버틸까 고민을 조금 하다가,

3 가 언제 나올지 모르고, 2로 가긴 아까워서 계속 사용하기로 마음 먹습니다.




2. 스트랩 구매


알리에 검색하니 수두룩 나오네요.

여유롭지 못한 용돈 생활이므로, 강제 절약 모드로 폭풍 검색을 합니다.


흠흠... 아래 것이 가장 평이 좋고 품질도 괜찮은것 같습니다.


* 1pc Colorful Silicone Wrist Band Bracelet Wrist Strap For Xiaomi Miband Mi band 1 & 1S Smart Band

https://ko.aliexpress.com/item/1pc-Colorful-Silicone-Wrist-Band-Bracelet-Wrist-Strap-For-Xiaomi-Miband-Mi-band-1-1S-Smart/32730213739.html



여러 모양이 있지만, 아래와 같이 귀여운 해골모양으로 선택합니다.





3. 도착


이번에는 딱 1달이 걸렸네요.



포장은 잘 되어 왔습니다.



겉에 보이는 부분은 특별히 문제가 없어 보입니다.



놀라운 것은 원래의 제품보다 더 잘 맞습니다.

알루미늄 쉘과 플라스틱 바디 사이의 홈에 정말 딱 들어 맞습니다.




4. 착용 샷


손목에 차 봤습니다.



원래의 제품보다 더 쫀득한것 같습니다.

다른 판매자의 몇몇 제품 후기를 보면 안맞고 갈라진 사진들이 올라오는데, 이 업자꺼는 잘 만들었네요.




FIN


이제 알리에서 파는 이런 생필품도 제품의 질이 좋다는 것을 다시한번 느낄 수 있었습니다.

이걸로 Xiaomi Mi Band 3 나올때까지 버텨보겠습니다.


And

Hardware | LED 구매하기

|

1. 아이고


일본의 후지산 등반부터, 각종 아웃도어 활동시에 사용되었던 Petzl 의 헤드렘프.

특히 캠핑에서는 없으면 안될 장비였죠.


작년 가을에 갔던 캠핑시 강풍과 비를 맞이하게 되어 저녁에 텐트를 급하게 옮기느라 머리에 이 헤드램프를 쓰고 작업을 했더랬죠.



사용 후, 캠핑장구류에 같이 넣어 놓고 11월에 한번 더 캠핑을 가게 되었죠.

저녁에 캠핑장에 도착해서 이 헤드램프를 꺼내 쓰려고 하니, 동작하지 않았습니다.

이런 낭패가...



집에 돌아가서 분해해 살펴 보았습니다.

밧데리에 물이 뭍어 부식되면서, 나사 겹합부를 타고 들어가 보드까지 부식이 진행된걸 확인하게 되었습다.

아...



완전 맛이 갔네요.

애정이 많이 간 장비라 직접 고쳐보고 싶어졌습니다.




2. LED


보드 부식도 문제지만, 처음 분해시 LED 분리한답시고 LED 다리에 인두를 너무 오래 지져서, LED 가 하나 맛이 갔습니다.


교환용 LED를 구매해야 하는데, 이참에 입맛에 맞는 LED를 구매하고 싶었습니다.

조건은 다음과 같았죠.


* 직진성이 좋아야 한다

* 가능하면 고휘도 여야 한다

* white 보다는 warm white 를 장착하여 멀리서도 식별되게 한다


특히 warm white 는 색도가 달라, 저녁에 뻘에서 해루질 하더라도 헤드램프 만으로도 가족 식별이 쉬워질것 같았고,

개인적으로 warm white 를 좋아하는 지라, 선택하게 되었습니다.




3. Staw Hat / Inverted Cone


첫번쨰 조건인 "직진성" 을 생각해 봤을 땐,

LED 중에서 머리가 평평한 LED가 렌즈 효과처럼 빛을 다발로 잡아주어 LED 렌즈 이탈 시, 직진성을 갖을것 같았습니다.


그런데 정 반대더군요 !!!

사실은, 머리가 평평한 LED 내부는 움푹 들어간 모양이고,

머리 꼭지 부분은 오히려 더 빛을 산란시키기 위해 거울처럼 머리를 깎아 놓은 것이였습니다.


* What is the advantage of a "straw hat" (inverted cone) LED?

https://electronics.stackexchange.com/questions/2089/what-is-the-advantage-of-a-straw-hat-inverted-cone-led/2090




위의 그림이 산란 방식을 가장 잘 설명해 놓았습니다.


아래 글은 크리스마스 트리에 장식하는 LED 들에 대한 이야기 인데,

LED 소자들을 보면 Staw Hat 이라는 것을 알 수 있습니다.


* LED Christmas Light String Guide

https://blog.1000bulbs.com/home/led-christmas-light-guide



둥그런 머리 모양과 평평한 - 그렇지만 아쪽이 파인것 같이 된 - 모양의 빛의 성질에 대해 설명한 그림은 다음과 같습니다.



마침 사는 아파트 앞에 교회가 있어서, 크리스마스 때부터 지금까지 설치된 LED 소자를 확인해 봤습니다.



진짜로 크리스마스 트리용 LED는 Staw Hat 이었네요!!!

이렇게 이미 광범위하게 쓰이고 있는줄은 처음 알았습니다.



다른 각도에서 샷 하나 더.

머리는 평평하지만 안쪽으로 파인 모양이 보이죠?!



그래서 옆에 지나다닐 때, 눈이 부시지 않았구나.




4. Round Hat


그럼 둥근 모양이면 다냐...

그건 또 아니더구요.


길이가 짧고 납작한 LED 는 직진성이 Staw Hat 보다는 좋지만, 빛을 퍼지게 하는 효과가 있었습니다.



결국 Standard 한, 납작하지도 않고, 평평하지도 않은, 우리가 흔히 보는 LED가 가장 직진성이 좋았던 것이였습니다.

오히려 빛을 모아준다는군요.



결국 가장 일반적인 5mm 짜리 warm white LED 를 구매하기로 합니다.

(자료 찾는게 시간이 더 걸림)




5. 구매


역시 AliExpress 에서 구매합니다.

Warm white 는 다른 색과 같이 섞어서 파는 옵션이 없네요.


100개나 쓸까 싶습니다만, 1000원정도에 무료배송이므로 구매합니다.


* Smart Electronics 100pcs/lot F5 Super Bright 5MM Round Warm White Transparent LED Light Lamp Emitting Diode High Quality

https://ko.aliexpress.com/item/Smart-Electronics-100pcs-lot-F5-Super-Bright-5MM-Round-Warm-White-Transparent-LED-Light-Lamp-Emitting/32597841882.html




전기적 성질은, 3.0~3.2V 구동 전압에 빛의 확산성이 30도로 나옵니다.






6. 도착


가격이 싸고, 무료배송이다 보니 한달정도 걸렸습니다.



알리스러운 뽁뽁이 소포 비닐봉투로 왔습니다.



그냥 평범한 5mm LED 입니다.




7. 불을 켜보자


그냥 불을 키는건 재미가 없으니, SOS 를 Morse 부호로 켜 봅니다.



Layout 은 다음과 같습니다.



LED 는 소자 보호를 위해서 꼭 저항이 연결되어 있어야 합니다.

저항은 저번에 사용한 330 Ohm Resistor Network 를 사용했습니다.


* Hardware | Resistor Network 을 사용해보자

http://chocoball.tistory.com/entry/Hardware-Resistor-Network-using


Sketch 는 다음과 같아요.


int ledPin = 13;
// LED connected to digital pin 13
void setup() {
	pinMode(ledPin, OUTPUT);
}

void flash(int duration) {
	digitalWrite(ledPin, HIGH);
	delay(duration);
	digitalWrite(ledPin, LOW);
	delay(duration);
}

void loop() {
	flash(200); flash(200); flash(200);
	// S
	delay(300);
	// otherwise the flashes run together*//
	flash(500); flash(500); flash(500);
	// O
	flash(200); flash(200); flash(200);
	// S
	delay(1000);
	// wait 1 second before we start
}


생각한 대로 잘 나옵니다.



아래는 동영상 입니다.

S 는 짧은 3개, O 는 길게 3개네요.



살짝 누런 빛이 나는것 같기는 합니다.

자~ 그럼 원래 목적인 Petzl 의 헤드렘프를 고쳐 볼까나~?


라고 생각했지만, 오늘은 여기까지만 하기로합니다.




FIN


헤드램프도 그렇지만, 이번에 알게된 Morse Code 에 대해서도 좀더 알고 싶어졌습니다.

Morse Code 를 쉽게 구동시키는 arduino 코드를 만들어 볼까 합니다.



And

Hardware | Flight Feeder 를 신청해 보자

|

1. 영원한 꿈, 비행기


일전에 항공기 추적을 Raspberry Pi 3 로 만드는 프로젝트를 완료 했었습니다.


* Hardware | PiAware 로 항공기 추적하기

http://chocoball.tistory.com/entry/Hardware-PiAware-FlightAware


다만 문제는, linux 의 root 로 로그인 한 상태로 계속 놔둬야만 운영되는 부분이었습니다.

그리고 어플이 죽으면 매번 모니터에 연결해서 실행시켜야 했기 때문에 많이 번거로웠습니다.


몇번 그렇게 하고 나니 너무 짜증이 나서 Raspberry Pi 3 는 다른 용도로 사용하게 되었습니다.




2. FlightAware


PiAware 가 개인이 직접 만들어서 구축할 수 있도록 한 버전이라면,

FlightFeeder 는 해당 회사에서 완성품으로 보내주는 kit 입니다.


다시한번 신청해 봅니다.

신청시, 개인적으로 예전에 PiAware 했었다를 최대한 어필 했습니다.


* FlightAware

http://flightaware.com/adsb/flightfeeder/



무심하게 다시 신청을 넣어 봅니다.



신청해줘서 고맙고, 추가 질문이 있으니 잘 답변하라고 합니다.

링크를 클릭하여 잘 답변해 줍니다.



오잉? 이게 왠일입니까?

Free Feeder 를 보내주기로 결정했다고 연락이 왔어요!!!

산타크로스는 존재했어!



장비를 곧 보낼 것이니, 정말 이것을 진행함에 문제 없고, 주소가 맞는지 확인 메일이 왔습니다.

순순히 말 잘 듣습니다.



장비를 보냈다고 연락이 왔습니다!!!

정말 꿈이 현실이 되는 순간입니다.




배송에 문제가 없으며, 빠른 배송인 FedEx 를 사용했네요.

오오오 뭔가 달라 !!!




3. 도착


정말로 도착했습니다 !!!



포장된 박스도 비범해 보이는군요.

정말 튼튼한 소재로 포장되어 왔습니다.



예전에 개별 구매했던 친숙한 부품들이 들어 있습니다.



저 주황색이 버전업 된 Feeder 인 듯 합니다.



안테나와 low pass filter 를 연결하는 케이블 입니다.

N type / SMA 네요.



깔끔한 마무리의 케이블 입니다.



네트웍 케이블도 같이 왔습다.

WiFi 를 사용할 것이기에 포장을 뜯지 않습니다.



이것은 1090MHz Mode S Filter 네요.



안테나 지지 브라켓 입니다.



속이 궁금해 지는 Feeder 본체 입니다.

FilghtAware 웹에서는 파란색 금속재질로 보였는데, 완전 다른것 같습니다.



안테나구요.



T-shirt 까지 보내 줬습니다.

이디서 FlightAware 세미나가 있으면 꼭 입고 가보겠습니다.





4. Teardown


PiAware 는 Raspberry Pi 3 를 이용해서 직접 이용해 봤습니다.

이 FlightFeeder 는 어떨지 궁금해 집니다.



우선 내용물을 봅니다.

본체와 터치 팬, 그리고 방수용 실링 고무가 같이 들어 있습니다.



모니터가 기본 장착 되어 있으며, 터치 입력이 가능할 것 같습니다.

그 전에는 직접 HDMI 모니터에 연결하고, USb Keyboard 를 연결 해야 했었는데, 완전 편해졌습니다.



밑면은 환기를 위한 구멍이 있습니다.

분해도 쉬울것 같네요.



어림 짐작해, 이놈도 역시 Raspberry Pi 3 가 들어있을것 같습니다.



커버를 분해해 봅니다.

역시, Raspberry Pi 3 가 들어 있네요.



Low Pass Filter 가 일체형 입니다.

내부에서 USB 로 연결되어 있네요.



터치스크린 입니다.

3.2 inch 라는군요.



터치스크린을 제거한 모습입니다.

간단하지만 필요한 모습을 하고 있습니다.



자동 부팅되도록 이미 microSD 에 OS 도 함께 들어 있습니다.



microSD 는 SanDisk 의 Ultra 8GB 버전입니다. Class 10 이네요.



일반적으로 Raspberry Pi 3 를 구입하면 중국산이 오는데,

보내준 기기는, 본고장 영국 - UK 에서 생산된 버전이 들어 있었습니다.

카메라나 디스플레이 포트는 먼지 들어가지 마라고 실링도 되어 있네요.



기존 제가 직접 구입했던 Raspberry Pi 3 는 PRC - People's Republic of China (중화인민공화국) 생산품 입니다.





5. 부팅


모든 선을 연결하고 전원을 넣어 봅니다.



모니터에 푸른 빛이 돌면서 부팅을 시작합니다.



Linux 부팅 시퀀스가 터치스크린을 통해서 잘 보이네요.



아무 설정을 하지 않아서, Status 가 모두 빨간색으로 뜹니다.



조금 있으니 Radio 가 노란 색으로 바뀌었습니다.

전파는 잡은것 같습니다. 일단, Network 을 잡아야 겠군요.



System 메뉴로 들어가 "Wifi Settings" 를 선택합니다.



Network ID 를 선택합니다.

선택 후, 비번이 필요하면 비번도 넣어 줍니다.



네트웍을 잡으면 Network 과 Gateway 가 녹색으로 바뀌어 문제 없음을 알려 줍니다.



System Status 를 보면, Network 을 통한 통신량 상황과 Raspberry Pi 3 의 보드 온도를 표시해 줍니다.

41도가 나오는데 괜찮을런지 모르겠습니다. 이거 24시간 켜 놓을껀데....



System > Log 를 보면, 관련된 어플들이 어떻게 구동되고 있고 어떤 동작을 하고 있는지 확인할 수 있습니다.

저의 ID도 이미 설정되어 있어서, 자동으로 로그인 되었다고 뜨네요.



업그레이드 된 FlightFeeder 의 정식 명칭은 "FlightFeeder Orange (H8)" 인듯 합니다.

소프트웨어 버전은 7.8.6 이라네요.



Radio 시그널 상황도 볼 수 있습니다.



모두 정상으로 작동하면 Status 에서 모든 항목이 녹색으로 표시되는 것을 확인할 수 있습니다.

아.... 뭔가 편하다.




6. 혹시...?


궁금점이 생겼습니다.

기존에 가지고 있던 Raspberry Pi 3 랑 본체를 바꿔서 구동시켜 보면 어떨까...?



흠흠. 할당된 시리얼 넘버와 다르다고 바로 뜹니다.

아마 MAC Address 를 보고, 발송한 본체와 동일한지 확인하는것 같습니다. UUID 등을 보는 것일까요?


microSD 를 따로 마운트 해서, 자동실행과 관련된 파일을 뒤져보면 알수 있을것 같은데,

뭔가 violation 이 생길듯 합니다. 안되는거 확인만 하고 다시 원래대로 되돌려 놓습니다.


어떻게 준 기회인데, 뭔가 문제가 생기면 안되잖아요?

나중에 시간이 지난 다음 기회가 되면 한번 분석해 보겠습니다.




7. 최종 확인


무사히 Status 에 all green 이 뜨면, 다음과 같은 메일이 조금 있다가 도착합니다.

"우리가 보낸거 잘 설치했네~. 너로부터 data 가 들어오고 있어! Thanks" 라고 메일이 옵니다.



메일에 있는 URL 로 접속해 보면, 저의 space 가 생긴것을 확인할 수 있습니다.



예전에 처음 PiAware 했을때의 친숙한 화면이네요.

다만, 기기가 PiAware 에서 Feeder 로 바뀌었습니다. 당연한거죠.



무사히 모든게 정상 작동하기 시작했습니다.




FIN


이 프로젝트 시작한지 2년째가 되어, 해당 회사에서 기기를 직접 공수받아 다시 시작하는 단계가 되었네요.

이 자리를 빌어 감사의 말씀 전합니다.

Thank you FlightAware~!


이제 하늘을 더 자주 쳐다보게 될것 같습니다.




Update - 20200212


기존 사용하던 WiFi 라우터에 문제가 있어, 라우터를 교체했습니다.

그러더니, FlightFeeder 에서 WiFi 를 못 잡더군요.


한 반년을 유선 네트워크 - Wired 로 사용하다, 캐이블이 너무 복잡해 지는 바람에 마음 잡고 문제를 확인해 봤습니다.

FlightAware 의 서포트에 문의해 보면, 기계같은 답변만 오더군요.


그러다, 제가 가지고 있는 FlightFeeder Orange (H8) 버전이 Raspberry Pi 3 B+ 이 베이스라는 것을 기억해 냈습니다.

구글링에서 라즈베리파이 3 B+ 의 WiFi 문제를 검색해 보니, Region - 지역 설정 때문에 잡히지 않는다는 글이 몇 개 보였습니다.



지역을 United States 로 바꿔 줬습니다.



아... 잘 잡네요. 이제 다시 WiFi 를 사용할 수 있게 되었습니다.


여러 feeder 들 중에, 오로지 FlightFeeder 만 WiFi 를 사용할 수 있어, 케이블이 복잡해 지는 것을 조금이나마 줄여주는 것 같습니다.

또한 제가 수령한 이 기기 이후 버전들은, 모두 철재 깡통으로 만들어지고 있어, 이 Orange (H8) 만 WiFi 사용이 가능합니다.

(철재로 case 를 만들면, 내부 안테나를 이용한 무선 통신이 불가능하게 되기 때문 - 차폐)




Update - 20200226


Corona-19 바이러스 창궐로 중국향, 중국발 항공기편이 줄었다고 합니다.



중국 내륙 공항에 이착륙하는 비행기 숫자는 확연하게 줄었네요.



제가 수집하는 station 에서도 1월부터 꾸준히 position 데이터 수집의 하락세가 관측 되었습니다.



중국 내륙만큼은 아니지만, 하루 700대 관측되던 비행기 숫자가, 500대 정도로 내려왔네요.



Station 을 운용하면, 이렇게 세상 변화도 관측할 수 있어서, 또 다른 즐거움인 듯 합니다.


And

Hardware | SSD1309 128x64 1.54" yellow OLED

|

1. OLED 들


지금까지 3가지 OLED 를 가지고 놀아 봤습니다.


* SSD1306 128x64 0.96" monochrome OLED

http://chocoball.tistory.com/entry/Hardware-SSD1306-128x64-monochrome-OLED



* SSD1331 96x64 0.95" full color OLED

http://chocoball.tistory.com/entry/Hardware-SSD1331-96x64-full-color-OLED



* SSD1306 128x64 1.3" monochrome OLED

http://chocoball.tistory.com/entry/Hardware-Adafruit-SSD1306-128x64-13inch-monochrome-OLED


그러다 Spot Welder 를 만들 생각을 구상하던 중, 기존 DIY 된 것들을 보면 뭔가 아쉬운 점들이 눈에 보였습니다.

그것은 바로 !!! 상태창의 크기 !!!


그렇습니다. 모두 창태창의 크기가 본체들과 비교해 너무 작게 보였던 것이였어요.



당장 필요한건 아니지만 향후 Spot Welder 제작 준비단계로, 조금 큰 OLED 를 찾아봅니다.




2. 구매


OLED 를 키워드로 찾고 크기순으로 분류해 보니, 너무 큰걸 빼고 간단한 회로와 연결시키는 OLED 중에는 1.54 inch 가 있었습니다.

또한 White 와 Yellow 가 있었는데, 조금 더 비싸지만 Yellow 가 있어보였습니다.


조금 더 비싼거라 적당한 가격에 파는곳이 그리 많지 않네요.

결국 아래 link 에 걸려있는 업자것을 구매 결정합니다.


* 1.54" 1.54 inch Yellow OLED Display Module 128x64 SPI IIC I2C Interface OLED Screen Board 3.3-5V For Arduino AVR STM32 8051

https://ko.aliexpress.com/item/1-54-1-54-inch-Yellow-OLED-Display-Module-128x64-SPI-IIC-I2C-Interface-OLED-Screen/32834248792.html


흠흠... 괜찮은 선택 같습니다.




사양은 다음과 같습니다.


* Product Introduction:

 1. Size : 1.54 inch

 2. Resolution : 128*64

 3. Light Color : Yellow

 4. Driving IC : SSD1309 (compatible with SSD1306)

 5. Voltage : 3.3V-5V

 

* SPI Interface Definition:

 1. GND : power ground

 2. VCC : power positive

 3. SCL : clock wire

 4. SDA : data wire

 5. RES : reset wire

 6. DC : data/command

 7. CS : chip selection (if not used, it can be directly connect with ground)

  

* Package included:

1*1.54inch OLED Display Module SPI Interface 3.3-5V SSD1309(Yellow)


노란색 OLED 는 어떤 분위기 일까~ 하면서 기다렸습니다.




3. 도착


요즈음은 알리 배송이 대략 2주인것 같습니다.

초기의 기본 한달보다는 많이 짧아진것 같습니다.



뽁뽁이로 잘 쌓여져 있구요.



정전기 방지 비닐로 잘 포장되어 왔습니다... 만!!!



핀 부분이 역력하게 힘으로 눌린 흔적이 보입니다.

이런 종류는 몇번 감는 뽁뽁이 보다는, 핀의 높이를 커버해 주는 스펀지가 제품 파손 방지에 도움이 더 될듯 합니다.



SPI 와 I2C 모두 대응하고 있습니다.

배송된 상태는 기본 SPI 로 동작하게끔 설정되어 있네요.

I2C 로 변경하기 위해서는 jumper 두곳을 쇼트시켜야 합니다.


SPI 가 반응 속도면에서 우수하므로, 그대로 사용하려 합니다.

다만, 기존 spot welder DIY 를 보면, 대부분 I2C 로 연결되어 있는듯 합니다.

실제로 만들 때에는 SPI 로 동작하게끔 소스 수정해야겠습니다.



윗부분 입니다. 크기가 큰 만큼 뭔가 있어 보입니다.



기존에 가지고 있던 0.95 / 0.96 inch 와의 비교샷 입니다.

확실히 크지요?




4. 동작시켜 보기


얼른 보고싶네요.

배선 및 소스는 1.3 inch 를 가지고 놀던 내용을 그대로 사용하였습니다.


* SSD1306 128x64 1.3" monochrome OLED

http://chocoball.tistory.com/entry/Hardware-Adafruit-SSD1306-128x64-13inch-monochrome-OLED



아... 노란색 이쁩니다.



뭔가 더 사이버틱 해졌습니다.



동영상 입니다.

작은 OLED 들의 고질적인 현상인 깜빡거림은 어쩔 수 없네요.

이 가격에 너무 많이 바랄 수는 없겠죠?




FIN


Spot Welder 제작을 위해 어서 링코어를 구해야겠습니다.

And

Hardware | HY-SRF05 초음파 거리 측정기를 사용해 보자

|

1. 거리 측정기


거리를 측정하는 방법에는 여러가지가 있습니다.

일전에 laser 모듈을 이용하여 측정하는 방법을 구현해 봤습니다.


* Hardware | VL53L0X 레이저 거리 측정 센서 사용해 보기

http://chocoball.tistory.com/entry/Hardware-VL53L0X-laser-ranging-sensor


다만, 두개의 눈같이 생긴 센서가 자꾸 눈에 들어 옵니다.

로보트를 만든 사람들은 누구나 사용하는 센서인 듯 보이고, Arduino Starter Kit 에도 꼭 포함되어 있는 센서 입니다.


사용해 보지 않을 이유가 없습니다.

궂이 필요성은 없지만 서도...


AliExpress 에서 검색하니 그냥 나옵니다. 흠흠.


* 5Pin HY-SRF05 SRF05 Ultrasonic Distance Sensor Module For Arduino Replace SR04 Electronic Brick Compatible Interface DC 5V


https://ko.aliexpress.com/item/MAX6675-Module-K-Type-Thermocouple-Thermocouple-Sensor-for-Arduino-AL/32247186623.html



지금까지 구입하지 않고 오래 지났으니, 이제 구입할 시기라고 정당화 하면서 바로 구입합니다.




2. 도착


그리 오래 걸리지 않고 도착했습니다.

한 2주 정도?



뽁뽁이로 잘 쌓여 있고요.



아니 이게... WTF.

왜 너는 pin 들이 죄다 구부러져 있니?

너무 이쁘게 구부러져 있어서 원래 그런거라고 자답 위안을 삼아 봅니다.




3. 외형


앞모습 입니다. 두개의 눈처럼 생겼습니다.



뒷모습.



HC-SR04 버전과 비교해 보면, 조금 더 component 들이 더 많이 있음을 알 수 있습니다.




또한, SRF04 의 업그레이드 버전인 SRF08 도 있습니다.


SRF04 > SRF05 (좀더 정확해짐) > SRF08 (거리가 늘어나고 낮은 ampere)


http://www.f15ijp.com/2012/09/arduino-ultrasonic-sensor-hc-sr04-or-hy-srf05/

http://www.junun.org/MarkIII/Info.jsp?item=32


SRF08 은 photoresistor 까지 달려 있네요.




사실은 Ultrasonic 거리 측정기는 제품 넘버링 만큼 많이 있습니다.

https://www.robot-r-us.com/vmchk/sensor-ultrasonic.html






4. Layout


Pin 연결들은 다음과 같습니다.


  HY-SRF05  | Arduino Nano
---------------------------
    Vcc     |     5V
    Trig    |     D13
    Echo    |     D12
    OUT     |     
    GND     |     GND
---------------------------


  SSD1306   | Arduino Nano
---------------------------
    GND     |     GND
    VDD     |     3.3V
    SCK     |     A5
    SDA     |     A4
---------------------------


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



짜잔~ 전체 사진입니다.






5. Sketch


소스는 아래 link 를 참조하였습니다.


* Distance Measurement with an Ultrasonic Sensor HY-SRF05

- https://create.arduino.cc/projecthub/Nicholas_N/distance-measurement-with-an-ultrasonic-sensor-hy-srf05-64554e


#include "Adafruit_SSD1306.h"
Adafruit_SSD1306 display = Adafruit_SSD1306();

const unsigned int TRIG_PIN=13;
const unsigned int ECHO_PIN=12;
const unsigned int BAUD_RATE=9600;

void setup() {
	pinMode(TRIG_PIN, OUTPUT);
	pinMode(ECHO_PIN, INPUT);
	Serial.begin(BAUD_RATE);
	
	display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3C (for the 128x32)
	// init done
	display.display();
	display.setTextSize(2);
	display.setTextColor(WHITE);
}

void loop() {
	digitalWrite(TRIG_PIN, LOW);
	delayMicroseconds(2);
	digitalWrite(TRIG_PIN, HIGH);
	delayMicroseconds(10);
	digitalWrite(TRIG_PIN, LOW);
	
	const unsigned long duration= pulseIn(ECHO_PIN, HIGH);
	int distance= duration/29/2;
	
	if(duration==0) {
		Serial.println("Warning: no pulse from sensor");
	} else {
		display.clearDisplay();
		display.setCursor(0,0);
		display.print(distance);
		display.print(" Cm");
		
		display.display();
	}
	
	delay(500);
}


수정한 부분은 output 을 Serical Monitor 가 아닌, OLED 로 표시하는 부분 뿐입니다.




6. 측정


구성을 하고 몇가지 측정해 봤습니다.



오차가 좀 있지만, 조정만 하면 정확한 계측용으로 사용이 가능할 것 같습니다.

20Cm 정도 떨어트린 곳에서 측정해보면 20Cm 정도 나오는 장면입니다.


동영상으로도 찍어 봤습니다.

40Cm > 30Cm > 20Cm > 10Cm > 0 순으로 해봤습니다.



센서 바로 앞은 논리적으로 0Cm 이지만 이상한 값을 뿌려줍니다.

이는 Ultrasonic 을 보내고 받을 수 있는 공간이 나오지 않아서 그런것 같아요.




7. 추가


뜬금없이 사용 전류량을 알고 싶어졌습니다.

전류 측정은 직렬로 연결해야 알 수 있으므로, sensor 의 ground 부분을 멀티미터 +/- 를 통하게 만들어서 측정해 봤습니다.



대략 5.36 mA 가 나오네요.

스펙상으로는 2mA 이하라고 나오는데, 어느쪽이 잘못된건지 모르겠습니다.


측정할 수 있는 최대 거리를 보고자 10m 정도 앞을 비추었더니, 아래와 같이 38m 값이 나옵니다.

유효한 거리는 대략 4m 정도로 보입니다. (스펙에도 4.5 m 로 표기되어 있슴)



오실로스코프를 이용하여 Ultrasonic sound 와 반사파를 측정하는 동영상이 있습니다.


* #40 Ultrasonic Distance Sensors Arduino Tutorial and Comparison for HC-SR04, HY-SRF05, US-015

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



거리에 따라 Response 값이 변하는 것을 알 수 있습니다.



그치만, 저의 DIY 오실로스코프는 측정하지 못합니다.

DC 에 200 us 이 필요한데, 제가 만든 DIY 오실로스코프는 10us 가 최대치 입니다.


* Hardware | DSO150 Oscilloscope

http://chocoball.tistory.com/entry/HardwareDSO150Oscilloscope


처음으로 좀더 좋은 Oscilloscope 를 갖고싶다는 생각을 했습니다.




FIN


로보트 등에 많이 사용되는 센서인데, 구동이나 사용법은 간단한것 같습니다.

Ultrasonic 이라서, 귀에 들리지 않는다는 것이 좀 아쉽고 궁금하군요.

(아니 당연한 것을...)


And