my piano

|





신고
트랙백 0 And 댓글 0

random

|

    PUBLIC
    Last active 

    Arduino hardware true random number generator

    probably_random.ino
    Arduino
    123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
    #include <stdint.h>
    #include <avr/interrupt.h>
    #include <avr/wdt.h>
     
    byte sample = 0;
    boolean sample_waiting = false;
    byte current_bit = 0;
    byte result = 0;
     
    void setup() {
    Serial.begin(115200);
    wdtSetup();
    }
     
    void loop()
    {
    if (sample_waiting) {
    sample_waiting = false;
     
    result = rotl(result, 1); // Spread randomness around
    result ^= sample; // XOR preserves randomness
     
    current_bit++;
    if (current_bit > 7)
    {
    current_bit = 0;
    Serial.write(result); // raw binary
    }
    }
    }
     
    // Rotate bits to the left
    // https://en.wikipedia.org/wiki/Circular_shift#Implementing_circular_shifts
    byte rotl(const byte value, int shift) {
    if ((shift &= sizeof(value)*8 - 1) == 0)
    return value;
    return (value << shift) | (value >> (sizeof(value)*8 - shift));
    }
     
    // Setup of the watchdog timer.
    void wdtSetup() {
    cli();
    MCUSR = 0;
    /* Start timed sequence */
    WDTCSR |= _BV(WDCE) | _BV(WDE);
     
    /* Put WDT into interrupt mode */
    /* Set shortest prescaler(time-out) value = 2048 cycles (~16 ms) */
    WDTCSR = _BV(WDIE);
     
    sei();
    }
     
    // Watchdog Timer Interrupt Service Routine
    ISR(WDT_vect)
    {
    sample = TCNT1L; // Ignore higher bits
    sample_waiting = true;
    }
    probably_random_with_TimerOne.ino
    Arduino
    1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
    #include <stdint.h>
    #include <avr/interrupt.h>
    #include <avr/wdt.h>
    #include <TimerOne.h>
     
    byte sample = 0;
    boolean sample_waiting = false;
    byte current_bit = 0;
    byte result = 0;
     
    void setup() {
    Serial.begin(115200);
    wdtSetup();
    Timer1.initialize(30000); // set a timer of length somewhat longer than watchdog length
    }
     
    void loop()
    {
    if (sample_waiting) {
    sample_waiting = false;
     
    result = rotl(result, 1); // Spread randomness around
    result ^= sample; // XOR preserves randomness
     
    current_bit++;
    if (current_bit > 7)
    {
    current_bit = 0;
    Serial.write(result); // raw binary
    //Serial.println(result, DEC); // decimal text
    //binprint(result); // bits
    }
    }
    }
     
    // Rotate bits to the left
    // https://en.wikipedia.org/wiki/Circular_shift#Implementing_circular_shifts
    byte rotl(const byte value, int shift) {
    if ((shift &= sizeof(value)*8 - 1) == 0)
    return value;
    return (value << shift) | (value >> (sizeof(value)*8 - shift));
    }
     
    // Setup of the watchdog timer.
    void wdtSetup() {
    cli();
    MCUSR = 0;
    /* Start timed sequence */
    WDTCSR |= _BV(WDCE) | _BV(WDE);
     
    /* Put WDT into interrupt mode */
    /* Set shortest prescaler(time-out) value = 2048 cycles (~16 ms) */
    WDTCSR = _BV(WDIE);
     
    sei();
    }
     
    // Watchdog Timer Interrupt
    ISR(WDT_vect)
    {
    sample = TCNT1L; // Ignore higher bits
    TCNT1 = 0; // Clear Timer 1
    sample_waiting = true;
    }
     
    // Print binary numbers
    // http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1193507343/5#5
    void binprint(int input) {
    for (unsigned int mask = 0x80; mask; mask >>= 1) {
    Serial.print(mask&input?'1':'0');
    }
    Serial.println();
    }
    readme.md
    Markdown

    My attempt at a hardware random number generator in Arduino with no external components.

    Only produces ~64 bit/s because of the minimum length of the watchdog timer. :(

    Tested only on a Duemilanove. May not work on other hardware. Post a comment if you try it on other hardware or if you find a scenario where it doesn't work.

    It uses the watchdog timer to sample (and reset) Timer 1. Since the watchdog timer runs on its own RC oscillator, and Timer 1 is on the crystal oscillator, there is random variation in the value read. Then the randomness is spread around to all 8 bits by reading 8 times and bit-shifting and XORing, to produce a random byte.

    The assumption is that at least one bit in each sample is truly random. Though in reality, probably multiple bits have varying amounts of entropy? The raw read from the timer sampling is estimated at 4.4 bits of entropy per byte.

    It seems to work. I think the main flaw would be if the two oscillators become correlated to each other in certain hardware configurations or at certain points in time, which I haven't noticed, despite running it continuously for days.

    Disclaimer: I have no idea what I'm doing.

    But it measures better than TrueRandom"TrueRandom" is not truly random:

    Entropy = 7.544390 bits per byte.
    
    Optimum compression would reduce the size
    of this 92810048 byte file by 5 percent.
    
    Chi square distribution for 92810048 samples is 131287892.21, and randomly
    would exceed this value 0.01 percent of the times.
    
    Arithmetic mean value of data bytes is 93.7178 (127.5 = random).
    Monte Carlo value for Pi is 3.682216212 (error 17.21 percent).
    Serial correlation coefficient is -0.008583 (totally uncorrelated = 0.0).
    

    For comparison, with probably_random_with_TimerOne.inoent says:

    Entropy = 7.996943 bits per byte.
    
    Optimum compression would reduce the size
    of this 65536 byte file by 0 percent.
    
    Chi square distribution for 65536 samples is 277.59, and randomly
    would exceed this value 15.83 percent of the times.
    
    Arithmetic mean value of data bytes is 127.8158 (127.5 = random).
    Monte Carlo value for Pi is 3.126899835 (error 0.47 percent).
    Serial correlation coefficient is -0.007752 (totally uncorrelated = 0.0).
    

    Generating the 13 GB required by dieharder would take about 48 years. :D

    Output as an image:

    noise

    Output scatter plotted (plot(a, 'bo', alpha=0.1)):

    plot

    Histogram of output:

    histogram

    Gallery of tests of both TrueRandom and ProbablyRandom

    I've also tested without the TimerOne library (probably_random.ino), just sampling the Arduino's constantly-cycling PWM timers instead of configuring and resetting Timer 1, and it doesn't seem to hurt the randomness:

    Entropy = 7.999969 bits per byte.
    
    Optimum compression would reduce the size
    of this 5489591 byte file by 0 percent.
    
    Chi square distribution for 5489591 samples is 233.95, and randomly
    would exceed this value 75.00 percent of the times.
    
    Arithmetic mean value of data bytes is 127.4536 (127.5 = random).
    Monte Carlo value for Pi is 3.145767276 (error 0.13 percent).
    Serial correlation coefficient is -0.001267 (totally uncorrelated = 0.0).
    

    So you should be able to use all the inputs and outputs normally, and still generate random numbers. The LSBs will still be noisy even if the MSBs are periodic, and XORing the two will preserve only the randomness of the LSBs.

    Obviously if your program turns off Timer 1 completely, this will no longer produce random numbers. (But it doesn't use any obfuscation or whitening other than the XOR shifting, so if you feed it nothing but 0s, it will output nothing but 0s and it will be obvious.)

    Using Clear Timer on Compare mode should be ok, as long as the compare isn't correlated with the watchdog. If you use the watchdog timer to reset Timer 1 before reading it, for instance, you won't get random numbers. :)

    Not sure about switching Timer 1 to other prescalers. Is it possible to run Timer 1 so slowly that it doesn't change between samples? That would be bad.

    tester.py
    Python
    12345678910111213141516171819202122232425262728293031323334353637
    # -*- coding: utf-8 -*-
     
    from __future__ import division
    import serial
    from pylab import *
    from time import time
    import Image
     
    size = 2**16
     
    with serial.Serial('COM6', 115200) as port:
    start_time = time()
    data += port.read(size)
    elapsed_time = time() - start_time
     
    print 'Read ' + str(size) + ' bytes in ' + str(int(round(elapsed_time))) + ' s'
    print 'Data rate: %.1f bit/s' % (size*8 / elapsed_time)
     
    # Binary dump
    with open(str(int(time())) + 'out.bin','wb') as f:
    f.write(data)
     
    a = numpy.fromstring(data, dtype = 'uint8')
     
    # Plot
    figure()
    plot(a, 'bo', alpha=0.1) # Transparent to show stackups
     
    # Histogram
    figure()
    hist(a, bins=64, range=[0,255])
     
    # Image
    repeat = int(sqrt(size))
    b = reshape(a[:len(a) - len(a)%repeat], (-1, repeat))
    im = Image.fromarray(b)
    im.save(str(int(time())) + 'out.png')

     Please sign in to comment on this gist.


    신고
    트랙백 0 And 댓글 0

    Kun-Woo Paik plays SCHUBERT

    |






    가을이고

    슈베르트를

    마에스트로 백건우가 연주한다.

    더할나위 없는 연주에, 특히나 선곡이 아주 좋았다.

    신고
    트랙백 0 And 댓글 0

    android opencv ndk

    |



    출처 : http://adppark.tistory.com/303


     본 내용의 원본 출처는 이곳 입니다!

     

     

    해당 방법은 crytax NDK를 이용한 cygwin에서의 ndk-build 를 사용하는 방법과 달리 

    최신 ndk를 이용하여(현재 2012년 12월 2일 기준) 이클립스 상에서 c/c++ 파일을 빌드하여 so 파일까지 만들어

    이클립스 상에서 모든 것이 해결되는 방법이다.

     

    (현재 기존의 안드로이드에서의 opencv 설치법이라고 나오는 방법들 중 svn에서 제공하는 소스가 더 이상 제공되지 않는듯 하다. 그래서 본인 역시 아래의 방법으로 opencv 를 사용하였다)

     

     

     

     

    본 문서는 OpenCV Docs 에 있는 튜토리얼 문서를 바탕으로 작성되었다.

     

     

    1. Sun JDK7

    Java SE 다운로드 페이지에서 해당 OS에 맞는 JDK를 다운로드 및 설치 / 환경변수 설정을 완료한다.

     

    2. Android SDK

    가장 최근의 안드로이드 SDK를 설치한다. http://developer.android.com/sdk/index.html

     

    OpenCV의 최소 지원 플랫폼은 Android2.2 (API 8) 이다.

    공식 튜토리얼 문서에서는 Android 3.0 (API 11) 이상의 버전을 추천하고 있다.

     

    3. Eclipse IDE

    Eclipse 3.7(Indigo) 또는 그 이상의 버전을 설치한다.

     

    4. ADT 플러그인 및 android-sdk 설치

    본 문서에서는 설치과정을 생략한다.

     

    ======== 여기까지 자바 개발을 위한 설치 과정을 마무리 합니다.

     

     

    1. NDK

    C++ 코드를 컴파일 하기위해 가장 최근의 NDK를 다운받는다.

    http://developer.android.com/tools/sdk/ndk/index.html

     

    - 다운받은 압축파일을 풀어 C:\ 경로에 옮겨둔다. (물론 자신이 원하는 경로에 옮겨도 무관하다)

     

    * 환경변수 설정 :

      - NDKROOT 새로 생성 : ndk 폴더 경로 입력

      - path 에 추가 : ndk 폴더 경로 추가 

     

     

    2. CDT plugin

    이클립스 안에서 C++ 코드를 컴파일 하기위해 CDT 플러그인을 설치한다.

     

    Help -> About Eclipse SDK -> Installation Details

     

     

     

     

     

     

    만약 최근의 ADT 플러그인을 설치했다면 이미 CDT 플러그인을 설치되어 있을 수 있다.

    즉 C++ 컴파일 환경이 갖춰진 상태인 것이다.

     

     

    ===============================================================================================

     

     

    1. 이클립스의 새로운 프로젝트 생성 및 OpenCV-2.4.3-android-sdk.zip 파일 압축해제

     

    :  http://opencv.org/platforms/android.html 접속

     

     

     

    - 상단 메뉴에서 Downloads 메뉴를 클릭한다.

     

     

     

     

    - 여러 버젼들 중 최근 버전의 OpenCV for Android(OpenCV-2.4.3-android-sdk.zip) 다운로드 한다.

     

    다운받은 OpenCV-2.4.3-android-sdk.zip 파일을 이클립스로 생성한 새로운 프로젝트 폴더 아래에 해제한다.

     

    2. OpenCV 라이브러리 및 샘플소스를 Import 한다.

     

     

     

    File -> Import -> General -> Existing Projects into Workspace

     

     

    프로젝트 내부에 압축해제 했던 OpenCV-2.4.3-android-sdk 를 Import 한다.

     

     

     

     

    import 한 프로젝트들은 무시무시한 엑박들로 우리들을 위협하고 있다.

    해당 엑박은 프로젝트들의 환경설정을 통해 해결할 수 있다.

     

    3. 프로젝트의 OpenCV Library - 2.4.3 에 대한 JDK 1.6 설정과 Is Library 체크한다.

     

     

     

     

    OpenCV Library - 2.4.3 폴더에서 우클릭하여 Properties 메뉴로 들어간다.

    활성화된 화면의 메뉴트리에서 Android 선택 후 빌드 타겟을 선택한다.

    타겟 버젼은 튜토리얼 문서에 따르면 3.0 이상을 권고한다고 한다.

     

    그리고 Library 체크박스에 Is Library 부분을 체크한 후 적용(Apply) 버튼을 누른다.

     

     

     

     

    메뉴 트리상의 Java Compiler 메뉴에서 위 그림과 같이 1.6으로 설정한다.

    설정 이전에는 1.5로 설정이 되어 있었다.

     

     

     

    여기까지 하면 OpenCV의 Libary 의 오류가 사라진 것을 알 수 있다!

    앞으로 OpenCV를 활용하는 프로젝트들을 만들 때 해당 Library 를 가져다가 사용하면 되는 것이다!

     

     

     

    4. 다음으로는 Tutorial Sample 프로젝트들의 오류에 대해 알아보자.

    기본적으로 존재하는 Sample 들은 OpenCV Library -2.4.3을 이용한 순수한 자바 프로젝트와 JNI를 포함하나 프로젝트로 이뤄져있다.

     

     

     

     

    그 중 Tutorial 2 는 자바 코드만으로 이루어져 있으며

     

    Tutorial 4 의 경우 jni를 포함한 프로젝트로 구성되어 있습니다.

     

     

    4-1-1. OpenCV Tutorial 2 - Use OpenCV Camera 를 기준으로 환경 구성해보자.

             (case1. 자바코드로만 이루어진 경우) 

     

     

     

    우선 Tutorial 2 프로젝트 폴더를 우클릭하여 Properties 메뉴로 들어간다.

    그림과 같이 Target은 4.1.2로 선택하고 (3.0 이상으로 설정한다)

    Library 부분에 OpenCV Library를 추가해 주기 위해 Add를 선택하여 라이브러리 추가를 한다.

     

    혹시 기존에 추가되어 있던 라이브러리가 있었다면 Remove로 제거한 뒤 Open CV 라이브러리를 추가해 준다. 

     

     

     

    간단하게 에러가 사라졌고 Tutorial 2 샘플이 무사히 실행되는 것을 볼 수 있다.

     

     

    4-2-1. JNI 코드를 포함한 OpenCV Tutorial 4 - Mix Java+Native OpenCV 프로젝트의 환경설정을 해보자.

             (case2. JNI 코드를 포함한 경우) 

     

     

    4-2-2. 문제는 디폴트로 잡혀 있던 NDK 라이브러리경로와 OpenCV SDK 경로 문제로 인한 에러다.

     

     

     

     

     

    동일하게 프로젝트 선택하여 우클릭을 통해 Properties 메뉴로 들어간 후 그림과 같이 설정한다.

     

     

     

    모듈 생성을 위해 cygwin을 이용하지 않고 이클립스에서 바로 c/c++ 파일에 대해 바로 빌드하기 위한 부분이다.

    C/C++ Build 메뉴트리를 선택하신 후 그림과 같이 설정한다.

    ${NDKROOT}/ndk-build.cmd

    (위의 환경 변수를 제대로 설정했다면 ${NDKROOT} 를 사용 가능하다)

     

    환경변수를 따로 지정하지 않았다면 ${NDKROOT} 부분을 위에서 다운받았던 NDK 폴더 경로를 입력해 주면 된다.

     

     

     

     

    메뉴 트리상의 C/C++ General 아래 Paths and Symbols를 선택 후 Includes 탭에 GNU C++ 메뉴를 선택 한다.

     

    Include할 라이브러리들의 경로가 적혀있는데 최근 ndk 버전의 경우 

    ndk/sources/cxx-stl/gnu-libstdc++/ 아래에 include가 있지 않고

    버전 별 폴더가 추가되어 존재한다.

     

    그렇기 때문에 디폴트로 잡혀 있던 경로를 수정해야한다.

     

     

     

    4개의 파일에 관한 경로를 본인 설정에 맞게 수정하면 된다.

    (이곳 역시 위에서 NDK 폴더에 관한 환경변수 설정을 정상적으로 했다면 ${NDKROOT} 는 수정하지 않아도 된다)

     

     

     

    4-2-2. Android.mk 파일에 기재된 경로를 수정한다.

     

     

     

     

    수정 전의 Android.mk 파일의 추가할 OpenCV.mk 파일의 경로 이다.

    앞서 프로젝트 내부에 OpenCV SDK를 압축해제 했으므로 해당 경로를 변경해야 한다.

     

     

     

    OpenCV.mk 파일의 절대경로로 변경한 결과이다.

     

     

     

     

    모든 에러가 없어졌고 이전에 설정한 ndk-build.cmd 때문에 자동으로 모듈까지 생성된것을 확인 할 수 있다.

     

     

     

    * 혹시 위 내용까지 모두 수정했음에도 불구하고 엑박이 사라지지 않았다면 추가적으로 AndroidManifest.xml 파일을 확인해 보자.

     

     

     

    해당 파일에서 android:minSdkVersion = "8" 이 제대로 설정되어 있는지 확인하면 된다. 8 이하의 숫자가 입력되어 있는 경우 실행이 불가능 하다. 8 이상의 숫자로 변경하도록 한다.

     

     

     

     

    이렇게 하고 나면 위와같이 무사히 실행되는 결과화면을 마주할 수 있다!!

    나머지 샘플 튜토리얼들도 같은 방법으로 엑박을 제거할 수 있다!

     

     

    5. Android OpenCV 튜토리얼을 마치며...

     

    본인 역시 해당 환경설정을 하면서 엄청난 삽질의 시간을 보냈다.

    처음 해보는 openCV 에 android 라는 제약까지 걸리고나니 막막하기 그지 없었다.

    cygwin 의 삽질을 지나 해당 내용의 포스팅을 찾아 따라하면서도 NDKROOT 와 같은 환경변수에 대한 설명들이 없었어서 또 한참을 해멨었다.

     

    그랬기에 본인도 기억할 겸, 혹은 본인과 같은 고충을 격고 있는 사람들이 보다 쉽게 해결 할 수 있기를 바라며,

    본 포스팅의 원본 포스팅 인 내용에 좀 더 세부적인 사항들을 추가하여 포스팅 하게 되었다.

     

    어찌되었든 안드로이드에서 OpenCV 를 사용하고자 하는 초보자분들이!

    본인같은 삽질의 시간을 거치지 않고 openCv 를 쉽게 시작하였으면 하는 바램이다.

    신고
    트랙백 0 And 댓글 0

    kawai cn34 keyboard problem

    |

    Hi.


    I bought a brand new Kawai's CN34 digital piano a few days ago by my local distributor.


    It's really nice but i found a something strange about keyboard.


    Please look at picture.


    All G# keys are slightly pulled to the left.


    Two space (between F# and G#, G# and A#) are not equal, so feel odd when playing.


    It looks like a small glitch, but i don't think so. it may be assembled bad, i think.


    Products that are made at the same period(same LOT) will have the same problem.


    My CN34's serial number is G144457(MODEL:CN34B, TYPE:KA, LOT:129, date:2012/9).


    Please check your CN34.






    신고
    트랙백 0 And 댓글 0

    wave

    | 2011.11.23 04:14
    보호되어 있는 글입니다.
    내용을 보시려면 비밀번호를 입력하세요.

    power game.

    | 2011.11.23 04:10
    보호되어 있는 글입니다.
    내용을 보시려면 비밀번호를 입력하세요.

    gloomy

    | 2011.11.22 23:58
    보호되어 있는 글입니다.
    내용을 보시려면 비밀번호를 입력하세요.

    -

    |
    삶은 고통으로 가득 차 있지만,

    또한

    푸른 하늘, 햇빛, 아이의 눈과 같은 경이로움들로 가득하다.

    고통만이 전부는 아니다.

    우리의 삶의 수 많은 경이로움들과 만나야 된다.

    그것들은 그대 안에,

    그대 주위의 모든 곳에,

    그리고 언제 어디에나 존재한다.

    - 틱낫한 -
    신고
    트랙백 0 And 댓글 1

    -

    |

     가끔씩 지독하게 강렬한 생각이 들 때가 있다.

     무인도에 피아노 한 대와 악보만 챙겨 들어가서 살고 싶다는 생각이다.

     라디오에서 크리스티안 "롤리타" 짐머만의 쇼팽 발라드 1번이 나온다.

     이사람 agogic은 왜이리 기계스러울까...

     아마 무인도에 들어가면 나도 그렇게 집착할지도 모르겠다.

    신고
    트랙백 0 And 댓글 0
    prev | 1 | 2 | 3 | 4 | 5 ... | 11 | next

    티스토리 툴바