Arduino 전압계 전체 설명. 직렬 포트를 통해 PC에 연결된 Arduino의 디지털 전압계

전압이나 회로의 특정 지점을 확인하고 싶은데 전압계나 멀티미터가 없는 경우가 있습니까? 구매하러 달려가시나요? 길고 비용이 많이 듭니다. 그 전에 전압계를 직접 만들어 보는 것은 어떨까요? 사실 간단한 재료만 있으면 직접 만들 수도 있어요.

1단계: 구성 요소 준비

  • 수업에서는 Arduino와 호환되는 보드인 SunFounder Uno / Mars(http://bit.ly/2tkaMba)를 사용했습니다.
  • USB 데이터 케이블
  • 전위차계 2개(50k)
  • LCD1602 - http://bit.ly/2ubNEfi
  • 개발 보드 - http://bit.ly/2slvfrB
  • 다중 점퍼

연결하기 전에 먼저 어떻게 작동하는지 살펴보겠습니다.

전압계 데이터 처리의 주요 부분에는 SunFounder Uno 보드를 사용하고, LCD1602는 화면으로, 전위차계는 LCD 대비를 조정하고, 또 다른 보드는 전압을 분배하는 데 사용됩니다.

Uno 보드에 연결된 전위차계를 회전하면 전위차계 저항이 변경되어 그에 따른 전압이 변경됩니다. 전압 신호는 A0 핀을 통해 Uno 보드로 전송되고, Uno는 수신된 아날로그 신호를 디지털 형식으로 변환하여 LCD에 기록합니다. 이렇게 하면 전류 커패시턴스 저항의 전압 값을 볼 수 있습니다.

LCD1602에는 4비트와 8비트의 두 가지 작동 모드가 있습니다. MCU IO가 충분하지 않은 경우 D4~D7 핀만 사용하는 4비트 모드를 선택할 수 있습니다.

표를 따라 연결하세요.

4단계: 전위차계를 LCD1602에 연결합니다.

전위차계의 중간 핀을 LCD1602의 Vo 핀에 연결하고 다른 핀을 GND에 연결합니다.

전위차계의 중간 핀을 SunFounder Uno의 핀 A0에 연결하고 다른 핀 중 하나를 5V에 연결하고 다른 핀을 GND에 연결합니다.

6단계: 코드 업로드

이 코드는:

#포함하다 /*********************************************** ******* *****/ const int AnalogIn = A0;//A0에 전위차계 연결 LiquidCrystal lcd(4, 6, 10, 11, 12, 13);//lcd(RS,E,D4 ,D5,D6.D7) float val = 0;// 변수를 value=0으로 정의 /**************************** ******* *****************/ void setup() ( Serial.begin(9600);//직렬 lcd.begin(16, 2) 초기화 ;//LCD의 문자 위치를 Line 2, Column 16으로 설정 lcd.print("전압 값:");//print "전압 값:" ) /************* ******* **********************************/ void loop() ( val = AnalogRead (A0);//전위차계 값을 val로 읽습니다. val = val/1024*5.0;// 데이터를 수학적인 방법으로 해당 전압 값으로 변환합니다. Serial.print(val);//val 수를 인쇄합니다. 직렬 모니터에서 Serial.print ("V"); // 단위를 V로 인쇄합니다. 직렬 모니터의 전압을 줄인 것입니다. lcd.setCursor(6,1);//커서를 라인 1, 열 6에 놓습니다. 여기에 문자가 표시됩니다. lcd.print(val);//LCD에 val 수를 인쇄합니다. lcd.print("V");//그런 다음 단위를 V로 인쇄합니다. 이는 LCD의 전압을 의미합니다. 200); //200ms 동안 대기)

전위차계를 회전시켜 LCD1602의 전압을 실시간으로 확인하세요.

여기에 까다로운 것이 있습니다. 코드를 실행한 후 LCD에 문자가 표시되었습니다. 그런 다음 화면에 문자가 선명하게 표시될 때까지 전위차계를 시계 방향 또는 시계 반대 방향으로 돌려 화면 대비(검은색에서 흰색으로 점진적으로 변경)를 조정했습니다.

전압을 측정하려면 두 개의 배터리(1.5V 및 3.7V)를 사용하십시오. 두 번째 전위차계를 A0 및 GND 핀에 연결하면 회로에서 전위차계가 제거됩니다. 와이어 A0의 끝을 배터리 양극에 고정하고 GND 회로를 음극에 고정합니다. 다시 연결하지 마십시오. 그렇지 않으면 배터리가 단락될 수 있습니다. 0V 값은 역방향 연결입니다.

따라서 배터리 전압이 LCD 디스플레이에 표시됩니다. 배터리가 완전히 충전되지 않았기 때문에 값과 공칭 값 사이에 약간의 오류가 있을 수 있습니다. 그렇기 때문에 배터리를 사용할 수 있는지 여부를 파악하려면 전압을 측정해야 합니다.

추신:디스플레이 디스플레이에 문제가 있는 경우 LCD 디스플레이에 대한 FAQ(http://wiki.sunfounder.cc/index.php?title=LCD1602/I2C_LCD1602_FAQ)를 참조하세요.

Arduino 보드의 아날로그 입력.

Arduino UNO 보드에는 전압 신호를 측정하도록 설계된 6개의 아날로그 입력이 포함되어 있습니다. 보드의 6핀이 개별 출력 모드와 아날로그 입력 모드 모두에서 작동할 수 있다고 말하는 것이 더 정확할 것입니다.

이 핀의 번호는 14~19입니다. 처음에는 아날로그 입력으로 구성되었으며 A0~A5라는 이름을 사용하여 액세스할 수 있습니다. 언제든지 개별 출력 모드로 구성할 수 있습니다.

핀모드(A3, OUTPUT); // A3에 대한 개별 출력 모드 설정
디지털쓰기(A3, LOW); // 출력 A3을 낮게 설정

아날로그 입력 모드로 돌아가려면:

핀모드(A3, INPUT); // A3에 대한 아날로그 입력 모드 설정

아날로그 입력 및 풀업 저항.

풀업 저항은 아날로그 입력 핀과 개별 핀에 연결됩니다. 이 저항은 다음 명령을 사용하여 켜집니다.

디지털쓰기(A3, HIGH); // A3 입력에 대한 풀업 저항을 켭니다.

명령은 입력 모드로 구성된 핀에 적용되어야 합니다.

저항은 아날로그 입력 신호의 레벨에 영향을 미칠 수 있다는 점을 기억해야 합니다. 풀업 저항을 통과하는 5V 전원 공급 장치의 전류는 신호 소스의 내부 저항에 걸쳐 전압 강하를 유발합니다. 따라서 저항을 분리하는 것이 좋습니다.

Arduino 보드의 아날로그-디지털 변환기.

입력의 실제 전압 측정은 6개 채널용 스위치가 있는 아날로그-디지털 변환기(ADC)에 의해 수행됩니다. ADC의 분해능은 10비트이며 이는 변환기 0...1023 출력의 코드에 해당합니다. 측정 오류는 최하위 숫자의 2단위를 넘지 않습니다.

최대 정확도(10비트)를 유지하려면 신호 소스의 내부 저항이 10kOhm을 초과하지 않아야 합니다. 이 요구 사항은 보드의 아날로그 입력에 연결된 저항 분배기를 사용할 때 특히 중요합니다. 분배 저항의 저항은 너무 높을 수 없습니다.

아날로그 입력 소프트웨어 기능.

int 아날로그읽기(포트)

지정된 아날로그 입력에서 전압 값을 읽습니다. 입력 전압 범위는 0부터 기준 전압 레벨(종종 5V)까지이며 0부터 1023까지의 코드로 변환됩니다.

기준 전압이 5V인 경우 분해능은 5V / 1024 = 4.88mV입니다.

변환에는 약 100μs가 소요됩니다.

int inputCod; // 입력 전압 코드
부동 입력전압; // 입력 전압(V)

inputCod= 아날로그읽기(A3); // 입력 A3에서 전압 읽기
inputVoltage= ((float)inputCod * 5. / 1024.); // 코드를 전압(V)으로 변환

무효 아날로그 참조(유형)

ADC의 기준 전압을 설정합니다. 이는 ADC가 올바르게 변환할 수 있는 최대 아날로그 입력 전압을 정의합니다. 기준 전압 값은 코드-전압 변환 계수도 결정합니다.

입력 전압 = ADC 코드 * 기준 전압 / 1024.

유형 인수는 다음 값을 사용할 수 있습니다.

  • DEFAULT – 기준 전압은 컨트롤러 공급 전압(5V 또는 3.3V)과 동일합니다. Arduino UNO R3 – 5V용.
  • 내부 – ATmega168 및 ATmega328 컨트롤러가 있는 보드의 경우 내부 기준 전압 1.1V, ATmega8 – 2.56V.
  • INTERNAL1V1 – Arduino Mega 컨트롤러용 내부 1.1V 기준 전압입니다.
  • INTERNAL2V56 – Arduino Mega 컨트롤러용 내부 2.56V 기준 전압입니다.
  • EXTERNAL – AREF 입력에 연결된 외부 기준 전압 소스.

아날로그참조(내부); // 기준 전압은 1.1V입니다.

Arduino의 2채널 전압계.

아날로그 입력 기능을 사용하는 예로 Arduino에서 간단한 디지털 전압계용 프로젝트를 만들어 보겠습니다. 장치는 보드의 두 아날로그 입력에서 전압을 측정하고 측정된 값을 직렬 포트를 통해 컴퓨터로 전송해야 합니다. 이 프로젝트를 예로 들어 간단한 측정 및 정보 수집 시스템을 만드는 원리를 보여 드리겠습니다.

전압계가 최소 0~20V 범위 내에서 전압을 측정해야 한다고 결정하고 전압계 입력을 Arduino UNO 보드에 연결하기 위한 회로를 개발해 보겠습니다.

기준 전압을 5V로 설정하면 보드의 아날로그 입력은 0~5V 내에서 전압을 측정합니다. 그리고 최소 0~20V가 필요합니다. 이는 전압 분배기를 사용해야 함을 의미합니다.

분배기의 입력 및 출력 전압은 다음 관계로 관련됩니다.

U출력 = (U입력 / (R1 + R2)) * R2

전송 비율:

K = U출력 / U입력 = R2 / (R1 + R2)

1/4(20V * 1/4 = 5V)의 전송 비율이 필요합니다.

최대 정확도(10비트)를 유지하려면 신호 소스의 내부 저항이 10kOhm을 초과하지 않아야 합니다. 따라서 우리는 4.22kOhm과 동일한 저항 R2를 선택합니다. 저항 R1의 저항을 계산합니다.

0.25 = 4.22 / (R1 + 4.22)
R1 = 4.22 / 0.25 – 4.22 = 12.66kΩ

가장 가까운 값으로 저항이 15kOhm인 저항을 찾았습니다. 저항 R1 = 15kOhm 및 R2 = 4.22 사용:

5 / (4.22 / (15 + 4.22)) = 22.77V.

Arduino 기반 전압계 회로는 다음과 같습니다.

두 개의 전압 분배기가 아날로그 입력 A0 및 A1에 연결됩니다. 커패시터 C1 및 C2는 분배 저항과 함께 신호에서 고주파수 잡음을 제거하는 저역 통과 필터를 형성합니다.

이 회로를 브레드보드에 조립했습니다.

전압계의 첫 번째 입력을 조정된 전원에 연결하고 두 번째 입력을 Arduino 보드의 3.3V 전원 공급 장치에 연결했습니다. 전압을 모니터링하기 위해 전압계를 첫 번째 입력에 연결했습니다. 이제 남은 것은 프로그램을 작성하는 것뿐입니다.

Arduino 보드를 사용하여 전압을 측정하는 프로그램입니다.

알고리즘은 간단합니다. 필요한:

  • ADC 코드를 초당 두 번씩 읽습니다.
  • 그것을 전압으로 변환하고;
  • 측정된 값을 직렬 포트를 통해 컴퓨터로 전송합니다.
  • Arduino IDE 포트 모니터 프로그램은 얻은 전압 값을 컴퓨터 화면에 표시합니다.

바로 프로그램의 전체 개요를 알려드리겠습니다.

// 전압 측정 프로그램
// 아날로그 입력 A0 및 A1

#포함하다

측정 기간 시간
#R1 15를 정의합니다. // 저항 R1의 저항
#R2 4.22 정의 // 저항 R2의 저항


플로트 u1, u2; // 측정된 전압

무효 설정() (
Serial.begin(9600); //

MsTimer2::start(); // 인터럽트 활성화
}

무효 루프() (

// 주기 500ms
if (timeCount >= MEASURE_PERIOD) (
시간카운트= 0;

//

// 채널 2 코드를 읽고 전압으로 변환
u2= ((float)analogRead(A1)) * 5. / 1024. / R2 * (R1 + R2);

// 직렬 포트를 통한 데이터 전송
Serial.print("U1 = "); Serial.print(u1, 2);
Serial.print(" U2 = "); Serial.println(u2, 2);
}
}

// 인터럽트 처리 1ms
무효 타이머인터럽트() (
시간카운트++;
}

ADC 코드가 전압으로 변환되는 라인을 설명하겠습니다.

// 채널 1 코드를 읽고 전압으로 변환
u1= ((float)analogRead(A0)) * 5. / 1024. / R2 * (R1 + R2);

  • ADC 코드는 다음과 같이 읽혀집니다: AnalogRead(A0) .
  • 명시적으로 부동 소수점 형식으로 변환됩니다: (float) .
  • 아날로그 입력에서 전압으로 변환됨: * 5. / 1024. 숫자 끝에 있는 점은 이것이 부동 소수점 숫자임을 나타냅니다.
  • 분배기 전송 계수는 / R2 * (R1 + R2)로 고려됩니다.

보드에 프로그램을 로드하고 직렬 포트 모니터를 실행해 보겠습니다.

두 개의 실행 막대는 측정된 전압 값을 표시합니다. 모든 것이 작동하고 있습니다.

평균 신호 값을 측정합니다.

전압계의 첫 번째 채널을 리플 수준이 높은 전압 소스에 연결해 보겠습니다. 모니터에서 이 사진을 볼 수 있습니다.

모니터 화면의 첫 번째 채널의 전압 값이 끊임없이 경련을 일으키고 점프합니다. 그리고 제어 전압계의 판독 값은 매우 안정적입니다. 이는 기준 전압계가 신호의 평균값을 측정하는 반면 Arduino 보드는 500ms마다 개별 샘플을 읽기 때문입니다. 당연히 ADC가 읽는 순간은 신호의 다른 지점에 해당합니다. 그리고 높은 수준의 맥동에서는 이러한 지점의 진폭이 다릅니다.

또한 신호가 별도의 희박한 샘플에서 판독되는 경우 임펄스 노이즈로 인해 측정에 심각한 오류가 발생할 수 있습니다.

해결책은 여러 번 자주 샘플을 채취하여 측정된 값의 평균을 내는 것입니다. 이를 위해:

  • 인터럽트 핸들러에서 ADC 코드를 읽고 이를 이전 샘플과 합산합니다.
  • 평균화 시간(평균화 샘플 수)을 계산합니다.
  • 지정된 샘플 수에 도달하면 ADC 코드의 총 값을 저장합니다.
  • 평균값을 얻으려면 ADC 코드의 합을 평균화 샘플 수로 나눕니다.

8학년 수학 교과서에 나온 문제입니다. 다음은 2채널 평균값 전압계 프로그램의 개요입니다.

// 고압 측정 프로그램
// 아날로그 입력 A0 및 A1

#포함하다

#MEASURE_PERIOD 500 정의 // 측정 기간 시간
#R1 15를 정의합니다. // 저항 R1의 저항
#R2 4.22 정의 // 저항 R2의 저항

int timeCount; // 시간 카운터
긴 sumU1, sumU2; // ADC 코드 합산을 위한 변수
긴 평균U1, 평균U2; // ADC 코드의 합(평균값 * 500)
부울 플래그준비; // 측정 데이터 준비 상태 표시기

무효 설정() (
Serial.begin(9600); // 포트 초기화, 속도 9600
MsTimer2::set(1, timeInterupt); // 타이머 인터럽트, 기간 1ms
MsTimer2::start(); // 인터럽트 활성화
}

무효 루프() (

if (flagReady == true) (
플래그준비=false;
// 전압으로 변환하여 컴퓨터로 전송
Serial.print("U1 = ");
Serial.print((float)avarageU1 / 500. * 5. / 1024. / R2 * (R1 + R2), 2);
Serial.print(" U2 = ");
Serial.println((float)avarageU2 / 500. * 5. / 1024. / R2 * (R1 + R2), 2);
}
}

// 인터럽트 처리 1ms
무효 타이머인터럽트() (

시간카운트++; // +1 평균 샘플 카운터
sumU1+= 아날로그읽기(A0); // ADC 코드 합산
sumU2+= 아날로그읽기(A1); // ADC 코드 합산

// 평균화 샘플 수 확인
if (timeCount >= MEASURE_PERIOD) (
시간카운트= 0;
평균U1= 합계U1; // 평균값 과부하
평균U2= 합계U2; // 평균값 과부하
합계U1= 0;
합계U2= 0;
플래그준비=참; // 신호 측정 결과가 준비되었습니다
}
}

ADC 코드를 전압으로 변환하는 공식에는 샘플 수인 /500이 추가되었습니다. 로드하고 포트 모니터를 실행합니다(Cntr+Shift+M).

이제는 상당한 수준의 맥동에도 불구하고 판독값이 1/100만큼 변경됩니다. 이는 전압이 안정되지 않았기 때문입니다.

샘플 수는 다음을 고려하여 선택해야 합니다.

  • 샘플 수에 따라 측정 시간이 결정됩니다.
  • 샘플 수가 많을수록 간섭이 작아집니다.

아날로그 신호의 주요 간섭 원인은 50Hz 네트워크입니다. 따라서 50Hz 네트워크의 반주기 시간인 10ms의 배수인 평균 시간을 선택하는 것이 좋습니다.

계산 최적화.

부동 소수점 계산은 단순히 8비트 마이크로 컨트롤러의 리소스를 소비합니다. 모든 부동 소수점 연산에는 가수 비정규화, 고정 소수점 연산, 가수 정규화, 순서 수정 등이 필요하며 32비트 숫자를 사용한 모든 연산도 필요합니다. 따라서 부동소수점 계산의 사용을 최소화하는 것이 필요합니다. 다음 강의에서 이 작업을 수행하는 방법을 설명하겠지만 최소한 계산을 최적화해 보겠습니다. 그 효과는 상당할 것입니다.

우리 프로그램에서 ADC 코드를 전압으로 변환하는 방법은 다음과 같습니다.

(부동)평균U1 / 500. * 5. / 1024. / R2 * (R1 + R2)

여기에는 모두 부동 소수점을 사용한 계산이 너무 많습니다. 그러나 대부분의 계산은 상수를 사용한 연산입니다. 라인의 일부:

/ 500. * 5. / 1024. / R2 * (R1 + R2)

(부동)평균U1 * 0.00004447756

스마트 컴파일러는 상수가 포함된 계산을 자체적으로 인식하고 컴파일 단계에서 계산합니다. Andruino의 컴파일러가 얼마나 똑똑한지에 대한 질문이 있습니다. 나는 그것을 확인하기로 결정했습니다.

나는 단편 프로그램을 썼다. 10,000번의 패스 주기를 수행한 다음 해당 10,000 주기의 실행 시간을 컴퓨터로 전송합니다. 저것들. 이를 통해 루프 본문에 배치된 작업의 실행 시간을 확인할 수 있습니다.

// 계산 최적화 확인

정수 x= 876;
플로트 y;
부호 없는 정수 개수;
서명되지 않은 긴 timeCurrent, timePrev;

무효 설정() (
Serial.begin(9600);
}

무효 루프() (
카운트++;
// y= (float)x / 500. * 5. / 1024. / 4.22 * (15. + 4.22);
// y= (부동 소수점)x * 0.00004447756 ;

if (개수 >= 10000) (
개수= 0;
timeCurrent= 밀리초();
Serial.println(timeCurrent - timePrev);
시간이전= 시간현재;
}
}

첫 번째 옵션에서는 루프의 부동 소수점 연산이 주석 처리되어 실행되지 않으면 프로그램이 34ms의 결과를 생성했습니다.

저것들. 10,000개의 빈 루프가 34ms 내에 완료됩니다.

그런 다음 다음 줄을 열었습니다.

y= (부동 소수점)x / 500. * 5. / 1024. / 4.22 * (15. + 4.22);

우리의 계산을 반복합니다. 922ms 동안 10,000회 패스 결과 또는

(922 – 34) / 10,000 = 88.8μs.

저것들. 이 부동 소수점 계산 라인을 완료하는 데 89μs가 걸립니다. 나는 더 있을 것이라고 생각했다.

이제 주석으로 이 줄을 닫고 미리 계산된 상수를 곱하여 다음 줄을 열었습니다.

y= (부동 소수점)x * 0.00004447756 ;

166ms 동안 10,000회 패스 결과 또는

(166 – 34) / 10,000 = 13.2μs.

놀라운 결과. 라인당 75.6μs를 절약했습니다. 거의 7배 빠르게 완료했습니다. 이러한 라인이 2개 있지만 프로그램에는 훨씬 더 많은 라인이 있을 수 있습니다.

결론 - 상수를 사용한 계산은 계산기에서 직접 수행해야 하며 프로그램에서 기성 계수로 사용해야 합니다. Arduino 컴파일러는 컴파일 단계에서 이를 계산하지 않습니다. 우리의 경우에는 다음과 같이 해야 합니다:

#define ADC_U_COEFF 0.00004447756 // ADC 코드를 전압으로 변환하는 계수

Serial.print((float)avarageU1 * ADC_U_COEFF, 2);

성능을 위한 최적의 옵션은 ADC 코드를 컴퓨터로 전송하고 모든 부동 소수점 계산과 함께 전송하는 것입니다. 이 경우 컴퓨터의 특수 프로그램이 데이터를 수신해야 합니다. Arduino IDE의 포트 모니터가 작동하지 않습니다.

필요에 따라 향후 수업에서 Arduino 프로그램을 최적화하는 다른 방법에 대해 이야기하겠습니다. 그러나 이 문제를 해결하지 않으면 8비트 마이크로 컨트롤러에서 복잡한 프로그램을 개발하는 것이 불가능합니다.

아날로그 신호 측정에 관한 또 다른 강의()가 사이트에 나타났습니다. 백그라운드에서 ADC의 작동을 검사합니다.

다음 강의에서는 내부 EEPROM을 사용하는 방법을 배우고 데이터 무결성 모니터링에 대해 이야기하겠습니다.

범주: . 북마크할 수 있습니다.

이 기사에서는 Arduino와 PC를 인터페이스하고 ADC에서 PC로 데이터를 전송하는 방법을 보여줍니다. Windows용 프로그램은 Visual C++ 2008 Express를 사용하여 작성되었습니다. 전압계 프로그램은 매우 간단하며 개선의 여지가 많습니다. 주요 목적은 COM 포트로 작업하고 컴퓨터와 Arduino 간에 데이터를 교환하는 방법을 보여주는 것이었습니다.

Arduino와 PC 간의 통신:

  • 컴퓨터가 Arduino 명령 0xAC 및 0x1y를 보낼 때 ADC에서 판독이 시작됩니다. ~에– ADC 채널 번호(0-2);
  • Arduino가 0xAC 및 0x00 명령을 받은 후 읽기가 중지됩니다.
  • 판독할 때 Arduino는 50ms마다 0xAB 0xaa 0xbb 명령을 컴퓨터에 보냅니다. 여기서 aa 및 bb는 최대 및 최소 측정 결과입니다.

Arduino용 프로그램

arduino.cc에서 직렬 통신에 대한 자세한 내용을 읽을 수 있습니다. 이 프로그램은 매우 간단합니다. 대부분의 프로그램은 병렬 포트를 사용하여 작업하는 데 사용됩니다. ADC에서 데이터 읽기를 마친 후 16비트 변수(INT) 형식으로 10비트 전압 값(0x0000 – 0x0400)을 받습니다. 직렬 포트(RS-232)를 사용하면 데이터를 8비트 패킷으로 전송할 수 있습니다. 16비트 변수를 8비트씩 2개 부분으로 나누어야 합니다.

Serial.print(전압>>8,BYTE);

Serial.print(전압%256,BYTE);

변수 8비트의 바이트를 오른쪽으로 이동한 다음 256으로 나누고 그 결과를 컴퓨터로 보냅니다.

Arduino 소프트웨어의 전체 소스 코드를 다운로드할 수 있습니다.

비주얼 C++

나는 당신이 이미 Windows용 C++ 프로그래밍에 대한 기본 지식을 가지고 있다고 가정합니다. 그렇지 않다면 Google을 사용하십시오. 인터넷에는 초보자를 위한 튜토리얼이 가득합니다.

가장 먼저 해야 할 일은 도구 모음의 직렬 포트를 하단 폼에 추가하는 것입니다. 이를 통해 직렬 포트의 일부 중요한 매개변수(포트 이름, 전송 속도, 비트 깊이)를 변경할 수 있습니다. 이는 프로그램을 다시 컴파일하지 않고도 언제든지 이러한 설정을 변경하여 응용 프로그램 창에 컨트롤을 추가하는 데 유용합니다. 포트 선택 옵션만 사용했습니다.

사용 가능한 직렬 포트를 검색한 후 기본적으로 첫 번째 포트가 선택됩니다. 수행 방법:

정렬< String ^>^ serialPorts = nullptr;

serialPorts = serialPort1->GetPortNames();

this->comboBox1->항목->AddRange(serialPorts);

this->comboBox1->SelectedIndex=0;

PC의 직렬 포트는 한 번에 하나의 애플리케이션에서만 사용할 수 있으므로 사용하기 전에 포트를 열어두어야 하며 닫아서는 안 됩니다. 이를 위한 간단한 명령:

serialPort1->열기();

serialPort1->닫기();

직렬 포트에서 데이터를 올바르게 읽으려면 이벤트(여기서는 인터럽트)를 사용해야 합니다. 이벤트 유형 선택:

"DataReceived"를 두 번 클릭하면 드롭다운 목록이 표시됩니다.

이벤트 코드는 자동으로 생성됩니다.

직렬 포트에 도착한 첫 번째 바이트가 0xAB인 경우 이는 나머지 바이트가 전압 데이터를 전달한다는 의미입니다.

비공개: System::Void serialPort1_DataReceived(System::Object^ 보낸 사람, System::IO::Ports::SerialDataReceivedEventArgs^ e) (

부호 없는 char 데이터0, 데이터1;

if (serialPort1->ReadByte()==0xAB) (

data0=serialPort1->ReadByte();

data1=serialPort1->ReadByte();

전압=수학::Round((float(data0*256+data1)/1024*5.00),2);

data_count++;

serialPort1->ReadByte();

직렬 포트 데이터 쓰기 및 읽기

나에게 작은 문제는 직렬 포트를 통해 Hex RAW 데이터를 보내는 것이었습니다. Write() 명령이 사용되었습니다. 그러나 배열, 시작 바이트 번호, 쓸 바이트 수의 세 가지 인수가 있습니다.

비공개: System::Void 버튼2_Click_1(System::Object^ 보낸 사람, System::EventArgs^ e) (

서명되지 않은 문자 채널=0;

채널=this->listBox1->SelectedIndex;

배열^시작 =(0xAC,(0x10+채널));

배열^정지 =(0xAC,0x00);

serialPort1->쓰기(시작,0,2);

this->button2->Text="중지";

) 또 다른 (

serialPort1->쓰기(중지,0,2);

this->button2->Text="시작";

그게 다야!

영어 원본 기사(번역: 알렉산더 카샤노프 cxem.net 사이트의 경우)

다기능 Arduino 어셈블리는 흥미로운 아이디어를 실현할 수 있도록 해주는 전자 프로그래밍 가능 장치 팬의 큰 관심을 끌고 있습니다.

기성 Arduino 회로의 가장 큰 장점은 고유한 블록 모듈식 원리입니다. 각 보드에 추가 인터페이스를 추가하여 다양한 프로젝트를 만들 수 있는 가능성을 끝없이 확장할 수 있습니다.

아두이노 모듈자체 부트로더가 있는 범용 마이크로 컨트롤러를 기반으로 구축되어 추가 장치를 사용하지 않고도 필요한 프로그램 코드로 쉽게 플래시할 수 있습니다. 프로그래밍은 표준 C++ 언어로 수행됩니다.

Arduino를 사용하는 가장 간단한 예 중 하나는 이 어셈블리를 기반으로 측정 범위가 0~30V인 고정밀 DC 전압계를 구현하는 것입니다.

Arduino 아날로그 입력은 5V 이하의 정전압을 위해 설계되었으므로 전압 분배기를 사용하여 이 값을 초과하는 전압에서 사용할 수 있습니다.


전압 분배기를 통한 Areduino의 연결 다이어그램

전압 분배기는 직렬로 연결된 두 개의 저항으로 구성됩니다. 다음 공식을 사용하여 계산됩니다.

자동차 라디오의 외부 USB 커넥터

안녕, 하브르! 오늘 저는 Arduino와 Android를 "교차"하는 주제를 계속하고 싶습니다. 이전 간행물에서 제가 이야기한 것과 오늘은 DIY 블루투스 전압계에 대해 이야기하겠습니다. 이러한 또 다른 장치는 스마트 전압계, "스마트" 전압계 또는 따옴표 없이 스마트 전압계라고 부를 수 있습니다. 성은 러시아어 문법상 올바르지 않지만 언론에서 자주 발견됩니다. 기사 마지막 부분에서 이 주제에 대한 투표가 있을 예정이지만, 기사의 내용을 이해하기 위해 장치 작동 시연부터 시작하는 것이 좋습니다.


면책 조항: 이 기사는 일반적으로 Android 프로그래밍에 익숙하지 않은 일반 Arduino 매니아를 대상으로 하므로 이전 기사에서와 같이 Android 애플리케이션용 App Inventor 2 시각적 개발 환경을 사용하여 스마트폰용 애플리케이션을 만들 것입니다.
DIY 블루투스 전압계를 만들려면 상대적으로 독립적인 두 가지 프로그램, 즉 Arduino용 스케치와 Android용 애플리케이션을 작성해야 합니다. 스케치부터 시작하겠습니다.
먼저 정보를 출력해야 하는 위치(com 포트, Arduino에 연결된 화면 또는 스마트폰)에 관계없이 Arduino를 사용하여 전압을 측정하는 세 가지 주요 옵션이 있다는 것을 알아야 합니다.
첫 번째 경우: 최대 5V의 전압 측정. 여기서는 한두 줄의 코드로 충분하며 전압은 핀 A0에 직접 적용됩니다.
int value = AnalogRead(0); // A0에서 판독값을 읽습니다.
전압 = (값 / 1023.0) * 5; // Vcc = 5.0V인 경우에만 참
두 번째 경우: 5V보다 큰 전압을 측정하려면 전압 분배기가 사용됩니다. 회로는 매우 간단하며 코드도 마찬가지입니다.

스케치

int 아날로그 입력 = A0;
부동 소수점 값 = 0.0;
부동 전압 = 0.0;
부동 R1 = 100000.0; //배터리 Vin-> 100K -> A0
부동 R2 = 10000.0; //배터리 Gnd -> Arduino Gnd 및 Arduino Gnd -> 10K -> A0
int 값 = 0;

무효 설정() (
Serial.begin(9600);
pinMode(analogInput, INPUT);
}

무효 루프() (
값 = 아날로그읽기(analogInput);
값 = (값 * 4.7) / 1024.0;
전압 = val / (R2/(R1+R2));
Serial.println(전압);
지연(500);
}


아두이노 우노
블루투스 모듈
세 번째 사례. 전압에 대한 보다 정확한 정보를 얻으려면 배터리로 전원을 공급할 때 약간 달라질 수 있는 공급 전압이 아닌 1.1V의 내부 Arduino 안정기 전압을 기준 전압으로 사용해야 합니다. 회로는 여기와 동일하지만 코드가 조금 더 깁니다. 이 옵션은 주제별 기사에 이미 잘 설명되어 있으므로 자세히 분석하지 않겠습니다. 그러나 노트북의 USB 포트에서 전원 공급 장치가 안정적이므로 두 번째 방법으로 충분합니다.
이제 전압 측정을 정리했습니다. 이제 프로젝트의 후반부인 Android 애플리케이션 만들기로 넘어가겠습니다. Android 애플리케이션 App Inventor 2의 시각적 개발 환경에서 브라우저에서 직접 애플리케이션을 생성하겠습니다. 웹사이트 appinventor.mit.edu/explore로 이동하여 Google 계정으로 로그인한 후 생성, 새 프로젝트 버튼을 클릭한 다음 요소를 드래그 앤 드롭하기만 하면 다음과 같은 디자인이 만들어집니다.

저는 그래픽을 매우 간단하게 만들었습니다. 누군가가 더 흥미로운 그래픽을 원한다면 .jpeg 파일 대신 투명한 배경의 .png 파일을 사용해야 한다는 점을 상기시켜 드리겠습니다.
이제 블록 탭으로 이동하여 다음과 같은 애플리케이션 로직을 생성합니다.


모든 것이 제대로 작동하면 빌드 버튼을 클릭하고 .apk를 내 컴퓨터에 저장한 다음 스마트폰에 애플리케이션을 다운로드하여 설치할 수 있습니다. 단, 애플리케이션을 업로드하는 다른 방법도 있습니다. 여기는 누구에게나 더 편리합니다. 그 결과 다음과 같은 신청서를 작성하게 되었습니다.


프로젝트에서 Android 애플리케이션용 App Inventor 2 시각적 개발 환경을 사용하는 사람은 거의 없기 때문에 작업에 대해 많은 질문이 발생할 수 있다는 것을 알고 있습니다. 이러한 질문 중 일부를 해결하기 위해 이러한 응용 프로그램을 "처음부터" 만드는 방법에 대한 자세한 비디오를 만들었습니다(보려면 YouTube로 이동해야 함).

추신 초보자와 전문가를 위한 100개 이상의 Arduino 교육 자료 모음
공유하다