반응형

아두이노 블루투스 모듈 중 가장 유명한 것은 HC-05, HC-06이다.

이번 블루투스 프로젝트를 진행하면서 많은 사람들이 놓치고 가는 것을 짚고 가려 한다.

이 글은 HC-05, HC-06 모듈이 있다는 가정하에 진행된다.

 

HC-05, HC-06

수중에 가지고 있는 블루투스 모듈인 HC-05이다.

HC-05, HC-06과 같은 블루투스 모듈은 사전에 프로그래밍 된 AT 명령어를 통해 쉽게 제어할 수 있어 많은 인기가 있다.

블루투스 모듈에는 이미 기능이 구현돼있으며, 우리는 AT 명령어만 사용하면 되니 굉장히 간편하다. 만약 블루투스 모듈을 구매하기 전이라면, UART to USB 도같이 구매하는 것을 추천하고 싶다.

이유는 나중에 아두이노 구조에 대해 설명할 때 작성하겠다.

 

선 연결

HC-05를 설정하기 위해 HC-05와 UART to USB를 연결해야 한다.

UART to USB는 HC-05, HC-06 와 컴퓨터 연결을 도와주는 역할을 한다. 만약 UART to USB를 구매하지 않았다면, 아두이노로 대체 가능하다.

UART to USB와 HC-05, HC-06의 선 연결은 그림과 같다. TX와 RX는 서로 교차하는 것이 맞다.

GND - GND

VCC(5V) - VCC(5V)

TX - RX

RX -TX

UART to USB와 HC-05, HC-06을 올바르게 연결했다면, UART to USB를 컴퓨터에 연결한다.

올바르게 연결됐으면, [장치 관리자]에서 확인할 수 있다.

 

Teraterm

터미널 프로그램인 teraterm은 인터넷에서 쉽게 다운로드 받을 수 있다. 아두이노 serial monitor을 사용해도 되는데 굉장히 답답하다.

1. Teraterm을 실행하면 아래와 터미널 창이 열린다. 시리얼 포트는 우리가 연결한 UART to USB를 선택한다.

2. [설정] - [시리얼 포트]를 클릭한다.

 

3. [시리얼 포트]를 클릭하여 HC-05, HC-06 모듈에 맞게 설정한다. 만약 처음 구매 시 사용하는 것이라면 기본적으로 아래와 같을 것이다. 만약 제대로 동작하지 않는다면 속도를 115200으로 다시 설정해 볼 것.

속도 (Baudrate) - 9600 or 115200

데이터 비트 - 8bit

패리티 비트 - none

스톱 비트 - 1bit

4. 이제 터미널을 설정해야 한다. [설정] - [터미널]을 클릭한다.

5. [줄바꿈]에서 수신(R)과 송신(M)을 CR에서 CR+LF로 변경한다. 왜 이렇게 변경해야 하는지는 나중에 포스팅하겠다. 우선 정의만 알고 넘어간다.

(CR : Carriage Return (\r) LF : Line Feed (\n). 해당 용어(CR, LF)와 이 용어들의 조합(CRLF)은 새로운 줄 (New line)으로 바꾸는 방식)

 

AT command 테스트

AT command를 사용하는 모듈 같은 경우, 처음 테스트를 위해 "AT"를 입력하여 "OK"를 확인다. 올바르게 UART to USB와 HC-05, HC-06 모듈이 연결됐다면, 터미널에 OK라고 출력된다. 만약 아무 값도 출력되지 않는다면, 위 과정을 천천히 다시 해본다.

 

그럼에도 아무 반응이 나오지 않는다면 추측건대 HC-05, HC-06의 UART 설정값을 올바르게 설정하지 않은 것이다. 나 같은 경우에도 예전에 사용했던 HC-05를 다시 사용하는 것이므로 설정값을 잊어 먹을 수 있으므로 모듈 뒤편에 설정값을 따로 적어 놓았다. 설정값을 따로 알 수 있는 방법이 없으므로, 결국 때려 맞추는 수밖에 없다.

 

HC-05 AT command 설정
1. 버전 확인
AT+VERSION  //  VERSION:3.0-20170609   OK

2. 블루투스 이름 "Test"로 변경
AT+NAME=Test  //  OK

3. 블루투스 이름 확인
AT+NAME?      // +NAME:Test   OK

4. 블루투스 연결을 위한 비밀번호 변경, 초기 비밀번호 : 1234
AT+PSWD=9999  // OK

5. 블루투스 비밀번호 확인
AT+PSWD?     // +PIN:"9999"

6. UART 설정 확인  
AT+ UART?    // +UART:115200,0,0

Baudrate는 115200으로 올렸지만, 스탑비트나 패리티 비트는 따로 설정하지 않았다.

더 다양한 AT명령어를 확인하기 위해 아래의 HC-05, HC-06 데이터시트를 확인하면 된다. 혹시 몰라 나는 HC-05 모듈을 사용하기 때문에 위 명령어를 사용했지만, HC-06 AT 명령어는 HC-05 명령어와 살짝 다르므로 HC-06 데이터시트를 따로 참고해야 한다.

HC-06 Datasheet.pdf
0.74MB
HC-05 Datasheet (4).pdf
0.82MB

728x90
반응형
반응형

https://blog.arduino.cc/2021/03/01/announcing-the-arduino-ide-2-0-beta/

 

Announcing the Arduino IDE 2.0 (beta) | Arduino Blog

The Arduino IDE is the well-known software we all use to program our boards. Its development started in 2005 based on the graphical interface of the Processing project and has never stopped since. During these years, countless hours of development by the A

blog.arduino.cc

 

아두이노 IDE를 사용하면서 자동완성, 디버깅하는 것이 굉장히 불편합니다. 많은 사람들이 Visual studio, Platform IO 등을 이용했습니다. 

 

2021년에 3월 후, Arduino IDE 2.0 베타를 다운로드할 수 있으며 해당 코드 리포지토리가 오픈 소스가 배포됐습니다.

 

우선 가장 마음에 드는 것은 인터페이스가 매우 친숙하다는 것입니다.  인터페이스는 기존 Arduino IDE를 유지하고 필요한 기능을 추가한 듯 합니다.

 

https://github.com/arduino/arduino-ide

 

GitHub - arduino/arduino-ide: Arduino IDE

Arduino IDE. Contribute to arduino/arduino-ide development by creating an account on GitHub.

github.com

Arduino IDE 2.0 설치

위 github 주소를 통해 자신의 OS에 맞춰 설치합니다. 

 

 

첫 번째, 추가된 기능으로 입력하는 동안 편집기는 포함된 라이브러리에 따라 변수 및 함수의 자동 완성을 제공합니다. 하지만, 아직 베타버전이라 생각보다 버그가 많아 제대로 되지 않을 때가 많습니다.

자동완성

두번 째, 제가 가장 마음에 들어하는 기능입니다. 변수나 함수를 마우스 오른쪽 버튼으로 클릭하면 상황에 맞는 메뉴에서 선언된 줄(및 파일)로 이동할 수 있는 탐색 바로 가기를 제공합니다. 아두이노 특성상 라이브러리를 분석할 때, github에서 찾아보곤 했는데, 변수 및 함수를 추적할 때 우클릭으로 쉽게 이용할 수 있습니다. 

이 또한,  가끔 어떠한 이유로 탐색기가 제대로 동작하지 않을 때가 있습니다. 

탐색기

세번 째, 보드에서 코드를 대화식으로 실행하고 실행을 검사할 수 있는 라이브 디버거입니다. 디버그 패널을 실행하고 실행을 일시 중지하고 변수의 내용을 검사할 중단점을 설정하기만 하면 됩니다. 즉석에서 변수의 내용을 변경하고 실행을 재개할 수도 있습니다.

라이브 디버거

네 번째, 현재 디버거는 SAMD 플랫폼(MKR 제품군, Nano 33 IoT, Zero)의 모든 Arduino 보드를 지원합니다. mbed 플랫폼(Nano 33 BLE, Portenta, Nano RP2040 Connect)에 대한 지원이 구현되고 있지만 시간이 걸릴 수 있습니다. 타사 보드용 Arduino 코어 유지 관리자는 관련 구성 매개변수를 추가하여 디버깅 지원을 추가할 수 있습니다. 이에 대한 기술 가이드가 제공됩니다. Segger J-link와 같은 디버깅 프로브를 보드의 SWD 핀에 연결해야 사용할 수 있습니다.

 

큰 특징으로 자동완성, 탐색기, 라이브 디버거, 타사 보드 지원이 있습니다. 

 

처음 설치 후, 사용해보면 인터페이스는 크게 바뀌지 않았기 때문에 쓰는데 큰 지장은 없습니다. 하지만 팁을 하나 드리자면, 시리얼 모니터를 사용할 때 입니다. 

시리얼 모니터에 값을 입력할 때, 엔터가 아니라 Ctrl + 엔터 키입니다. 저는 제대로 읽어보지 않고 엔터키만 갈겼는데 여러분들은 조심하시길 바랍니다. 

 

베타 버전이므로, 아직 잔 버그가 많습니다. 그 부분을 유의하고 사용하시면 문제 없습니다. 

728x90
반응형
반응형

안녕하세요. 

 

프로젝트를 위해 라즈베리파이를 게이트웨이로 써야 하므로, GUI 없는 RaspberryPi OS LITE를 이용하기 시작했습니다.

 

SSH는 원격 호스트 컴퓨터로 접속하기 위해 정의된 인터넷 프로토콜로 포트 번호는 22번을 사용합니다.

 

1. SD Card에 OS Image Flash 

    - Requirement

  • Raspberry Pi OS ( Raspberry Pi OS Lite )
  • belena etcher ( Flash OS images to SD cards & USB drives )

https://www.raspberrypi.org/software/operating-systems/#raspberry-pi-os-32-bit

 

Operating system images – Raspberry Pi

The Raspberry Pi is a tiny and affordable computer that you can use to learn programming through fun, practical projects. Join the global Raspberry Pi community.

www.raspberrypi.org

 

2. Flash Success 성공 시

  • SSH enable -> ssh (확장자명 없이 빈 파일 생성)
  • WiFi 연결 -> wpa_supplicant.conf (파일 생성)
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
network={
    ssid="wifi-Name"
    psk="wifi-PW"
    key_mgmt=WPA-PSK
}

참고로 5GHz 대신 2.4GHz를 쓰는걸 지향함.

 

3. Raspberry Pi에 SD카드 넣고 전원을 인가 시

위 과정을 제대로 했다면, 라즈베리파이가 WiFi에 연결이 되었을 것.

 

공유기 관리자 모드에 들어가 현재 라즈베리파이가 Local IP가 어떻게 되는지 확인한다. ex) 192.168.x.x

 

Local IP를 확인하였다면, 포트포워딩을 한다. 자세한 설명은 아래 링크를 걸어둠. 주피터 노트북 서버 관련된 내용이지만, 포트포워딩에 대해 최대한 쉽게 설명해둠.

https://coding-yoon.tistory.com/152

 

주피터 노트북 개인 딥러닝 서버 만들기 ! (1) with Window10, Pytorch

이번에 컴퓨터를 맞추면서 그래픽카드 RTX 2060 super를 구매했습니다. 저만의 딥러닝 서버를 만들어 놓으면 어디서든 야외에서 노트북으로 가볍게 작업할 수 있습니다. ( 얼마나 작업을 할지 모르

coding-yoon.tistory.com

위를 제대로 했다면, putty나 teraterm을 이용해 접속한다. (teraterm을 추천, 이유는 다음 글에)

pi@raspberrypi:~ $ 명령어 입력

 pi : ID

 raspberrypi : Hostname

1. 라즈베리파이 첫 부팅 시, ID와 PW는 각각 pi, raspberry 
2. 라즈베리파이 첫 부팅 시, Hostname은 raspberrypi
3. SSH 기본 포트 번호는 22번

 

--------------- 선택사항 ---------------

4. SSH 포트 번호 변경

pi@raspberrypi:~ $ sudo apt-get update
pi@raspberrypi:~ $ sudo apt-get upgrade
pi@raspberrypi:~ $ sudo apt-get install vim

pi@raspberrypi:~ $ sudo vim /etc/ssh/sshd_config

vim을 설치해도 되고, 혹은 nano로 해도 된다. 하지만 vim이 편하기 때문에 vim을 설치. 

 

https://coding-yoon.tistory.com/99?category=898799 

 

Vim 사용법

Vim 사용법 [저장 & 끄기] esc - :w : 저장 esc - :q : 끄기 esc - :wq : 저장하고 끄기 [입력모드] i [붙여넣기] esc - p : 붙여 넣기 ctrl + shift + v  : 외부에서 붙여넣기 [되..

coding-yoon.tistory.com

#Port 22 주석을 풀고 Port {원하는 숫자} 

# This sshd was compiled with PATH=/usr/bin:/bin:/usr/sbin:/sbin

# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented.  Uncommented options override the
# default value.

#Port 22
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::

#HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_ecdsa_key

 

5. SSH로 root 계정으로 접속

현재 상태로는 SSH에서 Access Denied로 root 계정 접근 불가

$sudo vim /etc/ssh/sshd_config

####### sshd_config #######
# PermitRootLogin yes 추가

# Authentication: 

#LoginGraceTime 2m 
#PermitRootLogin prohibit-password 
PermitRootLogin yes 
#StrictModes yes 
#MaxAuthTries 6 
#MaxSessions 10
//root 계정 활성화
$sudo passwd root

//재시작
$sudo reboot

// 루트 계정 접속
// ID : root
// PW : 설정한 비밀번호

 

6.  ID & Hostname 변경 ( 루트 계정 접속 상태 ) 

1. ID 변경

usermod -l {원하는 ID명} pi

2. Hostname 변경

$sudo raspi-config

# network option -> hostname -> {원하는 호스트명} 변경
# password 변경
# language -> US | KR | UTF
# time -> Asia -> Seoul
# WiFi -> US, UK

 

7.  root 계정 비활성화

$sudo passwd -l root

 

728x90
반응형
반응형

안녕하세요. 

 

빠르게 Estimote의 Beacon 세 개를 이용해 안드로이드 폰으로 삼변측량을 구현하기 위해 AltBeacon Library를 사용했습니다. (Beacon 구현)

 

간단하기 때문에 쉽게 구현할 수 있습니다. 중요한 부분만 집어 이야기 하겠습니다.

 

altbeacon.github.io/android-beacon-library/index.html

 

Android Beacon Library

The leading library for detecting beacons on Android. What Does This Library Do? It allows Android devices to use beacons much like iOS devices do. An app can request to get notifications when one or more beacons appear or disappear. An app can also reques

altbeacon.github.io

 

1. Configure (build.gradle)

최신 버전

 

2. Permissions (AndroidManifest.xml)

안드로이드 버전 별 이슈는 위 사이트 참고

 

 

3. Implements (MainActivity.java)

altbeacon.github.io/android-beacon-library/samples.html

 

Android Beacon Library

Reference Application A minimalist reference application for the Open Source Library is available on GitHub that demonstrates basic ranging and monitoring. It is based on the examples below. Requesting Permission IMPORTANT: Your app must request permission

altbeacon.github.io

 

Ranging Example Code를 사용하여 Distance를 구할 수 있다. ( getDistance() 메소드 사용 )

 

하지만 getDistance 메소드 대신 아래 메소드를 추천합니다. ( 실제 실험 환경의 곡선을 가진 방정식 )

protected static double calculateDistance(int measuredPower, double rssi) {
  if (rssi == 0) {
    return -1.0; // if we cannot determine distance, return -1.
  }
  double ratio = rssi*1.0/measuredPower;
  if (ratio < 1.0) {
    return Math.pow(ratio,10);
  }
  else {
    double distance =  (0.89976)*Math.pow(ratio,7.7095) + 0.111;
    return distance;
  }
}

 

4. Error (AltBeacon 종속성 추가)

오류

Caused by: java.lang.ClassNotFoundException: Didn't find class "androidx.localbroadcastmanager.content.LocalBroadcastManager"

 

해결 (build.gradle에 추가)

 implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0'

 

 

5. 응용 (Beacon Parser)

Beacon은 대표적으로 Estimote(Apple)와 EddyStone(Google)이 있으므로, Beacon Scan 하기 위한 Beacon을 parsing 해야 한다. 

 

 

위 오픈소스 설명이 굉장히 잘 돼있기 때문에 자세한 설명은 하지 않고, 큰 틀로 이야기를 진행했습니다.

 

iBeacon이 Eddystone보다 약 2년 정도 일찍 출시되어, Beacon 하면 iBeacon을 많이 이야기합니다. 

 

후속작인 Eddystone은 URL을 Broadcasting 하여 주변 기기에게 전송할 수 있고, TLM을 통해 비콘의 상태를 확인할 수 있습니다. 

www.youtube.com/watch?v=HRP1tfXHiVg&t=67s

passkit.com/blog/what-is-eddystone-and-is-it-the-future-of-beacon-tech/

 

What Is Eddystone and Is It The Future Of Beacon Tech?

Back in July, Google released Eddystone, an open source beacon format that is changing the way we use beacons. Here's what you need to know.

passkit.com

 

 

cf) 삼변측량 Library

github.com/lemmingapex/trilateration

 

lemmingapex/trilateration

Solves a formulation of n-D space trilateration problem using a nonlinear least squares optimizer - lemmingapex/trilateration

github.com

 

728x90
반응형
반응형

Explicit Intent인텐트를 충족하는 애플리케이션이 무엇인지 지정합니다. 이를 위해 대상 앱의 패키지 이름 또는 완전히 자격을 갖춘 구성 요소 클래스 이름을 제공.

 

ex) Page1에서 Page2로 넘어갈 때, 사용되는 노드 같은 것

 

 

0. AndroidManifest.xml ( SecondActivty를 manifest에 추가 )

        <activity android:name=".SecondActivity">

        </activity>

 

 

1. first_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Button"
        android:onClick="ClickButton"
        android:id="@+id/btn">

    </Button>

</LinearLayout>

2. MainActivity.java (Activity A)

package com.example.project8_intent;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.first_layout);
		
        // Button Event
        Button btn = (Button)findViewById(R.id.btn);
        btn.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view)
            {
                // intent ( Start Point : Main -> End Point : SecondActivity )
                Intent intent = new Intent(getApplicationContext(), SecondActivity.class);
                startActivity(intent);
            }
        });
    }
}

 Button Click했을 때( Start Point : MainActivity ---> End Point : SecondActivity )

 

 

 

3. second_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Second Button"
        android:id="@+id/btn2"
        >

    </Button>

</LinearLayout>

4. SecondActivity.java

package com.example.project8_intent;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

public class SecondActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second_layout);

        Button btn = (Button)findViewById(R.id.btn2);
		
        // SecondActivity 종료
        btn.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view){
                finish();

            }
        });
    }
}

 Button Click했을 때( SecondActivity 종료)

 

 

MainActvity.java
SecondActivty

 

developer.android.com/guide/components/intents-filters?hl=ko#java

 

인텐트 및 인텐트 필터  |  Android 개발자  |  Android Developers

An Intent is a messaging object you can use to request an action from another app component . Although intents facilitate communication between components in several ways, there are three fundamental use cases: An Activity represents a single screen in…

developer.android.com

 

728x90
반응형

+ Recent posts