처음‎ > ‎

지식기반


Making LoRaWAN Node (draft)

게시자: Sundew Shin, 2017. 3. 9. 오후 2:54











LoRa Setup (draft)

게시자: Sundew Shin, 2017. 2. 20. 오전 5:47   [ 2017. 2. 22. 오전 12:06에 업데이트됨 ]



[TTN]



[Gateway]
MTAC-LORA



RFM95W Module

[Aruino Library]

[Hardware Connection]


8 - DIO0
9 - RESET
10 - NSS
11 - MOSI
12 - MISO
13 - SCK
3.3 - 3.3
GND - GND

[Adafruit Manual]


[Sample Code]



[Actual Code Tested]
The Things Network - 

#include <lmic.h>
#include <hal/hal.h>

static const u1_t NWKSKEY[16] = { 0xA5, 0x93, 0xAB, 0x6D, 0xC8, 0xFB, 0xB0, 0x23, 0xF2, 0x6F, 0x2C, 0xDB, 0x4F, 0xC3, 0x0E, 0x78 };
static const u1_t APPSKEY[16] = { 0x76, 0x75, 0xE8, 0x86, 0x79, 0x10, 0xAF, 0xB8, 0x29, 0xAC, 0x70, 0xA8, 0xEF, 0x2C, 0x65, 0x55 };
static const u4_t DEVADDR = 0x260118E1;

// These callbacks are only used in over-the-air activation, so they are
// left empty here (we cannot leave them out completely unless
// DISABLE_JOIN is set in config.h, otherwise the linker will complain).
void os_getArtEui (u1_t* buf) { }
void os_getDevEui (u1_t* buf) { }
void os_getDevKey (u1_t* buf) { }

static osjob_t sendjob;

// Schedule TX every this many seconds (might become longer due to duty
// cycle limitations).
const unsigned TX_INTERVAL = 20;

// Pin mapping Dragino Shield
const lmic_pinmap lmic_pins = {
    .nss = 10,
    .rxtx = LMIC_UNUSED_PIN,
    .rst = 9,
    .dio = {8, 11, 12},
};
void onEvent (ev_t ev) {
    if (ev == EV_TXCOMPLETE) {
        Serial.println(F("EV_TXCOMPLETE (includes waiting for RX windows)"));
        // Schedule next transmission
        //os_setTimedCallback(&sendjob, os_getTime()+sec2osticks(TX_INTERVAL), do_send);
        delay(100);
        do_send(&sendjob);
    }
}

void do_send(osjob_t* j){
    // Payload to send (uplink)
    static uint8_t message[] = "hi";

    // Check if there is not a current TX/RX job running
    if (LMIC.opmode & OP_TXRXPEND) {
        Serial.println(F("OP_TXRXPEND, not sending"));
    } else {
        // Prepare upstream data transmission at the next possible time.
        LMIC_setTxData2(1, message, sizeof(message)-1, 0);
        Serial.println(F("Sending uplink packet..."));
    }
    // Next TX is scheduled after TX_COMPLETE event.
}

void setup() {
    Serial.begin(115200);
    Serial.println(F("Starting..."));

    // LMIC init
    os_init();

    // Reset the MAC state. Session and pending data transfers will be discarded.
    LMIC_reset();

    // Set static session parameters.
    LMIC_setSession (0x1, DEVADDR, NWKSKEY, APPSKEY);

    // Disable link check validation
    LMIC_setLinkCheckMode(0);

    // TTN uses SF9 for its RX2 window.
    LMIC.dn2Dr = DR_SF9;

    // Set data rate and transmit power for uplink (note: txpow seems to be ignored by the library)
    LMIC_setDrTxpow(DR_SF9,14);

    // Start job
    do_send(&sendjob);
}

void loop() {
    os_runloop_once();
}

RPi: Using KMR-1.8 SPI, 1.8 SPI TFT 128x160

게시자: Sundew Shin, 2017. 2. 3. 오전 1:53   [ 2017. 2. 3. 오전 2:01에 업데이트됨 ]

Wire Connection:

RPiKMR-1.8  
GNDLED-  
+5VLED+  
GPIO8 (CE0)CS via 1K ohm (running at 32MHz)
GPIO11 (CLK)SCL  via 1K ohm
GPIO10 (MOSI)SDA  via 1K ohm
GPIO24A0  via 1K ohm
GPIO25RESET  
+5VVCC  
GND GND  

[Assumption]
- Framebuffer font selection is limited, and you cannot recompile the kernel.
So used xwindow configuration to overcome

[modprobe hook]: /etc/modules-load.d/fbtft.conf
spi-bcm2835
fbtft_device

[auto modprobe during startup]: /etc/modprobe.d/fbtft.conf
options fbtft_device name=sainsmart18

[xwindow for framebuffer]: https://github.com/notro/fbtft/wiki/Framebuffer-use
sudo apt-get install xserver-xorg-video-fbdev

[Small font, non-bold]: ~/.Xresources
xterm*font:     *-fixed-*-*-*-6-*
xterm*boldMode: false

[Rotating]: sudo nano /etc/modprobe.d/fbtft.conf
options fbtft_device name=sainsmart18 rotate=90

[perfect sized xterm]: .xinitrc
xterm -geometry 160x128+0+0

RPi3 대항마, 아수스 '팅커' 출시

게시자: Sundew Shin, 2017. 1. 22. 오후 3:00   [ 2017. 1. 22. 오후 5:49에 업데이트됨 ]

라즈베리 파이(RPi) 출시 후, 수많은 닮은꼴 제품들이 그 커넥터와 홀 위치까지 따라 하며 나오게 되면서, RPi는 이제 명실상부, 싱글보드 컴퓨터(SBC)의 표준으로 자리매김  하게 되었다고 해도 과언이 아닐 것입니다.

첫 출시 후 3년이 지난 2015년 2월에는 누적 판매량이 무려 5백만 개에 이르렀고, 그것도 잠시, 1년반 이 지난 작년 9월 포츈지의 발표에 의하면 그 수량이 이미 천만 개를 넘어섰다고 합니다.

RPi는 이제 더 이상, 일부 만드는 취미가 있는 괴짜들의 전유물이 아닌 전자산업분야에 하나의 거대한 흐름으로 인식되어 가고 있습니다. 얼마 전 일본의 공룡기업인 NEC가 자사가 새로 출시하는 사이너지용 디스플레이 제품에 RPi 컴퓨트 모듈을 꽂을 수 있는 인터페이스를 제공하겠다고 발표하기도 하였습니다.

오늘의 주인공인 아수스는, 레노버, HP, 델에 이어, 세계 4번째로 가장 큰 PC 메이커인데요, 이런 아수스가 RPi 닮은 꼴인 'ASUS Tinker Board (90MB0QY1-M0EAY0)'를 오늘 새롭게 출시하였습니다. 사진에서 보듯 뛰어난 제작품질과 40핀 헤더의 각 핀을 용도에 따라 컬러 코딩하는 등 사용자를 위한 세심한 배려가 제일 처음 눈길을 끕니다.


먼저 가장 궁금하실 가격 정보 안내해 드립니다.
제품을 주문할 수 있는 Farnell 사이트에 의하면, 이 글을 쓰고 있는 현재, 판매가는 $57입니다. 같은 페이지에서 12시간쯤 전에 확인했을 때는 $68이었는데 그 사이에 환율 변동으로 보기에는 너무 큰 변화가 있었네요. 아마도 아직 확정가가 나와 있지는 않은 것 같습니다.

다음은 제품의 기술 사양입니다.


  • 쿼드(4) 코어 1.8GHz ARM Cortex-A17 CPU
  • GPU: ARM Mali-T764, OpenGL ES1.1/2.0/3.0, OpenVG1.1, OpenCL, DirectX11 지원
  • 디스플레이: 1x HDMI, H264 4K 디코딩 지원
  • 2GB 듀얼(2) 채널 LPDDR3 메모리
  • 기가 랜과 블루투스 4.0 + EDR
  • 802.11 b/g/n 와이파이
  • 4x USB 2.0 포트
  • 40핀 해더와 28개의 GPIO
  • PWM과 S/PDIF 1x 2핀 컨텍포인트
  • 1x 3.5mm 오디오잭 (RTL HD 코덱)
  • CSI 카메라 포트
  • DSI HD급 디스플레이 포트
  • 4K 화상을 지원하는 1x HDMI 2.0 포트
  • UHS-I를 지원하는 마이크로 SD 카드 포트 
  • OS: 데비안과 코디(KODI) 지원
  • 전원: 5V/ 2A 마이크로 USB (미포함) 

RPi3와 나란히 성능을 비교한 자료도 공개되었는데요,


사실 새롭게 출시하는 닮은 꼴들이 이처럼 단순 비교 결과를 내놓는 일이 이번이 처음은 아닙니다.
물론 우리는 이제 SBC를 하드웨어 성능만을 가지고 비교하는 데에 한계가 있다는 것을 잘 알고 있습니다. 다름 아닌 소프트웨어인 운영체제의 지원과 같은 부분이 간과되어 있기 때문이죠.

대부분 닮은꼴 제품들의 한계는 아직 그 소프트웨어 지원이 완전하지 않고 이를 보완해 줄 열정적인 커뮤니티의 형성이 부족하다는 점입니다. 즉 문제에 직면하면 물어볼 곳 없이 스스로 답을 찾아야 한다는 뜻인데요, 이런 부분이 그들의 성공에 가장 큰 걸림돌로 작용되고 있습니다.

RPi의 경우 하드웨어와 단짝을 이룬 Raspbian의 지속적인 재단의 개발 노력과 이를 지원사격하는 전 세계의 수많은 커뮤니티들이 존재하고 있기 때문에, 당분간은 'SBC 일인자'라는 타이틀을 쉽게 내어 줄 것 같지 않습니다. 열정적인 커뮤니티의 유무야말로 바로 성공의 열쇠인 것 같습니다.

비록 일부 사람들은 아류작이라 폄하할지 모르겠습니다만 우리는 RPi에 비교가 되는 이와 같은 신제품들의 출시를 늘 환영합니다.

그 이유는 RPi가 더 좋은 제품으로 나아가는 데에 일종의 페이스메이커 역할을 해주고 있다고 믿기 때문입니다.

자료출처: http://www.slideshare.net/NiyaziSARAL/asus-tinker-board

Pagekite, 공인IP 없이 외부에서 RPi 접속 하기

게시자: Sundew Shin, 2016. 12. 1. 오전 8:26   [ 2016. 12. 2. 오전 11:09에 업데이트됨 ]





새로 RPi를 홈네트웍에 연결 시킨 후 외부에서 원격접속(SSH 등) 할 수 있는 방법을 소개 합니다.
공유기나 방화벽 등, 기타 다른 설정 없이 해당 RPi에서만 필요한 설정을 하면 그만이니 이용이 간단합니다.

같은 방법으로 웹서버 나 기타 서버를 운영 할 수도 있는데, 이 글의 초점은 그 원격에서의 연결성에 있고, RPi가 서버 용도로 적합한지에 대한 논의는 따로 하지 않을 생각입니다. 관련해서는 'RPi.서버' 게시판 그룹을 참고 해 주세요.

다음은 약간의 배경설명이고 필독 사항은 아니니 1단으로 바로 점프하셔도 좋습니다.

비교해서 볼때, DynDNS (Dynamic DNS)류는 동적으로 할당 되는 임시 공인IP에 사용자가 원하는 도메인네임을 연결 해 주는 서비스입니다. 인터넷 서비스 공급자 (ISP)가 서버 호스팅을 위한 포트를 따로 막거나 트래픽 제한 같은 것을 하지 않는다는 전제조건 아래서 서버 호스팅을 가능하게 해줍니다. 일부 ISP는 심지어 할당 데이터 트레픽량이 넘으면 인터넷 속도를 낮추는 등 패널티를 가하는 경우도 있죠!
Pagekite는, reverse proxy 기술로, 이와 같은 터널링 기법은 공인이든 사설 IP 든, 상관없이 단말 (RPi)에 인터넷만 연결이 된다면 외부에서 접속이 가능하도록 준비 해 줍니다. ISP로 부터 부여 되는 임시 공인 IP가 인터넷공유기에 할당 되고 RPi가 사설 (로컬) IP를 받아 사용하는 일반적인 가정 환경이나 소규모 로컬 네트웍에서 사용이 적합 합니다. Pagekite는 서비스를 제공하는 클라이언트에서 설정이 가능하므로 변경/관리가 편하고 기타 방화벽 규칙 등 제약 조건이 없습니다.
홈네트웍에서 인터넷공유기가 RPi를 DMZ로 할당하든 아니면 외부로 특정 서비스 (예: 웹호스팅용 80)를 열기 위해 포트포워딩 (port forwarding) 같은 것을 사용하기도 하지만, 단말측 (RPi)이 아닌 공유기에서 설정을 매번 바꿔줘야 하는 번거러움이 있고, 무엇보다, 앞에서 서술한 ISP에 의한 제약 조건이 있다면 무용지물이 됩니다. 혹시 포고플러그 (pogoplug.com) 서비스를 기억하시는 분이 있다면 그것과 비슷한 프로그램이라고 이해하시면 쉬울 것 같습니다.

'reverse proxy'는 서버쪽에서 구현된 자료 전달 기술입니다. 단말(클라이언트)로 부터 자료가 요청되는 행태 (context)에 따라 그 요청을 어느 백엔드(backend) 호스트에 연결 해 줄지를 결정하고 조율 합니다. 반대로 우리가 보통 프록시라고 부르는 것은 'forward proxy'를 말하고, 이것은 단말측에 구현된 기술이고 접속위치를 숨기거가 반복 요청되는 컨텐츠에 대한 로컬 캐싱 등의 목적으로 사용합니다.
벌써 오래전에 오드베리님이 reverse proxy의 개념에 대한 글을 올려 주신적이 있습니다. 참고 하시라고 좌표 남깁니다. http://cafe.naver.com/pipc/14029



1단: Pagekite.me 이용

이 방법은 가장 손쉬운 것으로 pagekite가 내게 도움이 되는 툴인지를 10분안에 판단 할 수 있도록 도와 줄 것입니다.
무료이지만, 기간/데이터량에 제한이 있다는 단점이 있습니다.  사용법은 다음과 같습니다:

  1. RPi에 로그인 합니다. 자신이 파일을 쓰고 지울 수 있는 폴더로 이동 해서,

  2. PageKite 클라이언트를 다운로드 합니다.
    wget https://pagekite.net/pk/pagekite.py

  3. 다운받은 파일에 필요한 실행권한을 준 다음,
    chmod +x pagekite.py

  4. 실행합니다. 자신이 원하는 호스트이름을 정해서 아래와 같이 실행 시키면 됩니다. (예: pipc.pagekite.me)
    ./pagekite.py pipc.pagekite.me

  5. 입력: Y


  6. 입력: 메일확인이 가능한 이메일


  7. 그러면 잠시후에 아래와 같이 활성화 링크를 포함한 안내 이메일이 옵니다. 링크를 눌러 계정을 활성화 합니다.


  8. 입력: Y (계정 활성화 후)


  9. 그럼 다음과 같이 '연이 난다' 라는 성공 메시지와 함께 'http://localhost'가 이제 'http://pipc.pagekite.me'로 외부에서 접속이 가능하다는 안내가 표시 됩니다.

    참고로, 'Ctrl+C'를 누르지 않는 한 이 서비스는 계속 이뤄집니다.

  10. 원격에서 접속 해 보고 확인되면 성공. 끝.

따로 돈을 내지 않으면 시험판 (trial) 라이센스가 할당 되고 위에 메시지 처럼 31일동안 2.5 GB의 데이터 전송이 허락 됩니다. RPi 뿐만아니라 Windows를 포함한 대부분의 OS도 지원해 주는데 각 운영체제별 안내는 http://pagekite.net/downloads를 참고하시기 바랍니다.

[주의]
생각 하고 넘어가야 할 점은 'root' 권한 없이 이 모든 작업이 이뤄졌다는 사실입니다. 방화벽 안에 있다고 민감한 정보를 무신경하게 로컬 웹서버에 올려 댔다가, 사용자중 한사람이 이렇게 '연을 날려' 외부로 http포트를 열어 버리면, 중간에 어떤 보안장치도 무용지물이 되버린 다는 사실을 잊지 말아야 하겠습니다.



2단: 내 Pagekite 서버 만들기

앞서 본 pagekite.me 사이트와 같은 유료 서비스들은 많이 있는데, pagekite가 특별한 이유는 자신이 직접 그 서버를 운영할 수 있다는 점입니다. 이미 데비안 리눅스 (= 라즈비안)에 포팅이 되어 있어 apt-get으로 소스 추가 없이 간단히 설치할 수 있어 더욱 편리합니다.

이를 위해 먼저 필요한 것은 자신이 root권한이 있고 공인 IP로 인터넷에 연결 되어 있는 서버입니다.
이 글에서 우리는 예로 'i.wednus.com'이라는 도메인 이름이 달린 데비안 리눅스 서버를 사용하겠습니다.

  1. 먼저 pagekite를 설치 할 서버에 로그인 합니다. 그리고,

  2. Pagekite 페키지를 설치합니다.
    sudo apt-get install pagekite

  3. 다음과 같이 실행 시키면 되는데 '암호'라고 된 부분은 RPi가 접속할 때 사용하게 될 암호를 말합니다.
    pagekite
     --clean --isfrontend --ports=12345 --domain=http,https,raw:*.i.wednus.com:암호
     --rawports=virtual

    이 명령줄의 의미를 풀어 보면,
    "명령줄의 설정만은 읽어서 (--clean) 프로그램을 실행하고, 너는 지금부터 서버다 (--isfrontend), 그리고, 우회 경유하는 포트는 12345 이고, http, https, raw(임의) 포트 서비스를 지원 하고 (--domain), 연결되는 단말 (RPi)들은 'i.wednus.com'으로 끝나는 도메인 이름이 주어 지고, 접속을 위해 '암호'가 필요하며, raw포트는 실제가 아닌 가상이다."

    실행했을때 다음 화면과 같이 'backend의 접속을 기다린다'고 나오면 준비가 끝난 것입니다.



3단: 내 Pagekite 서버 이용

1단에서 했듯이 'pagekite.py'를 다운 받아 사용할 수도 있지만, 이번에는 pagekite 패키지를 설치하는 방법을 사용 해 보겠습니다. 프로그램 설치가 필요한 만큼 여기서는 'root' 권한이 필요합니다.

  1. RPi에 로그인 합니다.

  2. 서버를 만들때와 똑같은 방법으로 pagekite 패키지를 설치합니다.
    sudo apt-get install pagekite

  3. 명령줄에서 다음과 같이 실행합니다. '암호'는 서버에서 설정했던 암호를 넣습니다.
    밑에는 이해가 쉽도록 명령줄을 여러라인으로 나눴지만 이렇게 해도 좋고 아니면 각줄끝에 '\' 문자 없이 한줄로 죽 붙여서 입력해도 됩니다.

    sudo pagekite --clean --frontend=i.wednus.com:12345 \
    --service_on=http:w.i.wednus.com:localhost:80:
    암호 \
    --service_on=https:w.i.wednus.com:localhost:10000:
    암호 \
    --service_on=raw/22:w.i.wednus.com:localhost:22:
    암호

  4. 지금까지 실수가 없었다면 1단 후미에 보였던 화면 처럼 내 pagekite 서버에 접속해서 연이 날아 오를 것입니다.

  5. 원격에서 접속 해 보고 성공하면 끝.

잘 동작 되는게 확인 되면 이제 다음 단에서 서비스로 등록 해서 항상 연결 되도록 사용 할 수 있습니다.



4단: 항상 실행 시키기

앞서 본 것 처럼 명령줄에서 필요할 때 마다 서비스를 외부로 열 수 있지만, 항상 열어 두기를 원한다면 자동실행 서비스로 등록시키는 것이 편리합니다.

[서버쪽 작업]

  1. 내 Pagekite 서버에 접속합니다.

  2. 지금 부터 설정파일을 변경 해 주는데,
    sudo nano /etc/pagekite.d/10_account.rc

  3. 아래와 같이 'abort_not_configured'줄을 지우거니 '#'을 앞에 붙여서 주석 처리 시켜 줍니다.
    참고로 이것은 root 설정전에 실행되는 것을 막는 보호장치입니다.


  4. 다음은 '20_frontends.rc'을 변경합니다. 
    sudo nano /etc/pagekite.d/20_frontends.rc

  5. 여기서는 접속할 대상과 연결할 서비스를 정의 하는데요, 이해를 위해 앞서 3단에서 명령줄로 입력했던 설정을 똑같이 내용으로 설정파일을 변경 해 보겠습니다. 역시 여기서 빨간 빈칸은, 단말이 접속 해 올때 사용 할 암호를 넣는 곳입니다.


  6. 편집기에서 나와서 pagekite 서비스를 재실행 시키면 준비 끝.
    sudo /etc/init.d/pagekite restart

[단말(RPi) 쪽 작업]

여기서 부터의 RPi에서 하는 작업입니다.
pagekite 프로그램은 서버나 클라이언트로도 동작할 수 있기 때문에 '20_frontends.rc' 파일에서 설정하는 방법만 다릅니다. 그러니 위의 단계와 헛갈리시면 안됩니다.

  1. 서버쪽 작업과 동일하게 '10_account.rc'를 열어 해당줄을 주석 처리 해줍니다.
    sudo nano /etc/pagekite.d/10_account.rc

  2. 다음으로 '20_frontends.rc'을 변경합니다.
    sudo nano /etc/pagekite.d/20_frontends.rc

  3. 앞단에서 했듯이 여기서도 http, https, ssh 서비스를 요청하는 설정을 해 줍니다.


  4. 편집이 끝났으면 나와서 pagekite 서비스를 재실행 시킵니다.
    sudo /etc/init.d/pagekite restart

  5. 대략 1~2분 내에 연결이 이뤄지고, 이제 원격지에서 RPi로 연결 이 가능 해 집니다.
    http://w.i.wednus.com:12345  -> 실제로는 RPi의 http://localhost:80 으로 연결
    https://w.i.wednus.com:12345  -> RPi의 https://localhost:10000 으로 연결

SSH의 연결은 프록시(proxy) 설정이 필요하므로 조금 더 설명이 필요한데 다음 단에서 Putty로 손쉽게 접속 하는 방법을 소개 하겠습니다.

[요청]
혹시 위와 같이 경유포트를 일일이 명시 해 주지 않아도 그냥 주소창에:
http://w.i.wednus.com나 https://w.i.wednus.com로 쳐서도 접속할 수 있는 방법을 아시면 공유 부탁 드립니다.
아파치의 URL_Rewrite 모듈을 쓰는 생각도 들지만 웹 이외에 서비스 호스팅에도 적용을 하려면 그것도 한계가 있는것 같습니다..



5단: 원격에서 SSH 접속

이제 우리집에서 열심히 연을 날리고 있는 RPi에 SSH 접속하는 방법을 안내 합니다.
앞단에서 작업에 실수가 없었다면 내 RPi는 이제 'w.i.wednus.com'라는 도메인 이름으로 접속을 기다리고 있을 것입니다. 이것을 Putty의 HTTP 프록시 설정 기능으로 접속 가능한데, 다음은 설정창의 모습입니다.



위와 같이 설정 하고 저장(!) 한 후 실행 해서 아래와 같이 로그인이 확인 되면 끝.

수고 하셨습니다.



말단: 맺는 글

끝까지 읽어 주셔서 감사합니다.
많은 분들께 유용한 정보였기를 바라며, 불충분하거나 잘못 된 내용이 있으면 지적 부탁 드립니다.

2. ICSP 10-to-8 Conversion and Programming Arduino Bootloader

게시자: Sundew Shin, 2015. 2. 26. 오후 8:30   [ Sundew Shin에 의해 업데이트됨(2016. 12. 6. 오후 6:38) ]

OLIMEX AVR-ISP-MKII porvides 10-pin ICSP while the most Arduino board has 6 pin ICSP. We need a converter.
Check out the pinout for the both 6-pin and 10-pin.

Something as simple as this:


Now connect to an Arduino compatible board:


On AVR Studio: select the menu, 'Tools>Device Programming'
Make sure the 'ISP Clock' speed is not too fast, or you will not get the device information.

[UPDATE 12/5/16]
MUST: Make sure you click 'Set' to apply, even for the default 125kHz.


Select a bootloader for the device of choice and program.


Last step: change the fuse register value as:
  • EXTENDED: 0xFD
  • HIGH: 0xDE
  • LOW: 0xC2

Congratulations!
You can disconnect AVR-ISP-MKII from the arduino board and program the chip using the Arduino IDE.


[Tip]
You can make a plug for Attiny85 (8-pin) programming.

  
  

ex) On-dev-board programming

1. Preparing OLIMEX AVR-ISP-MKII for AVR Studio

게시자: Sundew Shin, 2015. 2. 26. 오후 7:42   [ 2015. 2. 26. 오후 7:46에 업데이트됨 ]

Get the latest libusb for Windows @ http://sourceforge.net/projects/libusb-win32/files/
  • The win32 version will support win64 OS also.

Use the device driver wizard and install the driver.





Now the device is ready to be accessed by AVR Studio.

ESP8266

게시자: Sundew Shin, 2015. 2. 18. 오전 1:27   [ 2015. 2. 21. 오전 12:09에 업데이트됨 ]

[monkey.lua]
pin=3
port=88
hz=50 -- 50 Hz for MG90S (Tower Pro)
delay=200000 -- movement delay
pause=400000 -- pause between crash

pwm.setup(pin,hz,68)
pwm.start(pin)
tmr.delay(delay) -- 200ms
-- prepare button
gpio.write(4,gpio.LOW)
gpio.mode(4,gpio.INPUT,gpio.FLOAT)

function clapping(numClap)
  for i = 1, numClap, 1 do
    if gpio.read(4) == 1 then break end 
    pwm.setup(pin,hz,88)
    pwm.start(pin)
    tmr.delay(delay) -- 200ms
    pwm.setup(pin,hz,68)
    pwm.start(pin)
    tmr.delay(pause) -- 200ms
  end
  gpio.write(4,gpio.LOW)
  pwm.close(pin)
end

wifi.setmode(wifi.STATION)
wifi.sta.config("","")

srv=net.createServer(net.TCP) srv:listen(80,function(conn)
conn:on("receive",function(conn,payload)
  --next row is for debugging output only
  print(payload)

  function ctrlpower()
    dotaz=string.sub(payload,kdesi[2]+1,#payload)
    print(dotaz)
    if dotaz~=nil then clapping(dotaz)end  
  end

  --parse position POST value from header
  kdesi={string.find(payload,"pwmi=")}
  --If POST value exist, set LED power
  if kdesi[2]~=nil then ctrlpower()end

  conn:send('HTTP/1.1 200 OK\n\n')
  conn:send('<!DOCTYPE HTML>\n')
  conn:send('<html>\n')
  conn:send('<head><meta  content="text/html; charset=utf-8">\n')
  conn:send('<title>Clock Monkey</title></head>\n')
  conn:send('<body><h1>Clock Monkey control</h1>\n')
  conn:send('<form action="" method="POST">\n')
  conn:send('<input type="submit" name="pwmi" value="1">\n')
  conn:send('<input type="submit" name="pwmi" value="2">\n')
  conn:send('<input type="submit" name="pwmi" value="3">\n')
  conn:send('<input type="submit" name="pwmi" value="4">\n')
  conn:send('</body></html>\n')
  conn:on("sent",function(conn) conn:close() end)
  end)
end)




[init.lua]
print("Attempting to obtain IP...")
tmr.alarm(1,5000, 1, function() 
    if wifi.sta.getip()==nil then 
        print("Connection Failed.") 
    else 
        print("Connected: "..wifi.sta.getip()) 
        tmr.stop(1) 
    -- further code could go here

conn=net.createConnection(net.TCP, 0) 
conn:on("connection",function(conn, payload)
            conn:send("HEAD / HTTP/1.1\r\n".. 
                      "Host: google.com\r\n"..
                      "Accept: */*\r\n"..
                      "User-Agent: Mozilla/4.0 (compatible; esp8266 Lua;)"..
                      "\r\n\r\n") 
            end)            
conn:on("receive", function(conn, payload)
    print(string.sub(payload,string.find(payload,"Date: ")
           +6,string.find(payload,"Date: ")+35))
    print('(retrieved in '..((tmr.now()-t)/1000)..' milliseconds from Google.)')
    conn:close()
    end) 
t = tmr.now()    
conn:connect(80,'google.com')

    end 
end)

 


[servor.lua]

pin=4
port=88
hz=50 -- 50 Hz for MG90S (Tower Pro)

srv=net.createServer(net.UDP)
srv:on("receive", function(srv, position)
    pos=tonumber(position)
    if(pos == nil) then pos=72 end
    if(pos<35) then pos=35 end
    if(pos>110) then pos=110 end
    -- cheap ones required to be adjusted 
    print("[35=+90 72=0 110=-90]:", pos)
    pwm.setup(pin,hz,pos)
    pwm.start(pin)
    tmr.delay(200000) -- 200ms
    pwm.close(pin) 
end)
srv:listen(port)

XBEE-RS485 Comm

게시자: Sundew Shin, 2015. 1. 28. 오후 3:29   [ 2015. 2. 3. 오전 8:49에 업데이트됨 ]

XBEE <-> A:SoftwareSerial <-> A:UART <-> MAX485 <-> RS485


#include <SoftwareSerial.h>
#define xbee_rx 10
#define xbee_tx 11

SoftwareSerial xbee(xbee_rx, xbee_tx);

void setup(){
  pinMode(xbee_rx, INPUT);
  pinMode(xbee_tx, OUTPUT);
  xbee.begin(9600);
  xbee.println("Hello, xbee");
  
  Serial.begin(9600);
  Serial.println("Hello, rs");
}

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



XBEE <-> MAX485 <-> RS485










Tracker Controller <-> RS485 <-> Wireless (ZigBee) <-> RS485 <-> SCADA

#
include <Wire.h> #include <SoftwareSerial.h> #include <MPU6050.h> SoftwareSerial xbee(10, 11); static const unsigned char req[]= {0x02, 0x00, 0x00, 0x01, 0x0A, 0x63, 0x06, 0x20, 0x00, 0x00, 0x00, 0xEC, 0xC3, 0x03}; void setup(){ xbee.begin(9600); // Initialize the 'Wire' class for the I2C-bus. Wire.begin(); // Clear the 'sleep' bit to start the sensor. MPU6050_write_reg (MPU6050_PWR_MGMT_1, 0); // Initialize the RS485; The dip switch should be on right pos. Serial.begin(9600); } void loop(){ // print MPU6050 data to a SoftwareSerial printGyro(xbee); // request tracker status info (broadcast) Serial.write(req, 14); // give some time to respond delay(500); // write to xbee when there is RS485 message in. while(Serial.available()){ xbee.print(Serial.read(), HEX); xbee.print(F(" ")); } // time delay delay(500); // line feed xbee.println(F("")); }





Tracker Controller <-> RS485 <-> Wireless (ZigBee) <-> RPi <-> Cloud

Tracker Controller <-> RS485 <-> Wireless (ZigBee) <-> RPi <-> Cloud

Tracker+Sensors <-> Arduino <-> Wireless (ZigBee) <-> RPi <-> Cloud






이용가능성

게시자: Sundew Shin, 2011. 8. 10. 오전 1:21   [ Sundew Shin에 의해 업데이트됨(2015. 2. 22. 오전 12:03) ]

이용가능성 (Availability)

 이용가능성이란 기준 시간동안 대상 시스템이 정상동작할 확률(Probability)을 말한다. 여기서 중요한 사실은, 이 이용가능성만 계산 해 내면 대상 시스템들중 어떤 것이 더 안정적이고 Fault-tolerant 한가를 결정 해 낼 수 있다는 것이다. 간단하다.[1] [2]
우선 이 이용가능성을 구하는 계산식에는 MTBF와 MDT라는 다소 생소한 용어가 나오는데 내용은 별것 없고 다음과 같이 간단히 설명 될 수 있다.




  위 그림은 MTBF (Mean Time Between Failures)를 나타내고 있는데, 이는, System failure 사이의 system uptime의 평균. 다시 말해서, 시스템이 끊임 없이 동작한 시간들의 평균이다. 상대적으로 MDT (Mean Down Time)는 MTTR (Mean Time To Repare)이라고도 하는데, 간단히 시스템이 정지된 시간들의 평균이다.
예제를 하나 풀어 보면 간단히 이해 될 것 같다. 아래는 00:00부터 기록된 예제 시스템의 운영로그 일부이다:
00:00 - 00:09 (9초간 정상 동작, 00:09에 system failure 발생)
00:09 - 00:10 (1초간 시스템 복구, 00:10에 정상화)
00:10 - 00:21 (11초간 정상 동작, 00:21에 system failure 발생)
00:21 - 00:23 (3초간 시스템 복구, 00:23에 정상화)
00:23 - 00:33 (10초간 정상 동작, 00:33에 system failure 발생)
  이 시스템의 경우, MTBF 계산식은 다음과 같다:  (9 + 11 + 10) / 3 = 10,
그러면 MDT는: (1 + 3) / 2 = 2, 그래서, 이 시스템의 MTBF는 10초이고, MDT는 2초가 된다.
이에 시스템이 정상적으로 작동할 확률, 즉, 이용가능성은 MTBF/(MTBF + MDF) * 100%
계산을 하면 위 시스템의 이용가능성은 10/(10 + 2) * 100% = 83.3, 즉, 83.3%가 된다.

1-10 of 44