エンジニア『まつ』 の戦いの記録

エンジニア『まつ』 の戦いの記録を発信する。

Raspberry Pi 3 で WiFiラジコン(5) 〜 Webカメラ + 完成 + デモ

今回で完成です。(Webカメラをつけてデモ走行します)

最終的な完成形

完成形は以下のイメージです。

  • Raspberry Pi 上で Node.js の Express を利用してサーバーを作成します。
  • iPhone から WiFi を通じて、ブラウザから 上記の サーバーに接続します。
  • iPhone のブラウザには Express を利用したページが表示されており、前進・左旋回・右旋回・後進 のボタンがあります。
  • Express サーバ は iPhone から来た要求を受けて GPIO を通じてモーターの制御を行います。

またチャレンジ目標としては

  • USBカメラを Raspberry Pi に搭載して、iPhone からUSBカメラを通じた映像を確認しながら操作可能とします。

システム構成

前回のシステム構成に対して Webカメラ部分を追加しました
f:id:matu-developer:20161016160946p:plain

  • iPhone から WiFi を通じて、ブラウザに操作用のページを作成します。サーバー側は Node.js の Express を利用して画面を作成します。
  • GPIOの制御は PIGPIO という Raspberry Pi の GPIO 制御用ライブラリを利用します。
  • GPIOを制御することで、モータードライバ (TA7291P) を通して、モーターの回転を制御します。
  • Logicool C270 を接続して、MJPG-streamer を利用して リアルタイムに ブラウザ上に表示するようにします。

MJPG-streamer

MJPG-streamer を利用すると、Webカメラの映像をリアルタイムに MJPG-streamer が用意したURLで公開することが可能です。
MJPG-streamer を起動している Raspberry Pi からの直接配信になります。

http://(raspberry pi の ホスト名).local:8080/

でアクアスすると MJPG-streamer のデモ画面になるのですが、以下のURLだとカメラ映像のみのページとなります。

http://(raspberry pi の ホスト名).:8080/stream_simple.html

利用方法

今回開発したプログラムを GitHub に公開していますので、そちらの README.md をみてセットアップおよび起動を行います。

https://github.com/ma-tu/rc-control

完成

組み立て完成図

f:id:matu-developer:20161016162113j:plain

iPhoneのブラウザ上の表示

f:id:matu-developer:20161016161917p:plain

デモ走行

www.youtube.com

あとがき

Raspberry Pi でラジコンなんとか完成し、子供にお披露目したところとても喜んでいました。
ただのラジコンとしてはお金と手間がかかっていますが。
ただ Raspberry Pi まだまだ色々できそうで面白いです。

Raspberry Pi 3 で WiFiラジコン(4) 〜 ラジコン操作用プログラム作成 (JavaScript)

今回はWiFi ラジコンの操作用のプログラムの作成です。

最終的な完成形

完成形は以下のイメージです。

  • Raspberry Pi 上で Node.js の Express を利用してサーバーを作成します。
  • iPhone から WiFi を通じて、ブラウザから 上記の サーバーに接続します。
  • iPhone のブラウザには Express を利用したページが表示されており、前進・左旋回・右旋回・後進 のボタンがあります。
  • Express サーバ は iPhone から来た要求を受けて GPIO を通じてモーターの制御を行います。

またチャレンジ目標としては

  • USBカメラを Raspberry Pi に搭載して、iPhone からUSBカメラを通じた映像を確認しながら操作可能とします。

システム構成

f:id:matu-developer:20161016134634p:plain

  • iPhone から WiFi を通じて、ブラウザに操作用のページを作成します。サーバー側は Node.js の Express を利用して画面を作成します。
  • GPIOの制御は PIGPIO という Raspberry Pi の GPIO 制御用ライブラリを利用します。
  • GPIOを制御することで、モータードライバ (TA7291P) を通して、モーターの回転を制御します。

PIGPIO について

www.npmjs.com

Raspberry Pi の GPIOを制御するライブラリは Python では色々あるのですが、今回は JavaScript を利用したかったので、色々探しました。
探した結果上記の PIGPIO ライブラリが利用しやすいと思います。

npm で配布されているため、Express から Node.js を利用して、簡単にGPIOを操作できます。

また今回は利用していないのですが ソフトPWM も利用することができます。
JavaScript で ソフトPWMを利用できるライブラリがなかなか無い

new Gpio(26, {mode: Gpio.OUTPUT})).digitalWrite(1)

今回開発したプログラムについて

以下の GitHub で公開しています。

github.com

///rc-control/src/server/controllers/rc-controller.js
var Gpio = require('pigpio').Gpio;

var RIGHT_FW_PIN = 26;
var RIGHT_BK_PIN = 19;
var LEFT_FW_PIN = 13;
var LEFT_BK_PIN = 11;
var ALL_PINS = [RIGHT_FW_PIN, RIGHT_BK_PIN, LEFT_FW_PIN, LEFT_BK_PIN];

function post(req, res){
  var action = req.body.action;
  console.log('rc:action = ' + action);

  if (action == 'stop') {
    try {
      ALL_PINS.forEach((pin) => {
        (new Gpio(pin, {mode: Gpio.OUTPUT})).digitalWrite(0);
      });
    }catch(e) {
      console.log(e);
    }
  } else {
    var pins = getActionPin(action);
    try{
      (new Gpio(pins.right, {mode: Gpio.OUTPUT})).digitalWrite(1);
      (new Gpio(pins.left, {mode: Gpio.OUTPUT})).digitalWrite(1);
    }catch (e) {
      console.log(e);
    }
  }

  res.send(req.body);
}

function getActionPin(action) {
  switch(action) {
    case "forward":
      return {right: RIGHT_FW_PIN, left: LEFT_FW_PIN};
    case "back":
      return {right: RIGHT_BK_PIN, left: LEFT_BK_PIN};
    case "right":
      return {right: RIGHT_BK_PIN, left: LEFT_FW_PIN};
    case "left":
      return {right: RIGHT_FW_PIN, left: LEFT_BK_PIN};
  }
}

module.exports = {post};

開発時のポイント

モーターの強さの制御

モーターの回転速度を PWM を利用して制御することができます。
PWMはプログラム的に1秒間の数百回とかの頻度で、ON、OFFを繰り返し、そのONの割合を減らすことでモーターの回転を弱めることができます。
(今回は必要なかったため利用していないです)

旋回

「ひだり」への旋回時には「左側モーターを後転」「右側モーターを前転」して制御を行います。「みぎ」への旋回時はその逆です。

Raspberry Pi 3 で WiFiラジコン(3) 〜 電子回路(基盤)

今回はWiFi ラジコンの電子回路(基盤)の作成です

最終的な完成形

完成形は以下のイメージです。

  • Raspberry Pi 上で Node.js の Express を利用してサーバーを作成します。
  • iPhone から WiFi を通じて、ブラウザから 上記の サーバーに接続します。
  • iPhone のブラウザには Express を利用したページが表示されており、前進・左旋回・右旋回・後進 のボタンがあります。
  • Express サーバ は iPhone から来た要求を受けて GPIO を通じてモーターの制御を行います。

またチャレンジ目標としては

  • USBカメラを Raspberry Pi に搭載して、iPhone からUSBカメラを通じた映像を確認しながら操作可能とします。

電子回路(基盤)

f:id:matu-developer:20161015212218p:plain
モータードライバ ( TA7291P ) に対して電池ボックスを接続し、Raspberry Pi からモータードライバを制御することで、モーターの回転を制御します。

モータードライバ ( TA7291P ) は上図の黒で数字が記入されている部分になります。

回線の説明

右モーター用
TA7291P 接続先
GND
左モーター(+)
接続なし
10kΩの抵抗を通して電池ボックス(+)
GPIO 26
GPIO 19
5V
電池ボックス(+)
接続なし
左モーター(ー)
左モーター用
TA7291P 接続先
GND
右モーター(+)
接続なし
10kΩの抵抗を通して電池ボックス(+)
GPIO 13
GPIO 11
5V
電池ボックス(+)
接続なし
右モーター(ー)
(確認)Raspberry Pi 3 と TA7291P対応表
Raspberry Pi 3 接続先
GND TA7291P両方
GPIO26 右TA7291P⑤
GPIO19 右TA7291P⑥
GPIO13 左TA7291P⑤
GPIO11 左TA7291P⑥
5V TA7291P両方

配線完了写真

写真だとむしろ分かりにくいですが以下のように接続します。
f:id:matu-developer:20161015213041j:plain
f:id:matu-developer:20161015213107j:plain

車体への取り付け

Raspberry Pi と 基盤を 車体に取り付けます。100均のバンドなどを利用して固定します。

f:id:matu-developer:20161015214136j:plain

次回はやっとラジコンを制御するプログラム部分の開発を行います。

Raspberry Pi 3 で WiFiラジコン 〜 必要なもの

あれ?一度この記事書いた気がするけど、無くなった??
なのでもう一度書き直しました

順番逆ですが、以下の記事の前編です。
matu-developer.hatenablog.com

Raspberry Pi 3 でせっかくなので WiFIラジコンを作りたいたいと思います。
完成形は以下のイメージです。

  • Raspberry Pi 上で Node.js の Express を利用してサーバーを作成します。
  • iPhone から WiFi を通じて、ブラウザから 上記の サーバーに接続します。
  • iPhone のブラウザには Express を利用したページが表示されており、前進・左旋回・右旋回・後進 のボタンがあります。
  • Express サーバ は iPhone から来た要求を受けて GPIO を通じてモーターの制御を行います。

またチャレンジ目標としては

  • USBカメラを Raspberry Pi に搭載して、iPhone からUSBカメラを通じた映像を確認しながら操作可能とします。

必要なもの

Raspberry Pi の他に WiFiラジコン用に以下を追加購入しました

車体部分

ダブルギアボックス

タミヤの楽しい工作シリーズの以下を購入しました。ダブルギアで左右の回転を切り替えることができるため、
左ギアを前進、右ギアを後進等することにより回転することができます。

タミヤ 楽しい工作シリーズ No.168 ダブルギヤボックス 左右独立4速タイプ (70168)

タミヤ 楽しい工作シリーズ No.168 ダブルギヤボックス 左右独立4速タイプ (70168)

ユニバーサルプレート

車体のベース部分に利用します。2セット購入します。

タミヤ 楽しい工作シリーズ No.157 ユニバーサルプレート 2枚セット (70157)

タミヤ 楽しい工作シリーズ No.157 ユニバーサルプレート 2枚セット (70157)

タイヤ

タミヤ 楽しい工作シリーズ No.100 トラック&ホイールセット (70100)

タミヤ 楽しい工作シリーズ No.100 トラック&ホイールセット (70100)

スペーサー・ネジ

以下を8セット購入します。車体の間の連結に利用します。

akizukidenshi.com

また固定用のネジとして以下を購入します。

akizukidenshi.com

固定バンド

こちらは 100円均一で適当なものを探して購入します。
Raspberry Pi と モバイルバッテリー と USBカメラの固定に利用します。

f:id:matu-developer:20161015160042j:plain

両面テープ

電源・ケーブル

電池ボックス 単3 x 4本用 スイッチ付き

akizukidenshi.com

バイルバッテリー

こちらは家にあったものを利用しました。
ただし Raspberry Pi 3 が 5V 2.5A 必要なので、高速充電対応のモバイルバッテリー 2.4A 対応のものが必要です。

USBケーブル

通常のUSBケーブルで問題ないですが、短めのケーブルがあると取り回しが便利です。

回路部分

モータードライバ

2個入りなので、このモータードライバを利用して、左右のギアボックスを制御します。
akizukidenshi.com

抵抗 10K

akizukidenshi.com

ブレッドボード用のジャンパーワイヤ

ジャンパーワイヤで回路を作っても大丈夫ですが、どうしても回線がごちゃごちゃしてしまうため、以下のようなものを利用するとスッキリします。

akizukidenshi.com

Raspberry Pi 3 で WiFiラジコン(2) 〜 車体づくり

まずは車体づくりについてです。

前回の記事の必要なものを購入して組み立てを行っていきます。

matu-developer.hatenablog.com

完成形は以下のイメージです。

  • Raspberry Pi 上で Node.js の Express を利用してサーバーを作成します。
  • iPhone から WiFi を通じて、ブラウザから 上記の サーバーに接続します。
  • iPhone のブラウザには Express を利用したページが表示されており、前進・左旋回・右旋回・後進 のボタンがあります。
  • Express サーバ は iPhone から来た要求を受けて GPIO を通じてモーターの制御を行います。

またチャレンジ目標としては

  • USBカメラを Raspberry Pi に搭載して、iPhone からUSBカメラを通じた映像を確認しながら操作可能とします。

車体制作

ダブルギアボックス

f:id:matu-developer:20160917080704j:plain

前回購入したこちらを組み立てていきます。高速だけど力が弱いギアから、低速だけど力が強いギアと好みに合わせて組み立てることができるようです。私は 38.2:1 (遅めだけど力はそれなり)を選んでみました。

注意点として、ダブルギアボックスは、モーターは付属しているのですが、モーターの電極につなげるケーブルは付属していません。
なので、「耐熱電子ワイヤー 外径0.65mm」と「収縮チューブ 外径2mm」を追加購入してきました。

ユニバーサルプレートの加工

f:id:matu-developer:20160917081752j:plain

ベース部分にダブルギアと電池ボックスを配置したいと思っています。ユニバーサルプレート1枚では長さが足りなかったので
2枚のユニーバサルプレートを重ねて土台を作りました。電池ボックスは、両面テープで固定します。
ユニバーサルプレートはニッパーで切ることができます。(少し硬いですが)

f:id:matu-developer:20160917082052j:plain

車体のベース部分(一番下完成)

スペーサーを利用して高さ調整して組み立てを行うと車体のベース部分の完成です。

f:id:matu-developer:20160917082236j:plain

ダブルギアボックスのモーターのケーブル制作

ブレッドボードで電子回路の実験をするために乾電池ホルダーのリード線をジャンパワイヤのように端子化するmatsumotoyoshio.wordpress.com

こちらを参考にして、ブレッドボードに挿して利用しやすいようにします。

「すずメッキ線」の代わりに 少し長めの「ブレッドボードワイヤー」をニッパーで適切な長さに切ってビニール部分を外せば代用できます。
電池ボックスのケーブルも同様に「ブレッドボード」向けに加工しました。

Raspberry Pi 3 で始める電子工作 (4) 〜 GPIOの制御でLチカ

この記事では LピカとLチカを行います。その中で Raspberry Pi の GPIO の制御方法を検証します。

Lピカ

LEDがピカーっと光ることを Lピカ と呼ぶようです。

一通り電子工作に必要な物を集めてきたので、Lチカを始めたいと思います。
回路図は、他のページを参考にしたほうがよ早いと思うので、ここでは省略します。
(他のサイトによるある、綺麗な回路図はどうやって作ればよいのだろう・・・)

matu-developer.hatenablog.com

こちらで購入した LED と 220Ωの抵抗 をブレッドボードに差し込んで、ジャンパーワイヤー(メス - オス)を繋げるだけです。ただし、+(プラス)とー(マイナス:GND)の向きに注意が必要です。

抵抗には極性(+、ー)はないので向きは関係ないですが、LED には向きがあります。
LED の線が長い方が+、短い方がーです。

GPIOの1番のピンから出た先を、抵抗(220Ω)に繋げて、そこからLEDの(+)側に繋げて、LED(ー)側をGPIOのGNDのピン(20番など)に繋げると完成です。

GPIOの1番のピンは、常に 3.3V の電圧が出力されているため繋げた瞬間から光り出します。
f:id:matu-developer:20160915091048j:plain

ジャンパーワイヤは+側を赤い色のケーブル、ー側(GND)を黒い色のケーブルを利用すると間違わなくてよいです。

Lチカ

次にこの LED をチカチカさせたいのですが、一定のリズムで、GPIOのピンに 3.3V の電圧で、ON / OFF を繰り返すことで、チカチカとなるのですが、ここからはプログラムを利用する必要があるようです。先ほどの GPIOの 1番のピンを GPIOの 24番のピンに差し替えます。そしてこの GPIO の 24番ピンに対してプログラムで ON / OFF の制御を行います。

GPIO のピンを制御する方法

GPIO のピンを制御する方法は 色々あるのですが、Raspberry Pi の初期状態で利用可能なのは以下の方法がありました。

Python の RPi.GPIO ライブラリを利用する方法

多くの記事などで Python を利用した GPIO の制御方法が乗っていますが、私は最終目標の WiFi Raspberry ラジコンでは Node.js を利用する予定としていたので、検証は省略しました。他の記事に詳しくあると思います。

GPIOコマンド

Raspberry Pi は gpio というコマンドが利用できるようになっています。
以下の shell プログラムを作成して、実行してみました。1秒おきにチカチカできました。
コマンドであれば Node.js から "child_process" の execSync を利用して実装できそうです。

#!/bin/sh

gpio -g mode 24 out

gpio -g write 24 1
sleep 1s
gpio -g write 24 0
sleep 1s
gpio -g write 24 1
sleep 1s
gpio -g write 24 0
sleep 1s
gpio -g write 24 1
sleep 1s
gpio -g write 24 0
sleep 1s

以下で GPIO24 ポートを出力用に利用する宣言をします。

gpio -g mode 24 out 

以下で GPIO24 ポートに 3.3V を 出力します。0 でオフとなります

gpio -g write 24 1

-g が ポート番号を gpioxx の xx の数字でポートを指定するためのオプションです。

ファイルを利用した制御

GPIO のデバイスの仮想ファイルを変更することで、GPIO の各ポートの ON / OFF の制御ができます。
以下の shell プログラムを作成して、実行してみました。こちらも1秒おきにチカチカできました。
Node.js でファイルを制御できるので、こちらでも Node.js から制御可能です。

#!/bin/sh

echo 24 > /sys/class/gpio/export
sleep 1s
echo out > /sys/class/gpio/gpio24/direction
sleep 1s

echo 1 > /sys/class/gpio/gpio24/value
sleep 1s
echo 0 > /sys/class/gpio/gpio24/value
sleep 1s
echo 1 > /sys/class/gpio/gpio24/value
sleep 1s
echo 0 > /sys/class/gpio/gpio24/value
sleep 1s
echo 1 > /sys/class/gpio/gpio24/value
sleep 1s
echo 0 > /sys/class/gpio/gpio24/value
sleep 1s

echo 24 > /sys/class/gpio/unexport

/sys/class/gpio/export に 24 を書き込むことで、GPIO24 ポートの利用開始を宣言します。
/sys/class/gpio/gpio24/direction に out を書き込むことで出力用に利用することになります。
/sys/class/gpio/gpio24/value のファイルに 1 or 0 を書き込むことで制御できます。
/sys/class/gpio/unexport に 24 を書き込むことで後片付けを行ってくれます。

export に書き込んだ後や direction に書き込んだ後で少し sleep を入れないと、制御が間に合ってなくて Permission denied などのエラーが出ます。

こちら見てね!
matu-developer.hatenablog.com

Raspberry Pi 3 で始める電子工作 (3) 〜 電子工作始めるために買うもの

電子工作

Raspberry Pi は小型のパソコンという特徴の他に、GPIO (General Purpose Input Output) というポートがついていることが挙げられます。
このポートを利用して、デジタル信号を出力したり・入力したりできるため、様々な部品(LEDとか、センサー)などを接続して制御することができます。

最近は Arduino のほうが流行っているかもしれませんが、こちらも同じような特徴をもっていて、同じようなことができます。

Arduino vs Raspberry Pi

では ArduinoRaspberry Pi の違いはなんでしょうか?
一番の違いは Raspberry Pi は単体で独立したコンピュータであることです。Raspberry Pi は Raspbian と呼ばれる DebianRaspberry Pi に最適化した Linux OSを搭載することができ、CPU / メモリ / USB / 有線LAN / 無線LAN(Raspberry Pi3)を利用して マルチタスクな処理を行うことができます。価格の安い・少し低スペックなパソコンといえます。

一方 Arduino は OSが介在しないためシンプルな電子工作用のパーツと捉えるものになります。PC と Arduino を接続して開発環境が完成し、Arduino言語を利用して電子工作を始めることができます。

今回は何ができるのかまだわかっていなかったのもあり、とりあえずいろいろできそうな方を選んでみました。

電子工作学習のススメ方

今回の Raspberry Pi 3 の電子工作の最終目標を iPhone を利用して WiFi 経由で Raspberry Pi を操作して動作するラジコンとします。

その前のステップとして以下を行うこととしました

  • LEDピカ ・・・ LEDが付くだけ
  • LEDチカ ・・・ 上記を少しレベルアップして LED をチカチカさせる。電子工作界の Hello world といったところか。
  • 温度センサー計測

電子工作を始めるために買ったもの

購入先

上記に必要なものを以下購入しました。
購入元は 秋葉原秋月電子通商さん と 千石電商さんです。秋月電子通商さんのインターネットでも購入可能です。
(お願いした翌日には発送されるようなのでお手軽に利用できそうです)

購入したもの(必要なもの)

ブレッドボード

f:id:matu-developer:20160914115217j:plain
これにジャンパーピンやLEDを指すことで、はんだごてをせずに電子工作ができるものになります。いろいろなサイズがあります。
ブレッドボード BB−801: パーツ一般 秋月電子通商 電子部品 ネット通販

ブレッドボード・ジャンパーコード

ブレッドボードにこのケーブルを刺して利用します。GPIOはピンが出ていますので、GPIO側にメス側をさして、ブレッドボードにオス側を刺して利用します。
ブレッドボードのピン同士で指すこともあるので オス - オス も必要です。
f:id:matu-developer:20160914115630j:plain
ブレッドボード・ジャンパーコード(オス−メス) 15cm(赤) (10本入): パーツ一般 秋月電子通商 電子部品 ネット通販
ブレッドボード・ジャンパーコード(オス−オス)セット: パーツ一般 秋月電子通商 電子部品 ネット通販

抵抗

LED をつけるとき、電圧を調整するために抵抗が必要なようです。100本単位でそんなに・・・と思いますが、100本で 100円です。
とりあえず 220Ω、1kオーム、10kオームを買いましょう。カーボンと金属がありますが、カーボンで必要十分です。
カーボン抵抗(炭素皮膜抵抗) 1/4W 10kΩ (100本入): パーツ一般 秋月電子通商 電子部品 ネット通販

LED

LEDは種類が多いのですが、順方向電圧が 3V 以下のものである必要があるようです。とりあえず Raspberry Pi の Lチカなどでよく利用されているものを調べて買いました。
高輝度3mm赤色LED OSR7CA3131A(10個入): LED(発光ダイオード) 秋月電子通商 電子部品 ネット通販

温度センサー

こちらも Raspberry Pi でよく利用されているものを調べて買いました。
デジタル温度センサ(1wire)DS18B20+: センサ一般 秋月電子通商 電子部品 ネット通販

購入したもの(必須ではないけど買ってしまったもの)

デジタルマルチメーター

抵抗とか電圧とか測定できるもの。電子工作レベルなので大型なものではなくてOK。
コンパクトに収納できるものを優先した。ただし電流が測定できないデジタルマルチメーターも多いので、電流図れるものを買ったほうがよいので注意!


こちら見てね!
matu-developer.hatenablog.com