'알리익스프레스'에 해당되는 글 141건

  1. 2018.02.19 Hardware | Digitial Compass - HMC5883L 사용기 - 1
  2. 2018.02.11 Hardware | MAX4466 마이크 앰프 breakout board 사용해 보기
  3. 2018.02.11 Hardware | 2.54mm pin header 구매하기
  4. 2018.01.27 Hardware | LED 구매하기
  5. 2018.01.12 Hardware | SSD1309 128x64 1.54" yellow OLED 2
  6. 2017.12.28 Hardware | HY-SRF05 초음파 거리 측정기를 사용해 보자
  7. 2017.12.26 Hardware | AliExpress 에서 Ceramic Condenser 를 구입해 보자
  8. 2017.12.14 Hardware | Heating Gun 을 만들어 보자 - 1
  9. 2017.12.11 Hardware | DSO150 firmware update
  10. 2017.12.11 Hardware | LED bar graph 를 컨트롤 해보자 - 2

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

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 | 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

Hardware | AliExpress 에서 Ceramic Condenser 를 구입해 보자

|

1. 세라믹 콘덴서


콘덴서 / 캐페시터에는 여러 종류가 있습니다.

Arduino 생활에 있어서는 많은 종류 중에서 2가지가 주로 사용 됩니다.


* 전해 콘덴서

* 세라믹 콘덴서


전해 콘덴서에 대해서는 아래 글에서 이미 다른 구매글을 올렸습니다.


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

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


오늘은 세라믹 콘덴서에 대한 구매 내용입니다.




2. 제품 선택


우리의 AliExpress 를 보면 많은 제품이 나옵니다.

가장 많이 소비자가 선택한 제품을 골라서 주문하였습니다.


* 300PCS Ceramic capacitor 2PF-0.1UF,30 valuesX10pcs=300pcs,Electronic Components Package,ceramic capacitor Assorted Kit


https://ko.aliexpress.com/item/100-New-2pf-0-1UF-Ceramic-Capacitor-Assorted-kit-Assortment-Set-30-Kinds-10PCS-300PCS-Lot/32417975915.html





3. 알아둬야 할 것


세라믹 콘덴서는 주로 작은 용량에 사용되는것 같습니다.

그래서인지, 제한된 소자 면적에 숫자를 다 적을 수가 없어 기호처럼 적혀 있습니다. 



위의 그림 중, 제일 밑에 있는 누런색이 세라믹 콘덴서 입니다. 제가 구입한거죠.


우선 pico / nano / micro 단위부터 인식해야 합니다.


* 1 pico = 1/1000 nano

* 1 nano = 1/1000 micro

* 1 micro = 1/1000


멀티미터가 nano 단위를 지원을 해서, 머릿속으로 계산을 자꾸 해야 합니다.

위의 그림에서는 154 = 150000 pF = 150 nF 입니다.


이 방법을 꼭 기억해서 사용하세요.




4. 읽어보기


자, 읽는 법도 배웠으니 도착한 세라믹 콘덴서의 값들을 확인해 봅니다.


주의할 점은, 워낙 값이 작다 보니 손으로 들고 있으면,

조그마한 흔들거림으로 값이 계속 변한다는 것입니다.


어디에 안착시켜서 값이 안정되길 기다려서 읽는게 필요합니다.

또한, 멀티미터기가 그리 좋은게 아니니 측정값의 신뢰성은 살짝 떨어진다는 것을 유의해 주세요.


가짓수가 많아서 값의 순서는 없습니다.


* 153 = 15000 pF = 15 nF --> 18.32 nF 으로 측정됩니다.



* 103 = 10000 pF = 10 nF --> 13.34 nF 으로 측정됩니다.

underline = 밑줄이 있는 것은 50V/100V 에서 가동된다는 뜻입니다. 없으면 500V 라고 하네요.



* 2 = 2 pF = 0.002 nF --> 0.002 nF 으로 측정됩니다. (Perfect !)



* 3 = 3 pF = 0.003 nF --> 0.028 nF 으로 측정됩니다.



* 68 = 68 pF = 0.068 nF --> 0.072 nF 으로 측정됩니다.



* 471 = 470 pF = 0.47 nF --> 0.45 nF 으로 측정됩니다. (Almost !)



* 472 = 4700 pF = 4.7 nF --> 6.67 nF 으로 측정됩니다.



* 30 = 30 pF = 0.03 nF --> 0.033 nF 으로 측정됩니다.



* 47 = 47 pF = 0.047 nF --> 0.047 nF 으로 측정됩니다. (Perfect !)



* 682 = 6800 pF = 6.8 nF --> 7.93 nF 으로 측정됩니다.



* 22 = 22 pF = 0.022 nF --> 0.22 nF 으로 측정됩니다. (Perfect !)



* 331 = 330 pF = 0.33 nF --> 0.308 nF 으로 측정됩니다.



* 222 = 2200 pF = 2.2 nF --> 2.606 nF 으로 측정됩니다.



* 33 = 33 pF = 0.033 nF --> 0.034 nF 으로 측정됩니다. (Almost !)



* 101 = 100 pF = 0.1 nF --> 0.113 nF 으로 측정됩니다.



* 102 = 1000 pF = 1 nF --> 1.486 nF 으로 측정됩니다.



* 75 = 75 pF = 0.075 nF --> 0.075 nF 으로 측정됩니다. (Perfect !)



* 473 = 47000 pF = 47 nF --> 32.11 nF 으로 측정됩니다.



* 152 = 1500 pF = 1.5 nF --> 2.804 nF 으로 측정됩니다.



* 15 = 15 pF = 0.015 nF --> 0.012 nF 으로 측정됩니다. (Almost !)



* 104 = 100000 pF = 100 nF --> 99.5 nF 으로 측정됩니다. (Almost !)



* 10 = 10 pF = 0.01 nF --> 0.007 nF 으로 측정됩니다. (Almost !)



* 5 = 5 pF = 0.005 nF --> 0.003 nF 으로 측정됩니다.



* 223 = 22000 pF = 22 nF --> 32 nF 으로 측정됩니다.



* 683 = 68000 pF = 68 nF --> 69.5 nF 으로 측정됩니다. (Almost !)



결과는 아래와 같습니다.


* Perfect = 4개

* Almost = 6개


그러나 전체적으로 쓸만한 것 같습니다. 안심하고 회로 구성에 사용하려 합니다.




FIN


중국제라고 무시할 수 없네요.

멀티미터(중국제)도 못 측정할 줄 알았지만 측정이 잘 되고,

세라믹 컨덴서(중국제)도 꽤 정확하게 측정됩니다.


30가지인데, 봉지가 많아서 다 측정을 못하고 어디 구석으로 굴러들어간것 같습니다.

한 5개 정도는 측정을 못했습니다. 측정해 보지 않아도 괜찮게 맞겠죠?

And

Hardware | Heating Gun 을 만들어 보자 - 1

|

1. 고장


예전에 설치하여 밤낮없이 돌아가 주던 Stick PC - MeeGoPad T07 4GB 가

어느때부터인가 Windows 10 기동이 되지 않았습니다.


* Hardware | MeeGoPad T07 4G RAM

http://chocoball.tistory.com/entry/Hardware-MeeGoPad-T07-4G-RAM


이 Stick PC 는 원활한 운용을 위해 heat sink 도 신경써서 버전업을 시켜준 상태였습니다.


* Hardware | MeeGoPad 히트싱크 업그레이드 하기

http://chocoball.tistory.com/entry/Hardware-MeeGoPad-heatsink-upgrade


* Hardware | MeeGoPad 히트싱크 업그레이드 하기 - 2

http://chocoball.tistory.com/entry/Hardware-MeeGoPad-heatsink-upgrade-2


그러던 와중에 무한 부팅에 빠지게 되었습니다.



아무래도 24시간용으로 운용하기에는 너무 빈약한 heat sink 와 내구성으로 버텨주지를 못했나 싶습니다.





2. 히팅건


특히 열이 많이 발산되는 부품들은 납땜이 제대로 되어 있지 않을 경우,

냉납이라는 현상으로 정상 작동이 되었다 안되었다 하는 불안한 현상을 보인다고 하였습니다.


무한 부팅이 일어나면서 고쳐지지 않는 것은 필시 냉납이라고 결론을 내리고 열풍기 - heating gun 을 물색합니다.


아래 제품을 구입하고 싶었으나, 세계적인 브렌드인 만큼 가격도 거의 10만원대 입니다.



구글링 하던 중, 비싼 히팅건 대용품은 2가지가 있었습니다.


1. 오븐에 굽기

a. 납이 녹는 200도 이상 올라가는 오븐을 구해야 함

b. 납은 유해 물질이므로, 전자제품 굽는것 전용으로만 활용해야 함

c. 온도 확인을 위해서 오븐 온도계가 추가로 필요함 (추가 구입)




2. 휴대용 토치

a. 대략 1.5 ~ 2만원의 가격대

b. 가스만 있으면 사용 가능

c. 불꽃을 직접 쐬므로, 부품이 녹을 수 있슴



일단 추가로 비용이 들어야 하는게 마음에 들지 않습니다. 흠...





3. 시거젝


그러다가 Youtube 에서 시거젝을 이용한 열풍기 제조기가 있다는 것을 발견했습니다.



뭔가 아주 저렴해 보이면서, 그렇게 어렵지 않게 생겼습니다.

거기다, 시거젝에서 나오는 열이 엄청날 것 같습니다. 효과는 동영상에서 검증이 되었네요.


여러가지 종류가 있습니다.

제대로 만들면 정말 물건이 되겠군요.


* 시거젝을 이용한 열풍기

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


* 스위치까지 장착된 시거젝 열풍기

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


* thermocouple 온도계를 이용하여 모니터링 하면서 작업하는 열풍기

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


* 가장 간단하게 만든 동영상

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


* PC power 를 이용하여, 가장 빠른 방법

- https://www.youtube.com/watch?v=7vgKGkxcm_c


* 더 간단한 방법

https://www.youtube.com/watch?v=7QB3ZQ1OU0w





4. 구입


필요한 것은 시거젝! 바로 알리에서 확인해 봅니다.

후훗, 역시 있군요. 개당 1.28 USD !!!



https://ko.aliexpress.com/item/12V-Auto-Car-Power-Plug-Socket-Output-20mm-Automatic-Cigarette-Lighter-Ignition-2016-New/32656607243.html


여분을 생각해서 2개를 주문합니다.




5. 도착


알리스럽게 도착하였습니다.



구조가 간단하니 파손의 위험은 없어 보입니다.



12V 20MM 규격이라 합니다.



조그만 해서 귀엽습니다.



스프링을 제껴 주면 가장 핵심부품이 보입니다.

워낙 뜨거워지니, 중간에 세라믹 (도자기) 구조물이 있습니다.





6. 전원


시거젝에 연결하는 전원은 12V 입니다.

마침 PC 의 PATA 케이블 - 주로 예전 HDD 연결하는 케이블 - 에 5V / 12V 가 출력되게 되어 있습니다.


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




12V 를 뽑기 위해서 집에 굴러다니는 ATX power 를 꺼내옵니다.

ATX 24pin power connector 에서 16, 17번 pin 을 이용하여 on/off 를 할 수 있다는걸 알게 됩니다.



끝단에 on/off 스위치를 연결하고 jump 선으로 연결해 줍니다.



문제 없이 12V 가 나오는지 확인해 봅니다.



오오오, 잘 나옵니다.




7. 시거젝 분해하기


이제 전원이 준비 되었으니, 시거젝을 12V pin 에 연결해 보도록 합니다.


우선 시거젝을 분리하여 전원선을 연결해 줘야 합니다.

먼저 시거젝을 분리합니다.



손잡이를 돌리면 분리가 됩니다.



꼭지에 있는 너트를 돌려서 분리하면 완전 분리가 됩니다.



바깥 커버를 정위치 시켜주는 스프링도 있습니다.

우리 작업에는 필요 없습니다.



완전 분리가 되었습니다.

바깥 케이스 및 스프링은 필요가 없습니다.





8. 전선 연결


많은 전류가 흐르므로 두꺼운 전원선이 필요합니다.

마침, 멀티탭 수리기 챙겨놨던 전원 케이블에서 적출합니다.


* Hardware | 멀티탭 수리기

http://chocoball.tistory.com/entry/Hardware-fix-power-strip



두꺼워서 좋습니다.

또한, 화재 예방을 위해서 전원 피복이 잘 안타는 재질입니다.



전원선 끝단을 펴 줍니다. 너트 부분에 연결할 부분은 짧게 잘라 줍니다.



요렇게요.

주의할 점은, 밑에 끼워 놓은 금속이 중심 심에 닿지 않도록 합니다. 닿게 되면 회로적으로 short 가 되니 power 가 고장날 수 있습니다.



뚜껑을 돌려서 다시 씌워 줍니다.



전선 다른 한쪽을 피복을 벗겨서 PATA pin 에 연결할 수 있도록 합니다.



연결 완료 !!!

자주 사용할 것이라면, isolation 을 확실하게 해야 하나, 이번에는 잠깐 사용할 것이므로 그냥 이대로 사용합니다.




9. 테스트


잘 동작하는지 전원을 인가해 봅니다.



오오오오!!! 잘 되네요.


마침 멀티미터에 thermocouple 센서를 통하여 200도 이상의 온도도 측정할 수 있는 기능이 있습니다.

측정해 봅니다.



납이 녹는 온도인 200도까지는 정말 쉽게 올라갑니다.

전원을 계속 인가하면 300도 이상까지도 문제 없이 올라갈 기세 입니다.





10. 작업


오늘의 수술 대상인 고장난 MeeGoPad T07 입니다.



Raspberry Pi 용 통구리 heat sink 도 붙여주고, 메모리에도 알루미늄 heat sink 도 붙여줬지만,

결국 열로 인하여 망가진 듯한 Stick PC 입니다.


붙어있던 heat sink 를 모두 벗겨내고, 캡톤 테이프를 둘러 쌓아서, 열에 약한 부품을 보호해 줍니다.



옆에 thermocouple 온도계로 측정하면서, 시간도 측정하면서 하나하나 작업합니다.

Memory 4개, CPU 1개, Storage chip 1개, Video chip 1 개 등, 모두 작업해 줍니다.



모든 작업을 완료하고, 성능이 더 좋은, 아껴 두웠던 BMR-C1 heatsink 를 붙여 줍니다.


* Hardware | BMR-C1 heatsink

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





11. 결과


결과는 망했습니다.

전원을 넣으면 기판이 엄청 뜨거워지기만 하고 전혀 video 출력으로 나오지 않습니다.


아....





FIN


오래 계획해서 실행에 옮겼지만, 결국 고치지 못했을 뿐 아니라 더 망가뜨려 버렸습니다.


이유로 생각할 수 있는 것은,

------------------------------------------------

1. 충분히 가열한답시고 너무 오래 열을 가했다.

2. 계속 온도가 올라가므로, 동일한 거리를 유지하고 지진다 한들 시간에 비례하여 전달되는 열은 엄청 많다.

3. 납볼이 촘촘히 박혀있는 경우는, 너무 높은 온도로 인하여 근접한 납들과 붙어버렸을 가능성이 있다.

4. 캡톤 테이프를 붙이긴 했지만, chip 근처의 작은 부품들이 손상되었을 수도 있다.



Upgrade 버전을 만들어보고 싶습니다.

아래 내용을 감안하여 다시 재도전 하고 싶습니다.

------------------------------------------------

1. IR infrared 센서를 이용하여 non contact 온도계를 같이 연동시킨다.

2. 설정한, 일정한 온도에 도달하면 전류를 차단하여 일정 온도 이상 올라가지 않게 한다.

3. 기성품과 기슷하게, 비접촉 온도계는 laster pointer 를 달아서 target 을 쉽게 인식할 수 있게 한다.

4. 손잡이를 더 편하게 만드며, 절연을 철저하게 해 놓는다.

5. OLED 를 이용한 설정창과 모니터링을 위해 Arduino 를 활용한다.


그런데, 열풍기 upgrade 한들, 이제 MeeGoPad T07 은 이제 없네?!!! (눈물)

And

Hardware | DSO150 firmware update

|

1. DSO150 에 대해


꼭 하고싶었던, 예전에 조립한 DSO150 오실로스코프의 firmware update 를 하려고 합니다.

DSO150 Oscilloscope 에 대해서는 아래 link 를 참조하세요.


* Hardware | DSO150 Oscilloscope

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


사용을 해보면 뭔가 제대로 동작하시 않는 순간들이 느껴집니다.

제조사인 JYE Tech 에 접속해서 한번 확인해 봅니다.


"Product Update" 라고 보이고 firmware update 를 살펴보라고 뜨네요.


https://www.jyetech.com/Products/LcdScope/e150.php



그 동안 몇번의 update 가 올라와 있었군요.

더 고마운건 몇일 전에 많이 개선된 내용이 올라왔습니다. 얏호~!





2. firmware 파일


먼저 firmware 파일인 HEX 파일을 받습니다.


https://www.jyetech.com/Products/LcdScope/Firmwares_150.php



제가 가지고 있던 제품의 firmware version 이, 113-15001-054 인데,

그 뒤에 6번의 version up 이 있었고, 최신은 최근 12월 5일에 릴리스 된 "110" 입니다.


많은 update 가 있었네요. 다운로드 받습니다.





3. flasher 파일


JYE Tech 사이트에서 flasher 를 다운로드 받을 수 있습니다.


https://www.jyetech.com/Support/Drivers&Tools.php


다만, 버전이 2.7 입니다.

원래 STMicroelectronics 에서 만든 프로그램으로 STMicroelectronics 에서 찾아보니 2015년에 릴리즈된 2.8 버전이 있습니다.


http://www.st.com/content/st_com/en/products/development-tools/software-development-tools/stm32-software-development-tools/stm32-programmers/flasher-stm32.html



다만, 프로그램을 받으려면 email 을 제출해야 합니다.

email 을 등록하면, 아래처럼 메일을 통해서 인증된 다운로드 링크를 받을 수 있습니다.






4. USB to Serial


메뉴얼을 보면, 시리얼 인터페이스가 필요합니다.


https://www.jyetech.com/Products/LcdScope/DSO150_HowToUpgradeFirmware.pdf



마침 GPS 센서 연결시에 사용했던 Serial Adapter 가 있습니다!

(원래 사용 목적은 WiFi 구축 하려고 했던건데 언제...)


* Hardware | FTDI Serial Adapter 를 사용해 보자

http://chocoball.tistory.com/entry/Hardware-FTDI-FT232RL-using



USB 에 연결하면 COM port 가 할당됩니다.





5. DSO150 firmware jumper


DSO150 의 main chip 근처에 있는 JP1 / JP2 를 납땜하여, 회로적으로 close 시켜야 firmware update 모드로 진입할 수 있습니다.


납땜하고 다시 납을 제거하는 작업이 번거러우므로, short 시킬 수 있게, 전선을 jumper 크기로 자르고

테이프로 붙여 줍니다.



요렇게요.







6. DSO150 과 Serial Adapter 연결하기


연결 정보는 다음과 같습니다.


 Serial Adapter |  DSO150
----------------------------
      RX        |    TX
      TX        |    RX
     GND        |    GND
----------------------------


RX 와 TX 를 짝으로 해서 연결하면 됩니다.



납땜을 하기 싫어서 Probe Clip 으로 연결해 보았습니다.

* Hardware | Probe Clip 을 사용해 보자


전체 그림은 이렇게 됩니다.



다만, Probe Clip 끝이 날카로워서 기판의 표피를 뚫고 GND 동판과 연결되어 short 되는 현상이 발생됩니다. 이런....



케이스와 간섭되지 않게, 끝을 안쪽으로 향하게 하여 구부러진 Pin 을 납땜합니다.

나중에 또 update 할 때가 되면, 어차피 다시 해야 하니 이 부분만 납땜해서 Pin 을 장착해 주었습니다. 



아~ 깔끔하게 연결되었습니다.




7. FlashLoader 실행하기


STMicroelectronics 에서 다운로드 받은 FlashLoader 를 인스톨 합니다.




COM port 도 잘 잡혔습니다.



음? 그러나 뭔가 문제가 있다고 계속 그럽니다.



연결했던 Silicon Labs 의 Serial Adapter 를 FTDI 로 바꾸었더니, 바로 됩니다.

아마 driver 가 안깔려 있었을 지도 모르겠습니다.


FTDI 가 거의 표준으로 사용되니 문제 없이 동작했을 수도 있었구요.

역시 여러가지 제품을 구비하고 있는게 도움이 됩니다.



정상으로 연결되면, "Remove protection" 경고가 뜹니다.



클릭하면 모든 정보가 지워진다고 하네요. OK 해줍니다.


Flash size 는 64KB 네요.



64K 옵션으로 Target 을 지정해 줍니다.



아까 다운로드 해놨던 HEX 파일을 선택하고, "Optimize (Remove some FFs)" 와

"Verify after download" 를 채크해 줍니다.



Next 를 클릭하면 이제 flushing 이 진행됩니다.

오오오오~~~!!!



완료 되었습니다 !!!





8. Activation


완료 후, version 확인을 해 보지요.



이랬던 버전이... (뒷부분 숫자가 054)



이렇게 변했습니다. (110)

LIB 숫자는 없어지고 JYE Tech 의 중국명과 전화번호가 추가되었습니다.


다만 booting 된 후, 언제부턴가 정상 동작을 하지 않습니다.



짝퉁도 많아서, firmware update 후에는 정품 확인 activation 이 필요한 것을 알게 되었습니다.

"jyetek@gmail" 에 메일을 보냅니다.



메일을 저녁에 보냈는데, 업무시간 시작한지 얼마 안되어 답변이 왔습니다!

빨리 왔네요!



바로 답변 받은 activation code 를 입력합니다.

정상 작동 하네요 !!!




9. Calibration


Activation Code 를 입력하기 전까지는 calibration 도 동작하지 않았습니다.

아마 calibration 완료된 값도 EEPROM 에 저장하는데, 이 EEPROM 접근을 차단시키고 정상 동작을 시키지 않는게

protection 방법인 듯 합니다.


Activation Code 를 입력한 후, reset 된 calibration 을 다시 해줍니다.



역시 그래프가 틀어져 있네요.



C3 와 C5 를 각각 조절해서, 이쁜 사각형 파형이 되도록 조정해 줍니다.



리플이 좀 보이지만, 이쁜 사각형이 만들어진것 같습니다.






FIN


보드에 Serial Adapter 연결 문제, FTDI 의 호환보드 문제, activation code 문제가 있었지만,

깔끔하게 완료되어서 다행입니다.


뭔가 뿌듯한 작업이었습니다.


이제 Pin 도 납땜해 놨으니, 새로운 firmware 가 올라오면 바로 적용할 수 있겠습니다.


And

Hardware | LED bar graph 를 컨트롤 해보자 - 2

|

1. 12 segments


LED bargraph 를 컨트롤시에 shift register 를 사용하면, arduino의 3가지 선으로 LED 들을 조정할 수 있습니다.

다만, shift register 의 사용 가능한 pin 갯수가 8개라서 shift register 로 컨트롤 할 수 있는 LED 갯수가 8개로 한정됩니다.


지금 가지고 있는 LED bargraph 가 12 segments, 즉 12개짜리인 관계로 4개를 사용하지 못하고 있었습니다.


* Hardware | LED bar graph 를 컨트롤 해보자 - 1

     - http://chocoball.tistory.com/entry/Hardware-LED-bar-graph-controlling-1



* Hardware | 74HC595 shift register 를 사용해 보자

http://chocoball.tistory.com/entry/Hardware-74HC595-shift-register


그럼 shift register 2개를 사용하여 12 segments 전부를 사용해 보고자 합니다.





2. Pinout


12개의 LED 를 조작하기 위한 선과 shift register 끼리 연결하는 Pin, GND, Power 선 등 연결은 간단하지만,

jumper 갯수 자체는 1개의 shift register 를 사용했을 때 보다 2배 이상 많아집니다.


  LED       | Shift Register | Shift Register | Arduino
  Bargraph  | SN74HC595N (1) | SN74HC595N (2) |  Nano
--------------------------------------------------------
  anode 7   | Q1 (pin 1)     |                |
  anode 8   | Q2 (pin 2)     |                |
  anode 9   | Q3 (pin 3)     |                |
  anode 10  | Q4 (pin 4)     |                |
  anode 11  | Q5 (pin 5)     |                |
            | Q6 (pin 6)     |                |
            | Q7 (pin 7)     |                |
            | GND (pin 8)    |                |  GND
            | Vcc (pin 16)   |                |  3.3V
  anode 6   | Q0 (pin 15)    |                |
            | DS (pin 14)    |                |  D11     --> dataPin
            | OE (pin 13)    |                |  GND
            | ST_CP (pin 12) | ST_CP (pin 12) |  D8      --> latchPin
            | SH_CP (pin 11) | SH_CP (pin 11) |  D12     --> clockPin
            | MR (pin 10)    |                |  3.3V
            | Q7' (pin 9)    | DS (pin 14)    |
  anode 1   |                | Q1 (pin 1)     |
  anode 2   |                | Q2 (pin 2)     |
  anode 3   |                | Q3 (pin 3)     |
  anode 4   |                | Q4 (pin 4)     |
  anode 5   |                | Q5 (pin 5)     |
            |                | Q6 (pin 6)     |
            |                | Q7 (pin 7)     |
            |                | GND (pin 8)    |  GND
            |                | Vcc (pin 16)   |  3.3V
  anode 0   |                | Q0 (pin 15)    |
            |                | DS (pin 14)    |
            |                | OE (pin 13)    |  GND
            |                | MR (pin 10)    |  3.3V
            |                | Q7' (pin 9)    |
--------------------------------------------------------


포인트는 serial data output 을 다음 shift register 의 serial data input 으로 해주고,

latch 와 clock 은 동기를 위해 동일한 pin ( 12 / 11 ) 에 연결하는 것입니다.


그 외 LED 와 연결하는 parallel data output 은 LED 에 각각 연결하면 됩니다.





3. Layout


선을 연결해 보면 아래와 같이 됩니다.


선이 복잡하므로 10개짜리 LED bargraph 를 사용해서 그려봤습니다.
2배로 선이 많아지죠?

그나마 resistor network 을 이용해서 실제 배선이 많이 간결해 졌습니다.
Resistor Network 에 대해서는 아래 link 글을 참조해 주세요.

* Hardware | Resistor Network 을 사용해보자


제대로 연결하면 잘 움직입니다.

아래 소스를 토대로 참조한 사이트의 핀 배열을 조금 바꾸었습니다.

(원래 사이트에서는 8 + 8 = 16 개 기준으로 만들어 졌슴)





4. Source code


아래는 참조한 사이트 입니다.


http://www.instructables.com/id/Arduino-16-LEDs-using-two-74HC595-shift-registers-/


실제 코드는 아래 github 링크에 있습니다.


- https://github.com/janisrove/Arduino-74HC595-shift-registers/blob/master/ArduinoLEDsWithShiftRegisters/ArduinoLEDsWithShiftRegisters.ino


int latchPin = 8;
int clockPin = 12;
int dataPin = 11;

int numOfRegisters = 2;
byte* registerState;

long effectId = 0;
long prevEffect = 0;
long effectRepeat = 0;
long effectSpeed = 30;

void setup() {
	//Initialize array
	registerState = new byte[numOfRegisters];
	for (size_t i = 0; i < numOfRegisters; i++) {
		registerState[i] = 0;
	}
	
	//set pins to output so you can control the shift register
	pinMode(latchPin, OUTPUT);
	pinMode(clockPin, OUTPUT);
	pinMode(dataPin, OUTPUT);
}

void loop() {
	do {
		effectId = random(6);
	} while (effectId == prevEffect);
	prevEffect = effectId;
	
	switch (effectId) {
		case 0:
			effectRepeat = random(1, 2);
			break;
		case 1:
			effectRepeat = random(1, 2);
			break;
		case 3:
			effectRepeat = random(1, 5);
			break;
		case 4:
			effectRepeat = random(1, 2);
			break;
		case 5:
			effectRepeat = random(1, 2);
			break;
	}
	
	for (int i = 0; i < effectRepeat; i++) {
		effectSpeed = random(10, 90);
		
		switch (effectId) {
			case 0:
				effectA(effectSpeed);
				break;
			case 1:
				effectB(effectSpeed);
				break;
			case 3:
				effectC(effectSpeed);
				break;
			case 4:
				effectD(effectSpeed);
				break;
			case 6:
				effectE(effectSpeed);
				break;
		}
	}
}

void effectA(int speed) {
	for (int i = 0; i < 12; i++) {
		for (int k = i; k < 12; k++) {
			regWrite(k, HIGH);
			delay(speed);
			regWrite(k, LOW);
		}
		
		regWrite(i, HIGH);
	}
}

void effectB(int speed) {
	for (int i = 11; i >= 0; i--) {
		for (int k = 0; k < i; k++) {
			regWrite(k, HIGH);
			delay(speed);
			regWrite(k, LOW);
		}
		
		regWrite(i, HIGH);
	}
}

void effectC(int speed) {
	int prevI = 0;
	for (int i = 0; i < 12; i++) {
		regWrite(prevI, LOW);
		regWrite(i, HIGH);
		prevI = i;
		
		delay(speed);
	}
	
	for (int i = 11; i >= 0; i--) {
		regWrite(prevI, LOW);
		regWrite(i, HIGH);
		prevI = i;
		
		delay(speed);
	}
}

void effectD(int speed) {
	for (int i = 0; i < 6; i++) {
		for (int k = i; k < 6; k++) {
			regWrite(k, HIGH);
			regWrite(11 - k, HIGH);
			delay(speed);
			regWrite(k, LOW);
			regWrite(11 - k, LOW);
		}
		
		regWrite(i, HIGH);
		regWrite(11 - i, HIGH);
	}
}

void effectE(int speed) {
	for (int i = 5; i >= 0; i--) {
		for (int k = 0; k <= i; k++) {
			regWrite(k, HIGH);
			regWrite(11 - k, HIGH);
			delay(speed);
			regWrite(k, LOW);
			regWrite(11 - k, LOW);
		}
		
		regWrite(i, HIGH);
		regWrite(11 - i, HIGH);
	}
}

void regWrite(int pin, bool state) {
	//Determines register
	int reg = pin / 6;
	//Determines pin for actual register
	int actualPin = pin - (6 * reg);
	
	//Begin session
	digitalWrite(latchPin, LOW);
	
	for (int i = 0; i < numOfRegisters; i++) {
		//Get actual states for register
		byte* states = ®isterState[i];
		
		//Update state
		if (i == reg) {
			bitWrite(*states, actualPin, state);
		}
	
	//Write
	shiftOut(dataPin, clockPin, MSBFIRST, *states);
	}
	
	//End session
	digitalWrite(latchPin, HIGH);
}


소스를 잘 보면 16, 15, 8, 7 등의 숫자가 나옵니다.

이를 토대로 12, 11, 6, 5 등으로 12개에 맞춰서 숫자만 바꾸어 주면 됩니다.


따로 변수를 빼놓고, 자동으로 계산해서 사용될 수 있도록 하면, LED 갯수가 바뀌더라도 편할것 같습니다.

참조 사이트 말대로 "Unlimited Pins" 구조가 되겠네요.





5. 구동


아래는 멋지게 구동되는 모습입니다.



Fully! 12개의 LED 들을 모두 사용하는 모습입니다.



거참 source code 잘 짰네요.

수학적인 컨트롤 이므로, 다양한 모양으로 컨트롤이 가능할 듯 합니다.





FIN


이제 몇개의 LED 가 되었든, shift register 를 daisy chain 으로 엮으면 못할게 없겠습니다.


And
prev | 1 | ··· | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | next