Posts Tagged RS-232

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

昨晩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

サーボのコントロール

昨夜は遅くまでラジコンに実装予定の組み込み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