ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Project_AF] 자동초점 현미경 개발기 (7) - 함수제작-2 [제물대 이동]
    Ort Lab 2020. 3. 9. 12:48

    저번 글에서 save_data()함수를 완성하였습니다.

    이번에는 장치의 제물대를 제어하기 위한 함수들을 완성하려합니다.

     

    up_step() - 제물대 위로 이동

    down_step() - 제물대 아래로 이동

     

    settop() - 현재위치를 제물대 최대높이로 설정

     

    이렇게 3개의 함수가 있습니다.

     

    일단, 제물대의 높이를 조종하기 위한 모터는 컴퓨터로 바로 제어하기 힘들기 때문에 아두이노를 이용할겁니다.

    컴퓨터에서 신호를 보내 아두이노를 제어하기 위해서는 시리얼 통신을 이용합니다.

    import serial
    
    Port_adress = 'COM2'
    AVR = serial.Serial(Port_adress, 9600)
    
    AVR.write(b'0')

    위의 코드는 9600비트/초의 통신속도로 COM2로 '0'을 전송하는 코드입니다.

    Port_adress는 시리얼통신할 포트인데 어디서 확인하냐면...

    장치를 컴퓨터에 연결하면 장치관리자에서 확인할 수 있습니다.

    COM2라고 적혀있습니다. 그리고 만약 이를 변경하고 싶다면

    장치관리자 - Arduino Uno(COM2) - 포트설정 - 고급 - COM포트번호: 

    로 수정하시면 됩니다. 

     

    아두이노로 b'0'를 전송하면 제물대를 아래로 내리는 동작을 하고, b'1'을 전송하면 제물대를 위로 올리는 동작을 합니다.

    각 데이터를 전송할때마다 스텝모터 1스텝씩을 움직이게 프로그래밍 할 것입니다. 이에 관련된 정확한것은 나중에 하드웨어 제작할때 다루도록 하죠.


    GUI에서 제물대를 위 아래로 조절하는 버튼인데요 보면 3가지 칸이 있습니다. 맨위에 ▲버튼을 누를경우 위로 움직이고요 ▼를 누를경우 아래로 제물대가 움직입니다. 중간에 숫자를 넣는곳은 움직이는 횟수입니다. 즉, 숫자를 1로하고 위 버튼을 누를경우 제물대가 위로 1칸움직이고, 10을쓰고 버튼을 누를경우 제물대가 위로 10칸 움직이는 구조입니다.

     

    또한, 기본적으로 제물대의 최대높이는 정해져있습니다. 최대높이란 제물대의 커버글라스가 대물렌즈와 맞닫는 높이를 말하는데, 이보다 더 올라갈 경우 렌즈가 파손되거나, 슬라이드 글라스가 깨질수가 있습니다. 그래서 가장 높은점을 0으로 설정하고, 아래로 내릴경우 값을 +시키고, 위로 올릴경우 - 시키며, 값이 음수가 되지 않도록 해야 합니다.

    def up_step():
        global motor_step
        count = move_step.get()
        if(count.isdecimal() == True):
            if (int(count) <= 100 and int(count) >= 0):
                det = int(motor_step) - int(count)
                if (det >= 0):
    
                    for i in range(0,int(count),1):
                        AVR.write(b'1')
                        time.sleep(0.001)
    
                    motor_step = int(motor_step) - int(count)
                    print('System >>> Step-up [%s]' % motor_step)
                else:
                    print('System >>> Error : Step is less than (0)')
            else:
                print('System >>> Move step is between 0 to 100')
    
        else:
            print('System >>> Enter the number ')

    up_step()함수가 호출되면 제일 먼저 move_step.get()으로 불러온 문자열이 숫자로 이루어져있는지를 먼저 확인합니다. 구후 입력된 숫자가 0~100사이이고, 현재높이 - 입력숫자 가 음수가 아닐경우에만 입력한 숫자만큼 현미경의 제물대를 올립니다.

     

    down_step()은 이와 비슷합니다.

    def down_step():
        global motor_step
        count = move_step.get()
        if (count.isdecimal() == True):
            if(int(count) <= 100 and  int(count) >= 0 ):
    
                for i in range(0, int(count), 1):
                    AVR.write(b'0')
                    time.sleep(0.001)
    
                motor_step = int(motor_step) + int(count)
                print('System >>> Step-down [%s]' %motor_step)
            else:
                print('System >>> Move step is between 0 to 100')
        else:
            print('System >>> Enter the number')

     

    그리고 렌즈와 제물대가 맞닫는 최대높이를 지정해주는 함수를 정의합니다.

    settop()함수인데, 별건 없고 위에 up_step과 down_step에서 사용중인 현재높이 (count) 를 0으로 설정해주는 함수입니다.

    def settop():
        global motor_step
        print('System >>> Step set Top [ 0 ]')
        motor_step = 0

    이제 자동초점을 실행하는 함수 하나 남았네요;;;

    댓글

Designed by Tistory.