RaspberryPi-NFC シールドを Web アプリで


MiFare カードリーダとキャラクタ液晶のついた RaspberryPi シールドの試作品。

これをWebアプリで使うための設定例です。

環境

  • Raspbian Buster with desktop 2020-02-13版
  • Raspberry Pi 3 Model B

インストールしてひととおりWiFiやロケール、Update などの設定は終わらせておく.
ネットワークの設定も終わらせておく

vim をインストール


sudo apt install vim

ついでに、vim のビジュアルモードを解除。

/home/pi/.vimrc および /root/.vimrc の内部に set mouse=
行を設定

1602LCD を動かす

ライブラリ


sudo pip3 install adafruit-circuitpython-charlcd

これで動かすのでIPアドレスのスクリプトを入れておく

LCDmessage.pyをつくる


#!/usr/bin/env python

import sys

import Adafruit_CharLCD as LCD
lcd_rs        = 26
lcd_en        = 19
lcd_d4        = 20
lcd_d5        = 21
lcd_d6        = 22
lcd_d7        = 27
#
lcd_columns = 16
lcd_rows    = 2
#
#
lcd = LCD.Adafruit_CharLCD(lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7,
                       lcd_columns, lcd_rows)
lcd.clear()
if ( 2 >  len(sys.argv)):
  lcd.message("No IP address.")
if ( 1 <  len(sys.argv)):
  message = sys.argv[1]
  lcd.message(message)
if ( 2 <  len(sys.argv)):
  message = sys.argv[2]
  lcd.message("\n")
  lcd.message(message)
# cursol blink
lcd.blink(False)

MiFare カードリード

ライブラリインストール


pi@raspberrypi:~ $ git clone https://github.com/ondryaso/pi-rc522.git
pi@raspberrypi:~ $ cd pi-rc522
pi@raspberrypi:~/pi-rc522 $ sudo python3 setup.py install

wiringpi インストール


pi@raspberrypi:~ $ wget https://project-downloads.drogon.net/wiringpi-latest.deb
pi@raspberrypi:~ $ sudo dpkg -i wiringpi-latest.deb
pi@raspberrypi:~ $ sudo pip3 install wiringpi

多分最後だけでいけるのではないかな?

vim read_once_with_key_LCD_onlyID.py


from pirc522 import RFID
# Calls GPIO cleanup
import Adafruit_CharLCD as LCD


import RPi.GPIO as GPIO
#rdr = RFID(0,0,1000000,22,0,18,GPIO.BOARD)
rdr = RFID(0,0,1000000,25,0,24,GPIO.BCM)


lcd_rs        = 26
lcd_en        = 19
lcd_d4        = 20
lcd_d5        = 21
lcd_d6        = 22
lcd_d7        = 27
#
lcd_columns = 16
lcd_rows    = 2
#
#
lcd = LCD.Adafruit_CharLCD(lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7,
                       lcd_columns, lcd_rows)
import sys
import time
import wiringpi as w
w.wiringPiSetup()
w.pinMode(1,1)
sector = int(sys.argv[1])
# print('target sector = : ', sector)
lcd.clear()
lcd.message('Ready')
while True:
  rdr.wait_for_tag()
  (error, tag_type) = rdr.request()
  if not error:
#    print("Tag detected")
    (error, uid) = rdr.anticoll()
    if not error:
#      print("  UID: " + str(uid))
      # Select Tag is required before Auth
      if not rdr.select_tag(uid):
#        print("  not rdr.select_tag")

        # Auth for block  using default shipping key A
        if not rdr.card_auth(rdr.auth_a, sector, [0xA0, 0xB1, 0xC0, 0xD1, 0xE0, 0xE1], uid):  # key is example
          # This will print something like (False, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
#          print("      Reading sector "+ str(sector) +" " + str(rdr.read(sector)))
          (error,data)=rdr.read(sector)
          if not error:
#            print( str(data))
#            print( str(data))
            data2=data[0:10]
            id=(''.join(map(chr,data2)))
            print(id)
            lcd.clear()
            lcd.message(id)
            w.digitalWrite(1,1)
            time.sleep(0.1)
            w.digitalWrite(1,0)

            break

          # Always stop crypto1 when done working
          rdr.stop_crypto()

rdr.cleanup()

apache2インストール


sudo apt install vim apache2

サンプルページを削除


sudo rm /var/www/html/index.html

起動設定

/etc/rc.local の後ろの方を以下のように調整


ifconfig eth0:1 169.254.12.24

sleep 5 # 環境により調整

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi

python3 /home/pi/LCDmessage.py $_IP
mount -o exec,uid=33,gid=33 /dev/sda1 /mnt
/mnt/trans.sh & > /dev/null

exit 0

オリジナルはIPアドレスを画面に表示するようになっているけれども、それに加えて

  • セカンダリIPアドレスを設定
  • IPアドレスをLCDに表示
  • USBメモリを www-data ユーザ権限でプログラム実行可能で /mnt にマウント
  • USBメモリに trans.sh があればそれを自動実行する

USBメモリをDocumentRootに

/etc/apache2/sites-enabled/000-default.conf を以下のように編集


#       DocumentRoot /var/www/html
        DocumentRoot /mnt

USBメモリ上のプログラムを実行可能にする

www-data でGPIOを使えるように sudoers に以下を追加


www-data ALL=(ALL) NOPASSWD: ALL

/etc/apache2/apache2.conf を書き換えて /mntで cgiが動作するようにする


#<Directory /var/www/>
#       Options Indexes FollowSymLinks
#       AllowOverride None
#       Require all granted
#</Directory>


<Directory /mnt/>
        Options Indexes FollowSymLinks execCGI
        AddHandler cgi-script .cgi .pl
        AllowOverride None
        Require all granted
</Directory>

cgi を有効にする


$ sudo a2enmod cgid

とする。

Xojo のためのライブラリインストール

Web アプリを Xojo で作る場合は以下が必要


pi@raspberrypi:~/xojo/RemoteDebuggerConsole $ sudo apt install libunwind8