마이크로컨트롤러 통신 방식

  I2C UART SPI
이름 Inter-Integrated Circuit Universal Asyncronous Recevier/Trasmitter Serial Peripheral Interface
전/반이중 반이중 전이중 전이중
동기/비동기 동기(별도클럭라인) 비동기(보드레이트설정) 동기(별도클럭라인)
관계 1:N, N:N 1:1 1:N
슬레이브 연결에 필요한선수 2 2N 3+N
슬레이브 선택방법 소프트웨어로 주소 지정 무관 SS라인으로 지정(하드웨어)
SPI(1:N, N:N)
UART 인터페이스 다이어그램, 프레임  
SPI  

 

 

 

 

 

적외선 센서

- 파장범위가 700nm ~ 1mm. 파장이 적색빛보다 길고 극초단파보단 짧은 전자기파

- 적외선 발광 -> 수광부에 들어오는 양으로 거리 측정

- ex : TCRT5000

https://diyver.tistory.com/104

 

아두이노에서 적외선 근접센서 TCRT5000 사용하는 방법

<목표> 아두이노를 사용함에 있어서 적외선 근접센서는 정말 손쉽게 접할 수 있는 센서이다. 쉽게 접할 수 있지만, 사용방법을 모르면 문제가 많은 센서이기도 하다. LED 이므로 +극과 -극을 정확

diyver.tistory.com

- 포토트랜지스터 : 수광 센서의 종류

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=fribot&logNo=60194290020 

 

포토트랜지스터의 동작원리

포토트랜지스란? 아두이노 로봇에 많이 사용하는 비접촉 센서들 중 하나이고, 발광소자가 아니라 수광소자...

blog.naver.com

 

 

 

포토커플러를 이용한 적외선 센서 동작 실험

- 버튼 off -> led 발광 x -> 수광 x -> 안흐른다. 

- 버튼 on -> led 발광 o -> 수광 o -> 흐른다.

 

비반전 비교기 출력 실험

- 기준전압 : 2.5v

- SW를 안 누르면 -> 비반전비교기 입력전압에 5V 인가 -> 입력 전압 > 기준 전압 -> HIGH 

<-> SW 누르면 -> 입력전압 0V 인가 -> 입력 v < 기준 V -> LOW

 

 

 

 

 

 

비반전 비교기 출력 실험 2

- LED 인디케이터 추가 : 보통 led에 5v vcc에 10ma 흐르도록 330옴을 붙이나 안밝아도되서 1k res 담.

 

 

 

검정라인 따라가는 라인트레이서 만들기

흰색(반사)=SW ON=SENSOR LOW=비반전비교기OUT LOW
검정 라인
-> LEFT, CENTER, Right 모두 HIGH => 전진
-> LEFT, CENTER HIGH, RIGHT LOW = 오른쪽으로 나갔다 = 좌회전하자
-> LEFT LOW, CENTER, RIGHT HOW = 왼쪽으로 나갔따 = 우회전 하자
-> LEFT, CENTER, RIGHT 모두 LOW = 검정라인 밖에 나갔다 = 역회전 하자.
-> 이도저도 아니면 멈추자.

 

/*
	
	project 4

	LEFT_SEN	- ard 11
	CENTER_SEN	- ard 12
	RIGHT_SEN	- ard 13

	L298 IN1 - ard 7
	L298 IN2 - ard 8
	L298 ENA - ard 5
	
	L297 IN3 ard 9
	L298 IN4 ard 10
	L298 ENB ard 6

*/

const uint8_t PIN_LEFT_SEN  = 11;
const uint8_t PIN_CENTER_SEN  = 12;
const uint8_t PIN_RIGHT_SEN  = 13;

const uint8_t PIN_IN3 = 9;
const uint8_t PIN_IN4 = 10;
const uint8_t PIN_ENB = 6;

const uint8_t PIN_IN1 = 7;
const uint8_t PIN_IN2 = 8;
const uint8_t PIN_ENA = 5;


#define STOP 0
#define FWD 1
#define LEFT_TURN 2
#define RIGHT_TURN 3
#define BWD 4

uint8_t Direction;
uint8_t pwm_value = 255;

void setup () {
	Serial.begin(9600);
	pinMode(PIN_LEFT_SEN, INPUT_PULLUP);
	pinMode(PIN_CENTER_SEN, INPUT_PULLUP);
	pinMode(PIN_RIGHT_SEN, INPUT_PULLUP);

	pinMode(PIN_IN1, OUTPUT);
	pinMode(PIN_IN2, OUTPUT);
	pinMode(PIN_ENA, OUTPUT);

	pinMode(PIN_IN3, OUTPUT);
	pinMode(PIN_IN4, OUTPUT);
	pinMode(PIN_ENB, OUTPUT);
}

void loop() {
	boolean LeftSenHL = digitalRead(PIN_LEFT_SEN);
	boolean CenterSenHL = digitalRead(PIN_CENTER_SEN);
	boolean RightSenHL = digitalRead(PIN_RIGHT_SEN);

	//읽은 센서값 시리얼 모니터에 출력
	Serial.print(LeftSenHL);
	Serial.print(" ");
	Serial.print(CenterSenHL);
	Serial.print(" ");
	Serial.println(RightSenHL);
	delay(10);

	/*
		흰색(반사)=SW ON=SENSOR LOW=비반전비교기OUT LOW
		검정 라인
		-> LEFT, CENTER, Right 모두 HIGH => 전진
		-> LEFT, CENTER HIGH, RIGHT LOW = 오른쪽으로 나갔다 = 좌회전하자
		-> LEFT LOW, CENTER, RIGHT HOW = 왼쪽으로 나갔따 = 우회전 하자
		-> LEFT, CENTER, RIGHT 모두 LOW = 검정라인 밖에 나갔다 = 역회전 하자.
		-> 이도저도 아니면 멈추자.
	*/
	if(LeftSenHL == 0 && CenterSenHL == 0 && RightSenHL == 0) Direction = 4;		// 역회전
	else if(LeftSenHL == 1 && CenterSenHL == 1 && RightSenHL == 1) Direction = 1;	// 정회전
	else if(LeftSenHL == 1 && CenterSenHL == 1 && RightSenHL == 0) Direction = 2;	// 우회전
	else if(LeftSenHL == 0 && CenterSenHL == 1 && RightSenHL == 1) Direction = 3;	// 좌회전
	else  Direction = 0;															// 정지

	switch(Direction)
	{
		case STOP:
			digitalWrite(PIN_IN1, LOW);
			digitalWrite(PIN_IN2, LOW);
			analogWrite(PIN_ENA, pwm_value);			
			digitalWrite(PIN_IN3, LOW);
			digitalWrite(PIN_IN4, LOW);
			analogWrite(PIN_ENB, pwm_value);
			break;
		case FWD:
			digitalWrite(PIN_IN1, HIGH);
			digitalWrite(PIN_IN2, LOW);
			analogWrite(PIN_ENA, pwm_value);			
			digitalWrite(PIN_IN3, HIGH);
			digitalWrite(PIN_IN4, LOW);
			analogWrite(PIN_ENB, pwm_value);		
			break;
		case LEFT_TURN:
			digitalWrite(PIN_IN1, HIGH);
			digitalWrite(PIN_IN2, LOW);
			analogWrite(PIN_ENA, pwm_value/4);			
			digitalWrite(PIN_IN3, HIGH);
			digitalWrite(PIN_IN4, LOW);
			analogWrite(PIN_ENB, pwm_value);			
			break;
		case RIGHT_TURN:
			digitalWrite(PIN_IN1, HIGH);
			digitalWrite(PIN_IN2, LOW);
			analogWrite(PIN_ENA, pwm_value);			
			digitalWrite(PIN_IN3, HIGH);
			digitalWrite(PIN_IN4, LOW);
			analogWrite(PIN_ENB, pwm_value/4);				
			break;
		case BWD:
			digitalWrite(PIN_IN1, LOW);
			digitalWrite(PIN_IN2, HIGH);
			analogWrite(PIN_ENA, pwm_value/2);			
			digitalWrite(PIN_IN3, LOW);
			digitalWrite(PIN_IN4, HIGH);
			analogWrite(PIN_ENB, pwm_value/2);	
			break;
	}
}

 

전진 L 1, M 1, R 1 

좌회전 L 1, M 1, R 0

우회전 L 0, M 1, R 1 

역회전 L 0, M 0, R 0

정지 이도저도아니면

 

 

+ Recent posts