Posts Tagged ラジコン

QステアをArduinoから操作

今回は、タカラトミーのQ STEERをArduinoから操作するハックになります。

先週末、日本橋にある共立電子産業株式会社 3階のセンサー売り場にて赤外線のパーツ類を購入しました。

そんなわけで日曜大工エンジニアです。

○赤外線LED
東芝製 TLN115A(大) 60円
東芝製 TLN119(小) 80円

○赤外線リモコン受信モジュール
EVERLIGHT製 IRM-3638N3 210円

赤外線LED 赤外線リモコン受信モジュール
左からOUTPUT、GND、vcc(2.5-5.5V)
赤外線受信用回路
赤外線受信用回路

赤外線解析用コードは、ArduinoのサイトからInfrared receiver modulesのコードを利用して解析しました。

○キャプチャ値
データーの0と1が点灯、消灯の間隔。
点灯時は常に点灯しているのではなく、ON、OFFを繰り返します。
この繰り返しの間隔次第で変調信号として機能してます。
今回は38khzの変調信号での利用となります。

—- ここから
0    0
1796    0
1796    1
2168    1
2168    0
2648    0
2648    1
3016    1
…. 略
157372    0
158284    0
158284    1
—- ここまで
Qステア赤外線解析のサイトに書かれているのとほぼ同じ値が返ってきてます。

他には、1回の操作で2回同じ信号が送信されており、2回目の信号を送る間隔はch毎に異なっています。
Ach 間隔 7516
Bch 間隔 21860
Cch 間隔 36212
Dch 間隔 50568

チャネル毎に操作する場合は必要と考えれます。

○Ach の前進用サンプルコード
キャプチャした値の点灯間隔をサンプルコードに設定

#define LED 13
unsigned long us = micros();

void setup(){

pinMode(LED , OUTPUT);

}

void loop(){

digitalWrite(LED, LOW);

delay(1000);

int testdata[] = {1796 ,372 ,480 ,368 ,480 ,368 ,480 ,368 ,480 ,372 ,480 ,364 ,912 ,7516 ,1744 ,396 ,480 ,372 ,476 ,368 ,484 ,364 ,484 ,364 ,484 ,368 ,912 ,93576 ,1792 ,372 ,452 ,400 ,480 ,368 ,476 ,368 ,480 ,372 ,480 ,368 ,908 ,7512 ,1772 ,368 ,480 ,372 ,476 ,368 ,480 ,368 ,484 ,364 ,484 ,368 ,908 ,15680 ,1800 ,368 ,456 ,392 ,480 ,368 ,912 };

for (int cnt = 0; cnt < 500; cnt++) {

unsigned long len = testdata[cnt];

if (len == 0) break;

unsigned long us = micros();

do {

digitalWrite(LED, 1 – (cnt&1)); // iが偶数なら赤外線ON、奇数なら0のOFFのまま

delayMicroseconds(8); // キャリア周波数38kHzでON/OFFするよう時間調整

digitalWrite(LED, 0);

delayMicroseconds(7);

} while (long(us + len – micros()) > 0);

}

}

以上が今回のハックの内容となります。

前回と違い非常に安価にラジコンが製作出来ます。

また、赤外線は様々な用途での利用が考えれます。

今後も発想次第で色々作れそうです。

, , , , , , ,

No Comments

その後のラジコン

すっかりブログを書くのを忘れてました。

本日返信がついたので思い出した次第です。

あれから、ラジコンはサーバーに繋いだXBeeを介し、flashやjava applet から操作が可能となりました。

構成図はこんな感じです。先日社内のプレゼンで使った資料の流用になります。

ハード構成図

ネットワーク構成図

Flashから操作できる=Wiiのブラウザからも操作が出来る!。。はずです。

カメラを搭載していないので遠隔から操作は出来ません。今後の課題ですね。

Linuxを搭載するように考えてましたが、消費電力が大きいのと、組み込みLinuxは高価なこともあり、搭載は諦めました。

今後は社内のサービスに何らかの形で技術提供できればと考えております。

, , , , , ,

5 Comments

会社で走らせました

今日は会社にラジコンを持ち込みました。

人生において会社のデスクにラジコン置く機会は幾つあるだろう。。

今回はLinux抜きでXBeeで通信するalpha版です。

beta版ではネットワークを通じサーバーを通じて操作。

正式版ではお茶の間のWiiから操作を目指します(いつになることか

Linux版は現在調整中です。走行するには解決しないといけない問題が幾つかあります。

操縦はWiiリモコンのBlueToothをMacのBlueToothに繋いでます。

MacからラジコンへはXBeeでシリアル通信をしてます。

ラジコンの実装としては、Arduinoにラジコンのバッテリーを繋ぎ、5Vを制御用、VINをモーター用に電源を回しました。

今回、モータードライバー(TB6612FNG)を使い前進後進を可能にしました。

TB6612FNGはネットに解説ページが無くて配線に悩みましたが、解れば非常に扱いやすい子です。

では、会社で撮った動画をどうぞ!!※撮影禁止区域は映っていないはず。。

趣味で作ったラジコンを会社に持ち込んだりする、こんな私のいるソリューション部ですが、現在人材募集中です。たぶん10月いっぱい。

注) ラジコンは作りません

我こそはと思う方はお問い合わせください。なお、WEB開発経験のある経験者でお願いします。

TB6612FNGり

, , , , , , ,

No Comments

ネットワークラジコンをコントロール

昨晩Macからネットワークを経由し、ラジコン(組み込みLinuxに繋がったArduino)を操作できました。

ネットワークからArduinoを操作するのに、「Serial Proxy」を使いました。

「Serial Proxy」を使うことで、ストリームからシリアルの制御が可能となります。

Linuxへのインストールは簡単

  1. Arduino公式サイトのダウンロードページの一番下にある「Serial Proxy」のソース版をダウンロードhttp://www.arduino.cc/en/Main/Software
  2. make
  3. serproxy.cfgを設定。comm_baud=9600、serial_device1=/dev/ttyUSB0に設定
  4. ./serproxy を実行

あとはProcessingのコードをストリーム用に修正。

以下は実際に利用したWiiハンドルからネットワーク越しにラジコンを操作するコードです。

# ハンドル周りに角度変更後の値から±5~10度の遊びを加えると操作しやすくなります(たぶん


import lll.wrj4P5.*;
import lll.Loc.*;
import processing.net.*;

float i = 0.0;
float angle = 0.0;
int kakudo = 0;
int old_kakudo = 0;

Wrj4P5 wii;
LinkedList p = new LinkedList();
Client client;

void setup() {

size(300,300,P3D);

wii=new Wrj4P5(this).connect();

client = new Client(this, “10.0.2.2”, 5331);

smooth();

rectMode(CENTER);

}

void draw() {

if (wii.isConnecting()) return;

stroke(32);

fill(255);

ellipse(width/2, height/2, width/1.6, width/1.6);

translate(width/2,height/2);

rotate( atan2(wii.rimokon.sensed.y , wii.rimokon.sensed.x ) );

fill(0);

rect(0,0,width/2,height/7);

angle = atan2(wii.rimokon.sensed.y , wii.rimokon.sensed.x ) * 180 / PI;

if (angle > 0) {

kakudo = int(angle) -90;

kakudo = 180 – kakudo;

}

if (angle < 0) {

kakudo = int(angle) * -1 -90;

}

kakudo = int(kakudo * 0.1) * 10;

if (kakudo >= 65 && kakudo <= 115) kakudo = 90;

if (kakudo >= 115 && kakudo <= 135) kakudo = 115;

if (kakudo >= 135) kakudo = 135;

if (kakudo >= 45 && kakudo <= 65) kakudo = 65;

if (kakudo <= 45) kakudo = 45;

if (old_kakudo != kakudo){

old_kakudo = kakudo;

client.write(str(kakudo) + “sn”);

println(client.read());

}

}

void buttonPressed(RimokonEvent evt,int rid){

if (evt.wasPressed(evt.TWO)) {

client.write(“255wn”);

}

if (evt.wasPressed(evt.ONE)) {

client.write(“150wn”);

}

}
void buttonReleased(RimokonEvent evt,int rid){

if (evt.wasReleased(evt.TWO)) {

client.write(“0wn”);

}

if (evt.wasReleased(evt.ONE)) {

client.write(“0wn”);

}

}

以上です。

「Serial Proxy」を使うとFlashなどからもArduinoの操作が可能となります。何が出来るか想像するだけでご飯が3杯は食べれます。もっと?

Arduinoを始めてからここまで2週間かかりました。Amazonの商品発送が9/1なので間違いないです。

平日は仕事しながら家で開発してましたので結構疲れました。

次回はラジコンを操作している動画のアップを予定してます。 # Serial Proxyとの通信に不具合があるので調整中です。

おまけ:Processing 1.0.7 を利用することでMacの64bitでもwiiリモコンを操作できました。

, , , , , , , , , , , , , , ,

2 Comments

wiiリモコンの制御

昨夜組み込みLinuxのインストールも終え、もうすぐラジコンが完成します。

今日は、Wiiリモコンの制御について書きます。

wiiリモコンの制御にはProcessing 1.0.6を使いました。

ProcessingでWiiリモコンを扱うにはライブラリの用意が必要です。

今回はwrj4P5.jar (alpha-011)を利用しますので以下を用意しました。

  • Loc.jar (beta 005)
  • avetanabt-20070719.tgz or bluecove-2.1.0.jar
  • WiiRemoteJ v1.6.zip.gz

avetanabtはLinuxで利用する以外は有料ですので、macやwindowsの方はbluecoveがおすすめです。

Linux用のbluecove-2.1.0は幾つかのライブラリが不足してますので、avetanabtがおすすめです。

私の環境では、Linux(ubuntu)とMacの両方にwrj4P5をインストールしました。

インストールに手間取った点を書きますと、

Macでは、wrj4P5を利用する際、Javaを64bit から 32bit に変更が必要でした。ここが解らず悩みました。

LinuxではaventaBTのインストールに若干手間取りました。

以下は参考までにインストールログです。

$ mkdir ~/src/aventaBT
$ cd ~/src/aventaBT
$ wget "http://downloads.sourceforge.net/project/avetanabt/avetanabt/20070719/avetanabt-20070719.tgz?use_mirror=jaist"
$ tar xvzf avetanabt-20070719.tgz
$ sudo aptitude install autoconf2.13
$ sudo aptitude install g++
$ export JDK_HOME=/usr/lib/jvm/java-6-sun
$ export BIN_DIR=/home/[user]/src/aventaBT/binaries
$ ./install
$ cp binaries/avetanaBT.jar ~/src/processing-1.0.6/libraries/wrj4P5/library

以上で、インストール出来たとしまして、ハンドルの制御コードは以下になります。


import lll.wrj4P5.*;
import lll.Loc.*;

float angle = 0.0;

Wrj4P5 wii;
LinkedList p = new LinkedList();

void setup() {

size(300,300,P3D);

wii=new Wrj4P5(this).connect();

smooth();

rectMode(CENTER);

}

void draw() {

if (wii.isConnecting()) return;

stroke(32);

fill(255);

ellipse(width/2, height/2, width/1.6, width/1.6);

translate(width/2,height/2);

rotate( atan2(wii.rimokon.sensed.y , wii.rimokon.sensed.x ) );

fill(0);

rect(0,0,width/2,height/7);

}

wii リモコンはラジアン値を返しますので、角度を求める場合は以下の公式になります。

angle = atan2( y , x ) * 180 / PI;

角度を求めれたことでハンドルの制御も計算しやすくなりましたね。

これにシリアル通信のコードを加えることで、Arudinoの制御が出来ます。

今回は以上です。

, , , , , , , , , , , , ,

No Comments

サーボのコントロール

昨夜は遅くまでラジコンに実装予定の組み込みLinuxを触ってました。

組み込みLinuxのファーストステップとして、シリアル接続が前提となるのですが、RS-232シリアルケーブルがそのまま繋がると思っていましたら、組み込みのRS-232 は10pin だったのです!

9pinのRS-232 ケーブルは用意してたのですが、これには困りました。

実際使われるpinはTX/RX、GNDと3本のケーブルのみでしたので、ピンを直刺しすることで対応できました。

また、この話は後日まとめてから書きます。

今日はサーボの制御について書きます。

サーボの制御はArduinoというイタリア生まれのマイコンで行っています。

普通の基盤だと決まったことしか出来ませんが、Arduinoは普通の基盤と違い配線の仕方と、プログラム制御で様々なことが出来ます。

サーボのコントロール方法は、パルス幅の信号長で角度を制御します。

実際はサーボ向けにライブラリがあり、角度を指定するだけで制御が行えます。

気をつける点としては、ラジコンのシャーシの稼動域よりもサーボの稼動域が広いことです。

サーボの稼動域がシャーシの稼動域を超えるとサーボが負荷で嫌な音を立てて潰れます。

実際に潰しましたので間違いないです!

なので先にサーボを取り外し、ラジコンに付属のプロポと同じ稼動域であるか、確認をオススメします。

以下はサーボと前後のモーターをシリアル通信で制御するコードです。

Arduinoでは短いコードで簡潔に書けます。

よろしければ参考ください。

#include
#define servoPin 9
#define Motor 3
Servo myservo;

void setup()
{

pinMode(Motor,OUTPUT);

myservo.attach(servoPin);

Serial.begin(9600);

Serial.println(“Ready”);

}

void loop() {

static int v = 0;

if ( Serial.available() > 0) {

char ch = Serial.read();

switch(ch) {

case ‘0’…’9′:

v = v * 10 + ch – ‘0’;

break;

case ‘s’:

if (v <= 45) v = 45;

if (v >= 135) v = 135;

myservo.write(v);

Serial.print(v);

Serial.println(‘s’);

v = 0;

break;

case ‘w’:

if (v <= 0) v = 0;

if (v >= 255) v = 255;

analogWrite(Motor,v);

Serial.print(v);

Serial.println(‘w’);

v = 0;

break;

}

}

}

以下は簡易な回路図のつもりです。
電源は外部電源を利用してます。外部電源はvinのpinから電源を引きます。
サーボ制御

回路図に1点間違いがありました。
モーターからのワイヤはモスの真ん中にさします。モスに繋がるマイナス電源は端にさします。

, , , , ,

19 Comments

パソコンからラジコンを操作

はじめまして。ラボに初参加のinfoaliveのo2です。

時々書かせていただきますのでお見知りおきください。

普段はAMP(Apache,MySQL,PHP) で開発してますが、趣味でマイコンの制御を始めましたので、マイコンの事を書かせていただきます。

マイコンは1週間前まで触ったことすらなかったのですが、唐突にパソコンからラジコンの制御がしたくなり始めました。

きっかけはJoker Racerを見て、これは面白い是非やってみようと思った次第です。

Joker Racerはインターネットを通じて実物のラジコンを操作するサービスです。説明終わり。

では早速、インターネットを通じてラジコンを操作するにはどうすればいいかを考えます。

ラジコンをパソコンから操作するにはマイコンをパソコンに繋げば出来そうです。

マイコンが制御するのは左右に動作するサーボモーターと、前後の動作をするモーターの2つを制御することになります。

ラジコンに直接パソコンのような大きなものは乗りませんので、組み込み系に使われるARMのLinuxを利用します。

LinuxにはWEBカメラと無線LANを積めば遠隔からも操作ができますね。

ラジコンのハンドリングはキーボードで操作するのは面白くないのでWiiリモコンを利用することにします。

現段階では、パソコンにマイコンを繋いだ状態でラジコンの制御が出来るところまで完成してます。

詳しくは追々書くとしまして、Youtubeにアップした動画をどうぞ!

, , , , , ,

No Comments