Raspberry pi 3Bと公式7インチタッチパネルをUARTコンソールとして使いたい（書きかけ更新中）

#背景と概要
検索して来てしまった方には申し訳ないのだけれど、書きかけを宣言していますので、
自分でこれが完成、と決めたときにこの記事は完了ということになります。
なので内容が不備だらけかと思いますがご容赦ください。
とはいえ、ご指摘なんか頂けたりしたら誠に嬉しいです。


検査治具のようなものを作るとき。マイコンをユニバーサルで組んで、キャラクタLCDで表示して、物理スイッチで操作、なんてのはもうやりたくないんです。

Raspberry piの羨ましさは、タッチパネルが簡単に（？）使えそうなところ。
UARTで制御するAD/DAマルチ基板のようなものを作ったのを機に、アスキーコマンドをタッチパネルで送受信・表示できるコンソールを作りたい。

(環境)
raspberry pi 3B
raspbian stretch
raspberry3 7" touch screen display

#まずはRaspberry piが動くまで

##OSインストールと更新
Raspbian stretch
あんまり覚えてないのでもう一回やり直したら追記しよう。
最新は7/7にBusterがリリースされたそう。('19.9.4) 
　→　 [Raspberry Pi 4 Model B 発売!　そして、OS を Buster へ更新しよう](https://qiita.com/Robot-Inventor/items/b565e323b94fc2985ec0)
Raspberry pi4、なんかUSB-Cに不具合あったみたい。
上市したての製品ってのはやっぱりねえ。ああ身につまされる。チームのひと、眠れているかしら。

#入力デバイスについて
せっかくの3B機能なんでBluetoothマウスとキーボードを接続。
これで夢のノマド開発、って思ったらWifiとBluetoothが干渉、
タイプやマウスがカクカクイライラ。
3B+に買い替えました。wifi 5GHz使えるので干渉なし。

しかしうーん。英字キーボードが慣れない。
「+」→「shift + F12」、「_」→「shift + -」、「\」→「\(BackSpaceの下)」、「@」→「shift + 2」

日本語有線キーボードだと下記のような設定が必要でした。
メニュー → 設定 → キーボードとマウス → キーボード（タブ） 
　→ KeyboardLayout(ボタン) → Layout(japanese)
　　 *「Model」は「Sanwa Supply SKB-KG3」にしているけど有効だったかどうか。

##モニターについて
実運用は公式タッチパネル[ (接続方法) ](https://raspberry-pi.ksyic.com/page/page/pgp.id/4)なんだけれども、開発時には老眼のひどい開発者には酷。
12インチHDMIモニターを購入。視野角振れるやつにしたほうがいいです。
でも結局、次のVNC接続での開発がいまのとこ一番便利。

##PCからの遠隔接続
　[Raspberry PiにVNCで接続して操作する](https://qiita.com/s_harada/items/fea3a5301c47e4c857f5)
試したらやぱし文字が小さいのね。
　LXTerminal→編集→設定→スタイル（タブ）→端末のフォント
で文字を大きくすれば快適。
仕事場では別のVNCソフトの常時監視がキツくて接続不可でした。とほ。

で、家でも起動時はいちいちipアドレスを調べなきゃいけないので
マウスとモニターは一旦繋げなきゃならない。めんどー。
で、ipアドレス固定を試す。　↓
[VNCのIPアドレスを固定する](https://ameblo.jp/tatsu54321/entry-12362781942.html)
下記のコマンドでconfファイルを編集。末尾に設定を足す。

```python
nano /etc/dhcpcd.conf
```

これでラズパイ側は電源のみでおっけー。スマート。
しかーし。モバイルルーターでは一旦VNCを切断してから
もう一度「ラズベリーパイの設定」→「インターフェース」タブ→「VNC」チェックボックスをオンしないと切り替わらなかった。
モバイルルーターのときのdhcpcp.confは

```python
static ip_adress=192.168.225.xx
static routers=192.168.225.1
static domain_name_servers=192.168.225.1
```
ちなみにdomain_name_serversはipv4 DNSサーバーのアドレス。
routersのアドレスと一緒にしないと、何故かVNCは繋がるのに
webに繋がらなかった。
複数のLAN設定も出来るみたいなので後でやってみよう。

もうひとつ問題。
ラズパイを電源だけにして起動させてもVNC繋がらない。
なぜかHDMIでモニターを繋げるとVNCも繋がる。意味ないじゃん！
あれこれやってみたら、マウスをいったん繋いでさっと動かしたら繋がった。
スクリーンセーバー系の設定かな。
ラズパイをシャットダウンしなければイケるんで、今は常時起動。

#GPIO
まずは現在のGPIOの状態を一覧表示する。

```pyton
$ gpio readall
```
RPi.GPIOモジュールを使用。
BCMでピン番号を指定して内部プルアップ。
ボタンを使う処理と並行処理させたくて、割り込みにしたかったけど
うまくいかず。
結局after()で250msごとに関数を呼び出してGPIOの状態を見る。
これってポーリングって言えるのか？なんかスマートじゃないなあ。
後でちゃんと割り込み勉強しよう。

```pyton
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)
GPIO.setup(24, GPIO.IN, pull_up_down=GPIO.PUD_UP)
def switch():
  try:
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(24, GPIO.IN, pull_up_down=GPIO.PUD_UP)
    if GPIO.input(24) == GPIO.LOW:
        tx1['bg'] = 'red'
        print ("sw on")
    else:
        tx1['bg'] = 'white'
  except KeyboardInterrupt:
      pass
        
  root.after(250,switch)
#タイマー
root.after(250,switch)

```


##公式タッチパネルを設定
公式タッチパネルとRaspberry piが収まる専用ケースを使うんならば上下を逆にする設定が必要。

```python
 $ sudo nano /boot/config.txt
```

で、中に記載された設定内容を下記のように修正

```python
 lcd_rotate=2
```

「ctrl+x」→「shit + Y」→「Enter」 保存して終了。再起動すると逆になる。

##シリアル通信モジュールのインストールと使い方

```python
 $ sudo apt-get install python-pip
```

```python
$ pip install pyserial
```


↓先達に感謝
[karaage -- Raspberry PiとArduino間でUSB経由のシリアル通信](https://karaage.hatenadiary.jp/entry/2015/06/10/080000) 

```python
import serial

ser = serial.Serial('/dev/serial0',9600,timeout=0,writeTimeout=0)

#ボタンが押されたときに呼び出される
def pushed(self):
  ser.write(b"(アスキー文字列)\r\n")
```
'/dev/serial0'を指定することでGPIO上のUARTが使える。
いずれ複数のUARTを使いたいのでUSB端子を使用する方法を体得せねば。


#GUIとか
##Tkinter
結構な時間をかけてQTをトライしたが一旦あきらめました。挫折。
見た目はいいし、C++で開発環境もあるし。
でも作例があまり落ちてないんだなー。クロスコンパイルで沢山使ってる方が
いると思うんだけど。

で、GUIはTkinterを採用。
widjetの配置には、いまだにgrid()が自在に使えずpack()でごまかし中。

##PyAutoGui
ボタンをタッチすると色を変えるようにしたんだけど、タッチで触れるとそこにカーソルが置かれる。
するとカーソルオーバーの動作になって、色が変わらない。
悩んだ結果これをインストールして、ボタンを押した瞬間に隅っこに移動するようにした。
スマートじゃないなあ。多分方法あるんだろうな教えてください。

##自動起動
検査治具なのでいちいち.pyをダブルクリックして起動、なんてあのひとにもこのひとにも嫌われる。

散々色々試すも玉砕。これからのやつ、と盛り上がってるsystemdはかなり時間かけたけど惨敗。
結局は1回はできたのにUpgradeかUpdateで起動しなくなっていたautostartをやり直して成功。

　[実例で学ぶRaspberry pi電子工作　補足情報](https://raspibb2.blogspot.com/2017/01/gui.html)

下記ファイル、無いんだったら作らんかい、のだそう。

/etc/xdg/lxsession/LXDE-pi/autostart

```python
@lxpanel --profile LXDE-pi
@pcmanfm --desktop --profile LXDE-pi
@xscreensaver -no-splash
point-rpi
@python3 /home/pi/xxxxx.py
```

#ボタンによる電源オンとシャットダウン
検査治具なので（以下略）
ボタン１つで電源オンとシャットダウンしたい。BCM3とBCM23をスイッチ片側、もう片方をGNDに配線。
（悪夢の）systemdでボタン監視のpythonプログラムを起動時から自動で走らせておいて、BCM23をGNDに落とすとにシャットダウンできるようになった。

◆サービスファイル
sudo nano /usr/lib/systemd/system/shutdownbuttond.service
◆シャットダウンのプログラム
/home/pi/pyhome/shutdownd.py
◆サービス有効化(やらないと自動起動しない)
pi@raspberrypi:~ $ systemctl enable shutdownbuttond.service
◆デーモン再起動
sudo systemctl daemon-reload
◆サービスが有効になっているか確認
systemctl status shutdownbuttond.serviceにてステータスを見る

↓先達に感謝　その２。
[ラズパイでシャットダウンボタンを付ける(ついでに起動ボタン)](https://qiita.com/clses/items/e701c1cb6490751a6040)

BCM3をGNDに落とすと電源オン。
これが必ず1回目は失敗する（起動しない）。失敗したな、と思って2回目のボタンを押すと起動する。なんだろう。


##ピンアサイン
下記の図は　[Embedded Linux Wiki](https://elinux.org/RPi_Low-level_peripherals)　よりなんだけれども、例えばGPIO23 て書いてあるわね。けれど、「$ gpio readall」で表示されるのは「Phisical→18 / Name→GPIO.4 / WPI→4 / BCM→23」ってなってて何がなにやら。混乱するわね。
でもしかし　GPIO.setmode(GPIO.BCM)　で指定したらBCMの番号でした。
![Pi-GPIO-header.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165578/1d9674c5-dbaa-c251-4867-a4489f65c072.jpeg)


##ADコンバータ
んーー。UARTコンソールとして使う話からどんどん膨らんでいく。
後で整理しよう。

ADS1015
色んなところに散らばっている作例、多分2016年あたりまでの記事
だと Adafruit-Raspberry-Pi-Python-Code レポジトリで提供されて
いたものが多いんだけど、下記に見つけた方法が'19.10月現在最新ぽい。

https://www.qoosky.io/techs/23105da2a8

が、importして実行してみたらエラー。
Python3で実行するプログラムだったのでどうもダウンロードしたのは
python2用みたい。
そこで、

```python
sudo pip3 install adafruit-ads1x15
```
としてもまんまとエラー。
gitを見に行ったら
Adafruit-Ads1x15フォルダが「Use explicit relative import for Python 3 support.」と書かれている。小文字と大文字の違いに注目。

なので、

```python
sudo pip3 install Adafruit-Ads1x15
```
としたら通った。

でもADS1015って12ビットかと思ったらどうも11ビットなんすかね。
使い道を考えるとちょっと荒いかなあ。
で、MCP3424ってのが18ビットとのことで使ってみたい。
でもadafruitのように簡単なライブラリがみつからない。
smbusというので動かせばいいらしいけど、色んな記事を見ると
python3ではsmbus2を使う、とか。
あれこれ調べて
$ sudo apt-get install python3-smbus
したら、もう入ってるよ、とのこと。
コード内でimportしてみたら普通に通っちゃった。
ので、下記参考にやってみたい。
ハード買わなきゃ。
https://www.denshi.club/pc/raspi/5raspberry-pi-zeroiot4a-d1.html

あとAC100Vが出てるかどうかのチェックが必要なので
↓ここが参考になりそうですか

https://ameblo.jp/voodoo3d/entry-11910604795.html

##google spread sheetへの自動記入
なんかタイトルからどんどん離れて行ってるけれど。
目標とするものが（治具）完成したら、それで実施した結果を
帳票に自動記入してしかも自動印刷まで、っていうのが理想。

自動記入は以下を参考にまずはテスト成功。
https://qiita.com/akabei/items/0eac37cb852ad476c6b9
APIとかよく分ってない。コピペで出来ちゃうと後で忘れてるよね。
ちゃんと勉強しなきゃ。

```python
#!/usr/bin/python
# -*- coding: utf-8 -*-
import gspread
from oauth2client.service_account import ServiceAccountCredentials

#発行されたAPIキーとシート名
key_name = 'xxx-.json'
sheet_name = 'xxxx'

#APIにログイン
scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive']
credentials = ServiceAccountCredentials.from_json_keyfile_name(key_name, scope)
gc = gspread.authorize(credentials)

#セル'A1'に'TEST'と入力
cell_number = 'A1'
input_value = 'TEST'
wks = gc.open(sheet_name).sheet1
wks.update_acell(cell_number, input_value)

```
っとここまではpythonn2.x系では成功。
ではでは、ってpytohn3.xで作ってるコードに組み込もうとしたら、
モジュール入ってねえよーと怒られた。
ので、↓こちらがpyton3.x系でやんなさいよ、と言う通り
https://tanuhack.com/operate-spreadsheet/#i-5
で示しているように、
sudo pip install gspread
って、一回やった気がするけど、なんかちゃんとエラーなく通った様子。
でも実行させたらまた怒られちった。なので
sudo pip3 install gspread
としたらお怒りは静まった。

でもまだ動いてくれないので
https://teratail.com/questions/89840
の回答例にて
$ pip install --upgrade pip
$ pip install --upgrade oauth2client
したら、pipのupgradeは通ったけどoauth2clientのupgradeで
openなんちゃらがねえっす、と怒られた。
ので、
$ pip3 install oauth2client
としてから
$ pip install --upgrade oauth2client
を実行するとようやく通してくださいました。
これでpython3で動作確認できました。
$ python3 ***.py

自動印刷はどうするか。
google spread sheetでマクロ組めるなら、治具側で印刷したいフロー
まで進んだら、フラグに使うセルを決めてそこに「end」なんて記入して、
それをマクロが見つけると印刷実施、なんてできないかなあ。
マクロ起動するぐらいなら普通に印刷すりゃいいね。
多分pythonでそこまで制御できるんだろうなあ。

##全画面表示と色々な機能の並べ方
UARTコンソールだけでなく、電流測定・電圧測定・ピンの状態表示
と色々欲張ってきてしまった。
ファイル分割したいし、それぞれをきれいに並べたい。

↓こちらはコードも分かりやすくて、仕上がりもクール。
https://qiita.com/Kazuya_Murakami/items/03c218f80377280f5b9f
かっこいいな。こんな風にしたいな。


##SDイメージのバックアップ
↓こちらを参考に
Raspberry Pi バックアップ（Windows）  (https://qiita.com/henjiganai/items/fac178aef2a03ffe83fc)
　　ツール入手
　　Win32 Disk Imager　(https://ja.osdn.net/projects/sfnet_win32diskimager/releases/)
　　　　zipイメージが良さそうだったので
　　　　Win32DiskImager-1.0.0-binary.zip　('20.2.21現在)をダウンロード
　　SDメモリカードフォーマッターWindows用
　　　　(https://www.sdcard.org/jp/downloads/formatter/eula_windows/index.html)

↓この方法だとPC要らずで直接バックアップできるんですって
https://www.fabshop.jp/raspbian%E6%A8%99%E6%BA%96-sd-card-copier%E3%81%AA%E3%82%89%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97%E3%81%AF%E3%80%81%E3%81%93%E3%82%93%E3%81%AA%E3%81%AB%E7%B0%A1%E5%8D%98%EF%BC%81/

備えあれば憂いなし。