arduino + SBDBT!


ファミタンクの無線のSBDBTに切り替えをやっとやりました。
プログラムのバグを友人に教えてもらったりしつつ、動くところまで出来ました。
これで、次回のロボサバはバーチャロン用ツインスティックでアサルト的に操作して遊べる予定です。
さらにハードウェアにオムニホイールを導入すれば、サイバースレッド的な操作感も実現できます。
スケッチのベースは以前miconoさんに教えてもらったものです。(ありがとうございます!)




備忘メモとして、サンプルプログラムを上げておきます。
Wiiコントローラーの入力に応じて、arduinoのシリアルモニタに入力された数値と押されたキーを出力するものです。
(ファミタンク仕様のため、右ボタンをレバーとして表記してしまっていますがすみません。)
初歩的なプログラムですが、私のような電子工作の初心者にとってかなり重要なもので、これさえあればarduinoで作った電子工作ならなんでもかんでも即座にwiiリモコンで操作できるようになります。
ラジコンやロボットはもちろん、クアッドコプターに搭載するマジックハンドとか、LEDのイルミネーションを遠隔操作したりとか、誰でも思いつくような素朴なアイデアを、かなりのハードルの低さで実現できてしまいます♪(人として悪い事につかってはなりません。)

個人的には、レトロゲームをフィジカル化したような、動く卓上ゲームをいろいろ作りたいと思っています。




SBDBTはwii用ファームの「ソース Ver.130722」を使います。



【SBDBTとarduinoの接続】
SBDBT2番ピン:arduinoの3.3V
SBDBT3番ピン:arduinoのGND
SBDBT7番ピン:arduinoのシリアル信号入力(今回の例ではデジタル12番ピン)



【SBDBTの設定】
global.h 内の設定

#define PIN_CODE_DEFAULT "0000"
#define BOARD_SBDBT 1
#define BOARD_SBXBT 0

// Define the baud rate constants UART1
#define BAUDRATE1 9600
#define BRG_DIV1 4
#define BRGH1 1

// Define Hardware Flow Control UART1 (0:off 1:on)
#define UART1_HW_FLOW 0
#define UART1_TX_POLARITY 0 //(※反転なしなので注意。)
#define UART1_RX_POLARITY 0

#define WII_REMOTE_CONNECTION_SYNC 0

#define MODE_NO_INQUIRY 0

#define WII_REMOTE_REPORT_MODE 0x30
#define WII_REMOTE_REPORT_MODE_EXT 0x35

#define SERIAL_TRANSFER 2

#define SEND_ON_DIFFERENT_DATA 1
#define UART1_MINIMUM_INTERVAL 0

#define WII_REMOTE_HORIZONTAL 1
#define WII_REMOTE_ACC_SCALE 6
#define WII_REMOTE_ACC_DEADZONE 25
#define WII_CC_ANALOG_DEADZONE 25
#define NEUTRAL_DATA_SUPPRESS 1
#define NEUTRAL_ADDITIONAL_PACKETS 0


// Define the baud rate constants UART2 (Debug)
#define BAUDRATE2 115200
#define BRG_DIV2 4
#define BRGH2 1

// Define LED1 communication indicator on time(ms)
#define LED1_ON_COUNT 10




【arduinoのスケッチ】

//-------------------------------------------------------------

#include

#define MYRX 12 //デジタル12番ピンはソフトウェアシリアルRX
#define MYTX 11 //デジタル11番ピンはソフトウェアシリアルTX
SoftwareSerial mySerial(MYRX, MYTX);

unsigned char c[8];
unsigned long chksum;

void setup(){
mySerial.begin(9600);//SBDBTとArduinoは2400bps
Serial.begin(19200);//シリアルモニター表示
c[0]=0x80;//SBDBTからのシリアル信号の1個目は固定。
}

void loop(){
//まずは無線からシリアルを読み込む。c[1]とc[2]にキー入力が格納される。
int i;
if (mySerial.available() >= 8) { //8byte以上あるかチェック
if (mySerial.read() == 0x80){ //1byte読み込んで0x80のスタートビットかチェック
Serial.print(c[0],HEX);//16進数で数値を表示。
Serial.print(",");//コンマで区切る。
for (chksum=c[0],i=1;i<8;i++){//スタートビットは読み込み済みなので、次の7個のデータを読み込む。
c[i]= mySerial.read();
if(i<7) chksum+=c[i];
Serial.print(c[i],HEX);//16進数で数値を表示。
Serial.print(",");//}//コンマで区切る。
}
if(c[7]==(chksum & 0x7F)){//ボタン部分のみのチェックサムを簡易計算してみる。
Serial.println("check sum OK !");//チェックサムOKを表示。
}
else {
Serial.println("check sum * * ERROR * *");//ダメならエラーを表示。
}

//ここから、キー入力に応じて、メッセージを出す。
if(c[1] == 0x00 ){//何も押されていなければ静止
if(c[2] == 0x00 ){//何も押されていなければ静止
Serial.println("* STOP *");
}
}

if((c[1] & 0x10) == 0x10 ){//右トリガ:ショット(R2ボタン)
Serial.println("FIRE!!");
}
if((c[1] & 0x08 ) == 0x08 ){//右ボタン:照準センタリング(R1ボタン)
Serial.println("Centering");
}
if((c[1] & 0x02 ) == 0x02 ){//左ボタン:照準UP(L1ボタン)
Serial.println("Target_UP");
}
if((c[1] & 0x04 ) == 0x04 ){//左トリガ;照準DOWN(L2ボタン)
Serial.println("Target_DOWN");
}
if((c[2] & 0x01 ) == 0x01 ){//左レバー上(十字↓)
Serial.println("LEFTLEVER_UP");
}
if((c[2] & 0x02 ) == 0x02 ){//左レバー下(十字↑)
Serial.println("LEFTLEVER_DOWN");
}
if((c[2] & 0x10 ) == 0x10 ){//右レバー上(Xボタン)
Serial.println("RIGHTLEVER_UP");
}
if((c[2] & 0x20 ) == 0x20 ){//右レバー下(Bボタン)
Serial.println("RIGHTLEVER_DOWN");
}
}
}
}

//-------------------------------------------------------------
スポンサーサイト

テーマ : 自然科学
ジャンル : 学問・文化・芸術

arduino nano の外部電源


ArduinoNanoFront_3_lg.jpg
ArduinoNanoBack_3_lg.jpg


arduino nano にはDCプラグがありません。(一般的なarduino UNOやDuemilanoveには付いています。)
なのでUSB以外の外部電源を使おうとすると、ちょっとだけ戸惑います。
電源入力にはミニUSBしか使えないように見えますが、もちろん他の方法でも可能です。

「arduino nano 外部電源」の検索から答えが見つかるまでに少し時間がかかったので、メモにまとめておきました。




スイッチサイエンスさんの説明に書いてある通り なのですが、

Vinピン:
DCプラグと同じ機能。5V安定化していない電源はここに供給。7V~12V。
また、電源ジャックからの安定化前の電圧が出力される。

5Vピン:
外部装置で5Vに安定化された電源やUSB電源を供給可能。
普段は5V出力として使っているピンが、電源入力として使えるのがミソ。

ということです。

なので「arduino nano への外部電源は、7V~12Vの電源を、VinピンとGNDに接続する」が、正解です。




では、アルカリ4本の6Vでは動作しないのでしょうか?




こちらの記事の表だけを見て判断しますと、
arduino nanoをアルカリ4本(6V)では動かせないという結論になってしまうかもしれません。
が、同じページの脚注にヒントがあるように、レギュレーターを使う場合は大丈夫です。

秋月の5V安定化電源パック(100円) を使い、電池等からの入力を5Vに安定化し、arduino nanoの5V(Vcc)ピンとGNDに接続してもOKです。

前回の電子工作 では、RS304サーボも同じ電源で無事動作しました。




ちなみに、ロボゼロに乗せる場合には、サーボ用の電源からVinに接続すればOKということになります。

テーマ : 自然科学
ジャンル : 学問・文化・芸術

ロボの知識で電子工作


th_P1090249.jpg

お土産物などで見かける、動く絵が入っているペン があります。
液体と小さなフィルム片などが入っていて、さかさまにしたり斜めにすることで中のモノが動き、それを見て楽しむアレです。
そのペンをコレクションしている方がおり、とあるお祝いの記念品としてそれ専用の電動スタンドを作成し、贈呈することになりました。
回転角度、回転スピード、静止時間を設定できるボリューム付きという、世界に一つだけのスタンドです。




th_P1090261.jpg

観光系やキャラモノだと、癒し系の楽しい雰囲気になります。
一定のテンポで動き続けるので、催眠術っぽい不思議な感覚があります。
ヌード系だと脱力感が倍増します。




ギアなどを組み合わせたカラクリで作ればより情緒があったのですが、
制作期間1週間で確実に仕上げるため、守備範囲であるRS304サーボとArduinoで動作するようにしました。

バッテリーは6Vアダプタもしくは単三×4本の自動切り替え式で、5Vレギュレーターを通しています。
制御はarduino nanoからのコマンド方式です。miconoさんの「Arduinoでロボゼロのサーボを動かしてみよう!(5)」の記事 のおかげで、設計時間が大幅短縮できました。

プログラムから設計、加工、材料調達まで、それぞれは簡単な作業ですが、今までの基礎知識と道具を総動員して作成しました。

商品としての市場価値は皆無だけど、お金には換えられない、そういういモノを素人でもつくれる面白さ^^

テーマ : 自然科学
ジャンル : 学問・文化・芸術

SBDBTとarduinoの挫折終了


SBDBTのRCB信号(正論理)→Arduinoの低速シリアルで読む

というなんでもないようなことに悪戦苦闘中です。

ちょっとスクリプトがキタナイ気がするんですけど、
何とかそれらしく動くというところまで進みました。

Arduinoのシリアルモニタに、たとえば↑ボタンを押して離すと、

80,0,1,40,40,40,40,1,check sum OK !
80,0,0,40,40,40,40,0,check sum OK !

のように表示されます。
チェックサムは仮のもので、特にアナログパッドにはまだ対応できていません。
後ほどスケッチが完成したら、SBDBTのファームの設定含めてまとめようと思います。




途中経過とはいえ、Arduinoのシリアル通信での読み込み方の壁を越えられそうな状態なので、
ここまでのスケッチをメモがてら書き留めておきます。
(後でここのスクリプトにさかのぼる時に、ブログに上げておけば、ブログ記事という解説付きの確実なスクリプトをコピペで実行できるので便利です。自分のフォルダの中だと似たようなスクリプトが多すぎてゴミ屋敷状態です。)




以下スケッチ。


void setup(){
  Serial.begin(2400);
}
void loop(){
  int i;
  byte c[8];
  if (Serial.available() > 0) { //シリアルバッファにデータがあるかチェック
    c[0] = Serial.read();//バッファの先頭のデータを1個c[0]に代入
    if (c[0] != 0xFF){//データが0xFFのゴミだったら無視して読み込み直す
      if (c[0] == 0x80){//c[0]が0x80のスタートビットかチェック。見つけたら次へ。
        Serial.print(c[0],HEX);
        Serial.print(",");
        for (i=1;i<8;i++){//スタートビットは読み込み済みなので、次の7個のデータを読み込む。
          c[i]= Serial.read();
          if (c[i] == 0XFF){//データが0xFFのゴミだったら読み込み直すためにiを1もどす。
            i --;
          } 
          else {//データが0xFFのゴミではなければ、以下を実行。
            Serial.print(c[i],HEX);//16進数で数値を表示。
            Serial.print(",");
          }//コンマで区切る。
        }
        if(c[7]==c[1]+c[2]){//ボタン部分のみのチェックサムを簡易計算してみる。
          Serial.println("check sum OK !");//チェックサムOKを表示。
        }
        else
        {
          Serial.println("check sum * * ERROR * *");//ダメならエラーを表示。
        }
      }
    }
  }
}







課題
・バッファに8バイト溜まったら調べるようにしたら、なぜか
 キーのプレスとリリースのタイミングがズレてしまうことがあった。
 ので、1バイトあったら調べるようにしておいた。
・チェックサムのc[1]~c[6]までの合計の下位7ビット、の作り方を知らない。
 ので、今のところc[1]~c[2]の十字とABXYボタンだけでチェックサム。
・キーごとに分岐するように、関数を付け足す。
 その一般的で効率的な方法を調べる。

ということで、見ている方はちょっとモドカシイかもしれませんが、すみません。
Processingの勉強も平行して始めています。やりたい事にピッタリの言語に出会えたかもしれません。

テーマ : 自然科学
ジャンル : 学問・文化・芸術

LCD液晶シールド


毎回の配線が面倒なので、Arduino用のLCD液晶シールドを作っておきます。

使用したのは秋月で購入したSC1602BSLB、バックライト付き16文字×2行LCDモジュールです。
配線で参考になるのは、こちらのサイト

接続を改めて。

・LCD1番ピン → 5V
・LCD2番ピン → GND
・LCD3番ピン → 可変抵抗経由でGNDに。簡易的に4.5kΩ程度の抵抗でも可。(コントラスト調整用。)

・LCD4番ピン → Arduino D12番 ピンなどに。(RS信号)
・LCD5番ピン → GNDに接続でOK。(Read/Writeの判別。Write固定でよいのでGND)
・LCD6番ピン → Arduino D11番 ピンなどに。(Enable信号)

・LCD11番ピン → Arduino D5番 ピンなどに。(4ピンモードのデータ信号4)
・LCD12番ピン → Arduino D4番 ピンなどに。(4ピンモードのデータ信号3)
・LCD13番ピン → Arduino D3番 ピンなどに。(4ピンモードのデータ信号2)
・LCD14番ピン → Arduino D2番 ピンなどに。(4ピンモードのデータ信号1)

などでよいです。信号ピンは合計6本でOKです。
液晶用のピンは8本ありますが4本だけ使えば大丈夫なようにできています。
バックライト液晶の電源については、説明書通りに液晶基板本体裏に抵抗とショートの加工を施します。
こうすると、5V電源とバックライト電源を共有できてスマートです。




th_P1090244.jpg
できあがり図。
液晶シールドに別のシールドを乗せても使えるようにしてみました。
上に他のシールドを乗せた場合でもある程度使えるように、
使用デジタルピンを必要に応じて差し替えできるシカケを入れてみました。
・・・が、6本も占有してしまうので、別のシールドを乗せるという機会はあまりないかもしれません。




スケッチは、「下手の横好きのスクラップブック!!」さんのものをお借りしました。
表示位置の指定が入っているので、参考に便利です^^


/////////////////////////////////////////

//http://blog.goo.ne.jp/mkidmtr70/e/7aa1d8fb43de18b716a2d05b81967b01
// LCDを接続する

//「sketch」メニューからLiquidCrystalライブラリを読み込む
#include

//使用するピンの定義。LiquidCrystal lcd(rs,enable,d4,d5,d6,d7)
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
//LCDの行と桁数の設定
lcd.begin(16, 2);

//0行目にメッセージを表示
lcd.print("Hello,world!");
}

void loop() {

//カーソルを0桁、1行目にセット
lcd.setCursor(0, 1);

//動作開始からの経過時間を秒単位で表示
//「Zikann :」を 0桁1行目表示
lcd.print("Zikan :");

 //8桁1行目に経過時間を秒単位で表示
lcd.setCursor(8,1);
lcd.print( millis() / 1000);
lcd.setCursor(13,1);
lcd.print("sec");
}

/////////////////////////////////////////

テーマ : 自然科学
ジャンル : 学問・文化・芸術

プロフィール

二名川(ニナガワ)

Author:二名川(ニナガワ)
ホビーロボットをレトロゲームが発展したものと捉えて楽しく遊び倒します。
子供が夢を見ている時間帯に稼働します。

宣伝:電子出版しました。
「コンソロイド ガイドブック」
46107_CONSOLOID_GUID_FACE_200.jpg





■作成中の機体
汎用ヒト型決戦遊具 ~RX計画~
RX-7.5 ゼロタンク
RRf-0.6 ゼニィ
RXM-7.9 ゼムネス
RX-7.5R 量産型ゼロタンク
RX-7.5Fp ファミタンク仮設1号
RX-7.7 ゼロキャノン
RX-7.8 ゼログレイ
SMS-0.1 ゼロライナー
以下続く

ブログ内検索
最近の記事
最近のコメント
カテゴリ
月別アーカイブ
リンク