제조공정
<메인 클래스="사이트 메인" id="메인">
이 튜토리얼에서는 무선 통신을 만드는 방법을 배웁니다. nRF24L01을 사용하여 두 개의 Arduino 보드 간에 트랜시버 모듈. nRF24L01 모듈은 Arduino를 사용할 때 무선 통신에 매우 인기 있는 선택입니다.
이미 수많은 Arduino 프로젝트에 이 모듈을 사용했으며 여기에서 그 중 일부를 확인할 수 있습니다.
다음 비디오를 보거나 아래에 작성된 튜토리얼을 읽을 수 있습니다. 여기에는 모듈 핀 배치, 작동 원리, 배선 및 여러 코드 예제와 같이 nRF24L01 트랜시버 모듈에 대해 알아야 할 모든 것이 포함되어 있습니다.
무선 통신을 설명하기 위해 우리는 두 가지 예를 만들 것입니다. 첫 번째는 한 Arduino에서 다른 Arduino로 간단한 "Hello World" 메시지를 보내는 것이고 두 번째 예에서는 Arduino 보드 간에 양방향 통신을 할 것입니다. 첫 번째 Arduino의 조이스틱을 사용하여 두 번째 Arduino의 서보 모터를 제어하고, 그 반대로 두 번째 Arduino의 푸시 버튼을 사용하여 첫 번째 Arduino의 LED를 제어합니다.
NRF24L01 트랜시버 모듈을 자세히 살펴보겠습니다. 2.4GHz 대역을 사용하며 250kbps에서 최대 2Mbps의 전송 속도로 작동할 수 있습니다. 열린 공간에서 더 낮은 전송 속도에서 사용하는 경우 범위는 최대 100미터에 도달할 수 있습니다.
전체 사양은 다음과 같습니다.
주파수 범위 | 2.4 – 2.5GHz ISM 대역 |
데이터 속도 | 250Kbps / 1Mbps / 2Mbps |
최대. 출력 전력 | 0dBm |
작동 전압 | 1.9 – 3.6V |
최대. 작동 전류 | 12.3mA |
대기 전류 | 22µA |
논리 입력 | 5V 허용 |
통신 범위 | 100m(광활한 공간) |
이 모듈은 125개의 다른 채널을 사용할 수 있어 한 곳에서 독립적으로 작동하는 125개의 모뎀 네트워크를 가질 수 있습니다. 각 채널은 최대 6개의 주소를 가질 수 있으며 각 장치는 동시에 최대 6개의 다른 장치와 통신할 수 있습니다.
<그림 클래스="aligncenter">이 모듈의 전력 소비는 전송 중 약 12mA로 단일 LED보다 훨씬 낮습니다. 모듈의 동작 전압은 1.9V ~ 3.6V이지만 다른 핀은 5V 로직을 견디기 때문에 로직 레벨 컨버터를 사용하지 않고도 아두이노에 쉽게 연결할 수 있다는 것이 장점입니다.
<그림 클래스="aligncenter">이 핀 중 3개는 SPI 통신용이며 Arduino의 SPI 핀에 연결해야 하지만 각 Arduino 보드에는 서로 다른 SPI 핀이 있습니다. CSN 및 CE 핀은 Arduino 보드의 모든 디지털 핀에 연결할 수 있으며 모듈을 대기 또는 활성 모드로 설정하고 전송 또는 명령 모드 간에 전환하는 데 사용됩니다. 마지막 핀은 사용할 필요가 없는 인터럽트 핀입니다.
NRF24L01 모듈에는 여러 변형이 있습니다. 가장 인기 있는 것은 온보드 안테나가 있는 것입니다. 이것은 모듈을 더 컴팩트하게 만들지만 다른 한편으로 전송 범위를 약 100미터의 거리로 낮춥니다.
두 번째 변형은 온보드 안테나 대신 SMA 커넥터가 있으며 더 나은 전송 범위를 위해 덕 안테나를 연결할 수 있습니다.
여기에 표시된 세 번째 변형에는 오리 안테나 외에도 PA가 포함된 RFX2401C 칩이 있습니다. (전력 증폭기) 및 LNA (저잡음 증폭기). 이것은 NRF24L01 신호를 증폭하고 열린 공간에서 최대 1000미터의 더 나은 전송 범위를 가능하게 합니다.
다음은 NRF24L01 핀아웃과 NRF24L01+ PA/LNA 모듈에 대한 자세한 내용입니다.
두 모듈, NRF24L01 및 NRF24L01+ PA/LNA는 핀아웃이 동일하므로 회로에서 동일한 방식으로 연결할 수 있습니다.
NRF24L01 모듈을 Arduino 보드에 연결하는 방법은 다음과 같습니다.
이미 언급했듯이 각 Arduino 보드에는 서로 다른 SPI 핀이 있으므로 Arduino 보드에 모듈을 연결할 때 염두에 두십시오.
Arduino | SCK | MISO | MOSI | SS |
아니요 | 13 | 12 | 11 | 10 |
나노 | 13 | 12 | 11 | 10 |
메가 | 52 | 50 | 51 | 53 |
아래 링크에서 이 Arduino 튜토리얼에 필요한 구성요소를 얻을 수 있습니다.
NRF24L01 모듈을 Arduino 보드에 연결하면 송신기와 수신기 모두에 대한 코드를 만들 준비가 된 것입니다.
먼저 프로그래밍을 덜 어렵게 만드는 RF24 라이브러리를 다운로드하여 설치해야 합니다. Arduino IDE 라이브러리 관리자에서 직접 이 라이브러리를 설치할 수도 있습니다. "rf24"를 검색하고 "TMRh20, Avamander"로 검색하여 설치하십시오.
다음은 무선 통신을 위한 두 가지 코드이며 아래에 설명이 나와 있습니다.
/*
* Arduino Wireless Communication Tutorial
* Example 1 - Transmitter Code
*
* by Dejan Nedelkovski, www.HowToMechatronics.com
*
* Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(7, 8); // CE, CSN
const byte address[6] = "00001";
void setup() {
radio.begin();
radio.openWritingPipe(address);
radio.setPALevel(RF24_PA_MIN);
radio.stopListening();
}
void loop() {
const char text[] = "Hello World";
radio.write(&text, sizeof(text));
delay(1000);
}
Code language: Arduino (arduino)
/*
* Arduino Wireless Communication Tutorial
* Example 1 - Receiver Code
*
* by Dejan Nedelkovski, www.HowToMechatronics.com
*
* Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(7, 8); // CE, CSN
const byte address[6] = "00001";
void setup() {
Serial.begin(9600);
radio.begin();
radio.openReadingPipe(0, address);
radio.setPALevel(RF24_PA_MIN);
radio.startListening();
}
void loop() {
if (radio.available()) {
char text[32] = "";
radio.read(&text, sizeof(text));
Serial.println(text);
}
}
Code language: Arduino (arduino)
따라서 기본 SPI와 새로 설치된 RF24 라이브러리를 포함하고 RF24 객체를 생성해야 합니다. 여기서 두 가지 인수는 CSN 및 CE 핀입니다.
RF24 radio(7, 8); // CE, CSN
Code language: Arduino (arduino)
다음으로 주소를 나타내는 바이트 배열 또는 두 모듈이 통신할 파이프를 만들어야 합니다.
const byte address[6] = "00001";
Code language: Arduino (arduino)
이 주소의 값을 임의의 5자리 문자열로 변경할 수 있으며 이를 통해 대화할 수신자를 선택할 수 있으므로 이 경우 수신자와 송신기 모두에서 동일한 주소를 갖게 됩니다.
설정 섹션에서 라디오 객체를 초기화하고 radio.openWritingPipe() 함수를 사용하여 데이터를 보낼 수신기의 주소, 이전에 설정한 5자리 문자열을 설정해야 합니다.
radio.openWritingPipe(address);
Code language: Arduino (arduino)
다른 한편으로는 수신기에서 radio.setReadingPipe() 함수를 사용하여 동일한 주소를 설정하고 이러한 방식으로 두 모듈 간의 통신을 활성화합니다.
radio.openReadingPipe(0, address);
Code language: Arduino (arduino)
그런 다음 radio.setPALevel() 함수를 사용하여 전력 증폭기 레벨을 설정합니다. 이 경우 모듈이 서로 매우 가깝기 때문에 최소로 설정하겠습니다.
radio.setPALevel(RF24_PA_MIN);
Code language: Arduino (arduino)
더 높은 레벨을 사용하는 경우 작동하는 동안 더 안정적인 전압을 가질 수 있도록 GND 및 3.3V 모듈에 바이패스 커패시터를 사용하는 것이 좋습니다.
다음으로 모듈을 송신기로 설정하는 radio.stopListening() 함수가 있고 다른 한편에는 모듈을 수신기로 설정하는 radio.startListening() 함수가 있습니다.
// at the Transmitter
radio.stopListening();
Code language: Arduino (arduino)
// at the Receiver
radio.startListening();
Code language: Arduino (arduino)
루프 섹션에서 송신기에서 "Hello World" 메시지를 할당할 문자 배열을 만듭니다. radio.write() 함수를 사용하여 해당 메시지를 수신자에게 보냅니다. 여기서 첫 번째 인수는 우리가 보내려는 변수입니다.
void loop() {
const char text[] = "Hello World";
radio.write(&text, sizeof(text));
delay(1000);
}
Code language: Arduino (arduino)
변수 이름 앞에 "&"를 사용하여 전송하려는 데이터를 저장하는 변수 표시를 실제로 설정하고 두 번째 인수를 사용하여 해당 변수에서 가져오려는 바이트 수를 설정합니다. 이 경우 sizeof() 함수는 "텍스트" 문자열의 모든 바이트를 가져옵니다. 프로그램이 끝나면 1초 지연이 추가됩니다.
radio.write() 함수를 사용하여 한 번에 최대 32바이트를 보낼 수 있습니다.
반면에 수신기에서는 radio.available() 함수를 사용하여 루프 섹션에서 수신할 데이터가 있는지 확인합니다. 그것이 사실이라면 먼저 "텍스트"라고 하는 32개 요소의 배열을 만들고 여기에 들어오는 데이터를 저장합니다.
void loop() {
if (radio.available()) {
char text[32] = "";
radio.read(&text, sizeof(text));
Serial.println(text);
}
}
Code language: Arduino (arduino)
radion.read() 함수를 사용하여 데이터를 읽고 "텍스트" 변수에 저장합니다. 결국 우리는 직렬 모니터에 텍스트를 인쇄합니다. 따라서 두 프로그램을 모두 업로드하면 수신기에서 직렬 모니터를 실행할 수 있으며 매초 "Hello World"라는 메시지가 인쇄되는 것을 확인할 수 있습니다.
전원 공급 장치 소음 NRF24L01 모듈과 성공적인 통신을 시도할 때 사람들이 경험하는 가장 일반적인 문제 중 하나입니다. 일반적으로 RF 회로 또는 무선 주파수 신호는 전원 공급 장치 노이즈에 민감합니다. 따라서 전원 공급 라인에 디커플링 커패시터를 포함하는 것이 항상 좋은 생각입니다. 커패시터는 10uF ~ 100uF입니다.
또 다른 일반적인 문제는 Arduino 보드의 3.3V 핀이 항상 NRF24L01 모듈에 충분한 전력을 공급할 수 없다는 것입니다. 따라서 외부 전원으로 모듈에 전원을 공급하는 것도 좋은 생각입니다.
두 번째 예인 두 개의 Arduino 보드 간의 양방향 무선 통신을 살펴보겠습니다. 다음은 회로도입니다.
아래 링크에서 이 예시에 필요한 구성요소를 얻을 수 있습니다.
다음은 두 개의 코드와 그에 대한 설명입니다.
송신기 코드
/*
* Arduino Wireless Communication Tutorial
* Example 2 - Transmitter Code
*
* by Dejan Nedelkovski, www.HowToMechatronics.com
*
* Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#define led 12
RF24 radio(7, 8); // CE, CSN
const byte addresses[][6] = {"00001", "00002"};
boolean buttonState = 0;
void setup() {
pinMode(12, OUTPUT);
radio.begin();
radio.openWritingPipe(addresses[1]); // 00002
radio.openReadingPipe(1, addresses[0]); // 00001
radio.setPALevel(RF24_PA_MIN);
}
void loop() {
delay(5);
radio.stopListening();
int potValue = analogRead(A0);
int angleValue = map(potValue, 0, 1023, 0, 180);
radio.write(&angleValue, sizeof(angleValue));
delay(5);
radio.startListening();
while (!radio.available());
radio.read(&buttonState, sizeof(buttonState));
if (buttonState == HIGH) {
digitalWrite(led, HIGH);
}
else {
digitalWrite(led, LOW);
}
}
Code language: Arduino (arduino)
수신자 코드
/*
* Arduino Wireless Communication Tutorial
* Example 2 - Receiver Code
*
* by Dejan Nedelkovski, www.HowToMechatronics.com
*
* Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Servo.h>
#define button 4
RF24 radio(7, 8); // CE, CSN
const byte addresses[][6] = {"00001", "00002"};
Servo myServo;
boolean buttonState = 0;
void setup() {
pinMode(button, INPUT);
myServo.attach(5);
radio.begin();
radio.openWritingPipe(addresses[0]); // 00001
radio.openReadingPipe(1, addresses[1]); // 00002
radio.setPALevel(RF24_PA_MIN);
}
void loop() {
delay(5);
radio.startListening();
if ( radio.available()) {
while (radio.available()) {
int angleV = 0;
radio.read(&angleV, sizeof(angleV));
myServo.write(angleV);
}
delay(5);
radio.stopListening();
buttonState = digitalRead(button);
radio.write(&buttonState, sizeof(buttonState));
}
}
Code language: Arduino (arduino)
여기서 이전 예와 다른 점은 양방향 통신을 위해 두 개의 파이프 또는 주소를 생성해야 한다는 것입니다.
const byte addresses[][6] = {"00001", "00002"};
Code language: Arduino (arduino)
설정 섹션에서 두 파이프를 모두 정의해야 하며 첫 번째 Arduino의 쓰기 주소는 두 번째 Arduino의 읽기 주소여야 하고 그 반대의 경우도 첫 번째 Arduino의 읽기 주소는 쓰기 주소여야 합니다. 두 번째 아두이노.
// at the Transmitter
radio.openWritingPipe(addresses[1]); // 00001
radio.openReadingPipe(1, addresses[0]); // 00002
Code language: Arduino (arduino)
// at the Receiver
radio.openWritingPipe(addresses[0]); // 00002
radio.openReadingPipe(1, addresses[1]); // 00001
Code language: Arduino (arduino)
radio.stopListening() 함수를 사용하는 루프 섹션에서 첫 번째 Arduino를 송신기로 설정하고 Joystick의 값을 0에서 180까지 읽고 매핑하며 radio.write() 함수를 사용하여 데이터를 수신기로 보냅니다.피>
radio.stopListening();
int potValue = analogRead(A0);
int angleValue = map(potValue, 0, 1023, 0, 180);
radio.write(&angleValue, sizeof(angleValue));
Code language: Arduino (arduino)
다른 한편으로는 radio.startListening() 함수를 사용하여 두 번째 Arduino를 수신기로 설정하고 사용 가능한 데이터가 있는지 확인합니다. 사용할 수 있는 데이터가 있는 동안 데이터를 읽고 "angleV" 변수에 저장한 다음 해당 값을 사용하여 서보 모터를 회전합니다.
radio.startListening();
if ( radio.available()) {
while (radio.available()) {
int angleV = 0;
radio.read(&angleV, sizeof(angleV));
myServo.write(angleV);
}
Code language: Arduino (arduino)
다음으로, 송신기에서 첫 번째 Arduino를 수신기로 설정하고 빈 "while" 루프를 사용하여 두 번째 Arduino가 데이터를 보낼 때까지 기다립니다. 버튼을 누르면 LED가 켜집니다. 그래서 이러한 과정이 끊임없이 반복되고 두 아두이노 보드는 끊임없이 데이터를 주고 받습니다.
NRF24L01 모듈을 사용하여 예제 코드를 하나 더 살펴보겠습니다. 모든 것은 이전 예제와 동일하게 유지되며 날짜를 구성하고 보내는 방식을 예상합니다.
송신기 코드
/*
Arduino Wireless Communication Tutorial
Example 1 - Transmitter Code
by Dejan Nedelkovski, www.HowToMechatronics.com
Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(7, 8); // CE, CSN
const byte address[6] = "00001";
// Max size of this struct is 32 bytes - NRF24L01 buffer limit
struct Data_Package {
byte a = 0;
byte b = 125;
byte c = 255;
int d = 1024;
float e = 3.141592;
String f = "Test";
};
Data_Package data; // Create a variable with the above structure
void setup() {
radio.begin();
radio.openWritingPipe(address);
radio.setPALevel(RF24_PA_MIN);
radio.stopListening();
}
void loop() {
// Send the whole data from the structure to the receiver
radio.write(&data, sizeof(Data_Package));
delay(500);
}
Code language: Arduino (arduino)
따라서 실제로 다양한 유형의 변수 모음인 구조체를 만들 수 있습니다.
// Max size of this struct is 32 bytes - NRF24L01 buffer limit
struct Data_Package {
byte a = 0;
byte b = 125;
byte c = 255;
int d = 1024;
float e = 3.141592;
String f = "Test";
};
Data_Package data; // Create a variable with the above structure
Code language: Arduino (arduino)
이 구조체 데이터의 최대 크기는 32바이트일 수 있음을 명심해야 합니다. 여기에서 3개의 변수 유형 바이트, 하나의 정수 변수(4바이트), 하나의 부동 변수(4바이트) 및 4개의 문자를 포함하는 하나의 문자열(4바이트)이 포함되었음을 알 수 있습니다. 총 15바이트입니다.
수신자 코드
/*
Arduino Wireless Communication Tutorial
Example 1 - Receiver Code
by Dejan Nedelkovski, www.HowToMechatronics.com
Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(7, 8); // CE, CSN
const byte address[6] = "00001";
// Max size of this struct is 32 bytes - NRF24L01 buffer limit
struct Data_Package {
byte a = 0;
byte b = 125;
byte c = 255;
int d = 1024;
float e = 3.141592;
String f = "Test";
};
Data_Package data; //Create a variable with the above structure
void setup() {
Serial.begin(9600);
radio.begin();
radio.openReadingPipe(0, address);
radio.setPALevel(RF24_PA_MIN);
radio.startListening();
}
void loop() {
// Check whether there is data to be received
if (radio.available()) {
radio.read(&data, sizeof(Data_Package)); // Read the whole data and store it into the 'data' structure
}
Serial.print("a: ");
Serial.print(data.a);
Serial.print(" b: ");
Serial.print(data.b);
Serial.print(" c: ");
Serial.print(data.c);
Serial.print(" d: ");
Serial.print(data.d);
Serial.print(" e: ");
Serial.print(data.e);
Serial.print(" f: ");
Serial.println(data.f);
}
Code language: Arduino (arduino)
수신자 측에서는 들어오는 데이터를 수신할 수 있도록 동일한 구조체 데이터를 정의해야 합니다. 무선 통신이 제대로 되는지 테스트를 위해 시리얼 모니터에 각각의 변수를 출력해 봤습니다.
NRF24L01 모듈은 Arduino 프로젝트에 무선 통신이 필요할 때 적합한 옵션입니다. 저는 이미 많은 Arduino 프로젝트에서 이 모듈을 사용했습니다.
여기에 내가 이 모듈을 사용한 모든 프로젝트를 나열할 것입니다.
이러한 각 프로젝트/튜토리얼에는 회로도, 더 나은 통신을 위한 개선된 코드 구현 등을 포함하여 NRF24L01 모듈을 사용하는 방법에 대한 자세한 설명이 있습니다.
내가 가장 좋아하는 프로젝트는 맞춤형으로 설계된 Arduino RC 송신기입니다. 실제로는 거의 모든 Arduino 프로젝트를 제어하는 데 사용할 수 있는 14채널 RC 컨트롤러입니다.
이것이 이 튜토리얼의 전부입니다. 즐겁게 사용하시고 새로운 것을 배우셨기를 바랍니다. 언제나 그렇듯이 아래의 댓글 섹션에서 언제든지 질문하세요.
제조공정
0에서 9까지 숫자를 세고 다시 0으로 숫자를 세는 시계 타이머를 본 적이 있다면 74LS93 IC 작동을 본 적이 있을 것입니다. 그럼에도 불구하고 555 타이머와 같은 다른 펄스 생성 IC가 있습니다. 그러나 74LS93 핀아웃은 여러 가지 이유로 선호되는 IC입니다. 그 중 하나는 마이크로컨트롤러가 특정 전자 프로젝트에 적합하지 않다는 것입니다. 이를 위해 74LS93이 훌륭한 대안이 됩니다. 전반적으로 타이머 응용 프로그램을 만들어야 하는 경우 있어야 할 위치에 있습니다. 결국 IC의 작동 방식과 사용 방법을 배우게 됩니
초, 분, 일, 월, 심지어 년을 포함하여 Arduino에서 시간을 추적하는 방법을 찾고 계십니까? 이 경우 RTC 모듈인 DS1307 Arduino가 필요합니다. 실시간 시계(RTC)는 시간을 추적하고 특정 시간에 작업을 수행하는 데 도움이 되는 장치입니다. 그러나 이것이 모든 회로에서 작동하려면 Arduino와 인터페이스해야 합니다. 다행히도 저희가 도와드리겠습니다. 이 기사에서는 DS1307을 RTC 모듈로 사용하고 이에 대한 모든 것을 배우고 Arduino 보드와 함께 사용하는 방법을 배우게 됩니다. DS1307 모