TLS 1.0 은 이제 보안 정책으로 사용이 금지되어 있다.

그래서 기술적으로는 구현이 되어있음에도 불구하고, 브라우저나 각종 라이브러리로 사용을 하려고 하면 오류가 난다.



크롬 기준 이러한 사이트에 접속하려고 하면


The connection to this site uses 

TLS 1.0 (an obsolete protocol), 

RSA (an obsolete key exchange),

3DES_EDE_CBC with HMAC-SHA1 (an obsolete cipher).


이런 메시지를 내면서 접속을 불허한다.




이런 사이트에 대해 Python 을 사용하여 요청을 보낼때 이를 굳이 우회하는 방법.


나의 경우 requests 라이브러리를 사용했는데, urllib3 라이브러리를 사용한다면 동일하다.

urllib3.util.ssl_.DEFAULT_CIPHERS 에 'DES-CBC3-SHA' 을 추가해주면 됨.

콜론으로 구분되기 때문에



urllib3.util.ssl_.DEFAULT_CIPHERS += ':DES-CBC3-SHA'


이렇게 작성해주면 된다.

(DES-CBC3-SHA 과 3DES_EDE_CBC 은 명명법만 다르지 같다고 한다.)


requests 라이브러리를 쓴다면

requests.packages.urllib3 로 임포트 되어 있으니 여기다 해줘도 됨(혹은 여기다가 해줘야만 할 수도?)



requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS += ':DES-CBC3-SHA'


이래도 안되는 경우가 있는데, OpenSSL 문제인 것 같다.

안되는 시스템에서 

$ curl --sslv3 주소

을 해봤을 때,

curl: (4) OpenSSL was built without SSLv3 support

같은 오류가 나온다면 v3을 지원하는 버전으로 재컴파일 하거나 설치해주도록 하자.


Trivial

requests 기준으로 인증서 오류도 날테니 요청을 보낼때 verify=False 인자도 추가해주자.



그리고 이러면 또 warning 이 매번 출력되는데, 아래와 같은 방법으로 비활성화 할 수 있다.

똑같은 코드지만, 상황에 맞게 복붙해서 사용하자.


# urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

# requests
requests.packages.urllib3.disable_warnings(requests.packages.urllib3.exceptions.InsecureRequestWarning)


참고

https://stackoverflow.com/questions/50707974/force-tls-1-0-connection-with-requests?noredirect=1&lq=1

https://stackoverflow.com/questions/27981545/suppress-insecurerequestwarning-unverified-https-request-is-being-made-in-pytho

나도 잠깐 고생한 적이 있었는데, 원인도 모르고 고생하다 나에게 물어오는 사람이 종종 생겨서,

혹시나 이 글이 검색에 걸려 도움을 받는 사람이 있을까 싶어 남겨본다.


통신사에서 제공하는 무료와이파이나 군부대 사지방 인터넷 등에서 웹서핑을 하면, 대부분의 사이트는 접속이 잘 되지만 특정 서비스들이 안되는 경우가 종종 발생한다.


특정 사이트 자체가 접속이 안되거나,

사이트 접속이 되긴 하는데 특정 기능이 작동을 안하거나,

특정 프로그램이 제대로된 작동을 못하거나.



이 문제들은 모두 공용 와이파이의 보안정책 때문인데, 정확히 확인해보진 않았지만 대충 80/443 포트를 제외하고 IN/OUT 을 다 막는다고 생각하면 된다. (dynamic port 대역은 남겨두려나?)


그래서 간단하게로는 :8080 이라던가, :8888 이라던가, :8443 등등 다른 포트 위에 돌아가는 페이지에 접속을 할 수 없거나,

5900 포트를 사용하는 vnc 등에 접속을 할 수 없다.


우리학교 포탈 시스템이 해당되고, 예전엔 KT 도 그랬던 것 같은데 지금은 아닌 듯.



해결법은 서비스 제공자에게 80/443 포트를 사용하여 서비스 하도록 요청하거나,

공용 와이파이의 정책을 완화해주도록 요청해야할텐데, 둘 다 아무래도 현실성이 떨어지겠지?


그냥 이런 구린 와이파이를 안쓰는게 제일 좋겠지만,

어쩔 수 없다면 80,443 포트를 사용하는 프록시나 openVPN 을 사용하는게 그나마 가능한 해결책일 것 같다.



이런 문제 때문에서인지, 카톡 같은 애들은 소켓을 열 때 80, 443 포트도 후보군에 있다.

서비스를 개발, 제공한다면 고려해보면 좋은 지점.

필요하다 생각만 했는데.. 이제서야 구매. (정작 이제 필요없어진 것 같지만.)


찾아보며 느낀 점이 리뷰나,, 상세 설명 같은게 너무 없다고 생각되어서 작성해봄.

포장 뜯자마자 메뉴들 만져보고 끄적거리는 거라서 실 사용기와는 거리가 멀다고 생각함.




나의 녹음기 용도는

신경 안쓰고 일상에서 녹음을 해뒀다가 후에 확인하기 위한 용도.


따라서 구매 조건은.. 이 게시글과 상당히 흡사했는데 - 보이스레코더 녹음날짜시간 기록여부 궁금합니다.


(뭐.. 모든 조건이 크게 상관없고 '있었으면 좋겠다' 였지만.. 여튼)

1. 날짜시간이 기록될 것 (중요)

2. 배터리 신경 안쓰게 장시간 가능

3. 음성을 감지해서 자동 녹음

4. 유명한 회사가 아니면 구리다고 하니 적당히 유명할 것

5. 클립 형태 같은 느낌으로 옷에 적당히 달고다닐 수 있을 것


제품을 찾다보면 생각보다 조건들에 해당되는게 잘 없다. 특히 1번 날짜시간에서 80% 제품이 걸러지는 느낌?


그리고 메이저 회사를 넘어가면 녹음기 자체가 뭔가 불법적인 상황에 사용되는 느낌으로 제작되어서 하나같이 마음에 안들었음...



여튼 이래저래 타협하고 결국 구매를 결정한 필립스 VTR-7100.

날짜시간이 기록되고 배터리 타임이 길었던게 결정적인 구매 조건.


VTR-8000 이 좀 더 이뻐보이긴 했지만, 녹화 기능이 무슨 증거 채취할게 아니고서야 아무리 생각해도 쓸데 없었고,

가격이 10여만원 가량 더 비싸서 단념했다.



VTR-7100에 대해서 기본적인 내용은 인터넷에 잘 나와 있으니 생략하고,

내 생각과 달랐던? 혹은 아쉬웠던 점들 위주로 적어보겠음.


1. 녹음 타입 / 노이즈 감소

녹음 타입 종류는 PCM, HP(HQ), SP, SLP(LP), LINE-IN 5가지가 있고 기본값은 HP.

HP로 충분히 우수했고, SP는 좀 먹먹한 느낌, SLP는 울리는 소음과 더불어 쓸게 못되는 느낌.


음질이 중요한 상황이 아니라면 SP 정도로 충분한 것 같았다.


녹음 타입에 LINE-IN 이 있던데, aux 선을 연결해서 그 소리를 녹음하는게 가능하다.

인터넷 상에서 찾아볼 땐 못본 것 같아서 한 줄 남겨둠.


라디오 녹음 등의 기능도 제공되던데,, 사실 쓸일 없을 듯?


디지털 노이즈 감소기능을 켜면 녹음 타입은 LINE-IN으로 설정되고, PCM 256kbps 로 녹음된다.

8GB 기준 녹음 가능 시간은 72시간 56분 정도.

(참고로 그냥 PCM 설정시 PCM 768kbps)


그런데.... 노이즈 감소 기능을 켜지 않으면 주변 바람소리 같은 소음?이 꽤나 크게 녹음되는 편이다. (치지지지지지...)

다만 다른 녹음기들도 인터넷에 올라온 영상을 보면 비슷한 것 같다.. 이런 소음을 없애려면 아무래도 마이크가 좀 더 커야겠지..?ㅠ


2. VA(소리 감지 자동 녹음)

제품설명 페이지에는 녹음을 시작하는 VR 레벨을 설정할 수 있다고 나와있는데, 설정 화면을 찾을 수 없다.

설명서에도 적혀있지 않는게, 허위광고(?)인 듯 하다.


그리고 나는 소리가 감지되면 그때그때 녹음 파일을 생성할 줄 알았는데,, 하나의 녹음 파일에 일시정지, 녹음재개를 반복한다.

파일을 들어보면 어느 지점에서 끊기고 다시 녹음되었는지 구분도 안가고,, 중요했던 날짜시간 기록도 무의미해 진다.


어찌보면 제일 중요한 기능 중 하나였는데, 무쓸모한 기능이 되어버렸음.. VR 레벨 설정 기능도 없고...


3. 날짜/시간 기록 방식, 폴더 시스템

알고 있었긴 한데,, 파일시스템 상의 생성/수정일 정보를 이용한다.

하다못해 id3 tag 정도 남겨주길 바랐는데...

파일을 컴퓨터로 가져올 때 주의해야할 듯.


폴더는 VOICE/A,B,C,D 4개 폴더와 MUSIC 폴더로 고정인 듯 하고,

A,B,C,D 각 99개까지 녹음파일이 저장될 수 있다고 한다. (굳이.. 대체 왜....)


4. 전원 스위치와 녹음 스위치

이거 조금 웃기고 복잡한게..

좌측면에 전원 스위치가 있고, 우측면에 녹음 스위치가 있는데,

재생버튼을 꾸욱 눌러서 전원 On/Off 가 또 가능하다....


좌측면 전원 스위치는 master 전원 느낌으로 정말 물리적으로 전원을 끊어버리는 느낌?

이게 꺼져있으면 녹음 스위치를 올려도 녹음이 시작되지 않고, 녹음 중에 끌 경우 파일이 오류나서 저장된다.


즉, 홍보문구 상의 녹음 슬라이더만 올려서 즉시 녹음을 사용하려면...

좌측 전원 슬라이더는 켜두고, 재생버튼을 꾸욱 눌러서 전원을 끈 상태가 전제 조건...


그리고 이 슬라이더가 별로였던게 제공된 파우치에만 넣었는데 스위치가 움직이더라.

이건 좀 어이없었음... 신경써서 넣으면 되긴 한데...


전원 슬라이더가 왜 필요한지 잘 모르겠지만, 굳이 만들어야 했다면 좀 더 구석에 조작이 잘 안되게 만들었으면 어떨까 싶다.


5. 충전

충전포트가 주로 쓰이는 안드로이드 충전용 5핀 micro-usb 가 아니고 mini usb 다...

아쉬운 부분이지만 자주 충전 안해도 되게 충분한 배터리 시간을 뽑아주니 괜찮을 듯


또 충전 중 사용이 불가능하다. 사소하지만 또 마음에 안 든 부분..


6. 기본 제공 외장마이크

왜 외장으로 마이크를 뒀을까... 궁금했는데 그냥 방안에서 테스트 해볼 때는 내장마이크도 충분하게 느껴졌다.

물론 음질이 더 좋은 것 같긴 한데.. 일단은 빼고 사용해 볼 예정.


이어폰을 꼽으면 녹음 중 모니터링이 가능한데, 이 마이크를 꼽으면 이어폰 연결 단자가 막히기 때문에 사용할 수 없게 된다.


쓸만한 마이크가 제공되니 3.5파이 라인 연장선만 있으면 유선 원거리 녹음은 쉬워지려나? ㅋㅋㅋ


7. 무선마이크

이 제품의 특이점이 아닐까 싶은데.... 사실 왜 필요한지 잘 모르겠는 기능이기도 함.


심지어 무선 마이크의 목걸이는 충전선 같은 재질로 탈착이 불가능하다. 아마 안테나 역할을 하는 듯?

본체에도 이어폰을 연결해야 정상적인 사용이 가능하고, 통신 채널은 BAND1, BAND2 2개를 제공하고 내가 선택하게 되어 있다.


무선마이크의 배터리는 7시간 정도 간다고 설명서에 적혀있고 충전은 마찬가지로 mini usb 포트를 사용한다.


크기는 생각보다 크고 음질은 제대로 테스트해보지 않았음.

원거리의 녹음을 껏다켰다하면서 모니터링까지 필요한 상황이 아니면 정말 쓸모 없어 보인다.



8. 기타

1) 스피커는 생각보다 좋은 느낌? 다만 내가 막귀라서.. 그냥 소리도 크고 음질도 괜찮은 것 같았다.


2) 녹음 시작까지 걸리는 시간이 생각보다 길다.

그때그때 좀 편차가 있긴 하던데, 길땐 거의 7~8초 걸리는 느낌? 짧을 땐 2~3초쯤?


제대로 테스트를 해본건 아니지만, 처음 켜지거나 포맷 직후엔 녹음파일 이름을 정하기 위해 스캔하면서 걸리는 시간이 아닐까 싶다.

다만 전체 삭제 직후에 매번 오래걸리는건 좀 아이러니...



총평

날짜시간 기록되는 점을 제하면 뭐하나 생각한대로 작동하는 기능이 없다.

다른 제품이 얼마나 좋은지 잘 모르겠지만... 날짜시간이 중요한게 아니라면 다른걸 사서 쓰는게 어떨까 싶다.


딱히 메리트가 없다고 생각됨.

나도 날짜시간을 포기했어야했나.. 싶기도 하고....


결국 환불함.

티스토리에 Prism 을 적용하였음.

기록용 및 글 작성 참고용.


선택한 옵션 주소는

https://prismjs.com/download.html#themes=prism-coy&languages=markup+css+clike+javascript+c+autohotkey+bash+cpp+arduino+django+docker+markup-templating+git+go+http+java+json+kotlin+markdown+makefile+nginx+objectivec+php+sql+python+plsql+swift+vim&plugins=line-highlight+line-numbers+toolbar+remove-initial-line-feed+command-line+copy-to-clipboard


플러그인

Line Hightlight

Line Numbers

Command Line

Copy to Clipboard Button



<pre class="line-numbers" data-start="3" data-line="4-5,8"><code class="language-python">

print('Hello world!')


</code></pre>

<pre class="command-line" data-user="root" data-host="local" data-prompt="PS >"><code class="language-bash">
</code></pre>

<code class="language-bash">~~~</code>

pwd
/usr/home/chris/bin
ls -la
total 2
drwxr-xr-x   2 chris  chris     11 Jan 10 16:48 .
(out)drwxr--r-x  45 chris  chris     92 Feb 14 11:10 ..



<pre><code class="language-bash">

<pre class="command-line" data-prompt="$" data-filter-output="(out)"><code class="language-bash">
<pre class="command-line" data-prompt="$" data-output="1-2"><code class="language-bash">

</code></pre>

개인적으로 nginx 자체는 매력적이라고 생각했지만, php-fpm 이라던가 uwsgi 같이 웹서버에서 직접 붙지 않고 socket 으로 연결되는 방식이 마음에 들지 않아 잘 사용하지 않았다. 

설정 및 관리가 좀 더 번거롭기도 했고..


이제는 마음에 안들었던 몇가지를 감수하고 장점을 취해보기 위해서 사용해보려고 하는데,  여전히 개떡같은 uWSGI 설정법을 정리해봄.


----------
2020.06.28 gunicorn 설정 추가

uWSGI보다 gunicorn 이 더 좋다고 한다.
나의 경우 웹소켓을 쓰려는데, uWSGI는 제대로 안되고 gunicorn + eventlet 조합으로 해야해서 스택을 변경해봄.


큰 차이는 없다. 거의 비슷...
----------

환경은 Ubuntu 18.04 + Nginx + uWSGI/gunicorn + Python3 + Flask.

이 방법의 최대 장점 중 하나가 프로젝트별로 python 버전에 구애받지 않고 venv 를 전혀 무리 없이 돌릴 수 있다.. 인 것 같은데 난 평소에 그렇게 안쓰고 있으니 일단 생략.


1. 패키지 설치

apt에도 있긴 한데, pip으로 설치해줘도 된다.

pip install uwsgi

pip install gunicorn


2. 프로젝트 wsgi 설정

프로젝트 폴더에 이런식으로 파일을 만든다.

wsgi.py

from flask_app import app

if __name__ == '__main__':
    app.run()

uwsgi.ini (gunicorn 의 경우엔 필요없음)

[uwsgi]
#plugin = python3
module = wsgi:app

master = true
processes = 3

socket = /tmp/PROJECT.sock
chmod-socket = 664
vacuum = true

die-on-term = true

plugin = python 은, uwsgi 를 apt로 설치한 경우 필요한 것 같음.


3. systemd unit 생성

/etc/systemd/system/ 경로에 PROJECT.service 로 파일을 만든다.

[Unit]
Description=WSGI instance to serve PROJECT
After=network.target

[Service]
User=ubuntu
Group=www-data
WorkingDirectory=/PATH/TO/PROJECT
#Environment="PATH=/PATH/TO/BIN"
#ExecStart=/usr/bin/uwsgi --ini uwsgi.ini
ExecStart=/usr/local/bin/gunicorn -k eventlet -w 3 --bind unix:wsgi.sock -m 007 wsgi:app

[Install]
WantedBy=multi-user.target

뭐 User, Group 이라던가 적당히 해주고, 그 밑에 WorkingDirectory, 환경변수, 실행커맨드 등도 적당히 수정해준다.

gunicorn 도 uwsgi처럼 configuration 파일을 만들어서 할 수 있지만, 명령어로도 충분한 듯...

-k, --worker-class=: 워커 프로세스 종류. sync(기본값), eventlet, gevent 등이 있다.

-w, --workers=: 워커 갯수. 시스템 프로세스 코어당 2~4개가 권장이라는 듯?

-m: unix socket으로 만들 경우 umask


이 후

sudo systemctl enable PROJECT

sudo systemctl start PROJECT

이렇게 자동 실행 설정 및 서비스 시작 해주면 된다.


4. Nginx 설정

sites-available 등의 설명은 생략.


아래와 같이 구성하자. 수정이 필요하다면 적당히 수정...


server {
        listen 80;
        server_name 사이트주소;

        #location / {
        #        include uwsgi_params;
        #        uwsgi_pass unix:///tmp/PROJECT.sock;
        #}
        location / {
                include proxy_params;
                proxy_redirect off;
                proxy_pass http://unix:/PATH/TO/PROJECT/wsgi.sock;
        }
        #location /socket.io {
        #        proxy_pass http://unix:/PATH/TO/PROJECT/wsgi.sock:/socket.io;
        #        include proxy_params;
        #        proxy_http_version 1.1;
        #        proxy_redirect off;
        #        proxy_buffering off;
        #        proxy_set_header Upgrade $http_upgrade;
        #        proxy_set_header Connection "Upgrade";
        #}
        location /static {
                alias /PATH/TO/PROJECT/flask_app/static;
        }
}

업스트림 설정으로 분산화를 하거나, uri 에 따라 다른 프로젝트로 연결하는 것도 가능하다. 이건 내가 쓸일 있을때 수정해둘거임.

uwsgi 는 전용 지시어인 uwsgi_param, uwsgi_pass 를 사용하는데, gunicorn 은 그냥 proxy 관련 지시어들을 사용한다.

소켓을 어디에 만드느냐는 큰 차이 없음.

websocket 을 사용할 경우 주석처리한 것처럼 따로 설정을 해주면 된다.


5. 로그 보기

프로젝트 폴더에 만들었던 uwsgi.ini  에서 log 파일 경로를 지정할 수도 있지만,

sudo journalctl -u PROJECT 로 볼 수도 있다.

uwsgi 관련 로그는 여기에서,

접속 기록이나 파이썬 에러 로그 등은

/var/log/nginx/access.log, /var/log/nginx/error.log 에서 확인할 수 있다. 물론 설정에서 각각 바꿔줬으면 다르겠지?



참고

How To Serve Flask Applications with uWSGI and Nginx on Ubuntu 18.04 (DigitalOcean)

uWSGI documentation

gunicorn documentation

USBISP MK2 http://www.devicemart.co.kr/1077889



AVR 프로그래머를 하나 구매하였는데, 펌웨어와 드라이버가 좀 까다로운 듯...
판매사에서 제공하는 가이드를 보면 사용하는 프로그램의 버전과 호환성이 상당히 까다롭다..


그래도 가이드가 잘 나온 편이니 하라는대로 하면 되겠지만... 나는 맥에서 사용하고 싶었음.

잘 이해가 안가서 해결하는데 상당히 오랜 시간이 걸렸고, 정확한 인과관계가 맞지 않을 수도 있지만,,, 여튼 해결했다.

참고로 내가 구매한건 Olimex 사에서 만든 AVR-ISP-MK2 의 호환 혹은 동일 모델이다.


* 참고로 내가 젤 헤맸던 부분인데, 맥에서 시리얼 포트로 잡히지 않는다! (/dev/cu.usbmodem###, /dev/tty.usbmodem###, /dev/ttyUSB0 등)

이렇게 잡히는 사람도 있는 것 같은데, 나의 경우엔 시리얼 포트가 생성되지 않았지만 사용이 가능했다. (물론 시스템 리포트 등으로 확인시 정상 인식)

아마 mcu에 부트로더 등을 올려야지만 인식이 되는게 아닐까.. 싶다.


1. CrossPack 설치

맥에서 AVR 크로스 컴파일 용으로 CrossPack (https://www.obdev.at/products/crosspack) 이라는 개발킷이 존재한다.
다운받아서 설치해주자.

CrossPack is a development environment for Atmel’s AVR® microcontrollers running on Apple’s Mac OS X, similar to AVR Studio on Windows. It consists of the GNU compiler suite, a C library for the AVR, the AVRDUDE uploader and several other useful tools.


2. AVRDUDE 패치

컴파일된 바이너리를 avr로 업로드할때 사용되는 avrdude...
뭐가 문제인지는 모르겠지만, CrossPack 에서 설치해주는 avrdude 6.0.1 버전은 호환이 되지 않는다.

5 버전을 사용하거나, 6 이상 버전에 패치를 적용해주어야 한다.
작성시점 기준으론 5.11.1 혹은 6.3 버전.

avrdude 의 소스코드는 http://download.savannah.gnu.org/releases/avrdude/ 에서 다운받을 수 있다.


의존성 설치

Homebrew 를 이용해서 의존성을 먼저 설치해주자.
(참고로 homebrew 에서 avrdude 최신버전(6.3)을 제공하지만, 마찬가지로 패치가 필요해서 작동하지 않는다.)

brew install libusb libelf libftdi0 libhid

참고로 위 패키지들을 설치하지 않아도 진행은 가능하나, 컴파일된 바이너리 사용시
avrdude was compiled without usb support. 라고 뜨면서 실질적으로 사용이 불가능하다.


컴파일에 필요한 패키지도 설치하자.
brew install autoconf automake


AVRDUDE 5

위 주소에서 5 버전 소스코드를 다운받고 압축을 해제하자. 나의 경우엔 avrdude-5.11.1.tar.gz

해당 폴더로 이동한 후 다음 명령어들을 차례로 입력해준다.

./bootstrap
./configure
make

이후 make install 을 해주면 /usr/local/bin/avrdude 로 바이너리를 옮겨준다. (다른 것도 몇개 같이 옮김)


AVRDUDE 6

마찬가지로 위 주소에서 6 버전 소스코드를 다운받는다.

폴더로 이동한 후 Olimex 에서 제공하는 패치(https://www.olimex.com/Products/AVR/Programmers/AVR-ISP-MK2/resources/endpointdetect_pass1.patch) 도 다운.

cat endpointdetect_pass1.patch | patch -p0 

위 명령어로 패치를 진행한다. (사실 난 안해봐서 안될 수도.)


이미 패치된 코드도 https://github.com/brettyhale/AVR-OSX-and-Olimex-ISP-MK2 여기서 내려받을 수 있다.


이후 컴파일은 위 AVRDUDE 5 와 같은 순서로 진행하면 됨.


작동 확인

avrdude를 컴파일한 후 해당 디렉토리에서
./avrdude -n -vvv -c avrispmkii -p atmega128 -P usb -C ./avrdude.conf
로 잘 작동하는지 테스트해볼 수 있다.

*MCU 가 atmega128 이 아니면 적당히 수정해주자.


잘 작동한다면 아래 접어둔 것과 같은 로그가 표시된다



3. USBISP MK2 펌웨어 교체

나는 헤매는 과정에서 진행했는데, 만약 판매사가 처음부터 이 펌웨어로 발송을 해준다면 진행할 필요가 없다.

여튼 맥에서 사용하기 위해선 libusb+avrdude용 USBISP 펌웨어로 교체가 필요하다.


펌웨어는 마찬가지로 Olimex 의 홈페이지에서 다운로드 가능.
https://www.olimex.com/Products/AVR/Programmers/AVR-ISP-MK2/open-source-hardware


Software 쪽에 보면 Firmware files and drivers for older AVR/Atmel Studio and/or Arduino/AVRDUDE 항목이 있다.
직링은 여기 - https://www.olimex.com/Products/AVR/Programmers/AVR-ISP-MK2/resources/AVR-ISP-MK2-Firmware-WindowsDrivers.zip


압축을 풀면 Firmware_Drives/FIRMWARE-FOR-AVRDUDE-LIBUSB/libUSB-AVRISP-MKII.hex 파일이 있다.
해당 파일을 USBISP MK2 에 업로드 해주면 된다.


방법은 내가 구매한 제품 기준으로,

1. 플라스틱 케이스를 벗긴다.

2. JP1 의 스위치(?)를 Normal 에서 Up 으로 변경하고 컴퓨터와 연결

3. dfu-programmer 컴파일 및 사용 (http://blog.iolate.kr/257) 게시글을 참고하여 펌웨어 업로드 진행
        나의 경우 기기종류는 AT90USB162

4. JP1 스위치를 다시 원상태로 돌리기

하면 끝.



4. 프로젝트 생성, 컴파일, 업로드

CrossPack 에서 설치된 avr-project 명령어로 프로젝트 템플릿을 생성할 수 있다.
avr-project FirstProject

이러면 아래와 같이 프로젝트를 생성해준다.

FirstProject
├── firmware
│   ├── Makefile
│   └── main.c
└── FirstProject.xcodeproj

xcode 프로젝트로 생성해주는 것 같은데... 난 그냥 커맨드라인에서 계속 작업했음.

firmware/main.c 파일을 작성하면 된다.


컴파일을 하기 전에 Makefile 을 수정...

20, 21번째 라인에서 DEVICE, CLOCK 을 내가 사용하는 mcu 에 맞게 수정해준다.

나는
DEVICE     = atmega128
CLOCK      = 16000000

이렇게 수정했음.

FUSES 도 
FUSES      = -U hfuse:w:0xd9:m -U lfuse:w:0xff:m
로 수정하였는데 퓨즈비트를 자세히 모르니 패스.


Programmer 쪽도 수정을 해줘야하지만, Makefile의 주석이 권장하는 방법대로 하자.

~/.avrduderc 파일을 생성하고

default_programmer = "avrispmkii";
default_serial = "usb";

이렇게 입력해준다.


이후 make 로 컴파일,

혹은 make flash 로 컴파일 및 업로드 할 수 있다.

make fuse 가 퓨즈비트 설정인 것 같지만 난 안써봤음.


잘 작동하면 성공!


Atmel 칩에 펌웨어를 업로드를 할때 사용할 수 있는 dfu-programmer.

윈도우는 Flip 을 사용한다지만, Flip이 맥을 지원하지 않는다.

공식 홈페이지는
https://dfu-programmer.github.io/


brew에 있는 것 같다.

brew install dfu-programmer 로 설치.


소스코드를 다운받아 컴파일/설치하고 싶다면 아래 참고.


펌웨어 업로드는 아래 명령어를 차례로 사용하면 된다.

sudo dfu-programmer 기기종류 erase
sudo dfu-programmer 기기종류 flash 펌웨어파일.hex
sudo dfu-programmer 기기종류 reset

아두이노를 많이 사용하다보니, 아두이노말고 AVR 보드를 구매해서 직접 사용해보고 싶었다.



일단 우노와 동일한 ATMEGA328P-PU 를 사용해보기로 결정.


원랜 아두이노 회로에 포함되어 있던 캐패시터나 크리스탈 등등이 필요해지는데.. 잘 모르니 열심히 구글링을 해서 찾아보았다.



우선 circuito.io 라는 멋진 사이트를 발견! ATMEGA328P-PU 를 선택하면 위와 같이 회로를 구성해준다.


FTDI나 어댑터 같은건 생략을 하고, 디바이스마트에서 해당 부품을 찾아보았다.


 종류

상세 

 갯수

 개당 가격

 링크 (디바이스마트)

 MCU

 ATMEGA328P-PU

 1

 3,000

 http://www.devicemart.co.kr/1059191

 저항

 10kΩ ±1% 1/4W

 1

 20

 http://www.devicemart.co.kr/2034

 크리스탈

 16MHz 20pF 

 1

 -

 -

 크리스탈 

 16MHz 18pF

 1  http://www.devicemart.co.kr/72
 세라믹 캐패시터

 22pF

 2

 15

 http://www.devicemart.co.kr/1378

 세라믹 캐패시터

 20pF

 2 15 http://www.devicemart.co.kr/1379
 세라믹 캐패시터

 100nF(0.1uF)

 2

 30

 http://www.devicemart.co.kr/1343

 전해 캐패시터

 1uF / 50V

 1

 20

 http://www.devicemart.co.kr/1315

 리니어 레귤레이터

 L7805 LDO 5V 1.5A

 1 - -

 리니어 레귤레이터

 L7805CV

 1 759 http://www.devicemart.co.kr/1026440



동일하거나 최대한 비슷한 것을 골라보았음.

circuito.io 에 나온 부품이 없거나 기타 이유로 대체 선택한 부품은 하늘색으로 칠해두었다.

가격은 구매갯수에 따라 조금 다를 수 있음.

또한 최소 구매 갯수때문에 실질 지출 또한 달라질 수 있고 + 부가세 10% 붙여야함.


크리스탈은 해당 부품이 없어서 대체선택이고, 22pF 캐패시터와 LDO를 왜 저렇게 선택했는지는 아래 내용 참고.



자, 이러면 대충 4,300원이면 제대로 작동하게 하나 만들 수 있다.


그런데 디바이스마트 아두이노 호환보드를 보면 ATMEGA328P 를 사용하는 프로미니나 나노가 3100~4500원에 판매되고 있다....

하... 해보지 말까...



세라믹 캐패시터

크리스탈의 경우 circuito.io 에 나온 크리스탈은 Load Capacitance 가 20pF 인데, 디바이스마트에는 18pF 밖에 없었음.

찾아보니 계산식은 아래와 같았다. 


CL = (Cext * Cext) / (Cext + Cext) + Cint + Cstray

Cext = 2 * (CL - Cint - Cstray)


참고1: http://forum.arduino.cc/index.php?topic=23397.msg176828#msg176828

참고2: http://dokkodai.tistory.com/98


각각이 뭔지 자세한 설명은 나도 모르니 패스하고,(ㅠㅠ)

CL이 20pF 일때 역산을 해보고, 그를 통해 18pF 일때 Cext 를 계산해보면 20pF 가 되는 것 같았다.

별 차이 없어보이지만, 난 뭐가뭔지 잘 모르니까 일단 둘 다 구매했다. 써보면 알겠지...



리니어 레귤레이터

L7805 는 검색해보면 종류가 다양한데..

일단 패키지 종류가 딱 티가 나니 먼저 나눠보도록 하자.


TO-220FP의 FP는 풀팩, 히트싱크가 없고 풀몰딩으로 완전히 절연된 패키지라고 한다.

어떤 장단점이 있는지 잘 모르겠으니 그냥 TO-220 선택.



그러면 디바이스마트에 L7805(CV, ACV, CV-DG, ABV) 4개...의 제품이 나오는데..


L7805 의 개량으로 L7805C, L7805AB/AC 시리즈가 있다. L7805 는 더이상 판매되지 않는 듯?

L7805AB/AC 는 데이터시트 상으로 TJ 값에 따라 나뉘는데.. 테스트 온도 환경이 아닐까 싶고

L7805AB는  -40 ~ 125°C, L7805AC는 0 ~ 150°C 라고... 으..응...

참고로 L7805C 는 -55 ~ 150°C


다른 데이터 항목은 잘 모르겠지만, Output Voltage 의 min/max 범위가 L7805AB/AC 가 L7805C 에 비해 아주 조금 더 좁다.

더 정밀하다는 소리겠지...?


그리고 dimension 에 따른 파트번호가 나뉘면서 V가 끝에 붙는다.(다른 기호면 크기가 조금 다를 수 있음)

L7805C -> L7805CV

L7805AB/AC -> L7805ABV, L7805ACV


이렇게 나뉘니, L7805CV-DG 빼곤 차이점에 대한 궁금증이 해결.

CV-DG 는 귀찮으니 그러려니 하고 패쓰...


결과적으로, 별 차이 없다.

제일 저렴한 L7805CV 를 선택하도록 하자(?)


맨날 검색하다가 작성.


압축

$ tar -zcf [.tar.gz] [...]


압축 해제

$ tar -zxf [.tar.gz]


옵션

-f: use archive file or device ARCHIVE

-c: create a new archive

-x: extract files from an archive

-z: filter the archive through gzip


-p: extract information about file permissions (default for superuser)

-t: list the contents of an archive

-v: verbosely list files processed

워낙 잘못된 방법이 소개된 글이 많아 고생을 하여 작성.

Raspberry PI Zero W, Jessie 기준이다.


TX, RX 핀은 구글에 검색하면 이미지가 많이 나오니 핀 배열을 참고하자.


검색을 해보면 텍스트 파일을 수정하거나 데몬을 끄고 켜는 등의 작업이 많은데 다 필요없다.


$ sudo raspi-config


Interfacing Options

-> Serial

-> Would you like a login shell to be accessible over serial? <No>

-> Would you like the serial port hardware to be enabled? <Yes>


이렇게만 해주면 boot 설정 변경 등을 알아서 해주며 재부팅이 필요할 경우 재부팅까지 묻는다.


이 후 /dev/ttyS0 파일스트림을 사용하면 된다. /dev/ttyAMA0 이 아님!


블루투스 데몬이나 시리얼 서비스 등등을 바꿔야한다는 글들이 많지만 다 필요없으니 참고.



Python 에서 시리얼 통신

아래 방법 중 하나로 serial 라이브러리 설치


sudo python -m pip install pyserai
sudo apt install python-serial (Python3 의 경우엔 python3-serial)



import serial
ser = serial.Serial('/dev/ttyS0', 9600, timeout=3)

ser.readline().strip().decode('utf-8')
ser.write(b'TEST\n')
ser.write('TEST\n'.encode('utf-8')


serial 변수 생성 이후 open 하고 싶다면,


ser = serial.Serial(timeout=3)
ser.port = '/dev/ttyS0'
while True:
	try:
		ser.open()
		if ser.is_open: break
		time.sleep(1)
	except: pass



참고

class serial.Serial:
	__init__(port=None, baudrate=9600, bytesize=EIGHTBITS, 
		parity=PARITY_NONE, stopbits=STOPBITS_ONE, timeout=None, 
		xonxoff=False, rtscts=False, write_timeout=None, dsrdtr=False, 
		inter_byte_timeout=None, exclusive=None)


+ Recent posts