0. S/W 준비사항

  가. Ubuntu 18.04 LTS

  나. 사용자ID 및 홈디렉토리는 user로 가정

  다. 작업디렉토리는 /home/user/ws/jupyter로 가정

    1) mkdir -p /home/user/ws/jupyter

  라. 가상환경디렉토리는 /home/user/venv/jupyter로 가정

    1) mkdir -p /home/user/ws/jupyter

  마. 자신의 IP는 192.168.0.1로 가정


1. 추가 S/W 설치

  가. 파이썬 가상환경 설치 및 실행

    1) $ sudo apt install virtualenv

    2) $ virtualenv --python=python3 /home/user/venv/jupyter

    3) $ . (<-점, 포인트) /home/user/venv/jupyter/bin/activate

      가) $ source /home/user/venv/jupyter/bin/activate (<- 동일한 방법)

  나. 쥬피터 노트북 설치

    1) $ pip install jupyter


2. 쥬피터노트북 설정

  가. 설정 파일 생성

    1) $ jupyter notebook --generate-config

      가) 홈 디렉토리에 .jupyter 설정 디렉토리가 생성됨

        (1) $ cd /home/user/.jupyter

      나) jupyter_notebook_config.py 파일을 수정

        (1) 설정파일은 사전에 백업을 해둘 것

          (가) cp jupyter_notebook_config.py jupyter_notebook_config.py.bak

  나. 설정 파일 편집

    1) $ vi jupyter_notebook_config.py

    2) 외부 접속 허용

      가) c.NotebookApp.allow_origin = '*'

    3) 시작시 브라우저 실행 안함

      가) c.NotebookApp.open_browser = False

    4) 암호 설정(1번 방법)

      가) $ jupyter notebook password

      나) 설정할 패스워드 입력하면 완료

    5) 암호 설정(2번 방법)

      가) $ python3 실행

        (1) from notebook.auth import passwd 엔터

        (2) passwd() 엔터

        (3) 설정할 패스워드를 입력하면 sha1 암호가 출력됨 저장해둘 것

      나) 쥬피터 설정파일에서 저장된 암호를 입력

        (1) c.NotebookApp.password = 'sha1:...............'

  다. 실행

    1) $ jupyter notebook --ip=0.0.0.0


3. 실행 스크립트 작성

  가. /home/user/ws에 jupyter.sh 스크립트 작성

    1) $ cd /home/user/ws

    1) $ vi jupyter.sh

      가) #!/bin/bash

      나)

      다) source /home/user/venv/jupyter/bin/activate

      라) cd /home/user/ws/jupyter

      마) jupyter notebook --ip=0.0.0.0

  나. 실행권한 설정

    1) chmod 755 jupyter.sh


4. 서비스 등록

  가. $ cd /etc/systemd/system

  나. $ sudo vi jupyter.service

    1) [Unit]

    2) Description=Jupyter Notebook

    3)

    4) [Service]

    5) Type=simple

    6) WorkingDirectory=/home/user/ws/jupyter

    7) ExecStart=/home/user/ws/jupyter.sh

    8) User=user

    9) Group=user

    10) Restart=always

    11)

    12) [Install]

    13) WantedBy=multi-user.target

  다. 서비스 시작 및 활성화

    1) sudo systemctl start jupyter.service

    2) sudo systemctl enable jupyter.service

  라. 서비스 수정후 데몬 리로드

   1) sudo systemctl daemon-reload


5. 끝

0. 준비 사항

  가. 우분투 18.04

  나. ipTIME VPN서버 PPTP(암호화없음)


1. 네트워크 매니저(GUI 방식)

  가. 16.04에는 네트워크 편집기에 VPN 자동연결 항목이 있음, 18.04에는 없음

  나. 기존 네트워크 편집기로 수정하면 가능함

    1) nm-connection-editor 실행


2. 네트워크 매니저(CLI 방식)

  가. 네트워크 매니저 디렉토리에 새로운 연결을 만들 파일(vpn) 생성

    1) $ sudo vi /etc/NetworkManager/system-connections/vpn

    2) 본문내용

[connection]

id=vpn <-- 노출되는 연결명

uuid=aff531e3-47bf-41db-b8ee-a7017e3e3e8a

type=vpn

autoconnect=false

permissions=

[vpn]

gateway=123.456.789.000 <-- vpn 서버 주소

password-flags=0 <-- 비밀번호 입력을 자동으로 할 경우

user=guest <-- vpn 사용자

service-type=org.freedesktop.NetworkManager.pptp

[vpn-secrets]

password=00000000 <-- vpn 비밀번호

[ipv4]

dns-search=

method=auto

[ipv6]

addr-gen-mode=stable-privacy

dns-search=

method=auto

  나. 특정 연결이 네트웍에 연결될 경우 자동으로 vpn을 연결할 경우

    1) 특정 연결 열기 ex) $ sudo vi /etc/NetworkManager/system-connection/noname

    2) [connection] 섹션에서

      가) secondaries=연결할 vpn 연결 파일의 uuid를 입력

        (1) ex) secondaries=aff531e3-47bf-41db-b8ee-a7017e3e3e8a;

  다. 네트워크 매니저를 재실행

    1) $ sudo systemctl restart NetworkManager

  라. 네트워크 현황 보기

    1) $ nmcli conn

  마. 특정 네트워크 연결 및 해제

    1) $ sudo nmcli conn up 특정 연결명(/etc/NetworkManager/system-connection)

    2) $ sudo nmcli conn down 특정 연결명

    

0. 준비사항


  가. ESP32-WROOM-32 모듈 사용 기준


    1) 모듈이 내장된 보드 상관없음


1. 아두이노 설치


  가. 아두이노 프로그램 설치


    1) https://www.arduino.cc/en/Main/Software


  나. 보드 매니저 추가(ESP32)


    1) 파일 > 환경설정


    2) 추가적인 보드 매니저 URLs

    가) https://dl.espressif.com/dl/package_esp32_index.json


  3) 툴 > 보드 > 보드 매니저


  4) esp32 설치


  5) 사용할 보드 선택(DOIT ESP32 DEVKIT V1)


  6) 포트 선택


2. 아두이노 사용


  가. 예제 실행


    1) GetChipID


    2) 업로드 및 실행

    3) 시리얼 모니터


    4) 보드레이트 선택


0. 설치


  가. $ sudo apt install tmux : ubuntu, (apt or apt-get)


1. Session 관련(여러개 세선 생성 가능)


  가. $ tmux new-session -s [session_name] -n [window_name] : screen_name 및 window_name 을 가지는 세션 생성, -s, -n을 지정하지 않으면 임의 이름 생성됨


  나. $ tmux attach-session -t [session_name] : 지정 session_name을 가지는 세션으로 접속, 화면 공유 같이됨


  다. 세션(윈도우-팬)에서 Ctrl + b + d : 세션 detach


  라. 세션(윈도우-팬)에서 Ctrl + b + $ [session_name] : session_name으로 세션 이름 변경


2. Window 관련(세션 내에는 여러 윈도우 생성 가능)


  가. Ctrl + b + c : 새로운 윈도우 생성


  나. Ctrl + b + , : 윈도우 이름 변경


  다. Ctrl + b + 0~9 : 지정 번호의 윈도우로 이동


  라. Ctrl + b + & 또는 exit : 윈도우 삭제


3. Pane 관련(윈도우 내에서는 여러 팬 생성 가능)


  가. Ctrl + b + " : 팬 가로 분할


  나. Ctrl + b + % : 팬 세로 분할


  다. Ctrl + b + 방향키 : 팬 이동


  라. Ctrl + b + [ : 스크롤(방향키업다운 또는 페이지업다운 )


  마. exit : 팬 삭제


4. Session 공유(A:공유권한자, B:공유사용자)


  가. $ tmux attach-session -t [session_name] : 지정 session_name을 가지는 세션으로 접속, 화면 공유 같이됨


  나. 가는 동일한 유저일 경우 간편하게 사용가능함, 하지만 다른 유저일 경우는 아래와 같이 사용


  다. A : $ tmux -S /tmp/socket


    1) -S /tmp/socket는 다른 유저에게 공유할 소켓 경로 이름


  라. A : $ chmod 777 /tmp/socket


    1) 다른 유저가 공유할 수 있도록 접근권한 변경


  마. B " $ tmux -S /tmp/socket attach-session

1. 우분투 설치(16.05.3기준)

  가. 써드파티 드라이버 & 라이센스 설치

  나. LVM을 가진 전체 디스크로 설치

    1) 기존에 LVM으로 설정된 내장 또는 외장 디스크가 있을 경우 설치가 안될 수도 있으므로 LVM을 삭제해야함.

    2) 이것을 모르고 디스크 용량이 부족한 것으로 판단하였음

      가) 우분투에서 디스크 용량 부족 경고를 띄웠음

      나) 아무런 표시도 없이 현재 창을 다시 보여주는 것도 있었음

2. LVM

  1) microSD 64GB 삽입

  2) LVM으로 기존 논리 볼륨에 추가

  3) 확장 참고

    가) http://zelda.tistory.com/entry/lvm?category=177187

3. 원격 제어

  1) 인터넷이 안되므로 USB-LAN이나 무선랜을 장착해서 이후 진행

  2) sudo apt update

    가) 안될 경우 Software & Updates의 저장소를 변경하면 됨

  3) sudo apt install ssh screen

  4) 이후부터는 ssh로 접근해서 사용

4. ssh로 접속

  1) sudo apt upgrade -y

  2) sudo apt git libncurses5-dev libssl-dev

  3) sudo apt kernel-package

5. WLAN 드라이버 인식

  1) 참고

    가) http://zelda.tistory.com/entry/%EC%9D%B8%ED%85%94-%EC%BB%B4%ED%93%A8%ED%8A%B8-%EC%8A%A4%ED%8B%B1STCK1A8LFC-%EB%AC%B4%EC%84%A0%EB%9E%9CWiFi-%ED%99%9C%EC%84%B1%ED%99%94?category=177187

6. HDMI가 없을 경우 부팅 안됨

  1) 초기에는 H/W 문제로 판단됨

    가) 이걸로 인해 엄청난 삽질을 했음

    나) 결론은 바이오스 업데이트로 해결

  2) 해당 쓰레드

    가) https://communities.intel.com/thread/84871?start=15&tstart=0

  3) 바이오스 업데이트 사이트

    가) https://downloadcenter.intel.com/download/26540/Compute-Stick-BIOS-Update-FCBYT10H-86A-?v=t

1. 인텔 컴퓨트 스틱 내장 8기가 eMMC

  가. 외장 64기가 microSD


2. 내장 8기가에 우분투 16.04설치

  가. 설치시 lvm으로 설치


3. 디스크 크기 확인

  가. df -h


4. 물리볼륨 확인

  가. pvscan, pvdisplay, pvs


5. 물리볼륨 생성

  가. pvcreate /dev/mmcblk2


6. 볼륨그룹 확인

  가. vgscan, vgdisplay, vgs


7. 볼륨그룹 확장

  가. vgextend ubuntu-vg /dev/mmcblk2


8. 논리볼륨 확인

  가. lvscan, lvdisplay, lvs


9. 논리볼륨 확장

  가. lvextend -L+60G /dev/ubuntu-vg/root

  나. +60G는 60G를 추가한다는의미, 외장 크기에 따라 입력할 것


10. 파일시스템 확장

  가. resize2fs /dev/mapper/ubuntu--vg-root


11. 디스크 크기 확인

  가. df -h

1. 아마존에서 컴퓨트 스틱 구매

 가. https://www.amazon.com/gp/product/B00W7KAABK/ref=oh_aui_detailpage_o01_s00?ie=UTF8&psc=1

  나. 사양

    1) CPU : Z3735F, RAM : 1GB, FLASH : 8GB

    2) Ubuntu 14.04 preinstalled

  다. 플래시 8기가중 실제 4기가만 사용가능, 나머지 4기가는 프리인스톨된 우분투 복구 파티션(7.1기가 정도로 인식되고 2기가는 복구용 5.1기가는 리눅스용)


2. MicroSD 64GB 장착 및 우분투 16.04 설치

  가. MicroSD 64GB 장착

  나. 우분투 16.04를 MicroSD에 설치

    1) 우분투 16.04 LTS : 

    2) 기존 8기가 파티션은 삭제(그대로 두면 리눅스에서 인식이 되므로 특별한 필요가 없다면 다른 용도로 사용)


3. 우분투 16.04 사용

  가. 와이파이 안됨, 프리인스톨된 우분투에는 와이파이 드라이버가 설치되어서 가능한 경우임, 컴퓨트 스틱의 와이파이는 rtl8723bs SDIO 드라이버가 필요함

  나. 우분투 16.04의 커널은 4.10.0-28임

    1) config 파일을 boot 디렉토리에서 복사

  다. 구글링 결과 커널 4.14에 staging driver에 rtl8723bs SDIO 드라이버가 포함되어 있음

  라. 커널 컴파일시 기본 포함이 아니므로 rtl8723bs를 모듈로 포함해야함

    1) make menuconfig -> Device Drivers -> Staging Drivers -> Realtek RTL8723BS SDIO Wireless LAN NIC driver

      가) 커널 컴파일 참고 : http://zelda.tistory.com/entry/Ubuntu-Kernel-Compile?category=177187

  마. 설치된 커널로 부팅시에도 와이파이 사용불가

  바. 와이파이의 펌웨어 파일을 설치해야함

    1) https://github.com/hadess/rtl8723bs

    2) make install


4. 정상동작

  가. 와이파이 설정후 사용

    1) GUI에서 networkmanager 사용

    2) console에서 nmcli 또는 nmtui 사용

0. 절차

  가. 설치한 우분투 버전의 커널 버전과 동일한 커널 컴파일 및 설치


  나. 커널 버전 업 및 다운 그레이드를 위한 커널 컴파일 및 설치


1. 준비사항

  가. OS: Ubuntu 16.04.2 LTS 64bits


  나. Linux Kernel: 4.8.0


2. 커널 준비

  가. $ sudo apt update && sudo apt upgrade: 커널 컴파일에 필요한 툴을 설치하기 전 현재 패키지를 업데이트

    1) sudo: root 권한으로 명령어 수행

    2) apt: 우분투 패키지 매니저

      가) update: 패키지 업데이트

      나) upgrade: 패키지 업그레이드

    3) &&: 앞의 명령어가 정상 종료(성공)했다면 다음 명령어를 실행

    4) sudo apt upgrade로 커널 업그레이드됨(4.8.0-36 -> 4.8.0-51)

  나. $ sudo apt install build-essential kernel-package libncurses5-dev bison flex libssl-dev


3. 커널 컴파일(설치한 우분투 버전과 동일한 커널 버전)

  가. 커널 가져오기

    1) $ uname -r: 커널버전 확인

      가) uname: 시스템 정보 출력

        (1) -r: kernel release

      나) 4.8.0-51-generic: 커널 4.8.0

    2) https://www.kernel.org/pub/linux/kernel/ 에서 설치된 커널과 동일한 커널 가져오기

      가) https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.8.tar.xz 받기

      나) gz, bz2(V2.x이하 대), xz이 있으며 압축 형식만 다름

    3) 컴파일용 디렉토리 생성 및 커널 압축해제

      가) $ mkdir kernel: 사용자 홈디렉토리에 생성(ex) /home/user/kernel)

      나) kernel 디렉토리에 linux-4.8.tar.xz 이동(ex) ~$ mv Downloads/linux-4.8.tar.xz kernel/

      다) 압축해제

        (1) tar xvJf linux-4.8.tar.xz: xz파일 확장자를 가지는 압축 파일을 해제

          (가) tar: 파일을 묶거나 풀기(압축 및 해제 지원)

            (1) x: 풀기

            (2) v: 확인(묶거나 풀리는 파일을 표시)

            (3) J: xz 파일 포맷, bz2는 j, gz는 z

            (4) f: 파일지정

        (2) linux-4.8 커널 디렉토리가 생성됨

      라) linux-4.8 커널 디렉토리가 생성됨


  나. 커널 컴파일

    1) $ cd linux-4.8: linux-4.8 커널 디렉토리로 이동

      가) $ cd linux-4.8

    2) 커널 config 파일 가져오기

      가) $ cp /boot/config-4.8.0-51-generic .config: boot 디렉토리의 커널 컨피그 파일을 .config로 변경

        (1) .config가 실제 컨피그 설정파일이며 boot 디렉토리에는 현재 커널시 설정한 컨피그 파일이 저장되어 있으므로 그 파일을 활용

      나) $ make menuconfig: 콘솔에서 커널 설정

        (1) curses.h 에러가 나므로 해당 패키지 설치

          (가) $ sudo apt install -y libncurses5-dev

            a. install: 패키지 설치

            b. -y: 패키지와 관련한 의존성 패키지가 있을 시 물어보지 않고 설치

      다) 현재 설치된 커널과 동일한 설정을 가지는 커널 컴파일 상황이므로 빠져나가기(ESC)

    3) 커널 컴파일 및 설치

      가) $ fakeroot make-kpkg -j 2 --initrd --append-to-version=-user kernel-image kernel-headers: 커널 컴파일

        (1) fakeroot: 실제 root 권한없이 빌드시 필요한 root 권함을 줌

        (2) make-kpkg:

          (가) -j: 컴파일에 사용할 프로세서 수

          (나) --initrd: 램디스크 생성

          (다) --append-to-version: 컴파일된 커널의 버전 뒤에 붙는 이름

          (라) kernel-image: 커널 이미지 생성

          (마) kernel-headers: 커널 헤더 생성

            (a) 최근에는 kernel-headers 생성서 에러가 발생함

            (b) touch REPORTING-BUGS로 해결

        (3) make-kpkg 명령이 없어서 에러 발생하므로 해당 패키지 설치

          (가) $ sudo apt install -y kernel-package

        (4) 커널 컴파일중 opensslv.h 에러 발생

          (가) $ sudo apt install -y libssl-dev

      나) $ cd ..: 상위 디렉토리에 컴파일된 커널.deb가 생성

      다) $ sudo dpkg -i *.deb: 커널 이미지 및 헤더를 설치

        (1) dpkg: 데비안 패키지 매니저

          (가) -i: 설치

    4) 컴파일된 커널 확인

      가) uname -r을 하여 컴파일된 커널을 확인


4. 최신 커널 컴파일

  가. git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git: git으로 최신 커널 가져오기

    1) git 명령이 없어 에러가 나므로 git 설치

      가) sudo apt install git

    2) git으로 가져오는 것이 웹에서 가져오는 것보다 느림


  나. cd linux-stable: linux-stable 디렉토리로 이동


  다. cp ../linux-4.8/.config .: 상위 디렉토리의 하위 디렉토리 linux-4.8에서 커널 컨피그 파일을 최신 커널 디렉토리에 복사

    1) ..: 상위 디렉토리

    2) .: 현재 디렉토리


  라. make oldconfig: 이전 커널 버전의 설정 파일을 이용하여 최신 커널 버전의 설정 파일로 적용하고 추가된 기능을 사용 유무를 확인

    1) 모르는 기능에 대해서는 넘기기(엔터)를 함

  마. 이후의 사항에 대해서는 전과 동일함

0. 설치


  가. $ sudo apt install screen : ubuntu, (apt or apt-get)



1. Session 관련(여러개 세션 생성 가능)


  가. $ screen -S [session_name] : session_name을 가지는 세션 생성


  나. $ screen -r [session_name] : session_name을 가진 세션으로 reattach


  다. $ screen -x [session_name] : session_name과 같은 세션 화면 공유(2명이서 화면을 같이 사용)


  라. 세션(윈도우)에서 Ctrl + a + d : 세션detach


  마. 세션(윈도우)에서 Ctrl + a + :sessionname [session_name] : session_name으로 세션 이름 변경


  바. $ echo $STY : 현재 세션 이름 확인



2. Window 관련(세션 내에는 여러 윈도우 생성 가능)


  가. Ctrl + a + w : 윈도우 목록을 하단에 표시


  나. Ctrl + a + " : 윈도우 목록을 표시하고 이동 선택 가능


  다. Ctrl + a + c : 새로운 윈도우 생성


  라. Ctrl + a + A : 윈도우 이름 변경


  마. Ctrl + a + 0~9 : 지정 번호의 윈도우로 이동


  바. Ctrl + a + k : 윈도우 삭제

0. 참고자료


  가. esp 컴파일러 설치

    - https://github.com/pfalcon/esp-open-sdk


  나. micropython 설치

    - https://github.com/micropython/micropython/tree/master/esp8266


  다. esp8266 시작하기

    - http://docs.micropython.org/en/latest/esp8266/index.html#




1. 준비 :


  가. 하드웨어

    - LoLin new NodeMcu V3 (esp8266)


  나. 소프트웨어

    - Ubuntu 14.04

    - 사용자 계정은 user 및 작업 디렉토리는 ws로 가정




2. Ubuntu에서 크로스 컴파일러 생성


  가. 컴파일러 의존성 패키지 설치 

    - $ sudo apt-get install make unrar autoconf automake libtool gcc g++ gperf flex bison texinfo gawk ncurses-dev libexpat-dev python-dev python python-serial sed git unzip bash help2man wget bzip2


  나. 크로스 컴파일러(esp-open-sdk) 소스 가져오기

    - $ mkdir /home/user/ws

    - $ cd /home/user/ws

    - $ git clone --recursive https://github.com/pfalcon/esp-open-sdk.git


  다. 크로스 컴파일러 컴파일

    - $ cd esp-open-sdk

    - $ make


  라. 크로스 컴파일러 PATH 추가

    - 크로스 컴파일러 bin이 esp-open-sdk 디렉토리의 xtensa-lx106-elf/bin을 홈디렉토리의 .bashrc에 추가

    - 예) export PATH=/home/user/ws/esp-open-sdk/xtensa-lx106-elf/bin:$PATH




3. Ubuntu에서 마이크로파이썬 생성


  가. 마이크로파이썬 소스 가져오기

    - cd /home/user/ws

    - $ git clone --recursive https://github.com/micropython/micropython.git


  나. git submodule 생성 및 업데이트

   - $ cd /home/user/ws/micropython

   - $ git submodule update --init


  다. 크로스 컴파일러로 내장 스크립트를 바이트코드로 일부 사전 컴파일

    - $ make -C mpy-cross


  라. esp8266 펌웨어 생성

    - $ cd /home/user/ws/micropython/esp8266

    - $ make axtls

    - $ make


  마. esp8266 플래시 지우기

    - $ esptool.py --port /dev/ttyXXX erase_flash

    - ttyXXX는 일반적으로 ttyUSB0로 표기되나 상황에 따라 다르므로 확인할 것

    - ttyXXX에 접근불가능할 경우 sudo로 실행하거나 /etc/group의 dialout에 사용자 계정을 추가할 것


  바. esp8266 펌웨어 다운로드

    - $ make PORT=/dev/ttyXXX deploy




4. esp8266 micropython 사용


  가. 시리얼 터미널 프로그램을 사용

    - baudrate : 115200

    - bit : 8

    - Parity : No

    - Stop bit : 1


나. esp8266 시작하기 참고

    - http://docs.micropython.org/en/latest/esp8266/index.html#

- DB 생성

import sqlite3

db = sqlite3.connect('test.db')


- 커서 생성

cs = db.cursor()


- 테이블 생성

cs.execute('create table testTable(datecol date, valuecol float)')


- 레코드 삽입

from datetime import datetime

import random


for i in range(10):

    daterow = datetime.now()

    valueRow = random.random()

    cs.execute('insert into testTable values(?, ?)'. (daterow, valueRow)


db.commit()


- 전체 레코드 검색

cs.execute('select * from testTable')

r = cs.fetchall()


for i in f:

    print(i)


- 부분 레코드 검색

from datetime import datetime, timedata


st = datetime.now() - timedelta(minutes=2) # 2분전

et = datetime.now() - timedelta(minutes=1) # 1분전

cs.execute('select * from test where date between :st and :et', {"st":st, "et":et})

r = cs.fetchall()


for i in f:

    print(i)


- 데이터베이스 닫기

db.close()

* 추가

Windows7에서 LV2009이후 버전의 Small Fonts 적용상태를 확인해본 결과

LV2009, 2012, 2013 : 기본적으로 Small Fonts가 적용 안됨(FontCodePageList를 추가해주어야함)

LV2010, 2011 : Small Fonts가 기본적으로 적용됨

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

아이콘 편집기를 사용하면 이전 버전(LV2010, 2011)과는 다르게 LV2012버전이상에서는 Small Fonts가 적용이 되지 않는다. 구글링을 해보면 딱히 해결점은 찾을 수가 없었는데, mylv에 있는 답변을 계기로 해결책을 찾을 수 있었다.

원래 상태(Small Font 적용안됨)


방법은 다음과 같다.


Small Fonts가 적용되지 않는 랩뷰 버전의 LabVIEW.ini 파일을 열어

파일 하단에

FontCodePageList=Small Fonts,1252

를 추가해주면, 간단히 문제는 해결된다.


추가 후(Small Fonts 적용됨)



이전에 작성한대로
(http://zelda.tistory.com/entry/NI-LabVIEW-Interface-for-Arduino-Toolkit의-설치)

Arduino용 툴킷만 설치한 후에 VI를 작성하면 Arduino가 동작할 줄 알았다.

그래서 간단한 DO를 하는 Blink를 만들어서 동작시켰다.




하지만, 다음과 같은 에러가 뜬다.

(에러 5002이(가) 다음에서 발생했습니다: Init.vi.  Unable to establish connection with Arduino.  Please ensure that you have selected the correct COM port and that you have flashed the Arduino with the correct firmware.

이 에러 코드는 정의되지 않았습니다. 여러가지 이유로 인해 정의되지 않은 에러가 발생할 수 있습니다. 예를 들면, 코드에 대해 어떤 설명도 되어 있지 않거나, 에러 코드 입력에 에러 코드가 아닌 숫자를 연결했을 수도 있습니다.

추가적으로, 에러가 OS 또는 ActiveX와 같은 타사에서 제공하는 객체에 관련되어 있을 때 정의되지 않은 에러가 발생할 수 있습니다. 타사의 객체에서 발생한 에러일 경우, 웹에서 에러 코드 (5002) 또는 16진수 형 (0x0000138A)(으)로 검색하여 에러에 대한 설명을 얻을 수도 있습니다.)

이때까지만 해도, 툴킷이 지원하는 보드 타입이, Uno 와 Mega2560밖에 없어서,

가지고 있는 Nano보드가 동작이 안되는구나... 생각을 했다.

하지만, 다시 생각해보니,, Uno와 Nano는 MCU도 동일하고 핀배치도 비슷하다.

그래서 조금 더 파고 들기로 했다.

간단한 실행 하이라이트를 켜고 하나하나씩 확인한 결과,

VISA는 정상적으로 연결되어서 내부에서 실행되는 것이었다.

하지만 Init.vi 내의 Send Receive.vi의 Sync Packet를 날리는 부분에서

부분에서 문제가 생기는 것을 확인했다.

이때부터, 구글링 시작 LabVIEW Sync Packet 검색결과

https://decibel.ni.com/content/thread/9762

발견했고,,, LabVIEW에서 사용하기전에 Arduino에 펌웨어를 다운받아야한다는 거...

영어라서 항상 대충읽고 넘기는 게.. 결국은 문제였다.

아래 링크를 참고하면 Arduino에 LabVIEW용 펌웨어를 설치하는 법이 나온다.

http://digital.ni.com/public.nsf/allkb/8C07747189606D148625789C005C2DD6?OpenDocument

이제부터는 정상동작한다.


LabVIEW에서 Arduino를 컨트롤 할 수 있는 툴킷이다.

Arduino Toolkit은 ni.com사이트에서 Arduino로 검색을 하면

나오지만(http://sine.ni.com/nips/cds/view/p/lang/en/nid/209835),

Download 링크를 타고 들어가면 (https://lumen.ni.com/nicif/us/evaltlktlvardio/content.xhtml)

친절하게도 VIPM 2010을 설치하라고 되어있다.

우선 VIPM 2010을 설치하자

설치를 하고 나면 아래와 같은 화면을 볼 수 있다.


우측 상단의 돋보기가 그려져 있는 검색창에서 Arduino를 검색하거나,

목록을 보고 Arduino를 찾자.

해당 패키지를 더블 클릭을 하면, 패키지에 대한 자세한 정보가 나온다.

이런 거 저런 거 다 싫다, 하시면 해당패키지에서 오른쪽 마우스를 클릭하거나,

또는 상단 좌측의 Install package(s) 아이콘을 선택하면 설치할 수 있는 창이 뜨게 된다.

우선 본인은 더블 클릭으로 패키지에 대한 정보를 보겠다.

해당 화면은 아래와 같다.


Install을 누르면 해당 패키지에 대한 확인을 다시 하게 된다


Continue를 선택한뒤에는 다음과 같은 절차가 이루어지는 것 같다.

(패키지를 설치하려는 LabVIEW를 실행시킨 뒤에 사용자 라이브리러인 vi.lib에

라이브러리를 추가하고, 예제 파일 또한 설치하게 된다.)


차후에 Arduino Toolkit가 필요없게 될 경우, 설치와 마찬가지로 패키지 정보화면에서

Uninstall을 선택하면 된다. 이하 설명 생락.

이상으로 패키지의 설치를 마무리하며, 예제 파일 및 팔레트에 추가된 노드는

패키지 정보화면에서 확인할 수 있다.

그리고 당연히 LabVIEW에서도 컨트롤 및 함수팔레트의 Arduino에서 찾을 수 있으며,

예제 찾기에서 Arduino로 검색하여 예제를 찾아볼 수 있다.
Serial to USB를 장착하게 되면 윈도우는 자동으로 사용하지 않는 빈 포트를 할당하게 된다. 그리고 해당 Serial to USB가 장착되어 있으면 장치관리자에서 원하는 포트로 재할당이 가능하고 삭제도 가능하다. 하지만 여기서 문제점은 해당 Serial to USB가 없으면 삭제 및 다른 포트로 할당이 불가능하다는 점이다. 그리고 다른 Serial to USB를 장착하게 되면 이미 선점되어 있는 포트를 제외한 포트에 할당이 된다.

이 글에서 해결을 하려는 점은 포트는 할당되어 있지만, 사용하지 않는 포트를 지우고자 하는 것이다. 보통은 문제가 생기지 않을 수도 있지만, 시리얼을 사용하는 프로그램에서 시리얼을 1번까지부터 9번까지만 인식하는 경우가 있다. 이러한 경우 1번부터 9번까지 포트가 선점되어 있다면 새로운 Serial to USB를 장착할 경우 10번 포트가 할당되게 된다. 그러므로 프로그램에서는 인식을 할 수가 없다.

이러한 경우 등등등을 위해 사용하지 않는 시리얼 포트를 지우는 방법에 대해서 찾아보았다. 구글링을 검색한 결과 삭제법이 나오나 영어로 되어 있어 필요한 사항만을 간단히 적어보도록 하겠다.

1. 윈도우 키 + R or 시작 > 실행

2. 명령 프롬프트> set devmgr_show_nonpresent_devices=1
  a. 에코는 없음

3. 명령 프롬프트> start devmgmt.msc
  a. 에코는 없음

  b. 장치 관리자가 뜸

4. 장치 관리자 > 보기 > 숨김 장치 표시
  a. 선택 체크

5. 포트에서 삭제하고자하는 포트에 오른쪽 마우스 버튼을 눌러 제거를 선택
리눅스에서 디바이스 드라이버 모듈을 동적으로 적재할 수 있기 때문에, 간단한 디바이스 드라이버 예제를 만들어 본다. 다음은 로드와 언로드가 가능한 가장 기본적인 뼈대만을 가지고 있는 적재 가능한 디바이스 드라이버 모듈이다.

-------------------- test.c --------------------
#include <linux/module.h>

static int test_init(void)
{
        printk("test module is loaded \n");

        return 0;
}

static void test_exit(void)
{
        printk("test module is unloaded \n");
}

module_init(test_init);
module_exit(test_exit);

MODULE_LICENSE("GPL");

-------------------- Makefile --------------------
obj-m := test.o

KDIR := /lib/modules/$(shell uname -r)/build/

PWD := $(shell pwd)

default:
        $(MAKE) -C $(KDIR) M=$(PWD) modules

clean:
        rm -rf .*.cmd
        rm -rf .tmp*
        rm -rf *odule*
        rm -rf *.ko
        rm -rf *.mod.*
        rm -rf *.o

$make 를 하게 되면 ko 확장자를 가지는 모듈이 생성된다. 생성된 모듈을 로드하려면 $insmod test.ko 를 실행한다. 모듈을 로드한 뒤에는 아무런 메시지도 뜨지 않는다. 하지만 $dmesg를 하게 되면 test.c에서 모듈로드시 커널메시지로 출력하게되는 test module is loaded. 이라는 메시지를 볼 수 있다. test module is loaded.라는 메시지를 보았다면 정상적으로 모듈이 로드가 된 것이다. 뿐만 아니라, $lsmod를 하게 되면 현재 로드된 모듈이 리스트로 출력되며, test 모듈도 확인할 수 있다. 마지막으로 로드된 모듈을 제거하는 명령어인 $rmmod test.ko를 실행하면 test 모듈은 해제되며, $dmesg에서 모듈이 제거되었다는 메시지를 확인할 수 있다.
디바이스 드라이버의 가장 기본적인 목적 중의 하나는 사용자의 프로그램을 커널의 중요한 데이터 구조나 하드웨어 장치에 직접 접근하지 못하도록 따로 분리시키는 것이다. 가령 사용자 프로그램에서 하드 디스크에 데이터를 쓰려고 할 때 하드 디스크의 섹터 크기가 512바이트이니 1024바이트인지 등을 신경쓰지 않아도 된다는 것이다. 사용자는 단순히 파일을 열어서 쓰기 명령을 내리면 된다. 그러면 디바이스 드라이버가 자세한 세부 내용을 모두 처리하고, 사용자에게는 복잡함과 하드웨어 디바이스를 프로그래밍하는 어려운 과정을 숨긴다. 즉, 유명한 UNIX/LINUX 규약에 따라서 모든 것을 하나의 파일로 다룰 수 있는 기반을 제공하는 것이다.

디바이스 드라이버(device driver), 로드 가능한 커널 모듈(LKM:Loadable Kernel Module) 그리고 모듈이라는 각각의 용어들이 모두 '로드 가능한 커널 디바이스 드라이버 모듈'을 가리킨다.

리눅스에서 디바이스 드라이버는 넓은 의미에서 두 가지로 나눌 수 있다. 캐릭터 디바이스와 블록 디바이스가 그것이다. 캐릭터 디바이스는 순차적인 데이터를 직렬 스트림 형식으로 주고 받는 장치라고 볼 수 있다. 캐릭터 디바이스의 예로는 시리얼 포트나 키보드 등을 들 수 있다. 블록 디바이스는 데이터를 블록 단위로 읽거나 쓸 수 있고, 해당 장치의 임의의 위치에 접근할 수 있는 능력을 가지는 장치로 특징지을 수 있다. 블록 디바이스의 예로는 하드 드라이브나 플로피 드라이브를 들 수 있다.

# yum install vsftpd

실행했는데 에러가 난다.

네이뇽은 yum의 에러라고 한다.

해결책은

# yum clean all

위의 명령을 실행하고 나면.. 정상적으로 동작한다

AHAV9302를 reset하면 u-boot로 부팅을 시작하지만 리눅스가 부팅되지는 않는다. 왜냐하면, uImage, rImage를 지워버렸기 때문이다. 엄마 몰래 리눅스 포팅 강좌에 보면 tftp로 다운받는 방법이 나온다. 물론 그 방법이 편리하고 속도도 빠르기 때문에 권장을 하고 있다. 하지만 본인은 마이너한 걸 좋아하므로 시리얼 다운로드를 해보도록 한다.

u-boot의 문서를 확인해 본 결과 C-Kermit를 사용하기에 본인도 동일한 프로그램을 설치하여 사용하였다. http://www.denx.de/wiki/view/DULG/SystemSetup#Section_4.3. 에 보면 설정법이 나와 있다. 자신의 환경에 맞게 동일하게 설정한다. 본인의 설정을 보자면 ~/.kermrc 부분에서 set line /dev/ttyUSB0을 수정하였다.

1. $kermit
2. C-Kermit>connect
보드랑 PC를 연결한다(minicom과 같은 역할)
프로그램을 실행하여 기본적인 환경을 셋팅한다.
AHAV9302> setenv baudrate 115200
AHAV9302> setenv hostname apple
AHAV9302> setenv bootdelay 3
AHAV9302> setenv ethaddr 00:60:6E:F0:00:02
AHAV9302> setenv ipaddr 192.168.100.182
AHAV9302> setenv netmask 255.255.255.0
AHAV9302> setenv gatewayip 192.168.100.254
AHAV9302> setenv dnsip 203.255.112.34
AHAV9302> setenv dnsip2 192.135.250.69
AHAV9302> setenv serverip 192.168.100.250
AHAV9302> setenv bootfile "uImage"
AHAV9302> setenv kfaddr 0x60100000
AHAV9302> setenv rfaddr 0x60300000
AHAV9302> setenv kraddr 0xc3000000
AHAV9302> setenv rraddr 0xc2000000
AHAV9302> setenv iraddr 0xc0800000
AHAV9302> setenv bootargs console=ttyAM0,$(baudrate) root=/dev/ram rw initrd=$(iraddr) ip=$(ipaddr):$(serverip):$(gatewayip):$(netmask):$(hostname)::off init=/sbin/init
AHAV9302> setenv bootcmd 'cp.b $(kfaddr) $(kraddr) $(kisize); cp.b $(rfaddr) $(rraddr) $(risize); bootm $(kraddr) $(rraddr)'

AHAV9302> saveenv

기본적인 환경설정을 마친 뒤, uImage와 rImage를 다운로드 한다.
AHAV9302> protect off 0x60100000 0x602fffff
AHAV9302> erase 0x60100000 0x602fffff
AHAV9302> loadb 0xc0000000
kermit으로 램의 0xc0000000에 저장한다.
CTRL를 누른채 \, c 키 두 개를 순서대로 누르면 kermit 명령모드로 빠진다.
3. C-Kermit>send /bin uImage
램으로 uImage파일을 다운로드한다.
4. C-Kermit>connect
Total Size와 시작 주소를 표시해 준다.
이제 램으로 복사를 한다.
5. AHAV9302> cp.b 0xc0000000 0x60100000 $(filesize)
램의 0xc0000000에서 NOR의 0x60100000으로 파일의 크기만큼 복사한다.
AHAV9302> setenv kisize $(filesize)
AHAV9302> protect on 0x60100000 0x602fffff

AHAV9302> protect off 0x60300000 0x606fffff
AHAV9302> erase 0x60300000 0x606fffff
AHAV9302> loadb 0xc3000000
kermit으로 램의 0xc3000000에 저장한다.
CTRL를 누른채 \, c 키 두 개를 순서대로 누르면 kermit 명령모드로 빠진다.
3. C-Kermit>send /bin rImage
램으로 rImage파일을 다운로드한다.
4. C-Kermit>connect
Total Size와 시작 주소를 표시해 준다.
이제 램으로 복사를 한다.
5. AHAV9302> cp.b 0xc3000000 0x60300000 $(filesize)
램의 0xc3000000에서 NOR의 0x60300000으로 파일의 크기만큼 복사한다.
AHAV9302> setenv risize $(filesize)
AHAV9302> protect on 0x60300000 0x606fffff

AHAV9302> saveenv

AHAV9302> iminfo 0x60100000
AHAV9302> iminfo 0x60300000

AHAV9302> reset

정상적으로 리눅스 부팅까지 된다. 성공적이다.

AHAV9302보드의 MCU는 시리얼 다운로드를 지원한다. 그래서 JTAG 장비를 사지않더라도 저렴한 시리얼 케이블로 바이너리파일을 다운로드 할 수 있다.

엄마 몰래 리눅스 포팅강좌에는 u-boot에 대한 다운로드 방법이 간단해서인지 다운로드에 대한 자세한 사항이 없다. 그래서 직접 u-boot를 다운로드 해보기로 하였다.

(아마도 기본적으로 순대국밥님께서 미리 u-boot, uImage, rImage를 미리 다운로드 해놓아서 그런지도 모르겠다)

우선 본인은 VMWARE에서 우분투 9.04에 커널 2.6.28-14-generic를 사용하고 있다. 그리고 USB to SERIAL 컨버터를 사용하여 보드와 연결해서 사용중이다. 초기 다운로드는 랜으로 다운로드 할 수 없고, 무조건 시리얼 다운로드만 사용된다.(물론 JTAG는 제외된다)

기본적으로 설치되어 있는 NOR 메모리의 내용을 지워보기로 한다.

1. $minicom
본인은 USB to SERIAL를 사용하고 있으므로 minicom의 설정을 바꿨다. 우선 USB to SERIAL를 연결하면 자동으로 시리얼 장치로 인식이 되었다. 그리고 $ls /dev|grep USB를 해본 결과 ttyUSB0으로 나타났다. ttyUSB0을 사용하여야 하므로 minicom에서 CTRL-A O를 눌러 설정화면으로 들어간다. 그리고 Serial port setup를 선택하여 설정을 하였다. A - Serial Device에 있는 값을 /dev/ttyUSB0을 변경한다. 그리고 E - Bps/Par/Bits를 선택하면 다시 Speed를 설정할 수 있는데 115200으로 선택한다. 그리고 저장을 하고 설정화면을 빠져나간다. 이로써 기본적인 minicom에 대한 설정은 마쳤다.

보드를 리셋하게 되면 기본적으로 u-boot가 동작을 하게 되고 임베디드 리눅스를 부팅한다. 하지만!! NOR 메모리의 내용을 지우고 처음부터 다운로드하는 과정을 하기로 하였으므로 리셋을 하고 난 뒤 Hit any key to stop autoboot 부분에서 아무키나 눌러서 부팅을 멈추고 u-boot로 들어간다.
2. AHAV9302> protect off 60000000 60ffffff
3. AHAV9302> erase 60000000 60ffffff
u-boot, uImage, rImage부분을 protect on 되어 있으므로 NOR을 지우기 위해 protect를 해제한다. 그리고 NOR 모두를 지운다. 16진수 값으로 저 범위의 값은 0x1000000이다. 이는 16MB의 값을 가지므로 NOR을 모두 보호해제하고 지운다는 뜻이 된다. 이제는 리셋을 해보아도 부팅이 되지 않는다. 왜!! 모두 날라가 버렸기 때문이다.

지금부터 u-boot의 시리얼 다운로드를 해보기로 한다.
http://arm.cirrus.com/files/index.php?path=download/ 에서 Download_1-0-5.tar.gz를 다운로드 받고 압축을 풀자. 하위 디렉토리에 리눅스용 download가 바로 시리얼 다운로드 툴이다.
4. $./download -p USB0 u-boot.bin
본인은 USB to Serial을 사용하므로 -p 옵셥을 붙여서 포트를 따로 설정해주었다. 그리고 u-boot.bin은 당근이 강좌에 있는 u-boot, kernel, ramdisk 이미지입니다라는 글에 있는 base.zip을 받아서 압축을 풀어보면 그 안에 있다.
위의 명령을 실행시키면 USB to Serial 포트를 확인 한 뒤 시리얼 다운로드 모드가 될 때까지 기다리게 된다. 보드에 있는 BOOT버튼을 누르고 /POR버튼을 누른 뒤 떼면 다운로드를 시작한다. 혹시 동작하지 않으면 보드의 전원을 끄고 다시 연결해서 재시도해 본다.

+ Recent posts