Raspberry Piでロボットを作る
概要:
最終更新日から1ヶ月弱。 更新する気が起こらない時期ってありますよね。
さて、今回はRaspberry Piでモーターを制御する方法についてです。
を組み合わせてブラウザから動かせるロボットを作ります。
使用機器:
ハードウェア:
・Raspberry Pi
・セルフパワーのUSBハブ
・無線LANアダプタ
・モータドライバ(後ほど説明)
・モーター
・ 電源回路(エネループ6本から降圧)
ソフトウェア:
・mjpg-streamer → Mjpg-streamerを使って動画配信をする記事
・pythonのgpioライブラリ → GPIO制御の記事 だいたい今までの記事の構成と同じですね。
ハード作成:
今回使用するモータドライバは、定番のTA7291です。 GPIOにバッファIC(TD6004APG)をつなげ、 このモータドライバにつなげることでモータの制御を行います。 回路図は以下のようになっています。 かなり適当に引いているので、正直微妙です。
今回、RaspberryPiへの電源供給はGPIOのピンから行ないます。 理由は、Raspberry PiのマイクロUSBポートにはポリスイッチが入っており、 電流を流しすぎると安全のために電源を遮断するためです。 そのため、Raspberry Piとモータドライバ回路への電源供給はGPIOピンから行うことにしています。 これをユニバーサル基板上に作成したものがこちらになります。
これをGPIOソケットにつなげて使用します。
ソフトウェア作成:
ソフトウェアについては、 ブラウザからLEDを制御する記事を応用して作成します。 作成した回路にあった出力をGPIOから出力するだけで、モーターを動かすことができます。 前回のソースに少し修正を加えただけなので、 こちらからダウンロードして参考にしてください。 また、画像表示用のindex.htmlで使用されている画像のIPとポート番号は、 自身で立てたmjpg-streamerのものに変更してください。
実行:
ソフトウェアの実行では、以下のソフトを同時に起動します。
・ mjpg-streamer (動画配信用)
・ モータ制御用ソフト ダウンロードしたソフト内にあるものを同時に起動します。
sudo sh stream.sh & sudo server_motor.py
この後、指定したRaspberryPiのIPアドレスにアクセスすることで、 ロボットの操作画面を開くことができます。
実行結果:
この動画のようにロボットを動かすことができました。
所感:
成果物はできてたのに記事を書くのが遅くなってしまいました。 定期的に記事を書くのは難しいですね。 次は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のソースを貼ると正常に表示されないため, 以下の場所にソースコードをおいておきます.
起動と動作テスト:
これらのプログラムを同じディレクトリに保存し,次のように起動します.
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
定番のストリーミングアプリとして、 ・ 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を起動し、動作の確認を行います。 以下の写真のように使用機器を接続します。
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
まとめ:このように簡単に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.shRaspberry 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カードを選択 ③ 書き込み のように作業を行います。 インストールするドライブを間違えると、データが飛ぶので注意してください。
SD設定:インストール後の段階では、SDカードは2Gを使うことが想定されており、 使用できる容量が2Gとなっています。 そのため、パーティションを設定し直す必要があります。 Raspberry Pi のコンソールから以下のように打ち込み、設定を行います。 ①ー② プログラム起動と現在のパーティション構成の表示 ③ー⑥ 不必要なパーティション削除 ⑦ー⑪ プライマリパーティションのサイズ設定
完了後再起動をします。
ファイルシステムをリサイズします。
sudo resize2fs /dev/mmcb1k0p2 (16GBのSDで30分程度待機) rebootコマンドによって、成功しているかを確認
df -hSwapファイルを設定します。
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



