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

  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

정지 이도저도아니면

 

 

모터 정역 제어

- 정역 제어 = 정방향(CW clock wise) + 역방향 제어(CCW counter CW)

- 전원 방향에 따라 정방향 역방향으로 회전한다 

  but) MCU IO 포트는 출력 전류가 약해 전류를 충분히 공급하지 못한다.

 => 전류 증폭이 필요. 트랜지스터?

 

DC 모터 구동

- TR 구동 : 이미터 부하, 컬랙터 부하 -> 컬랙터 부하를 주로 사용

 

간단한 모터 제어 회로

- NPN TR과 이미터 방향에 모터보호저항 단다.(과전류 보호)

갑자기 끄면 큰 역기전력이 발생-> TR 파괴

 

 

 

역기전력으로부터 모터 보호

- 환류 다이오드 사용

- 역기전력이 생겼을때 빼주기 : 저항이 작아진 소자 반대방향

환류 다이오드(free wheeling diode) 필요

but 여전히 한쪽방향만 돈다

 

 

 

모터 양방향 제어를 위한 H 브리지 제어 회로

- TR 하나로는 전류가 부족하다

-> TR을 4개 해서 전류도 증폭하고 양방향 제어가능한 회로

 

 

트랜지스터를 이용한 AND 게이트

 

 

 

L298

DUAL FULL-BRIDGE DRIVER : L298 하나로 모터 2개 제어가능

 

 

 

 

enable 핀을 통해 출력

-> enable off 시 마찰력에 의해 천천히 모터 멈춤

급정거 원할시 H 브리지에 1 1 인가

 

L298N 듀얼 풀 브리지 드라이버 모듈

 

 

 

L297N를 이용한 양방향 DC 모터 제어

 

 

L298N 드라이버 블록 다이어그램 이해하기

1. 방향 제어

 

2. Enable 신호 H일때 동작, L 되면 모터는 관성으로 정지

 

3. 속도 제어

 

 

시뮬레이션 예제

/*
	project1 : 가변 저항을 이용한 DC 모터 속도 제어
	가변저항 - A0
	L298 IN1 - ard 8
	L298 IN2 - ard 7
	L298 ENA - ard 6 980hz
*/


const uint8_t PIN_IN1 = 8;
const uint8_t PIN_IN2 = 7;
const uint8_t PIN_ENA = 6;
const uint8_t analog_pin = A0;


int analog_value;
int pwm_value;

void setup () {
	Serial.begin(9600);
	pinMode(PIN_IN1, OUTPUT);
	pinMode(PIN_IN2, OUTPUT);
	pinMode(PIN_ENA, OUTPUT);

}

void loop() {
	analog_value = analogRead(analog_pin);
	pwm_value = map(analog_value, 0, 1024, 0, 255);

	digitalWrite(PIN_IN1, HIGH);
	digitalWrite(PIN_IN2, LOW);
	analogWrite(PIN_ENA, pwm_value);
	Serial.print("pwm value : ");
	Serial.println(pwm_value);
}

 

 

 

 

 

 

 

 

 

https://ggamji.tistory.com/110

 

아두이노회로만들기 - 3. 베터리 쓰기, 내부 클럭 쓰기, LED 점멸

이 글을 쓰려고 몇 일을 허비했는지 모르겠다. 아무튼 이전에는 아두이노 쓸땐 USB전원으로 넣는것 말고는 잘 몰랐지만 아두이노 드론 같은데서 리튬 이온 베터리를 쓰고 충전하는걸 보면서 어

ggamji.tistory.com

 

지난번 내부 클럭 사용하도록 부트로더 굽고, 블링크 코드를 업로드한 아두이노를 18650 베터리 전원으로 동작시킨것에

태양광 패널을 충전하도록 추가했다.

 

 

 

 

우선 태양광 패널 충전 전압을 확인했을때

태양광을 얼마나 받는지에 따라서 2 ~ 6V 사이로 크게 바뀌고 있었고

 

Atmega328 데이터 시트 상에서 기존 16MHz 동작시에는 4.5 ~ 5.5v로 동작 전압에 비해 변동이 너무 컸다.

18650 베터리 3.7v 쯤 되는걸 가지고 쓰니 베터리 단독으로 쓰거나 태양광 패널 단독으로 쓰는 경우를 생각해서

8MHz 클럭 속도를 쓰도록 부트로더를 다시 구웠다.

 

 

 

다시 복습하면

부트로더는 이렇게 연결해서 구웠고

위에께 아두이노 ISP를 올린 호스트 보드

아래께 8MHz 부트로더 굽는 타겟 보드


https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=mapes_khkim&logNo=221890832646&view=img_1

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=mapes_khkim&logNo=221890832646&view=img_1

 

블링크 코드는 이 그림과 같이 연결해서 업로드 하였다.

디지털 핀 기준으로는 12번인데, Atmega328p 기준으로는 18번 핀이다.

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(12, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(12, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(100);                       // wait for a second
  digitalWrite(12, LOW);    // turn the LED off by making the voltage LOW
  delay(100);                       // wait for a second
}

https://create.arduino.cc/projecthub/techmirtz/arduino-without-external-clock-crystal-on-atmega328-d4fcc4

https://create.arduino.cc/projecthub/techmirtz/arduino-without-external-clock-crystal-on-atmega328-d4fcc4

태양광 충전과 배터리 전원으로 동작이 동시에 이뤄지는걸 방지하기위해서

스위치 두개를 추가했다.

태양광 충전만 ON 했을때 베터리 충전 모듈에 빨간 빛이 들어오며 충전되고 있는걸 확인할수있다.

 

 

 

 

 

 

스위치로 태양광 충전을 멈추고

배터리 전원을 쓰도록 했을때

블링크 동작이 잘 이루어진다.

 

 

이 글을 쓰려고 몇 일을 허비했는지 모르겠다.

아무튼 이전에는 아두이노 쓸땐 USB전원으로 넣는것 말고는 잘 몰랐지만

아두이노 드론 같은데서 리튬 이온 베터리를 쓰고 충전하는걸 보면서 어떻게 하면 저렇게 할수 있을지 궁금해하곤 했었다.

 

그러다가 방학 전에 아두이노 전원회로에 대해서 쭉 훑어보면서 대략적인 전원회로 동작에 대해 좀 배운덕에

이제 베터리를 어떻게 하면 달아서 쓸수있을지 볼 준비가 된것 같았다.

 

 

지금 이 글을 쓴건 7월 19일이고

베터리 정리해서 주문한게 방학 이전이라 1-2주전쯤이라 가물가물한데

 

구글에 조금만 검색해보면 바로나온다

https://www.google.com/search?q=18650+%EB%B0%B0%ED%84%B0%EB%A6%AC+%EB%B3%B4%ED%98%B8%EB%AA%A8%EB%93%88+%EC%82%AC%EC%9A%A9%EB%B2%95&oq=18650+%EB%B0%B0%ED%84%B0%EB%A6%AC+%EB%B3%B4%ED%98%B8%EB%AA%A8%EB%93%88+%EC%82%AC%EC%9A%A9%EB%B2%95&aqs=chrome..69i57.5008j0j4&sourceid=chrome&ie=UTF-8 

 

18650 배터리 보호모듈 사용법 - Google 검색

상세보기18650 배터리 2CELL(2S) 보호회로 과충전, 과방전, 쇼트보호, 과전류 방지 ... 상세보기백업 배터리 스위칭 모듈 (유선전원 차단시 배터리로 전환시켜주는 ...

www.google.com

 

 

 

 

오래 쓸수 있게 용량 큰 베터리를 원했고 조금 찾아보니

보통 18650? 베터리를 많이 쓰나보더라

거기다가 베터리 충전 모듈로 TP4056이 있길래

많은 사람들이 이조합으로 쓰길래 이 두개와 배터리 홀더 정도를 구입했다.

ref : https://rasino.tistory.com/284

 

【 배터리와 충전모듈#24】 18650 리튬배터리 + TP4056 충전모듈

※ 주의! : 18650과 같은 리튭배터리는 직접적인 합선(쇼트)이나 회로내에서의 합선 등에 의해 불꽃과 소폭발의 가능성이 있는 제품이므로 다루실 때 충분한 주의와 사전지식이 필요하니 주의하

rasino.tistory.com

 

이 링크에서 베터리와 충전 전원 그리고 출력을 어떻게 연결하면 좋은지 보기 쉬운 그림이 있으니 

처음 쓰면 한번 봐도 좋을거같다.

ref : https://fishpoint.tistory.com/4566

 

리튬 배터리 충전 모듈 TP4056 사용법

리튬 배터리 충전 모듈 사용법 아두이노 나노의 새로운 제품군이 최근 추가 되었습니다. 먼저, 나노보드와 동일한 외형으로 성능을 높인 Nano Every 와, IoT 기능을 추가한 NANO 33 IoT 버전, 그리고 NANO

fishpoint.tistory.com

 

위 두 링크에서 충분히 TP4056 모듈에 대해서 설명하다보니 굳이 안봐도 되지만

여기서는  TP4056의 여러 단자버전들을 소개한다.

ref :https://makernambo.com/140

 

TP4056 배터리충전모듈 사양과 사용방법

1. TP4056 모듈 TP4056 모듈은 5V USB 전압을 입력받아 3.7V 리튬이온 배터리를 충전시켜 주는 모듈로서 저렴한 가격에 쓰임새가 많아 자주 사용하는 모듈이다. 즉 18650 등 리튬이온배터리로 회로를 구

makernambo.com

 

 

 

여러개 구입하긴 했지만 중요한 몇가지를 집자면

1. 18650베터리

2. TP4056

3. 점퍼핀타입 18650 베터리홀더 1구

4. PL2303TA USB-TTL

 

 

 

베터리는 엠씨유보드 닷컴의 과방전 보호회로 내장된 18650 베터리

https://smartstore.naver.com/mcuboard/products/5977292175?NaPm=ct%3Dl5rtg8bi%7Cci%3Dcheckout%7Ctr%3Dppc%7Ctrx%3D%7Chk%3De6ceecaa5acc4d7643b537b62528315d480db967 

 

KC인증 18650 리튬배터리 과방전 보호회로내장 2200mAh : 엠씨유보드닷컴

[엠씨유보드닷컴] 코딩, 전자부품은 엠씨유보드닷컴

smartstore.naver.com

TP4056

https://smartstore.naver.com/openidea/products/4833009692?NaPm=ct%3Dl5rth4mb%7Cci%3Dcheckout%7Ctr%3Dppc%7Ctrx%3D%7Chk%3D6bee1cc37dbf4a8b14caae245e288a8bb849d39f 

 

TP4056 리튬배터리 1A 충전모듈 (C TYPE USB) [OPEN-TA02-003] : 오픈아이디어

[오픈아이디어] 당신의 IDEA를 OPEN하세요. 아두이노 전자부품 쇼핑몰 OPENIDEA

smartstore.naver.com

 

베터리 홀더

https://smartstore.naver.com/openidea/products/5770253193?NaPm=ct%3Dl5rtha2x%7Cci%3Dcheckout%7Ctr%3Dppc%7Ctrx%3D%7Chk%3D5e645be86bd9eb4109126fb88ec1d3030274b60a 

 

18650 1구 배터리 홀더 점퍼핀타입 [OPEN-AA02-001] : 오픈아이디어

[오픈아이디어] 당신의 IDEA를 OPEN하세요. 아두이노 전자부품 쇼핑몰 OPENIDEA

smartstore.naver.com

 

프로그램 업로드에 쓸 USB-TTL 케이블

https://smartstore.naver.com/openidea/products/4833188705?NaPm=ct%3Dl5rtgyqt%7Cci%3Dcheckout%7Ctr%3Dppc%7Ctrx%3D%7Chk%3D16c218827704b1264e594a06f5dc74c5408bcbc1 

 

PL2303TA USB to TTL SERIAL CABLE [OPEN-TB05-002] : 오픈아이디어

[오픈아이디어] 당신의 IDEA를 OPEN하세요. 아두이노 전자부품 쇼핑몰 OPENIDEA

smartstore.naver.com

 

 

 

 

이전에 아두이노 전원회로를 공부할때 역전압 방지를 위해 다이오드를 쓰긴 했는데

내가 쓰는 베터리가 3.7 ~ 4.2V 왔다 갔다 하는 베터리다 보니 그냥 쓰질 않았다.

어짜피 8Mhz 내부 클락 사용때는 최저 2.7V면 괜찬다고 해서 써도 되는데

그냥 설마 역전압 때문에 뭔일 나겠나 싶어서 그냥 말았다. 

 

이런 식으로 쓸거고 

 

파워 서플라이와 TP4056으로 충전중인 모습

TP4056은 떔질안되있으니 핀헤더도 필요

 

 

중간에 전압 찍어보니 조금씩 오르길래 

충전하는 동안 다음으로 넘어가면

 

 

원래 우노보드의 ATmega328을 쓰려면

보통 외부 크리스탈을 달아서 클럭을 주는데,

예전에 얼핏 내부 클럭이 있다고 들었습니다.

 

데이터 시트에도 3.3V 정도의 저전압에서는 8MHz 저속으로 동작한다고하니

내부 클럭을 쓸순없나 찾아봤어요

 

 

가장 먼저 찾은 자료가 도두가이님이 만드신 자료인데

보통 아두이노를 쓸땐 usb랑 우노보드랑 연결해서 업로드 버튼만 누르면 됬지만

여기서는 부트로더를 굽니, 우노보드 두개가지고 어째저째 한다고 설명합니다.

 

 

부트로더가 뭔가 부팅 할때 가장 처음시작할때 동작하는건 알지만 이게 뭐가 중요한가? 에대해선 설명이 조금 부족합니다.

나중에 찾아보긴 했는데 일단 이 글대로 진행해보면

 

ref: https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=mapes_khkim&logNo=221890832646 

 

ATMEGA328P-PU만으로 작동하는 내부클럭 아두이노 만들기(초간단 아두이노)

ATMEGA328P-PU만으로 작동하는 내부클럭 아두이노 만들기(초간단 아두이노) ATMEGA328P-P...

blog.naver.com

 

가장 먼저 boards.txt에다가 8MHz 내부 클럭 사용에 대한 내용을 추가하라고하는데

이분이 말한데로 해당 파일에다가 설정 내용을 추가하고 스캐치를 다시 열어도 반영되지가 않았습니다..

분명 arduino의 파일 위치열기를 하면 program files/아두이노 폴더 쯤으로 가니

여기 있는 boards.txt 수정이 맞지 않나 싶지만 저의 경우에는 그렇진 않더라구요.

 

 

내부 클럭 쓰도록 부트로더좀 굽고싶은데 설정 파일부터가 안먹히니 한참 해맸습니다.

찾아보니 아래의 링크에서 프로그램 파일즈가 아니라

사용자폴더/앱데이터/로컬/아두이노15/패키지/아두이노/하드웨어/avr 안에 있는 boards.txt였네요.

이 파일을 수정 후에는 정상적으로 추가되었습니다.

https://www.instructables.com/Arduino-IDE-Creating-Custom-Boards/

 

Arduino IDE: Creating Custom Boards

Arduino IDE: Creating Custom Boards: Over the past six months I have spent a lot of time porting different libraries to the Robo HAT MM1 board developed by Robotics Masters. This has lead to discovering a lot about these libraries, how they work behind the

www.instructables.com

 

 

 

 

우리나라에서 쓴 글중에 이게 가장 대략적으로 잘 쓴거같긴한데

여기서 소개하는데로 왜 이러는지 당시에는 몰랐지만 프로그래밍 보드와 타겟 보드를 연결해서

부트로더 굽기를 하면 잘 구워집니다.

잠깐 딴길로 새면

마이크로 컨트롤러의 프로그래밍 업로드 방식을 다시봤습니다.

 

 

부트로더를 구울때 프로그래머 보드에다가 Arduino ISP를 올리고 타겟보드와 연결해서 하는데

이 ISP가 뭔가 싶었습니다.

 

 

블루베리 파이님의 블로그에서는 

ISP가 PCB에 연결해서 프로그램 메모리 EEPROM을 지우거나 쓰는 방식이라고 설명을하고

 

https://m.blog.naver.com/dododokim/221421896361

 

부트로더와 ISP 다운로더

부트로더 일반적으로 시스템(운영체제)을 정상적으로 작동시키기 위한 프로그램이 부트로더다. AVR에서...

blog.naver.com

 

이 글을 보고나서야 프로그래밍 방식이 JTAG도 있는게 생각났는데

ISP랑 다른건 디버깅이 가능한 점이고

https://dailylifetip.tistory.com/entry/JTAG-ISP-SPI-I2C

 

JTAG, ISP, SPI, I2C ?????????

ISP ( In-System Programing ) or SOP (System-on Programing) : 비휘발성 메모리(rom, flash memory 등)를 보드나 시 스템에 장착한 이후에 그 내용물을 프로그래밍 하는 것으로 이 기능이 없을 경우 프로그래밍..

dailylifetip.tistory.com

 

 

그러면 USB-TTL 케이블을 쓰는데 TTL이란 뭔가

이전에 본적 있는 나무길 블로그에서 잘 설명해줍니다.

RS-232라는 직렬통신이 있는데 이게 +-12V(232C는 +-5V) 양전압을 써서 간격이 더 크니

0~ 5V로 구분하는 TTL보다는 노이즈의 영향을 덜 받는다는 내용인데

 

아무튼 TTL은 노이즈의 영향을 받긴 더 쉽지만 전압 레벨이 간편해서 직렬 통신때 많이 쓴다는 소린가봅니다.

https://treeroad.tistory.com/entry/%EC%99%9C-TTL-%ED%86%B5%EC%8B%A0%EC%9D%B8%EA%B0%80

 

왜 TTL 통신인가

TTL 레벨과 RS-232C 레벨 통신의 차이는 아래와 같은 파형으로 구분될 수 있다. TTL 레벨은 0 V 와 5 V 를 왔다갔다 하면서 0과 1을 표현하지만 RS_232C 레벨은 +, -5V 양 전압 사이를 왔다갔다 해서 노이즈

treeroad.tistory.com

 

 

 

 

 

그러면 ISP, JTAG로 프로그래밍이 가능한데

USB-TTL 케이블, FTDI 케이블로도 되는데 뭐가 차이일까요?

 

찾은 글중에는 제타지니님의 블로그 글에서 이 내용이 확 와닿았습니다.

아직 잘은 모르지만 아래의 그림대로 USB TTL로 아직 왜쓰는지 모를 부트로더를 못 넣으니

부트로더 구울때는 직렬 변환기 대신 다른 우노보드를 ISP로 만들어서 써야 했던거 같습니다.

 

https://bnme.tistory.com/9

 

DIY Arduino-(3)이론조립...i.USB 연결, 외부 클럭

안녕하세요 제타지니입니다. 본 포스트는 많은 서적을 참고하였으나, 중심적으로 <아두이노 상상을 스케치하다.> 허경용 저. 의 DEUino를 중심으로 수학하였습니다. 조립에 대한 포스트를 쓰는

bnme.tistory.com

 

그리고 계속 MCU를 만지면서 메모리맵, Flash memory와 eeprom을 마주치는데 막연하게 알고있어서

나무길님의 글에서 다시 봤습니다.

대강 정리하면

eeprom은 바이트 단위로 읽고 쓰기 가능한 불휘발성 메모리

flash memory는 블록 단위로 읽고쓰기 가능한 eeprom이란 점인데, eeprom보다 구조가 간단해서 대용량이 가능한정도?로 이해하고 넘어가고

 

https://treeroad.tistory.com/entry/Flash-Memory%EC%99%80-EEPROM-%EC%B0%A8%EC%9D%B4%EC%A0%90

 

Flash Memory와 EEPROM 차이점

EEPROM과 Flash Memory 비교 EEPROM EEPROM(Electrically Erasable PROM)은 On-Board 상태에서 사용자가 내용을 Byte 단위로 Read하거나 Write 할 수 있으므로 사실상 SRAM처럼 사용 할 수 있는 불휘발성 메모리이..

treeroad.tistory.com

 

atmega328 데이터시트나

boards.txt 건드릴때 fuse 란 용어가 자꾸 쓰이는데

이걸 어떻게 해석해야 하나 싶었다. 

이건 boards.txt 에 추가한 8MHz 내부 클럭 설정부분

##############################################################

atmega328bb.name=ATmega328 on a breadboard 8 MHz internal clock


atmega328bb.upload.tool=avrdude
atmega328bb.upload.protocol=arduino
atmega328bb.upload.maximum_size=30720
atmega328bb.upload.maximum_data_size=2048
atmega328bb.upload.speed=57600

atmega328bb.bootloader.tool=avrdude
atmega328bb.bootloader.low_fuses=0xE2
atmega328bb.bootloader.high_fuses=0xDA
atmega328bb.bootloader.extended_fuses=0x05
atmega328bb.bootloader.unlock_bits=0x3F
atmega328bb.bootloader.lock_bits=0x0F
atmega328bb.bootloader.file=atmega/ATmegaBOOT_168_atmega328_pro_8MHz.hex

atmega328bb.build.mcu=atmega328p
atmega328bb.build.f_cpu=8000000L
atmega328bb.build.board=AVR_UNO_INTERNAL
atmega328bb.build.core=arduino
atmega328bb.build.variant=standard

 

사전에 나오는 도화선? 결합시키다 같은 용어 그대로 해석하자니 말이 잘 읽혀지지 않았는데

순딩님이 이거랑 관련해서 퓨즈 비트 글을 정리해놓은걸 찾았다.

결론적으로는 제어 레지스터의 값을 설정했던 것 처럼 부트로더 설정을 해주는게 퓨즈 비트였다.

어떻게 퓨즈 비트를 설정할지는 이분 블로그나 데이터 시트 보고 잘 정리해야할거같다.

 

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

 

[AVR/ATmega] 퓨즈 비트(Fuse bits), 클럭 설정

이전 포스팅에선 락 비트(Lock bits)를 설명드렸으니, 이번 글에선 퓨즈 비트(Fuse bits)를 설명드리겠습...

blog.naver.com

 

 

 

 

 

 

 

 

 

 

 

부트로더를 구운 이후 부터는 도두가이님의 글 내용이 잘 이해되지는 않았습니다.

부트로더를 올리고 나서 USB-TTL 케이블을 블로그 글에 나온 대로 연결해서 업로드를 해도 계속 안되서 

리셋 누르는 타이밍이 안맞아서 업로드가 안되나 싶었지만 우노 보드에 이 케이블을 연결해서 업로드해보니 또 잘됬구요.

 

ref: https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=mapes_khkim&logNo=221890832646 

 

ATMEGA328P-PU만으로 작동하는 내부클럭 아두이노 만들기(초간단 아두이노)

ATMEGA328P-PU만으로 작동하는 내부클럭 아두이노 만들기(초간단 아두이노) ATMEGA328P-P...

blog.naver.com

 

왜 USB TTL로 빵판의 atmega에 직접 업로드가 안되는지는 아직도 찾지 못했지만

그래도 업로드는 해야하니 좀더 찾아봤는데

 

 

 

이 글의 업로딩 방법을 참고했습니다.

USB-TTL은 가지고 있지만, FTDI는 없고 거기다가 업로딩할떄마다 RESET을 눌러줘야히니

타이밍 맞추기가 번거로웠는데 이렇게 구성하면 여기선 프로그래머 보드의 RESET 핀을

타겟 보드의 RESET 핀과 연결하니 눌러줄 필요가 없습니다

 

https://create.arduino.cc/projecthub/techmirtz/arduino-without-external-clock-crystal-on-atmega328-d4fcc4

 

Arduino Without External Clock Crystal on ATmega328

Everyone uses a 16MHz oscillator for a homemade Arduino, but did you know that ATmega328 can run without it? By Techmirtz.

create.arduino.cc

 

 

 

제가 만든 회로는 도두가이님의 회로와 비슷한 블링크 예제 회로를 만들었는데,

거기다가 바이패스 필터와 LED 전원 회로를 추가한 정도로 만들었습니다.

LED 위치도 스캐치 핀 번호에다가 12번을 줬구요.

그랬더니 동작하질 않았습니다.

 

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

 

 

 

이상한건 코드를 업로딩한 ATMEGA328을 우노보드에다 꽂고 12번 핀과 LED를 연결하면 블링크가 잘되는데

ATMEGA328을 보드에다 꽂고 12번 핀 자리에다가 LED연결했더니 반응이 없었습니다.

이걸 하루 지나서야 알았는데, 우노보드의 12번핀은 ATMEGA 328P에서는 달랐던걸 잊고있었죠.

 

 

아래 그림을 보면 디지털핀 12번은 ATMEGA328P의 18번 핀과 연결되어 있습니다.

그러니까 빵판에는 18번핀과 LED를 연결해야했는데 그걸 잊고 엉뚱한곳에 연결해놔서 불이 안들어왔던 거구요.

 

https://stringfixer.com/files/27509185.jpg

 

 

회로도 그릴 체력은 없어서

그냥 녹화한걸 올리면

화면에 나온데로 외부 클럭이 없지만

내부 클럭만으로도 잘 동작합니다.

 

 

이건 기존 16MHz 외부 클럭 사용하는 기존 부트로더를 올린건데 코드는 내부 클럭쓴것과 같습니다.

크리스탈 진동자로 외부 클럭을 받아서 잘 동작하고,

다른건 위 베터리가 3.7 - 4.2V 정도라 16MHz 속도로 동작하려면 5v가 필요하다보니

베터리 대신 파워 서플라이로 공급하고 있습니다.

 

 

 

지난 주에는 방학하고 집청소 하느라 제대로 공부하지 못했는데

오랜만에 뭔가 해낸거같아서 뿌듯하기도하고

8월 3일날 전자산업기사 실기 시험이라 그거 좀 준비하다가

이후에 태양광 패널 사서 달던가 심플하게 피아노 구현을 해보려고합니다.

'하드웨어' 카테고리의 다른 글

로봇HW - 2. 로봇 액추에이터  (0) 2022.09.14
로봇HW - 1. MCU HW  (0) 2022.09.08
automata - 6. 기계 요소의 모션  (0) 2022.07.05
automata - 5. 기계 결합과 제품 개발 과정  (0) 2022.07.05
automata - 4. 재료와 부품  (0) 2022.07.05

지난 글에 정리했듯이

외부 AREF를 받진 않을거라

캐패시터통해서 바로 GND랑 연결하고

 

VCC, AVCC, GND들도 정리하자

 

 

아직 보드 전원회로는 아니지만

MCU단 진동자와 전원은 마무리했다.

 

 

리셋핀의 경우 DTR도 받아야하니

프로 미니의 회로도를 참고해서 만들면

 

 

아래의 DIP 타입 핀을 참고해서

네트 네임이랑 점퍼도 추가하려고하는데

핀맵이 조금 신경쓰인다.

 

아래의 링크를 보면

스크래치에 13번 핀 LED 예제인데, 

13번 핀에다가 직접 연결한다.

ref : https://yoo7577.tistory.com/270

 

하지만 32핀 Atmega328을 쓰는 아두이노 pro mini 회로도를 보면

무엇이 13번 핀인지는 안보인데, 아래의 사진을 같이 보면

JP6의 10번핀 SCK가 실제 PRO의 13번핀인걸 알 수 있고,

이 SCK는 ATMEGA328의 17번핀과 연결된다.

 

 

 

하지만 28핀짜리 ATEMGA328P-PU의 PB5(SCK)는 19번 핀이다.

32핀짜리 ATEMGA328의 PB5가 17번 핀이었으나

32핀 짜리것과 PB5의 핀 번호는 다르더라도 결국에는 PB5인건 같으니 상관없는지는

아직 잘 모르겠다.

 

 

32핀 보드짜리 코드를 28핀짜리 보드 코드에 쓰지 못하지 않을까 싶었는데

아두이노 스캐치를 보니 보드를 선택할수 있는게 생각나서 확인해봤다.

 

우노보드의 핀맵과

아두이노 프로의 핀맵은 다르니

우노보드의 핀맵을 참고해서 하면 문젠 없을거같다.

 

 

 

잠깐 찾아봤는데

자작 보드만들어서 FTDI 케이블로 업로딩 하는 영상을 찾았다.

 

내가 만들려는거랑 비슷하다.

 

ref : https://www.youtube.com/watch?v=xEnIgC3hCnM&ab_channel=EasyOne 

 

 

 

 

아 계속 프로미니처럼 만든다고 햇갈렸는데

그냥 우노보드 비슷하게 만들면 되는걸 잊었다.

 

계속 햇갈리는 중인데

ATmega328P는 USART 직렬 통신으로 프로그래밍이 가능하다고한다.

 

직렬 통신으로 프로그래밍 할때 어떻게 하는가를 보고싶지만 잘 모르겠다.

 

 

USART로 한다는건 알겠지만 어떻게 프로그래밍 업로드 상황인지

그냥 USART 통신하는 상황인지 판단해서

프로그램 업로드를 하는건지 알고싶은데 

 

 

일단 여기에서는 아두이노에 프로그래밍 업로드 하는 방법 두가지를 소개한다.

https://www.instructables.com/Overview-the-Arduino-sketch-uploading-process-and-/

 

 

 

 

 

 

 

 

------

아 모르겠다.

위 내용을 오늘 아침 9시쯤했었는데 노느라 지금까지 안했다.

  

 

 

더 이상 이거가지고 삽질하는건 시간낭비인거같아서

일단 엉성하게라도 마무리하려고 한다.

 

 

USB나 파워 서플라이로 전원 넣는다 하고,

전원 노이즈 필터링은 C4 캐패시터로 하려고 한다.

 

 

일단 엉성하게라도 보드 회로도 완성본

 

 

 

다음으로 직접 PCB 만들기 대신 

빵판이나 땜질로 할거지만

 

그래도 어떻게 할지 정리해야되니

엉성하게라도 PCB 파츠 배치하고 와이어링했다.

 

수업 진도나 다른거 공부하는게 벅차서

PCB 수업을 제대로 안한게 좀 후회되긴 했다 ㅋㅋㅋ ㅠㅜ

설정 해야될게 너무많아서 하기싫은건 어쩔수도 없었고

 

 

잘 모르는 사람이 보면 겉보기엔 괜찮을순 있지만 

 

3D로 보면 PCB 상태가 처참하다 ㅋㅋㅋ

 

 

 

처음이다보니 회로도를 이렇게 만들기도 너무 벅찼다

나중에 부품 찾아서 만들어보고, 아마 고쳐야될듯싶네

 

 

단순 회로는 여기서 마치고,

내일은 3D 프린터로 만능 기판에 맞춰서 쓸수있는 프레임을 만들어봐야겠다.

지난 번까지

arduino uno 전원회로와 동작 원리에 대해서 살펴봤다.

 

원래는 ATmega128로 KUT128 같은 보드를 만들까 싶었지만 핀이 너무 많아서 힘들것 같고

대신 우노보드에 사용한 ATmega328를 이용한 보드를 만들고자 하는데,

그나마 Pro mini 회로도를 보고

거기서 빼도 될부분은 빼서 간단하게 만들어보는게 나을것 같았다.

 

 

 

우노보드의 경우 

USB2Serial용도의 추가적인 마이컴과 회로가 있어서

더 복잡하나

 

 

 

 

 

프로 미니의 경우 이에 대한 부분은 빠져있어서 훨씬 간단하다.

 

 

프로그래밍 업로드의 경우 어떻게 할까 찾아보니

보통 FTDI 케이블이나 USB2TTL 케이블을 쓰는거같은데

 

 

아무거나 상관없을거같고

아래의 링크에 따르면 USB2TTL 케이블은 DTR핀이 없는 경우 업로딩후 직접 리셋해줘야 한다고 한다.

이래서인지 위의 프로 미니 회로도에도 DTR핀이 328의 RESET단자와 연결되어있다.

https://blog.naver.com/ann_arbor/221359169142

 

 

 

 

 

 

MCU는 이미 가지고 있는 아두이노 우노보드의 ATMEGA328P-PU를 쓸 예정이고,

MOUSER의 데이터시트를 봤는데

https://www.mouser.kr/datasheet/2/268/ATmega48A_PA_88A_PA_168A_PA_328_P_DS_DS40002061B-1900559.pdf

 

PU란게 28P3 패키징 처리라고한다.

근데 속도가 20MHz라고 하는데, 원래 우노보드에서 16MHz 크리스탈 쓴걸로 아는데 왜이런지는 모르겠다.

 

 

 

 

이제 회로 설계를 하면서 좀 보려고하는데

지난번에 설치한 Autocad 껀 자꾸 딜레이가 생겨서 쓰기가 너무 힘들고,

프로테우스의 경우 내가 쓰려고하는 ATmega328P-PU 라이브러리를 제대로 찾지는 않았지만 파츠를 찾지 못했다.

 

대신 다른거 쓸게 없을까 싶다보니 

위 아두이노 미니 프로 회로도를 그리는데 쓴 EasyEDA가 괜찮을거같더라

이걸로 쭉 진행하려고하는데 위에 미니 프로 회로도는 크게 상관없지만 3.3V 기준으로 나와있다.

 

 

아 내가 만들려는건 실제 아두이노 프로미니를 본따서 만들거지만

32핀 짜리 ATmega328이 아니라 28핀 ATmega328P-PU를 쓴다.

 

 

 

 

일단 크리스탈 파트를 보면

16MHz 진동자와 1M짜리 저항을 쓰고 있다.

 

잘 보면 수정진동자와 캐패시터가 같이 합쳐져 있는데

스펙 찾아보니 이게 15pF짜리 빌트인 진동자라고 한다.

내가 쓸건 SMD 타입은 아니라

빌트인 캐패시터가 있는지보고 달아줘야할거같다.

 

 

 

JYJE S4T16000HYFAC

일단 회로도상에 이 소자를 썻는데, 

여기는 빌트인 캐패시터가 없고, 부하 캐패시터가 9pF라니까

이렇게 두개 달아줬다.

 

 

이걸 완성시키면 빵판에다가 테스트 해보긴 할거지만

결국에는 만능기판에다가 땜질할거니 일단 FTDI 단자부터

프로 미니 회로도 따라그리면

 

 

프로 미니와 우노보드를 보면

우측우노보드의 AVCC와 VCC가 무극성 캐패시터를 통과하고 있는데

이게 노이즈 필터링 바이패스 캐패시터로 보이고,

 

좌측 프로미니의 경우 3.3V 네트와 GND 네트가 328의 핀과 직접 연결되어있는데

해당 그림의 좌측 하단에 따로 빼서 표시한거같다.

 

 

캐패시터 용량을보면 둘다 0.1uF로 상관은 없는데

AREF가 신경쓰인다. 우노보드에는 디지털 점퍼와 캐패시터와 연결되어있고,

프로미니는 캐패시터를 통해 GND로 연결된다.

 

 

AREF가 햇갈리는데

잠깐 찾아보니 아날로그 기준전압으로

 

 

원래 ADC는 5V ~0V를 1024단계로 나누지만

AREF를 쓰면 더 정밀하게 AREF ~ 0V를 2^10 = 1024 단계로 나눠서 볼수 있다고 한다.

이 부분은 메카솔루션 블로그 참고

https://blog.naver.com/PostView.naver?blogId=roboholic84&logNo=220543931172&categoryNo=30&parentCategoryNo=0 

 

 

 

아래 링크를 보면

AREF 쓰는법을 잘 설명해주는데,

https://kwonkyo.tistory.com/381

 

 

AREF를 외부에서 받아서 쓸수 있으며

우노보드에서 REF핀으로부터 받아 캐패시터와 함께 328보드의 AREF핀으로 연결되어있다.

 

 

하지만, 프로미니의 경우 AREF단자가 없으므로

최대 기준 전압없이 5 ~ 0V로 ADC하는거같다.

+ Recent posts