반응형

목차

1. HC-05, HC-06 테스트 및 설정 : https://coding-yoon.tistory.com/206

 

글을 시작하기 전에 내가 대학생일 때 들었었으면 좋았을 강의 하나가 있다. 이용성 교수님께서 강의해 주시는 건데 회로부터 하나하나 설명해 주시니 진짜 너무 좋은 영상이다.

아두이노 UNO 와 블루투스 모듈과 0, 1번을 사용하면 안 되는 이유

가끔 블로그를 보면 아두이노와 블루투스 모듈을 0, 1번에 서로 연결하는 경우가 있다. 완성 시 컴퓨터와 분리했을 때는 문제가 되지 않고, 아두이노에 코딩을 할 때 문제가 발생한다.

아두이노에서 통신 방식은 대표적으로 UART, I2C, SPI 방식이 있다. 특히 UART를 조심히 사용해야 한다.

가장 많이 사용되는 아두이노 UNO 같은 경우 UART는 한 개이며, 각각 0번 핀(RX:수신), 1번 핀(TX:송신)이다. 그런데 아두이노는 이상한 특징을 가지고 있다. UART 0, 1번 핀이 컴퓨터와 연결되는 USB 케이블 부분과 연결돼 있다.

우리는 아두이노에서 출력되는 값을 아두이노 serial monitor를 통해서 확인할 수 있다. USB 케이블을 통해 데이터가 출력되지만, 이 USB 케이블은 0, 1번과 연결돼있다. 정리하자면 컴퓨터에 아두이노를 연결하는 순간 이미 아두이노와 컴퓨터는 서로 serial 통신을 하고 있다.

그렇다면 블루투스 모듈을 0, 1번에 사용하면 어떻게 될까? 당연히 충돌 난다. 하지만 간혹 운이 좋아 동작할 수 있지만 올바른 동작이라고 할 수 없다.

그렇다면 아두이노 UNO는 UART를 사용할 수 없는가?

하나밖에 없는 UART는 이미 사용하고 있기 때문에, 아두이노는 softwareserial를 사용해 uart를 사용할 수 있다. 몇 개든 uart를 선언해서 사용할 수 있지만 software로 구현돼있기 때문에 굉장히 느리다. 그렇기 때문에 아두이노 코딩 할 때는 softwareserial을 사용할 수 밖에 없고, 완성 후에 하드웨어 serial을 사용하면 된다. 이것에 대한 팁은 나중에 올리려고 한다.

*아두이노에 대한 UART를 더 알고 싶으시면 아래 블로그를 참고하시길 바랍니다.

아두이노 UNO 와 블루투스 모듈(HC-05, HC-06) 연결

아래와 같이 아두이노와 블루투스 모듈을 연결했고, 코드는 아래와 같다.

코드는 굉장히 간단하다. 블루투스로 수신 받은 값을 serial monitor에 출력하는 코드이다. 

#include <SoftwareSerial.h>

#define BT_RXD 3
#define BT_TXD 2
SoftwareSerial bluetooth(BT_RXD, BT_TXD);

void setup() {
  Serial.begin(115200);     // 이전 글 참고
  bluetooth.begin(115200);  // 이전 글 참고
}

void loop() {
  if (bluetooth.available()) {
    Serial.write(bluetooth.read());
  }
  if (Serial.available()) {
    bluetooth.write(Serial.read());
  }
}

 

올바르게 연결하고 펌웨어에 코드를 입혔다면, Arduino bluetooth controller를 설치해서 Terminal mode로 테스트한다. Hello를 입력해보면, Arduino IDE의 Serial monitor에서 값을 확인할 수 있다.

 

 

HC-05, HC-06

블루투스 모듈인 HC-05와 HC-06에서 LED를 확인할 수 있는데, 이는 state에 대한 LED이다.

LED 점멸 : 기기 Pair 가능 상태

LED 꺼짐 : 연결 상태

HC-05, HC-06에는 VCC, GND, TX, RX 외에도 state, EN 단자가 있다. state는 블루투스 상태를 출력하는 단자로 위 LED에 연결돼있다. EN 단자는 만약 블루투스가 연결 상태라면 강제로 신호를 주어 블루투스 연결을 끊을 수 있다.

728x90
반응형
반응형

https://bestugi.tistory.com/33

 

최신 Apache WebDAV 설치 및 설정하기 / Apache 2.4.43 / Windows 10 / LINUX

본 문서는 Windows 10에 Apache WebDAV를 설치, 설정하는 과정을 설명하고 있습니다. 설정 과정부터는 리눅스에서도 동일하게 적용 가능합니다. Windows 10에 최신 아파치를 기반으로 한 WebDAV를 설치하고

bestugi.tistory.com

 

위 블로그를 참고하여 만들면 됨. 

 

설정을 건들면서 error가 발생하여 되지 않을 경우, log를 확인하면서 error를 고쳐야 함. 

 

메모장으로 하는 것보다 VSCode 같은 편집기로 해야 실수가 덜 나옴. space 하나만 잘못쳐도 error 발생함.

 

블로그를 참고하면서 만들지만 500 error 메세지 발생. 서버까지 접근은 됐으나 내부 설정이 잘못되어 접근하지 못한 것. 

 

C:\Apache24\logs\error.log

 

error는 error.log에 기록되므로 무슨 error인지 확인 가능.

 

 [client 192.168.0.1:53099] AH01615: need AuthName: /data/

경로의 AuthName이 없어 error가 발생한 것. 

 

# dav 관련 파일에 AuthName을 추가
C:\Apache24\conf\extra\httpd-dav.conf
DavLockDB "${SRVROOT}/var/DavLock"

Alias /data "Z:" 
<Location "/data"> 
    Dav On 
    
    # 인증 타입 
    AuthType Basic 
    #### 수정 사항 ####
    AuthName WebDAV
    ###################
    # You can use the htdigest program to create the password database: 
    # htpasswd -c "${SRVROOT}/user.passwd" admin 
    AuthUserFile "${SRVROOT}/user.passwd" 
    AuthGroupFile "${SRVROOT}/groups.htgroup" 
    AuthDigestProvider file 
    
    <RequireAny> 
        Require user admin 
    </RequireAny> 
</Location> 
<Directory "Z:"> 
    Order Allow,Deny 
    Allow from all 
    AllowOverride None 
    Options Indexes 

    <RequireAny> 
        Require user admin 
    </RequireAny> 
</Directory>

 

성공

 


 

위 블로그를 따라하다 보면 오타가 조금씩 있음. 예를 들어 아래 코드를 그대로 긁어 왔는데 그대로 복붙으로 실행하면 에러 발생. "가 빠졌기 때문에 형식을 맞춰줘야 함.

cd C:\Apache24\bin 
htpasswd.exe -c "C:\Apache24\user.passwd admin
cd C:\Apache24\bin 
htpasswd.exe -c "C:\Apache24\user.passwd" admin

 

 

728x90
반응형
반응형

안녕하세요. 

 

제가 평소에 자주 즐겨보는 빵형의 개발도상국에서 재미있는 딥러닝 예제가 있어서 가져 왔습니다.

 

www.youtube.com/watch?v=VxRCku4Bkgg

평소에는 눈으로만 보다가 재밌어 보여서, 실제로 저도 한 번 해보기로 했습니다.

 

댓글을 보니, 많은 사람들이 데이터 프로세싱 부분에서 힘들어 하십니다.

 

저도 따라해보았더니, 학습이 진또배기가 아니라 데이터 전처리 부분이 이 동영상의 꽃이란걸 알게 됐습니다. 

(역시 딥러닝은 데이터가 문제...)

 

 

 

1. 데이터셋 받기

 

www.kaggle.com/jessicali9530/celeba-dataset

 

CelebFaces Attributes (CelebA) Dataset

Over 200k images of celebrities with 40 binary attribute annotations

www.kaggle.com

1GB Face Dataset

하나 주의사항 !

 

컴퓨터 용량은 충분하신가요?

 

실제로 데이터를 받아보면, 1G 바이트 약간 넘습니다. 

 

하지만, 데이터 전처리를 하게 되면

 

지옥을 맛보시게 될겁니다. SSD 빵빵한거나 서버가 없으면 뒤로 돌아가시는걸 추천드립니다.

 

 

 

2. Git에서 코드 받기

 

github.com/kairess/super_resolution

 

kairess/super_resolution

Super resolution with Subpixel CNN using Keras. Contribute to kairess/super_resolution development by creating an account on GitHub.

github.com

 

download
오늘의 주인공

오늘은 preprocess.ipynb 전처리 부분을 봐보겠습니다. 

 

옵션사항입니다. 

 

저는 Pycharm으로 코딩을 할 예정이기 때문에 .ipynb를 .py로 변경했습니다.

 

jupyter nbconvert --to scripy preprocess.ipynb ( 해당 경로에서 )

 

 

 

3. 경로/디렉토리 준비하기

 

빵빵한 SSD를 준비합니다. 

 

 

저는 E 드라이브에 준비하겠습니다.

 

E 드라이브(자신의 드라이브)에 dataset 폴더를 하나 만듭니다.

 

1. E:\dataset 

제 기본 경로가 되겠습니다.

 

dataset 폴더에 이렇게 폴더를 만들어 주겠습니다. 

2. E:\dataset\img

 

 

우선 img 폴더는 학습을 시킬 실제 데이터가 들어가 있습니다. 아까 kaggle에서 받은 img_align_celeba를 옮겨서 이름만 바꿔준 것입니다. 그대로 사용하셔도 상관없습니다. 저는 간단한게 좋아서 img로 바꿨습니다. 

이 img 폴더에 있는 사진들은 학습할 데이터입니다. 간단히 X_data라 부르겠습니다.

 

X_data는 Train용, Validation용, Test용으로 나뉩니다. 

 

3. E:\dataset\list_eval_partion.csv

 

이미지에 각각 라벨링 한 것을 csv파일로 저장되있습니다. 다른 csv 파일은 그냥 휴지통에 던져 줍니다.

 

partition : 1 => train (162770장)

partition : 2 => val (19867장)

partition : 3 => test (19962장)

 

 

4. E:\dataset\x_train

 

이제 데이터를 전처리하게 되면 train, validation, test 용으로 데이터가 나뉘기 때문에 

 

저 이름 그대로 폴더를 만들어 주어야 합니다. 

 

x_train

x_val

x_test

y_train

y_val

y_test

 

 

이 폴더 안에는 학습하기 좋게끔 numpy(.npy) 로 전처리되어 저장될 예정입니다. 

 

굳이 몰라도 되지만, TMI로 scipy나, matplotlib 등 여러 과학, 수학, 딥러닝에서 numpy를 제공하는 이유는

 

numpy가 C코드로 작성된 라이브러리이기 때문에 파이썬 내장 list보다 속도가 훨씬 빠릅니다. 

 

파이썬 개발한 사람이 C 개발자였으니... 

 

 

4. 코드

 

import os, cv2
import numpy as np
from skimage.transform import pyramid_reduce 


# 경로
base_path = r'E:\dataset'  # E:\dataset
img_path = os.path.join(base_path, 'img')  # E:\dataset\img

eval_list = np.loadtxt(os.path.join(base_path, 'list_eval_partition.csv'), dtype=str, delimiter=',', skiprows=1)
print(eval_list[0])


# 이미지 확인
img_sample = cv2.imread(os.path.join(img_path, eval_list[0][0]))
print(os.path.join(img_path, eval_list[0][0]))
h, w, _ = img_sample.shape


# 이미지 전처리 
crop_sample = img_sample[int((h-w)/2):int(-(h-w)/2), :]
resized_sample = pyramid_reduce(crop_sample, downscale=4)

pad = int((crop_sample.shape[0] - resized_sample.shape[0]) / 2)

padded_sample = cv2.copyMakeBorder(resized_sample, top=pad, bottom=pad, left=pad, right=pad, borderType=cv2.BORDER_CONSTANT, value=(0,0,0))

print(crop_sample.shape, padded_sample.shape)


# main
downscale = 4
n_train = 162770
n_val = 19867
n_test = 19962

for i, e in enumerate(eval_list):
    filename, ext = os.path.splitext(e[0])
    
    img_path = os.path.join(img_path, e[0])
    
    img = cv2.imread(img_path)
    
    h, w, _ = img.shape
    
    crop = img[int((h-w)/2):int(-(h-w)/2), :]
    crop = cv2.resize(crop, dsize=(176, 176))
    resized = pyramid_reduce(crop, downscale=downscale)

    norm = cv2.normalize(crop.astype(np.float64), None, 0, 1, cv2.NORM_MINMAX)
    
    if int(e[1]) == 0:
        np.save(os.path.join(base_path, 'x_train', filename + '.npy'), resized)  
        np.save(os.path.join(base_path, 'y_train', filename + '.npy'), norm)  
    elif int(e[1]) == 1:
        np.save(os.path.join(base_path, 'x_val', filename + '.npy'), resized)
        np.save(os.path.join(base_path, 'y_val', filename + '.npy'), norm)
    elif int(e[1]) == 2:
        np.save(os.path.join(base_path, 'x_test', filename + '.npy'), resized)
        np.save(os.path.join(base_path, 'y_test', filename + '.npy'), norm)

 

 

 

5. 오류

 

아마 유튜브를 보고 따라하시는 분들 중에 대부분이 경로 문제입니다. 

 

 

----------------------------------------------------------------------------------------------------------------------------

 

첫 번째 오류 

대표적으로 이 분이  경로 문제로 막히신겁니다. 

 

Git에서 코드를 받으실 때 DataGenerator.py 도 같이 받으십니다. 

DataGenerator는 x_train 등 전처리한 .npy 파일을 불러와서 Batch로 묶고 shuffle 하여 데이터셋을 만드는 코드입니다.

 

하지만 에러문을 보게 되면, splited = ID.split('/') 에서 오류가 발생합니다. 

 

ID.split('/')는 불러온 경로를 '/' 기준으로 나누는 것입니다. 

 

예를 들어 

 

'E:/dataset/img' 가 있습니다.

 

'E:/dataset/img'.split('/')을 하게 되면 ["E:", "dataset", "img"]로 나뉩니다. 

 

눈치 빠르신 분이 있을까요??

 

제 코드에서 기본 경로는  r'E:\dataset' 입니다. 

 

r'E:\dataset'.split('/")는 어떻게 될까요?

 

결과는 ["r'E:\dataset'.split('/")"] 입니다. 우리들은 기본 경로를 절대경로로 표시했습니다.

 

"\"는 "/" 아닙니다!!!!!  우리는 DataGenerator.py에 들어가서 splited = ID.split('/')를 

 

splited = ID.split('\')로 변경해주면 해결됩니다.

 

ID가 왜 경로죠? 라고 궁금해하는 분이 계실 수도 있습니다. 

 

DataGenerator.py 45줄

__data_generation 함수에서 list_IDS_temp라는 파라미터를 받는 것을 알 수 있습니다. 

 

list_IDS_temp가 무엇인지 확인하겠습니다. 

DataGenerator.py 34줄

list_IDs에서 받아온거네요. list_IDs가 무엇인지 역추적해보겠습니다. 

 

DataGenerator.py 9줄

아하 DataGenerator에서 생성자에서 파라미터로 받는 것을 확인했습니다. 맨 처음 파라미터니까 찾기 쉽겠네요.

 

아마 데이터를 생성하는 클래스이기 때문에 train.py에서 사용했을겁니다. 

 

train.py

네. import 한 것을 바로 확인할 수 있습니다. 

 

 

x_train_list = list_IDs 라는 것을 역추적해 알 수 있게 되었습니다. 

 

위 댓글 분의 오류의 원인은 경로 문제라는 것을 제대로 확인할 수 있습니다. 

 

 

 

----------------------------------------------------------------------------------------------------------------------------

 

 

두번 째 오류

'NoneType' object has no attribute 'shape'

 

shape라는 속성이 없다라는 오류입니다. 

 

아마 shape를 쓴 걸로 보아 NoneType 자리에는 Numpy가 들어갈 수 있다는걸 추측할 수 있습니다. 

 

그런데 NoneType 이라는 것은 해당 경로에 .npy를 불러 왔지만 경로가 잘못되어 아무 것도 불러오지 못하였다고 말할 수 있습니다. 

 

 

----------------------------------------------------------------------------------------------------------------------------

 

 

이것도 경로 문제입니다. 

 

에러문에 나와있네요.

 

No such file or directory  파일이나 폴더를 찾을 수 없다...!

 

아마 경로를 확인해보니 첫 번째 오류와 비슷한 것 같습니다. 

 

경로구분이 "\\"으로 되있는데 split은 "/" 이니 제대로 분리가 되지 않았을겁니다. 

 

np.load( 경로 ) 에서 막힌 듯 싶습니다. !! 

 

 

----------------------------------------------------------------------------------------------------------------------------

 

이건 제가 올린 답글... 

 

도움이 되셨으면 좋겠습니다... 글을 마치도록 하겠습니다아아... 빵형 개발도상국님 항상 재밌게 잘 보고 있습니다!

728x90
반응형
반응형

안녕하세요.

 

오후에는 블로그를 쓰지 않는데 라즈베리파이4를 사용하면서 주의해야할 점을 생각난 지금 정리해두어야 할 것 같아 급하게 작성합니다. 

 

라즈베리파이4 wifi문제(라즈비안)

 

라즈베리파이4 buster OS를 사용하면 Rasberrypi Pi Configuration - Wifi-Country는 GB로 설정한다. 그러지 않으면 와이파이 검색이 안되는 것이 굉장히 많음.

 

라즈베리파이4 한글 문제(라즈비안)

 

한글 입력되지 않을 때, Rasberrypi Pi Configuration-Locale에서

 

Language : en(English)

Country : US(United States)

Character Set(UTF-8)

 

로 변경한다. KR(X)

 

 

혹시 또 오류사항은 새 글을 작성하지 않고 여기다 업데이트하겠습니다.

728x90
반응형
반응형

안녕하세요. 

 

pandas_datareader을 이용해서 데이터 처리를 하기 위해 아래 문구처럼 에러문이 뜨는 경우가 있습니다. 

 

FutureWarning: pandas.util.testing is deprecated. Use the functions in the public 
API at pandas.testing instead. from pandas.util.testing import assert_frame_equal

아래 에러문이 뜨더라도 실제 코딩하는데는 아무 문제 없습니다. 

 

위 에러문은 pandas.util.testing 에서 더 이상 사용되지 않기 때문에 뜹니다. 

 

대신, pandas.testing에서 사용할 수 있으니 수정하라는 권고문 같은 정도입니다. 

 

실행될 때마다 에러문이 발생하면 기분이 별로 좋지 않으니 에러문이 뜨지 않도록 수정해주겠습니다. 

 

에러문 옆을 보면 pandas_datareader/compat/__init__.py에서 7번 째 줄에서 해당 에러문이 발생하는 것을 알 수 있습니다.

 

클릭해서 해당 파일에 들어가기
해당 7번째 줄

7: pandas.util.testing을 pandas.testing으로 바꿔주면 됩니다. 

 

수정

위 처럼 수정해주시고 실행시켜 보시면 에러문은 뜨지 않습니다. 

728x90
반응형

+ Recent posts