로터리 엔코더 – Rotary Encoder

한번 돌아가는데 20번 스텝이 있습니다.

코드는 http://bildr.org/2012/08/rotary-encoder-arduino/ 에서 가져왔지만 약간 수정했습니다. 로터리 돌리면 밝기 조정되고 로터리 누르면 밝기가 리셋되면서 red led가 on/off 됩니다.

	
//From bildr article: http://bildr.org/2012/08/rotary-encoder-arduino/

//these pins can not be changed 2/3 are special pins
int encoderPin1 = 2; // interrupt #1
int encoderPin2 = 3; // interrupt #2
int encoderSwitchPin = 4; //push button switch

int ledPin1 = 7;
int ledPin2 = 9;
bool ledStatus = false;
int defaultValue = 140;
int encoderSet = 0;

volatile int lastEncoded = 0;
volatile long encoderValue = 0;

long lastencoderValue = 0;

int lastMSB = 0;
int lastLSB = 0;

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

  pinMode(encoderPin1, INPUT);
  pinMode(encoderPin2, INPUT);

  pinMode(encoderSwitchPin, INPUT);

  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);

  digitalWrite(encoderPin1, HIGH); //turn pullup resistor on
  digitalWrite(encoderPin2, HIGH); //turn pullup resistor on

  digitalWrite(encoderSwitchPin, HIGH); //turn pullup resistor on

  //call updateEncoder() when any high/low changed seen
  //on interrupt 0 (pin 2), or interrupt 1 (pin 3)
  attachInterrupt(0, updateEncoder, CHANGE);
  attachInterrupt(1, updateEncoder, CHANGE);

}

void loop() {
  //Do stuff here
  if (!digitalRead(encoderSwitchPin)) {
    Serial.println("pushed");
    ledStatus = !ledStatus;
    digitalWrite(ledPin1, ledStatus);
    encoderValue = 0;
  }
  
  Serial.println(encoderValue);
  encoderSet = defaultValue + encoderValue * 2;
  if (encoderSet <0) encoderSet = 0;
  if (encoderSet > 255) encoderSet = 255;
  analogWrite(ledPin2, encoderSet);

  delay(1000); //just here to slow down the output, and show it will work even during a delay
}

void updateEncoder() {
  int MSB = digitalRead(encoderPin1); //MSB = most significant bit
  int LSB = digitalRead(encoderPin2); //LSB = least significant bit

  int encoded = (MSB << 1) | LSB; //converting the 2 pin value to single number 
  int sum = (lastEncoded << 2) | encoded; //adding it to the previous encoded value 
  if(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) encoderValue ++; 
  if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) encoderValue --; 
  lastEncoded = encoded; //store this value for next time
}

SG90 서보 모터 테스트

제일 구하기 쉬운 마이크로 서보모터인데 기어부분이 플라스틱으로 되어 있어서 테스트 용도 이상으로는 사용하기 힘들거로 보이네요.

문제점: 처음에는 나노 5V에 연결하니깐 움직이지 않아서 모터가 고장난거로 생각했습니다. 모터에서 ‘웅’소리는 나는데 전혀 움직이지 않아서요. 외부 전원으로 연결했더니 작동하네요. 

  • Size: 22×11,5×27 mm
  • Weight: 9 g
  • Power supply: 3 – 6 V
  • Current consumption: 550 mA
  • Logic voltage levels: 3.3 V or 5 V
  • Drive method: PWM
  • PWM range: 500 – 2400 microseconds
  • Speed: 60 degrees in 0.12 s
  • Torque: 1.2 kg / cm (at 4.8V)

모터 스펙을 확인해 보니 550mA가 필요하네요. USB 최대 전원이 500mA이니깐 무리가 있었네요. 마이크로 모터인데 전류량이 엄청나네요. 이건 무조건 외부 전원으로 작동 시키는게 맞습니다.

#include <Servo.h>

int servoPin = 9;
 
Servo servo;  
 
int servoAngle = 0;   // servo position in degrees
 
void setup()
{
  Serial.begin(9600);  
  servo.attach(servoPin);
  servo.write(90);
}

void loop()
{
   if(Serial.available() > 0){
    int servoValue = Serial.parseInt();
    servo.write(servoValue);
   }
}

2.8 LCD 세트 PCB

3가지 형태로 만들었습니다. 기본적인건 똑같고 온도 센서, 온습도 센서, RTC 모듈 차이네요.

온습도 센서 : AM2320

RTC : DS3231

온도 센서 : DS18B20 입니다. (탈착 불가능)

1602 LCD 세트 완성

일단은 위와 같이 나오게 해 보았습니다. 버튼 3개를 활용 가능하게 프로그램을 조정해야 겠네요. (30도라니!!!….덥긴 하네요)

APDS-9930 센서

– Ambient Light Sensor (밝기 센서)
– Proximity Sensor (근접 센서)

위의 두가지 기능을 사용할 수 있는 센서입니다. 근접센서로 활용해 볼까 해서 구입했습니다.

왼쪽은 5V입력이 가능한 센서이고 오른쪽은 전원 공급이 오로지 3.3V입니다.

셋업은 I2C방식이라 간단한데 바로 위에 모델은 VL(IR LED)에 3.3V로 연결해 줘야 제대로 사용이 가능합니다.

가까이 가면 1023으로 수치가 올라갑니다. 인터럽트핀도 있기 때문에 버튼 대신에 사용도 가능하겠네요.

1602 LCD, DS3231, DS18B20, Nano 등 활용 셋업

PCB 제작전에 셋업해보고 확인중인데 아직 버튼으로 어떤 기능 넣을지는 고민 좀 해봐야겠네요. 1602 LCD로 키트를 만들어 볼려고 하는데 일주일 후에는 PCB로 만들어서 올려야 겠네요.

버튼 3개와 온도센서인 DS18B20, Active Buzzer가 보이네요.
연결이 복작하네요. 이래서 PCB로 제작해서 작업하는게 좋은 이유네요. 이거 선 연결하다가 시간 다 갑니다.
오른쪽에 RTC 모듈인 DS3231입니다.

DS18B20 온도 센서

습도는 필요없고 온도만 측정한다고 하면 이 칩을 이용하는게 제일 좋을거로 보입니다.

중요한건 DATA쪽에 4.7k pullup 저항이 필요하다는 겁니다. 0.1uF capacitor를 전원쪽에 같이 셋업해주면 좀 더 안정적으로 보이네요.

#include <OneWire.h> 
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 5 
OneWire oneWire(ONE_WIRE_BUS); 
DallasTemperature sensors(&oneWire);

void setup(void) 
{ 
 Serial.begin(9600); 
 Serial.println("Dallas Temperature IC Control Library Demo"); 
 sensors.begin(); 
} 
void loop(void) 
{ 
 Serial.print(" Requesting temperatures..."); 
 sensors.requestTemperatures();
 Serial.println("DONE"); 
 Serial.print("Temperature is: "); 
 Serial.print(sensors.getTempCByIndex(0));
   delay(10000); 
} 

RCWL-0516 마이크로웨이브 근접 센서

PIR 센서를 많이 쓰는데 이것도 움직임 인식을 잘 합니다. 플라스틱이나 나무는 통과하기 때문에 케이스 만들때 편하겠네요.

아두이노 없이 셋업해 보았습니다. 움직임을 인식하면 LED가 켜집니다. 

NE555 CD4017를 이용한 납땜 연습 키트

버튼 누르면 랜덤으로 불이 들어 옵니다.

이건 가변 저항을 조정하면 차례로 켜지는 속도가 조절됩니다. SMD 납땜 연습에 좋은데 막상 해보니 그렇게 어렵지는 않은데 부품이 너무 작아서 집중해야 하는거 때문에 피곤은 하네요.