Make Local Happiness

自分の幸せは自分で作る!!!

RaspberryPi 小ネタ集

RaspberryPiを使って、プリンタサーバやタッチパネルのシステムを業務で構築しナレッジが溜まってきたので、 幾つかご紹介していきます。

RaspberryPiに接続したいけど、IPアドレスがわからない場合の対処

arp-scanでIPを検索する

同じWifi内に接続している機器のIPアドレスを検索することができます。

$ sudo brew install arp-scan

Raspberry Pi Foundationと表示される端末がRaspberryPiになります。

$ sudo arp-scan -l --interface en0

Password:
Interface: en0, datalink type: EN10MB (Ethernet)
Starting arp-scan 1.9 with 2048 hosts (http://www.nta-monitor.com/tools/arp-scan/)
10.4.120.1  00:00:5e:00:01:1d   VRRP (last octet is VRID)
10.4.120.2  00:1a:1e:02:48:c0   Aruba Networks
10.4.120.3  00:1a:1e:02:a1:90   Aruba Networks
10.4.120.10 2c:d0:5a:a0:b2:20   Liteon Technology Corporation
10.4.120.16 8c:8e:f2:a9:58:ef   (Unknown)
10.4.120.7  0c:51:01:55:01:c6   (Unknown)
10.4.120.14 cc:fb:65:3a:b8:49   (Unknown)
10.4.120.28 e0:5f:45:0c:e1:16   Raspberry Pi Foundation

Ethernetで直接接続する

MacとLANケーブルを直接接続することで、接続することができます。 RaspberryPiはBonjourIPアドレスが不明でもホスト名でLAN上のコンピュータ等にアクセスする方法)が使えるため、 ホスト名.localで接続することができます。 ※Wifiに接続していてもBonjourは利用できます。

RaspberryPiのデフォルトのhost名はraspberrypiなので、 以下で接続することができます。

ssh pi@raspberrypi.local

最新のRasbianであれば何もしなくても、host名によるアクセスができたと思いますが、 もしできない場合は以下をインストールして試してみてください。

sudo apt-get install avahi-daemon

host名の変更方法

以下の2箇所変更する必要があります。 raspberrypiと記載されている箇所を変更します。

  • /etc/hosts
  • /etc/hostname

sshでログインしているraspberrypiでElectronが起動できない

これは別にelectronの問題ではないのですが、 sshでログインしている際には、どのディスプレイで表示するかを設定する必要があります。

なので、先頭にDISPLAYを付ける必要があります。

npm start ⇒ DISPLAY=:0 npm start

visudoのエディタをnanoからvimに変更する

sudo update-alternatives --set editor /usr/bin/vim.basic

以下の記事のコマンドが使えます。 qiita.com

OS起動後にDesktopを表示させない

$ vim ~/.config/lxsession/LXDE-pi/autostart

# @lxpanel --profile LXDE-pi
# @pcmanfm --desktop --profile LXDE-pi
# @xscreensaver -no-splash
@xset s noblank
@xset s off
@xset -dpms

ディスプレイを上下逆にする

raspberrypiの純正の7インチディスプレイを使用する際に、ケースにはめた際に、 表示が上下逆になっているので、この設定が必要になります。

$ vim /boot/config.txt

lcd_rotate=2

electronを自動起動

pm2を使うことで簡単にelectronの自動起動ができます。

pm2.keymetrics.io

$ git clone https://github.com/electron/electron-quick-start
$ cd electron-quick-start
$ npm install
$ npm run build

// pm2設定ファイルを作成
$ vim pm2.yml
apps:
  - script: /home/pi/electron-quick-start/start.sh
    name: 'electron-quick-start'
    env:
      NODE_ENV: development
    env_production:
      NODE_ENV: production

// 起動ファイルを作成
$ vim start.sh
cd ~/electron-quick-start
DISPLAY=:0 npm start

$ sudo npm install -g pm2
$ sudo su -c "env PATH=$PATH:/usr/bin pm2 startup -u pi --hp /home/pi"
$ pm2 start ~/electron-quick-start/pm2.yml
$ pm2 save

RaspberryPiでSVGを作成した際に日本語が表示されない時の対処

f:id:iwate_takayu:20171013201738j:plain

RASPBIAN STRETCH LITEを利用したのですが、 こちらには日本語のフォントがインストールされていません。

そのため、日本語用のフォントを設定すればSVGに無事日本語をインストールすることが可能になります。 ここに辿りつくのに結構時間がかかってしまいました。

そもそも、なんでRaspberryPiでSVGを作成しようとしたのかと言うと、 プリンタサーバを作成するためでした。

日本語フォントをインストールしないまま、日本語をSVG内で書き出した場合、 何も表示されないため、あれ?となります。 同じ事をやろうとしている方は是非お試しください。

日本語フォントを設定

フォント管理のソフトをインストール

$ sudo apt-get install fontconfig

日本語フォントをインストール&設定

$ sudo apt-get install ttf-kochi-gothic xfonts-intl-japanese xfonts-intl-japanese-big xfonts-kaname fonts-noto
$ sudo fc-cache -fv

フォントの検索

sudo apt-cache search font japanese |grep roboto

おまけ

raspberry pi自身のロケールの変更 必要かどうかわからないですが、変更しました。

$ sudo raspi-config
  1. Localisation Options -> I1 Change Locale

※以下をスペースでチェックします

ja_JP.EUC-JP EUC-JP
ja_JP.UTF-8 UTF-8

最後にデフォルトを以下に設定して完了です。

ja_JP.UTF-8 UTF-8

RaspberryPiでUSB接続でTM-30mプリンターを使う際に管理者権限以外で実行したい場合の対処

サーマルプリンターをUSB接続で使う際に、 node-thermal-printer を使用したのですが、普通に実行すると処理が終了しません。

これは権限の問題で、sudoを付けて実行すると実行できます。 ですが通常はsudo無しで実行したいので、 USBの権限を変更する方法について記載します。

USB権限の設定

USBデバイスのidVendorとidProductの確認

USBの権限を変更するためのruleファイルを作成するためには、 対象のUSBデバイスのidVendorとidProductの値が必要となります。

$ dmesg | grep usb

[    2.320512] usb 1-1.5: new full-speed USB device number 4 using dwc_otg
[    2.462682] usb 1-1.5: New USB device found, idVendor=04b8, idProduct=0e20
[    2.465600] usb 1-1.5: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[    2.468465] usb 1-1.5: Product: TM-m30 Bluetooth
[    2.471268] usb 1-1.5: Manufacturer: EPSON

ruleファイルを作成

$ sudo vim /etc/udev/rules.d/99-tm-m30.rules
SUBSYSTEMS=="usb", ATTRS{idVendor}=="04b8", ATTRS{idProduct}=="0e20", GROUP="dialout", MODE="0660"

再起動して試す

設定が反映されるよう一度再起動します。

$ sudo reboot

印刷用のプログラム作成

$ npm install node-thermal-printer 
$ vim printer.js

const printer = require("node-thermal-printer");
printer.init({
  type: 'epson',
  interface: '/dev/usb/lp0'
});
printer.alignCenter();
printer.println("Hello world");
printer.printQR("https://github.com/Klemen1337/node-thermal-printer");
printer.cut();
printer.execute((err) => {
  if (err) {
    console.error("Print failed", err);
  } else {
    console.log("Print done");
  }
});

印刷実行

$ node printer.js
> Print done

参考

http://thinkami.hatenablog.com/entry/2015/06/25/064658

「なぞときBINGO」という新しいBINGOを作ったよ

f:id:iwate_takayu:20170819110621p:plain

実は最近結婚式をやりました(祝)
私は謎解き(リアル脱出ゲーム)にハマっており、 2次会では何か謎解き関連のことがやりたいと思ってました。

そこで思いついたのが、ビンゴゲームです。
結婚式の2次会で誰もがやる定番中の定番なゲームだと思います。
そんなビンゴゲームと「謎解き」をかけ合わせたら面白いと思って作ったのが、
「なぞときBINGO」だったのです。

なぞときBINGOとは?

通常のビンゴゲームでは、数字はガラガラさせて数字の書いてある玉を出すビンゴマシーンで数字を出して、 1列すべてが空いたらビンゴで運要素しかないゲームです。 運要素の強いビンゴゲームを「なぞときBINGO」では少し実力主義型のゲームに変えました。

「なぞときBINGO」ではビンゴマシーンは使わず、 ビンゴカードと謎(パズルのようなもの)が書かれた紙を数枚使ってゲームを進めます。 参加者が謎を解くと答えで数字が出てくるので、その数字をビンゴカードから開けてゲームを進めます。

謎をすべて解いた後ですが、 実は「電話番号」が出てきます。 その電話番号に電話すると抽選に参加できる仕組みになっています。

なんで電話をかけるんだと思った方がいるかと思うのですが、
これは、電話を使って抽選するためです。

通常のビンゴゲームではビンゴになると、ビンゴー!と高らかに言って、
会場の前の方に行くかと思います。

この「なぞときBINGO」では、抽選は電話で行います。

f:id:iwate_takayu:20170819112943p:plain

WEBのツールを用意しており、電話をかけた方の番号の下4桁が一覧で表示され、
当選人数を指定し抽選ボタンを押すと、当選した番号が決定し、
電話に着信が入るのです。

f:id:iwate_takayu:20170819112844p:plain

どうやって作ったのか?

f:id:iwate_takayu:20170510221936j:plain

実はこのビンゴカード自作なんです。
これは特注しているわけではなく、レーザーカッターで自分で切って作っています。
レーザーカッターは使い方がわからなくても、渋谷のFabcafeでハンズオンをやっていたり、
AKIBA.DMMやTechShopでも教えてくれる人がいるので案外なんとかなりました。

電話のシステムはTwilioを使って作っています。

これ非常に便利です。 自動音声応答(IVR)や着信をトリガーに処理を投げることができたりと、
電話を使った仕組みは一通り作れるのではないでしょうか?

WEBツールは裏側はFirebaseで作っています。
Firebase FunctionsでAPIは作成しており、APIからTwilioを呼び出しています。
サーバーを保持していないため、 コストが安く、メンテナンスなしで動作する構成で作っています。

まとめ

もともとは自分の結婚式のために作ったものですが、 意外と評判がよかったため、現在販売も開始しました!(是非友達に進めてください)
結婚式の2次会で普通のビンゴでは満足できない方にはオススメの商品になったと思います。
意外にも電話で抽選がくるのは面白かったです。

もともとTwilioのサイトに抽選用のデモアプリがあったので、
システム的にはそれをFirebase用に書き換えた感じです。

体験レポートなんかも今後書いていきたいので、もし写真付きで書いてもいいよという方は、
info@nazoneko.comまでメール頂ければ無料で謎解きビンゴをプレゼントします。

▼購入はこちらから

peraichi.com

▼体験版の申し込みはこちらから

docs.google.com

raspberryPiの初期セットアップ

f:id:iwate_takayu:20170408172520j:plain

必要なもの

SDカードにRaspbian(OS)を焼く

こちらはMacでの作業になります

raspbianをMacにダウンロード

以下のページからダウンロードできます

https://www.raspberrypi.org/downloads/raspbian/

1.SDカードのディスクを確認します

$ diskutil list
/dev/disk2 (internal, physical):
  #:                       TYPE NAME                    SIZE       IDENTIFIER
  0:     FDisk_partition_scheme                        *15.9 GB    disk2
  1:             Windows_FAT_32 boot                    66.1 MB    disk2s1
  2:                      Linux                         4.3 GB     disk2s2

2.先程ダウンロードした.imgのファイルを指定してSDカードに書き込みます

$ sudo dd bs=1m if=2017-03-02-raspbian-jessie.img of=/dev/disk2


4190+0 records in
4190+0 records out
4393533440 bytes transferred in 3563.665218 secs (1232869 bytes/sec)

3.sdカードを取り出します

sudo diskutil eject /dev/disk2

WIFI設定

SSID, PASSWORDは適宜変更する

sudo sh -c 'wpa_passphrase SSID PASSWORD >> /etc/wpa_supplicant/wpa_supplicant.conf'

Wifiのパスワードが残っているので消す

sudo vi /etc/wpa_supplicant/wpa_supplicant.conf

network={
        ssid=SSID
        #psk=PASS # 生パスワードなんで消しておく
        psk=01b...
}

SSIDが表示されれば成功

$ iwconfig wlan0

IPを固定にする

現在のIPを確認する

$ ifconfig wlan0
wlan0     Link encap:Ethernet  HWaddr b8:27:eb:46:79:7d  
          inet addr:192.168.0.205  Bcast:192.168.0.255  Mask:255.255.255.0

ゲートウェイのアドレスを確認する

$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.1     0.0.0.0         UG    303    0        0 wlan0
192.168.0.0     0.0.0.0         255.255.255.0   U     303    0        0 wlan0

DNSサーバを確認する

$cat /etc/resolv.conf 
# Generated by resolvconf
nameserver 8.8.8.8

先程確認したIPを記載する

sudo vi /etc/dhcpcd.conf

interface wlan0
inform 192.168.0.205
static routers=192.168.0.1
static domain_name_servers=8.8.8.8

$ sudo /etc/init.d/dhcpcd reload

各種インストー

アップデート

$ sudo apt-get update
$ sudo apt-get upgrade

$ sudo apt-get install -y git
$ sudo apt-get install -y vim

鍵設定

githubに公開鍵を置く

githubに鍵を予め登録しておく 共通鍵は以下のURLで確認できる

https://github.com/[username].keys

公開鍵を登録する

cd 
mkdir .ssh
cd .ssh 
wget -O authorized_keys https://github.com/ganezasan.keys 
cd ..

sudo chmod 700 .ssh
sudo chmod 600 .ssh/authorized_keys

sshの設定

$sudo vim /etc/ssh/sshd_config

...
PermitRootLogin no # root不可
...
PasswordAuthentication no # パスワード認証を無効に
...
AuthorizedKeysFile     %h/.ssh/authorized_keys #コメントインする

$ sudo /etc/init.d/ssh restart

sshを有効にする

sudo raspi-config

Interfacing options > ssh > Enable or disable ssh server

ディスプレイを上下逆にする

$ sudo vim /boot/config.txt      
$ lcd_rotate=2

Arduinoをはじめようを読んでみたメモ

本の半分がArduino言語のリファレンスなので、 実際作るときに辞書としては使えそう。 前半は簡単なセンサーのプログラムと回路のサンプルについての説明が書いてあった。

以下メモです。

ティルトスイッチ(傾斜スイッチ) パルス幅変調(PWM)

抵抗器とコンデンサの値の読み方

抵抗器とは?

0
1
2
オレンジ 3
4
5
6
7
8
9
10%
5%

金と銀は精度を表す色 茶、黒、オレンジ、金という並びだったら、 103±5%とよめます。でもこれだと意味がわかりませんね。 実は3本目がゼロの数を表しています。 なので103ならば、10の後ろにゼロが3つあるので、「10000Ω±5%」の抵抗器ということになります。10kとも表せます。

コンデンサとは?

コンデンサは電気を蓄えたり放出したりする電子部品です。 直流を通さないで絶縁するはたらきもあります。

http://www.murata.com/ja-jp/campaign/ads/japan/elekids/compo/capacitor

コンデンサキャパシタ)の値の読み方はもう少し簡単です。 電解コンデンサのような樽型の部品は、値がそのまま印刷されています。 コンデンサの値の谷はファラド(F)で、あなたよく使う込んで差はマイクロファラド(μF)単位で図れるものでしょう。

セラミックコンデンサのような円盤形のコンデンサの場合は、μのような単位の記号は印刷されていません。かわりにピコファラド(pF)単位の値が3桁の数字で示されます。

1,000,000pF = 1μF

この3桁の数字の読み方は抵抗に似ていて、3桁目の数字が1〜2桁目の数字の後ろに並ぶゼロの数を表しています。ただし、ゼロの数をそのまま表すのは3桁目が0〜5のときだけで、8の場合は最初の2桁を0.01倍、9の場合は0.1倍にします。6と7は使われません。 例を挙げましょう。104と印刷されていたら100,000pF、つまり0.1μFです。

229ならば2.2μFとなります。

Prototyping Labを読んでArduinoを触ってみた

今回始めてArduinoに触り、電子工作というか回路とかも結構怪しい状態なので、 書籍に書いてることをメモしている感じです。 この本を読みました。

作品紹介

Arduinoで作られたプロトタイプの作品も結構多かった。 どれもプロトタイプからガッツリ工場での量産を意識しているわけではなく、 途中で品質や金額などを考慮して、品質をなんとか担保しつつ量産できるようにする工程があった。

電子回路の基礎知識

電気の流れは水の流れに例えられ、電位の高いところから低いところに向けて電流は流れる。地点の高さ(海抜)の高さは電気ではグラウンド(GND)を基準として比較します。

オームの法則

オームの法則は「電位差が電流に比例し、その比例定数を抵抗という」 2点間の電位差をE、電流をI、比例定数をである抵抗をRで表すと、 E=I×R

R=(電源電位 - LEDの順電圧)/ LEDに流したい電流

LEDの順電圧が1.8V(赤の場合にはこのくらいが多い)、電流が10mAの場合320Ωが適切であることがわかる

R = (5 - 1.8) / 0.01 = 3.2/0.01 = 320

Arudino基礎知識

PWM(Pulse Width Modulation)

オンの区間とオフの区間の割合を変えることで連続的に出力をコントロールすること

analogWrightは限られたデジタルピンでしか使えない

D3,D5,D6,D9,D10,D11の6つのみ

センサ

フォトインタラプタ

ある位置に物体があるかどうかを検知できる。 フォトインタラプタには透過型と反射型があります。 - 透過型: 発光素子と受光素子が対抗にセットされ、間を何かが遮ったかどうかを検出することができます。 - 反射型: 発光素子と受光素子が並行にセットされ、一定の距離に反射する物体があるか否か、また、反射率はどの程度かを検出することができます。

まとめ

センサー試すにはいい感じの本でした。 回路とセンサーの部品、サンプルコードなど丁寧に書かれていたので、始めの1冊としてはいいかもしれないです。 Lチカもやっぱり動くと楽しい!

f:id:iwate_takayu:20170202121939j:plain