ITS's Dev Story


어제 University of California에서 진행하는 Introduction to the Internet of Things and Embedded Systems 강의를 수료하였다.


강좌는 4주로 이루어져 있다.


Week 1 수업에서는 IoT 기본적인 소개와 Example Refrigerator 예로 들어 설명한다. 그리고 IoT 트렌드, 장단점을 소개하며 과제로는 하나의 IoT 디바이스를 정해서 디바이스의 IoT 기능을 조사하고, 디바이스에 IoT 기술이 적용되었을 때와 적용되지 않았을 때를 비교분석, IoT 추가되어 생기는 단점, 보안 개인정보 문제를 담은 에세이를 작성한다.



모든 Coursera 강좌의 과제들이 취하는 방식인 동료 평가를 사용하며, 이 학생은 공기청정기를 비교분석한 에세이를 수행한 것을 볼 수 있다.


Week 2에서는 임베디드 시스템/아날로그, 디지털 Conversion 대한 개론적인 강의를 하며, 센서와 액츄에이터에 대해 공부하고 실습하는 시간을 갖는다.





Week 3에서부터 어려운 내용을 공부하는데, Hardware/Software, Microcontroller, Operating System 심화된 내용을 학습한다. Week 3 과제는 

  1. 마이크로컨트롤러 2개를 선택해 사양이나 주파수, 개수 등을 비교분석하고, ( 나는 ATMEGA328, ATMEGA128 비교분석 하였다.)
  2. 아두이노와 라즈베리 파이 플랫폼에 적용된 OS 분석하는 과제였다.




내가 작성한 과제물의 동료평가 결과이다.


Week 4에서는 WAN, LAN, Internet Structure, Protocol, TCP/IP, MANET, Packet Capture 네트워크에 관한 내용을 공부한다. 여기서 주어지는 마지막 과제는 쉬우면서도 어려웠는데, Wireshark 설치하여 (www.newyorktimes.com) 웹사이트에 들어가 HTTP 패킷을 찾는 과제였다.


임베디드에 대한 이론 파트와 네트워크/OS에 관한 심화적인 강의를 들을 수 있어 좋은 수업이었던 것 같다.

Coursera 강의들이 그렇듯이, 일주일에 한번씩 Quiz와 Assignment가 쏟아진다. 힘들지만 과제를 수행하면서 내 지식이 더 느는 것 같아 기분이 좋다.


이 강의가 끝나자마자 바로 난 두번째 강의인 The Arduino Platform and C Programming을 수강신청하였다.





어떤 자연수 n이있을때 d(n) n 자릿수 숫자들과 n자신을 더한 숫자라고 정의한다.


예를 들어 d(91)=9+1+91=101


이때, n d(n) 제네레이터(generator)라고 한다위의 예에서 91 101의 제네러이터이다


어떤 숫자들은 하나 이상의 제네레이터를 가지고 있는데, 101의 제네레이터는 91 아니라 100 있다.  그런데 반대로, 제네레이터가 없는 숫자들도 있으며, 이런 숫자를 인도의 수학자 Kaprekar 셀프 넘버(self-number) 이름 붙였다예를 들어 1,3,5,7,9,20,31 셀프 넘버들이다


이제 문제를 내겠다. 1 이상이고 5000보다 작은 모든 셀프 넘버들의 합을 구하는 프로그램을 작성하라

문제는 게임 회사인 넥슨의 입사문제라고 알려진 문제들 제일 쉬운 것이다.



6. 2진수 변환, 진법 변환

14 2진법으로 고칠 어떤 과정을 거칠까?

14 / 2 = 7 … 0

7 / 2 = 3 … 1

3 / 2 = 1 …. 1


따라서 1110 된다.


십진법 n 2진법으로 나타내는 함수는 f(n, 2) 정의할 있다.

그럼, 십진법 n 2보다 작은 경우 n 출력, 2보다 크거나 같은 경우 점화식을 f(n/k, k), printf(“%d”, n % k); 정리할 있다.




2진법 다른 진법으로 변환하고자 하는 경우 f(n, 2) 부분을 f(n, k) 바꾸기만 하면 된다.

11진법-16진법으로 변환하고자 하는 경우 알파벳을 출력하는 부분을 만들어야 하므로 아래와 같이 서식 문자를 바꾼다

(서식문자만 바꾸면 -> %X[대문자], %x[소문자]) 


아래 예시 코드는 16진법까지 변환할 수 있다.



20진법까지 바꾸고자 하는 경우, char letter[21] =“0123456789ABCDEFGHIJ";  변수를 만들어 변수 내 값을 꺼낸다. 이 부분은 한번 생각해보길 바란다.


7. 우박수(3n+1) Basic


1. 어떤 자연수 입력되면,  

2. n 홀수이면 3n + 1 하고,  

3. n 짝수이면 n/2  한다.  

4. n 1 될때까지 2, 3 과정을 반복한다.  


예를 들어 5 5 → 16 → 8 → 4 → 2 → 1  된다.  

처럼 어떤 자연수 n 입력되면 알고리즘에 의해 1 되는 과정을 모두 출력한다.


솔직히 이 문제는 문제에서 해결 전략을 다 줬다... 종료 조건만 생각하면 된다.



8. 우박수(3n+1) reverse


1. 어떤 자연수  입력되면,  

2. n 홀수이면 3n + 1 하고,  

3. n 짝수이면 n/2  한다.  

4.  n 1 될때까지 2, 3 과정을 반복한다.  


예를 들어 5 5 → 16 → 8 → 4 → 2 → 1  된다.  

 처럼 어떤 자연수 n 입력되면  알고리즘에 의해 1 되는 과정을 모두 출력한다.


근데, 이 순서의 역순을 출력하고자 한다.

즉, 1, 2, 4, 8, 16, 5가 출력되어야 한다.



반대로 한다 (...) 


조건은 같으나 n == 1인 경우 printf("1\n"); 해주고 더 이상 함수를 호출하지 않도록 한다.


9. 삼각형 출력하기 (반대로)


5가 입력되면

*****

****

***

**

*


을 출력한다.


이 문제는 * 출력과, \n 출력할 부분을 구별해 주면 된다.



10. 피보나치 수열 (Large)


자연수 N 입력받아 N번째 피보나치 수를 출력하는 프로그램을 작성하시오.  

, N 커질 있으므로 출력값에 10,009 나눈 나머지를 출력한다.


이 문제는 Large 문제이므로 이전에 계산한 값을 메모리에 저장함으로써 

동일한 계산의 반복 수행을 제거하는 메모이제이션 기법으로 프로그램을 작성한다.





재귀 함수는 자기 자신을 호출하는 함수이다


프로그램 실행 재귀 함수를 만나면, 현재 위치를 저장하여 호출할 함수의 주소로 넘어가 함수 내용을 수행한다

함수 실행이 끝나면 원래 위치로 복귀해 다음 코드를 수행한다.


무한 루프에 빠지지 않기 위해 종료 조건이 있어야 하고, 코드를 단순화할 있다. 무리하게 호출하면 스택 공간을 이용한다는 재귀함수의 특성 때문에스택 오버플로우 일어날 있다.


1. 1부터 n까지 출력하기

scanf로 n을 입력받은 후, solve(1) 호출, 이후, solve(n+1)을 수행해 n과 a가 같으면 종료 (종료조건)


따라서, 소스코드는 아래와 같이 쓸 수 있다.


2. n부터 1까지 출력하기 (역순)

solve 함수에서 printf와 solve(n+1) 위치만 바꾸어 주면 된다...



3. 두 수 사이의 홀수 출력하기

1부터 n까지 출력하는 소스 코드에서 홀수를 찾아 모두 출력한다.

if(n % 2 != 0) 조건을 사용하면 된다.



4. 팩토리얼 출력하기

n을 입력받아 n!을 출력한다.

예를 들어, n이 5인 경우, 5! = 5 * 4 * 3 * 2 * 1 = 120을 출력한다.


이 경우에는 점화식을 세워야 한다. 1!은 1이 되므로 종료조건을 아래와 같이 설정하며,

아닌 경우에는 아래와 같이 점화식이 도출되도록 Code를 작성한다.


f(5)

= 5 * f(4)

= 5 * 4 * f(3)

= 5 * 4 * 3 * f(2)

= 5 * 4 * 3 * 2 * f(1)

= 5 * 4 * 3 * 2 * 1

= 120


따라서, 여기서의 점화식은 n * f(n-1) 이다.



5. 피보나치 수열

N번째 피보나치 수를 출력한다. 이 경우에도 점화식을 세운다.


피보나치 수열의 기본 규칙은 처음 항은 1이고 번째 항부터 이전 항의 합이 된다

, 1, 1, 2 다음부터 1+2  다음 항이 된다 다음은 2+3=5 된다.


따라서, 종료조건 if(n==0) return 0, if(n==1) return 1;

점화식은 f(n-1) + f(n-2) 세우면 된다.









우리가 흔히 '1부터 n까지 더한 값을 출력하는 프로그램을 작성하라' 는 문제를 보면,


대부분이 이렇게 작성할 것이다.

#include <stdio.h>

int main() { int a, sum=0; scanf("%d", &a); for(int i = 1; i <= a; i++) { sum = sum + i; //물론 sum += i로 쓸 수도 있다. } printf("%d", sum); }


그리고, 출력값은 위와 같이 표시될 것이다.


만약, 이 출력값을 반복문 없이 구현하라고 하면 어떻게 구현할 것인가? 

재귀부터 시작해서 등차수열의 합 공식 등... 다양한 방법이 있을 것이다.


그 중 우리는 재귀함수를 사용해서 점화식으로 구현해 보도록 하겠다.


<풀이방법 1> 


먼저, 함수 f(n)은 1부터 n까지의 합으로 정의할 수 있다.


f(1) = 1

f(2) = 1 + 2


....


f(9) = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9

f(10) = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10


뭔가 공통점이 보이지 않는가? [f(n), n=10] 을 구하고자 할 때 f(9)는 1 ~ n-1의 합을 구하는 것이고, 

f(10)은 1부터 n까지의 합을 구하는 것이다. 따라서 f(10)은 아래와 같이 작성할 수 있다.


f(10) = f(9) + 10


이를 일반화하면



으로 쓸 수 있다.


이를 코드로 작성하면


으로 작성할 수 있는 것이다. n에 1이 들어가면 1~1의 합이니 return 1, 

1이 아니라면 함수 내 재귀를 수행하는 것이다.


<풀이방법 2>


f(10) = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10일 때,

f(5) = 1 + 2 + 3 + 4 + 5 이다.


이를 f(10) = f(5) + 6 + 7 + 8 + 9 + 10 로 표현할 수 있으며,

f(10) = f(5) + (5 + 1) + (5 + 2) + (5 + 3) + (5 + 4) + (5 + 5) 로 표현 가능하다.


정리하면, 

f(10) = f(5) + 1 + 2 + 3 + 4 + 5 + 5 + 5 + 5 + 5 + 5


이 식에서 굵게 표시한 부분은 또 f(5)로 치환할 수 있다. 

빨간색으로 표현한 부분은 5*5로 5의 제곱으로 표현 가능하다.


따라서 f(10) = 2f(5) + 5^2 로 표현할 수 있으며, 입력한 n은 10이므로


로 나타낼 수 있다.


그러나, 이 식은 홀수에서는 표현할 수 없는 식이다. 홀수를 나누면 소수점이 남기 때문.

따라서, 일반항에 가우스를 씌우고 (0.5 잃음), 가우스에서 잃었던 0.5 + n/2할때 생기는 0.5를 더해준다.


그럼 아래와 같이 정리할 수 있다. 


이를 홀, 짝 구분없이 쓸 수 있도록 정리하면, 아래와 같이 표현 가능하다.


프로그래밍 언어에서는 정수를 나누면 소수점 이하를 버리므로 아래와 같이 프로그램을 작성할 수 있다.



직접 여러 숫자를 대입해 보면서 풀어보면 잘 이해가 될 것이다.

OpenBCI로 마인크래프트의 스티브를 움직이는 방법을 알아보겠다. 



OpenBCI 소프트웨어의 최신 버전은 OSC 통신을 지원, Focus 감지 기능을 지원하므로, 이를 이용하면 스티브를 앞으로 움직이기 위해 키보드로 'W' 키를 누르는 과정을 파이썬 소프트웨어로 대체할 수 있다.


1. Python 3.6 버전을 다운받는다. (2.7 버전 안됨! +_+)

 * 이미 파이썬 2.7 버전을 설치한 경우에는 2.7 버전을 지우고, 3.6 설치, 환경변수 재설정 등 각종 설정을 다시 해야 한다. 

 * 다운로드 링크 : https://www.python.org/downloads/release/python-362/


2. Muselab 다운로드

 - Muselab은 OSC 데이터 분석 등에 유용하게 사용되므로, 다운받을 필요가 있다. 다운받지 않아도 프로그램을 동작하는데 문제는 없지만, 신호를 분석할 때에는 필요가 있다.

 * 다운로드 링크 : https://storage.googleapis.com/ix_downloads/musesdk-3.4.1/musesdk-3.4.1-windows-installer.exe


3. OpenBCI S/W 실행, OSC 프로토콜 설정 및 Focus 측정



OpenBCI에서 위와 같이 Control Panel 설정을 변경한다. (설치 및 실행 관련은 전 포스팅에서 설명했으므로 생략한다.)


[Networking] - 프로토콜 OSC로 변경, Data Type은 Focus, IP (127.0.0.1) Port(12345) 변경



위는 Focus Widget인데, focus를 측정하는 소스코드는 아래와 같다.


<W_focus.pde> 소스코드 중 일부


float alpha_avg = 0, beta_avg = 0; boolean isFocused; float alpha_thresh = 0.7, beta_thresh = 0.7, alpha_upper = 2;

<중략>


void update()

{


<중략>

alpha_avg = alpha_avg / alpha_count; beta_avg = beta_avg / beta_count; if (alpha_avg > alpha_thresh && alpha_avg < alpha_upper && beta_avg < alpha_thresh)

{ isFocused = true; }

else

{ isFocused = false; }

}

if (alpha_avg > 0.7 && alpha_avg < 2 && beta_avg < 0.7)


조건에 걸리는 경우, isFocused = true 를 OSC로 보낸다.


4. 제공하는 Python 소스코드를 이용해서, 마무리한다.


아래 소스코드를 SerialFocusAdvanced.py 로 저장하고 실행한다. 없는 라이브러리는 pip을 이용해 받아 준다.

import argparse
import ctypes
from ctypes import wintypes
import time

user32 = ctypes.WinDLL('user32', use_last_error=True)

INPUT_MOUSE    = 0
INPUT_KEYBOARD = 1
INPUT_HARDWARE = 2

KEYEVENTF_EXTENDEDKEY = 0x0001
KEYEVENTF_KEYUP       = 0x0002
KEYEVENTF_UNICODE     = 0x0004
KEYEVENTF_SCANCODE    = 0x0008

MAPVK_VK_TO_VSC = 0

# msdn.microsoft.com/en-us/library/dd375731
VK_TAB  = 0x09
VK_MENU = 0x12
VK_W = 87

# C struct definitions

wintypes.ULONG_PTR = wintypes.WPARAM

class MOUSEINPUT(ctypes.Structure):
    _fields_ = (("dx",          wintypes.LONG),
                ("dy",          wintypes.LONG),
                ("mouseData",   wintypes.DWORD),
                ("dwFlags",     wintypes.DWORD),
                ("time",        wintypes.DWORD),
                ("dwExtraInfo", wintypes.ULONG_PTR))

class KEYBDINPUT(ctypes.Structure):
    _fields_ = (("wVk",         wintypes.WORD),
                ("wScan",       wintypes.WORD),
                ("dwFlags",     wintypes.DWORD),
                ("time",        wintypes.DWORD),
                ("dwExtraInfo", wintypes.ULONG_PTR))

    def __init__(self, *args, **kwds):
        super(KEYBDINPUT, self).__init__(*args, **kwds)
        # some programs use the scan code even if KEYEVENTF_SCANCODE
        # isn't set in dwFflags, so attempt to map the correct code.
        if not self.dwFlags & KEYEVENTF_UNICODE:
            self.wScan = user32.MapVirtualKeyExW(self.wVk,
                                                 MAPVK_VK_TO_VSC, 0)

class HARDWAREINPUT(ctypes.Structure):
    _fields_ = (("uMsg",    wintypes.DWORD),
                ("wParamL", wintypes.WORD),
                ("wParamH", wintypes.WORD))

class INPUT(ctypes.Structure):
    class _INPUT(ctypes.Union):
        _fields_ = (("ki", KEYBDINPUT),
                    ("mi", MOUSEINPUT),
                    ("hi", HARDWAREINPUT))
    _anonymous_ = ("_input",)
    _fields_ = (("type",   wintypes.DWORD),
                ("_input", _INPUT))

LPINPUT = ctypes.POINTER(INPUT)

def _check_count(result, func, args):
    if result == 0:
        raise ctypes.WinError(ctypes.get_last_error())
    return args

user32.SendInput.errcheck = _check_count
user32.SendInput.argtypes = (wintypes.UINT, # nInputs
                             LPINPUT,       # pInputs
                             ctypes.c_int)  # cbSize

# Functions

def PressKey(hexKeyCode):
    x = INPUT(type=INPUT_KEYBOARD,
              ki=KEYBDINPUT(wVk=hexKeyCode))
    user32.SendInput(1, ctypes.byref(x), ctypes.sizeof(x))

def ReleaseKey(hexKeyCode):
    x = INPUT(type=INPUT_KEYBOARD,
              ki=KEYBDINPUT(wVk=hexKeyCode,
                            dwFlags=KEYEVENTF_KEYUP))
    user32.SendInput(1, ctypes.byref(x), ctypes.sizeof(x))

import argparse
import math
import time

from pythonosc import dispatcher
from pythonosc import osc_server

def eeg_handler1(unused_addr, args, ch1):
    print("Blink: ", ch1)

def eeg_handler2(unused_addr, args, ch1):
    print("Jaw Clench: ", ch1)

def eeg_handler3(unused_addr, args, ch1):
    print("Open Bci Focus: ", ch1)
    if(ch1):
        PressKey(VK_W)
        time.sleep(0.25)
        ReleaseKey(VK_W)


if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("--ip", default="0.0.0.0", help="The ip to listen on")
    parser.add_argument("--port", type=int, default=12345, help="The port to listen on")
    args = parser.parse_args()

    dispatcher = dispatcher.Dispatcher()
    dispatcher.map("/debug", print)
    dispatcher.map("/muse/elements/blink", eeg_handler1, "Blink")
    dispatcher.map("/muse/elements/jaw_clench", eeg_handler2, "Jaw_clench")
    dispatcher.map("/openbci", eeg_handler3, "Jaw_clench")

    server = osc_server.ThreadingOSCUDPServer((args.ip, args.port), dispatcher)
    print("Serving on {}".format(server.server_address))
    server.serve_forever()


4. 마인크래프트를 실행, 스티브를 움직여 본다.



최근 서울대학교 과학영재교육원에서 OpenBCI를 이용한 탐구를 진행하고 있다. 


절차상으로도 굉장히 쉽고, 이 내용이 OpenBCI 사이트에 설명이 잘 되어있긴 하지만, 이 글이 내 개인적으로도 (OpenBCI를 Windows PC에 설치할 때마다 헷갈린다), OpenBCI를 공부하거나 연구하는 사람들에게도 도움이 될 것 같아 방법을 정리하여 올린다.




 

<준비물>

OpenBCI Cython (구. OpenBCI 32Bit Board Kit), 골든 일렉트로드 케이블, USB (BLE) 동글, 배터리 박스(?), 배터리, 

Ten20 (전극 테스트를 할 때 필요), Windows 10(아무 Windows든 사실 큰 상관 없음) 이 설치된 PC, 그리고 차 한잔???

 

* 차 한잔은 OpenBCI를 개발하는데 전혀 아무런 영향을 미치지 않습니다... 자신의 정신건강에 도움이 될 뿐 ㅋㅋㅋㅋ

 

1. OpenBCI USB 동글은 FTDI 드라이버로 이루어져 있다. 아래 사이트에서 FTDI 드라이버를 설치한다.

 * 만약 설치하지 않았다면 USB Serial Port가 장치 관리자에서 찾을 수 없다고 뜰 것이고, OpenBCI 프로세싱 기반 소프트웨어에서 포트를 감지하지 않을 것이다.

 

http://www.ftdichip.com/Drivers/VCP.htm

 

사이트 하단에 있는 드라이버를 다운받는다. 운영체제와 자신의 컴퓨터 비트 수를 확인해서 알맞는 드라이버를 다운받는다.

 * 비트수를 확인하려면 Windows 10에서 [내 PC] - 우클릭/[속성] - 시스템 종류를 확인.

 

2. 배터리 박스에 배터리를 장착하고, OpenBCI 본체의 스위치는 PC로 향하게 한다 [BLE/OFF 안됨]. USB 동글의 스위치는 GPIO_6으로 향하게 한다.

 

 * 잠깐! 일반 배터리를 OpenBCI에 연결하면 보드의 파워 서플라이가 나갈 수 있기 때문에, 배터리 박스를 OpenBCI를 구입 시 사용하도록 같이 넣어준 것이다. 절대로 배터리 박스 없이 배터리를 끼우지 말 것!

 

3. http://openbci.com/index.php/downloads 에서 알맞는 버전을 다운받는다.

난 GUI 1.0.0 [64비트 다운로드 링크 : http://openbci.com//apps/v100/application.windows64.zip] 을 다운받았다.

나처럼 하고 싶다면 OpenBCI GUI 최신버전 밑 [ALL OPENBCI GUI RELEASES...] 를 클릭하면 된다.

 

4. 소프트웨어를 실행시켜, 아래와 같이 따라한다.

 

1. LIVE (최신 버전에서는 Cython으로 보일 것이다.) 를 클릭한다.

2. 동글의 포트를 클릭한다. 그리고 SD 카드 옵션이 있는데 자신의 OpenBCI에 SD카드가 끼워져 있고, 한번 해보고 싶다는 사람은 해봐도 무방하다. 안해도 OpenBCI를 탐구하는데 지장은 크지 않은 것 같다.

3. 그리고 Start System을 누른다.

 

 

 

여기까지 따라해서 이 화면이 떴다? 축하한다. 당신의 OpenBCI랑 PC는 연결된 상태라는 것을 증명해 주는 화면이다.

이제 Start Data Stream을 누르고 OpenBCI의 전극을 만져보자. (금색 부분) 아마 뇌파가 요동치는 걸 떠나 최고점에 닿을 것이다.

 

 

이제 골드컵 일렉트로드 케이블에 Ten20 크림을 바르고, 자신의 머리 뇌파를 측정해 보자.

2017.02.14

<교수님>

 - 이따 워리어와 드론 각각에서 키보드, 마우스 각각 이벤트 받는 부분 이야기


 - 드론 화면 아래에 까만 화면이 키보드 명령 받는 곳, 여기에 do sssuuu 치면 실행되도록 구현할 것


 - 워리어에도 똑같이 적용한다.


 - 거북이와 같은 원리로 한다.


 - 드론에도 실행식 적용, 뇌파는 두눈을 깜빡이면 단위 길이만큼 하강, 뜨고 내리는 것 전부 뇌파로 구현할 것.


 - 뇌파기기는 MUSE 사용.


 - 특목고 지원학생은 이러한 사사탐구 내용을 숙지하면 도움이 됨


 - 12월 사사탐구 대표는 5명 정도밖에 못 나감


 - 머신러닝은 먼저 데이터 수집장치가 필요 -> 파이썬 -> 디장고 웹 애플리케이션


https://p5js.org/examples/simulate-l-systems.html


https://www.google.co.kr/amp/s/cartesianfaith.com/2014/01/18/generating-artificial-plants-using-stochastic-lindenmayer-systems-with-d3-js/amp/?client=ms-android-skt-kr


<오늘 활동한 내역>

 - Github 개설

 - 플레이어 좌표값 배열에 대해 의논

 - Anaconda 안되는것 WinPython으로 해결

 - MUSE Demonstration


<플레이어 좌표값 소스>

%%

data = {''};

u1 = udp('127.0.0.1',765,'LocalPort',777);

 

u1.InputBufferSize = 1024;

 

u1.DatagramTerminateMode = 'on';

 

%u1.DatagramReceivedFcn = {'udpcallback'};

 

fopen(u1);

 

%%

buf = 400;

dataVec = zeros(buf,7);

refresh = .02;

tic;

startTime = toc;

lastTime = startTime;

go = 1;

 

while(go)

 

str = fscanf(u1);

parts = strsplit(str,',');

newVec = zeros(1,7);

if(length(parts)==7)

 for jj = 1:7

 if(length(str2num(parts{jj}))==0)

 newVec(jj)=0;

 else

 newVec(jj) = str2num(parts{jj});

 end

 end

end

 

dataVec(1:end-1,:) = dataVec(2:end,:);

dataVec(end,:) = newVec;

 

if((toc-lastTime)&amp;amp;gt;refresh)

 figure(1)

 plot(dataVec(:,1:6))

 title(num2str(mean(diff(dataVec(:,7)))))

 drawnow;

 lastTime = toc;

end

 

if(toc &amp;amp;gt; 10)

 go = 0;

end

 

end

 

%%

fclose(u1); delete(u1)


2017.02.13

- 스쿨호스팅 (phps.kr) 가상서버호스팅 리눅스가 4,900원이므로 여기 호스팅을 사용한다.


- snucode.org 도메인 개설


 - 사사반 탐구는 모든 것을 밑바닥부터 하는 것이 원칙이고, 기존의 툴은 배제한다. 교수님들 채점기준은 밑바닥부터 얼마나 했는지가 기준이다.


 - 로봇 기자재는 창의재단, 네이버등 기업에서 제작중이므로 초등학생들에게 마인크래프트와 쌓기나무로 간단한 거북명령 만들게 시키는게 소위 틈새전략이고 경쟁력


 - 타겟은 초등 고학년으로 한다. http://hicoding.kr/?p=36388


 - 그리고, Unplug 코딩으로 할수 있어야 한다. do sssuuusss 등의 실행식으로 쌓기나무 만들고 드론을 움직인다.


추후

- 장고 게시판 구축

2017.02.08 / 2017.02.10

<교수님>

1. Voxel.js 서버 및 개발환경 구축

2. 학생들의 뇌파, 학생들이 쓴 문자나 수학표현 인식 (Text Recognition) 시스템 구축

3. 1번과 2번을 활용한 SW 교육 환경 디자인, 교육 시스템 적용, 효과성 검증


사사반에서 앞으로 해야할 큰 주제이다.

플레이어의 뇌파를 인식 or 플레이어들이 게시판에 쓴 문자를 인식하는 Text Recognition 시스템 구축 (수식 파악 등)


Django가 파이썬과 연동에 유리하므로, 뇌파 분석과 파이썬 코딩을 강조.


공동이 아닌 세 그룹으로 나누어 협력하고, 복셀과 뇌파팀을 나누어 탐구한다.


정보 사사반이 한국과학창의재단 이사장상 수상 - 장관상을 받으려면 심사교수에게 눈에 뵈는 실질적인 구체적인 것이 나와야한다. 화려한 것보다 실속이 있어야 함. 

13명 전체가 사사발표 참가는 못하여 경쟁 시스템을 도입한다.


2월달 5일, 1학기 1일, 여름방학 5일, 가을 1일 정도로 수업시수 배정 계획


http://francescopochetti.com/text-recognition-natural-scenes/

Image Text Recognition in Python


http://newsweekkorea.com/?p=1811

뇌파로 마음을 읽는다


https://www.google.co.kr/amp/news.donga.com/amp/all/20141226/68773091/1?client=ms-android-skt-kr

영화 흥행좌우 '별점'


<학생>

Voxel.js 서버 운영은 공동으로 하기 위해 외부 서버를 빌린다.

뇌파 기술이 해외에서도 연구중인 분야라 우리 영재원에서 심층적으로 탐구해 볼만한 주제.