Pythonとハードウェア　ー　PythonでRS232Cを利用する　－

必要にせまられつつあり、勉強のため調べているメモです。
内容についての実機での確認をほとんどしていない人によるメモだということに注意してください。

ハードウェアを制御するときには、CPUの種類・OSの種類のごとに、使用するライブラリが異なってしまいがちである。
```#include <windows.h>```
という行が入っていることが多い。
そのままでは、他のOSでは使えない。


###**移植性の高いシリアルポート用ライブラリ（C++) Boost**
OS依存性のない共通なライブラリを提供しているBoostにはシリアルポート用のライブラリが提供されている。
[Boost.Asio](http://www.boost.org/doc/libs/1_59_0/doc/html/boost_asio.html)
[Serial Ports](http://www.boost.org/doc/libs/1_60_0/doc/html/boost_asio/overview/serial_ports.html)
解説記事[【Boost】シリアル通信](http://blog.livedoor.jp/k_yon/archives/52145222.html)
[Boost.Asioでシリアル通信してみる](https://blog.myon.info/blog/2015-04-19/boost-asio-serial/)

[Boost C++ libraries for Raspberry Pi](https://www.raspberrypi.org/forums/viewtopic.php?&t=8111)
Boost C++ librariesをRaspberryPi上でビルドできていることが記されている。
Libraries only (static + dynamic)が公開されている。



###**USBシリアル変換ケーブル**
最近は、PCでもRS232Cポートがなくなっているので、USBシリアル変換ケーブルとUSBシリアル変換ドライバが必要になっている。



[USB-シリアル変換IC CP2102ドライバ・インストール方法解説](http://www.cqpub.co.jp/INTERFACE/contents/special/CP2102install/index.htm)


WindowsでのUSB-シリアルでのCOMポート番号の変更の仕方
[デバイスマネージャCOMポートを変更する](http://www.geocities.jp/bokunimowakaru/diy/com/com_port.html)

[Linuxで複数のシリアルポートやデバイスを見分ける](http://tclip.blog.fc2.com/blog-entry-86.html)

Linux(RaspberryPiも含む)ではUSB-シリアル変換でのIOは
/dev/ttyUSB0
といったデバイス名で表示されている。


Zynq USB-UART ドライバ
[ISE & Vivado 設定 on Ubuntu]
(http://masahir0y.blogspot.jp/2013_12_01_archive.html)
ここでも
/dev/ttyUSB0
というデバイス名が表示される。


###**PySerial**
なんでもかんでもPythonでできることはまずPythonで行いたい私としては、Python用のライブラリを調べてみることとした。

[slideshare / ハードウェアを用いてPythonを学ぶ ](http://www.slideshare.net/yutakitagami/python-6744817)

OS依存性が少ないもの
・[pySerial 配布元](https://github.com/pyserial/pyserial)
・[pySerialモジュールについて Pythonによるシリアルデバイスの使い方 ] (http://python.matrix.jp/pages/modules/pyserial.html)Python(windows）での送信例
・[pySerial を使う Macでも動くpythonのシリアル通信モジュール。](https://sites.google.com/site/hananekosugan/manual-tips/python/pyserial)　送信と受信の例あり
・[pyserialを使って, macからarduinoにシリアル通信をした](https://dek1ymt2.wordpress.com/2014/05/03/pyserial%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6-mac%E3%81%8B%E3%82%89arduino%E3%81%AB%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%AB%E9%80%9A%E4%BF%A1%E3%82%92%E3%81%97%E3%81%9F/)　Python(Mac)からの送信、arduino　C++での受信例
・[Pythonでシリアル通信](http://qiita.com/kosystem/items/0023cfee941fdf099087)　インストール方法、送信例、受信例

・[pySerial/pyWin32でシリアル通信、でも受信が…](http://omoitsuki-teck.cocolog-nifty.com/blog/2009/10/pyserialpywin32.html)送受信例
・[Pythonでシリアル通信（その２）](http://blog.livedoor.jp/baruth_/tag/pyserial)送受信例
・[Pythonでシリアル通信](http://qiita.com/kosystem/items/0023cfee941fdf099087)

接続させるCOMポートの番号は、そのUSB-シリアルを接続させる前と後とにデバイスマネージャーでCOMポート表示をさせると、新規に現れたポート番号が、そのUSB-シリアルのポート番号です。


RaspberryPiを含むLinuxマシンでは、/devの下にあるデバイス名をls で表示して確認できます。/dev/ttyUSB0というのが見えました。
PySerialを用いて記述しても、windowsのcomポートかLinuxのデバイス名かが、pythonスクリプトに残る。でもそれくらいの違いだけになるので、記述がとても簡単になる。
 そのポートに対するアクセスが、ファイルオブジェクトへのアクセスと同じように記述できるので、考えやすい。


[Raspberry Pi でシリアル通信(Macも同様)](http://blog.livedoor.jp/hack_le/archives/44765804.html)
>GPIOかUSBか
>RPiにはシリアルポートがありませんので、当然のことながらそれ以外のインタフェースからシリアル通信を行うことになります。基板上のGPIOピンか、USB端子かです。金がかからないのはGPIOピンだと思います。
>USB-シリアル
>相手の接続先がシリアルポートの場合。IO-DATAの変換アダプター USB-RSAQ6 は動作しました。

[Install PySerial on Raspberry Pi (YouTube)](https://www.youtube.com/watch?v=I7fyFb7gNEQ)


[RaspberryPi3でシリアル通信を行う](http://qiita.com/yamamotomanabu/items/33b6cf0d450051d33d41)



###**PyUSB**
[PyUSB - Easy USB access on Python](https://walac.github.io/pyusb/) 
>PyUSB comes with builtin backends for libusb 0.1, libusb 1.0 and OpenUSB.

[PyUSBを利用し，パイプ番号を指定してバルク転送を実行するモジュールのソース](http://vega.ence.kyushu-u.ac.jp/wiki/Python/PyUSB)

USB-Serialを使う際には関係ありません。



###**USBカメラ**
　USBカメラへの供給電力が不足すると、USBカメラが認識されません。電力の供給のあるUSBハブを使いましょう。
　特別なドライバなしにWindowsで認識されるUSBカメラの場合は、RaspberryPiでもそのまま認識されます。

- [LinuxでUVC(USB Video Class)タイプのUSBカメラを使う]
(http://qiita.com/nonbiri15/items/9593d61a2be81f2b31a9)

- [ラズベリーパイで監視カメラ](http://qiita.com/matyapiro31/items/6e3edcd3d7f7dfc2771f)

- [Raspberry PiにOpenCVを導入してキャプチャするまでと、トラブルシューティング]
(http://qiita.com/sy_sft_/items/ddcad27f0ea13e2cd662)

- [Raspberry Piで赤外線カメラモジュールを使ってみる](http://qiita.com/kinpira/items/940f34e11d1f856c5880)


###**マシン依存性が避けられないもの**

####GPIO
・[Raspberry Pi]GPIOでLEDの点滅(Python)http://make.bcde.jp/category/5/
・Raspberry Pi GPIO入出力のサンプル（Python, C言語, shellスクリプト）
http://netlog.jpn.org/r271-635/2013/01/raspberry_pi_gpio_test.html

・[【Raspberry Pi】モータードライバボードでDCモーターを制御する](http://denshi.blog.jp/Raspberry+Pi/DC%E3%83%A2%E3%83%BC%E3%82%BF%E3%83%BC%E5%88%B6%E5%BE%A1
)

・[Raspberry PIのGPIO上シリアルとArduinoの通信]
(http://qiita.com/ryugyoku/items/bf5fd10512c84a55d030)

・[Raspberry PiのGPIOを試してみた（LEDピカ版）](http://qiita.com/thuydg@github/items/bd5f3e2cd0fabac9195e)


###FPGAが利用可能なボードでのPythonに関するメモ
[ZYBOのARMhfのUbuntu 14.04 LTS にOpenCV 2.4.10をインストール](http://marsee101.blog19.fc2.com/blog-category-113.html)
このページではOpenCVのビルドをしており、pythonをCMake時に指定しているので、ZilinxのZynqを利用したボードでpythonが利用可能なのは確かなようだ。


####RaspberryPi 用によく使うライブラリをそろえる
[Raspberry Pi（ラズベリーパイ）にPythonのモジュールをインポートする](http://okuzawats.com/python-20140917)
にはscipy, numpy, PySerialがRaspberry Piで利用

[Numpy/Scipy/Matplotlib on Raspberry Pi]
(http://wyolum.com/numpyscipymatplotlib-on-raspberry-pi/)
にあるようにmatplotlibを使うグラフの表示が出来ます。

[Upgrading skimage version on Raspberry pi](http://stackoverflow.com/questions/29950941/upgrading-skimage-version-on-raspberry-pi)
に説明してあるとおり、ソースコードからコンパイルすることができます。


COMポートのポート番号について
>マイクロソフトのMS-DOSとWindows環境では、シリアルポートをCOMポートとして参照する。COM1、COM2、..などとしてである。COM9よりも大きい番号のポートは\\.\COM10構文を用いて参照する必要がある
https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%AB%E3%83%9D%E3%83%BC%E3%83%88



###**RS485**
RS485 というシリアル通信規格をサポートするPythonのライブラリがある。

pyserial/serial/rs485.py

https://github.com/pyserial/pyserial/blob/master/serial/rs485.py


どう使えるものなのか興味深い。



###その他のIO

ryo　さんによるRaspberry PiのIOの情報
http://rest-term.com/technote/index.php/IoT


Pythonには限らない参考記事
[RaspberryPiのシリアル接続](http://qiita.com/tamamius/items/c0bca839e1ec97125413)