Raspberry Pi 3에 연결된 NFC 리더의 데이터를 Python에서 읽기 OSC로 openFrameworks로 전송

1. 개요



이전 기사( Raspberry Pi 3에서 openFrameworks 샘플 프로그램 실행 - Qiita )에 쓴 계속이지만 전시용 Mac을 Raspberry Pi로 바꾸려는 시도입니다.

전회는 Raspberry Pi에 oF를 인스톨 해 샘플 프로그램 움직인 곳까지였으므로, 이번은 Raspbery Pi에 NFC 리더를 접속해 python의 프로그램으로부터 읽은 NFC의 데이터를 OSC로 openFrameworks에 보냅니다.

2. 작업 환경


  • Raspberry Pi 3 + 2016-09-23-raspbian-jessie
  • RFID-RC522 아마존 검색 : RC522

  • 3. 참고 사이트


  • Raspberry Pi 3 Model B에 SPI 통신 방식의 NFC 리더 라이터 RFID-RC522를 연결하여 NFC 태그를 읽는 방법
  • mxgxw/MFRC522-python: A small class to interface with the NFC reader Module MFRC522
  • Python OSC (pyOSC) | 안드로이드 날
  • pyOSC 0.3.5b-5294 : Python Package Index
  • Raspberry Pi2로 ofxFaceTracker 실현하기 - Take’s diary

  • 4. Raspberry Pi 3에서 NFC 리더 사용



    참고 사이트 1.을 의지해 NFC 리더를 사용할 수 있도록 했습니다.
    움직인 프로그램은 참고 사이트 2.의 Read.py입니다.
    참고 사이트대로 이었으므로 생략하고 있습니다.

    처음 시도했을 때 프로그램을 실행해도 NFC 태그에 반응하지 않았습니다. 사이트에는 Device Tree를 무효로 하지 않으면 안 된다고 쓰고 있었습니다만, sudo raspi-config 하지만 Advanced Option 안에 Device Tree가 보이지 않았습니다.

    잘 모르겠지만 Raspbian을 다시 설치하면 치료했습니다. Raspbian 2016-02-26이 사전 설치된 micro SD 카드를 구입했지만 사전 설치된 것이 좋지 않았을 수 있습니다.

    5. pyOSC 도입



    4.에서 움직인 파이썬 샘플 프로그램을 openFrameworks에 가져 가기 위해 osc를 사용했습니다.
    oF에서 직접 NFC 리더를 읽으면 좋겠다고 생각했습니다만, 어떻게 하면 좋은지 모르기 때문에 이 방법을 채택하고 있습니다.

    참고 사이트 3. ( Python OSC (pyOSC) | 안드로이드 날 )를 보면서 pyOSC를 시험해 보았습니다.

    pyOSC 설치
    git clone https://gitorious.org/pyosc/devel.git
    cd devel
    sudo python setup.py install
    

    실패



    참고 사이트 3. 에 쓰여진 샘플 프로그램을 사용해 보려고했지만 잘 가지 못했습니다.
    git clone https://github.com/conanxin/Arduino-Meets-Blender-OSC.git
    

    터미널 2개를 시작하여 샘플 프로그램을 움직여 본다.

    terminal1
    cd Arduino-Meets-Blender-OSC/pyOSC_examples
    python basic_receive.py
    

    terminal2
    cd Arduino-Meets-Blender-OSC/pyOSC_examples
    python basic_send.py
    

    send.py를 실행하면 다음과 같은 오류가 발생했습니다.

    terminal2
    Traceback (most recent call last):
      File "basic_send.py", line 28, in <module>
        client.sendto(msg, ('127.0.0.1', 2014)) # note that the second arg is a tupple and not two arguments
      File "/usr/local/lib/python2.7/dist-packages/OSC.py", line 1174, in sendto
        ret = select.select([],[self._fd], [], timeout)
    AttributeError: 'OSCClient' object has no attribute '_fd'
    

    잠시 몰랐어요.

    성공



    주의를 풀고 다른 샘플을 사용해보십시오.
    pyOSC를 다운로드한 devel 폴더에 있던 샘플을 실행합니다.

    terminal1
    cd devel/examples
    python knect-rcv.py
    

    terminal2
    cd devel/examples
    python knect-snd.py
    

    knect-snd.py를 실행하면 knect-rcv.py의 화면에 다음과 같은 표시가 나왔습니다.

    terminal1
    ('Now do something with', 'user1', 3.0, 1.0, -1.0)
    ('Now do something with', 'user2', 4.0, 2.0, -2.0)
    ('Now do something with', 'user3', 3.0999999046325684, 2.0, -2.0)
    ('Now do something with', 'user4', 6.0, 3.200000047683716, -2.4000000953674316)
    

    6. RFID 프로그램에 OSC 처리 추가



    Dump.py에 knect-snd.py 프로그램을 끼워 넣었습니다.

    Dump_osc.py
    #!/usr/bin/env python
    # -*- coding: utf8 -*-
    
    import RPi.GPIO as GPIO
    import MFRC522
    import signal
    
    # OSC setting
    from OSC import OSCClient, OSCMessage
    client = OSCClient()
    client.connect(("localhost", 7110))
    
    continue_reading = True
    
    # Capture SIGINT for cleanup when the script is aborted
    def end_read(signal,frame):
        global continue_reading
        print "Ctrl+C captured, ending read."
        continue_reading = False
        GPIO.cleanup()
    
    # Hook the SIGINT
    signal.signal(signal.SIGINT, end_read)
    
    # Create an object of the class MFRC522
    MIFAREReader = MFRC522.MFRC522()
    
    # This loop keeps checking for chips. If one is near it will get the UID and authenticate
    while continue_reading:
    
        # Scan for cards    
        (status,TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL)
    
        # If a card is found
        if status == MIFAREReader.MI_OK:
            print "Card detected"
    
        # Get the UID of the card
        (status,uid) = MIFAREReader.MFRC522_Anticoll()
    
        # If we have the UID, continue
        if status == MIFAREReader.MI_OK:
    
            # Print UID
            print "Card read UID: "+str(uid[0])+","+str(uid[1])+","+str(uid[2])+","+str(uid[3])
    
            # Send OSC
            client.send( OSCMessage("/user/1", [uid[0], uid[1], uid[2], uid[3]] ) )
    
            # This is the default key for authentication
            key = [0xFF,0xFF,0xFF,0xFF,0xFF,0xFF]
    
            # Select the scanned tag
            MIFAREReader.MFRC522_SelectTag(uid)
    

    7. openFrameworks에서 OSC를 수신하는 프로그램 만들기



    이쪽도 샘플 프로그램을 유용합니다.
    샘플 프로그램 oscReceiveExample을 openFrameworks/apps/myApps/에 복사합니다.
    cd openFrameworks/examples/addons
    cp -r oscReceiveExample /home/pi/openFrameworks/apps/myApps/
    

    ofApp.h를 엽니다.
    cd /home/pi/openFrameworks/apps/myApps/oscReceiveExample/src
    vim ofApp.h
    

    포트 번호가 설정된 7행 #define PORT 12345#define PORT 7110로 변경하여 저장합니다.

    한 폴더에 다시 make 합니다. 컴파일이 끝나면 make run 합니다.
    cd ..
    make
    make run
    

    화면 오른쪽 상단에 파란색 창이 열립니다.
    다른 터미널을 시작하고 6.에서 만든 Dump_osc.py를 시작합니다.
    cd MFRC522-python
    python Dump_osc.py
    

    NFC 리더와 함께 제공된 NFC 키 홀더를 잡으면 파란색 화면에도 NFC UID가 표시됩니다.



    동영상은 이런 느낌입니다. (이미지를 클릭하면 YouTube로 이동합니다)
    IMAGE ALT TEXT HERE

    여기까지 할 수 있었으므로, 나머지는 oF로 받은 UID에 응한 처리를 해 나가면 좋을 것 같습니다.

    좋은 웹페이지 즐겨찾기