2011/08/28

Arduinoタンク ピラミッド型ミラーの実験

昨日作ったピラミッドミラーをタンクに取り付けて、取得した画像をOpenCVで前後左右に分割するプログラムを作ってみました。

タンクの前方にキャタピラセットの空き箱、右方向に工具箱とギアボックスの空き箱、左方向にデジタルマルチメータの箱を置いています。

俯瞰図


撮影した生のデータ


4方向に分割、再配置


感覚的には以下の画像のような視野になりました。
分割したので仕方ないとはいえ、前方の視野がかなり減ってしまいました。




ひとまずこれを使ったタンクを再度組み立ててみたいと思います。
ではまた。

Arduinoタンク 周囲確認用ピラミッドミラー

前にArduinoタンクの前方にWebカメラをつけてみたのですが、前方しかカメラで確認できず(当たり前ですが)、左右・後方の確認が必要だな~と感じました。

大さじを使って周囲を撮影し、全方位カメラにしようと少し実験してみたのですが、
大さじでは像がぼやけてしまい使い物になりませんでした。

手元にある素材ではダメだったので、下記のサイトにあるようにステンレスのミラー球を使うことにしました。

そして今日、東急ハンズにミラー球を捜しに行ったわけですが、在庫がありませんでした。
わざわざ取り寄せるのも面倒なので、プランBを実行することにしました。

プランBは、鏡でピラミッドみたいな感じのものを作り真上からカメラで映す、というものです。

プランB
光り輝くピラミッド方式

これならミラー球で撮影したときに必要な球面補正など、面倒な処理をしなくてもよくなります。

ミラーピラミッドには鏡が必要なのですが、さすがにガラス製の鏡は危なくて加工したくはありません。
今回はハンズの樹脂素材コーナーにあったミラー加工のアクリル板を買ってきました。2mm厚なのである程度強度が出そうです。加工もアクリルカッターで簡単にできます。

ハサミで切れる0.5mmのミラー加工ポリカーボネイト板も気になりましたが、くみ上げたときにたわみそうだったので今回はやめておきました。(土台を作った後に貼り付ける感じにすれば、こっちのほうがキレイにできるかも)


150mm x 300mm x 2mmのアクリル板。
もっと小さいのでも良かった。。。

買い物を終えた後、早速CADソフトを使いピラミッドを作ったときに角度が45度になるような三角形(底辺:高さ=2:√2)を作成し、レーザープリンタラベル用紙に印刷してアクリル板に貼り付けました。 こうすると加工が楽になります。
裏面にシール貼り付け

表面は傷がつかないよう
マスキングテープで養生
あとはアクリルカッターで削り、1辺ずつポキポキ割っていきます。アクリルの厚さが2mmなのでそんなに苦労しませんでした。

切り出した後はピラミッド状に組んで固定していきます。アクリル用の接着剤がちょっと高かったのと今後そんなに使わなさそうだったので、ホットボンドで代用しました。
今回は隙間を埋めていく感じで使ったので、ホットボンドのほうが接着剤よりも適役だったようです。


ホットボンドで塗り固めます

ユニバーサルプレートに固定できるよう、
M3のネジをつけておきました

ホットボンドで固定した後は、余分な部分を切り取り、マスキングテープをはがします。

周囲確認用ピラミッドミラー 完成!
Webカメラでテスト撮影してみたところ、クリアな画像が得られました。
明日はこれをタンクに取り付けて、どれぐらい使えるかの実験をしてみようと思います。

ではまた。



2011/08/23

メインPC 復活

修理に出していたメインPCですが、マザーボードの交換がされた状態で戻ってきました。
HDDの中身はフォーマットされてるだろうな~と思いましたが、幸いなことにHDDはそのままでした。

ようやくOpenCVでの開発が再開出来そうです。

まずは大匙を使った全方位カメラの開発をして、Arduinoタンクに搭載したいと思います。


2011/08/16

自作Sanguino

自作Arduinoの兄貴分?にあたる、Sanguinoを作ってみました。

sanguino.cc

Sanguinoとは@マイクロファン ラボ

SanguinoとArduinoの違いは、下記の通りです
(公式のものを翻訳しました)

・atmega644Pを使用しています。
・合計で32本のIOピンがあります。
・8本のアナログ入力ピンがあります。
・6本のPWM対応ピンがあります。
・64KBのフラッシュメモリーを利用できます。
・4KBのRAMがあります。
・2KBのEEPROMがあります。
・ブレッドボードで作れます。
・100%オープンソースです。

ブレッドボードにICや水晶振動子を取り付けた後、ブートローダーを書き込もうとしましたが、AVR ISP MkIIがUbuntuで認識されていないようです。

いろいろと探してみたところ、ここに解決策がありました。

AVR ISP MkIIをUbuntu11.04で使用する方法;
1./etc/udev/avrisp.rules を作成します。
2.avrisp.rules内に、以下のように記載します。

SUBSYSTEM!="usb_device", ACTION!="add", GOTO="avrisp_end"

# Atmel Corp. JTAG ICE mkII
ATTR{idVendor}=="03eb", SYSFS{idProduct}=="2103", MODE="660", GROUP="dialout"
# Atmel Corp. AVRISP mkII
ATTR{idVendor}=="03eb", SYSFS{idProduct}=="2104", MODE="660", GROUP="dialout"
# Atmel Corp. Dragon
ATTR{idVendor}=="03eb", SYSFS{idProduct}=="2107", MODE="660", GROUP="dialout"


LABEL="avrisp_end"


3.保存した後は、下記コマンドを実行します。

cd /etc/udev/rules.d
sudo ln ../avrisp.rules 60-avrisp.rules
groups
Restart udev
sudo restart service udev


4.念のため再起動しておきます。



これでAVR ISP MkIIが使えるようになったので、次はブートローダーの書き込みです。
Burning the Sanguino Bootloader@replapwiki

上記のサイトにあるように、下記コマンドを実行すると書き込みができます。


wget http://sanguino.googlecode.com/files/Sanguino-0018r1_1_4.zip
unzip Sanguino*zip
sudo avrdude -patmega644P -cavrispmkII -Pusb -U flash:w:Sanguino/bootloaders/atmega644p/ATmegaBOOT_644P.hex


Sanguinoのブートローダーが書き込めたので、次にArduinoのソフトのほうでスケッチを書き込めるようにします。

参考にしたのは下記ページ。
Software For Linux@sanguino.cc

1.googleCodeからSanguinoのファイルをダウンロードして展開します。
2.ArduinoのHardwareフォルダに放り込みます。(私はapt-getからArduinoをインストールしたので、/usr/share/arduino/hardware/ に放り込みました)
3.Ubuntuの場合は、board.txtを若干修正する必要があります。

     sanguino.upload=stk500
    を
    sanguino.upload=arduino

そのあと、Arduinoを再起動すればOKです。

Sanguino


今はまだそんなにIOピンが必要な訳ではないんですが、とりあえず作ってみました。
Arduino用のラベルが便利だったので、Sanguino用のラベルも作りました。
ラベルは別館に保存してますので、ご自由にどうぞ。

ではまた。


2011/08/13

Arduino Uno互換機の作成

私はArduino Unoを1台持っていますが、センサとArduinoを使ったものを作るときに
Ardunoが1個だけだと何かと不便です。
必要な数だけArduino Unoを購入するのも手軽な方法ですが、1台あたり3,000円するので
ちょっと考えてしまいます。

いろいろなサイトを見てみた結果、自分で互換機を作ることにしました。

メインとなるチップ ATMEGA328P−PUは、秋月電子で購入しました。1個250円ぐらいでした。Arduino化するのにはブートローダーという小さいソフトを書き込む必要があるので、AVRライターも購入。こっちは3,300円。
秋月電子のは素のチップですが、スイッチサイエンスでブートローダー書き込み済みのものも購入できます。こっちは1つ350円。


Arduino UnoとAVRライターを使って、素のチップにブートローダを書き込みました。
(参照:DIGIらいふ

Arduinoの素。
チップだけだとピンを間違えそう
Arduinoには基板上にピンアサインの印刷があるので配線するときに間違えにくいのですが、自作版には何もないので、何かしらわかりやすい方法を考える必要があります。

Arduino chip sticker label に、Arduinoのチップに貼るラベルが公開されてたので、svg形式のをInkscapeで読み込み、少し修正を加えて印刷してみました。



ラベルをペタリ
何もない状態よりも、かなりわかりやすくなりました。
(いちいちピン番号を数えるのは面倒でした)

次に、ブレッドボードと同じレイアウトのユニバーサル基板(80円)に実装してみました。
ICソケットを基板にハンダ付けして、Arduinoのチップは交換できるようにしてあります。
16MHzの水晶振動子を置くところがなかったので、チップの上の方に置きました。
それ以外はほとんどジャンパ線をはわせないで作成できました。

普通のユニバーサル基板だと、GNDラインなども1カ所ずつリード線などをはわせる必要があるので面倒だったのですが、ブレッドボード形式のものだとその辺は楽でした。
便利な反面、自由度は減ってしまうので、目的に応じて今までのとブレッドボード形式のものを使い分けるようにしたいと思います。
自作Arduino Uno。上の方の余白にも
ピンソケットを実装して、実験しやすくする予定

自作Arduinoへのプログラムの書き込みは、USB-シリアル変換アダプタを使用します。
秋月電子で売っていたFT232RL USBシリアル変換モジュールを使う場合は、以下のような配線になります。

Arduino USBシリアル
Vcc USB
GND GND
RXD TXD
TXD RXD
RST DTR#  (間に0.1uFのコンデンサを挟む)  RST-0.1uF-DTR#


Arduino Unoに比べるといろいろと面倒ですが、やはり安く作れるのはありがたいです。

ではまた。

Arduinoに温度センサーをつなぐ

節電の夏。暑いです。
皆さんの勤務先は暑いですか?
私の勤務先は暑いです。エアコンが効いてません。

「暑いからなんとかして〜!」と訴えるためには、データが必要です。でも、ロギングは面倒です。

そういう面倒な作業はPCとマイコンにまかしてしまおう、ということで
Arduinoに温度センサーをつけて温度ロガー代わりにしてみたいと思います。

使うもの
1.PC 1台
2.Arduino 1個
3.温度センサー(LM35DZなど。) 1〜6個

秋月電子で買ったLM35DZ(100円)は、0.1℃=1mVという出力特性を持っています。
30℃だったら300mV。室温でプラスマイナス0.25℃の精度。ほか温度ICに比べると少し高めですが、精度を考えれば納得です。

LM35DZのVOutピン(真ん中)をArduinoのアナログ入力ピンにつなぎ、analogReadで読むと、AD変換されたあとの値が取得できます。
通常はAD変換の基準電圧が電源電圧と同じ(5V)になっているので、何も設定しない状態だと0.5℃刻みのデータしか取得できないことになります。
(5000mV/1024=4.88mV≒0.49℃)

0.1℃刻みぐらいにはしたいので、基準電圧(AREF)を1Vぐらいに設定してみます。
ツェナーダイオードとか定電圧ICとか使う手もありますが、そんな部品は持っていないので手軽に抵抗分圧することにしました。

5V-AREF間に40kオーム、AREF-GND側に10kΩをつければ、基準電圧を1Vにできますが、手元にあった51kΩと10kΩで分圧することにしました。

AREFの電圧をコードに組み込むことによって、AREFが適当でも問題なく動作するようにしました。

部屋の温度は30℃。。暑い
ターミナルソフト側でタイムスタンプを埋め込めば、温度ログとして使えると思います。
また、イーサネットシールドを取り付けて、Syslogサーバとかに温度を送りつけたりするのも面白そうです。イーサネットシールドは少し値段が高いですが。

ソースコードは別館に保存してあります。
ではまた。

2011/08/11

BeagleBoard-xm の 日本語化

メインPCが壊れたので修理に出す予定ですが、引き取りが今週の土曜日となっているので、
その後の修理期間も考えるとしばらくはメインPCが使えないな~、と考えています。

その間はサブ機のiMac(現在は家族共有)を使うことも考えましたが、リビングから自分の部屋に毎回持ってくるのが少し面倒です。
なのでBealgeBoard-xmを日本語化して、メインPCが戻ってくるまでしのぐことにしました。

日本語化の作業といっても、"Ubuntu GUI 日本語化" で検索して、言語の追加とIMEの設定を行っただけです。

現在は8GBのマイクロSDカードにUbuntuをインストールしているのですが、すでに4.5GB程度使用しています(残り3.5GB)。
BeagleBoard-xmでUbuntuのデスクトップ環境を構築する場合は、8GBか16GBのマイクロSDカードにしたほうがよさそうです。


というわけでBeagleBoardをタンクに積む計画は延期になりました。
代わりにステンレス製の大さじ・小さじを使った全方位カメラの実験をしたいと思います。

ではまた。





2011/08/07

メインPC 故障

今日、PCの電源を入れたところ、画面に何も映らない現象が発生しました。
BIOSの画面も出てきません。また、キーボードやマウスのLEDも光りませんでした。

マザーボードあたりがお亡くなりになった模様です。

保証期間内なのでメーカーに修理を依頼するつもりですが、
その前にデータの救出を行わないと。。

SATAハードディスクを外付けにするアダプタは会社においてあるので、明日回収してきて
データのバックアップをしようと思います。

この際なので、メインPCもSSD化してしまおうかなぁ。。。

2011/08/06

Arduino/BeagleBoard用のバッテリーを探す

BeagleBoard-xmを完全無線化すべく、BeagleBoardを駆動できそうなバッテリーを探しています。

DC-DCコンバータとバッテリーを使うのが常套手段のようですが、バッテリーも結構値段がしますし、もちろん充電器も一緒に買わなければいけません。

5V出力で電流がとれるやつは無いかなぁ~と考えていたら、
以前購入したeneloopのモバイル充電キット?を思い出しました。
eneloop2本でUSB充電できるやつです。

早速引き出しから引っぱりだしてみると、5V500mAまで出力できるとのこと。
BeagleBoardは1Aぐらい必要だそうなのでこれだと足りない。

ものは試し、ということで、USBケーブルとACアダプタをそれぞれ切断し、USBオス=2mmコネクタオスというケーブルを作りました。

USB-DCジャックケーブル

昔作った白色LED光源でテスト

BeagleBoardにつないで、電源をONにしたら、
コンソールに文字が表示されました。

ブートしてくれるかな~と見守っていたら、
再起動の連続になりました。
コンソールのログを見てみると、USBハブを認識した後、再起動がかかっている模様です。



[    4.335327] SmartReflex Class3 initialized
[    4.344848] clock: disabling unused clocks to save power
[    4.351379] registered taskstats version 1
[    4.355926] fbcvt: 1280x720@60: CVT Name - .921M9-R
[    4.364959] usb 1-2: new high speed USB device number 2 using ehci-omap
[    4.381256] Console: switching to colour frame buffer device 160x45
[    4.398223] regulator_init_complete: VDAC: incomplete constraints, leaving on
[    4.406250] Freeing init memory: 360K
[    4.522827] hub 1-2:1.0: USB hub found
[    4.531463] hub 1-2:1.0: 5 ports detected


ACアダプタに変更してから、USBの次のログを見てみると、mmc。。。。。と表示されていました。
SDカードから読み取ろうとしているところあたりで落ちているようです。
やはり500mAでは足りないみたいです。

他の機種をネットで調べてみたら、Panasonicから今年の春に出たQE-PL201というモバイル電源パックの仕様が出力5V1.5Aとなっていました。


これなら動作できるかも??


というわけで明日電器屋さんに買いに行ってきます。

ではまた。

自宅エクスプローラ(仮) 試作品作成

自宅エクスプローラの続き。

Arduinoでモーターを制御できるようになったので、
まずはArduinoとタンクだけで遊んでみました。
ついでなのでWebカメラもテープで固定してつけてみることに。
もちろんまだ有線です。


タンク用のプレートだけだとギアボックスで半分埋まっているため、
タンクの上にユニバーサルプレート(大)を取り付けて設置面積を増やしました。
Arduino、電池ボックス、カメラ、ブレッドボードを置くといっぱいいっぱいになりました。


ユニバーサルプレート(大)が込み合っています
BeagleBoardはどこに置こうかな・・


メインカメラ。こんな感じの仕事ばっかりさせられてます


まだ有線式なので動ける範囲に限りはありますが、
モニタでメインカメラの画像を見ながら操作するのは楽しいです。


無線LANをつんだBeagleBoard-xmとバッテリーをつければ、家の中をいろいろと探検できそうな感じです。


Youtubeに車載カメラと固定カメラの動画を載せました。
下の動画を再生しはじめた直後に上の動画を再生し始めると、ほぼ同じタイミングの
映像になります。
(箱が転がっていますが、撮影用に転がしたものです)





メインカメラだけでも操作はできますが、後方や側方も確認したくなりました。
360度カメラが安く売っていれば、つけてみたいと思います。


Arduinoのコードは以下のようになります。
結構簡単なコードで、上記のようなラジコンができます。

/*
 自宅エクスプローラ用
 タンクコントローラ
 
 TA7291Pを2個使って、タンクを操作します
 TA7291PのVRefにanalogWriteで電圧を与えると、
 モーターにかける電圧を変えることができます。

 */

//後でキーアサインを変更できるようにしておく

#define GO '8'  //前進
#define STOP '5' //停止
#define LEFT '4' //左旋回
#define RIGHT '6' //右旋回
#define BACK '2' //後ろ

#define LEFTIN1 2
#define LEFTIN2 3
#define RIGHTIN1 4
#define RIGHTIN2 5

#define VREF  9  //出力電圧のリファレンス PWMが使えるポートにしてください


void setup() 
{
  Serial.begin(9600);
  pinMode(LEFTIN1, OUTPUT);//左側のモータードライバのIN1
  pinMode(LEFTIN2, OUTPUT);//左側のモータードライバのIN2
  pinMode(RIGHTIN1, OUTPUT);//右側の(以下同文)
  pinMode(RIGHTIN2, OUTPUT);

  Serial.println("MOTOR");
  //出力電圧のリファレンス用
  pinMode(VREF,OUTPUT);

  //モーターは1.5V~3Vが動作電圧
  analogWrite(VREF,128);//とりあえず2.5V

  //最初は停止している状態
  setLeftMotor(LOW,LOW);
  setRightMotor(LOW,LOW);

}


//左側のモータを制御します。
void setLeftMotor(int in1,int in2)
{
  digitalWrite(LEFTIN1,in1);
  digitalWrite(LEFTIN2,in2);
  //デバッグ用
  Serial.println('LightMOTOR'+ in1 +' '+ in2);
}
void setRightMotor(int in1,int in2)
{
  digitalWrite(RIGHTIN1,in1);
  digitalWrite(RIGHTIN2,in2);
  //デバッグ用
  Serial.println('RightMOTOR'+ in1 +' '+ in2);

}

void loop() 
{

  delay(100);
  char r=Serial.read();

  if(r== GO)
  {  //全速前進
    setLeftMotor(HIGH,LOW);
    setRightMotor(HIGH,LOW);
    Serial.println("GO");
  }

  if(r==STOP)
  {
    setLeftMotor(LOW,LOW);
    setRightMotor(LOW,LOW);
    Serial.println("STOP");
  }

  if(LEFT==r)
  {
   //左方向へ旋回
    setLeftMotor(LOW,HIGH);
    setRightMotor(HIGH,LOW);
    Serial.println("LEFT");
  }

  if(RIGHT==r)
  {
    //右方向へ旋回
    setLeftMotor(HIGH,LOW);
    setRightMotor(LOW,HIGH);
    Serial.println("RIGHT");
  }
  if(BACK==r)
  {
    //退却。後方確認はできません
    setLeftMotor(LOW,HIGH);
    setRightMotor(LOW,HIGH);
    Serial.println("BACK");
  }

}



ではまた。

2011/08/04

Arduinoでモータードライバを制御

昨日、今日で自宅エクスプローラ(仮)の駆動部分を組み立てていました。

駆動部分のベースは、タミヤ模型の「楽しい工作シリーズ タンク基本セット」と、「ダブルギヤボックス」を組み合わせたものです。
ダブルギアボックスは一番トルクを出せる組み合わせ(344:1)で組みました。

プレートにギアボックスを固定した後、コネクタつきのケーブルにハンダ付けしました。
コネクタはPC用のATX電源ボックスの5V/12Vラインによくあるタイプのものです。



コネクタ再利用

キャタピラ車の方がひとまず組みあがったので、Arduinoでモータードライバを制御するプログラムと回路を作りました。


回路は至って簡単で、Arduinoからは2本ずつ、2組の信号ラインを2つあるモータードライバのIN1とIN2にそれぞれつなぎます。あとはVccやGNDを配線して、Out1とOut2をモーターにつなげるだけです。

Arduino側のプログラムも、2本の出力ポートにHIGH/LOWの組み合わせを送るだけです。
例: 前進   HIGH/LOW  HIGH/LOW
  後退   LOW/HIGH  LOW/HIGH
     右回転  LOW/HIGH  HIGH/LOW
   左回転  HIGH/LOW  LOW/HIGH
   停止     HIGH/HIGH HIGH/HIGH

プログラムもざっくりですが出来たので、週末は筐体の方の組み立てに入りたいと思います。


完成予想図に使える写真を探していたときに、キネクたんというページを見つけました。
Arduino+タンク工作セット+Kinectという組み合わせです。
ソースコードも公開されているので、これをコピーさせてもらえば良かったかな・・・・
まぁ、まずは自分のコードで進めたいと思います。

ではまた。

2011/08/02

Arduino用ブレッドボードシールドの作成

秋月電子に注文していた部品がいろいろと届きました。

早速、下記ページを参考に、Arduino用ブレッドボードシールドを作成することにしました。

もういっそのこと… で、『ブレッドボードシールド作ってみた』

買った後に気づいたのですが、自分が買ったピンソケットは、基盤側のピンが若干短い。。。
安いからこっちの方がよいかな~と思ったのですが、きちんと長いピンのピンソケット(秋月だと通販コードC-04046)の方が良いです。今度はこっちを買おう。。。


ピンがちょっと短い
ピンヘッダをArduinoに合わせて切断したあと、ブレッドボードにアロンアルファでくっつけたのをArduinoに載せてみたら、案の定2ヶ所で接触不良が起きていました。

丸ピンソケットも一緒に買ってあったので、仕方なくゲタを履かせる感じで丸ピンソケットをつけました。

苦肉の策
丸ピンソケットを取り付けたあとは、接触も良好になりました。
材料をケチると良いことがありませんね。


完成した状態が下記の写真です。
基板上のピンアサインがまったく見えなくなるので、ソケットの横にシールでピンアサインを
貼っておく必要がありそうです。




ではまた。

-------------------------------------------------------------
Arduino用ブレッドボードシールド 材料
 レッドボード EIC-801 250円
ピンソケット(メス) 1x20 2本  (本当は長ピンソケットの方がよいです)
カッター
アロンアルファ等の接着剤
---------------------------------------------------------------

Fritzingでブレッドボード配線図を書く

Ardiunoを使って、ラジコン戦車的なものを作ろうとしているのですが、
配線図をどうやって作ろうかな〜と考えていました。

ネットでいろいろ調べていると、Fritzingというソフトが配線図を作るのに良さそうとのこと。
Fritzing.org から各OSに適したパッケージをダウンロードして解凍します。
Fritzingを起動すると、下記のような画面が表示されます。



ブレッドボードモードと、回路図、PCBの3つのモードを切り替えることができ、
それぞれリンクされているのがなかなか便利です。

PCBのモードには、自動配線がついていたり、両面基板が選べたりと高機能です。

専用基板が作りたくなったら、Fritzing Fabに注文すると、Arduino用シールドだと1枚あたり$36で作ってくれるようです。(ちょっと高い気が。。)

ではまた。