메이커 Maker

원하는 범위에서 하드웨어 난수 발생기 hardware random number generator 줄여서 HRNG 랜덤 넘버 발생기

지구빵집 2020. 12. 6. 02:07
반응형

 

 

원하는 범위에서 하드웨어 난수 발생기 hardware random number generator 줄여서 HRNG 랜덤 넘버 발생기 

 

컴퓨팅에서 하드웨어 난수발생기는 주파수, 노이즈 혹은 백색 잡음 등을 이용하여 무작위의 난수를 생성하는 것을 의미한다. 아래는 위키백과에서 하드웨어 난수 발생기에 대한 설명이다.

 

보통 컴퓨팅에서 하드웨어 난수발생기(hardware random number generator, HRNG) 또는 진정한 난수발생기(true random number generator, TRNG)는 알고리즘의 수단이 아닌, 물리적 처리를 통해 난수를 생성하는 장치이다.

이러한 장치는 빔 스플리터를 수반하는 광전 효과, 열잡음, 그리고 기타 양자 현상 등 로우 레벨의 통계적으로 무작위인 노이즈 시그널을 생성하는 미세 현상에 기반을 두는 경우가 종종 있다. 이러한 추계학적 프로세스는 이론적으로 완전히 예측이 불가능하다.

하드웨어 난수발생기는 일반적으로 일부 측면의 물리적 현상을 전기 신호로 변환하기 위한 트랜스듀서로 구성되며 특정한 유형의 아날로그-디지털 변환 회로가 포함되어 있어서 출력을 0, 1 바이너리 숫자인 디지털 숫자로 변환한다. 무작위의 신호를 반복적으로 양자화함으로써 일련의 난수를 얻을 수 있다. 

 

아래 포스팅은 제목만 거창하게 달았을 뿐이지 전혀 다르게 동작한다. 즉 장치가 시작하면 사용자가 원하는 범위의 숫자를 세팅하고 나면 그 뒤로 언제든 전원이 켜지거나, 리셋 버튼을 누르면 사용자가 정한 범위에서 난수(무작위수)를 생성하여 Display 하는 장치이다. 

 

이 장치는 루틴을 만들어 준다. 반드시 꼭 해야 하는 일을 항상 난수를 생성하여 실행하도록 만들어 준다. 예를 들면 권력의 법칙 1에서 권력의 법칙 48까지 항목 중에 매일 아침 한 항목을 읽을 때 사용하려고 만들었다. 아니면 詩가 100편이 있다고 하면 처음부터 읽어가는 방식이 아니라 언제든 임의의 번호에 해당하는 시를 선택해 읽는 방식이다. 300페이지 책이 있다면 랜덤 넘버 발생기는 1에서 300 사이의 숫자를 무작위로 생성해 준다. 이런 간단한 방식에 편하게 사용할 수 있는 것이 바로 하드웨어 랜덤 넘버 발생기라고 이름을 붙였다.

 

하드웨어 난수 발생장치 사용 부품은 작으면서 EEPROM이 1 KByte 사용 가능한 arduino nano 보드와 데이터를 보여주는 SSD1306 OLED, 리튬 폴리머 충전 배터리, 충전 모듈 TP4056, 전원 온 오프 스위치, 설정 버튼으로 구성한다. 아직 최종 완성된 것은 아니지만 현재 구현되어 있는 것까지 포스팅을 한다. 사실 나머지 부분은 버튼을 입력받아 최소 숫자와 최대 숫자를 입력받아 저장하고 그다음 전원이 들어오면 그 범위의 숫자를 보여주는 일이다. 간단한 작업은 아니지만 논리적으로 선택하기 쉽게 만들면 사용하기 쉬운 난수 발생장치를 만들 수 있을 것이다.

 

설정 스위치가 빠진 회로도는 아래와 같다.

 

 

하드웨어 난수 발생기 hardware random number generator 회로도

 

그리고 나니 스위치 위치가 이상합니다. 그러니까 스위치는 배터리에서 충전모듈의 전원을 제어하는 게 아니라 충전 모듈의 출력에서 nano 보드로 공급되는 전원을 on off 해주어야 합니다. 다시 수정해서 그린 회로도를 첨부합니다. ^^

 

하드웨어 난수 발생기 hardware random number generator 회로도

 

현재까지 완성된 코드를 아래에 나타낸다. 화살표 위아래 key를 사용하여 범위를 지정하는 부분은 아직 구현하지 않았습니다.

 

빠진 부분

1. 화살표 key를 이용한 랜덤 넘버 발생 범위 지정

2. 범위 지정한 수를 내부 EEPROM에 저장하고 부팅 시 불러와서 정한 범위의 난수 발생

3. 전원 스위치를 동작하지 않을 경우 Sleep 모드로 들어가서 배터리 절약

4. 현재 integer(-32,768~32,768) 범위인데 조정하기

5. 폰트 사이즈를 조절해야 함. 이미지가 필요할지도 모름.

 

 

/*
 * Arduino with LM35 analog temperature sensor and SSD1306 OLED display.
 * This is a free software with NO WARRANTY.
 * https://simple-circuit.com/
 */
 
#include <Wire.h>              // include Arduino wire library (required for I2C devices)
#include <Adafruit_GFX.h>      // include Adafruit graphics library
#include <Adafruit_SSD1306.h>  // include Adafruit SSD1306 OLED display driver
 
#define OLED_RESET  4    // define display reset pin
Adafruit_SSD1306 display(OLED_RESET);
 
void setup(void)
{

  // initialize the SSD1306 OLED display with I2C address = 0x3D
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
 
  // clear the display buffer.
  display.clearDisplay();
 
  //display.setTextSize(1);   // text size = 1
  display.setTextColor(WHITE, BLACK);  // set text color to white and black background
  
  //display.display();        // update the display
  display.setTextSize(2);   // text size = 2

  randomSeed(analogRead(0)); // 난수 발생기 초기화다. 안해주면 지옥간다.
  
}
 
void loop()
{
  char _buffer[8];
  int selectnumber = random(1, 49);
  
  display.setCursor(23, 10);
  sprintf(_buffer, " %3d", selectnumber);
  display.print(_buffer);
  display.display();

  while(1)
  {        
    }
}
 
// end of code.

 

여기까지 완료하고 실제 조립하고 동작하는 사진을 첨부합니다.

 

 

 

 

반응형