Interfaceで記事を書きました

書こうと思っていたのですが、 Interface 2012/12月号でRaspberry Piでロボットを作る記事を書かせて頂きました。 ブログが切っ掛けとなり、記事を書くことになったとは驚きです。 これからも継続的にアウトプットをしていきます。 次は mbed にROSでも実装しようかな。

Raspberry Piでロボットを作る

概要:


最終更新日から1ヶ月弱。 更新する気が起こらない時期ってありますよね。

さて、今回はRaspberry Piでモーターを制御する方法についてです。

・無線LANを導入する記事

・GPIO制御の記事

・ブラウザからLEDを制御する記事

・Mjpg-streamerを使って動画配信をする記事

を組み合わせてブラウザから動かせるロボットを作ります。

 

使用機器:


ハードウェア:

・Raspberry Pi

・セルフパワーのUSBハブ

・無線LANアダプタ

・Webカメラ

・モータドライバ(後ほど説明)

・モーター

・ 電源回路(エネループ6本から降圧)

 

ソフトウェア:

・mjpg-streamer → Mjpg-streamerを使って動画配信をする記事

・python-dev → GPIO制御の記事

・pythonのgpioライブラリ → GPIO制御の記事 だいたい今までの記事の構成と同じですね。

 

ハード作成:


今回使用するモータドライバは、定番のTA7291です。 GPIOにバッファIC(TD6004APG)をつなげ、 このモータドライバにつなげることでモータの制御を行います。 回路図は以下のようになっています。 かなり適当に引いているので、正直微妙です。

 robot_curcuit

 

今回、RaspberryPiへの電源供給はGPIOのピンから行ないます。 理由は、Raspberry PiのマイクロUSBポートにはポリスイッチが入っており、 電流を流しすぎると安全のために電源を遮断するためです。 そのため、Raspberry Piとモータドライバ回路への電源供給はGPIOピンから行うことにしています。 これをユニバーサル基板上に作成したものがこちらになります。

 

circuit_pict

これをGPIOソケットにつなげて使用します。

 

ソフトウェア作成:


ソフトウェアについては、 ブラウザからLEDを制御する記事を応用して作成します。 作成した回路にあった出力をGPIOから出力するだけで、モーターを動かすことができます。 前回のソースに少し修正を加えただけなので、 こちらからダウンロードして参考にしてください。 また、画像表示用のindex.htmlで使用されている画像のIPとポート番号は、 自身で立てたmjpg-streamerのものに変更してください。

:::Download:::

 

実行:


ソフトウェアの実行では、以下のソフトを同時に起動します。

・ mjpg-streamer (動画配信用)

・ モータ制御用ソフト ダウンロードしたソフト内にあるものを同時に起動します。

sudo sh stream.sh &
sudo server_motor.py

この後、指定したRaspberryPiのIPアドレスにアクセスすることで、 ロボットの操作画面を開くことができます。

 

control_screen

 

実行結果:


この動画のようにロボットを動かすことができました。

 

所感:


成果物はできてたのに記事を書くのが遅くなってしまいました。 定期的に記事を書くのは難しいですね。 次はRaspberry Piとネットを繋げた回路でも作ってみましょうか。 そろそろソース管理が面倒になってきたのでGitでも使おうかな。

Raspberry Pi につないだLEDをブラウザから制御する

概要:


Raspberry Pi にWebカメラを接続し、 さて,先月中にロボットの作り方を公開すると言いながら, まだ公開できていない状態になりました. 今回はロボットのの記事の公開の序盤として, GPIOにつないだLEDをブラウザから制御する方法を紹介します.

 

使用機器:


今回は以下の機器を使用しました。

 

ハードウェア:

・LEDドライブ用基板

・Raspberry Pi がつながれたネットワークにつながっているPC

* LEDを点滅させる基板については,以下のページを参考にしてください.

Raspberry Pi の GPIO でLEDを点滅させてみる

 

ソフトウェア:

・python-dev

・pythonのGPIOライブラリ

* PythonのGPIOライブラリの導入については,以下の記事を参考にしてください.

Raspberry Pi の GPIO でLEDを点滅させてみる

 

ソフトウェア作成:


今回,ブラウザからアクセスをするために, Pythonに標準ライブラリであるCGI実行機能機能付きのHTTPサーバークラスを使用します. ブラウザからボタンが押されることで, Raspberry Pi上に立てたGCIサーバーにPOSTメッセージが飛ぶような仕組みを使用しています. 今回のプログラムは,LEDの点滅を制御とサーバーの役割をこなすもの(サーバープログラム)と, サーバーに対してメッセージを飛ばすためのもの(クライアントプログラム)に分けられます. それぞれのプログラムは以下のとおりになります.

 

サーバー側(server_led.py):

# -*- coding:utf-8 -*-
import cgi
import RPi.GPIO as GPIO
from BaseHTTPServer import HTTPServer
from SimpleHTTPServer import SimpleHTTPRequestHandler

class MyHandler(SimpleHTTPRequestHandler):
    def do_POST(self):
        if self.path == '/serial':
            # 飛ばされてきたリクエストを受け取る
            form = cgi.FieldStorage(fp=self.rfile, headers=self.headers,
                                    environ={'REQUEST_METHOD':'POST'})
            code = form['code'].value

            # 受け取ったクエリに応じて点灯させるLEDを設定する
            if code == "led1":
                GPIO.output( 17, True )
            elif code == "led2":
                GPIO.output( 21, True )
            elif code == "led3":
                GPIO.output( 22, True )
            elif code == "reset":
                GPIO.output( 17, False )
                GPIO.output( 21, False )
                GPIO.output( 22, False )

            self.send_response(100)
            self.send_header('Content-type', 'text/html')
            return
        return self.do_GET()

# GPIOの初期設定
GPIO.setmode( GPIO.BCM )
GPIO.setup(17, GPIO.OUT)
GPIO.setup(21, GPIO.OUT)
GPIO.setup(22, GPIO.OUT)
GPIO.output( 17, False )
GPIO.output( 21, False )
GPIO.output( 22, False )

# サーバーの起動
server = HTTPServer(('', 8081), MyHandler).serve_forever()

クライアント側 (index.html):

HTMLのソースを貼ると正常に表示されないため, 以下の場所にソースコードをおいておきます.

LEDを点灯させるサンプルプログラム

 

 

起動と動作テスト:


これらのプログラムを同じディレクトリに保存し,次のように起動します.

sudo python server_led.py

この後,Raspberry Piの「RaspberyPiのIP:8081」にアクセスすると, 次のような画面を見ることができます.

 

ブラウザ

 

表示されているボタンを押すことで,LEDを点灯させることができます. 実際にブラウザからLEDの制御を行った結果が次の動画になります.

 

所感:


これを応用してロボットを動かしていきます. 次こそはカメラ画像取得とGPIOプグラムを連携させ,ロボットを動作させます.

Raspberry Pi に Webカメラを接続して動画を配信してみる

概要:
Raspberry Pi にWebカメラを接続し、 ストリーミングで動画を配信してみました。 今回はRaspian導入済みのSDを使用するため、 Webカメラのドライバを導入する必要はありません。 使用機器:
今回は以下の機器を使用しました。 無線は使用する必要はありません。 WiFiアダプタのドライバを導入するには、以下の記事を参照してください。 Raspberry Pi に Wifiアダプタを使用する ハードウェア:  ・ Raspberry Pi (Raspian 導入済み)  ・ WiFiアダプタ( GW-USValue-EZ)  ・ セルフパワー対応のUSBハブ(BSH4A01BK)  ・ UVC対応のWebカメラ(C250h) ソフトウェア:  ・ mjpg-streamer 導入:
定番のストリーミングアプリとして、 ・ mjpg-streamer ・ motion ・ ffmpeg があります。 今回は導入が容易なmjpg-streamerを使用します。 以下の手順で導入を行います。
sudo apt-get install subversion
sudo apt-get install libjpeg-dev imagemagick
svn co https://mjpg-streamer.svn.sourceforge.net/svnroot/mjpg-streamer mjpg-streamer
cd mjpg-streamer/mjpg-streamer
make
コンパイルには時間がかかります(10分ぐらい)。 検証:
検証として、実際にmjpg-streamerを起動し、動作の確認を行います。 以下の写真のように使用機器を接続します。 Web Camera
sudo ./mjpg_streamer -i "./input_uvc.so -f 20 -r 320x240 -d /dev/video0 -y" -o "./output_http.so -w ./www -p 8080"
*Webカメラにアクセするには管理者権限が必要です この後、ブラウザで以下のアドレスにアクセスすると、 配信されている画像を確認することができます。 http://(Raspberry PiのIPアドレス):8080 mjpg-streamer まとめ:
このように簡単にWebカメラによって取得した画像を配信することができました。 やはり、通常の電子工作と違い、 豊富なCPUリソースを使用して様々なソフトウェアを容易に使用出来ることが Raspberry Piの良いところなのかなと考えています。 次はRaspberry Pi でモーターを制御します。 参考サイト:
・ Raspberry Pi に Wifiアダプタを使用する ・ UVC対応Webカメラを使用してストリーミング配信をおこなう

Raspberry Pi に WiFiアダプタを接続する

概要:
Raspberry Pi をWifi接続するために、 無線LAN用ドライバを導入してみました。 今回、無線LANを直接Raspbeery Piに接続しますが、 Raspberry Pi のUSBポートは140mAまでの出力がないため、 安定動作させるには、セルフパワーのUSBハブを接続することをおすすめします。 使用機器:
使用機器は以下になります。  ・ Raspberry Pi (Raspian導入済み)  ・ WiFiアダプタ( GW-USValue-EZ)  ・ インターネット環境 導入:
以下の手法で導入を行います。
wget http://dl.dropbox.com/u/80256631/install-rtl8188cus.sh
sudo mv install-rtl8188cus.sh /boot
sudo ./boot/install-rtl8188cus.sh
Raspberry Pi がインターネットに接続されていれば、 これだけで無線LANドライバの導入が完了します。 あとは、メッセージに従って接続の設定を行うだけです。 動作確認:
導入完了後、アダプタのLEDが点滅するようになります。 ifconfig 等でルーターにつながっていることを確認してください。 まとめ:
導入がだいぶ簡単になりました。 次はWebカメラをつなげる方法についてです。 参考サイト:
・Edimax Wifi EW-7811UN setup

Raspberry Pi で カメラ付きWifiBot を作成

概要:
やってみた報告。 Raspberry Pi に USB WifiとWebカメラをつなげてロボットを制御してみました。 PC、スマホ等のブラウザからカメラのストリーミングを見ながら操作が可能です。 作り方、ソースコードについては後日公開予定(今月中)。 構成:
今回のロボットの構成は以下のようになっています。 ・ Raspberry Pi ・ バッファ回路(GPIO用) ・ モータードライバ回路(GPIOで制御) ・ 電源回路(エネループ6本から降圧) ・ USBハブ(外部から電源を供給) ・ USB無線LANアダプタ ・ Webカメラ(UVC対応) 動作確認:
こんなかんじでスマホのブラウザからロボットを動かすことができます。 まとめ:
電源周りでかなり時間を取られてしましました。 次からはエネループではなく、リチウムポリマーの運用を考えたほうがいいのかもしれません。

Raspberry Pi SDカードへのイメージ書き込み

概要:
新しくSDを新調したので、イメージの書き込みとSDの設定までやってみました。 Raspberry Pi で現在公開されている構築済みのイメージは、 ・Debian(squeeze) ・Arch Linux ARM ・QtonPi があります。 今回は,推奨されている Debian を使うことにします。 Mac、Linux、Windowsの全ての環境で書き込みを行うことができます。 今回は、Windowsを使用します。 作業環境:
・ Raspberry Pi ・ PC(Windows) SDカードスロット付 ・ SDカード(8G以上推奨) 環境整備:
最初に書き込むイメージとツールを用意します。 イメージ :Debian ツール  :Win32 Disk Imager これらを解凍し、ツールによってイメージの書き込みを行います。 イメージの書き込み:
解凍したWin32 Disk Imager を起動すると次のようなウィンドウが出現します。 次の画像のように、 ① 書き込むイメージを選択 ② インストールに使用するSDカードを選択 ③ 書き込み のように作業を行います。 インストールするドライブを間違えると、データが飛ぶので注意してください。 win32image SD設定:
インストール後の段階では、SDカードは2Gを使うことが想定されており、 使用できる容量が2Gとなっています。 そのため、パーティションを設定し直す必要があります。 Raspberry Pi のコンソールから以下のように打ち込み、設定を行います。 ①ー② プログラム起動と現在のパーティション構成の表示 ③ー⑥ 不必要なパーティション削除 ⑦ー⑪ プライマリパーティションのサイズ設定 sd 完了後再起動をします。 ファイルシステムをリサイズします。
sudo resize2fs /dev/mmcb1k0p2
(16GBのSDで30分程度待機)
reboot
コマンドによって、成功しているかを確認
df -h
Swapファイルを設定します。
sudo dd if=/dev/zero of=/var/swapfile bs=1M count=128
sudo mkswap /var/swapfile
sudo swapon /var/swapfile
sudo reboot
最後にスワップファイルが起動時にマウントされるように設定を行います
sudo vi /etc/fstab
以下の行を追加:
/dev/mmcblk0p2  /          ext4    defaults,noatime,nodiratime  0 0
/var/swapfile   none       swap    sw                                    0 0
再起動して設定完了です。 まとめ:
今回はRaspberry PiのSD領域を全て使用するまでの手順を書いてみました。 しばらくRaspberry Piの容量の問題で悩んでいたのですが、これで解消できました。 これぐらいのことはもう少し前に気づくべきだった。。。 次はRaspberry Pi 単体でカーネルのアップデートを行う方法を書こうかなと考えています。 参考サイト:
・Raspberry Pi Image Downlolad ・Win32 Disk Imager ・Basic Raspberry Pi Setup ・Scary rapartitioning of SD Card On Raspberry Pi