잡다한 프로그래밍 :: 잡다한 프로그래밍
반응형

1. 릴레이란?

  • ON/OFF 기능을 할 수 있는 일종의 스위치
  • 낮은 전류로 높은 전류를 제어 가능
  • 아두이노에서는 5V를 사용하지만 5V 이상의 전류를 제공해야 할 때 릴레이를 사용
  • 평상시는 NC와 COM단자가 연결되어 있고, SIG핀으로 전류가 흐를 시 NO와 COM단자가 연결된다.

릴레이


2. 릴레이 사용법

고 전압을 사용할 시 전원을 모두 제거하고 사용해야 하고 되도록 사용방법만 익히고 실제로 해보지 않는 걸 추천합니다.

 

만약 다음 그림과 같이 연결되어있다면 평상시에는 NC와 COM이 연결되어있기 때문에 현재 NO, COM이 연결된 아래 그림은 전구에 불이 켜지지 않을 것이다 하지만 7번 핀에 전류가 흐를 경우 NO와 COM이 연결되므로 전구에 불이 켜질 것이다. 이처럼 낮은 전류로 높은 전류를 컨트롤하기 위해 릴레이를 사용한다

릴레이 연결

반응형
반응형

https://swexpertacademy.com/main/main.do

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

1. 해결방법

최장, 최단 자주 사용했던 dfs를 이용하여 해결하면 될것이라고 생각했으나 기존 2차원 배열을 활용하던 방법과 달리 그래프를 어떤 방식으로 해결해야하는지에 대한 에러사항이 생김. 공부를 통해 방법을 찾았고 첫번째 방법은 기존 방법과 비슷하게 이차원 배열에, 두번째 방법은 vector를 활용하여 연결리스트 형태로 구현하는 방식이다. 문제의 그래프는 무방향 그래프 이므로 다음과 같이 구현했다


2. 코드

#include<iostream>
#include<string.h>
#include<vector>

using namespace std;
int T;
int N;
int M;
int MAX;

bool check[20];

void dfs(int now, int length, vector<int> *value) {
	if (length > MAX) {
		MAX = length;
	}

	check[now] = true;

	for (int i = 0; i < value[now].size(); i++) {
		int next = value[now][i];
		if (check[next]) continue;
		else {
			dfs(next, length + 1, value);
		}
	}

	check[now] = false;
}

int main(int argc, char** argv)
{
	cin >> T;
	for (int i = 0; i < T; i++) {
		cin >> N >> M;

		vector<int> v[20];
		for (int j = 0; j < M; j++) {
			int x;
			int y;
			cin >> x >> y;
			v[x].push_back(y);
			v[y].push_back(x);
		}
		MAX = 0;
		for (int k = 1; k <= N; k++) {
			memset(check, false, sizeof(check));
			dfs(k, 1, v);
		}

		cout << "#" << i+1 <<" " <<MAX << endl;
	}
}
반응형
반응형

1. 조도센서란?

  • 빛 감지센서
  • 저렴한 가격과 활용도를 가지고 많이 사용함
  • CDS 센서는 광에 쏘여지면 저항 값이 감소하는 광도전효과를 이용한 센서
  • CDS라고 불리는 이유는 CDS를 만드는 주 재료가 카드뮴, 황의 화합물인 황화 카드뮴이기 때문
  • 주위가 밝으면 저항이 줄어들고 주위가 어두우면 저항이 커지는 특징
  • 주위가 밝으면 CDS 저항이 줄어들어 Analog Input 핀에 높은 전압
  • 주위가 어두워 지면 CDS 저항이 커져 Analog Input 핀에 낮은 전압

조도센서 설명


2. 조도센서 실습하기

조도센서를 통한 LED ON/OFF실습에 필요한 사전준비물은 다음과 같다

사전 준비물

준비가 완료 되었다면 다음과 같이 회로를 구성한다. 조도센서는 극성이 없으므로 +, - 를 구분할 필요가 없다.

회로 구성

회로 구성이 완료 되었다면 다음과 같이 코드를 작성한다. A0으로 Analog Input을 이용하여 조도센서 값을 읽어오고, 읽어온 값이 100이상일경우 LED를 OFF하고 100보다 작을경우 LED를 ON하는 코드이다

int lightPin = A0;
int ledPin=11;
void setup()
{
	Serial.begin(9600);
	pinMode( ledPin, OUTPUT );
}
void loop()
{
	Serial.println(analogRead(lightPin)/4);
	if ( analogRead(lightPin)/4 >= 100 )
		digitalWrite(ledPin, LOW);
	else
		digitalWrite(ledPin, HIGH);
	delay(10);
}
반응형
반응형

1. 터치센서란?

터치센서는 아래 사진과 같으며 정전 용량형 터치 스위치 모듈이다. 보통 상태일 때는 Low 출력, 터치가 되었을 때는 High를 출력한다. VCC = +5V, GND = GND, SIG = 디지털 핀에 연결하여 사용하면 된다

터치센서


2. 터치센서 실습하기

터치센서와 LED를 사용하여 실습을 진행한다. 실습에 필요한 사전 준비물은 다음과 같다

사전 준비물

준비가 완료 되었다면 다음과 같이 회로를 구성한다

회로구성

회로 구성이 끝났다면 다음과 같이 코드를 작성한다. 터치센서에서 읽어 들인 touch값이 Low일 때 led를 끄고 High일 때 LED를 키는 코드이다

int touch = 3; // D3
int led = 9; // D9
void setup()
{
	pinMode(touch, INPUT);
	pinMode(led, OUTPUT);
}
void loop() {
	if( digitalRead(touch) == LOW )
		digitalWrite(led, LOW);
	else
		digitalWrite(led, HIGH);
}
반응형
반응형

1. ADC란?

Analog Digital Converter로서 연속적인 신호인 아날로그 신호를 부호화된 디지털 신호로 변환하는 장치를 의미한다. A\DC는 온도, 압력, 음성, 영상신호, 전압 등을 실생활에서 연속적인 아날로그 신호를 측정하여 그 신호를 컴퓨터로 입력하고 디지털로 변환하는 것을 의미한다. 여기서 우리가 사용할 가변저항이 ADC역할을 한다.

ADC그림


2. 가변저항 실습하기

가변저항과 LED를 사용하여 Analog Input / Output 실습을 진항한다. 실습에 필요한 사전 준비물은 다음과 같다.

  • 가변저항이란 : 저항의 값이 고정되어있지 않고 회전 스위치를 이용하여 임의의 저항값으로 변경이 가능한 저항

실습 준비물

가변저항은 다음과 같이 GND, A0, 5V로 구성되어있다

가변저항 설명

준비가 끝났다면 다음과 같이 회로를 구성한다 5V GND를 가변저항과, LED에 가변저항 A0은 아두이노 A0부분에, LED의 + 부분은 9번핀에 연결한다

회로구성

회로를 구성하였다면 다음과 같이 코드를 작성한다. 이때 sensorValue를 보면 sensorPin/4를 하는데 4로 나눠주는 이유는 0~1024 까지나 오는 결과 값을 analogRead에 맞게 0~255로 바꾸기 위해 4로 나눠주는 것이다

int sensorPin = A0;
int led = 9;
void setup()
{
	pinMode(led, OUTPUT);
	Serial.begin(9600);
}
	void loop()
{
	int sensorValue = 0;
	sensorValue = analogRead(sensorPin)/4;
	analogWrite(led, sensorValue);
	Serial.println(sensorValue);
	delay(10);
}
반응형
반응형

1. Annotation이란?

앞 강의에서 DI란 무엇인지와 생성자를 이용하여 의존성 주입을 하는 방법을 실습해 보았다면 이번 강의에서는 Annotation을 이용하여 의존성 주입을 해볼 예정이다.

먼저 에노테이션이란 기존 XML을 이용하여 의존성 주입을 하는 것이 아닌 @Required 같은 태그를 이용하여 의존성 주입을 하는 것을 의미한다. 의존성 주입 에노테이션으로는 다음과 같은 3가지가 있다

 

#1 @Required

XML의 Bean의 property에 해당하는 부분 중 필수적인 부분을 명시할 때 다음과 같이 사용한다. 쉽게 말해 XML에 bean중 property가 꼭 있어야 하니 없으면 에러가 발생한다고 생각하면 좋다 즉 @required를 사용할때 xml에 property에 name에 해당하는 부분이 반드시 있어야 에러가 발생하지 않는다.

public class Boy{
private String name;

@required
public void setName(String name){
  this.name = name;
  }
  
}

 

#2 @Autowired

이전 강의에서 의존성 주입을 할 때 bean에 property를 사용하여 세터를 통한 주입을 했었다. 하지만 Class의 기존 세터 부분을 지우고 @Autowired 에노테이션을 추가하면 자동으로 의존성 주입이 이루어진다. 이는 다음 코드처럼 Boy클래스는 property를 사용하여 세터를 통해 bean을 생성했고 college라는 bean은 propery를 통해 boy라는 bean을 의존성 주입 했지만 College클래스에 @Autowired 에노테이션을 추가하고 세터부분을 지우고, 마찬가지로 bean의 property부분을 지우면 자동으로 의존성 주입이 이루어지는것을 확인할 수 있다.

public class Boy {
 private String name;
 private int age;
   
 //   getters and setters ...
}

public class College {
 
 @Autowired
 private Boy student; 
 
 //이부분부터
 public void setStudent(Boy aboy){
  this.stuendt = aboy;
 }
 //이부분까지 삭제
 
}

<bean id=“boy” class=“Boy”>
 <property name=“name” value=“Rony”/>
 <property name=“age” value=“10”/>
</bean>

<bean id=“college” class=“College”>
  <property name=“student” ref=“boy”/> //이부분 삭제
</bean>

 

#3 @Qualifier

만약 Autowired를 할때 다음과 같이 Boy 클래스의 bean이 두 개 있으면 어떤 걸 자동으로 Autowired를 할지 몰라 오류가 생긴다 따라서 이럴 때 @Qualifier를 사용한다. 다음과 같이 bean에는 qualifer의 value를 지정하고 Class에는 @Qualifier의 에노테이션과 함께 value를 설정하면 어떤 bean을 주입할지 정하게 된다

<bean id=“boy1” class=“Boy”>
 <qualifier value=“rony”/>
 <property name=“name” value=“Rony”/>
 <property name=“age” value=“10”/>
</bean>

<bean id=“boy2” class=“Boy”>
 <qualifier value=“tony”/>
 <property name=“name” value=“Tony”/>
 <property name=“age” value=“8”/>
</bean>

<bean id=“college” class=“College”>
</bean>


public class College {
 
@Autowired
@Qualifier(value=“tony”)
 private Boy student; 
 
  //   getters ...
}

 

#4 @Resource

@Qualifer가 value를 지정해서 의존성 주입을 시켜줬다면 Resource는 bean의 id로 의존성 주입을 해준다. 다음과 같이 사용할 수 있다.

public class College {
  
  @Resource(name=“boy1”)
  private Boy student; 
 
  //   getters and setters ...
}

 

#5 @Component

 

@Component는 Bean.xml에 빈을 사용한다 명시 하지 않아도 자동으로 클래스를 Bean으로 만들어주는 에노테이션이다

@Component
public class College {
  
  private Boy student; 
 
  //   getters and setters ...
}

2. Annotation 실습

실습할 예제는 이전 DI강의에서 사용했던 프로젝트로 실습하겠습니다.

#1) animal.xml수정

먼저 animal.xml을 다음과 같이 수정합니다. 생성자로 주입했던 constructor-arg 부분을 지워 주고 애노테이션을 사용한다는 코드를 추가합니다

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
	<context:annotation-config></context:annotation-config>
	
	<bean id="dog" class="kr.ac.hansung.helloDI.Dog">
		<property name="myName" value="poodle"></property>
	</bean>

	<bean id="cat" class="kr.ac.hansung.helloDI.Cat">
		<property name="myName" value="bella"></property>
	</bean>

	<bean id="petOwner" class="kr.ac.hansung.helloDI.PetOwner">
		<constructor-arg ref="dog"></constructor-arg>
	</bean>
</beans>

 

#2)  @Autowired추가

PetOwner.java클래스의 생성자 부분을 지우고 다음과 같이 @Autowired에노테이션을 추가합니다

package kr.ac.hansung.helloDI;

import org.springframework.beans.factory.annotation.Autowired;

public class PetOwner {
	
		@Autowired
		private AnimalType animal;

		public void play() {
			animal.sound();
		}
}

다음과 같이 코드를 수정하고 Run 하게 되면 다음과 같은 에러가 발생하는 것을 확인할 수 있습니다. 앞서 공부한 것처럼 2개의 bean 중 어떤 bean을 주입할지 모르기 때문에 다음과 같은 error가 발생하는 것입니다. 따라서 2가지 방법을 통해 해결해보도록 하겠습니다.

error

#3) @Qualifier추가 및 animal.xml수정

다음과 같이 Qualifier에노테이션을 사용하여 다음과 같이 어떤 빈을 주입할지 선택합니다.

 

PetOwner.java

package kr.ac.hansung.helloDI;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;

public class PetOwner {
	
		@Autowired
		@Qualifier(value="cat")
		private AnimalType animal;

		public void play() {
			
			animal.sound();
		
		}
}

 

animal.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
	<context:annotation-config></context:annotation-config>
	
	<bean id="dog" class="kr.ac.hansung.helloDI.Dog">
		<property name="myName" value="poodle"></property>
		<qualifier value="dog"></qualifier>
	</bean>

	<bean id="cat" class="kr.ac.hansung.helloDI.Cat">
		<property name="myName" value="bella"></property>
		<qualifier value="cat"></qualifier>
	</bean>

	<bean id="petOwner" class="kr.ac.hansung.helloDI.PetOwner">
	</bean>
</beans>

 

#4) 실행

수정을 완료하였다면 다음과 같은 실행 결과를 확인할 수 있다.

qualierfier 실행 성공

 

#5) @Resource 추가 및 animal.xml수정

@Qualifier대신 Resource에노테이션을 사용해보자 다음과 같이 animal.xml을 수정한다

 

PetOwner.java

package kr.ac.hansung.helloDI;
import javax.annotation.Resource;

public class PetOwner {
		@Resource(name="dog")
		private AnimalType animal;

		public void play() {
			
			animal.sound();
		
		}
}

 

animal.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
	<context:annotation-config></context:annotation-config>
	
	<bean id="dog" class="kr.ac.hansung.helloDI.Dog">
		<property name="myName" value="poodle"></property>
	</bean>

	<bean id="cat" class="kr.ac.hansung.helloDI.Cat">
		<property name="myName" value="bella"></property>
	</bean>

	<bean id="petOwner" class="kr.ac.hansung.helloDI.PetOwner">
	</bean>
</beans>

 

#6) 실행

수정을 완료하고 실행하면 다음과 같은 결과를 확인할 수 있다.

Resource 성공


3. 정리

@Autowired를 사용하여 bean의 의존성 주입을 하며, 여러 빈이 있을 경우 Qualifier에노테이션을 사용하여 빈을 선택하거나, bean의 id를 통해 의존성 주입을 하는 @Resource 에노테이션을 사용할 수 있다.

반응형
반응형

1. PWM이란?

Pulse Width Modulation으로서 펄스폭을 조절해서 전류를 조정하는것 ex) 무드등 제어, 부저 음계 제어 등

아두이노 우노 보드에서는 다음 그림과 같이 3, 5, 6, 9, 10, 11번 핀이 PWM 출력 기능을 제공함

아두이노 PWM 핀 번호

만약 사용자가 전류를 흘리고 싶다면 analogWrite() 함수에 숫자를 넣으면 사용할 수 있고 이는 0~255 범위를 가진다. 다음 그림처럼 사용자가 0, 64, 127, 191, 255를 입력했을때 다음과 같은 펄스폭을 가지게 된다

펄스폭 예


2. PWM을 이용한 LED밝기 조절 예제

PWM이 무엇인지 알았다면 LED를 이용하여 실제 예제를 학습해보자. 다음 그림과 같이 브레드보드 1개, 아두이노 우노, LED 1개, 1K저항 1개를 사용하였다.

실험 준비

준비한 준비물의 회로를 다음과 같이 구성한다. LED와 1K저항을 연결하고 빨간선은 +를 의미 검은선은 GRN을 의미한다

회로구성

다음과 같이 회로를 구성하였다면 다음과 같이 코드를 작성한다. 다음 코드는 analogWrite를 사용해서 9번핀에 brightness만큼 전류를 흘려주고 돌때마다 brightness가 5씩 증가하고 최대인 255에 도달하였다면 - 해주는 방식으로 진행되는 코드이다

int led = 9; //9번핀을 사용한다
int brightness = 0; // 처음 LED밝기
int fadeAmount = 5; // 5씩 밝아지게 함
void setup()
{
	pinMode(led, OUTPUT);
}
void loop()
{
	analogWrite(led, brightness);
	brightness = brightness + fadeAmount;
	if (brightness == 0 || brightness == 255) {
		fadeAmount = ‐fadeAmount ;
	}
	delay(30);
}

 

반응형
반응형

https://swexpertacademy.com/main/main.do

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

1. 해결방법

처음에 dfs방식처럼 모든 가능한 방법을 전부 돌면서 해결하려 했으나 잘 처리가 되지 않았고 오류가 있어서 처음부터

엘리스, 밥이 어떤방식으로 승리하는지 쭉 그려보았다 그랬더니 이러한 규칙을 발견할 수 있었다

1 = 밥 승리

2,3,4,5 엘리스 승리

6,7,8,9 밥 승리

10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25 엘리스 승리

 

이런식으로 1/ 4/ 4/ 16/ 16/ .....방식으로 승리가 번갈아가며 반복된다는 사실을 알 수 있었다.


2. 코드

#include<iostream>
#include<string>
#include<stdio.h>

using namespace std;
long long num;

int checknum = 0;
void check() {
    checknum = 0;
	long long temp = 1;
	long long sum = 1;
    
	while(sum < num){
     if(!checknum){
      temp *=4;   
     }
        sum += temp;
        checknum = !checknum;
    }
    
}
int main(int argc, char** argv)
{
	int test_case;
	int T;
	scanf("%d",  &T);

	for (test_case = 1; test_case <= T; ++test_case)
	{
	scanf("%llu",  &num);
        check();
        
		printf("#%d %s\n", test_case, checknum?"Alice": "Bob");
	}
	return 0;//정상종료시 반드시 0을 리턴해야합니다.
}

3. 주의사항

long long을 scanf할때 llu를 사용하였다

반응형

+ Recent posts