마이크로컨트롤러 통신 방식
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
정지 이도저도아니면
'컴퓨터과학 > 임베디드' 카테고리의 다른 글
임베디드실습 - 1. 개발환경 구축 (0) | 2022.09.16 |
---|---|
아두이노회로만들기 - 7. I2C, UART, SPI (0) | 2022.09.15 |
조금씩 임베디드 - 11. 임베디드 정리자료 (0) | 2022.08.31 |
아두이노회로만들기 - 5. L298N DC 모터드라이버 (0) | 2022.08.25 |
아두이노회로만들기 - 4. 태양광 충전, 블링크 회로 (0) | 2022.08.24 |