반응형

마이크로컨트롤러에서 사용할 수 있는 범용 입출력 핀의 수는 많지 않으므로 직렬 통신이 사용된다.

직렬 통신은 1개의 입출력 핀을 통해 8개 비트를 8번에 나누어 전송하는 방식이다.

직렬 통신 중 가장 흔히 사용되는 UART로 진행한다.

UART 통신은 전이중 통신으로 송신과 수신을 동시에 진행할 수 있으며 이를 위해서 2개의 범용 입출력 핀이 필요하다.

ATMega328(아두이노 우노 칩에서 사용되는)에서는 PD0 핀과 PD1 핀이 사용된다. (아두이노 우노는 0, 1핀이다.)

/*
 * UART_TEST.c
 *
 * Created: 2023-06-20 오후 8:46:56
 * Author : Yoon
 */ 
#define F_CPU 16000000L
#include <avr/io.h>
#include <util/delay.h>

void UART_INIT(void)
{
	UCSR0A |= (1 << U2X0);   // 2배속 모드
	
	UBRR0H = 0x00;           // 9600bps
	UBRR0L = 207;          
	
	UCSR0C |= 0x06;          // 비동기, 8bit 데이터, 1bit start, 1bit stop, no parity
	
	UCSR0B |= (1 << RXEN0);  // 수신 가능
	UCSR0B |= (1 << TXEN0);  // 송신 가능
}

unsigned char UART_receive(void)
{
	while(!(UCSR0A & (1 << RXC0)));  // 데이터 수신 대기
	return UDR0;
}

void UART_transmit(unsigned char data)
{
	while(!(UCSR0A & (1 << UDRE0)));  // 송신 가능 대기
	UDR0 = data;                      // 데이터 전송
}

int main(void)
{
	unsigned char data;
	
	UART_INIT();             // UART 통신 초기화
    while (1) 
    {
		data = UART_receive();   // 데이터 수신
		UART_transmit(data);     // 수신된 문자를 에코백
    }
	
	return 0;
}

UART 결과

1. UCSR0A(USART Control and Status Register 0A) 레지스터 : UART 통신의 제어와 상태 체크

UX20 : 비동기 전송모드에서만 사용되며, 2배속 모드이면 1, 1배속 모드이면 0의 값을 가진다.

RXC0 : 수신 버퍼(UDR0)에 읽지 않은 문자가 있을 때는 1이 되고, 버파가 비어 있을 때는 0이 된다. UCSR0B 레지스터의 RXCIE0 비트와 함께 사용되어 수신 완료 인터럽트를 발생시킬 수 있다.

UDRE0 : 송신 버퍼(UDR0)가 비어 있어 데이터를 받을 준비가 되어 있을 때 1이 된다. UCSR0B 레지스터의 UDRIE0 비트와 함께 사용되어 송신 데이터 레지스터 준비 완료 인터럽트를 발생시킬 수 있다.

2. UCSR0B

RXCIE0 : 수신 완료 인터럽트를 발생을 허용한다.

TXCIE0 : 송신 완료 인터럽트를 발생을 허용한다.

RXEN0 : UART 수신기의 수신 기능을 활성화한다.

TXEN0 송신기의 송신 기능을 활성화한다.

3. UCSR0C : 데이터 형식 및 통신 방법을 결정한다.

4. UBRR0H, HBRR0L : 보율을 12비트로 표현한다.

5. UDR0 : 송수신된 데이터가 저장되는 버퍼 레지스터

 

C:\Program Files (x86)\Atmel\Studio\7.0\packs\atmel\ATmega_DFP\1.7.374\include\avr

 

#include <stdio.h>
#include <stdint.h>

void printBinary(uint8_t value) {
  for (int i = 7; i >= 0; i--) {
    if ((value >> i) & 1)
      printf("1");
    else
      printf("0");
  }
  printf("\n");
}

int main(void) {
  uint8_t UCSR0A = 0b00000000;
  uint8_t U2X0 = 1;
  uint8_t RXC0 = 7;
  uint8_t UDRE0 = 5;
  
  printf("UCSR0A in binary: ");
  printBinary(UCSR0A);

  UCSR0A |= (1 << U2X0);
  printf("[init] UCSR0A in binary: ");
  printBinary(UCSR0A);

  UCSR0A = !(UCSR0A & (1 << RXC0));
  printf("[RX] UCSR0A in binary: ");
  printBinary(UCSR0A);

  UCSR0A = !(UCSR0A & (1 << UDRE0));
  printf("[TX] UCSR0A in binary: ");
  printBinary(UCSR0A);

  UCSR0A = UCSR0A & (1 << RXC0);
  printf("[RX] UCSR0A in binary: ");
  printBinary(UCSR0A);

  UCSR0A = UCSR0A & (1 << UDRE0);
  printf("[TX] UCSR0A in binary: ");
  printBinary(UCSR0A);
  
  return 0;
}

728x90
반응형
반응형

ISP 장치 : AVRISP-MKII (IOT-ISP-MK2)

https://www.devicemart.co.kr/goods/view?no=1386293 

 

AVRISP-MKII AVR프로그래머 [IOT-ISP-MK2]

ISP전용 AVR 프로그래머 / AVRISP MKII 호환 / MS-Windows7,8,10 지원 / 사이즈:16mm*69mm

www.devicemart.co.kr

해당 ISP 장치 드라이버 : 

https://www.wch.cn/download/CH341SER_ZIP.html

아트멜 스튜디오  설치 경로 :

https://www.microchip.com/en-us/tools-resources/develop/microchip-studio#Downloads

[File] - [New] - [Project]

GCC C Executable Project 

Name : HelloWorld

ATmega328P 선택

 

테스트 코드 : 1초에 한 번 씩 LED 점멸

/*
 * HelloWorld.c
 *
 * Created: 2023-06-18 오후 11:09:05
 * Author : Yoon
 */ 
#define F_CPU 16000000L
#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
	DDRB = 0x20;
    /* Replace with your application code */
    while (1) 
    {
		PORTB = 0x00;
		_delay_ms(1000);
		PORTB = 0x20;
		_delay_ms(1000);
    }
	
	return 1;
}

위 코드를 이용해 프로젝트를 빌드한다.

빌드 성공 시, HEX 파일(기계어 파일)이 생성됨. (경로)

C:\Users\Yoon\Documents\Atmel Studio\7.0\HelloWorld\HelloWorld\Debug

Device Programming에서 Program으로 보드에 업로드.

위 퓨즈의 값과 같이 설정해야 16MHz 외부 클럭을 사용함.

'Device Programming' 다이얼로그에서 'Memories' 탭을 선택하면 플래시 메모리에 업로드할 실행 파일에 기본적으로 ELF 파일이 선택되어 있음. ELF는 Executable and Linking Format의 약어로 아트멜 스튜디오에서 사용하는 avr-gcc에서 컴파일의 결과로 생성하는 파일 형식을 나타냄. avr-objcopy 프로그램은 생성된 ELF 파일을 읽어 최종 HEX 파일로 변환함.

 

728x90
반응형
반응형

아두이노 우노에 USB-Serail 대신 ISP 장치를 이용해 업로드를 할 예정임.

ISP 방식은 ISP 장치가 별도로 필요하며, C 스타일 프로그래밍으로 레지스터를 직접 제어할 수 있음.

리셋 핀으로 직접 연결하여 SP 통신 방식을 사용함.

아두이노는 ATmega328을 기본으로 만들어진 보드로, 8bit CPU를 포함하고 있으며, 핀 8개를 묶어서 포트 단위로 입출력이 행해짐.

ATMega328은 1MHz 내부 클럭이지만, 아두이노 우노 보드는 외부 클럭 16MHz 크리스털을 사용함.

보드 : 아두이노 우노 

프로그래머 :  AVRISP MKII 

ISP 장치는 AVRISP MKII를 사용함.

ISP장치로 업로드할 경우, USB-Serial 방식을 사용할 수 없으므로 주의할 것.

(다시 아두이노 방식을 사용하기 위해선 부트로더를 다시 올려야 함.)

728x90
반응형

'임베디드 > AVR' 카테고리의 다른 글

[AVR] 아두이노 우노 UART 통신하기  (0) 2023.06.20
아트멜 스튜디오 시작하기.  (0) 2023.06.18
반응형

나는 라즈베리파이로 많은 프로젝트를 했다. 개인적으로 많이 가지고 놀기도 했고 특히 미니 해서 좋아했다. 위 사진은 내가 지금 가지고 있는 라즈베리파이들이다. 더 있지만 깔끔하게 관리되고 있는 것들로 사진을 찍었다.

그러다 보니 관련 문서도 자주 찾아보게 되고, Reddit에서 재밌는 프로젝트도 찾아보곤 한다.

많은 사람들이 balenaEtcher 프로그램을 이용해서 SD카드에 라즈비안을 굽는다. 나 또한 그랬다.

하지만 요즘엔 Raspberry Pi imager를 이용한다.


 
Raspberry Pi imager를 사용하는 이유.
  • 첫 번째 : balenaEtcher를 이용하면 라즈비안 OS도 별도로 설치해야 한다. 하지만 Raspberry Pi imager를 사용하면 별도의 OS 없이 라즈비안을 SD카드에 설치할 수 있다.
  • 두 번째 : 라즈비안 OS 설정을 Raspberry Pi imager에서 바로 설정할 수 있다.

나는 두 번째 이유 때문에 Raspberry Pi imager를 사용한다.

보통 처음 라즈베리파이를 사용하는 사람은 Full OS(GUI 포함)를 사용한다. 하지만 조금 사용하다 보면, 100에 99는 LITE OS를 설치하여 SSH로 접속한다.

SSH 접속하는 방법은 간단하다. 다만, 매번 설정하는 것이 귀찮다.


Raspberry Pi SSH 설정 (SD 카드 Flash 성공했다는 가정 하에)
  • SSH enable : ssh (확장자명 없이 빈 파일 생성)
  • WiFi 설정 : wpa_supplicant.conf (파일 생성) WiFi 5GHz 대신 2.4GHz 지향
  • Port fowarding : 기본 SSH 포트 번호 => 22
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
network={
    ssid="{WiFi 아이디}"
    psk="{WiFi 비밀번호}"
    key_mgmt=WPA-PSK
}

대부분 사람들이 위 방법으로 SSH를 설정한다. 하지만 이것도 한두 번이지 굉장히 귀찮은 작업이다. 이제 내가 추천하는 방법이다. 바로 Raspberry Pi imager를 이용하는 방법이다. 파일을 생성하고, 코드를 작성할 필요도 없다. 모두 GUI 선에서 해결할 수 있다.


추천 :Raspberry Pi imager를 이용하여 Raspberry Pi SSH 설정
  • Raspberry Pi imager 설치 (공식 홈페이지)

- 설치가 완료되면 아래와 같이 프로그램을 실행한다.

  • Advanced options (Ctrl + Shift + X)

- 컨트롤, 시프트, X 키를 동시에 누르면, 기본 옵션을 설정할 수 있는 창이 아래와 같이 보인다.

- 이 설정값을 매번 사용하고 싶으면 [for this session only][to always use]로 변경한다.

- set hostname : host name이다. 디폴트는 raspberrypi이다. 굳이 변경하지 않아도 된다.

- Enable SSH : SSH 활성화, 활성화하려면, 체크하면 된다. 초기 비밀번호를 변경할 수 있다. default는 raspberry이다.

- Configure wifi : 연결하고 싶은 WiFi 이름과 비밀번호를 입력한다. 단, 5GHz WiFi는 안된다. 항상 2.4GHz WiFi를 선택해야 한다.

위 GUI 방식으로 WiFi와 SSH를 설정하면, 실수도 줄어들고 빠르고 직관적으로 내 라즈베리파이를 설정할 수 있다. 지금까지 SD카드에 일일이 설정했다면, 이제 Raspberry Pi imager를 사용하길 바란다.

728x90
반응형
반응형

목차

1. HC-05, HC-06 테스트 및 설정 : https://coding-yoon.tistory.com/206

 

글을 시작하기 전에 내가 대학생일 때 들었었으면 좋았을 강의 하나가 있다. 이용성 교수님께서 강의해 주시는 건데 회로부터 하나하나 설명해 주시니 진짜 너무 좋은 영상이다.

아두이노 UNO 와 블루투스 모듈과 0, 1번을 사용하면 안 되는 이유

가끔 블로그를 보면 아두이노와 블루투스 모듈을 0, 1번에 서로 연결하는 경우가 있다. 완성 시 컴퓨터와 분리했을 때는 문제가 되지 않고, 아두이노에 코딩을 할 때 문제가 발생한다.

아두이노에서 통신 방식은 대표적으로 UART, I2C, SPI 방식이 있다. 특히 UART를 조심히 사용해야 한다.

가장 많이 사용되는 아두이노 UNO 같은 경우 UART는 한 개이며, 각각 0번 핀(RX:수신), 1번 핀(TX:송신)이다. 그런데 아두이노는 이상한 특징을 가지고 있다. UART 0, 1번 핀이 컴퓨터와 연결되는 USB 케이블 부분과 연결돼 있다.

우리는 아두이노에서 출력되는 값을 아두이노 serial monitor를 통해서 확인할 수 있다. USB 케이블을 통해 데이터가 출력되지만, 이 USB 케이블은 0, 1번과 연결돼있다. 정리하자면 컴퓨터에 아두이노를 연결하는 순간 이미 아두이노와 컴퓨터는 서로 serial 통신을 하고 있다.

그렇다면 블루투스 모듈을 0, 1번에 사용하면 어떻게 될까? 당연히 충돌 난다. 하지만 간혹 운이 좋아 동작할 수 있지만 올바른 동작이라고 할 수 없다.

그렇다면 아두이노 UNO는 UART를 사용할 수 없는가?

하나밖에 없는 UART는 이미 사용하고 있기 때문에, 아두이노는 softwareserial를 사용해 uart를 사용할 수 있다. 몇 개든 uart를 선언해서 사용할 수 있지만 software로 구현돼있기 때문에 굉장히 느리다. 그렇기 때문에 아두이노 코딩 할 때는 softwareserial을 사용할 수 밖에 없고, 완성 후에 하드웨어 serial을 사용하면 된다. 이것에 대한 팁은 나중에 올리려고 한다.

*아두이노에 대한 UART를 더 알고 싶으시면 아래 블로그를 참고하시길 바랍니다.

아두이노 UNO 와 블루투스 모듈(HC-05, HC-06) 연결

아래와 같이 아두이노와 블루투스 모듈을 연결했고, 코드는 아래와 같다.

코드는 굉장히 간단하다. 블루투스로 수신 받은 값을 serial monitor에 출력하는 코드이다. 

#include <SoftwareSerial.h>

#define BT_RXD 3
#define BT_TXD 2
SoftwareSerial bluetooth(BT_RXD, BT_TXD);

void setup() {
  Serial.begin(115200);     // 이전 글 참고
  bluetooth.begin(115200);  // 이전 글 참고
}

void loop() {
  if (bluetooth.available()) {
    Serial.write(bluetooth.read());
  }
  if (Serial.available()) {
    bluetooth.write(Serial.read());
  }
}

 

올바르게 연결하고 펌웨어에 코드를 입혔다면, Arduino bluetooth controller를 설치해서 Terminal mode로 테스트한다. Hello를 입력해보면, Arduino IDE의 Serial monitor에서 값을 확인할 수 있다.

 

 

HC-05, HC-06

블루투스 모듈인 HC-05와 HC-06에서 LED를 확인할 수 있는데, 이는 state에 대한 LED이다.

LED 점멸 : 기기 Pair 가능 상태

LED 꺼짐 : 연결 상태

HC-05, HC-06에는 VCC, GND, TX, RX 외에도 state, EN 단자가 있다. state는 블루투스 상태를 출력하는 단자로 위 LED에 연결돼있다. EN 단자는 만약 블루투스가 연결 상태라면 강제로 신호를 주어 블루투스 연결을 끊을 수 있다.

728x90
반응형

+ Recent posts