'Hardware'에 해당되는 글 222건

  1. 2017.12.11 Hardware | LED bar graph 를 컨트롤 해보자 - 2
  2. 2017.12.01 Hardware | LED bar graph 를 컨트롤 해보자 - 1
  3. 2017.12.01 Hardware | 74HC595 shift register 를 사용해 보자
  4. 2017.11.24 Hardware | bGeigie Nano 를 이용하여 방사능을 측정해 보자 2
  5. 2017.11.22 Hardware | bGeigie Nano 의 battery 를 업그레이드 해보자
  6. 2017.11.22 Hardware | Safecast bGeigie Nano 를 조립해 보자 - 2
  7. 2017.11.22 Hardware | Safecast bGeigie Nano 를 조립해 보자 - 1
  8. 2017.11.21 Hardware | AliExpress 에서 condenser 를 구입해 보자
  9. 2017.10.12 Hardware | VL53L0X 레이저 거리 측정 센서 사용해 보기 8
  10. 2017.10.01 Hardware | Rotary Encoder 를 사용해 보자

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

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

|

1. Arduino 와 LED bar graph


이미 LED bar graph 를 사용해 봤습니다.

아래 글들은 본 포스팅과 관련 있는 글 들입니다.


* Hardware | LED bar graph 를 이용해 보자

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


* Hardware | Resistor Network 을 사용해보자

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


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

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


우선 arduino 와 direct 연결과 shift register 1개를 이용해서 연결을 해보기로 합니다.





2. Digital Pin 으로 직접 컨트롤


LED bar graph 의 anode 쪽을 arduino 의 digital Pin 에 직접 연결하여 전원을 공급함과 동시에 LED 를 on/off 하는 방법입니다.



Source code 는 쉽지만, arduino 와 직접 연결되는 선이 많아집니다.

또한, D13 pin 까지 쓰면 더이상 연결할 수가 없습니다.


   LED       |   Arduino
   Bargraph  |   Nano
----------------------------
   anode 2   |     D2
   anode 3   |     D3
   anode 4   |     D4
   anode 5   |     D5
   anode 6   |     D6
   anode 7   |     D7
   anode 8   |     D8
   anode 9   |     D9
   anode 10  |     D10
   anode 11  |     D11
   anode 12  |     D12
   anode 13  |     D13
     GND     |     GND
----------------------------


참고한 사이트는 아래와 같습니다.

http://www.4tronix.co.uk/arduino/ArduinoLearning.pdf


int timer = 50; // The higher the number, the slower the timing. int pins[] = { 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 }; // an array of pin numbers int num_pins = 12; // the number of pins (i.e. the length of the array) void setup() { int i; for (i = 0; i < num_pins; i++) // the array elements are numbered from 0 to num pins - 1 pinMode(pins[i], OUTPUT); // set each pin as an output } void loop() { int i; for (i = 0; i < num_pins; i++) { // loop through each pin... digitalWrite(pins[i], HIGH); // turning it on, delay(timer); // pausing, digitalWrite(pins[i], LOW); // and turning it off. } for (i = num_pins - 1; i >= 0; i--) { digitalWrite(pins[i], HIGH); delay(timer); digitalWrite(pins[i], LOW); } }

Source code 는 참고한 사이트것을 그대로 사용하빈다.

단순히 digitalWrite 를 이용한 컨트롤 되겠습니다.



연결 사진 입니다.



구동 동영상 입니다.





3. Shift Register 를 이용하는 방법


Shift Register 를 이용하면 data / latch / clock 핀인 3개의 digital pin 만으로 컨트롤이 가능합니다.

여러 sensor 를 사용할 때에는 이 방법이 최선으로 보입니다.


이미 shift register 를 이용하여 확인해 봤습니다만, 이 글에서 한번 더 해봅니다.


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

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


우선 74HC595 pin 정보 입니다.



원본 data sheet 는 다음과 같습니다.


595datasheet.pdf


참고한 link 는 다음과 같습니다.


https://www.sqlskills.com/blogs/paulselec/category/shift-registers.aspx


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


  LED       | Shift Register | Arduino
  Bargraph  |   SN74HC595N   |  Nano
---------------------------------------
  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)     |
  anode 6   | Q6 (pin 6)     |
  anode 7   | Q7 (pin 7)     |
            | GND (pin 8)    |  GND
            | Vcc (pin 16)   |  3.3V
  anode 0   | Q0 (pin 15)    |
            | DS (pin 14)    |  D11     --> dataPin
            | OE (pin 13)    |  GND
            | ST_CP (pin 12) |  D8      --> latchPin
            | SH_CP (pin 11) |  D12     --> clockPin
            | MR (pin 10)    |  3.3V
----------------------------------------


Layout 입니다.

Arduino 에서는 컨트롤 위한 선이 3개만 사용된 것을 보실 수 있을껍니다.



연결된 모습니다.



Source code 입니다.


shiftOut 이라는 명령어를 쓰면 쉽게 동작시킬 수 있으나,

참고한 사이트의 제작자는 오로지 공부를 위해 digitalWrite 명령어를 사용했습니다.


/*
  Driving a 74HC595 shift register
  01/27/2010
*/

// This pin gets sets low when I want the 595 to listen
const int pinCommLatch = 8;

// This pin is used by ShiftOut to toggle to say there's another bit to shift
const int pinClock = 12;

// This pin is used to pass the next bit
const int pinData = 11;

void setup() {
	pinMode (pinCommLatch, OUTPUT);
	pinMode (pinClock, OUTPUT);
	pinMode (pinData, OUTPUT);
	//Serial.begin (56600);
} // setup

// Using my own method with as few instructions as possible
// Gotta love C/C++ for bit-twiddling!
void sendSerialData2 (byte  value) {
	// Signal to the 595 to listen for data
	digitalWrite (pinCommLatch, LOW);
	
	for (byte bitMask = 128; bitMask > 0; bitMask >>= 1) {
		digitalWrite (pinClock, LOW);
		digitalWrite (pinData, value & bitMask ? HIGH : LOW);
		digitalWrite (pinClock, HIGH);
	}
	
	// Signal to the 595 that I'm done sending
	digitalWrite (pinCommLatch, HIGH);
}  // sendSerialData2
  
void loop() {
	for (int counter = 1; counter < 256; counter++) {
		sendSerialData2 (counter);
		delay (75);
	}
} // loop


구동시킨 동영상 입니다.





4. 더 간단하게 사용해 보기


위와 같은 동작을 시키는 좀더 간단한 tutorial 이 있습니다.


https://www.arduino.cc/en/Tutorial/ShiftOut


shiftOut 이라는 명령어로 쉽게 구현되었습니다.

https://www.arduino.cc/reference/en/language/functions/advanced-io/shiftout/


//**************************************************************//
//  Name    : shiftOutCode, Hello World                                
//  Author  : Carlyn Maw,Tom Igoe, David A. Mellis 
//  Date    : 25 Oct, 2006    
//  Modified: 23 Mar 2010                                 
//  Version : 2.0                                             
//  Notes   : Code for using a 74HC595 Shift Register           //
//          : to count from 0 to 255                           
//****************************************************************

//Pin connected to ST_CP of 74HC595
int latchPin = 8;
//Pin connected to SH_CP of 74HC595
int clockPin = 12;
////Pin connected to DS of 74HC595
int dataPin = 11;



void setup() {
	//set pins to output so you can control the shift register
	pinMode(latchPin, OUTPUT);
	pinMode(clockPin, OUTPUT);
	pinMode(dataPin, OUTPUT);
}

void loop() {
	// count from 0 to 255 and display the number 
	// on the LEDs
	
	for (int numberToDisplay = 0; numberToDisplay < 256; numberToDisplay++) {
		// take the latchPin low so 
		// the LEDs don't change while you're sending in bits:
		digitalWrite(latchPin, LOW);
		// shift out the bits:
		shiftOut(dataPin, clockPin, MSBFIRST, numberToDisplay);  
		
		//take the latch pin high so the LEDs will light up:
		digitalWrite(latchPin, HIGH);
		// pause before next value:
		delay(50);
	}
}


위의 soruce 는 위의 동영상과 완벽하게 동일한 동작을 합니다.

comment out 라인만 빼면 정말 간단하게 구현되어 있다는 것을 알 수 있죠?


/*
  Shift Register Example
  Turning on the outputs of a 74HC595 using an array

  Hardware:
  * 74HC595 shift register 
  * LEDs attached to each of the outputs of the shift register
 */

//Pin connected to ST_CP of 74HC595
int latchPin = 8;
//Pin connected to SH_CP of 74HC595
int clockPin = 12;
////Pin connected to DS of 74HC595
int dataPin = 11;

//holders for infromation you're going to pass to shifting function
byte data;
byte dataArray[10];

void setup() {
	//set pins to output because they are addressed in the main loop
	pinMode(latchPin, OUTPUT);
	Serial.begin(9600);
	
	//Binary notation as comment
	dataArray[0] = 0xFF; //0b11111111
	dataArray[1] = 0xFE; //0b11111110
	dataArray[2] = 0xFC; //0b11111100
	dataArray[3] = 0xF8; //0b11111000
	dataArray[4] = 0xF0; //0b11110000
	dataArray[5] = 0xE0; //0b11100000
	dataArray[6] = 0xC0; //0b11000000
	dataArray[7] = 0x80; //0b10000000
	dataArray[8] = 0x00; //0b00000000
	dataArray[9] = 0xE0; //0b11100000
	
	//function that blinks all the LEDs
	//gets passed the number of blinks and the pause time
	blinkAll_2Bytes(2,500); 
}

void loop() {
	for (int j = 0; j < 10; j++) {
		//load the light sequence you want from array
		data = dataArray[j];
		//ground latchPin and hold low for as long as you are transmitting
		digitalWrite(latchPin, 0);
		//move 'em out
		shiftOut(dataPin, clockPin, data);
		//return the latch pin high to signal chip that it 
		//no longer needs to listen for information
		digitalWrite(latchPin, 1);
		delay(300);
	}
}


// the heart of the program
void shiftOut(int myDataPin, int myClockPin, byte myDataOut) {
	// This shifts 8 bits out MSB first, 
	//on the rising edge of the clock,
	//clock idles low
	
	//internal function setup
	int i=0;
	int pinState;
	pinMode(myClockPin, OUTPUT);
	pinMode(myDataPin, OUTPUT);
	
	//clear everything out just in case to
	//prepare shift register for bit shifting
	digitalWrite(myDataPin, 0);
	digitalWrite(myClockPin, 0);
	
	//for each bit in the byte myDataOut
	//NOTICE THAT WE ARE COUNTING DOWN in our for loop
	//This means that %00000001 or "1" will go through such
	//that it will be pin Q0 that lights.
	for (i=7; i>=0; i--) {
		digitalWrite(myClockPin, 0);
		
		//if the value passed to myDataOut and a bitmask result 
		// true then... so if we are at i=6 and our value is
		// %11010100 it would the code compares it to %01000000 
		// and proceeds to set pinState to 1.
		
		if ( myDataOut & (1 << i) ) {
			pinState= 1;
		} else {
			pinState= 0;
		}
	//Sets the pin to HIGH or LOW depending on pinState
	digitalWrite(myDataPin, pinState);
	//register shifts bits on upstroke of clock pin  
	digitalWrite(myClockPin, 1);
	//zero the data pin after shift to prevent bleed through
	digitalWrite(myDataPin, 0);
	}
	
	//stop shifting
	digitalWrite(myClockPin, 0);
}


//blinks the whole register based on the number of times you want to 
//blink "n" and the pause between them "d"
//starts with a moment of darkness to make sure the first blink
//has its full visual effect.
void blinkAll_2Bytes(int n, int d) {
	digitalWrite(latchPin, 0);
	shiftOut(dataPin, clockPin, 0);
	shiftOut(dataPin, clockPin, 0);
	digitalWrite(latchPin, 1);
	delay(200);
	
	for (int x = 0; x < n; x++) {
		digitalWrite(latchPin, 0);
		shiftOut(dataPin, clockPin, 255);
		shiftOut(dataPin, clockPin, 255);
		digitalWrite(latchPin, 1);
		delay(d);
		digitalWrite(latchPin, 0);
		shiftOut(dataPin, clockPin, 0);
		shiftOut(dataPin, clockPin, 0);
		digitalWrite(latchPin, 1);
		delay(d);
	}
}


위 소스는 segment 의 모양을 dataArray 를 사용하여 표현하는 soruce 입니다.



위의 소스를 구동시킨 동영상 입니다.




FIN


12 segments LED bar graph 를 한개만 써서 하는 것은 확인해 봤습니다.


1 개의 shift register 만 사용하면 8개까지만 사용이 가능하니, 12 segments 을 모두 활용하지 못했습니다.

Shift register 를 daisy chain 으로 추가 엮어 주면 가능하다고 합니다.


따로 글을 작성해 보겠습니다.


And

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

|

1. Shift Register


LED bar graph 를 컨트롤 하려면 shift register 가 필요 합니다.


Arduino 의 digital pin 에 직접 연결하면 LED bar graph 를 컨트롤 할 수 있습니다만,

D2 ~ D13 에서, 총 12개의 LED 만 동시에 컨트롤을 할 수가 있습니다.


LED bar graph 에 대해서는 다음 글을 참고해 주세요.


* Hardware | LED bar graph 를 이용해 보자

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


이제 Shift Register 를 구입해 보고자 합니다.




2. 구입


AliExpress 에서 검색해 봅니다.

10개에 1천원도 하지 않는 가격!!! 거기에 무료 배송이라니.

오히려 제가 업자 걱정을 하게 되는 가격입니다.


https://ko.aliexpress.com/item/10pcs-free-shipping-SN74HC595N-SN74HC595-74HC595N-74HC595-DIP-16-Counter-Shift-Registers-Tri-State-8-Bit/32429190104.html





3. 도착


포장은 DIP 다리가 잘 보호되도록 플라스틱 릴에 넣어서 왔습니다.



제가 개인적으로 좋아하는 Texas Instruments 사에서 제조된 chip 입니다.



대학교 실험과목에서 많이 썼었는데...

그땐 공부가 너무 싫어 놀기에만 정신이 팔려 자세히 알지도 못했습니다.


이제는 공부의 개념이 아니라 취미의 개념으로 접근하니 즐겁기만 합니다.




4. Specification


스펙은 제조사에서 공유하고 있습니다.


sn74hc595.pdf


아마 이 문서만 빠삭하게 알고 있으면 활용도 100% 일 듯 합니다.

온갓 온도 / 전압 특성과 패키징에 대해서 자세히 나와 있습니다.


Chip 개발에 있어, 간단한 것이라도 이렇게 많은 내용을 포함해야 한다니 대단한 작업인것 같습니다.



회로 구성에 있어서 보통 5V 로 구동한다고 하지만,

Texas Instruments 에서 생산한 SN74HC959 는 3.3V 에서도 잘 동작하도록 제조된것 같습니다.

사양서에도 2V ~ 6V 사이에 구동된다고 합니다.



Clock 에 따라서 각각의 pin state 를 컨트롤 하고 있다는 것을 알 수 있습니다.




Function table 을 가지고 chip 의 기능을 모두 설명해 놨습니다.
위의 두개의 표만으로 이 chip 의 구동에 대해서 설명이 됩니다.




5. Layout


Shift Register 를 이용하여 arduino 와 연결하면 다음과 같은 구성이 됩니다.


  LED       | Shift Register | Arduino
  Bargraph  |   SN74HC595N   |  Nano
---------------------------------------
  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)     |
  anode 6   | Q6 (pin 6)     |
  anode 7   | Q7 (pin 7)     |
            | GND (pin 8)    |  GND
            | Vcc (pin 16)   |  3.3V
  anode 0   | Q0 (pin 15)    |
            | DS (pin 14)    |  D11     --> dataPin
            | OE (pin 13)    |  GND
            | ST_CP (pin 12) |  D8      --> latchPin
            | SH_CP (pin 11) |  D12     --> clockPin
            | MR (pin 10)    |  3.3V
----------------------------------------


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



회로도에서도 알 수 있듯이, arduino 와의 연결선은 단 3개로 단축됩니다.



모든 연결은 shift register 가 담당하니, 선의 복잡도는 그대로일 수 밖에 없습니다.

다만, 복잡한 연결은 shitf register 가 담당하고 arduino 는 추가 기기들을 연결하는 controller 역할을 더 수행할 수 있게 됩니다.





6. Source


구동 source code 입니다.


int latchPin = 12;
int clockPin = 11;
int dataPin = 13;
byte leds = 0;
int currentLED = 0;

void setup() {
	pinMode(latchPin, OUTPUT);
	pinMode(dataPin, OUTPUT);
	pinMode(clockPin, OUTPUT);
	
	leds = 0;
}

void loop() {
	leds = 0;
	
	if (currentLED == 7) {
		currentLED = 0;
	} else 	{
		currentLED++;
	}
	
	bitSet(leds, currentLED);
	
	digitalWrite(latchPin, LOW);
	shiftOut(dataPin, clockPin, LSBFIRST, leds);
	digitalWrite(latchPin, HIGH);
	
	delay(250);
}




7. 확인


실제 연결 사진입니다.



스파게티~~~.





8. 번외


Shift register 는 clock 과 전압 high/low 를 통하여 컨트롤 하게 됩니다.


예전에 AliExpress 에서 부품을 조립하여 사용하는 Oscilloscope 인 DSO 150 를 만들어 놨으니,

파형을 확인해 보고 싶어졌습니다.


* Hardware | DSO150 Oscilloscope

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


Arduino 의 D12 에서 clock 을 발생하므로 확인해 봅니다.



흠흠, 정말 사각형 클럭이 보이네요.


D11 인 data 통신을 확인해 봅니다.



필요한 값을 shift register 에게 보내고 있다는 것을 알 수 있습니다.


LED 측의 값을 확인해 봅니다.



LED 점등은 shift register 를 통하여 High/Low 로 확인이 됩니다.




FIN


Shift register 는 정말 clock 으로 동작하는 것을 확인할 수 있었습니다.

이제 LED bar graph 두개 이상을 한번 연결해 보고싶네요.

And

Hardware | bGeigie Nano 를 이용하여 방사능을 측정해 보자

|

1. 측정해보자


방사능 측정기 조립 과정은 아래 두 link 들에 있습니다.


* Safecast bGeigie Nano 를 조립해 보자 - 1

http://chocoball.tistory.com/entry/Hardware-Safecast-bGeigie-Nano-1


* Safecast bGeigie Nano 를 조립해 보자 - 2

http://chocoball.tistory.com/entry/Hardware-Safecast-bGeigie-Nano-2


드디어 방사능 측정을 시작했습니다.

배송받기 까지도 오래 걸렸지만, 완성 후 측정까지도 오래 걸렸습니다.


우선 차의 유리에 부착하여 측정했습니다.



센서가 밖으로 향하게 하고, 자동차 안에서는 OLED 를 볼 수 있으니, 상황을 잘 알수 있습니다.

9개의 GPS 위성과 연결되어 있고, 고도 5m, 측정 개시후 1시간 41분이 지나고 있다는 정보까지 자세하게 나옵니다.



눈으로 동작을 확인하니 즐겁기 그지 없습니다.



46CPM 은 생활 방사능 정도 입니다.




2. App 과 연동해 보자


Safecast 에서 만들어 내 놓은 "Safecast" 를 통하여 스마트폰과 bGeigie Nano 간에 Bluetooth 연동이 가능합니다.



저는 iPhone 이므로, App Store 에서 검색하면 나옵니다.



App 을 인스톨 후, 실행시키면, 가장 가까운 bGeigie Nano 의 bluetooth 를 자동으로 찾아줍니다.

Bluetooth 모듈이 달린 kit 이 조금 더 비쌌지만, 그 값을 하는것 같아요.



연결되면 bGeigie Nano 의 동작 상황을 자세하게 알 수 있습니다.



GPS 를 찾으면, 측정값과 함께 GPS 정보를 함께 저장하기 시작합니다.


이제 bGeigie Nano 의 OLED 를 확인하지 않아도, App 을 통하여 측정 상황을 확인할 수 있습니다.

측정이 끝나면, 바로 인터넷을 통하여 Safecast API 로 측정 log 를 쏴줄수 있습니다.



"api.safecast.org" 에서 자기가 올린 data 를 확인할 수 있으며,

data 내용이 문제 없다면, 추가 정보를 기입하고 승인 요청을 합니다.

data 에 문제가 없고 승인이 끝나면, 전 세계인에게 공유됩니다.




3. Singapore


마침 Singapore 에 한달짜리 출장을 가게 되었습니다.

Singapore 는 어떤 상황인지 궁금합니다.


숙소에서 Singapore Sports Hub 까지 자전거를 타고 가면서 측정해 봅니다.



사용된 자전거는 10월 한달 free promotion 중인 OBike 와 함께 하였습니다.


Obike 는 길 가다가 자전거를 발견하면 바로 타고, 목적지에서 버리면 되는 간편한 시스템 입니다.

비용은 탄 시간에 맞게 지불하면 됩니다만, Singapore 에서는 현재 동일한 서비스를 제공하는 회사들이 있어서

Free promotion 기간이었습니다.


OBike 에 대해서는 따로 글을 작성하였습니다.


쓰고 목적지에서 버리는 자전거

http://chocoball.tistory.com/entry/Life-bicycle-sharing


저기 오늘 같이할 자전거가 저를 기다리고 있군요.



자전거에 문제 없는지 확인하고 바로 올라 탑니다.



조금 돌아왔더니만 1Km 더 주행했습니다.



방사능 측정 결과 입니다.

문제 없는 수치 입니다.


자세히 보면, 하천 근처나 공사가 많이 이루어진 장소에서 값이 비교적 높게 나옵니다. 흠흠... 그렇군.




4. 하늘에서 측정하기


후꾸시마 사태때에 일본 정부에서 항상 빼놓지 않고 이야기 한 내용이,

"비행기 타고 다니면 장난 아니게 방사능 쐬지만 문제 없잖아" 였습니다.


실제로 그런지 무척 궁금한 내용입니다.


귀국하는 비행기에서 측정할 수 있도록 full 충전 해놓고 드디어 비행기 이륙 !



비행기에서 다행히 창가쪽 자리가 배정되었습니다.

GPS 도 무리없이 잘 잡히네요.



이륙 후, 고도 1282m 까지 올라갔습니다.

41 CPM 이면 지상과 거의 다를바 없습니다. 그렇군...



4682m 올라 왔습니다.

86 CPM 으로 값이 살짝 올라갔습니다. 비가 많이 들치고 먼지가 쌓이는 창틀의 홈에서도 81 CPM 이었으니...



5431m. 표시하는 값이 새로운 영역에 도달했습니다.

95 CPM 은 여지껏 처음 보는 수치 입니다.



5873m. 126 CPM 입니다.

이는 지상의 값인 60 CPM 의 약 2배의 값입니다.



6226m. 134 CPM 를 가리킵니다.

고도에 따라 우주에서 오는 방사능은 점점 강해지는 것을 눈으로 실제로 확인하게 되네요.

대기층의 중요함을 정말 피부로 느낍니다.



7362m. 183 CPM.



8201m. 214 CPM.



9104m. 257 CPM.



거의 지상 10Km 상공에서 동영상을 찍어봅니다.



9867m. 309 CPM.

기어이 300 CPM 을 넘었습니다. 지상의 5배 정도 입니다.



비행기의 항속 높이 입니다.

12600m. 524 CPM 을 찍었습니다.


이정도면 저의 사타구니를 납으로 만든 컵으로 가려야 하는게 아닌가 진심 걱정되었습니다.

이렇게 쎌 줄이야 !!!



후덜덜 하네요.

비행기 많이 타면 방사능 샤워를 한다는 이야기는 맞는것 같습니다.



App 을 통해서도 확인이 가능했습니다.



최종적으로 괴적을 그려봤습니다.

중간에 이빨이 빠졌지만, 대체로 잘 측정이 되었습니다.




FIN


도보, 자전거, 자동차, 비행기를 이용하여 여러가지 측정해 봤습니다.

비행기를 빼곤, 일반적으로는 무시할 수 있는 일반적인 수치를 보여줬습니다.


다만, 앞으로 비행기 탈 일이 생기면, 납으로 만든 컵을 가지고 다닐까 합니다.

And

Hardware | bGeigie Nano 의 battery 를 업그레이드 해보자

|

1. 시작


bGeigie Nano 가 무엇인지, 어떻게 조립했는지는 아래 link 들을 참조하세요.


* Safecast bGeigie Nano 를 조립해 보자 - 1

http://chocoball.tistory.com/entry/Hardware-Safecast-bGeigie-Nano-1


* Safecast bGeigie Nano 를 조립해 보자 - 2

http://chocoball.tistory.com/entry/Hardware-Safecast-bGeigie-Nano-2


bGeigie Nano 를 조립하면서 설명서를 보면, battery 가 기존 2000mAh 에서 1200mAh 로 바뀐 것을 알게 됩니다.


https://github.com/Safecast/bGeigieNanoKit/wiki/Assembly-Manual



제작자에게 문의한 결과 battery 수급 문제와 두께로 인한 문제를 언급하고 있습니다.


https://groups.google.com/forum/#!searchin/safecast-devices/battery|sort:date/safecast-devices/DSUfd7i8IUQ/G6Hjsrn-BwAJ


이게 충전을 하고 가지고 다니는 것이라, 가능하면 큰 용량의 battery 를 사용하는게 좋을것 같았습니다.

아래는 기존 battery 사진입니다.



두꺼운 전선과 Li-Ion 충방전에 필요한 보호회로가 붙어 있습니다.

이 대용품을 찾아야 합니다.




2. 고용량 제품 찾기


한국내에서 제품을 찾기도 쉽지 않을 뿐더러, battery 제품은 가격이 비쌉니다.

AliExpress 에서 폭풍검색 합니다.


몇몇 제품이 물망에 올랐지만, bGeigie Nano 에 잘 수납되어야 하고, 용량이 2000mAh 이상인 것을 계속해서 찾던 중,

아래 제품을 알게 됩니다.


* 3.7V 2500mAh polymer lithium ion battery


https://ko.aliexpress.com/item/3-7V-2500mAh-645455-polymer-lithium-ion-Li-ion-battery-for-mp3-mp4-tablet-pc-DVD/32797293075.html



크기가 확신할 수는 없었지만, 기존의 battery 의 폭과 두께가 크게 차이나지 않을것 같았습니다.

7.14 USD 는 정말 매력적인 가격이 아닐 수 없습니다.




3. 도착


배송 완료까지 거의 1달 걸렸습니다.

Battery 라서 좀 까다로왔는지 모르겠습니다.

배송 추적을 해 보면, Turkey 에 보내졌다고 나왔는데, 어느샌가 저의 주소로 배달되었습니다.



예상했던 그대로 배송이 되었습니다.



막상 upgrade 를 할 수 있다는 마음에 매우 흥분되었습니다.

오오오~~~!!! 대용량 battery 다!



bGeigie Nano 보드에 올려 봅니다.

크기가 정말 딱 맞습니다. 거의 여유공간은 없이 들어갑니다.


제작자가 이야기 했듯, 날카롭게 쏫아 오른 납땜 부분이 battery 를 찔러서 터질 수 있으니,

동봉되어 있던 쿠션용 스폰지를 붙여 놓은 플라스틱 보드지가 두껍고 딱 크기가 좋아서 바로 뒷에 덧대어 줍니다.



이렇게 맞춤일수가.



두께도 적당합니다. 쿠션 테이프까지 붙이고 나사를 조이면, 확실하게 고정이 됩니다.

완벽하게 고정되는 순간입니다.





4. Connector


여기서 문제가 생깁니다.

위의 사진에서도 알 수 있듯이 선만 달랑 있고, 기판과 연결되는 connector 가 없습니다.


Connector 의 사양 확인해야 하는데, 베니어 켈리퍼로 칫수를 측정해도 아주 미묘한 차이인지라 어떤것을 주문해야 할지 난감했습니다.



AliExpress 의 여러 판매자 제품들을 보니, 대략 위의 규격중에 하나라는 것을 알게 되었습니다.

처음에는 XH 2.54mm 가 아닐까 했습니다만, 확신할 수 없었습니다.


그래서 처음부터 동봉되어 있는 battery의 connector 를 뚤어져라 보았죠. 뭔가 있을것 같았습니다.



그렇습니다. 뭔가 적혀있었어요. "H JS" !!!


또한, 이 bGeigie Nano 에 들어가는 부품들은 OLED 모니터부터 Bluetooth 모듈까지 SparkFun 회사꺼를 많이 사용합니다.

그럼 혹시...?


SparkFun 에서 취급하는 Connector 를 찾아봅니다. Bingo!

SparkFun 은 JST 규격의 2.0mm 제품을 선호한다고 나와 있습니다.

그리고 친절하게도 JST 2.0mm 는 PH 두개의 극을 가지는 것과 같다는 것도 나와 있었습니다.


* Power Connectors

https://learn.sparkfun.com/tutorials/connector-basics/power-connectors




정리하자면, JST 2.0mm = PH 2-pin connector 라는 것이였습니다.

한달 기다렸는데 좀더 기다리죠 뭐. Connector 도 주문을 합니다.



* JST 2.0 PH 2-Pin Connector


https://ko.aliexpress.com/item/50-SETS-Mini-Micro-JST-2-0-PH-2-Pin-Connector-Plug-with-Wires-Cables-120MM/32824363436.html



한 3주 걸려서 도착했습니다.

도대체 이거 하나 upgrade 하는데 얼마나 걸리는지 모르겠습니다. (거의 2달)



커넥터의 모양을 요리조리 살펴 봅니다.



흠흠 맞는것 같네요.



Female connector 에 고정되는 돌기도 잘 구현되어 있습니다.



실제로 bGeigie Nano 에 연결해 봅니다.



딱 맞군요!



분리시, 손톱을 거는 돌기가 정품보다 작습니다.



모양의 거의 동일합니다.




5. Upgrade 효과


아래 사이트를 보면, 계산적으로 2500mAh 면 3일정도 가는 것으로 되어 있습니다.


https://github.com/Safecast/bGeigieNanoKit



실제로 upgrade 하고 full 충전 후, 한번도 끄지않고 사용해 보면, 딱 48 시간 = 이틀 정도 갑니다.


1300mAh 정도면 하루+12시간이라고 표현 되어 있으니, 계산상으로만 보면 12시간 늘어난 것인데,

위성 통신이랑, Bluetooth 통신도 있으므로, 실제로는 1일이 2일 정도로 늘지 않았나 생각해 봅니다.



Battery low 가 뜨면 로깅이 중지됩니다.

그냥 측정만 하는것 같아요.



Battery low 가 뜨는 타이밍은 약 10% 정도인것 같습니다.




FIN


좋은 점

당연히 오래 간다는 점이죠!


아쉬운 점

Connector 의 선이 한가닥으로 되어 있어서 전류량적으로 아쉽다.

Connector 의 고깔 부분을 손톱으로 잡고 뽑을 수 있게 되어 있는데, 이 부분의 크기가 작아서 아쉽다.

2500mAh 면 대략 3일인데, full 2일이면 끝난다. 혹시... 용량표기의 오류?

And

Hardware | Safecast bGeigie Nano 를 조립해 보자 - 2

|

이 글은 전편이 있습니다. 먼저 다음 link 를 꼭 읽고 오세요.


* Safecast bGeigie Nano 를 조립해 보자 - 1

http://chocoball.tistory.com/entry/Hardware-Safecast-bGeigie-Nano-1




1. Mainboard


bGeigie Nano 의 중추인 mainboard 입니다.



보드 버전은 1.1r5a 입니다.

조립 메뉴얼이 초기 버전을 기준으로 제작되어 있다 보니, 나름 최신 보드와 맞지 않는 부분들이 있습니다.

대략 예상하면서 메뉴얼을 따라가면 그리 큰 문제는 없습니다.



모든 실장 위치에 금도금이 되어 있어서 납이 잘 붙게 되어 있습니다.

잘 만들어진 보드라고 생각합니다.




2. 부품과 아크릴 지지대


부품은 따로 포장되어 있습니다.

제가 받은 제품의 고유 번호는 2981 되겠습니다.



기판을 보호하고 모양을 만들어주는 아크릴 지지대와 logging 을 위한 micro SD + adapater,

그리고 GM tube 를 보호해 주는 철망이 보입니다.






3. 저항 납땜하기


이제 본격적으로 작업을 시작합니다.

저항을 하나씩 검수해 가며 납땝합니다.

예전에 만들어 놓은 Transistor Tester 를 이용했습니다.


* Transistor Tester

http://chocoball.tistory.com/entry/Hardware-Transistor-Tester




10kΩ 짜리를 측정해 봅니다. 대략 오차범위 이내 입니다. 납땜해 줍니다.



1kΩ 짜리를 측정해 봅니다. 대략 오차범위 이내 입니다. 납땜해 줍니다.



4.5kΩ 짜리를 측정해 봅니다. 대략 오차범위 이내 입니다. 납땜해 줍니다.



겨우 4개 저항을 납땜했지만 뿌듯합니다. 기념샷 찍어줍니다.



계속 측정하고 땜질하고 반복합니다.



궁금해졌습니다. 왜 예전 방식인 "탄소 피막 저항" 일까?

온도변화에 약하며 정확도가 떨어지는 제품을 썼을까?


"메탈 피막 저항" 은 정확하며 온도변화에도 강한데 말입니다.


저항에 대해서는 아래 link 를 읽어보세요. 저도 처음에는 구분을 못했답니다.

http://chocoball.tistory.com/entry/Hardware-buying-resistors



집에 굴러다니는 메탈 피막 저항을 측정해 보는 것으로 궁금함은 더해가지만,

일단 접어두고 나중에 community 에 물어봐야겠습니다.





4. 콘덴서 납땜하기


저항 다음에는 콘덴서를 납땜해 줍니다.



총 3개가 있습니다. 100nF 이라고 합니다.



정말 소중하게 한땀한땀 납땜하였습니다.



뒷면의 리드로 모드 잘라주었습니다. 깔끔하게 잘 했다고 자화자찬을 해 봅니다.





5. 그 외 부품 납땜하기


저항과 콘덴서로 손이 어느정도 익었으니, 속도를 좀 내어 봅니다.

트랜지스터 1개와 스위치류, LED 등을 납땜해 갑니다.



C1815 라는 제품이지만 잘 모릅니다.



측정해 보면 NPN 트랜지스터 입니다. 납땜해 줍니다.



토클 스위치입니다. 일본에서 제조된 제품이네요.



사진으로는 크지만 앙증맞게 생겼습니다. 금속으로 된 스위치로 딸깍거리며 동작시키는 것이 은근 재미 있습니다.



무슨 용도의 스위치 인지는 모르겠습니다.

조이스틱처럼 누르기도 되고 상하좌우 움직일 수 있습니다. 메뉴 설정등에 사용될 듯 합니다.



밑면입니다.



스피커 입니다. 제품 마무리가 잘 되어 있습니다.



다이오드 입니다. 열에 약하니 최대한 짧게 열을 가하여 납땜합니다.



전원 스위치 입니다.

전류가 흐르는 곳이니 납을 많이 먹여 납땜합니다.



딥스위치 입니다. 납땜합니다.



Alerting 과 Counting 을 하는 LED 입니다.

제품 버전에 따라 빨간색 대신 파란색도 있었던것 같습니다.


조립하는 사람에 따라 빨간색을 counting 으로 사용하는 사람도 있고 여러가지 입니다.

저는 Alerting 에는 빨간색, Counting 에는 흰색을 선택해서 납땜하였습니다.



LED 는 이런 값을 보여주는군요.



Transistor Tester 로 측정시 불이 들어왔다 나갔다 하는 모습이 신기하여 동영상으로도 찍어 봤습니다.



아마도 측정시에 여러가지 패턴으로 전류/전압을 가해보고 결과를 도출하는 것 같습니다.



자잘한 부품을 모두 납땜한 모양입니다. 여기까지 하고 좀 쉬었습니다. 한 2주일.





6. OLED


가장 눈에 띄는 OLED 를 작업합니다.



뽁뽁이 포장지를 잘 뜯습니다.



저 위의 구멍에 납땜을 하면 됩니다.



제품 정식 명칭은 Adafruit 사의 SSD1306 1.3" 128x64 OLED 입니다.

집에 다른 OLED 두개를 더 가지고 있어서 잠깐 비교 놀이를 해봅니다.


* Adafruit SSD1306 128x64 1.3" monochrome OLED 를 사용해보자

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



기판 밑부분에 지지대를 납땜하고 볼트로 고정해 줍니다.



OLED 를 납땜한 소켓에 삽입하고 너트로 지지대 기둥에 고정해 줍니다.



설명서에는 휘지 않도록 너트를 위아래로 설치하라고 되어 있으나, 지지대 볼트 길이가 짧아서 절대 불가능 합니다.

그냥 위에만 너트로 고정해 줍니다. 너무 조이면 장력이 생기니 적당하게 조여줍니다.




7. GPS module


Adafruit 의 Ultimate GPS Breakout v3 제품입니다.



66개의 channel 을 받을 수 있다고 하네요. Wow!



뒷면은 GPS 정보를 저장하여 다시 reboot 될 때 GPS 를 빨리 연동되게 하기 위한 battery 고정부가 있습니다.



3.3V ~ 5V 까지 인가할 수 있습니다. 5V 도 견디지만 3.3V 로 동작시키면 좋겠죠?



이렇게 분리되어 있는 것을 아래와 같이 납땜해 주었습니다.



고정하는 부분이니 납을 많이 먹여 주었습니다.



GPS 가 올 자리는 여기가 되겠습니다.



지지대를 세우고 mainboard 와 연결되는 부분에 pin 을 납땜해 줍니다.



고정 기둥에 올려 놓고 너트로 조이면 이렇게 됩니다.

점점 모양을 갖춰 가네요.





8. OpenLog


측정한 data 를 micro SD 에 저장하는 부분입니다.



제품은 SparkFun 사의 OpenLog DEV-13712 입니다.



Arduino 와 친숙한 ATmega 칩이 달려 있습니다.



뒷면은 micro SD 를 삽입할 수 있게 되어 있습니다.

한번 넣으면 딸깍 하면서 고정이 되고, 다시한번 누르면 튀어나오는 방식입니다.



위치할 자리는 여기 입니다.

예전 버전에는 바로 아래 부분에 GM tube 와 연결하는 pin 납땜자리가 있어 쉴딩을 해줘야 했지만,

버전업이 되면서 GM tube 연결 땜 자리는, 그 밑으로 위치하는 레이아웃으로 바뀌었습니다.



이왕 본 김에 GM tube 와 연결되는 pin 을 납땜해 줍니다.





9. Arduino FIO


이제 두뇌에 해당하는 Arduino FIO 를 작업합니다.



DEV-10116 이라고 되어 있네요.



LED가 반짝반짝 하는 윗부분이 밑으로 가야 하는지라 좀 아쉽습니다.



밑부분이지만 위로 가는 부분입니다.



위치는 여기가 되겠네요.

납땜할 자리가 가장 많습니다.

일단 mainboard 에 모든 다리에 pin 을 넣고 납땜해야 하고, 그다음 male pin 들을 Arduino FIO 에 납땜하여 다리를 만들어 줘야 합니다.




향후 firmware upgrade 를 위해 FTDI 인터페이스에도 납땜을 해 줍니다.

실제로 이런 모양이라고 합니다.


* Using a L-shaped plug and soldered low-profile sockets to program a Fio

https://www.arduino.cc/en/Main/ArduinoBoardFioProgramming



나중에 software 가 version up 되면 도전해 보겠습니다.

마침 FTDI breakout 보드도 있네요 :-)


* FTDI Serial Adapter 를 사용해 보자

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



지금까지의 모든 부붐을 올려 봤습니다. 호오오오!





10. Bluetooth module


micro SD 카드에 logging 을 하지만,

스마트폰으로 실시간 측정치를 확인하거나, 로그를 인터넷으로 바로 보내고 싶으면 Bluetooth 모듈이 필요합니다.



제품은 seeed 사의 BLEBee v2 입니다.

https://www.seeedstudio.com/BLEBee-v2.0.0-p-2461.html


따로 사려면 34.5 USD 하는군요.

AliExpress 에서 파는 XBEE 의 bluetooth 모듈과 호환이 되는지 많이 궁금합니다.


https://ko.aliexpress.com/item/Free-shipping-bluetooth-wireless-module-bluetooth-slave-HC-06-red-for-arduino/2046081268.html


기회가 되면 한번 실험해 보겠습니다.



Bluegiga BLE113-A-M256K 라는 모듈을 이용해서 만들었다고 합니다.



오리지날은 MiKro Labs 라고 합니다.

하지만 이미 website 는 가동되지 않고 있네요. ( www.mikro-labs.com )



Arduino FIO 의 밑단 부분에 세모로 선이 그어있는 부분에 꽂습니다.






11. 시험 가동


GM tube 를 제외하고 모든 부품이 실장되었습니다.

GM tube 를 연결하기 전에 납땜이 정상인지를 확인하고,

추가 작업을 진행하기 전에 수정사항이 있는지를 보기 위해 battery 를 연결하고 시험 가동을 해 봅니다.


동봉된 battery 는 1200mAh Li-Ion Polymer 입니다.



두근두근....



한번에 성공입니다!!!

사실 실패하면 다른 방도는 없었습니다.


역시 납땜시는 열을 최대한 짧게 가하고 완료하는게 정말 중요하네요. 오로지 이거 하나만 지키면서 납땜하였습니다.

오랜 동안 납땜에 투자한 시간이 보상받는 순간입니다.





12. Geiger Mueller Tube


방사능 측정용 센서는 pancake 형태인 센서 입니다.


* LND 7317

http://www.lndinc.com/products/geiger-mueller-tubes/7317/


특장점으로는 엄청 예민하다는 것과, alpha / beta / gamma 모두를 잡아낼 수 있다는 것입니다.

일반적으로 한가지나 두가지만 잡아낼 수 있는 센서와는 격을 달리합니다.


그래서 낱개 구매는 130 ~ 200 USD 정도 한다고 합니다.

bGeigie Nano kit 가격의 1/3 에 해당합니다. 그만큼 조심해서 다뤄야 합니다.



GM tube 의 표면이 찟기지 않게 하기 위해 철망을 붙여줘야 합니다.

여성들의 메니큐어 코팅제로 붙이면 나중에 메니큐어 제거재로 쉽게 분리 가능하다 하니, 준비합니다.



살살 제품을 꺼냅니다. 아주 얇은 피막으로 되어 있다고 씌여 있습니다.



뒷면이 위로 오게 뒤집어져 있습니다. 앞쪽은 얇은 피막이니까요.

only USA 에서만 생산되고 있습니다.

들어보면 꽤 무겁습니다. 무식한 작은 후라이팬처럼 생겼습니다.



앞면입니다. 찟어지지 않도록 살살...



다른 작업으로 진행하기 전에 얼른 금속망을 앞면에 붙여줍니다.

1분 이상 지긋이 누르라고 설명서에 나와 있으니, 지긋하게 눌러서 고정되게 합니다.




13. GM tube 연결


GM tube 와 고전압 회로와 연결하는 보드를 조립합니다.



보드에 선을 납땜해야 하는데, 극성이 선의 배열과 다릅니다.

이쁘게 납땜할 수 있도록 핀을 이용하여 선을 동그랗게 말아줍니다.


미리 투명 수축 튜브도 끼워 넣어 줍니다.



납땜을 이쁘게 하고, 수축튜브를 잘 씌운 다음, 열을 가하여 수축, 고정되게 합니다.




14. Case 고무에 동그랗게 구멍 뚫기


Pelican 1010 case 의 안쪽 뒷면은 고무로 기기를 안정되게 고정될 수 있도록 쿠션이 있습니다.

여기를 GM tube 가 돌출될 수 있도록 구멍을 뚫어야 합니다.



보드에 LND 7317 과 연결하고 아크릴에 고정시켜 봅니다.

이제야 고지가 눈앞에 보이네요.



케이스 뒷면에 센서가 돌출될 수 있도록 동그랗게 구멍을 뚫어 줍니다.

신기하게도 250ml 주스캔 윗부분과 크기가 똑같습니다. 주스캔을 이용하여 그림을 그린 다음 커터로 잘라주면 됩니다.



짜잔~!





FIN


이로써 모든 조립 작업이 완료되었습니다.

계획하고 구입하고 조립하기 까지, 장장 6년(계획)하고 3개월(실조립) 이 걸렸습니다.


왜 구동 모습이 없냐구요?

실제 구동 모습은 따로 글을 만들어서 차근차근 기록하겠습니다.

여기까지만 해도 진이 다 빠졌습니다.


And

Hardware | Safecast bGeigie Nano 를 조립해 보자 - 1

|

1. 311 대지진




2011년 3월 11일, 가족과 일본에서 생활하던 그 날.

아이의 신학기가 시작한지 얼마 되지 않았을 때였다.


엄청난 흔들림.


옆에 있던 동료에게 "난 지진 detector 야. 진도를 알 수 있지" 라면서,

농담처럼 이건 3도인데... 한 4도정도 되려나? 이건 5도인데... 더 세지네!!!


20층 건물에서 8층에 근무했던 사무실에서 본능적으로 지갑과 휴대폰만 챙기고 밖으로 튀어 나갔다.


사무실 문을 벋어나 엘리베이터를 타려 했으나,

이미 차단막이 내려가 있고, 비상구로만 탈출할 수 있게 셔터들이 내려가 있었다.

순간 내가 어디에 와 있지 할 정도로 통로 구조가 바뀌어 있었다.


지진 알람이 발생 후, 자동으로 셔터가 내려간 것에 잠시 탄복하면서,

미로에 놓여 있는 쥐처럼 비상구를 향해 돌진했다.


사람들이 비상구를 이용하기 시작했고, 층을 내려갈 수록 사람들 수가 불어났다.

중간에 넘어지는 사람, 흐느끼면서 내려가는 사람, 과호흡으로 봉지를 물고 있는 사람...

모두 직감적으로 "이러다 죽을 수 있어" 라는 문장을 떠올리는 얼굴들이었다.


나도 그랬다.

"죽을 수 있겠지만, 그래도 살아 남아야겠어" 라는 본능이 머릿속에서 몸부림 치고 있었다.


일단 1층에 다다르자 조금 안도가 되었고,

만일 더 흔들리고 건물 붕괴의 위험이 발생하면 지하 주차장으로 내려갈 것이냐,

아니면 깨져서 떨어질 유리 파편을 피하면서, 근처 중학교까지 죽을 힘을 다해 뛰어갈 것이냐를 고민했다.


가장 큰 임팩트가 살짝 사그라들 때, 밖에 나가서 맞은편에서 짓고 있던 40층 건물을 보았다.

맙소사... 두개의 쌍둥이 건물이 바다 밑에 자라는 해조류처럼 흔들거렸다.





2. 탈출


대지진 발생 후, 바로 다음날인 3월 12일. 아직 큰 여진들이 들이닥치는 시기에 후쿠시마 원자력 발전소가 수소폭발을 일으켰다.

이 대지진은 이제 완전히 새로운 국면으로 들어섰다는 신호였다.



지진에 의한 공포가 이제는 피폭에 대한 공포로 바뀌었다.

그것도 원전 3기가 차례로 폭발을 잃으키면서 의심없는 사실로 받아들여졌다.


고민할 필요도 없이, 동경을 탈출해야 한다는 생각으로 귀결되었다.

거대한 탈출의 물줄기에서 가족 4명을 실어다줄 항공기 수배에 나섰으며,

대중교통이 끊긴 도로를 달려 우리 가족을 공항까지 이동시켜 줄 개인 택시 "나라시" 를 찾았다.


다행히 모두 수배가 되어, 대지진 발생 1주일만에 일본을 탈출했다.


동경시에서 나리따 공항까지 가는 고속도로... 도로 중간중간 부서진 부분들이 보였으며, 다니는 차가 거의 없었다.

그야말로 유령의 고속도로였다.




3. Safecast


여기서부터는 어투를 바꾸겠습니다. :-)


혼자 다시 동경으로 돌아온 뒤 알게된 것은, 당시 일본 전국을 휩쓸고 있었던 "방사능의 공포".


정부에서는 정보를 차단하고 있었고,

동경과 200Km 밖에 떨어져 있지 않은 후꾸시마는 동경의 먹거리를 책임지는 곡창지대인 동북지역의 한 곳으로,

방사능이 있다 하더라도 먹어서 동북아 지역 재건에 동참하자는 어처구니 없는 상황이 벌어지고 있었습니다.


이런 "방사능 공포" 의 불안을 해소하고자 사람들이 방사는 측정기를 너도나도 구매하려 했고,

평소 가격의 몇 배에서 몇 십배로 제품 가격이 뛰게 되었죠.

제대로 된 것을 구입하려면, 몇 십만원을 줘야 했습니다.


거기서 등장한 것이 이 제품,

Safecast 라는 단체에서 Pancake 센서를 채용한 제품을 cloud funding인 Kickstarter 에 공모합니다.


https://www.kickstarter.com/projects/seanbonner/safecast-x-kickstarter-geiger-counter



디자인, 휴대성, 사용된 LND 사의 고성능 7317 센서 모두는 너무 매력적이었습니다.

제품으로써 완벽에 가까워 보였으니까요.


참고로 LDN 7317 pancake 센서는 Alpha / Beta / Gamma 를 모두 측정할 수 있는 고성능 센서 입니다.


* LDN 7317

http://www.lndinc.com/products/geiger-mueller-tubes/7317/



또한 Safecast 는 측정한 자료를 인터넷 및 전용 app 에 공유하여 사람들로 하여금 방사능의 심각성을 알리고 있습니다.


* Safecast



이 어플을 통해서, 이 프로젝트에 참여한 사람들이 측정한 실측치를 확인할 수 있습니다.



일본 정부에서 공개하지 않은 데이터 들을 볼 수 있습니다.

후쿠시마 근처와 연결된 하천은 접근하지 말아야 할 장소가 명확합니다.




4. bGeigie Nano


Kickstarter 에서 공모한 제품을 너무 가지고 싶어서,

제작자에게 메일도 띄워 보고, ebay 에 나와 있는게 없나 그렇게 많이 찾아 헤맸습니다만 구할 수 없었습니다.


그러던 중, Safecast 에서 아래와 같은 제품을 발표합니다.


* bGeige Nano

https://shop.kithub.cc/collections/environmental-monitoring-kits/products/safecast-bgeigie-nano




미국내 세금 포함 655.5 USD !!! 미칠듯한 가격입니다. 오살라게 비싸네요.


평소 AliExpress 로 떄워왔던 저로서는 너무 괴로운 구매였습니다.

너무 하고싶은데 가격은 비싸고, 너무 하고싶은데 가격은 비싸고, 너무 하고싶은데 가격은 비싸고...


한국에 돌아와 버렸지만, 이 제품을 만들어 보고 측정에 동참하고 싶은 욕구는 사그라들지 않았습니다.

결국 오랜 고민 끝에 질렀습니다. 655.50 USD !!!





5. 도착


거진 2주만에 제품을 받았습니다.

이하 도착샷들 입니다.



이 로고를 보려고 정말 오래 기다렸습니다.



자잘한 부품이 있으니 애들이 집어 먹을 수 있다는 문구가 보입니다.



뚜껑을 열어 보면 꽉 차 있습니다.



조립 완성 후, 가지고 다닐 수 있게 버클 및 끈이 동봉되어 있습니다.



기판을 고정하는 볼트, 너트, 와셔 들 입니다.



전자 부품들은 뽁뽁이로 잘 쌓여 있습니다.



보호 케이스 입니다.

따로 Amazon 에서 구입할 수도 있습니다.


https://www.amazon.com/Waterproof-Case-Pelican-1010-Micro/dp/B001G23JZ4/ref=pd_sim_421_1



저에게 배달된 제품의 시리얼 넘버는 2981 인듯 합니다. 



납땜해야 하는 전자 부품들 입니다.



완성되면 붙이게 될 스티커도 있습니다.





6. 부품 확인


제품이 도착하면 누락이 없나 확인해 봐야겠죠?

Safecast 사이트에서 부품들을 확인할 수 있습니다.


SafecastbGeigieNanoManualandResources.pdf




FIN


여기까지 오는 과정이 6년이나 걸렸습니다.

일단 제품을 받고 나자, 좀 진이 빠진것도 있고 마음을 추스리고 만들고 싶어서 약 한달동안 묵히게 됩니다.


"Safecast bGeigie Nano 를 조립해 보자 - 2" 에서 하나씩 조립해 가게 됩니다.


http://chocoball.tistory.com/entry/Hardware-Safecast-bGeigie-Nano-2




Update - 20201216


참고를 위해 첨부.





And

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

|

1. 시작


전자 부품 취미를 하다 보면, 회로 구조상 condenser 가 필요한 대목이 나옵니다.

대학교때 회로이론에서는 주로 Capacitor 로만 표현되는데, 실제 필드에서는 Condenser 라는 용어가 더 많이 쓰이는 것 같습니다.


Condenser = Capacitor 는 회로에서 일종의 buffer 역할을 하며, 직류시에는 차단을 하며 교류만을 흘려보내는 성질이 있습니다.


위의 성질을 이용하여, 실제 사용 방법은 다음과 같아요.

a. 직류를 차단

b. 노이즈 제거

c. 안정된 전원

d. 전압/전류에 민감한 IC 보호


아래는 wikipedia 에서 가져온 그림입니다.



캐패시터는 참 여러종류가 있죠?

회로의 기호적으로는 다음과 같습니다.





2. 구입


원래는 콘덴서로 유명한 삼영, 루비콘, 에너솔 등을 구입하려 했으나,

본격적으로 구입해서 뭔가 수리를 하기에는 기술이 부족해, 간단한 회로 확인만을 위해 간단하게 구성합니다.


아래는 향후 PC 보드 수리나 가전 수리를 위해 구입하면 괜찮을 리스트 항목 입니다.

( http://www.parkoz.com/ 에서 활동하시는 "우명진 [wmjcom]" 님의 여러 수리기를 통하여 리스트업 해 봤슴 )


삼영 NXH 10V 330uf 지름 6.3mm 높이 11mm 1개 [105도, 6000시간, Low ESR, 초장수명]
삼영 NXH 10V 1000uf (10mm, 105도, 장수명)
삼영 NXC 10V 1000uf 8파이(8mm, 105도, Low ESR)
삼영 NXH 10V 1000uf 10파이(10mm, 105도, 장수명)
삼영 NXH 10V 1500uf 10파이(10mm, 105도, 장수명)
삼영 NXH 10V 2200uf (105도/10000시간/지름10mm*높이25mm, 초장수명/Low ESR)
삼영 NXB 10V 3300uf (지름 10mm * 높이 25.0mm, Low ESR, 105도  4,000시간, Ripple  Current(리플 전류)
삼영 LXZ 10V 3300uf

삼영 NXH 16V 100uf
삼영 NXH 16V 220uf 지름 6.3mm 높이 11mm 1개 [105도, 6000시간, Low ESR, 초장수명]
삼영 NXH 16V 1000uf 8파이(8mm, 105도, 장수명)
삼영 NXB 16V 2200uf 10파이(10mm, 105도, Low ESR)
삼영 NXH 16V 3300uf (지름 10mm * 높이 25.0mm, Low ESR, 105도 10,000시간, Ripple  Current(리플 전류)

삼영 NXH 25V 100uf [105도/6000시간/Low-ESR/지름 6.3mm/높이 11mm]
삼영 NXH 25V 470uf [105도/10000시간/Low-ESR/지름 10mm/높이 12.5mm]

삼영 NXH 35V 47uf (105도/6000시간/Low ESR/직경5파이/장수명)
삼영 NXH 35V 100uf (105도/6000시간/Low ESR/직경6.3파이/장수명)
삼영 NXH 35V 220uf [105도/8000시간/Low-ESR/지름 8mm/높이 11mm]

삼영 NXH 50V 10uf 1개(105도/6000시간/Low ESR/직경5파이/장수명)
삼영 NXH 50V 22uf 1개(105도/6000시간/Low ESR/직경5파이/장수명)
삼영 NXH 50V 47uf 지름 6.3mm 높이 11mm 1개 [105도, 8000시간, Low ESR, 초장수명]
삼영 NXH 50V 100uf 지름 8mm 높이 11mm 1개 [105도, 8000시간, Low ESR, 초장수명]

삼영 TDA 200V 680uf 지름 22mm 높이 45mm 2개 [105도, 2000시간, Lug Type]

삼영 TDA 400V 270uf(105도, 2000시간, 직경 25파이, 러그 타입)
삼영 TLS 450V 330uf [105도/3000시간/지름25.4mm/높이45mm]

에너솔(EneSol) 16V 470uf (105도/11.5파이/고체 캐패시터/Super Low ESR/최대 리플용량 6100uf)
에너솔(EneSol) 6.3V 560uf

루비콘 MCZ 6.3V 3300uf (105도/2000시간/Low-ESR/지름10mm/높이25mm)
루비콘 MXC 6.3V 3300uf (10파이/10mm/105도/Low ESR)



결국 우리의 친구 AliExpress 에서 구입합니다.


https://ko.aliexpress.com/item/set-of-120pcs-12-values-0-22UF-470UF-Aluminum-electrolytic-capacitor-assortment-kit-set-pack-Free/32323214980.html



1.63 USD 입니다.

구성품은 다음과 같다고 하네요. 도착하면 확인해 보려 합니다.





3. 도착


한 3주 걸려서 도착했습니다.

포장은 평소의 AliExpress 답습니다. 무난해요.

아래는 펼쳐보인 사진 입니다.





4. 확인


도착한 애들을 확인해 보았습니다.

확인에 사용된 기기는, 역시 AliExpress 에서 구입한 multi tester 와, 역시 AliExpress 에서 구입하여 만든 Transistor Tester 입니다.


* Multi Tester

* Transistor Tester

http://chocoball.tistory.com/entry/Hardware-Transistor-Tester



* 0.47 uF / 50V



Transistor Tester 가 전반적으로 더 정확한것 같습니다.

대략 0.5uF 를 가르키는 군요.



Multi Tester 기도 비슷한 값을 보여줍니다.




* 1 uF / 50V



테스터기 두 친구 모두 비슷한 값을 나타내 줍니다.

그 값 또한 거의 정확합니다.



ESR 값 (뭔지 모름. 아마 내부 저항) 까지 보여주는게 믿음직 스럽습니다.




* 33 uF / 16V



약 1 uF 이 넘어가면 정확한 값을 나타내 주는것 같습니다.





* 0.22 uF / 50V





* 4.7 uF / 50V







* 2.2 uF / 50V



각각 사진을 찍으면 사진 갯수가 늘어나니, 한꺼번에 찍었습니다.

양쪽을 붙잡고 있어야 하니, 몇 번의 실패를 하고야 한장 건집니다.




* 10 uF / 50V





* 22 uF / 50V





* 47 uF / 16V



값이 높아지면 살짝씩 Tester 들끼리 차이가 나기 시작합니다.

Transistor Tester 쪽을 믿어야겠죠?




* 100 uF / 16V





* 220 uF / 16V



VC97 은 완전히 측정 범위를 벗어나 버렸습니다.

이로써 VC97 은 100uF 이하에서만 활용이 가능한 것 같습니다.




* 470 uF / 16V



값이 조금 커지니 VC97 은 오차가 많이 벌어지기 시작합니다.





FIN


정확성을 요구하는 보드에 사용하기에는 좀 그렇지만,

기본 수치는 달성하는것 같아, 간단한 동작을 구현하거나 IC 를 사용한 테스트 보드를 구성하기에는 좋은것 같아요.

And

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

|

1. 드론


드론 제작시 필요한 sensor 중에 하나는 거리 측정기 라고 합니다.

이는 호버링이나 일정한 높이를 유지하면서 이동시, 항상 지상의 높이를 측정하여 자기의 위치를 알아야 하니까요.


또한 충돌 방지등에도 필요할 것 같습니다.



드론이 보는 시각은 향후 이렇게 되겠죠?





2. 주문


항상 그렇듯 AliExpress 에서 검색하여 주문하였습니다.


정식 명칭은,

"VL53L0X,Time-of-Flight (ToF) Laser Ranging Sensor Breakout 940nm GY-VL53L0XV2 Laser Distance Module I2C IIC" 입니다.


https://ko.aliexpress.com/item/VL53L0X-Time-of-Flight-ToF-Laser-Ranging-Sensor-Breakout-940nm-GY-VL53L0XV2-Laser-Distance-Module-I2C/32773306734.html



여러가지 breakout 보드가 존재하지만, 이 제품이 고정홀이 2개이고 가장 저렴해서 선택했습니다.




3. 도착


도착샷들 입니다.

AliExpress 제품답게 포장되어 왔습니다. Gift 표시가 빠지면 섭섭하지요.



레이저를 쏘는 소자 부분입니다.



뒷면은 신호처리에 필요한 회로로 구성되어 있습니다.





4. Layout


Pin 연결 정보 입니다.


  VL53L0X | Arduino Nano
-------------------------
    VIN   |     3.3V
    GND   |     GND
    SCL   |     A5
    SDA   |     A4
-------------------------



I2C를 사용하는지라, SSD1306 연결과 완벽하게 동일합니다.


  SSD1306 | Arduino Nano
-------------------------
    VCC   |     3.3V
    GND   |     GND
    SDC   |     A5
    SDA   |     A4
-------------------------


구성도는 다음과 같습니다.





5. VL53L0X sketch


Adafruit 용 VL53L0X library 를 다운로드 받아 libraries 폴더에 카피합니다.


* Adafruit VL53L0X library

https://github.com/adafruit/Adafruit_VL53L0X


#include "Adafruit_VL53L0X.h"

Adafruit_VL53L0X lox = Adafruit_VL53L0X();

void setup() {
	Serial.begin(115200);
	
	// wait until serial port opens for native USB devices
	while (! Serial) {
	delay(1);
	}
	
	Serial.println("Adafruit VL53L0X test");
	if (!lox.begin()) {
	Serial.println(F("Failed to boot VL53L0X"));
	while(1);
	}
	// power 
	Serial.println(F("VL53L0X API Simple Ranging example\n\n")); 
}


void loop() {
	VL53L0X_RangingMeasurementData_t measure;
	
	Serial.print("Reading a measurement... ");
	lox.rangingTest(&measure, false); // pass in 'true' to get debug data printout!
	
	if (measure.RangeStatus != 4) {  // phase failures have incorrect data
	Serial.print("Distance (mm): "); Serial.println(measure.RangeMilliMeter);
	} else {
	Serial.println(" out of range ");
	}
	
	delay(100);
}


I2C detector 로 확인해 보면 VL53L0X 의 기본 address 인 "0x29" 이라는 것을 확인할 수 있습니다.


#include "Wire.h"
#include "i2cdetect.h"
 
void setup() {
    Wire.begin();
    Serial.begin(9600);
    Serial.println("i2cdetect example\n");
    Serial.print("Scanning address range 0x03-0x77\n\n");
}
 
void loop() {
    i2cdetect(); // default range from 0x03 to 0x77
    delay(2000);
}




6. VL53L0X + OLED


SSD1306 OLED sample sketch 도 있어서 실행하면 에러를 냅니다.

원인은 library source 가 다른것.



특이하게도 Adafruit sample 에 vl53l0x_oled 라고 되어 있음에도 불구하고,

pololu 제작자가 만든 library 를 다운로드 받아서사용해야 합니다.


* VL53L0X library

https://github.com/pololu/vl53l0x-arduino


/* This example shows how to use continuous mode to take
range measurements with the VL53L0X. It is based on
vl53l0x_ContinuousRanging_Example.c from the VL53L0X API.

The range readings are in units of mm. */

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

Adafruit_SSD1306 display = Adafruit_SSD1306();

VL53L0X sensor;

void setup()
{
	Serial.begin(9600);
	
	display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3C (for the 128x32)
	// init done
	display.display();
	delay(1000);
	
	
	Wire.begin();
	
	sensor.init();
	sensor.setTimeout(500);
	
	// Start continuous back-to-back mode (take readings as
	// fast as possible).  To use continuous timed mode
	// instead, provide a desired inter-measurement period in
	// ms (e.g. sensor.startContinuous(100)).
	sensor.startContinuous();
	
	// text display big!
	display.setTextSize(4);
	display.setTextColor(WHITE);
}

void loop()
{
	uint16_t reading = sensor.readRangeContinuousMillimeters();
	
	if (reading > 8000) {
		display.display();
		display.clearDisplay();
		return;
	}
	
	Serial.print(sensor.readRangeContinuousMillimeters());
	if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT"); }
	
	display.clearDisplay();
	display.setCursor(0,0);
	display.print(reading);
	display.print("mm");
	display.display();
	Serial.println();
	delay(50);
}


이번에는 OLED 를 추가하였으므로, I2C detector 로 확인해 보면 아래와 같이 "0x3c" 가 추가적으로 검출된 것을 알 수 있습니다.

속도는 좀 느릴지 모르지만, address 를 따로 가지고 있어서 동시에 같은 pin 연결을 할 수 있는 I2C 의 강점인것 같습니다.


* 참고 글

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





7. 결과


VL53L0X 센서만 부착하여 "Serial Monitor" 로 확인한 내용입니다.



아래는 OLED 를 부착하여 측정한 내용입니다.

15Cm 자를 쟀는데, 20Cm 언저리가 나오네요. 뭔가 칼리브레이션이 필요한 듯 보입니다.



왔다갔다 하면서 측정해 봤습니다.

역시 5Cm 정도가 이미 + 가 되어 있네요. 조정이 초기에는 필요한것 같습니다.



센서부를 찍어봤습니다.

맨눈으로는 보이지 않지만, 감도가 좋은 스마트폰 카메라에는 센서에서 나오는 불빛이 보입니다.

아마도 레이저겠죠?





FIN


잘만 사용하면 요긴하게 쓰일 수 있을것 같습니다.

애들 키 재는 용도로도 쉽게 만들 수 있을것 같네요.

And

Hardware | Rotary Encoder 를 사용해 보자

|

1. Rotary Encoder


예전 전자 기기들의 볼륨 조절은, 최저/최고값이 표시되어 있고, 그 안에서만 움직이는 방식이었습니다.


요즘 나오는 자동차의 음성 조절이나 iPod 같은 전자기기의 볼륨도,

min/max 가 정해져 있지 않은 볼륨 조절 장치로 되어 있어요.


이를 Rotary Encoder 라고 부른다고 합니다.


제가 arduio 및 전자 취미시 처음으로 만져본 것은 "Transistor Tester" 라는 기기였습니다.


http://chocoball.tistory.com/entry/Hardware-Transistor-Tester


왼쪽 / 오른쪽으로 끝없이 돌려도 되면서,

위로부터 꾹 누르면 스위치의 "select" 도 구현되어 있는 센서였습니다.



기술 발전이란...




2. 원리


원리는 원반에 구멍이 일정 간격으로 뚫려 있고,

파형상 90도 차이나는 광원을 배치해, 각각 입력되는 펄스의 변화를 가지고 방향 인지 및 count 를 한다 합니다.



입력 시그널은 아래와 같이 나오며, 시계방향과 반시계방향의 펄스 입력값의 차이에 따라 알수 있겠죠.



값의 변화는 다음과 같이 되구요.



시작점을 11 값이라고 본다면, 각 방향으로 돌렸을 때의 변화값이 다르다는 것을 알 수 있습니다.



결국 저 작은 뭉퉁이에 photo diode 와 conuter 가 들어있다는 거네요.

예전같으면 불가능 했겠지만, sensor 들이 작아지면서 가능한 부품이 탄생한 것 같습니다.


참고한 사이트는 아래 두곳입니다.


http://howtomechatronics.com/tutorials/arduino/rotary-encoder-works-use-arduino/


- http://openhardware.ro/rotary-encoders-experiments/





3. AliExpress 에서 구매


Rotary Encoder 로 검색하면 여러가지 제품이 나옵니다.

그중에 가장 적당한 것으로 골랐습니다.


이걸 고른 이유는, 항상 LED 가 켜져 있어서 알려주는 indicator 가 없어서 였고 (눈부심),

괜찮게 저렴했기 때문이지요.



구매 링크는 다음과 같고, 사양은 아래와 같이 나와 있습니다.


https://ko.aliexpress.com/item/Rotary-Encoder-Module-Brick-Sensor-Development-Board-For-Arduino/1893663630.html


"rotation counts are not limited" 라고 되어 있어서, 어느 방향으로나 영원히 돌릴 수 있고,

"With the buttons on the rotary encoder can be reset to its initial state, that starts counting from 0" 라고 되어 있어서,

버튼 스위치가 구현되어 있다고 하네요.


=======================================

100% Brand new and high quality

Material: Electronic components + PCB

Size: About 31 * 19 * 29mm / 1.22" * 0.75" * 1.14"

Main color: Black

Working voltage: 5V

Pulse circle: 20

  

By rotating the rotary encoder can be counted in the positive direction and the reverse direction during rotation of the output pulse frequency, unlike rotary potentiometer count, this rotation counts are not limited. With the buttons on the rotary encoder can be reset to its initial state, that starts counting from 0. 

=======================================


다만, 가장 좋은 외형은 아래와 같이,

중간에 나사산이 있고, 윗부분에 어떤이라도 씌울 수 있는 돌기가 세겨져 있는 것이 좋을 듯 합니다.



비슷한 제품은 역시 괜찮은 sensor 들을 만들고 있는 SparkFun 에 있네요.

배송만 문제 없으면 이걸 구입하고 싶은데, 그냥 AliExpress 구매 제품으로도 만족합니다.





4. 도착


잊고 있었는데, 어느새 도착했습니다.

HDD 포장하는 것처럼 정전기 방지 비닐로 왔습니다.



필요한 단자는 다 있는 듯 합니다.



뒷면입니다.

중간에 R1 하나가 빠져 있는데, 괜찮은지 모르겠습니다.

아무래도 ripple 관련하여 있으면 좋지만 없어도 되는 부분을 뺀듯 합니다.


기회되면 나중에 10K 짜리 저항을 달아줘야겠습니다.





5. Layout


Pin 배열은 다음과 같습니다.


  Rotay  |
  Encder | Arduino Nano
-------------------------
    CLK  |     D2
    DT   |     D3
    SW   |   (empty)
     +   |     3.3V
    GND  |     GND
-------------------------

  SSD1306 | Arduino Nano
-------------------------
    VCC   |     3.3V
    GND   |     GND
    SDC   |     A5
    SDA   |     A4
-------------------------


전체 layout 은 다음과 같아요.






6. Sketch


Sketch 소스는 다음 link 를 참조하였습니다.


http://domoticx.com/arduino-rotary-encoder-met-oled-scherm/


원 저작자는

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

"U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_FAST); // Dev 0, Fast I2C / TWI"

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


을 로딩했지만, 저는 SSD1306 OLED 이므로, 다음과 같이 수정하였습니다.

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

"U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_NO_ACK|U8G_I2C_OPT_FAST);   // Fast I2C / TWI"

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


// U8glib Bibliotheek importeren
#include "U8glib.h"
// U8glib Bibliotheek configureren voor het juiste display
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_NO_ACK|U8G_I2C_OPT_FAST);   // Fast I2C / TWI
 
// Encoder pins configureren.
int pinEncA=2;
int pinEncB=3;
 
static byte abOud;       // Initialiseer status.
volatile int teller = 0; // rotatie teller.
int teller_oud;          // oude rotatie teller.
 
// Waarden voor variabel getal reserveren.
enum {BufSize=6};
char tellerStr[BufSize];
 
void setup() {
  // Encoder pinnen instellen.
  pinMode(pinEncA, INPUT);
  pinMode(pinEncB, INPUT);
 
  // Interrupts instellen (pin hoog-laag verandering).
  // Interrupt 0 = Pin 2 op de Arduino UNO.
  // Interrupt 1 = Pin 3 op de Arduino UNO.
  attachInterrupt(0, pinActie, CHANGE);
  attachInterrupt(1, pinActie, CHANGE);
 
  u8g.setFont(u8g_font_5x8); // Lettertype instellen voor u8glib.
}
 
void loop() {
  // IF loop wanneer er aan de encoder is gedraaid.
  if (teller_oud != teller) {
    teller_oud = teller;  
    snprintf(tellerStr, BufSize, "%d", teller);  // Converteer de "teller" INT naar STR (tbv OLED scherm)
  
    // OLED scherm loop.
    u8g.firstPage();  
    do {
      u8g.drawStr(0, 10, "Encoder:");
      
      u8g.drawBox(0, 14, 128, 16);    // Teken een witte rechthoek, 0px vanaf links, 14px van boven, 128px breed, 16px hoog.
      u8g.setColorIndex(0);           // zet kleur negatief (pixel uit).
      u8g.setScale2x2();              // maak het lettertype 2x groter.
      u8g.drawStr(25, 14, tellerStr); // print "teller" tekst.
      
      u8g.undoScale();                // zet het lettertype weer terug.
      u8g.setColorIndex(1);           // zet de kleur positief (pixel aan).
    } while( u8g.nextPage() );
  }
  // Overige code...
}
 
// Wanneer een interrupt heeft plaatsgevonden, lees de input pinnen, bereken nieuwe status, pas de telling aan.
void pinActie() {
  enum { upMask = 0x66, downMask = 0x99 };
  byte abNieuw = (digitalRead(pinEncA) << 1) | digitalRead(pinEncB);
  byte criteria = abNieuw^abOud;
  if (criteria==1 || criteria==2) {
    if (upMask & (1 << (2*abOud + abNieuw/2)))
      teller++;    // tel naar boven.
    else teller--; // tel naar beneden.
  }
  abOud = abNieuw; // bewaar nieuwe status.
}




7. 구동


아래는 실제 구동 영상 입니다.



IDE 로 메뉴 프로그래밍만 잘 하면 멋진걸 만들 수 있을것 같습니다.




FIN


단순한 입력 센서가 아닌, 설정하고 조정하는 조절센서로는 처음인것 같습니다.

여러가지로 활용해 봐야지.

And