처음 >
지식기반
LoRa Setup (draft)
https://www.thethingsnetwork.org/forum/t/connecting-arduino-with-rfm95-to-ttn-via-multitech-aep/5557 [TTN] [Gateway] MTAC-LORA [Aruino Library] [Hardware Connection] [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
Wire Connection:
[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 대항마, 아수스 '팅커' 출시
라즈베리 파이(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이었는데 그 사이에 환율 변동으로 보기에는 너무 큰 변화가 있었네요. 아마도 아직 확정가가 나와 있지는 않은 것 같습니다. 다음은 제품의 기술 사양입니다.
RPi3와 나란히 성능을 비교한 자료도 공개되었는데요, 사실 새롭게 출시하는 닮은 꼴들이 이처럼 단순 비교 결과를 내놓는 일이 이번이 처음은 아닙니다. 물론 우리는 이제 SBC를 하드웨어 성능만을 가지고 비교하는 데에 한계가 있다는 것을 잘 알고 있습니다. 다름 아닌 소프트웨어인 운영체제의 지원과 같은 부분이 간과되어 있기 때문이죠. 대부분 닮은꼴 제품들의 한계는 아직 그 소프트웨어 지원이 완전하지 않고 이를 보완해 줄 열정적인 커뮤니티의 형성이 부족하다는 점입니다. 즉 문제에 직면하면 물어볼 곳 없이 스스로 답을 찾아야 한다는 뜻인데요, 이런 부분이 그들의 성공에 가장 큰 걸림돌로 작용되고 있습니다. RPi의 경우 하드웨어와 단짝을 이룬 Raspbian의 지속적인 재단의 개발 노력과 이를 지원사격하는 전 세계의 수많은 커뮤니티들이 존재하고 있기 때문에, 당분간은 'SBC 일인자'라는 타이틀을 쉽게 내어 줄 것 같지 않습니다. 열정적인 커뮤니티의 유무야말로 바로 성공의 열쇠인 것 같습니다. 비록 일부 사람들은 아류작이라 폄하할지 모르겠습니다만 우리는 RPi에 비교가 되는 이와 같은 신제품들의 출시를 늘 환영합니다. 그 이유는 RPi가 더 좋은 제품으로 나아가는 데에 일종의 페이스메이커 역할을 해주고 있다고 믿기 때문입니다. 자료출처: http://www.slideshare.net/NiyaziSARAL/asus-tinker-board |
Pagekite, 공인IP 없이 외부에서 RPi 접속 하기
새로 RPi를 홈네트웍에 연결 시킨 후 외부에서 원격접속(SSH 등) 할 수 있는 방법을 소개 합니다. 공유기나 방화벽 등, 기타 다른 설정 없이 해당 RPi에서만 필요한 설정을 하면 그만이니 이용이 간단합니다. 같은 방법으로 웹서버 나 기타 서버를 운영 할 수도 있는데, 이 글의 초점은 그 원격에서의 연결성에 있고, RPi가 서버 용도로 적합한지에 대한 논의는 따로 하지 않을 생각입니다. 관련해서는 'RPi.서버' 게시판 그룹을 참고 해 주세요. 다음은 약간의 배경설명이고 필독 사항은 아니니 1단으로 바로 점프하셔도 좋습니다.
1단: Pagekite.me 이용 이 방법은 가장 손쉬운 것으로 pagekite가 내게 도움이 되는 툴인지를 10분안에 판단 할 수 있도록 도와 줄 것입니다. 무료이지만, 기간/데이터량에 제한이 있다는 단점이 있습니다. 사용법은 다음과 같습니다:
따로 돈을 내지 않으면 시험판 (trial) 라이센스가 할당 되고 위에 메시지 처럼 31일동안 2.5 GB의 데이터 전송이 허락 됩니다. RPi 뿐만아니라 Windows를 포함한 대부분의 OS도 지원해 주는데 각 운영체제별 안내는 http://pagekite.net/downloads를 참고하시기 바랍니다. [주의]
2단: 내 Pagekite 서버 만들기 앞서 본 pagekite.me 사이트와 같은 유료 서비스들은 많이 있는데, pagekite가 특별한 이유는 자신이 직접 그 서버를 운영할 수 있다는 점입니다. 이미 데비안 리눅스 (= 라즈비안)에 포팅이 되어 있어 apt-get으로 소스 추가 없이 간단히 설치할 수 있어 더욱 편리합니다. 이를 위해 먼저 필요한 것은 자신이 root권한이 있고 공인 IP로 인터넷에 연결 되어 있는 서버입니다. 이 글에서 우리는 예로 'i.wednus.com'이라는 도메인 이름이 달린 데비안 리눅스 서버를 사용하겠습니다.
3단: 내 Pagekite 서버 이용 1단에서 했듯이 'pagekite.py'를 다운 받아 사용할 수도 있지만, 이번에는 pagekite 패키지를 설치하는 방법을 사용 해 보겠습니다. 프로그램 설치가 필요한 만큼 여기서는 'root' 권한이 필요합니다.
잘 동작 되는게 확인 되면 이제 다음 단에서 서비스로 등록 해서 항상 연결 되도록 사용 할 수 있습니다. 4단: 항상 실행 시키기 앞서 본 것 처럼 명령줄에서 필요할 때 마다 서비스를 외부로 열 수 있지만, 항상 열어 두기를 원한다면 자동실행 서비스로 등록시키는 것이 편리합니다. [서버쪽 작업]
[단말(RPi) 쪽 작업] 여기서 부터의 RPi에서 하는 작업입니다. pagekite 프로그램은 서버나 클라이언트로도 동작할 수 있기 때문에 '20_frontends.rc' 파일에서 설정하는 방법만 다릅니다. 그러니 위의 단계와 헛갈리시면 안됩니다.
SSH의 연결은 프록시(proxy) 설정이 필요하므로 조금 더 설명이 필요한데 다음 단에서 Putty로 손쉽게 접속 하는 방법을 소개 하겠습니다. [요청] 혹시 위와 같이 경유포트를 일일이 명시 해 주지 않아도 그냥 주소창에: 5단: 원격에서 SSH 접속 이제 우리집에서 열심히 연을 날리고 있는 RPi에 SSH 접속하는 방법을 안내 합니다. 앞단에서 작업에 실수가 없었다면 내 RPi는 이제 'w.i.wednus.com'라는 도메인 이름으로 접속을 기다리고 있을 것입니다. 이것을 Putty의 HTTP 프록시 설정 기능으로 접속 가능한데, 다음은 설정창의 모습입니다. 위와 같이 설정 하고 저장(!) 한 후 실행 해서 아래와 같이 로그인이 확인 되면 끝. 수고 하셨습니다. 말단: 맺는 글 끝까지 읽어 주셔서 감사합니다. 많은 분들께 유용한 정보였기를 바라며, 불충분하거나 잘못 된 내용이 있으면 지적 부탁 드립니다. |
2. ICSP 10-to-8 Conversion and Programming Arduino Bootloader
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. 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:
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
Get the latest libusb for Windows @ http://sourceforge.net/projects/libusb-win32/files/
Use the device driver wizard and install the driver. |
ESP8266
[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
이용가능성
이용가능성 (Availability) 위 그림은 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 발생)이 시스템의 경우, 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