Help us understand the problem. What is going on with this article?

RaspberryPi3にRaspbianをインストールし、virtualenvで環境を作り、UART通信をするまでの手順を丁寧に説明してみました。

More than 1 year has passed since last update.

内容はタイトルの通りです。こんにちは、@island_peakです。本記事のゴールはコチラ。

  • Pythonとvirtualenvについて理解できる。
  • PythonスクリプトをPython2/3を決め打ちで実行できる。
  • RaspberryPiからUARTを使う土台が作れる。

本記事を書いたモチベーションは、Pythonの社内資料を作る際、折角なのでQiitaで書いてみよう、というところです。はじめてPythonを触る方、はじめてRaspberryPiを触る方にもわかりやすいよう、心掛けて書いてみました。

IMG_2061.jpg

必要な機材はこちら

  • Raspberry Pi 3 Model B+
    • microSDカード 16GB (今回はコレ)
    • microUSBケーブル (今回はコレ)
    • HDMIケーブル (今回はコレ)
    • USBキーボード&マウス (今回はコレ)
    • LANケーブル または 無線LAN環境
  • UARTで制御するデバイス(本質でないので別記事で説明予定)

007.png

RaspberryPiにOSをインストールする

Raspberry Pi用SDカードの準備

僕は作業用にWindowsPCを用意しました。まず、インストールに使うSDカードを SDカードフォーマッタ で初期化します。

000-1.png

次にRaspberry Piの公式サイトからNOOBSをダウンロードします。NOOBSはネットワーク経由でOSを自動的にダウンロードしてインストールできる、ソフトウェアです。

000-0.png

ZIP圧縮されていますので、ダウンロード後解凍して、前の手順で初期化したSDカードに全て格納します(コピー&ペーストでOK)。最後にmicroSDカードをWindowsPCから取り出して、Raspberry Piで挿入してください。

001.png

Raspberry Pi用OS「Raspbian」の初期化

Raspberry PiにmicroSDカードを挿入し、microUSBで電力を供給すると、起動画面が表示されます。そこそこ電力を喰いますので少し大きめのACアダプタを用意すると良いでしょう(今回はコレを使いました)。起動するとインストール候補が出てきます。

002.png

画面下で言語とキーボードを選べます。僕は「日本語」「jp」を選択しました。OSとしては、最も一般的な「Raspbian」を選択し「インストール」をクリック。OSのインストールが開始されます。進捗100%になった後も結構時間がかかります...気長にお待ちください。

003.png

最後に再起動を促されますので、再起動し、起動画面が表示されたらOKです。これでOSの準備ができました。中央に表示されている設定画面にて、パスワードの設定などを行えば、まずはひと段落です。

004.png

Raspberry Piの追加設定

次に raspi-config というツールを使って設定します。右上のコマンドプロンプトっぽいアイコンをクリックするとターミナルが開きます。以下のコマンドを入力して、Raspberry Piの設定を行ってください(sudoは管理者特権を得るためのコマンドです)。

$ sudo raspi-config

サポート言語の追加(Localisation Options)

サポートする言語に「en_US.UTF-8 UTF8」を追加します。何かと要求されるため。デフォルトの言語はjpのままで良いでしょう。
006-3.png

機能の追加設定(Interfacing Options)

SSHで遠隔操作ができると、何かと便利です。SSHを有効にしておきましょう。
006-1.png
006-2.png

ちなみにRaspberry Piに割り当てられているIPアドレスは ip addr コマンドで見ることができます( ifconfig より新しいコマンドです)。

005.png

開発に必要なパッケージをインストールする

ソフトウェア開発(ここでは特にPythonを指します)に必要となるパッケージをインストールしましょう。ほとんどのパッケージは定型化していますので「そんなパッケージがあるのか」程度に、まず読んでいただければ良いと思います(minicomとcutecomはUART操作用アプリケーションです)。

$ sudo apt install -y git 
$ sudo apt install -y openssl libssl-dev libbz2-dev libreadline-dev libsqlite3-dev build-essential curl file
$ sudo apt install -y cutecom minicom

USB-UARTへのアクセス権限を"pi"に与える

USB-UARTデバイス(今回はNUCLEO-L476RG)を接続すると、 /dev/ACM* というファイルが生成されます。このファイルを操作することにより、UART通信ができます。が、初期状態ではユーザはアクセスできないようになっています。

$ minicom /dev/ttyACM0
minicom: /dev/tty8 をオープンできません : 許可がありません
$ ls -al /dev/ttyACM0
crw-rw---- 1 root dialout 166, 0  5月  4 23:03 /dev/ttyACM0

そのため、デバイスが所属しているグループ「dialout」にユーザ「pi」を追加しましょう。 gpasswd -a コマンドで追加できます。

$ sudo gpasswd -a pi dialout
ユーザ pi をグループ dialout に追加

ようこそpiの世界へ

RaspbianにはデフォルトでPython3とPython2がインストールされています。

$ python3 --version
Python 3.5.3
$ python2 --version
Python 2.7.13

Python3 vs Python2

これからPythonスクリプトをゼロから書かれる方には、Python3をオススメします。一方で、世の中にはまだまだPython2で開発されてきた魅力的なソフトウェアが数多く残っていますのでPython2も使えた方が便利です。そのため、本手順ではPython3とPython2の実行環境を公平にセットアップします。

まずは基本的なパッケージを準備しよう。

pipを最新バージョンに更新する

pip は、Python用のパッケージインストーラです。 aptyum のPython版をイメージしてみてください。まず pip2pip3 を最新バージョンに更新します。

$ sudo pip2 install --upgrade pip
$ sudo pip3 install --upgrade pip

pySerialをインストールする

次に、PythonからUART通信するためのライブラリ「pySerial」をpipからインストールします。こちらも pip2pip3 それぞれにインストールします(pip2へインストールする際に「2020年でサポート終わるよ」というメッセージが出ます、早めに乗り換えましょう)。

$ sudo pip2 install pyserial
DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020...
$ sudo pip3 install pyserial

virtualenvをインストールする

続いて、virtualenv をインストールします。先に述べたようにPython界隈では、Python2とPython3のスクリプトが乱立しており、pySerialなど豊富な拡張ライブラリの中から何を選択するのか、といった違いから『万人に共通した実行環境』を作ることが困難です。そのため virtualenv(仮想環境) という箱を作り「僕の箱はPython2でpySerialが入っている」というように、自分だけの環境を作る方が使いやすいのです。

$ sudo pip2 install virtualenv
$ sudo pip3 install virtualenv

virtualenvwrapperのインストール

virtualenvwrappervirtualenv をより使いやすくするためのツールセットです。各仮想環境の設定ファイルをまとめて管理してくれるため、ファイル構成もスッキリさせることができます。

まず pip2pip3 コマンドでインストールし、./~bash_profile に設定を追記します(ファイルがない場合は新規で作成してOKです)。

$ sudo pip2 install virtualenvwrapper
$ sudo pip3 install virtualenvwrapper
$ vi ~/.bash_profile
if [ -f /usr/local/bin/virtualenvwrapper.sh ]; then
    export WORKON_HOME=$HOME/.virtualenvs
    source /usr/local/bin/virtualenvwrapper.sh
fi

最後に ~/.bash_profile を実行します。virtualenvwrapper.shの初期起動時処理として、自身のホームディレクトリに設定ファイルが生成されます。以降は起動時には .bash_profile が自動実行されますのでコマンドを実行する必要はありません(source コマンドは指定のファイル内に含まれるシェルスクリプトを実行するコマンドです)。

$ source ~/.bash_profile
virtualenvwrapper.user_scripts creating /home/pi/.virtualenvs/premkproject
virtualenvwrapper.user_scripts creating /home/pi/.virtualenvs/postmkproject
virtualenvwrapper.user_scripts creating /home/pi/.virtualenvs/initialize
virtualenvwrapper.user_scripts creating /home/pi/.virtualenvs/premkvirtualenv
virtualenvwrapper.user_scripts creating /home/pi/.virtualenvs/postmkvirtualenv
virtualenvwrapper.user_scripts creating /home/pi/.virtualenvs/prermvirtualenv
virtualenvwrapper.user_scripts creating /home/pi/.virtualenvs/postrmvirtualenv
virtualenvwrapper.user_scripts creating /home/pi/.virtualenvs/predeactivate
virtualenvwrapper.user_scripts creating /home/pi/.virtualenvs/postdeactivate
virtualenvwrapper.user_scripts creating /home/pi/.virtualenvs/preactivate
virtualenvwrapper.user_scripts creating /home/pi/.virtualenvs/postactivate
virtualenvwrapper.user_scripts creating /home/pi/.virtualenvs/get_env_details

$ virtualenv --version
16.5.0

いよいよPythonスクリプトを実行する

Pythonスクリプトを入手する

Pythonスクリプトは僕のGistにあるモノを使いました。

$ wget https://gist.github.com/islandpeak/ac0322cf3d6e7b9cec3a76eb21a467aa/archive/3947bbba97ec47a1492475cac0fdf7795457e27e.zip 
$ unzip 3947bbba97ec47a1492475cac0fdf7795457e27e.zip
$ rm 3947bbba97ec47a1492475cac0fdf7795457e27e.zip
$ mv ac0322cf3d6e7b9cec3a76eb21a467aa-3947bbba97ec47a1492475cac0fdf7795457e27e/ serial_test
$ ls ./serial_test
find_ttyUSB0_in_dmesg_with_Vendor.py
use_stm32UART_wiz_my_cmd_format.py

専用の仮想環境(virtualenv)を作る

僕のスクリプトはPython2で書かれているので、Python2の仮想環境を作ります。ダウンロードし展開したPythonスクリプトが含まれている「serial_test」ディレクトリに対して、下記のコマンドを実行します。ここでは『/usr/bin/python2』を使うこと『ライブラリの無い空の箱(--no-site-package)』を作ることを指定しています。

$ mkvirtualenv --python=/usr/bin/python2 --no-site-package serial_test/
...

仮想環境の見え方

仮想環境が作られると、自動的に仮想環境にログインした状態になります。コマンドプロンプトの文字列の先頭に『(仮想環境名)』となっているのが特徴です。

(serial_test) $
(serial_test) $ pwd
/home/pi
(serial_test) $ python --version
Python 2.7.13

必要なライブラリを仮想環境にインストールする

pySerialは、Raspbianにはインストールされていますが、この仮想環境は「空の箱」として生成したのでpySerialが含まれていない状態になっています。

(serial_test) $ python
Python 2.7.13 (default, Sep 26 2018, 18:42:22)
[GCC 6.3.0 20170516] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import serial
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named 'serial'
>>> quit()

pySerialを仮想環境上にインストールする(ここでもpipコマンドを使います)と、無事 import (呼び出すことが) できます。

(serial_test) $ pip install pyserial
(serial_test) $ python
>>> import serial
>>> quit()

ということで、後は実行

python コマンドでスクリプトを実行すると、無事動きました。

(serial_test) $ python ./find_ttyUSB0_in_dmesg_with_Vendor.py
cdc_acm 1-1.1.2:1.2: ttyACM0: USB ACM device
True
-1
usb 1-1.1.2: Product: STM32 STLink
True
ttyACM0
(serial_test) $ python use_stm32UART_wiz_my_cmd_format.py
find_first_line . OK
SEND_CMD=>:0 TYR 0119
RECV_CMD=>:0 ACK 0000
SEND_CMD=>:0 TMO 0005
RECV_CMD=>:0 ACK 0000
SEND_CMD=>:0 TDA 0005
RECV_CMD=>:0 ACK 0000
SEND_CMD=>:0 THR 0007
RECV_CMD=>:0 ACK 0000
SEND_CMD=>:0 TMI 0021
RECV_CMD=>:0 ACK 0000
SEND_CMD=>:0 TSE 0043
RECV_CMD=>:0 ACK 0000
SEND_CMD=>:0 GTS 0000
RECV_CMD=>:0 RTS 0019 2019-05-05_07-21-43

仮想環境から抜ける/入り直す

仮想環境から抜けるためには deactivate コマンドを使います。

(serial_test) $ deactivate
$

再び仮想環境を開きたい場合は workon を引数なしで実行し、生成済みの仮想環境一覧を見てから workon 仮想環境名 で、仮想環境を開くことができます。

$ workon
serial_test
$ workon serial_test
(serial_test) $

おわり

お疲れ様でした。環境構築はハマりやすいので出来るだけ情報を残そうと思っています。特に、誰かが途中まで触っている環境を引き続くことは非常に大変です。OSインストールから手順を追ってみることにより、僕自身の理解も深まるといいな、と思っています。

それでは、また。

island_peak
開発の中で忘れそうなことや、社内講習会のネタを記事にしていきます。お気軽にフォローしてくださいね。ぜひぜひ。
https://www.aps-web.jp/
aps-web
半導体専門技術コンテンツ・メディアとして日々新しい技術ノウハウを発信しています
https://www.aps-web.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした