루덴스코드 Blog

코딩과 교육 +85

소수구하는 알고리즘


예전에 파이썬으로 했던 소수 알고리즘이다.

2개의 수를 넣으면 그 두 수 사이의 모든 소수를 찾아서 화면에 출력한다.

실제로 소수를 찾는 시간은 매우 빠르지만 너무 많은 수를 출력하게 되면 화면 출력시간때문에 지연시간이 길어진다.



  • 2로 나누어 떨어지는 수는 소수가 아니므로 통과

  • 3으로 나누어 떨어지는 수는 소수가 아니므로 통과

  • 그러므로 3 이상의 모든 소수는 6k-1 또는 6k+1 에 해당한다. 모든 수에 대해서 % 연산을 수행하지 않고 6k-1, 6k+1 에 대해서만 수행한다.

  • 1부터 자기자신(N)까지의 모든 수를 대상으로 "N%(1...N)" 을 수행하지 않고, sqrt(N) 까지만 수행한다. 약수가 있다면 하나는 작은 수이고 다른 하나는 큰 수일텐데, 작은 수는 아무리 커도 sqrt(N) 보다는 작다. sqrt(N)*sqrt(N) = N 이므로 sqrt(N) 까지만 반복한다.

위의 조건에 따라 % 연산 결과가 0 이 되는 경우가 하나라도 발생하면 소수가 아니므로 그 상태에서 break; 를 수행


위의 조건을 따라 프로그램하면 다음과 같은 코드가 된다. (자바 코드)


package com.javalex.day3_1_primenumber;


public class PrimeNumberMake2 {

public static void primeMake(long startNumber, long endNumber) {

if (startNumber<=2 && endNumber >= 2) System.out.println(2 + "는 소수입니다");

if (startNumber<=3 && endNumber >= 3) System.out.println(3 + "는 소수입니다");

long modifiedNumber = 5;

if (startNumber > 5 ) modifiedNumber = startNumber;

for (long i = modifiedNumber; i<=endNumber; i++) {

boolean priNum = true;

if ((i%2==0)||(i%3==0)) priNum = false;

else {

for (int j=6; j<=(int)Math.sqrt(i)+1; j=j+6 ) {

if ((i%(j-1)==0)||(i%(j+1)==0)) { priNum = false; break; }

}

}

if (priNum==true) {

System.out.println(i+ "는 소수입니다");

}

}

}

}



아래는 위의 알고리즘이 적용되지 않은 소수 구하는 코드다. N 이 소수인것을 알기 위해 2 부터 N-1 까지 모두 나눠보고 0 으로 나누어서 떨어지는지를 검사한다. 보통 for 문을 배우면서 소수를 구하는 프로그램을 짜라고 시켜보면 이런식의 프로그램을 짠다. 


package com.javalex.day3_1_primenumber;


public class PrimeNumberMake0 {

public static void primeMake(long startNumber, long endNumber) {


if (startNumber<=2 && endNumber >= 2) System.out.println(2 + "는 소수입니다");

if (startNumber<=3 && endNumber >= 3) System.out.println(3 + "는 소수입니다");


long modifiedNumber = 4;

if (startNumber > 4 ) modifiedNumber = startNumber;

for (long i = modifiedNumber ; i<endNumber; i++) {

int priNum = 0;

for (int j=2; j<i; j++ ) {

if (i%j==0) priNum++;

}

if (priNum==0) System.out.println(i+ "는 소수입니다");

}

}

}



이 두개의 코드를 돌려서 걸리는 시간을 확인해 보았다. 이때 사용한 소스는 다음과 같다.


package com.javalex.day3_1_primenumber;


public class MainPrime {


public static void main(String[] args) {

long sNum = 100_000_000L;

long eNum = 100_000_100L;

long startTime;

startTime = System.currentTimeMillis();

PrimeNumberMake0.primeMake(sNum, eNum);

System.out.println((System.currentTimeMillis()-startTime)+"ms");


startTime = System.currentTimeMillis();

PrimeNumberMake2.primeMake(sNum, eNum);

System.out.println((System.currentTimeMillis()-startTime)+"ms");

}

}



결과는 다음과 같다.


100000007는 소수입니다

100000037는 소수입니다

100000039는 소수입니다

100000049는 소수입니다

100000073는 소수입니다

100000081는 소수입니다

194011ms

100000007는 소수입니다

100000037는 소수입니다

100000039는 소수입니다

100000049는 소수입니다

100000073는 소수입니다

100000081는 소수입니다

3ms


아무런 생각없이 그냥 짠 코드의 실행시간은 194초가 걸렸다. 내 PC 의 CPU 가 i3 라서 더 느리게 나왔다. 아마도 PC 성능이 좋으면 이보다는 조금 빨리 실행이 될 것이다. 반면 2의 배수, 3의 배수를 제외하고 6k+-1 의 항목만 검사하면서 2부터 N 까지가 아닌 까지 검사하면고, 소수가 아니면 바로 break 를 써서 빠진 결과는 3ms 가 나왔다.


194초 VS 0.003


저 차이가 바로 프로그램에 수학과 생각이 들어가야 하는 이유다.

Comment +0


온라인으로 동영상강좌를 만들고 있습니다.

코딩교육 기초과정과 이어서 아두이노 초급과정, 파이썬 초급과정을 만들었습니다.
그리고 이름을 "처음코딩"이라고 붙였습니다.
처음 시작하는 사람도 따라올 수 있고, 어린 친구들도 얼마든지 배울수 있는 그런 곳을 만들고 싶습니다.


현재 아두이노와 파이썬 기초를 올렸습니다. 앞으로 파이썬을 이용한 파이게임과 장고등을 올릴 예정입니다. 아두이노를 이용한 IoT 와 다양한 프로젝트 활용편도 올릴 예정입니다. 


[아두이노기초]

AB-01 아두이노 따라잡기 시작
AB-02 Arduino Paper Box
AB-03 실습에 필요한 준비물
AB-04 아두이노 IDE 설치
AB-05 Arduino IDE 업데이트 방법
AB-06 LED 점멸, 하드웨어 구성
AB-07 아두이노 LED 점멸, SW구성
AB-08 아두이노 LED 점멸, 하드웨어 해석
AB-09 3개의 LED 와 1개의 Switch
AB-10 3 LED & 1 Switch (Software 1/4)
AB-11 3 LED & 1 Switch (Software 2/4)
AB-12 3 LED & 1 Switch (Software 3/4)
AB-13 3 LED & 1 Switch (Software 4/4)
AB-14 아두이노2개로 신호등2개 연결하기
AB-15 C언어 기초 - 기본구조
AB-16 C언어 기초 - 하드웨어구성
AB-17 C언어 기초 - setup()
AB-18 C언어 기초 - loop() 함수
AB-19 C언어 기초 - 함수
AB-20 C언어기초 - { } 의미
AB-21 C언어기초 - 세미콜론 ;
AB-22 C언어기초 - 주석
AB-23 C언어기초 - 변수
AB-24 C언어 기초 - 변수의 종류
AB-25 C언어 기초 - 2의 보수
AB-26 C언어 기초 - 아스키테이블
AB-27 C언어 기초 - 연산/비교/논리/비트
AB-28 C언어 기초 - 상수(#define const)
AB-29 C언어 기초 - 조건문 if
AB-30 C언어 기초 - 반복문 for
AB-31 C언어 기초 - 반복문 while
AB-32 아두이노함수/LED 전류계산/풀업
AB-33 C언어 기초 - ADC / 샘플링, 양자화
AB-34 C언어 기초 - 수학함수
AB-35 C언어 기초 - 디버깅
AB-36 강의없음
AB-37 C언어 - millis()함수


[파이썬기초]



Comment +0

코드클럽의 스크래치 자료 링크 



1. 락 밴드

PDF

튜터용 지침서

자료(MATERIALS) 


1. 우주에서 길을 잃다

PDF

튜터용 지침서

자료(MATERIALS) 




Comment +0

Julian Meyer 라는 13세 소년이 만든 pygame 에 대한 튜토리얼이다. 이 게임은 기본적인 슈팅게임의 기본을 담고 있다. 방법을 익혀두면 다양하게 게임을 만들거나 응용이 가능하다. Beginning Game Programming for Teens with Python 이라는 이름으로 과정과 소스가 모두 인터넷에 공개되어 있다. 2.7 버젼으로 된 것을 최신 버젼인 3.6 버젼으로 수정했고, 일부 코드를 이해하기 쉽게 고쳤다.



STEP 0. 파이썬 & pygame 설치, 그래픽파일과 음악파일 준비


이 글은 윈도우 사용자를 위해 쓰였다. 리눅스나 맥은 가지고 있지 않은 관계로 설치해보질 못했으면 과정이 크게 다르지 않으리라는 것은 알지만 여기에 그 내용을 기록하지 않는다. 또한 원글과는 달리 최신 버젼인 파이썬 3.6 을 설치하여 사용하였다. 파이게임은 이글을 쓰는 당시에 있는 버젼인 1.9.3 을 설치하였다. 파이게임의 설치방법은


pip install pygame


으로 설치한다. 혹시 파이썬 설치방법을 모르는 사람은 다른 글을 통해 익히기 바란다.(가까운 시일내 파이썬 기본 강의를 올릴 예정이며 그때 파이썬 설치에 대해서 자세히 기록할 예정)


게임에 사용되는 배경음악과 그래픽 파일은 여기에서 다운로드하여 사용한다. 


[음악과 그래픽 다운로드]


이후의 과정은 최대한 설명은 생략하고 소스 중심으로 방법만 기술한다.



STEP 1. 토끼 보이기


다음의 코드를 사용한다.


# 1 - Import library
import pygame
from pygame.locals import *

# 2 - Initialize the game
pygame.init()
width, height = 640, 480
screen=pygame.display.set_mode((width, height))

# 3 - Load images
player = pygame.image.load("resources/images/dude.png")

# 4 - keep looping through
while 1:
    # 5 - clear the screen before drawing it again
    screen.fill(0)
    # 6 - draw the screen elements
    screen.blit(player, (100,100))
    # 7 - update the screen
    pygame.display.flip()
    # 8 - loop through the events
    for event in pygame.event.get():
        # check if the event is the X button 
        if event.type==pygame.QUIT:
            # if it is quit the game
            pygame.quit() 
            exit(0) 




STEP 2. 장면추가하기


다음 내용을 #3의 마지막 부분에 넣는다.


grass = pygame.image.load("resources/images/grass.png")
castle = pygame.image.load("resources/images/castle.png")


다음 코드를 #6 의 처음 부분에 추가한다.


for x in range(int(width/grass.get_width()+1)): for y in range(int(height/grass.get_height()+1)): screen.blit(grass,(x*100,y*100)) screen.blit(castle,(0,30)) screen.blit(castle,(0,135)) screen.blit(castle,(0,240)) screen.blit(castle,(0,345 ))


STEP 3. 토끼전사가 움직이게 하기


#2 의 마지막 부분에 다음 코드를 넣는다.

keys = [False, False, False, False]
playerpos=[100,100]


#6 에서 

    screen.blit(player, (100,100))

screen.blit(player, playerpos)

으로 바꾼다.

#8의 마지막 부분에서 for event.type==pygame.QUIT: 블럭 다음에 아래 코드를 넣는다.


        if event.type == pygame.KEYDOWN:
            if event.key==K_w:
                keys[0]=True
            elif event.key==K_a:
                keys[1]=True
            elif event.key==K_s:
                keys[2]=True
            elif event.key==K_d:
                keys[3]=True
        if event.type == pygame.KEYUP:
            if event.key==pygame.K_w:
                keys[0]=False
            elif event.key==pygame.K_a:
                keys[1]=False
            elif event.key==pygame.K_s:
                keys[2]=False
            elif event.key==pygame.K_d:
                keys[3]=False


파일의 마지막 부분에 아래 내용을 추가한다.


    # 9 - Move player
    if keys[0]:
        playerpos[1]-=5
    elif keys[2]:
        playerpos[1]+=5
    if keys[1]:
        playerpos[0]-=5
    elif keys[3]:
        playerpos[0]+=5


여기까지 코드를 실행시켜보면 키보드로 WASD 를 누를때 고양이전사가 움직인다.


STEP 4. 고양이전사 방향전환하기


atan2() 라는 수학함수를 사용한다. atan2 함수는 math 라이브러리를 사용한다.


#1 의 끝 부분에 다음을 추가한다.


import math

#6 의 마지막줄을 다음 내용으로 교체(수정)한다.

    # 6.1 - Set player position and rotation
    position = pygame.mouse.get_pos()
    angle = math.atan2(position[1]-(playerpos[1]+32),position[0]-(playerpos[0]+26))
    playerrot = pygame.transform.rotate(player, 360-angle*57.29)
    playerpos1 = (playerpos[0]-playerrot.get_rect().width/2, playerpos[1]-playerrot.get_rect().height/2)
    screen.blit(playerrot, playerpos1) 


STEP 5. 발사 !


#2 의 마지막 부분에 다음 코드를 추가한다.

acc=[0,0]
arrows=[]


#3 의 마지막 부분에 화살 이미지를 넣는 코드를 추가한다.

arrow = pygame.image.load("resources/images/bullet.png")

#8 마지막 부분에 새로운 이벤트 핸들러를 추가한다.
        if event.type==pygame.MOUSEBUTTONDOWN:
            position=pygame.mouse.get_pos()
            acc[1]+=1
            arrows.append([math.atan2(position[1]-(playerpos1[1]+32),position[0]-(playerpos1[0]+26)),playerpos1[0]+32,playerpos1[1]+32])


#6.1 바로 다음에 아래 코드를 추가한다.

    # 6.2 - Draw arrows
    for bullet in arrows:
        index=0
        velx=math.cos(bullet[0])*10
        vely=math.sin(bullet[0])*10
        bullet[1]+=velx
        bullet[2]+=vely
        if bullet[1]<-64 or bullet[1]>640 or bullet[2]<-64 or bullet[2]>480:
            arrows.pop(index)
        index+=1
        for projectile in arrows:
            arrow1 = pygame.transform.rotate(arrow, 360-projectile[0]*57.29)
            screen.blit(arrow1, (projectile[1], projectile[2]))


STEP 6. 오소리 출현

#2 마지막 부분에 아래 코드 추가

badtimer=100
badtimer1=0
badguys=[[640,100]]
healthvalue=194


#3 마지막 부분에 다음 코드 추가

badguyimg1 = pygame.image.load("resources/images/badguy.png")
badguyimg=badguyimg1


#6.2 다음에 아래 코드 추가

    # 6.3 - Draw badgers
    if badtimer==0:
        badguys.append([640, random.randint(50,430)])
        badtimer=100-(badtimer1*2)
        if badtimer1>=35:
            badtimer1=35
        else:
            badtimer1+=5
    index=0
    for badguy in badguys:
        if badguy[0]<-64:
            badguys.pop(index)
        badguy[0]-=7
        index+=1
    for badguy in badguys:
        screen.blit(badguyimg, badguy)


랜덤함수 사용을 위해서 다음 코드를 #1 의 끝 부분에 추가

import random

#4 의 while 문 바로 다음에 badtimer 를 감소시키는 코드 추가
    badtimer-=1

#6.3 의 첫번째 for 반복문 안에서 index+=1 바로 앞에 아래 코드를 추가
        # 6.3.1 - Attack castle
        badrect=pygame.Rect(badguyimg.get_rect())
        badrect.top=badguy[1]
        badrect.left=badguy[0]
        if badrect.left<64:
            healthvalue -= random.randint(5,20)
            badguys.pop(index)
        # 6.3.3 - Next bad guy


STEP 7. 오소리와 화살이 만날때


#6.3.1 아래에 다음 코드를 추가

        #6.3.2 - Check for collisions
        index1=0
        for bullet in arrows:
            bullrect=pygame.Rect(arrow.get_rect())
            bullrect.left=bullet[1]
            bullrect.top=bullet[2]
            if badrect.colliderect(bullrect):
                acc[0]+=1
                badguys.pop(index)
                arrows.pop(index1)
            index1+=1


STEP 8. 체력바와 시간 나타내기


#7 의 시작전에 아래 코드를 추가

# 6.4 - Draw clock font = pygame.font.Font(None, 24) survivedtext = font.render(str(int(90000-pygame.time.get_ticks()))+":"+str(int((90000-pygame.time.get_ticks())/1000%60)).zfill(2), True, (0,0,0)) textRect = survivedtext.get_rect() textRect.topright=[635,5] screen.blit(survivedtext, textRect)


#3 의 끝부분에 다음 코드를 추가

healthbar = pygame.image.load("resources/images/healthbar.png")
health = pygame.image.load("resources/images/health.png")


#6.4 다음에 아래 코드를 추가

    # 6.5 - Draw health bar
    screen.blit(healthbar, (5,5))
    for health1 in range(healthvalue):
        screen.blit(health, (health1+8,8))


STEP 9. WIN / LOSE


아래 코드를 마지막 부분에 추가

    #10 - Win/Lose check
    if pygame.time.get_ticks()>=90000:
        running=0
        exitcode=1
    if healthvalue<=0:
        running=0
        exitcode=0
    if acc[1]!=0:
        accuracy=acc[0]*1.0/acc[1]*100
    else:
        accuracy=0
# 11 - Win/lose display        
if exitcode==0:
    pygame.font.init()
    font = pygame.font.Font(None, 24)
    text = font.render("Accuracy: "+str(accuracy)+"%", True, (255,0,0))
    textRect = text.get_rect()
    textRect.centerx = screen.get_rect().centerx
    textRect.centery = screen.get_rect().centery+24
    screen.blit(gameover, (0,0))
    screen.blit(text, textRect)
else:
    pygame.font.init()
    font = pygame.font.Font(None, 24)
    text = font.render("Accuracy: "+str(accuracy)+"%", True, (0,255,0))
    textRect = text.get_rect()
    textRect.centerx = screen.get_rect().centerx
    textRect.centery = screen.get_rect().centery+24
    screen.blit(youwin, (0,0))
    screen.blit(text, textRect)
while 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit(0)
    pygame.display.flip()


#3 의 마지막 부분에 아래 코드를 추가

gameover = pygame.image.load("resources/images/gameover.png")
youwin = pygame.image.load("resources/images/youwin.png")


#4의 아래 내용을 수정한다.

[수정전]

# 4 - keep looping through
while 1:
    badtimer-=1

[수정후]

# 4 - keep looping through
running = 1
exitcode = 0
while running:
    badtimer-=1


STEP 10. 배경음악과 효과음악


#2 마지막 부분에 추가

pygame.mixer.init()

#3의 마지막 부분에 추가
# 3.1 - Load audio
hit = pygame.mixer.Sound("resources/audio/explode.wav")
enemy = pygame.mixer.Sound("resources/audio/enemy.wav")
shoot = pygame.mixer.Sound("resources/audio/shoot.wav")
hit.set_volume(0.05)
enemy.set_volume(0.05)
shoot.set_volume(0.05)
pygame.mixer.music.load('resources/audio/moonlight.wav')
pygame.mixer.music.play(-1, 0.0)
pygame.mixer.music.set_volume(0.25)


#6.3.1 의 if badrect.left<64: 다음에 아래 코드 추가

# section 6.3.1 after if badrect.left<64:
hit.play()


#6.3.2 의 if badrect.colliderect(bullrect): 다음에 아래 코드 추가

# section 6.3.2 after if badrect.colliderect(bullrect):
enemy.play()


#8 의 if event.type==pygame.MOUSEBUTTONDOWN: 다음에 아래 코드 추가

# section 8, after if event.type==pygame.MOUSEBUTTONDOWN:
shoot.play()


Comment +0


◆ 함수 

함수는 재사용 가능한 프로그램의 조각을 말합니다. 이것은 특정 명령어들을 묶어서 이름을 짓고, 그 이름을 프로그램 어디에서건 사용함으로써 그 명령어들을 몇번이고 다시 실행할 수 있게 하는 것입니다. 이를 보고 함수를 호출한다고 합니다. 


def say_hello():

    # block belonging to the function

    print('hello world')

    # End of function


say_hello() # call the function

say_hello() # call the function again



◆ 함수와 매개변수


함수를 정의할 때 매개 변수를 지정할 수 있습니다. 매개 변수란 함수로 넘겨지는 값들의 이름입니다. 매개 변수는 변수와 거의 같이 취급되지만, 매개 변수의 값들은 함수가 호출되어질 때 넘겨받은 값들로 채워지며 함수가 실행되는 시점에서는 이미 할당이 완료되어 있다는 점이 다릅니다.


매개 변수는 함수를 정의할 때 괄호 안에서 쉼표로 구분합니다. 함수를 호출할 때에는, 동일한 방법으로 함수에 값을 넘겨줍니다. 함수를 정의할 때 주어진 이름을 매개 변수라 부르고, 함수에 넘겨준 값들을 인자라 합니다.


def print_max(a, b):

    if a > b:

        print(a, 'is maximum')

    elif a == b:

        print(a, 'is equal to', b)

    else:

        print(b, 'is maximum')

# directly pass literal values

print_max(3, 4)

x = 5

y = 7

# pass variables as arguments

print_max(x, y)



◆ 지역변수

함수 안에서 변수를 선언하고 사용할 경우, 함수 밖에 있는 같은 이름의 변수들과 함수 안에 있는 변수들과는 서로 연관이 없습니다. 이러한 변수들을 함수의 지역(local) 변수라고 하며, 그 범위를 변수의 스코프(scope) 라고 부릅니다. 모든 변수들은 변수가 정의되는 시점에서의 블록을 스코프로 가지게 됩니다.



x = 50

def func(x):

    print('x is', x)

    x = 2

    print('Changed local x to', x)


func(x)

print('x is still', x)



◆ 전역변수


함수나 클래스 내부에서 상위 블록에서 선언된 변수의 값을 변경하고 싶을 경우, 파이썬에게 이 변수를 앞으로 지역 변수가 아닌 전역(global) 변수로 사용할 것임을 알려 줍니다. 이때 global을 이용합니다. global 문을 사용하지 않으면, 함수 외부에서 선언된 변수의 값을 함수 내부에서 변경할 수 없습니다.


x = 50


def func():

    global x

    print('x is', x)

    x = 2

    print('Changed global x to', x)


func()

print('Value of x is', x)


# 함수 내부에서 global 로 변수가 전역변수임을 알린다.

# 4번째 줄이 없으면 에러 발생



◆ 기본 인수값

함수를 호출할 때 인수를 선택적으로 넘겨주게 하여 사용자가 값을 넘겨주지 않으면 자동으로 기본값을 사용하도록 하는 것이 편할 때가 있습니다. 이런 경우, 기본 인수값을 지정하면 됩니다. 함수를 선언할 때 원하는 매개 변수 뒤에 대입 연산자 (=)와 기본값을 입력하여 기본 인수값을 지정합니다.


이 때, 기본 인수값은 반드시 상수이어야 합니다. 좀 더 정확히 말하자면, 불변값이어야 합니다. 


def say(message='HI ', times=1):

    print(message * times)


say('Hello')

say('World', 5)

say()

# say( , 10)



◆ 키워드 인수

여러 개의 매개 변수를 가지고 있는 함수를 호출할 때, 그 중 몇 개만 인수를 넘겨주고 싶을 때가 있습니다. 이때 매개 변수의 이름을 지정하여 직접 값을 넘겨줄 수 있는데 이것을 키워드 인수 라 부릅니다. 함수 선언시 지정된 매개 변수의 순서대로 값을 넘겨주는 것 대신, 매개 변수의 이름 (키워드) 를 사용하여 각각의 매개 변수에 인수를 넘겨 주도록 지정해 줍니다.


키워드 인수를 사용하는 데 두가지 장점이 있습니다. 첫째로, 인수의 순서를 신경쓰지 않고도 함수를 쉽게 호출할 수 있는 점입니다. 둘째로는, 특정한 매개 변수에만 값을 넘기도록 하여 나머지는 자동으로 기본 인수값으로 채워지게 할 수 있습니다.


def func(a, b=5, c=10):

    print('a is', a, 'and b is', b, 'and c is', c)


func(3, 7)

func(25, c=24)

func(c=50, a=100)


func(1,2,3)

func(a=1,b=2,c=3)

func(c=3,a=1,b=2)




◆ VarArgs 매개변수

함수에 임의의 개수의 매개 변수를 지정해주어야 할 때가 있습니다. 이때 VarArgs 매개 변수를 사용합니다. 아래 예제와 같이 별 기호를 사용하여 임의의(Variable) 개수의 인수(Arguments) 를 표현합니다.


def total(initial=5, *numbers, **keywords):

    count = initial   

    for number in numbers:

        count += number

    for key in keywords:   

        count += keywords[key]

    return count


print(total(10, 1, 2, 3, vegetables=50, fruits=100))




◆ return 문

return 문은 함수로부터 되돌아(return) 나올 때, 즉 함수를 빠져 나올 때 사용됩니다. 이 때 return 값 처럼 값을 지정해 주면, 함수가 종료될 때 그 값을 반환하도록 할 수 있습니다.


def maximum(x, y):

    if x > y:

       return x

    elif x == y:

       return 'The numbers are equal'

    else:

       return y


print(maximum(2, 3))



◆ DocString : 설명문자열

파이썬은 설명(Documentation) 문자열(String) 이라고 불리우는, 짧게 줄여서 DocStrings라 불리우는 편리한 기능을 가지고 있습니다. DocString은 여러분이 만든 프로그램을 알아보기 쉽게 해 주고, 또 후에 프로그램에 대한 설명서를 작성할 때 유용하게 사용될 수 있는 중요한 도구입니다. 아래 예제와 같이, DocString은 프로그램이 실행중일 때도 읽어올 수 있습니다.


def print_max(x, y):

    '''Prints the maximum of two numbers.

    

    The two values must be integers.'''

    x = int(x)

    y = int(y)

    if x > y:

        print(x, 'is maximum')

    else:

        print(y, 'is maximum')


print_max(3, 5)

print(print_max.__doc__)



◆ 파이썬 turtle 모듈 사용하기

1. 사용하려는 모듈 가져오기 (import)

import turtle

2. 캔버스생성

t = turtle.Pen()

3. 거북이 움직이기

t.forward(거리)

t.backward(거리)

t.left(각도)

t.right(각도)

t.reset()

t.clear()

t.up()

t.down()


4. 사각형을 그려보자


import turtle


t = turtle.Pen()


t.forward(100)

t.left(90)

t.forward(100)

t.left(90)

t.forward(100)

t.left(90)

t.forward(100)


5. 다음 코드를 실행해보자



import turtle


t = turtle.Pen()


for i in range(0,36):

    t.forward(100)

    t.left(50)



터틀그래픽 기본 자료 https://docs.python.org/3.6/library/turtle.html



Comment +0



◆ 학점 프로그램을 만든다면 ?


점수

학점

점수에 따른 학점의 기준을 만든다

) 95점 이상 A+, 60점 미만 F

첫번째 줄의 점수를 판단

) 96점은 95점 이상이므로 A+

다음 줄로 계속 이동하면서 를 반복

) 51점은 60점 미만이므로 F

더 이상 점수가 없을 때 프로그램 종료

96

 ?

51

 ?

69

 ?

15

 ?


프로그램을 만들 때 조건과 반복은 필수


◆ 조건문이란?

조건에 따라 특정한 동작을 하게 하는 것


if 문은 조건을 판별할 때 사용됩니다. if (만약) 조건이 참이라면, if 블록의 명령문을 실행하며 else (아니면) 면 else 블록의 명령문을 실행합니다. 이 때 else 조건절은 생략이 가능합니다.


if True:

    print('Yes, it is true’)



number = 23

guess = int(input('Enter an integer : '))

if guess == number:

    # New block starts here

    print('Congratulations, you guessed it.')

    print('(but you do not win any prizes!)')

    # New block ends here

elif guess < number:

    # Another block

    print('No, it is a little higher than that')

    # You can do whatever you want in a block ...

else:

    print('No, it is a little lower than that')

    # you must have guessed > number to reach here

print('Done')

# This last statement is always executed,

# after the if statement is executed.



◆ 반복문 : while 

while 문은 특정 조건이 참일 경우 계속해서 블록의 명령문들을 반복하여 실행할 수 있도록 합니다. while 문은 *반복문*의 한 예입니다. 또한 while 문에는 else 절이 따라올 수 있습니다.

 

number = 23

running = True

while running:

    guess = int(input('Enter an integer : '))

    if guess == number:

        print ('Congratulations, you guessed it.')

        # this causes the while loop to stop

        running = False

    elif guess < number:

        print ('No, it is a little higher than that.')

    else:

        print ('No, it is a little lower than that.')

else:

    print ('The while loop is over.')

       # Do anything else you want to do here

print ('Done')



◆ for 루프

for..in 문은 객체의 열거형(Sequence)을 따라서 반복하여 실행할 때 사용되는 파이썬에 내장된 또 하나의 반복문으로, 열거형에 포함된 각 항목을 하나씩 거쳐가며 실행합니다. 열거형에 대해서는 이후에 좀 더 자세히 다룰 것입니다. 일단 여기서는, 열거형이란 여러 항목이 나열된 어떤 목록을 의미한다고 생각하시기 바랍니다.


for i in range(1, 5):

    print (i)

else:

    print ('The for loop is over')



◆ break 문

break 문은 루프 문을 강제로 빠져나올 때, 즉 아직 루프 조건이 `False`가 되지 않았거나 열거형의 끝까지 루프가 도달하지 않았을 경우에 루프 문의 실행을 강제로 정지시키고 싶을 때 사용됩니다.


중요한 점은 만약 여러분이 break 문을 써서 for 루프나 while 루프를 빠져나왔을 경우, 루프에 딸린 else 블록은 실행되지 않습니다.


while True:

    s = input('Enter something : ')

    if s == 'quit':

        break

    print ('Length of the string is', len(s))

print ('Done')


◆ continue 문

continue 문은 현재 실행중인 루프 블록의 나머지 명령문들을 실행하지 않고 곧바로 다음 루프로 넘어가도록 합니다.


while True:

    s = input('Enter something : ')

    if s == 'quit':

        break

    if len(s) < 3:

        print('Too small')

        continue

    print('Input is of sufficient length')

        # Do other kinds of processing here...


HW : 

1. 하나의 숫자를 입력받은 후 1) 짝수인지 여부와 2) 3의 배수인지 여부를 출력

2. 로또 번호 출력기 만들기

2.1. 5개의 로또번호를 만든다.

2.2. 5개의 숫자를 입력받은 후 번호가 맞는지 확인하는 것을 반복한다. 

2.3. 5개 번호가 다 맞으면 5개 번호와 시행횟수를 출력한다.

3. 숫자를 입력받은 후 그 숫자만큼 * 을 출력하는 프로그램

3.1. ******** (한줄로 출력)


 3.2.

 3.3

 3.4

 3.4

3.5 

 3.6

*

**

***

****

*****

    *

   **

  ***

 ****

*****


*****

****

***

**

*

*****

 ****

  ***

   **

    *

    *

   ***

  *****

 *******

*********

*********

 *******

  *****

   ***

    *



 

Comment +0


◆ 주석 - # 문자 뒤에 따라오는 짧은 문장


print('hello world') # Note that print is a statement

# Note that print is a statement


◆ 리터럴 상수

- 5

- 1.23

- ‘This is a book’

- “Sting”


◆ 숫자형

- 정수형 : 5

- long 형이 없다


import sys


t1 = sys.maxsize

# t1 = sys.maxint


t2 = t1+1 #int범위를 넘으면 long 자동 형 변환

t3 = t2**10


print(t1)

print(t2)

print(t3)


print(type(t1))

print(type(t2))

print(type(t3))


- 소수점 숫자형 : 4.16, 52.3E-3 (= )


◆ 문자열


◆ 작은 따옴표(‘’)와 큰 따옴표(“”)


◆ 따옴표 세 개


◆ 문자열 수정은 불가


◆ format()

str_format.py


age = 26

name = 'Python'


print('{0} was {1} years old'.format(name, age))

print('{0} is easy'.format(name))



◆ format() 대신 문자열 더하기


print(name + ' is ' + str(age) + ' years old')


※ 위의 형식보다는 format()을 사용하는 것을 추천


◆ 중괄호 숫자 생략 가능


age = 19

name = 'Baram'


print('{} was {} years old'.format(name, age))

print('Why is {} playing with that python?'.format(name))



◆ format() 의 또 다른 사용법


# 소수점 이하 셋째 자리까지 부동 소숫점 숫자 표기 (0.333)

print('{0:.3f}'.format(1.0/3))

# 밑줄(_)로 11칸을 채우고 가운데 정렬(^)하기 (___hello___)

print('{0:_^11}'.format('hello'))

# 사용자 지정 키워드를 이용해  표기

print('{name} wrote {book}'.format(name='Baram', book='Easy Arduino'))



◆ print() 사용시 줄바꿈을 막으려면,


print("Hello ", end='')

print("World")



◆ 특수(Escape) 문자

\'

"'"

'"'

\"

\\

\n

\t


◆ 순문자열 

r"Newlines are indicated by \n“


◆ 변수


- 식별자의 첫 문자는 알파벳 문자 (ASCII 대/소문자 혹은 유니코드 문자)이거나 밑줄 (_)


- 나머지는 문자 (ASCII 대/소문자 혹은 유니코드 문자), 밑줄 (_), 또는 숫자 (0-9)


- 식별자는 대/소문자를 구분. 예를 들어, myname 과 myName 은 다르다.


- 올바른 식별자 이름은 i, name_2_3 등과 같고, 올바르지 않은 식별자 이름은 2things, this is spaced out, my-name, >a1b2_c3 등입니다.



◆ 명시적 행간결합


s = ' Hello \

World'


print(s)


◆ 들여쓰기 – 4칸 들여쓰기


◆ 연산자


>>> 2 + 3

5

>>> 3 * 5

15

>>>



+ (덧셈 연산자)

- (뺄셈 연산자)

* (곱셈 연산자)

** (거듭제곱 연산자)

/ (나눗셈 연산자)

% (나머지 연산자)

<< (왼쪽 시프트 연산자)

>> (오른쪽 시프트 연산자)

& (비트 AND 연산자)

| (비트 OR 연산자)

^ (비트 XOR 연산자)

~ (비트 반전 연산자)

< (작음)

> (큼)

<= (작거나 같음)

>= (크거나 같음)

== (같음)

!= (같지 않음)

not (불리언 NOT 연산자)

and (불리언 AND 연산자)

or (불리언 OR 연산자)


◆ 연산 및 할당 연산자


a = a*3 은

a *= 3 과 동일


◆ 연산순서


● lambda

● if – else

● or

● and

● not x

● in, not in, is, is not, <, ⇐, >, >=, !=, ==

● |

● ^

● &

● <<, >>

● +, -

● *, /, //, %

● +x, -x, ~x

● **

● x[index], x[index:index], x(arguments…​), x.attribute

● (expressions…​), [expressions…​], {key: value…​}, {expressions…​}



◆ ( ) 이용한 연산순서 변경

● 2 + 3 * 4 + 5

● 2 + 3 * (4 + 5)

● 2 + (3 * (4 + 5))





Comment +0


파이썬은 배우기 쉽고, 강력한 프로그래밍 언어입니다. 파이썬은 효율적인 고수준 데이터 구조를 갖추고 있으며, 간단하지만 효과적인 객체 지향 프로그래밍 접근법 또한 갖추고 있습니다. 우아한 문법과 동적 타이핑, 그리고 인터프리팅 환경을 갖춘 파이썬은 다양한 분야, 다양한 플랫폼에서 사용될 수 있는 최적의 스크립팅, RAD(rapid application development - 빠른 프로그램 개발) 언어입니다.


◆ 파이썬이라는 이름의 유래

파이썬의 창시자 귀도 반 로섬(Guido van Rossum)이 BBC에서 방영되던 "Monty Python’s Flying Circus"라는 TV 프로그램의 이름을 따서 지었습니다. 사실 귀도는 뱀이라는 긴 몸으로 다른 동물의 몸을 휘감아 으깨어 부수고 먹어치우는 동물을 딱히 좋아하지는 않는다고 합니다.


◆ 파이썬의 특징


● 단순함(Simple)

● 쉬움(Easy to Learn)

● 오픈 소스(Free and Open Source)

● 고수준 언어(High-level Language)

● 이식성(Portable)

● 인터프리터 언어(Interpreted)

● 객체 지향 언어(Object Oriented)

● 확장성(Extensible)

● 포함성(Embeddable)

● 확장 가능한 라이브러리(Extensive Libraries)


요약 - 흥미진진하고 강력한 언어. 재미있고 쉽게 프로그램을 작성할 수 있음


◆ Python 2.x 에서 Python 3.x 으로 바뀌면서 생긴 변화들


1. python 3.x – 변수가 객체로 처리


2. print에서 ( ) 필수 사용

Python 2

Python 3

print ‘hello’

print(’hello’)


3. str 과 unicode 통일됨

Python 2

Python 3

print( type('hello') )

print( type(u'hello') )

# <type 'str'>

# <type 'unicode'>

print( type('hello') )

print( type(u'hello') )

# <class 'str'>

# <class 'str'>


모든 문자열은 별도로 지정하지 않아도 유니코드로 설정됨


4. int 나누기 결과가 float 으로 저장

Python 2

Python 3

print( 1/4 )

print( type(1/4) )

# 0

# <type 'int'>

print( 1/4 )

print( type(1/4) )

# 0.25

# <class 'float'>



5. long → int로 통일


Python 2

Python 3

print( 2**30 )

print( type(2**30) )

print( 2**100 )

print( type(2**100) )

# 1073741824

# <type 'int'>

# 1267650600228229401496703205376

# <type 'long'>

print( 2**30 )

print( type(2**30) )

print( 2**100 )

print( type(2**100) )

# 1073741824

# <class 'int'>

# 1267650600228229401496703205376

# <class 'int'>


◆ 개발환경 구성 - 윈도우 환경에서의 설치


https://www.python.org/downloads/ 의 최신버전의 설치 프로그램을 설치

설치 방법은 다른 소프트웨어를 설치 할 때와 동일 


주의: 혹시 설치 도중 기본으로 설치하도록 표시된 "추가 기능"을 선택하지 않을 것인지 물어도, 선택을 해제하지 마세요.



◆ 개발환경 구성 – 아톰 IDE 설치


공식 홈페이지 http://atom.io 에 들어가면 상단에 윈도우즈용 다운로드 버튼이 나타납니다.

인스톨 파일을 다운받았다면 실행시켜서 설치하면 되겠습니다. 설치시와 실행시, 외부와의 커넥션이 있으므로 방화벽이 있는 시스템의 경우 통신을 허락해주어야 합니다.


◆ 명령 프롬프트 사용하기

파이썬을 윈도우의 명령 프롬프트 상에서 사용하기 위해 PATH 환경 변수를 설정


윈도우 2000, XP, 2003의 경우, “제어판 → 시스템 → 고급 → 환경 변수”로 들어가세요. “시스템 변수” 목록에 있는 “PATH”를 선택한 뒤, “편집” 버튼을 누르고 파이썬을 설치한 폴더(디렉토리)가 있는지 확인하세요. 만약 없다면 디렉토리를 PATH 에 추가해서 넣어주세요. 


그 이전 버전의 윈도우를 사용하시는 분들은, C:\AUTOEXEC.BAT`를 열고 맨 뒷줄에 `PATH=%PATH%;C:\Python35 이라고 마지막에 한 줄 추가한 뒤 시스템을 재시작하세요. 윈도우 NT의 경우, AUTOEXEC.NT 파일을 편집하세요.



◆ 파이썬 실행

PATH 환경변수가 제대로 설정되어 있다면, 파이썬 인터프리터를 명령 프롬프트 상에서도 실행하실 수 있습니다.


윈도우 환경에서 터미널 창을 열기 위해서는, 시작 메뉴를 누르고 실행 버튼을 클릭하세요. 나타나는 대화상자에 “cmd” 를 입력하시고 enter 키를 입력하세요.


이제, “python” 을 입력하고 파이썬 프롬프트가 잘 실행되는지 확인하세요.


잘 되면, print(‘Hi Baram’)를 넣어 보세요. 파이썬 프로그램을 마칠때는 exit()를 입력하고 엔터를 치면 됩니다.



◆ Linux 에서의 설치


GNU/Linux 사용자의 경우, 파이썬이 이미 설치되어 있을 것입니다.


확인하시려면, 터미널 프로그램을 열거나 혹은 Alt+F2 키를 입력한 뒤 “gnome-terminal”을 입력하여 터미널을 실행하세요. 만약 이 두 방법으로 터미널을 실행시킬 수 없으면, 여러분이 설치한 리눅스 배포판의 설명서를 참조하세요. 이제, “python”을 입력하고 문제가 없는지 확인하세요.


다음과 같이 입력하면 시스템에 설치된 파이썬의 버전을 확인할 수 있습니다.


$ python -V

Python 3.5.3 (버젼에 따라 다르게 나올 수 있습니다.)



◆ “Hello World” 프로그램 작성

파이썬에서 프로그램을 실행하는 방법은 두 가지가 있습니다. 첫째는 대화형 인터프리터 프롬프트를 이용하는 방법과, 둘째는 소스 파일을 이용하는 것입니다. 지금부터 두 방법 모두 알아보도록 하겠습니다.


1. 인터프리터 프롬프트에서의 실행


     print("Hello World“)


2. 편집기 사용, 소스파일 실행


PyCharm Community 또는 atom 사용


PyCharm 설치 후 hello.py 저장, 실행


hello.py 이름으로 파일을 만들고 내용으로


print('Hello World')


를 넣습니다. 명령어입력창으로 가서 python hello.py를 칩니다.




Comment +0



인터넷에 상당히 좋은 자료들이 많다. 파이썬은 새로운 언어이고, 쉬우면서도, 짧은 시간에 개발자들이 가장 많이 쓰는 언어가 되었다.

파이썬을 배우기에 적당한 자료들을 모아둔다.


[Python 기본문법]

  • A Byte of Python : https://goo.gl/bXa14i
  • 온라인 파이썬입문  https://goo.gl/Tb68ur
  • codecademy 학습 https://goo.gl/I7sxQ1

[pyQt - GUI]
  • 영문튜토리얼 https://goo.gl/Sx1yOl

[DJango - 웹]
  • 장고걸스 튜토리얼 https://goo.gl/t6SKPI


Comment +0


Python 예약어 (Reserved Words):

  • 파이썬의 예약어는 모두 30개입니다.
  • 예약어는 변수 나 함수등의 이름으로 사용 할 수 없습니다.
  • 예약어는 모두 소문자입니다. 
KeywordKeywordKeyword
andexecnot
assertfinallyor
breakforpass
classfromprint
continueglobalraise
defifreturn
delimporttry
elifinwhile
elseiswith
exceptlambdayield


Comment +0

word cloud 를 만들어 보기위해 하루 공부했다. 다행히 R 이나 파이썬이 어려운 언어가 아니고, 기존에 어느정도 알고 있는 것들이라 쉽게 적용할 수 있었다.


아직 모양은 조금 더 다듬어졌으면 하지만 이정도만 해도 우선은 합격이다. 더 필요한 것은 나중에 Big Data 를 다루면서 한번 더 해보기로 한다.


설치와 기타 모든 과정은 생략한다. 다음번에 기회가 되면 파이썬과 R 을 이용한 워드클라우드 만들기를 강의로 올리도록 하겠다.


파이썬으로 만든 Word Cloud 의 데이터는 5인의 대선후보 수락 연설문이다. 가져온 데이터의 위치는  http://raythep.mk.co.kr/newsView.php?cc=270001&no=13153 이고, 여기서 PDF 내부의 raw 데이터를 추출해 내어서 별도의 위치에 저장해 두었다.


https://github.com/eventia/CandSpeech


위 링크를 따라가면 5 명의 후보 수락 연설문의 raw 데이터와 함께 본 작업을 수행한 파이썬의 코드가 있다. 파이썬 버젼은 3.4 였으며, 조금만 변형하면 2.7 로도 가능하다. 원 소스는 [ http://konlpy.org/ko/v0.4.3/examples/wordcloud/ ] 에 있으며, 파이썬 2.7 버젼에서 KoNLPy 를 사용한다.


한글로 word cloud 를 만들기 위해 폰트를 추가로 넣어주는 과정이 있었으나, 그 과정을 포함하여 세부적인 기술사항은 이 글에서는 생략한다. 




1번 문재인 후보의 연설문으로 word cloud 를 작성한 것이다. 글씨 크기는 본문안에 그 단어가 몇번 나왔는지의 비중에 따라 달라진다. 가장 많이 사용한 단어는 국민이고, 다른 후보들과는 조금 특이한 점이 "저"라는 겸양대명사의 사용이 두드러진다. "대통령" 이라는 말보다 "저"의 빈도가 높다. 또 다른 후보들과 달리 자신의 이름 "문재인"을 호명하는 횟수가 적다. 총 2번이다. 실제로 "국민"이라는 말은 다른 단어에 포함된 것을 합하면 총 33번 등장한다. 어쨌거나 있는 그대로를 가지고 word cloud 를 만들어야 한다는 생각으로 별도로 자료에 대한 수정을 가하지는 않았다.



2번 홍준표 후보의 경우 "대통령"이라는 말이 연설문 안에서 큰 비중을 차지한다. 의도적으로 그 단어를 자주 드러냄으로서 원하는 것을 제대로 강조하고 있다. 그 외에 대한민국, 계파, 우리, 당, 좌파 등의 단어가 자주 언급된다. 자신의 이름도 자주 언급한다. 내용은 차치하고 단어 선택에 있어서 산만하지 않고 제대로 한길을 파고 있다는 것이 보인다.




3번 안철수 후보의 연설문에는 두드러지게 "국민"이라는 말이 등장한다. 문재인의 연설문에도 "국민"이 큰 빈도를 가지지만 안철수의 연설문에서 "국민"의 언급횟수는 문재인의 언급횟수를 뛰어 넘는다. 나, 여러분, 미래, 대통령, 승리, 안철수 등이 자주 등장한다. 한글 자연어 처리 방법에서 , 를 제대로 처리하지 못하는 것 때문에 "안철수,"와 "안철수"가 별도의 단어처럼 되어 2번 등장한다. 이것을 합치면 안철수 후보의 연설문속에 자신의 이름을 반복해서 언급하는 비중은 다섯 후보중 가장 많다. 문재인이 "저"라는 겸양대명사를 썼다면 안철수는 자신의 이름 "안철수"를 대중들에게 각인시키는 연설을 했다. 연설문을 통해 후보들이 보이는 다른 전략이 보인다.




4번 유승민 후보의 연설문에서 대통령이라는 단어의 비중은 확실히 크다. 보수, 여러분, 저, 대한민국, 유승민, 문재인등이 그 다음으로 큰 비중을 가진다. 다른 후보들과 달리 유승민 후보는 연설문에서 "문재인"을 5번 언급한다. 유승민의 선거전력이 보이는 부분이다. 유력 후보인 문재인에 대한 비판을 최대의 앞당겨서 연설문부터 시작하겠다는 의지의 표명으로 보인다. 나름 굵직한 단어들이 많이 포진되어 있는 것으로 보아 중요하다고 생각되는 단어들을 자주 반복해서 언급함으로 그 중요성을 부각시키려는 전략은 모든 후보들 중 가장 나아보인다.


5번 심상정 후보의 연설문은 가장 많이 나온 단어인 "정의당" 이 총 13번 등장한다. 이는 유승민 후보의 27번 언급된 "대통령"이나 안철수 후보가 41번 언급한 "국민", 28번 언급된 홍준표의 "대통령", 33번 언급된 문재인의 "국민"과 비교하면 너무 횟수가 적다. 동어반복을 피하고자 하는 의도가 있었던 것이 아닐까하는 생각을 해보지만 결국 일반 대중을 상대로 하는 연설문을 고급진 문장으로 구사하면 일반인들의 이해는 떨어질 수 밖에 없다. 심상정 후보의 연설문은 강조되는 단어가 없다. 즉각적으로 와 닿는 단어들을 만들어내지 못했다. 멀찍이 떨어져있는 단어들은 국민들에게 이해의 정도를 떨어뜨릴 수 밖에 없다. 아쉬운 부분이다. 





Comment +0

CEA-014 아두이노 2개로 신호등 2개 연결하기

인터넷에서 "아두이노 신호등" 으로 검색해 보면 상당한 많은 자료들을 얻을 수 있습니다. 대부분 아두이노 우노에 LED 3개를 연결해서 신호등 하나를 만드는 내용입니다. 혹은 5개를 연결해서 차량용 신호등 하나와 보행자용 신호등하나를 만드는 것도 있습니다.

이 정도의 신호등은 지난시간까지 공부한 내용으로 여러분이 혼자서도 충분히 만들수 있습니다.

오늘 여러분에게 소개할 신호등은 아두이노 우노 2개를 사용해서 만들게 됩니다. 하나의 아두이노에서 LED 3개를 순차적으로 점멸시키는 것은 대부분의 신호등 프로그램과 비슷합니다. 그런데 거기에 두가지를 추가했습니다.




1. 시작시간을 초기화 하는 신호등 리셋 스위치

이 리셋스위치를 누르면 신호등의 신호는 처음으로 초기화됩니다. 초기화되서 맨 처음부터 정해진 순서대로 다시 순서대로 불이 들어옵니다.

2. 설정된 시간이 되면 작동하는 타이머

가변저항, 포텐셔미터의 값을 읽어서 1 에서 100 사이의 값으로 만듭니다. 그 값을 시간으로 계산합니다. 리셋스위치를 누른 후 정해진 시간이 지나면 다른 아두이노의 리셋스위치를 작동시킵니다.




신호등 1개는 너무 쉬워서 2개를 만들어서 연결해 보겠습니다.



그냥 막 연결하지 말고, "제대로" 연결해 봅시다. 보행자도 차를 탄 사람도 불편하지 않게 신호등 체계를 만들어 봅시다.



신호등간 신호를 주는 방식을 간단하게 고안해봤습니다. 하나의 신호등을 초기화하면 옆에 붙은 신호등이 일정한 시간간격을 두고 같이 초기화됩니다. 이 시간간격을 차량이동 예상 시간으로 만들어두면 됩니다.



3개의 아두이노를 꾸며봤습니다. 저항을 잘 보면 색띠가 있습니다. 색띠를 읽으면 저항값을 알 수 있습니다. 참고로 위에서부터 330, 330, 330, 10k, 1k 값을 가집니다. 맨 마지막 저항은 왜 들어갔을까요? 영상에서는 설명해주지 않습니다만 들어가지 않으면 안되는 저항입니다. 나중에 조금 더 아두이노를 공부한 다음에 이 저항에 대해서 설명할 기회가 되면 그때 설명하겠습니다.



Notepad++ 를 사용해서 편집합니다. 제가 주로 사용하는 텍스트에디터는 노트패드++ 입니다. 무료라서 쓰고 있지만 성능도 결코 왠만한 다른 에디터에 떨어지지 않습니다. 플러그인이 많고 다양해서 만족하면서 쓰고 있습니다. 



맨 위의 영상을 꼭 확인해보세요. 여기 전체 소스코드를 올립니다.



#define SIGNAL_RED  5

#define SIGNAL_YELLOW  6

#define SIGNAL_GREEN  7

#define TIMEPIN   A0

#define STARTSWITCH  10 // 스위치 입력

#define NEXTSIGNAL  11 // 다음 신호등 스위치 출력

#define BUTTON_ON   0

#define BUTTON_OFF  1


#define LED_RED_TIME  3000

#define LED_YELLOW_TIME  2000

#define LED_GREEN_TIME  3000



bool buttonState = 1;

bool lastButtonState = 1;

bool resetFlag = 0;

unsigned long timeValue = 0;

byte i=0;

unsigned long nowTime, oldTime;

  

void setup(){

  Serial.begin(9600);

  pinMode(SIGNAL_RED, OUTPUT);

  pinMode(SIGNAL_YELLOW, OUTPUT);

  pinMode(SIGNAL_GREEN, OUTPUT);

  pinMode(STARTSWITCH, INPUT);

  pinMode(NEXTSIGNAL, OUTPUT);

}


void loop(){

  buttonState = digitalRead(STARTSWITCH);


  if(buttonState != lastButtonState ) {

    lastButtonState = buttonState;

    delay(100);

i++;

if(i%2==1) {

signalTowerReset();

Serial.print("timeValue = ");

Serial.println(timeValue);

}

  }

  if(resetFlag) sendTimeSignal();

  ledSignalTower();

}




void signalTowerReset()

{

ledBlink3(); // 전체 신호등이 3번 깜박


resetFlag = 1;

    timeValue = map(analogRead(TIMEPIN), 0, 1023, 1, 100); // 신호등간 시간간격 [0~1023] => [0~99]

nowTime = millis();

oldTime = nowTime;

}



void sendTimeSignal(){

if((nowTime-oldTime)<timeValue*1000){

digitalWrite(NEXTSIGNAL, HIGH);

}

if(((nowTime-oldTime)>=timeValue*1000) && ((nowTime-oldTime)<(timeValue+1)*1000)) {

digitalWrite(NEXTSIGNAL, LOW);

}

if((nowTime-oldTime)>=(timeValue+1)*1000) {

digitalWrite(NEXTSIGNAL, HIGH);

resetFlag = 0;

}

}


void ledSignalTower(){

  nowTime = millis();

  if((nowTime-oldTime>=0)&&(nowTime-oldTime<LED_RED_TIME)) {

 digitalWrite(SIGNAL_RED, HIGH);

 digitalWrite(SIGNAL_YELLOW, HIGH);

 digitalWrite(SIGNAL_GREEN, LOW);

 }


  if((nowTime-oldTime>=LED_RED_TIME)&&(nowTime-oldTime<LED_RED_TIME+LED_YELLOW_TIME+LED_GREEN_TIME)) {

 digitalWrite(SIGNAL_RED, HIGH);

 digitalWrite(SIGNAL_GREEN, HIGH);

 for(byte i=0;i<6;i++ ){

   if((nowTime-oldTime>=LED_RED_TIME+LED_YELLOW_TIME*i/6)&&(nowTime-oldTime<LED_RED_TIME+LED_YELLOW_TIME*(i+1)/6))

 {  digitalWrite(SIGNAL_YELLOW, i%2); }  

 }

  }  

 

 

  if((nowTime-oldTime>LED_RED_TIME+LED_YELLOW_TIME)&&(nowTime-oldTime<LED_RED_TIME+LED_YELLOW_TIME+LED_GREEN_TIME)) {

 digitalWrite(SIGNAL_RED, LOW);

 digitalWrite(SIGNAL_YELLOW, HIGH);

 digitalWrite(SIGNAL_GREEN, HIGH);  

 }

  if(nowTime-oldTime>LED_RED_TIME+LED_YELLOW_TIME+LED_GREEN_TIME) oldTime = nowTime;

}


 

void ledBlink3(){

  for(int tempi=0;tempi<3;tempi++){

digitalWrite(SIGNAL_RED, 1);

digitalWrite(SIGNAL_YELLOW, 1);

digitalWrite(SIGNAL_GREEN, 1);

delay(200);

digitalWrite(SIGNAL_RED, 0);

digitalWrite(SIGNAL_YELLOW, 0);

digitalWrite(SIGNAL_GREEN, 0);

delay(200);

  }

}


Comment +0

[CEA-009~13] LED 3개를 스위치로 점멸시키기











지난 시간에 이어 3개의 LED 를 점멸시켜보겠습니다. 아두이노 우노에는 0 번에서 13번까지 총 13개의 디지털 입출력이 가능한 핀이 있습니다. 여기에 A0 에서 A5 까지 6개의 아날로그 입력 핀이 있습니다. 합치면 19개의 핀이 있고 모두 디지털입출력이 가능합니다.



3개의 LED 를 2, 3, 4번에 연결하고, 스위치는 9번에 연결합니다. 스위치를 연결할 때 주의항 내용이 있습니다. 플로팅(Floating) 상태에 두지 않기 위해서 풀업 또는 풀다운 상태를 만들어주어야 합니다.



하드웨어 연결이 끝났으면 소프트웨어를 만들어봅시다. 코딩의 시작입니다.



LED 는 초기에 켜져있다가 스위치를 누르면 LED 가 꺼지게 만들어봅시다. 



앞에서 만들어 본 코드를 조금씩 고쳐서 원하는 대로 LED 불빛이 바뀌게 해봅시다.



스위치가 눌려있는 동안 2, 3, 4 번에 연결된 LED 는 순서대로 켜지고 꺼지게 됩니다. 간단한 조건인 if 문을 사용할 수 있으면 됩니다. 변수를 하나 만들어 두고 반복할 때마다 1씩 증가하게 합니다. 1일대는 첫번째 LED를, 2일때는 두번째 LED를, 3일때는 세번째 LED를 켜고, 그 외의 다른 수(4)일때는 0이 되게 합니다.



위에서 만들었던 코드를 수정해봅시다.



% 연산은 나누고 남은 수, 나머지를 반환합니다. 그래서 i 를 계속 증가시킬때 i%3 은 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, ... 이렇게 세개 숫자를 반복해서 보내줍니다. 

여기에 버튼을 누를 때마다 LED의 빛을 하나씩 옆으로 이동하게 해봅시다. 위 소스를 실행시키면 약간 이상합니다. 그 부분을 찾아보세요.



앞에서 내준 숙제의 답입니다. 미리 보지 마시고 꼭 세번째 동영상을 보고 프로그램을 고쳐본 다음에 보세요.



답은 동영상을 확인하세요. 잘 보면 보입니다.

Comment +0

CEA-008 LED 1개 점멸하기 (하드웨어해석)


LED 를 1개 점멸시키는 회로를 구성하고 아두이노로 프로그램을 직접 짜 보았습니다. 이제 지난시간에 만들었던 회로에 대해서 조금 더 깊이있게 살펴보겠습니다. 초등학생이라면 이 부분은 건너뛰어도 됩니다. 시간은 오래 걸리지 않으니까 한번 보기는 하시구요, 잘 이해가 안되면 억지로 이해하려고 하지 마세요. LED 에 맞는 저항값을 어떻게 구하는지를 선생님께 물어보시면 선생님이 그 값을 계산해서 주실겁니다. 



영상에 나오는 사진을 몇장 첨부합니다.



LED 에 불을 켜는 프로그램과 회로를 구성했습니다. 구성한 회로가 어떤 것인지를 한번 살펴보겠습니다.



전기의 속도는 30만km/s 입니다. 1 초에 30만 km 를 간다는 뜻입니다. 빛과 속도가 같습니다. 하지만 전자의 이동 속도는 도체의 종류, 전압, 기타 환경에 따라서 많이 달라지는데 일반적으로 가정에서 사용하는 전선을 쓴다고 가정했을때 전자의 속도는 7~8mm/s 정도가 됩니다. 1 초에 7~8mm 밖에 움직이지 못합니다.  



전기가 흐를때 LED 를 통과하면서 전기에너지는 빛에너지로 바뀝니다. LED 는 전기에너지를 열에너지로 허비하는 것이 거의 없습니다. 백열등이나 형광등에서 LED 등으로 바뀌는 가장 큰 이유가 바로 효율때문입니다.



LED 는 2V 정도의 전압강하가 있습니다. 그리고 20mA 정도의 전류가 흐를때 최적의 빛을 냅니다. 물론 이 수치는 LED 마다 다릅니다. 일반적으로 20mA 는 LED 에게는 안전한 전류입니다. 이정도의 전류를 만들기 위해서 필요한 저항을 구하는 방법입니다.



태그 : CEA, 코딩교육, 아두이노, ARDUINO, UNO, 아두이노 강의, 키트, 부품, LED, BLINK, LED_BUILTIN, 전압강하

Comment +0

CEA-007 LED 1개 점멸하기 (소프트웨어)


LED 를 1개 점멸시키는 프로그램을 직접 짜 보겠습니다. 지난 시간에 하드웨어 구성을 마쳤습니다. 아두이노는 하드웨어와 소프트웨어를 동시에 다룰 수 있어야 합니다. 하드웨어가 어떻게 구성되었는지 모른다면 소프트웨어를 만들 수 없습니다.



영상에 나오는 사진을 몇장 첨부합니다.



LED 점멸하는 소프트웨어입니다. 기본 소스는 다음과 같습니다. 


void setup() {

  pinMode(12, OUTPUT);

}


void loop() {

  digitalWrite(12,0);

  delay(100);

  digitalWrite(12,1);

  delay(100);

}


12는 LED 가 연결된 아두이노의 핀번호 이고, 1 은 그 핀으로 전기가 흐른다(5V 출력)는 것, 0 은 그 핀으로 전기가 흐르지 않는다(0V 출력)는 것을 의미합니다.



예제에 나오는 LED_BUILTIN 은 13을 의미합니다. LED_BUILTIN 이 사용된 장소를 위 그림에 담았습니다.



태그 : CEA, 코딩교육, 아두이노, ARDUINO, UNO, 아두이노 강의, 키트, 부품, LED, BLINK, LED_BUILTIN

Comment +0

CEA-006 LED 1개 점멸하기 (하드웨어 구성)


LED 를 1개 점멸시키는 프로그램을 직접 짜 보겠습니다. 아직 정식으로 C 언어를 공부한 것이 아니라서 많은 부분을 설명하지는 못합니다. 하지만 우선은 그냥 따라서 해보는 것이 중요합니다.




해보면 생각보다 그렇게 어렵지도 복잡하지도 않습니다. 단지 아직 모를뿐이지요.


제대로 프로그래밍 언어를 공부하려면 시간도 걸리고 어려움이 있겠지만 아두이노를 가지고 사용하기 위해 프로그램을 익한다면 시간도 그렇고 오래걸리지는 않습니다. 당신이 조금만 똑똑하면 한주일이면 가능하고, 조금 명석한 편이 아니라면 3주일이면 됩니다. 


영상에 나오는 사진을 몇장 첨부합니다.



기본 예제에 나오는 LED Blink 프로그램을 살펴봅시다.



LED 를 사용할 때 극성에 주의하셔야 합니다. 내부를 잘 보면 굵은 쪽이 있습니다. 그 쪽에 - 또는 GND 쪽을 연결합니다.



실제 회로를 기호로 그린 그림입니다. LED 와 저항 330 또는 220 옴을 연결해주면 됩니다.



아두이노에서 LED 에 불을 켜 봅시다.


태그 : CEA, 코딩교육, 아두이노, arduino, 아두이노 강의, 키트, 부품

Comment +0

CEA-005 아두이노 IDE 보드 업데이트, 라이브러리 설치와 업데이트 



지난 시간에 아두이노 IDE 를 설치했습니다. 그리고 BLINK 라는 첫번째 예제 프로그램을 실행해 봤습니다. 이제 본격적으로 아두이노를 사용해서 프로그램을 해보는 시간이 되었습니다.


그런데 혹시나 예전에 아두이노 IDE 를 설치하셨던 분이 계시면 최신버젼으로 업데이트를 해주는 것이 필요합니다. 보드가 변경되거나 혹은 보드에 더 잘 맞는 펌웨어가 나오거나 할때마다 개개인이 알아서 이 부분을 고쳐주는 것은 쉽지 않습니다. 사실 아두이노 이전에는 그렇게 했습니다. 무엇인가 변경이 되면 플로피디스크나 CD 를 넣고, 펌웨어 업데이트를 했습니다. 하는 방법도 쉽지 않았습니다. 하다가 잘못되면 하드웨어가 망가지기도 했습니다.


아두이노는 전문가들을 위해서 세부적으로 조작 가능한 개발환경을 제공하는 대신에 일반인들을 대상으로 쉽고 편하게 개발할 수 있도록 한다는 철학이 있습니다. 그래서 아두이노 IDE 프로그램을 관리하는 곳에서 일괄적으로 클릭 한두번으로 보드 업데이트, 라이브러리 설치, 라이브러리 업데이트가 가능하게 해두었습니다.




본격적으로 프로그램에 들어가기 전에 라이브러리 설치와 업데이트, 보드 업데이트 방법을 익혀보겠습니다.



태그 : CEA, 코딩교육, 아두이노, arduino, 아두이노 강의, 아두이노 IDE, 업데이트, 라이브러리, 보드

Comment +0

CEA-004 아두이노 IDE 설치와 첫 프로그램 


아두이노 IDE 를 설치해 봅시다. 그리고 첫번째 프로그램을 실행해보겠습니다.



STEP 1. 아두이노 홈페이지에 방문해서 아두이노 프로그램(IDE)을 다운받습니다.


홈페이지 주소 : http://www.arduino.cc/

다운받을 프로그램 : https://www.arduino.cc/en/Main/Software



저 주소로 접속하면 다운받을 프로그램의 링크가 다시 나옵니다. 영어를 읽을 수 있으면 읽어서 그대로 따라하시면 됩니다. 아니면 아래에 있는 링크를 따라갑시다


STEP 2. 다운받은 프로그램을 PC 에 설치합니다.


STEP 3. 아두이노와 PCUSB 케이블로 연결합니다.


STEP 4. 설치된 아이콘을 더블클릭하면 IDE 가 실행됩니다.


STEP 5. IDE 내부에서 보드와 포트를 설정합니다.


아두이노 IDE 를 실행시킨 상태에서 [파일]-[예제]-[01.Basics]-[Blink] 를 선택해서 클릭합니다. 


제 아두이노 우노보드를 잘 보면 1초 간격으로 LED 가 깜박이는 것을 볼 수 있습니다.

 

 

 



 




태그 : CEA, 코딩교육, 아두이노, arduino, 아두이노 강의, 아두이노 IDE, blink

Comment +0

CEA-003 아두이노 기본프로그램과 실습 준비물



아두이노 공부를 위해 필요한 기본 준비물들을 소개합니다.


지난 시간에 만들었던 아두이노 우노와 소형브레드보드를 올린 상자를 사용하겠습니다. 상자안에는 필요한 부품들을 보관할 수 있습니다. 상자만드는 법은 이전 동영상을 보시고 따라하시면 됩니다.


아두이노 우노, 브레드 보드와 함께 다음의 부품들을 준비하셔서 간단한 실습을 진행하면서 아두이노를 학습할 수 있습니다. 물론 아두이노를 공부하는 것은 단지 공부를 위한 것이 아니라 해결하기 원하는 문제를 해결할 수 있는 수단을 갖는 것입니다. .


다음 준비물을 준비합시다.



1. 아두이노 우노 + USB  케이블

2. 브레드보드


3. 저항 220, 330, 1k, 2k, 10k 각 20개씩

4. LED 10개

5. 택트스위치 4개

6. 점퍼와이어 혹은 듀폰케이블 1 set

7. 가변저항 혹은 포텐셔미터 1개

8. CDS 센서

9. 초음파센서


10. 이더넷실드 (+ LAN 케이블)

11. 9-12V 어댑터

12. 인터넷 공유기 (가정에서 사용하고 있는 것)



이 외에도 여러가지 센서들과 액츄에이터가 있습니다. 그 부분은 기초과정을 마치고 난 다음에 기회를 보아서 설명하도록 하겠습니다.



아두이노 우노와 브레드보드입니다. 빈 상자에 붙여두었습니다. 작고 휴대가 간편하게 구축한 개발환경입니다. 



필요한 부품들 중 저항의 모습입니다. 220, 330, 1k, 2k, 10k 저항을 준비하시면 실습뿐만 아니라 앞으로 사용하는데 큰 지장이 없습니다. 



중앙 아래에 있는 CDS 센서는 빛의 밝기를 감지하는 센서입니다. 오른쪽에 있는 가변저항은 포텐셔미터로 불립니다. 생긴 모양은 다양하게 있습니다. 브레드보드에 꼽아서 사용하기 편한 타입으로 저렴한 것을 구하시면 됩니다. 가변저항은 10k오옴까지 변할 수 있을 것을 구합니다. 위에 있는 것은 초음파센서입니다. 왼쪽에 있는 스위치는 택트스위치입니다.



LED 의 종류는 다양합니다. 용도에 따라 맞는 것을 사용하면 됩니다. 왼쪽 빨간색 LED 를 보시면 원통형으로 지름 3mm 짜리가 있고 그 옆에 원통형 5mm 와 2x5mm 짜리 사각 LED 가 있습니다. 저렴하면서 신호확인용으로 가장 많이 사용되는 종류입니다. 밝은 빛을 필요로 하는 플래시를 만드는 것이 아니라면 이 세 종류 중 하나를 사용하면 됩니다. 개인적으로 2x5mm 짜리 사각 LED 를 좋아합니다. 2mm 짜리라서 여러개를 일렬로 늘어놓기 좋습니다. 만능기판이나 브레드보드에 사용하기도 좋습니다.



점퍼선 혹은 듀폰케이블이라고 불리는 케이블입니다. 3가지 종류가 있습니다. 일반적으로 가장 많이 쓰이는 것이 가장 오른쪽에 있는 양쪽이 M-M 타입인 케이블입니다. 하지만 센서를 사용할 때 M-F 타입이나 F-F 타입도 있으면 유용하게 사용됩니다. 이 세 종류를 꼭 구입하시기 바랍니다.



이더넷실드입니다. 아두이노 우노의 통신용 모듈이나 실드가 여러개 있습니다. 그 중 블루투스와 이더넷실드를 가장 많이 사용합니다. 블루투스는 스마트폰이나 다른 기기가 있어야 합니다. 하지만 이더넷실드는 그 자체로 인터넷에 바로 연결이 됩니다. IOT 를 위한 기본 통신 모듈로 이더넷실드를 사용합니다. 블루투스는 다음번에 스마트폰용 앱을 제작하면서 그때 아두이노와 블루투스로 통신하는 것을 해보겠습니다. 아두이노 프로그램을 할 수 있고, 이더넷실드까지 사용할 수있다면 블루투스 통신은 30분이면 충분히 이해할 수 있습니다. 더 필요한 것은 앱(App)개발이지요.



제가 가지고 있는 것 중에 아두이노 우노와 브레드보드를 올린 상자 두개를 사진으로 올립니다. 왼쪽처럼 조금 큰 상자를 사용하면 안에 들어갈 수 있는 것들이 많습니다. 오른쪽처럼 작은 상자를 만들면 가지고 다니기 편합니다.



모두 수납한 사진입니다.


태그 : CEA, 코딩교육, 아두이노, arduino, 아두이노 강의, 키트, 부품

Comment +0

CEA-002 arduino Paper Box


아두이노 작업환경을 만드는 동영상입니다.






준비물은 적당한 크기의 택배상자와 M2.5 볼트, 너트, 와셔입니다. 와셔는 M2.5 의 것을 써도 괜찮고 아니면 M3 의 와셔를 써도 좋습니다.










동영상을 보시면 쉽게 따라하실 수 있을겁니다. 저렴한 종이 상자로 개발환경과 부품수납공간을 만들어보세요. 



태그 : CEA, 코딩교육, 아두이노, arduino, 개발환경, 수납공간, 종이상자

Comment +1

  • 박진만 2017.10.08 22:45 신고

    멋지네요.
    저도 만들어서 공부할 때,
    수업할 때 사용해야겠네요.
    좋은 동영상 고맙습니다.

CEA-001 코딩교육 아두이노 따라잡기 시작 





확대


1. 코딩교육, 아두이노 따라잡기

2. 아두이노란?

3. 아두이노 우노 / 마시모밴지 / 오픈소스, 오픈하드웨어

4. 코딩교육 VS 프로그램교육



Comment +0

누구나 따라하는 아두이노 프로그램 - 6장. 프로그램방법


누구나따라하는아두이노프로그램_v2_내용_CH06.pdf





Comment +0

누구나 따라하는 아두이노 프로그램 - 5장. 하드웨어연결


누구나따라하는아두이노프로그램_v2_내용_CH05.pdf



Comment +0

누구나 따라하는 아두이노 프로그램 - 4장. 기본구조


누구나따라하는아두이노프로그램_v2_내용_CH04.pdf






Comment +0

누구나 따라하는 아두이노 프로그램 - 3장. 아두이노문법 III


누구나따라하는아두이노프로그램_v2_내용_CH03C.pdf



Comment +0

누구나 따라하는 아두이노 프로그램 - 3장. 아두이노문법 II


누구나따라하는아두이노프로그램_v2_내용_CH03B.pdf




Comment +0

누구나 따라하는 아두이노 프로그램 - 3장. 아두이노문법 I


누구나따라하는아두이노프로그램_v2_내용_CH03A.pdf



Comment +0

누구나 따라하는 아두이노 프로그램 - 2장. 초등학생도 따라할 수 있는 아두 이노 따라잡기


누구나따라하는아두이노프로그램_v2_내용_CH02.pdf



Comment +0

누구나 따라하는 아두이노 프로그램 - 1장. 이 책의 사용설명서


누구나따라하는아두이노프로그램_v2_내용_CH01.pdf





Comment +0

누구나 따라하는 아두이노 프로그램 - 소개와 목차


누구나따라하는아두이노프로그램_v2_20160528_표지목차.pdf


Comment +0