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


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

![IMG_20200317_154041.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/1929e364-dbd5-071c-6a71-89161bb9913b.jpeg)

これを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
```