Posted by 살레시오
,

구글문서에서 단락스타일을 지정하면 문서에서 일관적인 스타일을 유지할 수 있다.

일반텍스트와 제목1부터 6까지는 ctrl+alt+0,1,2,3,4,5,6 에 단축키가 지정되어 있으므로 좀더 편리하게 사용할 수 있다. 예를 들어 선택한 단락을 일반텍스트 스타일로 지정하려면 ctrl+alt+0을 누르면 된다.



특정 단락의 들여쓰기는 상단의 줄자의 막대모양의 마커를 끌어서 조정할 수 있다.

이 마커를 조정하면 캐럿(caret, 커서)이 위치한 단락의 들여쓰기가 조절된다. 또한 밑을 향하고 있는 삼각형도 줄자의 아래부분에 있는데 이것을 끌어서 좌우여백도 조절할 수 있다. (좌측 여백을 조절하기 위해서는 ctrl+[,] 단축키를 이용해도 된다.)



하지만 이렇게 조절해도 캐럿이 위치한 단락만 조절되고 다른 곳에는 영향을 미치지 않는다. 동일한 단락스타일 전체에 적용되도록 하려면 조절하고 나서 해당 단락스타일을 업데이트하면 된다.



단락스타일에는 좌우여백과 들여쓰기 정보도 포함되기 때문이다.

n{gdoc001}


Posted by 살레시오
,



 ESP8266의 0,2,4,5,12,13,14,15 번 핀 모두 PWM 파형을 만들 수 있다. 단, 모두 같은 주파수를 가지며 주파수의 범위는 1~1000Hz 이다. 즉, 각각의 PWM파형이 서로 다른 주파수를 가질 수 없다.


 PWM파형을 만들기 위해서는 먼저 Pin객체를 생성해야 한다.


import machine
p5 = machine.Pin(5)

이것을 이용해서 PWM객체를 만들 수 있다.


pwm5=machine.PWM(p5)

이제 이 객체의 freq()메서드와 duty()메서드를 이용하여 주파수와 듀티비를 설정할 수 있다. 듀티비는 0~1023의 범위를 가진다.


pwm5.freq(500) #500Hz
pwm5.duty(512)

위와 같이 하면 주파수는 500Hz에 듀티비는 50%이다. 만약 freq()함수와 duty()함수를 인수 없이 호출하면 현재 설정값을 반환한다.


메서드

기능

비고

PWM(PinObj, freq=500, duty=0)

PWM클래스의 생성.


pwm.freq(n)

pwm.freq()

주파수를 n으로 설정

주파수값 반환

n은 [1,1000]범위의 정수

pwm.duty(m)

pwm.duty()

듀티비를 m으로 설정

현재 듀티비를 반환

m은 [0,1023]범위의 정수

pwm.deinit()

PWM 중단



좀 더 간략하게 작성된 프로그램은 다음과 같다.


from machine import Pin, PWM
pwm5 = PWM(Pin(5), freq=500, duty=512) #PWM객체 생성, 주파수는 500Hz

서로 다른 핀에서 발생하는 PWM파형일지라도 모두 같은 주파수로 동작한다는 사실에 유의해야 한다.


Posted by 살레시오
,

7세그먼트

교육/전기전자 2016. 10. 5. 13:45


2.4.2 세븐세그먼트 (7-segment)

c{eebi020402}


숫자를 표기하는데 많이 사용되는 장치로 7세그먼트가 있다. 이것은 7개의 선과 하나의 점으로 구성되어 있는데 주로 아라비아 숫자 0~9와 제한적으로 알파벳 등을 표시할 수 있다. 외형은 다음 그림과 같다.




7세그먼트는 내부 회로 구성에 따라 에노드 공통형과 케소드 공통형으로 나뉜다.


보통 부품을 정면을 바라봤을 경우 좌우로 각각 다섯 개의 핀들이 나와 있는데 핀 번호는 다음과 같다.


  1. 실제 핀의 위치

(b) S-3191CSR 의 회로도상의 기호


7세그먼트로 표시할 수 있는 숫자와 문자를 예로 들면 다음과 같다.


기본적인 회로는 만약 5V 전원을 이용한다면 다음과 같이 꾸밀 수 있다.

(주의) 실험에 사용되는 S-3191CSR의 핀 배열은 일반적인 경우와 약간 다르다. 위의 그림대로 결선하면 된다.


이 회로대로 결선하면 7세그먼트의 모든 LED가 빛을 내게 된다.


'교육 > 전기전자' 카테고리의 다른 글

오실로스코프 제어판 및 디스플레이  (0) 2017.01.09
오실로스코프 개요  (0) 2017.01.09
저항  (0) 2016.09.19
도체, 부도체, 반도체  (0) 2016.09.15
직류와 교류  (0) 2016.09.15
Posted by 살레시오
,

2.3 외부 인터럽트

c{mpy02p03}

 NodeMCU모듈의 16번 핀을 제외한 GPIO핀들에 외부 인터럽트 핸들러를 붙여줄 수 있다. 예를 들어서 GPIO4 핀에 택스위치를 GND와 직결한 다음 풀업레지스터를 연결하여 FALLING EDGE를 검출하는 예제는 다음과 같다.


from machine import Pin
p4 = Pin(4, Pin.IN, Pin.PULL_UP)

# 인터럽트핸들러
# 인터럽트가 발생한 Pin 객체가 넘어온다.
def callback(pin):
   print('falling ',pin)

p4.irq(trigger=Pin.IRQ_FALLING,handler=callback)

먼저 Pin 객체를 입력+풀업저항으로 설정한 후 그 객체의 irq 메서드를 이용하여 인터럽트의 종류와 핸들러를 설정할 수 있다. 그리고 irq()  함수의 trigger 인수는 다음과 같이 세 가지로 설정할 수 있다.


trigger 인수

동작

Pin.IRQ_FALLING

핀이 1에서 0올 떨어질때 handler 호출

Pin.IRQ_RISING

핀이 0에서 1로 올라갈때 handler 호출

Pin.IRQ_RISING | Pin.IRQ_FALLING

두 경우 모두 handler 호출


이렇게 지정하면 해당하는 경우에 handler 인수로 지정해둔 함수가 호출된다. hadler의 인수로는 Pin 객체가 넘어온다.


 주의할 점은 동일한 핀에 IRQ_RISING과 IRQ_FALLING에 각각 다른 handler를 붙여줄 수 없다는 점이다. 하지만 위 표에서와 같이 두 경우 중 하나가 발생했을 때 모두 동일한 handler를 붙여줄 수 있으므로 그 함수 안에서 pin.value() 함수값을 읽으면 어떤 인터럽트가 발생했는지 확인할 수 있으므로 각각을 다르게 처리할 수는 있을 것이다.


 만약 기계식 접점에서 발생하는 인터럽트라면 채터링(chattering)현상으로 인해서 누를 때마다 여러 번의 인터럽트가 발생할기 쉽다. 이러한 채터링 현상을 제거하는 것을 디바운싱(debouncing)이라고 하는데 다음과 같이 간단히 프로그램으로 해결할 수 있다.


from machine import Pin
import time
p4 = Pin(4, Pin.IN, Pin.PULL_UP)

def callback(pin):
   time.sleep_ms(150)
   if pin.value()==0:
       #아래에 실제 처리할 코드를 넣는다.
       print('falling ',pin)

p4.irq(trigger=Pin.IRQ_FALLING,handler=callback)

여기에서 사용하는 방법은 채터링이 사라질 때까지 기다린 다음 핀의 값을 읽어서 여전히 0이라면 FALLING 인터럽트가 실제로 일어났다고 판단하는 것이다. 만약 RISING 인터럽트의 경우는 기다린 후 pin.value()가 아직도 1인지를 검사하면 될 것이다. 채터링이 사라지는  시간은 대락 100~200ms 정도로 알려져 있으므로 기다리는 시간은 적당히 설정하면 된다.


 외부 인터럽트는 실행하고 있는 모든 일을 중단시키고 즉시 handler 함수를 호출하며 메모리 할당 등은 할 수 없다. 또한 handler 함수는 되도록 짧고 간결하게 작성하여야 한다.

(현 시점에서 RISING 인터럽트 동작은 문제가 있는 것 같다.)



Posted by 살레시오
,

  티스토리 블로그에서 타이틀 링크를 업애려면 다음과 같이 HTML 편집기로 들어가서 comment out시킨다.


<div id="headerBox">
<div id="header">
<!--
<h1><a href="https://studymake.tistory.com/" title="스터디메이크">스터디메이크</a></h1>
-->
<div class="blogMenu"></div>
</div>

그런데 이렇게 하면 메뉴바가 밀려올라오게 된다. 메뉴바의 상하좌우 마진은 css파일의 다음을 편집하면 된다.


#header .blogMenu a { color:#0000ff;}
.blogMenu li {
list-style:none;
float:left;
       margin:0px 0px 0px 0px;/*top, right, bot,left*/
padding:0 4px;
background:url(images/menu_div.gif) no-repeat 0 3px;
}

여기서 처음 숫자가 위쪽 방향의 마진을 정하는 것이다. 이렇게 하면 타이틀 링크를 없애고 이미자와 메뉴바의 위치를 적절히 조절할 수 있다.



n{tistory001}


Posted by 살레시오
,

Introduction

 The ESPyHarp is a simple IDE for developing MicroPython program. It’s target board is ESP8266 based boards (e.g. NodeMCU) with MicroPython firmware. I like both ESP8266 and MicroPython. However, I had found the fact that there is no useful development tool (or IDE). So, I started to develop IDE for  personal use and named it ESPyHarp. It is written using JavaFX and an open source libraries such as RichTextFX, jSSC, etc. You can see or download the source code in github.com page.



Features

  • embedded REPL

  • files list in the device

  • code editor with python keyword and builtins highlight

  • upload and/or execute  python script

Requirements

 You need JVM(Java Virtual Machine) on your PC to run ESPyHarp. Then, download the released file below and execute ESPyHarp.jar file. On Windows you can run the jar file just double clicking on it. At this moment, I have tested only on Windows 7 PC.

Releases

ESPyHarp ver 0.1.1 (03/Oct/2016) : minor REPL bug fix

ESPyHarp ver 0.1.0 (01/Oct/2016) : initial release


c{espy}n{espy006}


Posted by 살레시오
,

  JavaFX 8u40 버전에 간단한 대화창/경고창 클래스들이 추가되었다.(참조) 예를 들어 경고창은 다음과 같이 간단히 생성할 수 있다.


Alert alert = new Alert(AlertType.WARNING);
alert.setTitle("Warning Dialog");
alert.setHeaderText("Look, a Warning Dialog");
alert.setContentText("Careful with the next step!");

alert.showAndWait();


동일한 Alert객체로 확인창도 생성할 수 있다.


Alert alert = new Alert(AlertType.CONFIRMATION);
alert.setTitle("Confirmation Dialog");
alert.setHeaderText("Look, a Confirmation Dialog");
alert.setContentText("Are you ok with this?");

Optional<ButtonType> result = alert.showAndWait();
if (result.get() == ButtonType.OK){
   // ... user chose OK
} else {
   // ... user chose CANCEL or closed the dialog
}


또는 간단한 문자열 입력기도 다음과 같이 간단히 생성하여 문자열을 입력받아 후처리를 할 수 있다.


TextInputDialog dialog = new TextInputDialog("walter");
dialog.setTitle("Text Input Dialog");
dialog.setHeaderText("Look, a Text Input Dialog");
dialog.setContentText("Please enter your name:");

result.ifPresent(name -> System.out.println("Your name: " + name));


 이전에는 이런 간단한 기능도 별도로 구현하기가 까다로웠는데 이제는 쉽게 할 수 있다.

n{espy}n{005}


Posted by 살레시오
,

  파이썬은 tab키를 보통 네 개의 공백문자로 치환하여 표시한다. richtextfx 라이브러리의 CodeArea 에서 이것을 수행하려면 다음 중 하나를 사용해야 한다.


codeArea.addEventFilter(KeyEvent.KEY_PRESSED, (keyEvent) -> {
   if (keyEvent.getCode() == KeyCode.TAB) {
       codeArea.insertText(codeArea.getCaretPosition(), "    ");
       keyEvent.consume();
   }
});

아래의 두 개는 동작 방식이 유사하다.


codeArea.addEventHandler(KeyEvent.KEY_PRESSED, (keyEvent) -> {
   if (keyEvent.getCode() == KeyCode.TAB) {
       codeArea.insertText(codeArea.getCaretPosition(), "    ");
       keyEvent.consume();
   }
});

codeArea.setOnKeyPressed( (keyEvent) -> {
   if (keyEvent.getCode() == KeyCode.TAB) {
       codeArea.insertText(codeArea.getCaretPosition(), "    ");
       keyEvent.consume();
   }
});

이들 중 가장 첫 번째 방법은 키입력이 처리되지 전에 람다함수가 호출되어 keyEvent.consume() 함수가 듣는다. 즉, tab키를 누르면 tab문자가 입력되기 전에 람다함수가 호출되고 그 안에서 consume() 되므로 결과적으로 공백문자들(4개)만 입력된다. 따라서 이 방법을 사용해야 한다.


 하지만 그 다음 두 개는 키입력이 된 다음에 람다함수가 호출된다. 따라서 consume()함수는 호출하나 마나이다. 이 경우 tab키를 누르면 먼저 입력창에 tab 문자가 입력되고 그 뒤에 공백문자들이 붙는다.


c{espy}n{004}


Posted by 살레시오
,

  이번 pyCon2016에서는 MicroPython 개발자인 D. George 의 두 가지 발표가 눈에 띈다. 참 이력이 독특하다고 생각되는 사람인데, 첫 번째는 마이크로파이썬의 시작부터의 과정을 설명해주는 영상이 있다. 앞으로의 지속적인 개발에 필요한 투자를 유치한 것 같아서 마이크로파이썬에 관심이 많은 사람으로서 기분이 좋다.

 두 번째는  IoT에 대한 발표 (pyCon2016) 이다. 아래에 링크를 걸었다.

제목 : Scripting the Internet of Things


Posted by 살레시오
,