반응형

안녕하세요. 오늘은 PWM에 대해 알아보도록 하겠습니다.

 

아두이노의 핀에는 I/O(input/output)핀의 종류 3가지가 있습니다.

 

1. Analog Input 

 

2. Digital Input 

 

3. Digital Output

 

하나 부족해보이지 않나요?

 

바로 Analog Output입니다.  

 

아두이노에는 Analog Output이 없습니다. 

 

아날로그 와 디지털의 차이부터 먼저 볼까요?

 

 

아날로그, 디지털

 

 

(a)아날로그

 

아날로그는 연속적으로 변화하는 숫자, 물리량을 의미합니다. 소리, 진동 등의 자연현상

 

(b) 디지털

 

0, 1로 이루어진 규칙적인 숫자, 컴퓨터와 소통하기 위해 

 

(어떻게 0, 1로 컴퓨터가 만들어졌는지는 나중에 글을 쓰도록 하겠습니다!)

 

 

자. 그럼 이제 생각해봅시다. 

 

아날로그 출력 : 연속적으로 변화하는 숫자를 출력한다.

 

그렇다면 우리는 연속적으로 변화하는 숫자를 출력할 수 없는 것일까요?

 

예를 들어 연속적인 가변저항의 값을 변화시켜 LED의 밝기를 제어할 수는 없을까요?

 

당연히 있습니다. 아날로그 출력을 설명하기 전에 아날로그 입력의 원리부터 알아보도록 합시다.

 

 

ADC(Analog-Digital-Converter) : 아날로그 신호를 디지털 신호로 변환

 

아두이노에 아날로그 입력은

 

아두이노 안에는  ADC가 아날로그 신호(0 ~ 5V)를 10bit로 데이터 신호를 샘플링(양자화)하여 부호화!!

 

 

쉽게 말해 아두이노는 보통 0 ~ 5V의 전압을 입력받을 수 있습니다.

 

아두이노의 10bit로 0 ~ 5V를 나눕니다.

 

10bit로 나눈다는 말은 10bit는 2^10(2의 10제곱)으로 0 ~ 1023의 값이 존재하며 

 

0 ~ 5V를 1024개로 나눈다는 뜻입니다. 

 

예를 들면 0V일 때는 02.5V512!,    5V1024의 값을 가집니다.

 

이렇게 디지털로 샘플링 된 아날로그 신호를 PWM을 통해 아날로그 신호를 제어할 수 있습니다.

 

 

PWM!  :  펄스의 폭을 변조 !

 

그림으로 설명하겠습니다. 아주 간단합니다.

 

 

약 25%의 duty cycle

Pulse는 파란 색으로 튀어나온 부분이고

Width는 빨간 색 선입니다. 

 

PWMDuty Cycle(신호가 시스템이 살아있는 특정 기간의 백분율)의 원리를 사용합니다. 

 

쉽게 예를 들면

 

1Cycle에 Pulse Width(펄스의 가로 길이)가 약 25%라고 한다면

아두이노의 5V25%1.25V만큼 전압을 출력합니다. 만약 비트로 연산한다면 255가 됩니다.

 

1Cycle에 Pulse Width(펄스의 가로 길이)가 약 50%라고 한다면

아두이노의 5V50%2.5V만큼 전압을 출력합니다. 만약 비트로 연산한다면 511가 됩니다.

 

1Cycle에 Pulse Width(펄스의 가로 길이)가 약 100%라고 한다면

아두이노의 5V100%5V만큼 전압을 출력합니다. 만약 비트로 연산한다면 1023가 됩니다.

 

PWM의 출력(디지털)은 마치 아날로그처럼 사용할수 있어 하나의 DAC로 볼 수 있습니다.

(엄연히 말하면 DAC는 아닙니다. 결국 디지털 신호로 제어하기 때문입니다.)

 

DAC(Digta-Analog-Converter) : 디지털 신호를 아날로그 신호로 변환

 

그림으로 표현하면 이렇게 ADC와 DAC는 짝꿍입니다.

 

다음 시간에는 어떻게 PWM을 이용해서 아날로그 신호, 연속적인 숫자를 제어할 수 있는지 아두이노 코딩을 이용해서 글을 쓰겠습니다.

728x90
반응형
반응형

안녕하세요! 아두이노, 안드로이드 블루투스 실습 두번 째 시간입니다. 

 

오늘은 안드로이드 스튜디오로 센서 값을 받아오는 어플을 만들어 보도록 하겠습니다.

 

아마 많은 분들께서 Code-jun님의 블루투스 예제를 보셨을거라고 생각합니다. 

 

실제로도 라이브러리가 상당히 잘 만들어져 있어 사용하는데 어려움이 없다고 생각합니다.

 

저는 이번에 Code-jun님이 올리신 라이브러리 예제를 통해 블루투스 무선통신을 하도록 하겠습니다. 

 

https://blog.codejun.space/13

 

아두이노, 안드로이드 블루투스 통신하기

아두이노로 미세먼지 측정기를 만들던 도중 안드로이드와 연동하여 데이터를 주고 받고 싶어 제작하던 중 유용한 정보가 될 것 같아 포스팅 합니다. 이번 개발환경은 DESKTOP과 TEST DEVICE를 동시에 사용합니다...

blog.codejun.space

 

위 사이트 방법대로 라이브러리를 추가한 후 이제 제 방식대로 코딩을 해보도록 하겠습니다. 

 

 

 

1. 디자인

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<TextView
android:layout_width="wrap_content"
android:layout_height="50dp"
android:textSize ="40sp"
android:layout_gravity = "center"
android:text="온습도센서('C, %)" />

<Button
android:id="@+id/btnConnect"
android:layout_gravity = "center"
android:layout_width="300dp"
android:layout_height="50dp"
android:text="연결"

/>

<TextView
android:id="@+id/temp"
android:layout_width="match_parent"
android:layout_height="80dp"
android:textSize ="50sp"
android:gravity="center_horizontal"
android:hint="온도" />

<TextView
android:id="@+id/humd"
android:layout_width="match_parent"
android:layout_height="80dp"
android:textSize="50sp"
android:gravity="center_horizontal"
android:hint="습도" />

</LinearLayout>

 

굉장히 간단한 어플 레이아웃

 

디자인에 신경쓰시는 분들께서는 자신의 입맛대로 고쳐 쓰시면 됩니다.

그리고 사용하시기 전에 주의할 점이 있습니다. 제가 굵게 표시한 android.hint 부분은 블루투스에서 값이 전달되기

시작하면 textview 부분이 바껴야 하기 때문에 android.text로 하시면 안됩니다.

값이 올바르게 가더라도 값이 변하지 않습니다. 

 

 

 

2. 데이터 수신

 

bt.setOnDataReceivedListener(new BluetoothSPP.OnDataReceivedListener() { //데이터 수신
       public void onDataReceived(byte[] data, String message) {
                 Toast.makeText(MainActivity.this, message, Toast.LENGTH_SHORT).show();
                  }
});

출처: https://blog.codejun.space/13 [CodeJUN]

라이브러리 출처 : https://github.com/akexorcist/Android-BluetoothSPPLibrary

 

위 함수는 데이터를 수신받고 있습니다. 그렇다면 어떻게 해야할까요?

방법은 두 가지입니다. 아두이노에서 문자로 보내는 방법, 바이트로 보내는 방법. 두가지 입니다.

우리는 바이트로 계산을 해서 값을 보내는 것은 어려우니 저희는 문자로 보내도록 하겠습니다.

 

 하지만 생각해 봐야할 문제가 있습니다.

우리가 아두이노에서 안드로이드로 보낼 값은 온도, 습도 두 가지인데 어떻게 해야하나.

 

정답은 한 번에 문자열로 보낸 후, 수신부에서 쪼개면 됩니다. 

 

 

 

bt.setOnDataReceivedListener(new BluetoothSPP.OnDataReceivedListener() {
       TextView temp = findViewById(R.id.temp);
       TextView humd = findViewById(R.id.humd);


       public void onDataReceived(byte[] data, String message) {


                 String[] array = message.split(",");

                 temp.setText(array[0].concat("C"));
                 humd.setText(array[1].concat("%") );

                 }
});

 

그리고 문자열의 끝은 개행문자로 끝이 납니다. (중요 중요)

개행문자?? new line(띄어쓰기)을 말합니다.

 

 

그럼 아두이노 송신 스케치를 다시 한번 보도록 하겠습니다.

 

아두이노 온습도 송신

자! 다시 보니 이해가 가시나요?

아두이노에서는 블루투스로

[temp(value), humd(value) /n] 이러한 형태의 문자열로 1초에 한 번씩 블루투스에게 값을 보내줍니다. 

 

 

어? 만약 안드로이드 스튜디오에서 String으로 값을 받았네?

나는 숫자로 받아서 안드로이드 스튜디오에서 계산해서 값을 집어넣고 싶은데?

 

방법 : 안드로이드 스튜디오 : String에서 double형태로 바꾸기

 

double dTemp = Double.parseDouble(array[0]);

double dHumd = Double.parseDouble(array[1]);

 

간단하죠?

여러분들도 온습도 센서말고도 원하는 센서를 달아 보시면 상당히 재미있습니다.

저 같은 경우는 

 
     음속 = (331.5 + (0.6*celsius)) m/s 
      왕복거리 = 음속 * 시간

거리 = (음속 * 시간)/2

 

공식을 사용하여 온도에 따른 좀 더 정확한 초음파 센서를 만들어 보았습니다.

 

이것으로 블루투스 모듈에 관한 두 번째 글을 마치도록 하겠습니다.

 

Copyright (c) 2014 Akexorcist

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

728x90
반응형
반응형

안녕하세요. 아두이노에 관해 3번 째 글입니다. 

이번에는 블루투스와 아두이노를 연결해서 센서값을 읽어 활용하는 예제입니다.

 

저는 HT21UD 온습도 센서를 사용해 온도('C), 습도(%)를 아두아노에서 읽어와 

블루투스를 통해 안드로이드에 보내볼 생각입니다.

 

 

 

 

 

자 우선, HT21UD에 대해 설명해보자면, 위에 말처럼 온도와 습도를 읽어오는 센서입니다. 

 

1. HT21UD

HT21UD 온습도 센서

저는 HT21UD의 라이브러리의 예제를 약간 제 식대로 바꾸도록 하겠습니다.

라이브러리는 아래에 남겨 두도록 하겠습니다.

https://github.com/sparkfun/SparkFun_HTU21D_Breakout_Arduino_Library/

 

sparkfun/SparkFun_HTU21D_Breakout_Arduino_Library

HTU21D Breakout Arduino Library. Contribute to sparkfun/SparkFun_HTU21D_Breakout_Arduino_Library development by creating an account on GitHub.

github.com

 

#include <Wire.h>

#include "HTU21D.h"

 

 

HTU21D myHumidity;

 

void setup()

{

  Serial.begin(9600);

  myHumidity.begin();

}

 

void loop()

{

  double humd = myHumidity.readHumidity();    //습도

  double temp = myHumidity.readTemperature();    //온도

 

  Serial.print(temp);

  Serial.print("C");

  Serial.print(humd);

  Serial.println("%");

}

 

온습도의 예제는 블루투스와 통신하기 위해 잠시 되는지 안되는지 점검을 하기 위해 간략화한 스케치입니다. 

되는 것이 확인되었다면 이제 바로 블루투스로 아두이노와 안드로이드를 통신해보도록 하겠습니다.

 

 

1. HC-06 블루투스 모듈

 

HC-06 블루투스 모듈

저 같은 경우는 눈에 보이는 것을 좋아해서

바로 HT21UD의 값을 블루투스로 전송하도록 하겠습니다. 

 

 

#include <Wire.h>

#include "HTU21D.h"

#include <SoftwareSerial.h>

 

#define BT_RXD 8

#define BT_TXD 7

SoftwareSerial bluetooth(BT_RXD, BT_TXD;

 

HTU21D myHumidity;

 

unsigned long time_previous, time_current;

 

void setup()

{

  Serial.begin(9600);

  myHumidity.begin();

  BT.begin(9600);

  time_previous = millis();

}

 

void loop()

{

  time_current = millis()

  double humd = myHumidity.readHumidity();    //습도

  double temp = myHumidity.readTemperature();    //온도

 

  if(time_current - time_previous >= 1000){

     BT.print(temp);

     BT.print(",");

     BT.print(humd);

     BT.print(",");

     BT.println();

     }

}



1초에 한 번씩 온도와 습도를 안드로이드에 보내는 예제입니다!

 

지금 이 스케치로는 어떻게 안드로이드와 아두이노가 블루투스로 연결되어서 센서값을 전달하는지 알 수 없습니다.

다음 글은 이제 안드로이드 스튜디오를 이용해 온습도 센서값을 받는 어플을 만들고 나서 위 예제와 함께 설명하면 바로 이해가 가실겁니다!!

 

 

728x90
반응형

+ Recent posts