- 필요한 구성 요소
- 433Mhz RF 송신기 및 수신기 모듈)
- STM32F103C8이있는 RF 송신기의 회로도
- Arduino Uno가있는 RF 수신기의 회로도
- 무선 RF 전송을위한 STM32F103C8 프로그래밍
- RF 수신기로 Arduino UNO 프로그래밍
- STM 32 기반 RF 송신기 및 수신기 테스트
임베디드 전자 장치에서 무선 프로젝트를 만드는 것은 장치를 더 편리하고 휴대 할 수 있도록하는 뒤죽박죽 된 전선이 없기 때문에 매우 중요하고 도움이됩니다. Bluetooth, WiFi, 433MHz RF (Radio Frequency) 등과 같은 다양한 무선 기술이 있습니다. 모든 기술에는 비용, 거리 또는 범위 전송, 속도 또는 처리량 등과 같은 고유 한 장단점이 있습니다. 오늘은 STM32와 함께 RF 모듈을 사용합니다. 무선으로 데이터를 송수신 합니다. STM32 Microcontroller를 처음 사용하는 경우 Arduino IDE를 사용하여 STM32로 LED 깜박임으로 시작하고 여기에서 다른 모든 STM32 프로젝트를 확인하십시오.
이 외에도 RF 433Mhz 무선 모듈을 다른 마이크로 컨트롤러와 함께 사용하여 다음과 같은 무선 제어 프로젝트를 구축했습니다.
- RF 제어 가전
- Raspberry Pi를 사용하는 RF 원격 제어 LED
- RF 제어 로봇
- Arduino와 RF 모듈 인터페이스
- RF 모듈을 사용한 PIC 대 PIC 통신
여기 에서는 433MHz RF 무선 모듈을 STM32F103C8 마이크로 컨트롤러와 인터페이스합니다. 이 프로젝트는 두 부분으로 나뉩니다. 송신기 STM32와 인터페이스한다 과 수신기의 Arduino UNO와 인터페이스한다. 송신 및 수신 부분 모두에 대해 다른 회로도와 스케치 가 있습니다.
이 튜토리얼에서 RF 송신기 는 두 개의 값을 수신기 측으로 보냅니다. 초음파 센서를 사용하여 측정 한 거리와 (0 ~ 100)의 숫자로 매핑되는 전위차계 ADC 값 (0 ~ 4096)입니다. Arduino 의 RF 수신기 는 값을 모두 수신하고 해당 거리와 숫자 값을 16x2 LCD 디스플레이에 무선으로 인쇄합니다.
필요한 구성 요소
- STM32F103C8 마이크로 컨트롤러
- Arduino UNO
- 433Mhz RF 송신기 및 수신기
- 초음파 센서 (HC-SR04)
- 16x2 LCD 디스플레이
- 10k 전위차계
- 브레드 보드
- 전선 연결
433Mhz RF 송신기 및 수신기 모듈)
RF 송신기 핀아웃:
433Mhz RF 송신기 |
핀 설명 |
개미 |
안테나 연결 용 |
GND |
GND |
VDD |
3.3 ~ 5V |
데이터 |
수신자에게 전송할 데이터가 여기에 제공됩니다. |
RF 수신기 핀아웃:
433Mhz RF 수신기 |
사용하다 |
개미 |
안테나 연결 용 |
GND |
GND |
VDD |
3.3 ~ 5V |
데이터 |
송신기에서 수신 할 데이터 |
CE / DO |
또한 데이터 핀입니다. |
433MHz 모듈 사양:
- 수신기 작동 전압: 3V ~ 5V
- 송신기 작동 전압: 3V ~ 5V
- 작동 주파수: 433MHz
- 전송 거리: 3 미터 (안테나 제외) ~ 100 미터 (최대)
- 변조 기법: ASK (진폭 시프트 키잉)
- 데이터 전송 속도: 10Kbps
STM32F103C8이있는 RF 송신기의 회로도
RF 송신기와 STM32F103C8 간의 회로 연결:
STM32F103C8 |
RF 송신기 |
5V |
VDD |
GND |
GND |
PA10 |
데이터 |
체크 안함 |
개미 |
초음파 센서와 STM32F103C8 사이의 회로 연결:
STM32F103C8 |
초음파 센서 (HC-SR04) |
5V |
VCC |
PB1 |
삼각 |
PB0 |
에코 |
GND |
GND |
10K 전위차계는 STM32의 ADC 핀 PA0까지 (0 ~ 3.3V) 아날로그 입력 값을 제공하는 STM32F103C8 접속되어있다.
Arduino Uno가있는 RF 수신기의 회로도
RF 수신기와 Arduino UNO 간의 회로 연결:
Arduino UNO |
RF 수신기 |
5V |
VDD |
GND |
GND |
11 |
데이터 |
체크 안함 |
개미 |
16x2 LCD 및 Arduino UNO 간의 회로 연결:
LCD 핀 이름 |
Arduino UNO 핀 이름 |
접지 (Gnd) |
접지 (G) |
VCC |
5V |
VEE |
대비를위한 전위차계 중심의 핀 |
등록 선택 (RS) |
2 |
읽기 / 쓰기 (RW) |
접지 (G) |
활성화 (EN) |
삼 |
데이터 비트 4 (DB4) |
4 |
데이터 비트 5 (DB5) |
5 |
데이터 비트 6 (DB6) |
6 |
데이터 비트 7 (DB7) |
7 |
LED 긍정적 |
5V |
LED 네거티브 |
접지 (G) |
코딩은 아래에서 간략하게 설명됩니다. 첫 번째 부분은 송신기 부분이고 다른 부분은 수신기 부분이 될 스케치의 두 부분이 있습니다. 이 튜토리얼이 끝나면 모든 스케치 파일과 작업 비디오가 제공됩니다. RF 모듈과 Arduino Uno의 인터페이스에 대해 자세히 알아 보려면 링크를 따르십시오.
무선 RF 전송을위한 STM32F103C8 프로그래밍
STM32F103C8은 Arduino IDE를 사용하여 프로그래밍 할 수 있습니다. FTDI 프로그래머 또는 ST-링크는 STM32F103C8에 코드를 업로드하는 데 필요하지 않습니다. STM32의 USB 포트를 통해 PC에 연결하고 ARDUINO IDE로 프로그래밍을 시작하기 만하면됩니다. 링크를 따라 Arduino IDE에서 STM32 프로그래밍을 배울 수 있습니다.
송신기 섹션에서 'cm'단위의 물체 거리는 초음파 센서를 사용하여 측정되며 STM32와 인터페이스 된 RF 송신기를 통해 전송되는 전위차계를 사용하여 설정된 (0 ~ 100)의 숫자 값을 측정합니다.
먼저 Radiohead 라이브러리가 포함되어 있으며 여기에서 다운로드 할 수 있습니다. 이 라이브러리는 ASK (Amplitude Shift Keying Technique)를 사용하여 데이터를 송수신합니다. 이것은 프로그래밍을 매우 쉽게 만듭니다. 스케치-> 라이브러리 포함->. zip 라이브러리 추가 로 이동하여 스케치에 라이브러리를 포함 할 수 있습니다 .
#포함
송신기 측의이 튜토리얼에서와 같이 초음파 센서를 사용하여 거리를 측정하므로 트리거 및 에코 핀이 정의됩니다.
#trigPin PB1 정의 # echoPin PB0 정의
다음으로 RH_ASK 라이브러리의 개체 이름은 속도 (2000), RX 핀 (PA9) 및 TX 핀 (PA10)과 같은 매개 변수를 사용하여 rf_driver로 설정됩니다.
RH_ASK rf_driver (2000, PA9, PA10);
다음으로이 프로그램에 필요한 Strings 변수가 선언됩니다.
문자열 전송 _ 번호; 문자열 전송 거리; 문자열 전송;
다음으로 void setup ()에서 RH_ASK rf_driver의 객체가 초기화됩니다.
rf_driver.init ();
그 후 트리거 핀이 OUTPUT 핀으로 설정되고 PA0 (전위차계에 연결됨) 및 에코 핀이 INPUT 핀으로 설정됩니다. 직렬 통신은 9600의 전송 속도에서 시작됩니다.
Serial.begin (9600); pinMode (PA0, INPUT); pinMode (echoPin, INPUT); pinMode (trigPin, OUTPUT);
다음으로 void loop ()에서 입력 아날로그 전압 인 전위차계 값이 디지털 값으로 변환됩니다 (ADC 값이 발견됨). STM32의 ADC는 12 비트 분해능을 가지고 있습니다. 따라서 디지털 값은 (0 ~ 4096)에서 (0 ~ 100)으로 매핑됩니다.
int analoginput = analogRead (PA0); int pwmvalue = map (analoginput, 0,4095,0,100);
다음으로 2 마이크로 초의 지연으로 트리거를 높고 낮게 설정하여 초음파 센서를 사용하여 거리를 측정합니다.
digitalWrite (trigPin, LOW); delayMicroseconds (2); digitalWrite (trigPin, HIGH); delayMicroseconds (10); digitalWrite (trigPin, LOW);
에코 핀은 반사파를 다시 감지합니다. 즉, 트리거 된 파동이 다시 반사되는 시간은 공식을 사용하여 물체의 거리를 계산하는 데 사용됩니다. 링크를 따라 초음파 센서가 거리를 계산하는 방법에 대해 자세히 알아보십시오.
긴 기간 = pulseIn (echoPin, HIGH); 부동 거리 = 기간 * 0.034 / 2;
이제 측정 된 데이터 번호와 거리가 모두 문자열 데이터로 변환되고 각 문자열 변수에 저장됩니다.
전송 _ 번호 = 문자열 (pwmvalue); 전송 _ 거리 = 문자열 (거리);
두 문자열은 모두 한 줄로 추가되고 전송 및 쉼표 ","라는 문자열에 저장되어 두 문자열을 구분하는 데 사용됩니다.
전송 = 전송 _pwm + ","+ 전송 _ 거리;
전송 문자열은 문자 배열로 변환됩니다.
const char * msg = 전송.c_str ();
데이터가 전송되고 전송 될 때까지 기다립니다.
rf_driver.send ((uint8_t *) msg, strlen (msg)); rf_driver.waitPacketSent ();
전송 된 문자열 데이터는 직렬 모니터에도 표시됩니다.
Serial.println (msg);
RF 수신기로 Arduino UNO 프로그래밍
Arduino UNO는 Arduino IDE를 사용하여 프로그래밍됩니다. 수신기 섹션에서는 송신기 섹션에서 전송되고 RF 수신기 모듈에 의해 수신 된 데이터와 수신 된 문자열 데이터가 각각의 데이터 (거리 및 번호)로 분할되어 16x2 LCD 디스플레이에 표시됩니다.
수신기 코딩을 간단히 살펴 보겠습니다.
송신기 섹션과 마찬가지로 먼저 RadiohHead 라이브러리가 포함됩니다. 이 라이브러리는 ASK (Amplitude Shift Keying Technique)를 사용하여 데이터를 송수신합니다. 이것은 프로그래밍을 매우 쉽게 만듭니다.
#포함
LCD 디스플레이가 여기에 사용되므로 액정 라이브러리도 포함됩니다.
#포함
그리고 Arduino UNO와 연결된 16x2 LCD 디스플레이 핀은 LCD를 객체로 사용하여 지정 및 선언됩니다.
LiquidCrystal lcd (2,3,4,5,6,7);
다음으로 문자열 데이터를 저장할 문자열 데이터 변수가 선언됩니다.
문자열 str_receive; 문자열 str_number; 문자열 str_distance;
Radiohead 라이브러리의 개체가 선언됩니다.
RH_ASK rf;
이제 void setup ()에서 LCD 디스플레이가 16x2 모드로 설정되고 환영 메시지가 표시되고 지워집니다.
lcd.begin (16,2); lcd.print ("CIRCUIT DIGEST"); lcd.setCursor (0,1); lcd.print ("RF with STM32"); 지연 (5000); lcd.clear ();
그 후 rf 객체가 초기화 됩니다.
rf.init ();
이제 void loop () 에서 Array buf는 크기가 7로 선언됩니다. 송신기에서 전송 된 데이터는 ","를 포함하여 7 개가 있습니다. 따라서 전송할 데이터에 따라이를 변경하십시오.
uint8_t buf; uint8_t buflen = sizeof (buf);
rf 수신기 모듈에서 문자열을 사용할 수있는 경우 if 함수는 크기를 확인하고 실행합니다. rf.recv ()는 데이터를 수신하기 위해 사용된다.
if (rf.recv (buf, & buflen))
BUF는 그럼 수신 된 문자열이 저장되고, 수신 된 문자열을 보유 str_receive 문자열 변수.
str_receive = String ((char *) buf);
이 for 루프는 두 문자열 사이에서 ','를 감지하면 수신 된 문자열을 두 개로 분할하는 데 사용됩니다.
for (int i = 0; i <str_receive.length (); i ++) { if (str_receive.substring (i, i + 1) == ",") { str_number = str_receive.substring (0, i); str_distance = str_receive.substring (i + 1); 단절; }
두 값에 대한 두 개의 문자 배열이 선언되고 두 개로 분할 된 문자열은 문자열을 문자 배열로 변환하여 존중 된 배열에 저장됩니다.
char numberstring; char distancestring; str_distance.toCharArray (거리 문자열, 3); str_number.toCharArray (numberstring, 3);
그 후 atoi ()를 사용하여 문자 배열을 정수로 변환하십시오.
int 거리 = atoi (거리 문자열); int 숫자 = atoi (숫자 문자열);
정수 값으로 변환 후 거리와 숫자 값이 16x2 LCD 디스플레이에 표시됩니다.
lcd.setCursor (0,0); lcd.print ("번호:"); lcd.print (숫자); lcd.setCursor (0,1); lcd.print ("거리:"); lcd.print (거리); lcd.print ("cm");
STM32와 Arduino UNO에 각각 송신기와 수신기 코드를 모두 업로드 한 후 STM32를 사용하여 측정 한 숫자, 물체 거리 등의 데이터는 RF 송신기를 통해 RF 수신기로 전송되고 수신 된 값은 LCD 디스플레이에 무선으로 표시됩니다.
STM 32 기반 RF 송신기 및 수신기 테스트
1. 숫자가 0이고 물체의 거리가 6cm 일 때.
2. 47 번과 물체의 거리가 3cm 일 때.