'Arduino'에 해당되는 글 104건

  1. 2018.02.11 Hardware | 2.54mm pin header 구매하기
  2. 2018.01.12 Hardware | SSD1309 128x64 1.54" yellow OLED 2
  3. 2017.12.28 Hardware | HY-SRF05 초음파 거리 측정기를 사용해 보자
  4. 2017.12.11 Hardware | LED bar graph 를 컨트롤 해보자 - 2
  5. 2017.12.01 Hardware | LED bar graph 를 컨트롤 해보자 - 1
  6. 2017.12.01 Hardware | 74HC595 shift register 를 사용해 보자
  7. 2017.10.12 Hardware | VL53L0X 레이저 거리 측정 센서 사용해 보기 8
  8. 2017.10.01 Hardware | Rotary Encoder 를 사용해 보자
  9. 2017.09.19 Hardware | TSSR 3.5mm audio jack 구매하기
  10. 2017.09.19 Hardware | Adafruit SSD1306 128x64 1.3" monochrome OLED 를 사용해보자

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

Hardware | TSSR 3.5mm audio jack 구매하기

|

1. Safecast bGeigie Nano


시간이 나면, 짬짬이 방사능 측정기를 조립하고 있습니다.


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



조립 메뉴얼을 보면,

option 으로 분류되어 있으며 구성품에 포함되어 있지 않은 부품이 한개 있습니다.


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


이는 "TSSR 3.5mm audio out jack" 으로,

부착하고 싶으면 따로 구매를 해야 합니다.



부품리스트에서 자세히 보면, 아래 제품이라는 것을 알 수 있습니다.


* SparkFun TRRS 3.5mm Jack Breakout

https://www.sparkfun.com/products/11570


bGeigie Nano 구매하고 구성품 받기까지 오래 걸리기도 하거니와

배대지를 이용해야 해서 여간 복잡한게 아니였습니다.


완성도 있게 만들고 싶은데, 이 부품이 빠지면 아쉬울 것 같아, AliExpress 도와줘요~ 해봅니다.




2. TSSR 3.5mm Audio Socket Breakout


AliExpress, 아니 중국은 대단한것 맞습니다.

완벽히 똑같은 카피품을 판매하고 있네요.


https://ko.aliexpress.com/item/3-5mm-Plug-Jack-Stereo-Plastic-Metal-TRRS-Headset-Audio-Socket-Breakout-Board-Extension-Module-Approx/32757253027.html



모양, pin 이름, 크기 모두가 똑같습니다.



여기에 더하여 가격이 1/4 가격입니다.

정품은 3.95 USD, 카피품은 1.09 USD 에 더하여 배송비 무료 입니다.



저같이 돈은 없지만, 전자부품으로 놀고 싶은 사람에게는 AliExpress 는 천국입니다.




3. 도착


아래는 도착샷 입니다.

평범하게 도착했습니다. 한 3주 걸린것 같아요.



앞면입니다.

프린트된 문구도 같네요.



뒷면입니다. TRRS Breakout 보드라고 표시되어 있네요.





4. 테스트


OLED 를 가지고 VU meter 를 만들어 볼 때, 테스트 해봤습니다.


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


Arduino 와의 연결에, Male Pin 납땜을 하고싶지 않아서 Probe Clip 을 사용하였습니다.


http://chocoball.tistory.com/entry/Hardware-Probe-Clip


여기서는 VU meter 를 구성하는 과정은 생략하고 결과만 올립니다.



iPhone 과 연결에 문제가 없네요.

확인 동영상 입니다.





FIN


방사능 측정기는 언제 조립을...


And

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

|

1. OLED display


지금가지 AliExpress 에서 쉽게 구할 수 있는 0.95 ~ 0.96 inch 짜리 OLED display 를 가지고 놀았습니다.


* 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


추가로 지금 만들고 있는, "Safecast bGeigie Nano" 의 구성품을 보니, 마침 "Adafruit SSD1306 128x64 1.3inch" 가 달려있네요?!


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

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



이왕 OLED 를 가지고 놀기 시작한거, 끝가지 해보자 하고 구동시켜 봅니다.

조립 전에 제품이 정상작동 하는지도 보고싶구요.


Adafruit 는 거의 레퍼런스급 제품이고, AliExpress 을 통한 짝퉁 중국산이 아닌 제품으로 구동시켜 보는 것은 거의 처음인것 같습니다.




2. 외형


1.3" 다 보니, 지금까지의 0.95" / 0.96" 보다 확실히 큰 것을 느낄 수 있습니다.



뒷면입니다.

프린팅 된것도 선명하고, I2C로 사용시에는 SJ1 / SJ2 를 쇼트시키라고 표현도 되어 있습니다.


"5V READY" 라고 하네요. 자체 레귤레이터가 달려 있습니다.

단, 저는 기기에 무리를 주기 싫기 때문에 무조건 "3.3V" 로 구동시켜 보겠습니다.



그간 테스트 했던 OLED 와의 비교샷 입니다.



화면도 클 뿐만 아니라, pin 갯수도 많습니다.

SPI 대응도 되고 I2C 대응도 모두 될 수 있게 만들어져 있기 때문인것 같아요.





3.Layout


Pin 배열은 아래 link 를 참고하였습니다. (Adafruit 제조사 사이트)


https://learn.adafruit.com/monochrome-oled-breakouts/wiring-1-dot-3-128x64


   Adafruit  |   Arduino
   SSD1306   |   Nano
----------------------------
     Data    |     D9
     Clk     |     D10
     SA0(DC) |     D11
     Rst     |     D13
     CS      |     D12
     3v3     |
     Vin     |     3.3V
     GND     |     GND
----------------------------




실제 배선 모양입니다.





4.Sketch


소스는 Arduino IDE 에서,

아래처럼 "File > Examples > Adafruit SDD1306 > ssd1306_128x64_spi" 를 선택하면 됩니다.



원본 소스는 다음과 같습니다.






5. 구동


실제 구동한 동영상 입니다.

소스 코드와 제품 자체가 모두 Adafruit 가 만든 것이니 당연 잘 됩니다.

거기에 Arduino 진영과 Adafruit 가 협력하여 만든 Arduino Micro 까지 구비하여 구동해 봤습니다. (완전체)



당연 잘 돌아 갑니다.


이제 3형제 다 모여서 구동시켜 봅니다.



확실히 Adafruit 제품의 구동 속도가 제일 빠릅니다.

소스 및 pin 배열을 Hardware SPI 로 변경하고 동작시키면 더 빠르겠지요?




FIN

이제 OLED는 거의 다 사용해 본것 같네.

And
prev | 1 | ··· | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | next