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);

}

}

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

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

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

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

, , , , , , ,

コメントはまだありません


その後のラジコン

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

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

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

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

ハード構成図

ネットワーク構成図

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

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

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

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

, , , , , ,

5件のコメント


会社で走らせました

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

TB6612FNGり

, , , , , , ,

コメントはまだありません


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

昨晩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) + “s\n”);

println(client.read());

}

}

void buttonPressed(RimokonEvent evt,int rid){

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

client.write(“255w\n”);

}

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

client.write(“150w\n”);

}

}
void buttonReleased(RimokonEvent evt,int rid){

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

client.write(“0w\n”);

}

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

client.write(“0w\n”);

}

}

以上です。

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

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

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

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

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

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

2件のコメント


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の制御が出来ます。

今回は以上です。

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

コメントはまだありません



SetPageWidth