twitter icon   twitter icon   rss icon

Linux.com Japan

Home Linux Jp チュートリアル Raspberry Piを使ってハードウェアを制御する

Raspberry Piを使ってハードウェアを制御する

原文は 2015 年 11 月 24 日に掲載されました。

 このシリーズの最後のチュートリアルは、Raspberry Pi 2 の 40 ピンをタッチ スクリーンに接続するものでした。今回は、コマンドラインを使って、40ピン ヘッダーからハードウェア (モーター) を直接制御することを学びましょう。Raspbery Pi を小さいロボットに搭載し、動かすことを目標にします。

 Raspberry Pi は ARM シングル ボードで、コミュニティも活発で、多数のディストリビューションが動作します。Raspberry Pi 2 は最新モデルです (今は、Raspberry Pi Zero が出ています)。クアッドコア ARM、1GB の RAM、イーサネット、USB、HDMI、マイクロ SD と 40 ピン ヘッダーを持っています。

 まず、Pi をブレッドボードに接続します。ブレッドボードに接続するため、オスオスのケーブルを使いますが、Pi では使えません。オスメスのケーブルを使えば、Raspberry Pi 2 を直接接続できます。他のやり方として、Raspberry Pi とリボン ケーブルを使って接続する "Wedge" ボードがあります。これは、直接ブレッドボードに接続できる PCB です (訳注: 秋月電子でも似たものを扱っています)。Wedge には、ピンにラベルが付けられているので、ラベルのない Pi のピン ヘッダーに接続するより簡単です。

 次に WiringPi をインストールします。WiringPi は、gpio コマンドで Raspberry Pi の 40 ピンを制御するものです。Raspbian を使っています。下記の手順で最新のソースを入手し、コンパイル、インストールします。(訳注: 最近の Raspbian ではパッケージ化されているため、下記の手順は不要です)。

pi@pi ~/src $ git clone git://git.drogon.net/wiringPi


Cloning into 'wiringPi'...


remote: Counting objects: 914, done.


remote: Compressing objects: 100% (748/748), done.


remote: Total 914 (delta 654), reused 217 (delta 142)


Receiving objects: 100% (914/914), 285.58 KiB | 123 KiB/s, done.


Resolving deltas: 100% (654/654), done.


pi@pi ~/src $ cd ./wiringPi


pi@pi ~/src/wiringPi $ ./build

WiringPi ライブラリは、Raspberry Pi の GPIO ピンを制御するために、gpio コマンドと、ユーザー プログラムからアクセスするための API とを提供しています。また、外部チップとの通信を行う機能も提供しています。例えば、GPIO ピンをマルチプレクサー チップにマップするための API (digitalWrite() 関数のように、Aruduino 開発者に親しみやすい API) を提供しています。

 WiringPi は、独自のピン番号を持っています。下記のテーブルからわかるように、ピン名称と WiringPi が使用する名称はほぼ一致しています。著者は、SparkFun の Wedge を使っていますが、それには、BCM 番号を利用した GPIO ピンがラベル付けされています。例えば、Raspberry Pi の 12 番ピンは BCM ピン 18 ですが、Wedge 上でも G18 とラベル付けされています。WiringPi では、当該ピンは 1 番です。一見複雑に思えます。しかし、Wedge を使っていれば、BCM ピン番号を読み取り、そのピンを制御するためには、WiringPi のピン番号を知るだけでよいのです。Wedge を利用すれば、電源線を誤って接地することもありません。

root@pi:~# gpio readall
+-----+-----+---------+------+---+---Pi 2---+---+------+---------+-----+-----+
| BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
+-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
|     |     |    3.3v |      |   |  1 || 2  |   |      | 5v      |     |     |
|   2 |   8 |   SDA.1 |   IN | 1 |  3 || 4  |   |      | 5V      |     |     |
|   3 |   9 |   SCL.1 |   IN | 1 |  5 || 6  |   |      | 0v      |     |     |
|   4 |   7 | GPIO. 7 |   IN | 1 |  7 || 8  | 1 | ALT0 | TxD     | 15  | 14  |
|     |     |      0v |      |   |  9 || 10 | 1 | ALT0 | RxD     | 16  | 15  |
|  17 |   0 | GPIO. 0 |   IN | 0 | 11 || 12 | 1 | ALT5 | GPIO. 1 | 1   | 18  |
|  27 |   2 | GPIO. 2 |   IN | 0 | 13 || 14 |   |      | 0v      |     |     |
|  22 |   3 | GPIO. 3 |   IN | 0 | 15 || 16 | 0 | IN   | GPIO. 4 | 4   | 23  |
|     |     |    3.3v |      |   | 17 || 18 | 0 | IN   | GPIO. 5 | 5   | 24  |
|  10 |  12 |    MOSI | ALT0 | 0 | 19 || 20 |   |      | 0v      |     |     |
|   9 |  13 |    MISO | ALT0 | 0 | 21 || 22 | 0 | IN   | GPIO. 6 | 6   | 25  |
|  11 |  14 |    SCLK | ALT0 | 0 | 23 || 24 | 1 | ALT0 | CE0     | 10  | 8   |
|     |     |      0v |      |   | 25 || 26 | 1 | ALT0 | CE1     | 11  | 7   |
|   0 |  30 |   SDA.0 |   IN | 1 | 27 || 28 | 1 | IN   | SCL.0   | 31  | 1   |
|   5 |  21 | GPIO.21 |   IN | 1 | 29 || 30 |   |      | 0v      |     |     |
|   6 |  22 | GPIO.22 |   IN | 1 | 31 || 32 | 0 | IN   | GPIO.26 | 26  | 12  |
|  13 |  23 | GPIO.23 |   IN | 0 | 33 || 34 |   |      | 0v      |     |     |
|  19 |  24 | GPIO.24 |   IN | 0 | 35 || 36 | 0 | IN   | GPIO.27 | 27  | 16  |
|  26 |  25 | GPIO.25 |   IN | 0 | 37 || 38 | 0 | IN   | GPIO.28 | 28  | 20  |
|     |     |      0v |      |   | 39 || 40 | 0 | IN   | GPIO.29 | 29  | 21  |
+-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
| BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
+-----+-----+---------+------+---+---Pi 2---+---+------+---------+-----+-----+

確認

 LED を GPIO に接続することは、GPIO が正しく動作しているかを確認する基本的な方法です。LED-抵抗の直列を Wedge 上の G18 (BCM18) に接続し、他方をグラウンドに接続します。以下のようにして、点滅させます。

root@pi:~# gpio mode 1 output 
root@pi:~# gpio write 1 1 
root@pi:~# gpio write 1 0

 Raspberry Pi のピン 18 (BCM18) はパルス幅変調 (Pulse Width Modulated:PWMを処理できます。

PWM は、電気のオンとオフの時間の割合を意味します。例えば、値 0 は、常に Low (グラウンド レベル) を意味し、値 1023 は、常に High を意味します。512 は、Low と High が半分ずつになっているのです。

 次のスクリプトは、徐々に LED を明るくしていきます。Trap コマンドを使って、スクリプトがコントロール C により中断または停止させられた時に、clearup 関数を実行します。

root@pi:~# cat ./gpio-pwm.sh
#!/bin/bash

pin=1;
minval=10
maxval=1023

trap "{ echo 'bye...'; gpio mode 1 output; gpio write 1 0; exit 0; }" EXIT SIGINT SIGTERM
gpio mode 1 pwm

for i in $(seq 1 10); do

  for v in $(seq $minval 10 $maxval); do
     gpio pwm $pin $v
     sleep 0.001
  done
  for v in $(seq $maxval -10 $minval); do
     gpio pwm $pin $v
     sleep 0.001
  done
  sleep 0.5
done

exit 0

モーターを回そう

 上の写真は、マイクロコントローラーやコンピューターからモーターを制御するための一般的な方法です。コンピューターから制御する時に、少し複雑なことがあります。モーターが回転し始める時は、コンピューターが使用する電力より多い電気を必要とします。GPIO が供給できる電力でモーターが動作できるとしても、モーターは、より多くの電気を消費しようとします。そのため、GPIO で直接モーターを制御することは危険です。制御コンピューターにダメージを与えるでしょう。モーター制御チップを利用して、電源供給を分離します。そして、そのチップをコンピューターに接続します。

 写真の左に見える赤色の PCB は、TB6612FNG (訳注: 日本でも、秋月電子で多数のチップを扱っています。) と呼ばれるモーター制御チップです。TB6612FNG を搭載した PCB は多数あり、ブレッドボードに刺すことができます。このチップは 2 つのモーターを制御し、コンピューターからチップを制御できます。各モーターは、Raspberry Pi の 3 つのピンを使います。1 つは、回転速度を制御する PWM 用、他の 2 つのピンは、回転方向を制御します。

 TB6612FNG の左に、モーターが B01,B02 に接続されています。どちらに接続しても構いません。回転方向が逆になるだけです。モーターの電源として、単三電池 4 本を利用しています。+ 側を VM (モーター電源)、- 側をグラウンドに接続します。両方が短絡しないように、赤を + 側、緑、黒をグラウンドに使用するのが一般的な方法です。Raspberry Pi のグラウンドと電池の - 側を共通のグラウンドとします。電池パックから VM ピンに電源を供給します。VM ピンは、モーターに電力を供給します。TB6612FNG への信号は、Raspberry Pi によって制御されます。

 STBY (スタンバイ) を、High にプルアップします。内部的にプルダウンされています。STBY が Low (グラウンド) になると、モーターが停止します。PWMB、BIN2 と BIN1 は、それぞれ、G18、G19 と G20 に接続します。G18 は、Raspberry Pi からの PWM 信号を利用します。

下記のスクリプトの最初のコマンドは、モーターの回転方向を設定し、PWM の設定をします。PWM は標準では 0 から 1023 の間で、大きいほど速く回ります。モーターが停止すると、ピン 24 と 28 の設定を入れ替え、回転を逆転させます。

root@pi:~# gpio mode 24 out
root@pi:~# gpio mode 28 out
root@pi:~# gpio write 24 1
root@pi:~# gpio write 28 0
root@pi:~# gpio mode 1 pwm

root@pi:~# gpio pwm 1 200
root@pi:~# gpio pwm 1 800
root@pi:~# gpio pwm 1 0
root@pi:~# gpio write 24 0
root@pi:~# gpio write 28 1
root@pi:~# gpio pwm 1 800
root@pi:~# gpio pwm 1 0

 wPi ピン 1 を制御する PWM チップは、wPi ピン 26 も制御します。モーターの PWM ピンを wPi ピン 26 に変更しても、wPi ピン 1 の PWM 信号を設定することでモーターを制御できます。つまり、同じ PWM 信号を共有しているのです。gpio ツールを使って制御することもできます。Wiring ピン 24 (BCM ピン 19) を開放することで、もう一方の PWM 信号を利用できるようになります。例えば、BCM_20 と BCM_21 を利用する音でモーターの回転を逆転させます。

 

最後に

 Raspberry Pi 2 は、2 つの PWM ( https://www.raspberrypi.org/forums/viewtopic.php?f=91&t=105044 ) を搭載しています。PWM を利用すると、音再生に影響が出るとの記載があります。ロボットの制御には、通常、差動輪 (differential drive) を利用します。これは、2 つの独立したモーターを使って車輪やボールを制御し、3 番目の接地点とします。2 つの PWM 信号と 4 つの GPIO ピンを利用することで、Raspberry Pi を小型のロボットに搭載し、動かすことができます。

 Wring Pi は、595 シフト レジスターと、MCP23008 や MCP23017 のような GPIO 拡張チップを制御できます。将来、これらの制御方法や TWI/SPI の使用方法について、チュートリアルを書きたいと思います。

Linux Foundationメンバーシップ

30人のカーネル開発者

人気コンテンツ


Linux Foundationについて

Linux Foundation はLinux の普及,保護,標準化を進めるためにオープンソース コミュニティに資源とサービスを提供しています

 

The Linux Foundation Japan

サイトマップ

問い合わせ先

サイトに関するお問い合わせはこちらまで

Linux Foundation Japan

Linux Foundation

Linux Training

提案、要望

Linux.com JAPANでは広く皆様の提案、要望、投稿を受け付ける予定です。

乞うご期待!