반응형

예전 PLC와 컴퓨터 python을 연결할 때 아두이노로 대신 테스트 했다.

아두이노가 PLC역할을 하고,

Python은 PC로 돌리게 된다.

 

컴퓨터와 아두이노간의 연결하는 코드이다.

아두이노에 스위치를 달고 LED를 달고 테스트

아두이노의 시리얼 포트로 115200 비트로 통신한다.

 

아두이노에서 ready신호를 보내면, PC의 python코드가 작동하고

PC에서 1번 (합격), 2번 (불합격) 신호를 보내면

아두이노에서 그에 맞는 동작을 하는 코드이다.

 

아두이노 코드

const int buttonPin1 = 8;      //  8 번핀 스위치 입력 테스트 (PLC의 ready신호)
char LEDpin1 = 12;    //  OK LED 포트 설정
char LEDpin2 = 13;    //  NG

int flag = 0;
int NGflag = 0;
int OKflag = 0;

// LED확인용 함수.
void OK(void)
{
    digitalWrite(LEDpin1, HIGH);
    digitalWrite(LEDpin2, LOW);
}
void NG(void)
{
    digitalWrite(LEDpin2, HIGH);
    digitalWrite(LEDpin1, LOW);
}


void setup() {
  Serial.begin(115200);              //  시리얼 통신의 시작, 보레이트 입력
  pinMode(buttonPin1, INPUT_PULLUP);  //  스위치 내부풀업저항 입력포트로 셋팅.
  
  pinMode(LEDpin1, OUTPUT);           //  OK, NG LED 출력포트 지정.
  pinMode(LEDpin2, OUTPUT);
}

void loop() {
  char c = Serial.read();           //  PC로부터온 값을 읽음.
  int buttonValue1 = digitalRead(8); //  8번 핀에서 읽음.
  
  if(buttonValue1 == LOW )           //  스위치가 눌릴때 ready신호를 보냄. (PLC -> PC)
  {
    flag = 1;
  }
  if(flag == 1)
  {
      Serial.println("ready");      //  준비가 되었다고 PC에 신호를 보냄.
      delay(500);
      flag = 0;
  }

  // 아스키코드 0x31 들어올때, OK
  if( c == '1')
  {
      OKflag = 1;
  }

  // 아스키코드 0x32 들어올때, NG
  else if( c == '2')
  {
      NGflag = 1;
  }

  

  if(OKflag == 1)
  {
    OK();
    OKflag = 0;
  }
  if(NGflag == 1)
  {
    NG();
    NGflag = 0;
  }

}

 

반응형

 

파이썬 코드

import serial

ser = serial.Serial(
    port='COM3',
    baudrate=115200,
    parity=serial.PARITY_NONE,\
    stopbits=serial.STOPBITS_ONE,\
    bytesize=serial.EIGHTBITS,\
)


while True:
    if ser.readable():
        res = ser.readline()                 # 시리얼로 날라온 bytes 값이 저장됨.
        ready = res.decode()[:len(res)-2]    # bytes를 decode 해서 str로 변환, 자동으로 포함되어있는 개행을 제거하기 위해 [:len(res)-2] 를 추가함 : 즉, \r\n 을 제거함.

        print(ready)        # 아두이노(PLC)에서 날라온 프로토콜.

        judge = input()             # 유저가 입력 '1' 또는 '2' 테스트 하기 위해.

        OK = chr(0x31)              # '1' 일때 OK
        NG = chr(0x32)              # '2' 일때 NG

        # 프로토콜을 받고 판독 시작.
        if ready == 'ready':
            if judge == OK:

                OK = OK.encode()     # OK일때 char 를 bytes로 인코딩
                ser.write(OK)        # 아스키코드 0x31 전송

            elif judge == NG:

                NG = NG.encode()     # NG일때 아스키코드 0x32 전송
                ser.write(NG)
            else:
                pass

 

반응형

'Arduino' 카테고리의 다른 글

Arduino Uno로 인체 감지 쓰레기통 만들기  (0) 2019.09.27
반응형

 

 

먼저 바코드를 인식하는 open source 라이브러리를 제공해주는데, 그 라이브러리를 pip을 이용해 다운로드 한다.

윈도우의 cmd 창을 이용해서 다운받아본다.

 

총 3개의 라이브러리가 필요하다.

1. openCV (영상인식 라이브러리)

pip install opencv-python

2. numpy (연산 처리 라이브러리)

pip install numpy

위에 opencv를 받을 때 저절로 같이 설치 되었다.

3. pyzbar (바코드 인식 관련 라이브러리)

pip install pyzbar

 

반응형

 

자 이제 필요한 모든 라이브러리를 받았으니 아래와 같이 코드를 동작시켜본다.

'''

made by 안산드레이아스
https://ansan-survivor.tistory.com/

'''

# Python Version 3.7.1

import pyzbar.pyzbar as pyzbar  # pip install pyzbar
import numpy as np              # pip install numpy
import cv2                      # pip install opencv-python

# 바코드 탐지하는 엔진 (바코드 및 QR코드 탐지)
def decode(im):
    # Find barcodes and QR codes
    decodedObjects = pyzbar.decode(im)

    # Print results
    for obj in decodedObjects:
        print('Type : ', obj.type)
        print('Data : ', obj.data, '\n')

    return decodedObjects


# Display barcode and QR code location
def display(im, decodedObjects):
    # Loop over all decoded objects
    for decodedObject in decodedObjects:
        points = decodedObject.polygon

        # If the points do not form a quad, find convex hull
        if len(points) > 4:
            hull = cv2.convexHull(np.array([point for point in points], dtype=np.float32))
            hull = list(map(tuple, np.squeeze(hull)))
        else:
            hull = points;

        # Number of points in the convex hull
        n = len(hull)

        # Draw the convext hull
        for j in range(0, n):
            cv2.line(im, hull[j], hull[(j + 1) % n], (255, 0, 0), 3)

    # Display results
    cv2.imshow("Results", im);
    cv2.waitKey(0);

# 파일명 zbar.jpg의 이미지에서 바코드를 탐지하면 해당 코드를 리턴
# Main
if __name__ == '__main__':
    # Read image
    im = cv2.imread('zbar.jpg')

    decodedObjects = decode(im)
    display(im, decodedObjects)

 

이미지 파일 zbar.jpg는 현재 파이썬 파일과 동일 경로에 있어야 한다. (이부분은 절대경로로 수정가능)

zbar.jpg 의 이미지는 아래와 같다. (파일도 업로드)

zbar.jpg
0.37MB

이 이미지파일에 저 파이썬 코드를 돌려본다.

 

*결과

해당 바코드를 탐지해서 숫자를 리턴하고 보여준다.

그리고 어디부분을 인식했는지 파랑색 사각박스로 보여준다.

QR코드도 인식된다. 어떤 타입인지 함께 리턴된다.

반응형
반응형

매번 로그인하기 귀찮을때, 자동으로 로그인하도록 설정한다.

 

1.

2.

3.

4. Unlock을 하여 root 비밀번호를 입력하면, 해당 계정을 편집할 수 있다.

5. 아래 스위치를 on하면 재부팅시 로그인 요구가 없어진다.

반응형
반응형

 

 

1. 편집기로 아래 파일을 수정한다. (필자는 vi 편집기 이용)

vi /etc/pam.d/gdm-password

    아래 줄에 추가한다.

 

2. 테스트해보기

    재부팅한다.

reboot

위처럼 접속 할 수 없다고 뜬다.

반응형
반응형

 

1. 내 ip주소 확인

ifconfig

공유기로 부터 임의로 할당받은 주소 192.168.10.128 이다.

2. 네트워크 설정 경로로 이동하여 list를 본다.

cd /etc/sysconfig/network-scripts/
ls

 

3. ifctg-xxxxxx <= (이더넷 랜카드 마다 다름) 를 수정한다. (필자의 경우 ifcfg-ens32, vi 편집기 이용)

vi ifcfg-ens32

    아래와 같이 BOOTPROTO를 none으로 변경

반응형

아래에 다음과 같이 추가

아까 ifconfig로 확인한 3번째 주소 (10)과 일치하게하며

필자는 ip주소를 100으로 고정했다. 고로 192.168.10.100  으로 고정시킨다.

나머지 netmask와 gateway, DNS도 아래와같이 한다.

그리고 나서 저장한다.

 

4. 변경이 되도록 restart를 하고, 확인해본다.

systemctl restart network
ifconfig

 

<라즈베리파이의 고정 아이피 할당은 아래 참고>

https://ansan-survivor.tistory.com/44

 

[Raspberry Pi] 라즈베리파이 고정 IP 할당하기

$ ifconfig <= 본인 IP주소 확인 1. 네트워크 설정 편집 파일 수정 (vim 또는 nano편집기 둘중 하나 선택) $ sudo vim /etc/dhcpcd.conf   또는 $ sudo nano /etc/dhcpcd.conf 2. 아래 마크한 부분 주석해제, 본..

ansan-survivor.tistory.com

 

 

 

 

반응형
반응형

1.

2. 절전 해제

3. 화면 잠금 해제

 

반응형
반응형

1.

2. 업데이트 설정 해제

3. yum 의 update 패키지 막기

cd /etc/yum.repos.d/
Vi CentOS-Base.repo

해당 update 부분을 주석처리한다.

 

 

반응형
반응형

귀찮은 알림들을 끄는 기능이다.

 

반응형
1···142143144145146147148···181

+ Recent posts