走れ!ラズベリーパイ!
こんにちは、斉藤です!
みなさんは、Raspberry Pi(ラズベリーパイ)というものをご存知でしょうか?5v 700mAという低電力で動く小さなコンピューターです。
こんなもの
Raspberry Pi公式サイト
Linuxをインストールすることができるので、WEBサーバーや、ファイルサーバーとして活躍させることができます。今回はこれを使って、こんなラジコンカーを作ったので、その過程をご紹介します。
IT系エンジニアらしく、Linux、iPhoneの話も出てくるのですが、電子工作だったり、機械の機構だったりの話も出ますので、興味のある方はお付き合いいただければと思います。
また長くなりますので、何回かに分けて連載する予定です。
* Raspberry Piとは?
Linuxをインストールすることができる小型のコンピューターです。以下の入出力を持っています。
* USBポート x 2
* DMI出力端子
* オーディオ出力端子
* GPIO: 汎用的な電気信号を扱うための端子。電子回路との接続インターフェースになる。
特に、このGPIOという入出力が重要となってきます。
コマンドラインもしくは、プログラムから、電子回路用の信号を出力することができます。もっと平たく言うと、例えばここにLEDを接続して、点灯を制御することができます。
このRaspberry Piを購入して、動かす(SSHログインなど)までの過程は、以下のページを参考にしました。
Arch Linux on Raspberry Pi
約3,300円で買えるLinuxパソコンRaspberry PiをMacで使う
* 仕様と実装方法
ラジコンを作るにあたり、まずは仕様を考えます。
* 前進後退
* 速度調整
* ステアリング
* 電源を搭載
* 無線化
* リモートでのコントロール
というところでしょうか。これを実装する方法として、それぞれ以下を検討。
- 前進後退
この用途専用の電子回路、モータードライブ回路を自作します。ただし、モーターを制御するには、Hブリッジ回路というものがすでに考案されているので、これを使います。この回路は四つの入力を持ち、それらを切り替えることで、正転、逆転、停止、ブレーキを実現できます。
また、Hブリッジ回路を組む用途のICも販売されていますので、これを購入して実装します。
Hブリッジ回 路について、もっと詳しく
- 速度調整
PWM(Palse Width Modulation)という方法を使います。信号のON/OFFを一定間隔で繰り返すことで、出力する電圧の平均を制御する方法です。例えば5v直流電圧にもかかわらず、3v直流電圧と見なして扱うことが可能になります。モーターは掛ける電圧によって、トルクも比例して変動しますので、結果として速度調整をすることができます。このPWMをプログラムで生成します。
PWMについて、もっと詳しく
- ステアリング
おもちゃ屋でも買えるタミヤのギアボックスを用意しました。モーターが左右別々についているため、これでステアリング出来るだろう、と考えました。
ダブルギヤボックス(左右独立4速タイプ)
- 電源を搭載
ラジコンなので、電源ケーブルによる行動の制約を受けないことが必要になります。これは、モーター用電源とシステム用電源と二つに分けます。モーターに負荷が掛かったとき、電流が変動するので、それによってシステムが壊れることを避けるためです。
最終的にどんな電源を使ったかは、次回以降の記事で紹介します。
- 無線化
ここで、Raspberry Piを使います。
当初はArduinoを使うことを考えており、iPhoneで操作できるようにBluetooth通信をしようと思っていました。が、あまり知識が無く、デバッグも大変だろうということから、なかなか開発に着手できませんでした。
そんなとき、Raspberry Piを知ったのですが、Arduino同様GPIOが存在すること、無線化がIPレイヤー(WiFi)で実現可能なことから、こちらを使うことになりました。
特にLinuxを搭載することで、"SSHログインができる車"というアイデアが自分には革新的に思えたので、こちらを採用することに決定。
- リモートでのコントロール
無線化の話でも触れたように、当初はBluetooth通信によって、iPhoneなどのモバイル端末で操作することを考えていました。
が、Linuxを使うことになり、モバイル端末から送信した制御用パケットを受信して制御することになりました。
以上、仕様を実現するための実装方法が揃いました。
システム構成図を描くと、以下の様になります。
早速一つづつ着手。
* モータードライブ回路による前進後退の実装
Raspberry PiのGPIOから出ている電気信号を直接モーターに繋いでも、モーターを動かすだけの電力を得ることはできません。それどころか、運が悪ければ、Raspberry Piが壊れてしまいます。そのためトランジスターを間にはさみ、Raspberry Piの信号によってモーター用バッテリーの電力を制御する必要があります。モーターを制御するだけでなく、そういったためにもこのモータードライブ回路が必要になります。
ちなみに、トランジスターは電気的なスイッチ(信号によって、別の電流を流したり、止めたりできる)のようなものだと思ってください。
問題なく動くことが分かったので、ハンダ付け実装。モーター左右別々にHブリッジ回路を組んでいるので、二つICがついています。
また、コマンドラインから、信号のON/OFFができます。
コマンドライン上から、以下のコマンドを実行。
$ echo "4" > /sys/class/gpio/export
$ echo "out" > /sys/class/gpio/gpio4/direction
$ echo "1" > /sys/class/gpio/gpio4/value
これで、GPIOの特定の端子(この例では、4番のGPIO端子)から信号を出力させることができます。
ここまでで、自作の電子回路とRaspberry Piを接続することが出来ました。
GPIOについて、もっと詳しく
* プログラムによる速度調整の実装
ただし、上記コマンドでは単純なON/OFFは出来るものの、速度を変更することができませんので、ここでPWMを導入します。
以下のライブラリを使って、c言語でプログラムを組みます。
Raspberry Pi向け C言語PWMライブラリ
c言語用、Python用、nodejs用など、探せばライブラリはいくつかあるようです。手持ちのRaspberry Piでは、コンパイル速度の速さから、c言語用のライブラリを使用。
コマンドラインからプログラムを実行して、動かしている様子が以下の画像になります。
タイヤが勢いよく回転してますね!
ここまでで、WiFiによる無線通信によって、モーターの制御するという、ラジコンの核となる部分ができました!Linuxを使えば、あっさり無線化できることに感動。。。
* いったん、まとめ
だんだんとラジコンカーが実現に近づきました。
特に、無線化のおまけでLinuxという環境がくっついてきたことが、とても大きかったと思います。
その気になれば、MongoDBやMySQLを使って、走行データのログ収集したり、nginxでマシンの状態をWEBインターフェースで配信したりできるんじゃないかとワクワクしますね!
とりあえず、次回は車体作りとステアリングの過程について、触れてみたいと思います。
第二話に続く!
* 参考情報
Raspberry Pi 使用例まとめ
ミニ四駆×Arduino×Bluetoothで“夢のミニ四駆”を作ろう
トヨタが「Tizen IVI」の開発に参加、車載情報機器のLinux採用に本腰