robo8080のブログ

ロボット製作や電子工作など。

RCサーボモータをmbed+LAN+ProcessingでGUI制御(その2) 【Processing編】

2012年04月07日 | 電子工作

【概要】

PC(Processing)からLAN(TCP)通信でコマンドを送信して、mbed側でRCサーボモータを制御する。

ここを参考にさせてもらった。
参考にさせてもらったのはGainer用なので、TCP通信処理を追加してmbed側のサーボを制御出来るようにした。

mbed側のプログラムは(その1)を参照してください。

【画面】

 

準備】

 ControlP5というGUIのライブラリを使用しているので、事前にインストールしておく必要がある。
 ダウンロード&インストール方法はこちら。 http://www.sojamo.de/libraries/controlP5/


【Processingのプログラム

注意1:使用するIPアドレス、ポートNo.は使用する環境に合わせて変更してください。

注意2:異常処理は手抜きしているので必要に応じて追加してください。

//---------ここから-----------------------------------------------

/*
 * Servo Controler
 */

import controlP5.*;
import processing.net.*;

ControlP5 controlP5;
Client myClient;

int[] cmd1 = {255,0,4,0,128,128,128};
boolean init = false;

void setup() {
  size(290,290);
 
  Textlabel title;
  controlP5 = new ControlP5(this);

  title = controlP5.addTextlabel("title", "Servo Controller",10,10);
  title.setHeight(30);
  title.setWidth(400);
  title.setFont(ControlP5.synt24);

  // create sliders
  for (int i = 0 ; i < 3 ; i++ ) {
    // add a vertical slider
    controlP5.addSlider("servo" + i, 0, 255, 90, (50 + i * 80), 60, 10, 181);
    Slider ss = (Slider)controlP5.controller("servo" + i);
    ss.setNumberOfTickMarks(7);
    ss.setSliderMode(Slider.FLEXIBLE);
    ss.snapToTickMarks(false);
    ss.setValue(128);
  }
  myClient = new Client(this, "192.168.0.100", 10002);
 init = true;
}

void draw() {
  background(100);
}

void servoCmd(int[] data)
{
  if(!init) return;
  for(int i = 0; i < data.length; i++)
  {
    myClient.write((byte)data[i]);
  }
}

void servo0(int value) {
  cmd1[4] = value;
  servoCmd(cmd1);
}
void servo1(int value) {
  cmd1[5] = value;
  servoCmd(cmd1);
}
void servo2(int value) {
  cmd1[6] = value;
  servoCmd(cmd1);
}

//---------ここまで-----------------------------------------------

 

動画はこちら。

mbedにTCPで接続してRCサーボモータを動かしてみた。

 

【応用例編】にづづく...―


RCサーボモータをmbed+LAN+ProcessingでGUI制御(その1) 【mbed編】

2012年04月07日 | 電子工作

【概要】

 PC(Processing)からLAN(TCP)通信でコマンドを受けて、mbed側でRCサーボモータを制御する。

 ベースボードにはStarBoard Orangeを使用した。

 RCサーボモータの電源+5VはUSBからは取らずに、ACアダプターから供給する。

 Processing側のプログラムは(その2)を参照してください。

 



【配線】(サーボ1個分のみ示す)

 mbed側             RCサーボモータ側(メーカによって色が異なるので注意)

      P21 ―――――――― 白(黄)

      VIN  ―――――――― 赤

      GND ―――――――― 黒



【通信コマンドのフォーマット】


【mbed側のプログラム】

以下のライブラリをインポートしておく。

・EthernetNetIf

・Servo

・TextLCD (必要に応じて)

//---- ここから --------------------------------------------
// 異常処理は手抜きしているので必要に応じて追加してください。

#include "mbed.h"
#include "EthernetNetIf.h"
#include "TCPSocket.h"
#include "TextLCD.h"
#include "Servo.h"

TextLCD lcd(p24, p26, p27, p28, p29, p30); // rs, e, d0-d3
Servo servo1(p21);
Servo servo2(p22);
Servo servo3(p23);

//EthernetNetIf eth;                // <-DHCPを使うときはこちらを使う
EthernetNetIf eth(                  // ここは自分の環境に合わせて変更する
    IpAddr(192,168,0,100),      // mbedに割り当てるIPアドレス
    IpAddr(255,255,255,0),      // MASK
    IpAddr(192,168,0,200),      // GATEWAY
    IpAddr(192,168,0,200)       // DNS
    );
TCPSocket listensock;
TCPSocket *sock;
Serial pc(USBTX, USBRX);

unsigned char buff[30];
int RecvCount = 0;
int ParamLen = 0;
int ParamCount = 0;
void Recv(unsigned char data);
void ServoCmdExec();

void onTCPSocketEvent (TCPSocketEvent e) {
    switch (e) {
        case TCPSOCKET_CONNECTED: //
            break;

        case TCPSOCKET_WRITEABLE: //
            break;

        case TCPSOCKET_READABLE: { //
            char buf[300];
            int len;
            len = sock->recv(buf, sizeof(buf));
            for (int i = 0; i < len; i++) {
                Recv((unsigned char)buf[i]);
            }
        }
        break;

        case TCPSOCKET_DISCONNECTED:
        case TCPSOCKET_CONTIMEOUT:
        case TCPSOCKET_CONRST:
        case TCPSOCKET_CONABRT:
        case TCPSOCKET_ERROR:
            sock->close();
            break;
    }
}

void onTCPListenSocketEvent (TCPSocketEvent e) {
    if (e == TCPSOCKET_ACCEPT) {
        Host client;

        if (listensock.accept(&client, &sock) != TCPSOCKET_OK) {
            return;
        }

        printf("Connected from %d.%d.%d.%d\r\n", (unsigned char)client.getIp()[0], (unsigned char)client.getIp()[1], (unsigned char)client.getIp()[2], (unsigned char)client.getIp()[3]);

        sock->setOnEvent(&onTCPSocketEvent);
    }
}

int main () {
    pc.baud(115200);
    Host local(IpAddr(), 10002);
    RecvCount = 0;
    ParamLen = 0;
    ParamCount = 0;
    servo1 = 0.5f;
    servo2 = 0.5f;
    servo3 = 0.5f;
    lcd.printf("OK");

    if (eth.setup()) {
        return -1;
    }

    listensock.setOnEvent(&onTCPListenSocketEvent);
    if (listensock.bind(local) != TCPSOCKET_OK) {
        return -1;
    }
    if (listensock.listen() != TCPSOCKET_OK) {
        return -1;
    }

    while (1) {
        Net::poll();
    }
}
void Recv(unsigned char data) {
    switch (RecvCount) {
        case 0:
            ParamLen = 0;
            ParamCount = 0;
            if (data == 0xff) { // Headder
                buff[RecvCount++] = data;
            }
            break;
        case 1:
            if (data == 0) {    // ID
                buff[RecvCount++] = data;
            }
            break;
        case 2:                 // LENGTH
            buff[RecvCount++] = data;
            ParamLen = data;
            break;
        default:
            if (ParamLen > 0) {
                buff[RecvCount++] = data;
                ParamCount++;
                if (ParamCount >= ParamLen) {
                    ServoCmdExec();
                    RecvCount = 0;
                }
            } else {
                RecvCount = 0;
            }
            break;
    }
}
void ServoCmdExec() {
    float tmp1 = (float)buff[4]/255.0f;
    float tmp2 = (float)buff[5]/255.0f;
    servo1 = tmp1;
    servo2 = tmp2;
    servo3 = (float)buff[6]/255.0f;

    lcd.locate(0,0);
    lcd.printf("servo1 = %02Xh %.1f",buff[4],tmp1);
    lcd.locate(0,1);
    lcd.printf("servo2 = %02Xh %.1f",buff[5],tmp2);
}

//---- ここまで --------------------------------------------

 

動画はこちら。

mbedにTCPで接続してRCサーボモータを動かしてみた。

 

【Processing編】につづく...―

 

ここを参考にさせていただいた。

TCPSocket - TCPソケット

mbedで初めてのマイコン開発 その3パソコンからmbedを遠隔制御してみよう!

 


4月6日(金)のつぶやき

2012年04月07日 | 日記
10:29 from Tweet Button  [ 1 RT ]
なるほどね~ --- Linux での無線 LAN 「そもそも、動作していたことが奇跡だった」 - インターネットコム japan.internet.com/webtech/201204… @jic_newsさんから

12:49 from Tweet Button
おぉ、おもしろそう!! --- 【PC Watch】 プリンストン、Bluetooth HIDを再現するアダプタ ~接続したPCでスマートフォンなどを操作可能 pc.watch.impress.co.jp/docs/news/2012… @pc_watchさんから

by robo8080 on Twitter