ショッピングカート: 0 アイテム
カートは空です
メニュー
【組立済】3WDオムニホイールロボット(三角タイプ) (10003)
  • 【組立済】3WDオムニホイールロボット(三角タイプ) (10003)
  • 【組立済】3WDオムニホイールロボット(三角タイプ) (10003)
  • 【組立済】3WDオムニホイールロボット(三角タイプ) (10003)

【組立済】3WDオムニホイールロボット(三角タイプ) (10003)

モデル:4571398312915

メーカー: Nexus robot

115,071円(税込)
付与ポイント:1150pt

在庫数: 2点

本商品は組み立ての必要がない、ホイールを取り付け済みの商品です。

ロボット導入時にご活用いただける日本語マニュアルをご用意いたしました。

3WDオムニホイール台車ロボット

3つのオムニホイールと超音波センサーを搭載した高さを抑えた台車ロボット

100mmのオムニホイールを搭載した台車ロボットです。Nexusロボットの100mmオムニホイールを搭載したロボットの中では、高さが108cmと低い仕様です。高さを抑えていますが天板を備え付けており、上に物を載せられるスペースがあります。
本体はアルミ合金製で、様々なオプションパーツの追加に対応した取り付け穴が用意されています。また、外周3か所に超音波センサーが取付けられており、周囲の衝突回避などに役立ちます。

100mmプラスチックオムニホイール

モーターの回転方向だけで全方位への移動が可能

三輪のオムニホイールにエンコーダ式モータを搭載、各車輪の回転速度や回転方向を変えるだけで、あらゆる方向への移動が可能となっています。
複雑になりがちなステアリング機構の制御なども必要なく、各ホイールの回転方向を制御するのみで全方位移動が可能です。

Arduino互換ボード

Arduino互換ボードとIO拡張ボードを搭載

14本のデジタル入力/出力ピン(このうち6本はPWM出力として使えます)と8本のアナログ入力、1個の16 MHz クリスタル発振器、1個のUSBコネクター、1個のパワージャック、1個のICSPヘッダーと1個のリセットボタンを搭載したArduino互換ボードを搭載しております。
マイクロコントローラーをサポートするのに必要な機能を全て装備しています。このボードによりC、C++でのプログラミングが可能となっています。

プログラミングソフトウェア_ArduinoIDE

開発環境は無償で利用可能な「Arduino IDE」

Arduino(アルディーノ/アルドゥイーノ)はオープンソースのハードウェアとして開発されているため、世界中で公開されている膨大な量のサンプルコードを利用し、簡単にプログラムすることが可能です。
本商品もArduino互換ボードを採用しておりますので、無償で利用可能なArduinoIDEを用いてのプログラミングが可能です。まずはご購入後にダウンロード可能なサンプルプログラムを参考に、様々な応用をお試しください。
※プログラムの内容や改変などについてのサポートは付属しておりません。

日本語マニュアルあります

日本語マニュアルをご用意

本商品をご利用の際は、英語マニュアルをご参照いただく形となっておりましたが、この度、ご利用にあたっての導入部分を日本語訳した日本語マニュアルをご用意いたしました。
導入にあたり不明な点を日本語にてカバーしておりますので、安心して初期のセットアップに取り組んでいただけます。
日本語マニュアルはヴイストン ロボットショップにてご購入いただいたものにのみ付属しております。

※あくまで初期導入部分に限らせていただいております。詳細なプログラムの内容などは英語マニュアルをご参照ください。

ダウンロードページはこちら(商品に同梱のID、パスワードが必要です)

主な特徴

  • アルミ合金製の本体
  • 超音波センサー搭載
  • C、C++でのプログラミングが可能
  • エンコーダ式DCモーター
  • 拡張用ネジ取り付け用穴、スペアスペース付き

※ホイールのみ外れた状態で納品となります。お客様での取り付けが必要です。
また、バッテリーのコネクターは外れた状態が基本です。動作前にコネクターの接続を行なってください。

回転方向による移動特性

オムニホイール移動方向

パーツリスト


Vstone公式YouTubeチャンネル

YouTubeチャンネルにて、弊社製品を題材とした解説動画や活用動画などを配信しております。 毎週配信を目標に取り組んでおりますので、動画をお楽しみ頂けましたらチャンネル登録・高評価をお願いします!!

Vstoneチャンネルはこちら


【再生リスト】

Nexus robot サンプル動作

台車ロボット【解説・開発】

製品仕様

サイズ330(W)×190(D)×108(H)[mm]
重量約3.5kg
負荷重量15kg
速度0.6m/s
モーター動力12W
モーター12V エンコーダ式DCモーター
電源12V Ni-Mh バッテリー

モーター仕様

型式Faulhaber 12V DCコアレスモーター
動力17W
非負荷時速度8100RPM/minute
定格回転数120RPM/minute
直径30mm
長さ42mm
総長さ85mm
シャフトの直径6mm
シャフトの長さ35mm
非負荷時の電流75mA
負荷電流1400mA
ギアボックス比率64:1
ロックドロータートルク50Kg・cm
連続トルク17kg・cm

エンコーダ仕様

型式光学式
エンコーダ位相AB
エンコーダ解像度12CPR

CPUボード仕様

マイクロコントローラーATmega168
作動電圧5V
入力電圧 (推奨)7-12V
入力電圧(可能範囲)6-20V
デジタルI/O ピン14 (6本はPWM出力として利用可)
アナログ入力ピン8
DC電流40mA(I/Oピン)、50mA(3.3Vピン)
フラッシュメモリー32 KB(2KBはブートローダ用)
SRAM1KB(ATmega168) または 2KB(ATmega328)
EEPROM512バイト(ATmega168)もしくは1KB(ATmega328)
クロックスピード16 MHz

※製品仕様その他は、予告なく変更する場合がございます。

各種ダウンロード

※サンプルソースのダウンロードには購入時に同梱のID、パスワードが必要です。
※本商品のマニュアルは全て英語表記となります。
※プログラムを書き込む際にエラーが発生する場合はこちらをご確認ください。
※Nexus robot商品につきましての補償対応は初期不良の場合のみとなっております。開発に関するサポート、ご利用上での破損についての対応は受け付けておりません。

【関連商品】

各種ホイール部品はこちらからご確認いただけます。※PC専用画面

予備バッテリーにどうぞ


Nexusロボット XBee無線操作サンプルプログラム

このプロジェクトは「Arduino 328互換コントローラー用IO拡張ボード」を搭載している、 3輪オムニタイプのNexusロボットの製品をXBeeで無線操作するためのサンプルプログラムです。

使用物品一覧

本サンプルプログラムの動作確認に使用した物品は以下の通りです。

  1. Nexusロボット 3WDオムニホイールロボット(円形タイプ)
  2. Freaduino UNO
    Arduino UNOの互換ボードです。製品情報は下記のサイトをご覧ください。
    Freaduino UNO
  3. XBee S2C
    小型の無線通信モジュールです。
    Nexusロボット用、Freaduino用で合計2個必要です。
    XBee S2C / ワイヤアンテナ型
  4. XBee用ピッチ変換基板
    XBeeを2mmピッチに2.54mmピッチに変換する基板です。
    XBee用ピッチ変換基板
  5. XBee USBアダプター
    XBeeをUSB経由でPCに接続するためのアダプタです。
    XBeeで無線通信をするためには、PCを使用して設定を変更する必要があります。
    XBee USBアダプター
    なお、XBeeの設定には専用ソフト「X-CTU」が必要です。X-CTUは下記のサイトから入手することができます。
    X-CTU
  6. OctopusADキーパッド
    5つのボタンの入力状態をアナログ値として出力するボードです。
    製品情報は下記のサイトをご覧ください。
    OctopusADキーパッド
プログラム一覧・詳細

本プロジェクトに含まれているプログラム一覧、およびその詳細は以下の通りです。

  1. XBeeReciever
    Nexusロボット本体をXBee経由で操作するプログラムです。
    「Arduino 328互換コントローラー用IO拡張ボード」を搭載している、3輪オムニタイプのNexusロボットの製品に使用できます。
    オムニホイールを4輪使用するタイプのロボットや、メカナムホイールタイプのロボットで使用する場合は修正が必要です。
    「Arduino 328互換コントローラー用IO拡張ボード」のジャンパは、こちらの画像に合わせて設定してください。
  2. XBeeTransmitter
    Freaduino UNOからXBeeを使用してロボットへコマンドを送信するサンプルプログラムです。
    OctopusADキーパッドをFreaduino UNOの14番ピンに接続します。
    それ以外のピンに接続する場合は、プログラムのアナログ入力の設定を修正してください。
関連情報

NexusRobotに関する情報は製品サイトや製品マニュアル、サンプルプログラムをご参照ください。
また、XBeeの設定や、XBeeとArduinoとの接続・通信方法の詳細などにつきましては、下記のような各種参考サイトをご参照ください。


【サンプルコード集】

使用機体:3WD48mmオムニホイールロボット (10014)

超音波センサーによる衝突防止プログラム

#include SONAR.h>
#include Servo.h>

unsigned long currMillis=0;
SONAR sonar11(0x11),sonar12(0x12),sonar13(0x13);

#define MOTOR1_E 9
#define MOTOR2_E 10
#define MOTOR3_E 11
#define FORWORD 0
#define STOP 1
#define BACK 2
//**********************************************//
unsigned char motor1_Ctrl[3] = {60,45,30};
unsigned char motor2_Ctrl[3] = {60,45,30};
unsigned char motor3_Ctrl[3] = {60,45,30};
unsigned short distBuf[3];

Servo wheels;

int sonarUpdate() {
static unsigned char sonarCurr=1;
if(sonarCurr==3) sonarCurr=1;
else sonarCurr=0;
if(sonarCurr==1) {
distBuf[1]=sonar12.getDist();
sonar12.trigger();
sonar12.showDat();
} else if(sonarCurr==2) {
distBuf[2]=sonar13.getDist();
sonar13.trigger();
sonar13.showDat();
} else {
distBuf[0]=sonar11.getDist();
sonar11.trigger();
sonar11.showDat();
}
return sonarCurr;
}

//*************************************************//
void goAhead(){
analogWrite(MOTOR1_E, motor1_Ctrl[STOP]);
analogWrite(MOTOR2_E, motor2_Ctrl[BACK]);
analogWrite(MOTOR3_E, motor3_Ctrl[FORWORD]); // Revese
}
//*************************************************//
void getBack(){
analogWrite(MOTOR1_E,motor1_Ctrl[STOP]);
analogWrite(MOTOR2_E,motor2_Ctrl[FORWORD]);
analogWrite(MOTOR3_E,motor3_Ctrl[BACK]);
}
//************************************************//
void turnLeft(){
analogWrite(MOTOR1_E,motor1_Ctrl[FORWORD]); //Revese
analogWrite(MOTOR2_E,motor2_Ctrl[BACK]); //forward
analogWrite(MOTOR3_E,motor3_Ctrl[STOP]); //forward
}
void turnRight(){
analogWrite(MOTOR1_E,motor1_Ctrl[BACK]); //forward
analogWrite(MOTOR2_E,motor2_Ctrl[STOP]); //Revese
analogWrite(MOTOR3_E,motor3_Ctrl[FORWORD]); //Revese
}
//************************************************//
void RotateRight(){
analogWrite(MOTOR1_E,motor1_Ctrl[BACK]);
analogWrite(MOTOR2_E,motor2_Ctrl[BACK]);
analogWrite(MOTOR3_E,motor3_Ctrl[BACK]);
}
//*************************************************//
void RotateLeft(){
analogWrite(MOTOR1_E,motor1_Ctrl[FORWORD]);
analogWrite(MOTOR2_E,motor2_Ctrl[FORWORD]);
analogWrite(MOTOR3_E,motor3_Ctrl[FORWORD]);
}
//**************************************************//
void judge(){
if(distBuf[0]>=30){
if(distBuf[1]<=10 && distBuf[2]>10) turnRight();
else if(distBuf[2]<=10 && distBuf[1]>10) turnLeft();
else if(distBuf[1]<=10 && distBuf[2]<=10) RotateLeft();
else goAhead();
}else RotateLeft();
}
//**************************************************//
void allStop(){
analogWrite(MOTOR1_E, motor1_Ctrl[STOP]);
analogWrite(MOTOR2_E, motor2_Ctrl[STOP]);
analogWrite(MOTOR3_E, motor3_Ctrl[STOP]);
}
//*************************************************//
//void (*motion[8])()={ goAhead,RotateLeft,turnRight,RotateLeft,turnLeft,RotateLeft,judge,allStop}; //change the
void (*motion[8])()={ goAhead,RotateLeft,turnRight,RotateLeft,turnLeft,RotateLeft,goAhead,allStop}; //change the

void demowithSosars(){
unsigned char sonarcurrent=0;
if(millis()-currMillis>50/*SONAR::duration*/){ //judge if the time more than SONAR::duration;
currMillis=millis();
//sonarcurrent= sonarUpdate(); //if the requirement was ture call the function;
//Serial.println(distBuf[sonarcurrent]) ;
}
sonarUpdate();
//if(sonarcurrent==3){
if(distBuf[0] > 10){
analogWrite(MOTOR2_E, motor2_Ctrl[BACK]);
analogWrite(MOTOR3_E, motor3_Ctrl[FORWORD]);
//wheels.write(83);
}
else{
analogWrite(MOTOR2_E, motor2_Ctrl[STOP]);
analogWrite(MOTOR3_E, motor3_Ctrl[STOP]);
//wheels.write(83);
}
//delay(200);
/*unsigned char bitmap = (distBuf[0] < 20);//front
bitmap |= (distBuf[1]<20) <<1; //left
bitmap |= (distBuf[2]<20) <<2; //right:
Serial.print("bitmap=");
Serial.println(bitmap,DEC);
(*motion[bitmap])();*/
//}
}

void demoaction(){
for(int i=0;i<7;i++){
(*motion[i])();
Serial.println(i);
delay(10000);

}
}
//*************************************************//

void setup() {

TCCR1B=TCCR1B&0xf8|0x04;
TCCR2B=TCCR2B&0xf8|0x06;

//pinMode(MOTOR1_E, OUTPUT);
pinMode(MOTOR2_E, OUTPUT);
pinMode(MOTOR3_E, OUTPUT);
//wheels.attach(MOTOR1_E);

//wheels.write(83);p
delay(2000);
SONAR::init(); //call the init() from SONAR.h;

//Serial.begin(9600) ;
}
void loop(){
demowithSosars();
//demoaction();
}

本サンプルコードの解説:【その7】Nexus Robot 3WDオムニホイールロボットをぶつからない車にしてみた
三角関数を用いたオムニホイールの制御

#include SONAR.h>
#include Servo.h>

unsigned long currMillis=0;
SONAR sonar11(0x11),sonar12(0x12),sonar13(0x13);

#define MOTOR1_E 9
#define MOTOR2_E 10
#define MOTOR3_E 11
#define FORWORD 0
#define STOP 1
#define BACK 2
//**********************************************//
unsigned char motor1_Ctrl[3] = {60,45,30};
unsigned char motor2_Ctrl[3] = {60,45,30};
unsigned char motor3_Ctrl[3] = {60,45,30};
unsigned short distBuf[3];

Servo wheels;

int sonarUpdate() {
static unsigned char sonarCurr=1;
if(sonarCurr==3) sonarCurr=1;
else sonarCurr=0;
if(sonarCurr==1) {
distBuf[1]=sonar12.getDist();
sonar12.trigger();
sonar12.showDat();
} else if(sonarCurr==2) {
distBuf[2]=sonar13.getDist();
sonar13.trigger();
sonar13.showDat();
} else {
distBuf[0]=sonar11.getDist();
sonar11.trigger();
sonar11.showDat();
}
return sonarCurr;
}

//*************************************************//
void goAhead(){
analogWrite(MOTOR1_E, motor1_Ctrl[STOP]);
analogWrite(MOTOR2_E, motor2_Ctrl[BACK]);
analogWrite(MOTOR3_E, motor3_Ctrl[FORWORD]); // Revese
}
//*************************************************//
void getBack(){
analogWrite(MOTOR1_E,motor1_Ctrl[STOP]);
analogWrite(MOTOR2_E,motor2_Ctrl[FORWORD]);
analogWrite(MOTOR3_E,motor3_Ctrl[BACK]);
}
//************************************************//
void turnLeft(){
analogWrite(MOTOR1_E,motor1_Ctrl[FORWORD]); //Revese
analogWrite(MOTOR2_E,motor2_Ctrl[BACK]); //forward
analogWrite(MOTOR3_E,motor3_Ctrl[STOP]); //forward
}
void turnRight(){
analogWrite(MOTOR1_E,motor1_Ctrl[BACK]); //forward
analogWrite(MOTOR2_E,motor2_Ctrl[STOP]); //Revese
analogWrite(MOTOR3_E,motor3_Ctrl[FORWORD]); //Revese
}
//************************************************//
void RotateRight(){
analogWrite(MOTOR1_E,motor1_Ctrl[BACK]);
analogWrite(MOTOR2_E,motor2_Ctrl[BACK]);
analogWrite(MOTOR3_E,motor3_Ctrl[BACK]);
}
//*************************************************//
void RotateLeft(){
analogWrite(MOTOR1_E,motor1_Ctrl[FORWORD]);
analogWrite(MOTOR2_E,motor2_Ctrl[FORWORD]);
analogWrite(MOTOR3_E,motor3_Ctrl[FORWORD]);
}
//**************************************************//
void judge(){
if(distBuf[0]>=30){
if(distBuf[1]<=10 && distBuf[2]>10) turnRight();
else if(distBuf[2]<=10 && distBuf[1]>10) turnLeft();
else if(distBuf[1]<=10 && distBuf[2]<=10) RotateLeft();
else goAhead();
}else RotateLeft();
}
//**************************************************//
void allStop(){
analogWrite(MOTOR1_E, motor1_Ctrl[STOP]);
analogWrite(MOTOR2_E, motor2_Ctrl[STOP]);
analogWrite(MOTOR3_E, motor3_Ctrl[STOP]);
}
//*************************************************//
//void (*motion[8])()={ goAhead,RotateLeft,turnRight,RotateLeft,turnLeft,RotateLeft,judge,allStop}; //change the
void (*motion[8])()={ goAhead,RotateLeft,turnRight,RotateLeft,turnLeft,RotateLeft,goAhead,allStop}; //change the

void demowithSosars(){
unsigned char sonarcurrent=0;
if(millis()-currMillis>50/*SONAR::duration*/){ //judge if the time more than SONAR::duration;
currMillis=millis();
//sonarcurrent= sonarUpdate(); //if the requirement was ture call the function;
//Serial.println(distBuf[sonarcurrent]) ;
}
sonarUpdate();
//if(sonarcurrent==3){
if(distBuf[0] > 10){
analogWrite(MOTOR2_E, motor2_Ctrl[BACK]);
analogWrite(MOTOR3_E, motor3_Ctrl[FORWORD]);
//wheels.write(83);
}
else{
analogWrite(MOTOR2_E, motor2_Ctrl[STOP]);
analogWrite(MOTOR3_E, motor3_Ctrl[STOP]);
//wheels.write(83);
}
//delay(200);
/*unsigned char bitmap = (distBuf[0] < 20);//front
bitmap |= (distBuf[1]<20) <<1; //left
bitmap |= (distBuf[2]<20) <<2; //right:
Serial.print("bitmap=");
Serial.println(bitmap,DEC);
(*motion[bitmap])();*/
//}
}

void demoaction(){
for(int i=0;i<7;i++){
(*motion[i])();
Serial.println(i);
delay(10000);

}
}
//*************************************************//

void setup() {

TCCR1B=TCCR1B&0xf8|0x04;
TCCR2B=TCCR2B&0xf8|0x06;

//pinMode(MOTOR1_E, OUTPUT);
pinMode(MOTOR2_E, OUTPUT);
pinMode(MOTOR3_E, OUTPUT);
//wheels.attach(MOTOR1_E);

//wheels.write(83);p
delay(2000);
SONAR::init(); //call the init() from SONAR.h;

//Serial.begin(9600) ;
}
void loop(){
demowithSosars();
//demoaction();
}

本サンプルコードの解説:【その8】見よ! これがオムニホイールロボットの真骨頂。Nexus robot 3WDを自由自在にコントロールしてみた
シリアルモニターでの無限回転サーボモーター回転方向制御

#include Servo.h>
#include stdlib.h>

#define MOTOR1 9
#define MOTOR2 10
#define MOTOR3 11

#define FOWORD1 0
#define REVERSE1 164
#define STOP1 83

#define FOWORD2 7
#define REVERSE2 171
#define STOP2 89

#define FOWORD3 6
#define REVERSE3 170
#define STOP3 88

char input[1];
int pos = 0; // サーボのポジション(変数)
int target = 0; // サーボのポジション(変数)
String inString = ""; // 受信文字列用のバッファ

Servo wheels[3];

void setup(){
wheels[0].attach(MOTOR1);
wheels[1].attach(MOTOR2);
wheels[2].attach(MOTOR3);

wheels[0].write(STOP1);
wheels[1].write(STOP2);
wheels[2].write(STOP3);

Serial.begin(9600);

}

// シリアル通信で受信したデータを数値に変換
void serialNumVal(){
while (Serial.available() > 0) { // 受信データがあったら…
int inChar = Serial.read(); // 1バイト読み込む
if (isDigit(inChar)) { // 数値だったら…
inString += (char)inChar; // 文字列を連結する
}
else if(inChar != 'n'){
if(inChar == 97){ //a
target = 0;
Serial.println("Target Change wheel0");
}
else if(inChar == 98){ //b
target = 1;
Serial.println("Target Change wheel1");
}
else if(inChar == 99){ //c
target = 2;
Serial.println("Target Change wheel2");
}
}
if (inChar == 'n') { // 改行コードLFが来たら…
pos = inString.toInt(); // 文字列を数値に変換する
Serial.println(pos);
wheels[target].write(pos);
//wheels[0].writeMicroseconds(pos);
inString = ""; // バッファクリア
}
}
}

void loop(){
serialNumVal();
/*
wheels[0].write(FOWORD1);
delay(2000);
wheels[0].write(STOP1);
delay(2000);
wheels[0].write(REVERSE1);
delay(2000);
wheels[0].write(STOP1);
delay(2000);


wheels[1].write(FOWORD2);
delay(2000);
wheels[1].write(STOP2);
delay(2000);
wheels[1].write(REVERSE2);
delay(2000);
wheels[1].write(STOP2);
delay(2000);


wheels[2].write(FOWORD3);
delay(2000);
wheels[2].write(STOP3);
delay(2000);
wheels[2].write(REVERSE3);
delay(2000);
wheels[2].write(STOP3);
delay(2000);
*/
}
本サンプルコードの解説:【その9】ロボット制御の舞台裏!? シリアルモニターで各車輪の動きを調整してみた
キーボードによるロボットコントロール(ArduinoとPythonでのプログラムが必要)

Arduino
--------------------------------------------
#include Servo.h>

#define MOTOR1 9
#define MOTOR2 10
#define MOTOR3 11

#define FOWORD1 0
#define REVERSE1 164
#define STOP1 83

#define FOWORD2 7
#define REVERSE2 171
#define STOP2 89

#define FOWORD3 6
#define REVERSE3 170
#define STOP3 88

Servo wheels[3];

void setup(){
wheels[0].attach(MOTOR1);
wheels[1].attach(MOTOR2);
wheels[2].attach(MOTOR3);

wheels[0].write(STOP1);
wheels[1].write(STOP2);
wheels[2].write(STOP3);

Serial.begin(9600);
}

void loop(){
int inputchar; //入力状態の読み取りに使う

inputchar = Serial.read(); //シリアル通信で送信された値を読み取る

if(inputchar!=-1){
switch(inputchar){
case 'g':
wheels[0].detach();
wheels[1].attach(MOTOR2);
wheels[2].attach(MOTOR3);
wheels[1].write(FOWORD2);
wheels[2].write(REVERSE3);
break;

case 'b':
wheels[0].detach();
wheels[1].attach(MOTOR2);
wheels[2].attach(MOTOR3);
wheels[1].write(REVERSE2);
wheels[2].write(FOWORD3);
break;

case 'r':
wheels[0].attach(MOTOR1);
wheels[1].attach(MOTOR2);
wheels[2].detach();
wheels[0].write(REVERSE1);
wheels[1].write(FOWORD2);
break;

case 'l':
wheels[0].attach(MOTOR1);
wheels[1].attach(MOTOR2);
wheels[2].detach();
wheels[0].write(FOWORD1);
wheels[1].write(REVERSE2);
break;
default:
wheels[0].detach();
wheels[1].detach();
wheels[2].detach();
break;
}
}
}
--------------------------------------------

Python
--------------------------------------------
#coding:utf-8

import serial
from msvcrt import getch

def main():
#ポートとbaudレートの設定してシリアル通信を開始
with serial.Serial('COM3',9600,timeout=1) as sr:
while True:
#キーボードの入力判定
#入力に合わせて特定のコマンドを送信
key = ord(getch())
if key == 80:
flag=bytes('b','utf-8')
sr.write(flag)
elif key==72:
flag=bytes('g','utf-8')
sr.write(flag)
elif key==75:
flag=bytes('r','utf-8')
sr.write(flag)
elif key==77:
flag=bytes('l','utf-8')
sr.write(flag)
elif key==27:
break;
else:
flag=bytes('q','utf-8')
sr.write(flag)

#Escキー押されたら終了
sr.close()

if __name__ == "__main__":
main()
--------------------------------------------

本サンプルコードの解説:【その10】シリアル通信でNexus Robotをパソコンから操縦してみた
カメラユニット(Pixy)を用いた機能拡張例(物体追跡)

#include Servo.h>
#include SPI.h>
#include Pixy.h>

Pixy pixy;

#define MOTOR1 9
#define MOTOR2 10
#define MOTOR3 7

#define FOWORD1 0
#define REVERSE1 164
#define STOP1 83

#define FOWORD2 7
#define REVERSE2 171
#define STOP2 91

#define FOWORD3 6
#define REVERSE3 170
#define STOP3 89

Servo wheels[3];

void setup(){
pixy.init();

wheels[0].attach(MOTOR1);
wheels[1].attach(MOTOR2);
wheels[2].attach(MOTOR3);

wheels[0].write(STOP1);
wheels[1].write(STOP2);
wheels[2].write(STOP3);


}

void nomove(){
wheels[0].attach(MOTOR1);
wheels[1].attach(MOTOR2);
wheels[2].attach(MOTOR3);

wheels[0].write(STOP1);
wheels[1].write(STOP2);
wheels[2].write(STOP3);
}

void forward(){
//wheels[0].detach();
//wheels[1].attach(MOTOR2);
//wheels[2].attach(MOTOR3);
wheels[0].write(STOP1);
wheels[1].write(REVERSE2);
wheels[2].write(FOWORD3);
}

void backward(){
//wheels[0].detach();
//wheels[1].attach(MOTOR2);
//wheels[2].attach(MOTOR3);
wheels[0].write(STOP1);
wheels[1].write(FOWORD2);
wheels[2].write(REVERSE3);
}

void leftforward(){
//wheels[0].attach(MOTOR1);
//wheels[1].attach(MOTOR2);
//wheels[2].detach();
wheels[0].write(FOWORD1);
wheels[1].write(REVERSE2);
wheels[2].write(STOP3);
}

void leftbackward(){
//wheels[0].attach(MOTOR1);
//wheels[1].detach();
//wheels[2].attach(MOTOR3);
wheels[0].write(FOWORD1);
wheels[1].write(STOP2);
wheels[2].write(REVERSE3);
}

void rightforward(){
//wheels[0].attach(MOTOR1);
//wheels[1].detach();
//wheels[2].attach(MOTOR3);
wheels[0].write(REVERSE1);
wheels[1].write(STOP2);
wheels[2].write(FOWORD3);
}

void rightbackward(){
//wheels[0].attach(MOTOR1);
//wheels[1].attach(MOTOR2);
//wheels[2].detach();
wheels[0].write(REVERSE1);
wheels[1].write(FOWORD2);
wheels[2].write(STOP3);
}

void loop(){
static int i = 0;
static int j = 0;
static int fbFlag = 0;
uint16_t blocks;
blocks = pixy.getBlocks();



if(blocks){
i++;
j = 0;

if(i>=5){
i = 0;

if(pixy.blocks[0].width > 200 && pixy.blocks[0].height > 120){
backward();
}else if(pixy.blocks[0].x < 100){
if(pixy.blocks[0].height > 160){
fbFlag = 1;
}else if(pixy.blocks[0].height < 100){
fbFlag = 0;
}

if(fbFlag){
leftforward();
}else{
leftbackward();
}
}else if(pixy.blocks[0].x > 220){
if(pixy.blocks[0].height > 160){
fbFlag = 1;
}else if(pixy.blocks[0].height < 100){
fbFlag = 0;
}

if(fbFlag){
rightforward();
}else{
rightbackward();
}
}else if(pixy.blocks[0].width > 180){
nomove();
}else{
forward();
}
}
}else{
j++;

if(j >= 1000){
j = 0;
nomove();
}
}

}

本サンプルコードの解説:【その11】Nexusをパワーアップ! 外部デバイスを接続して機能拡張しよう!
3個の超音波センサーを活用した中心取り

#include Servo.h>
#include stdlib.h>

#define MOTOR1 9
#define MOTOR2 10
#define MOTOR3 11

#define FOWORD1 0
#define REVERSE1 164
#define STOP1 83

#define FOWORD2 7
#define REVERSE2 171
#define STOP2 89

#define FOWORD3 6
#define REVERSE3 170
#define STOP3 88

char input[1];
int pos = 0; // サーボのポジション(変数)
int target = 0; // サーボのポジション(変数)
String inString = ""; // 受信文字列用のバッファ

Servo wheels[3];

void setup(){
wheels[0].attach(MOTOR1);
wheels[1].attach(MOTOR2);
wheels[2].attach(MOTOR3);

wheels[0].write(STOP1);
wheels[1].write(STOP2);
wheels[2].write(STOP3);

Serial.begin(9600);

}

// シリアル通信で受信したデータを数値に変換
void serialNumVal(){
while (Serial.available() > 0) { // 受信データがあったら…
int inChar = Serial.read(); // 1バイト読み込む
if (isDigit(inChar)) { // 数値だったら…
inString += (char)inChar; // 文字列を連結する
}
else if(inChar != 'n'){
if(inChar == 97){ //a
target = 0;
Serial.println("Target Change wheel0");
}
else if(inChar == 98){ //b
target = 1;
Serial.println("Target Change wheel1");
}
else if(inChar == 99){ //c
target = 2;
Serial.println("Target Change wheel2");
}
}
if (inChar == 'n') { // 改行コードLFが来たら…
pos = inString.toInt(); // 文字列を数値に変換する
Serial.println(pos);
wheels[target].write(pos);
//wheels[0].writeMicroseconds(pos);
inString = ""; // バッファクリア
}
}
}

void loop(){
serialNumVal();
/*
wheels[0].write(FOWORD1);
delay(2000);
wheels[0].write(STOP1);
delay(2000);
wheels[0].write(REVERSE1);
delay(2000);
wheels[0].write(STOP1);
delay(2000);


wheels[1].write(FOWORD2);
delay(2000);
wheels[1].write(STOP2);
delay(2000);
wheels[1].write(REVERSE2);
delay(2000);
wheels[1].write(STOP2);
delay(2000);


wheels[2].write(FOWORD3);
delay(2000);
wheels[2].write(STOP3);
delay(2000);
wheels[2].write(REVERSE3);
delay(2000);
wheels[2].write(STOP3);
delay(2000);
*/
}

本サンプルコードの解説:【その12】超音波センサーをフル活用?自動で中央へ向かってみた

※こちらの内容に関する質問等はお受けしておりません。
※本サンプルコードは、先頭で指定している#includeタグの後ろに「<」を付けなければ使用できません。
お手元でご利用の際は適切に「<」を入れてご使用ください。


よくあるご質問(FAQ)

プログラムに使うソフトは?
ArduinoIDEをご利用ください。無料でダウンロードできます。
ダウンロードページ
マニュアル、サンプルコードのダウンロードができない
商品に同梱されている用紙に記載されているIDおよびパスワードをご入力下さい。
なお、ID及びパスワードが記載された用紙が無いもしくは紛失された場合、お手数ですがご購入日及びご注文番号を明記の上、ロボットショップ宛までメールにてご連絡下さい。
日本語のマニュアルはないですか?
初期導入部分に限りますが、日本語マニュアルをご用意しました。
プログラムの詳細については英語マニュアルをご確認ください。
プログラムの書き込みができない、書き込み時に「avrdude: stk500_getsync(): not in sync: resp=0x1c」のエラーが出る
RS485通信を有効にしたままですと、USB通信に影響を及ぼし、正常にプログラムの書き込みが行えません。こちらの画像をご参考頂き、一部ジャンパピンを外してプログラムを書き込んで下さい。
超音波センサーが複数同時に使用できない
超音波センサーのアドレスが全て同一に書き換わっている可能性があります。マニュアルのP23を参考に一つずつアドレスの書き換えを実施してください。
センサーの追加などはできますか?
Arduino互換ボードを搭載しておりますので、センサーの追加などの拡張は可能です。ただし拡張などに関わるサポートは弊社では行なっておりませんので、お客様ご自身での開発が必要です。
無線コントローラーなどは使えますか?
Arduino互換ボードを搭載しておりますので、拡張は可能です。ただし拡張などに関わるサポートは弊社では行なっておりませんので、お客様ご自身での開発が必要です。
動かし方を教えてほしい
初期不良以外のサポートは付属しておりません。お客様ご自身でマニュアルやサンプルコード、Arduinoに関わる書籍などをご確認の上ご対応お願いいたします。
ロボットに搭載されているボードの回路図を入手したい
申し訳ございませんが現在回路図の提供は行なっておりません。
防水機能は備わっていますか?
備わっておりません。

※大量注文も承っております。価格・納期についてはご相談ください。


現在のレビュー: 0

この商品は2018年12月13日(Thu)に登録されました。

【領収書発行の有償化および、書類宛名変更機能の実装につきまして】

ヴイストン ロボットショップでは、資源保護の観点からペーパーレス化を推進しており、このたび「紙面としての領収書発行」を有償化させていただくこととなりました。 ご注文に際し、紙の領収書がご必要な場合、また、お品物と異なるご住所への書類別送がご必要な場合などは、こちらの商品ページからご注文ください。

なお、以前よりご利用いただいております、お客様アカウントでの各種PDF書類の発行機能について、利便性を強化するため、発行時のお宛名の変更機能を搭載いたしました。各種PDF書類のご発行時にご活用いただけますと幸いでございます。