goo blog サービス終了のお知らせ 

つれづれなるまゝに

単なる作業メモ。主に、Linux, arduino, raspberry piとか?

自作arduino その3

2014-05-06 01:05:39 | arduino
PS2用コントローラを接続するためのピンを配線しようとした。
が、繋いでいて1点考慮が抜けていたことをが発覚。

自作arduinoだと電源が5vなのである。PS2コントローラは3.3vなので、5vから3.3vに降圧した電源を用意しないといけない。

こちらに三端子レギュレーター(TA48M033F)を使った回路があったので、これを実装しようと思う。

部品買ってこないと。。。

自作arduino その2

2014-05-04 23:24:27 | arduino
USBシリアル変換ボードだが、秋月で以下の組立キットを購入済みで、これを元に作る予定
FT232RL USBシリアル変換モジュールキット

が、先にボードの動作確認するために、別途、aitendoで買ったSilicon Laboratories社USB-シリアル変換チップCP2103を使ったDIP24ピン実装済みのものがあった(50%offの時に買ったので500円以下で買えた)ので、ブレッドボードで動作確認。



Arduino IDEからシリアルに1秒ごとに"OK"を表示させるスケッチを書き込んで無事動作することを確認。

はじめて、スズメッキ銅線とポリウレタン銅線をつかって結線したのですが、上手くいきました。


スズメッキ銅線は0.32m、ポリウレタン銅線は0.4mを使用。
たしかに安くできるのですが、やっぱりハンダ付けがとっても面倒だ、、、^^;

AVR用ISP書込アシストツールというのがあるようなので、これを買えば次からはISP回路は載せなくてもいいのでちょっと楽になるかも。


残りはモータードライバとPS2コントローラ用のピン、電源をつなげれば完成だ

自作arduino その1

2014-05-04 15:03:34 | arduino
トラ技の1000円arduinoの記事をベースに、作成したラジコン制御を1ボード化しようと思う。

ひとまず、以下のページをもとにATmega328Pを使って、USBシリアル制御部を外だし、ISP回路付のボード作成。
モータードライバとPS2コントローラを直付けするので、ピンもつけてません。
#面倒だからじゃないですよ、、、^^;

オレんちのArduinoはちょっと違うぜ



さて、まずはこの状態で動くかを確認せねばならぬ。

STEP1:bootloaderの書き込み

ISP回路はつけてある。一緒に買ったFT232RLのUSBシリアル変換ボードがAVRライタにもなるようだが、先のことも考えてAVRライターを買ってみることにする。
買ったものは、デジットのAVRWRT3

が、ここで1点大きな失敗を。
このAVRWRT3だが、Windows8では動作しないのである。orz
WindowsXPならライセンスを1つ持っている。が、すでにサポート終了。この為だけに、Windows7を購入するのも無駄だ。
そこで、VirtualBox上にWindowsXPを入れ、インターネットへのネットワーク接続なしで使用することにする。
必要なファイルは、Windows8でもってきて、VirtualBoxの共有ファイル機能でわたすようにする。

余談だが、最初はWindows8 Proで使えるHyper-VでXPを使用しようと思って調べていたのだが、なんとHyper-VだとUSBの共有ができないそうだ。ということで、VirtualBoxで使用することにした。

で、作成したボードをAVRWRT3につないでbootloaderとフューズの書き込み完了。
JP1をショートさせてAVRWRT3から電力供給。ISPケーブルの接続方向とかもこれという資料がなかったのでいろいろ調べてなんとか判明。


AVRWRT3の自動認識でATmega328Pとなったし、書き込み後のベリファイもOKだったのでISP回路はちゃんと動いてる。
UNOとして使用するように、bootloaderとヒューズを設定。

と、今日はここまで。次は、USBシリアル変換ボードをつなげてプログラムが動作するかを確認予定。

Arduinoでラジコン作成 その3

2014-04-19 20:53:59 | arduino
シールド化 もしくは 1基盤化するために秋月商会から部品を購入。
fritzingで回路図を書き始めました。初体験で迷走中。。。

以下で、くっつけたスケッチを張っておきます。とりあえず動くレベルです。
とりえあえずお手軽にくっつけるために、グローバル変数を用意して、初期化後にps2コントローラからの入力を文字列に変換して代入。
その結果をモーター制御の関数で処理する感じです。


#include < PS2X_lib.h >

PS2X ps2x; // create PS2 Controller Class

int error = 0;
byte type = 0;
byte vibrate = 0;
char read_datas[15]; //受信文字列

void setup(){
 //initializing motors and ps2 controler

 //L Moter PinSET
 pinMode(6,OUTPUT); //Pin6 OUTPUT
 pinMode(7,OUTPUT); //Pin6 OUTPUT

 //R Moter PinSET
 pinMode(8,OUTPUT); //Pin6 OUTPUT
 pinMode(9,OUTPUT); //Pin6 OUTPUT

 Serial.begin(57600);

 error = ps2x.config_gamepad(13,11,10,12, true, true); //setup pins and settings: GamePad(clock, command, attention, data, Pressures?, Rumble?) check for error
 if(error == 0){
  Serial.println("Found Controller, configured successful");
 }
 else if(error == 1)
  Serial.println("No controller found, check wiring, see readme.txt to enable debug. visit www.billporter.info for troubleshooting tips");

 else if(error == 2)
  Serial.println("Controller found but not accepting commands. see readme.txt to enable debug. Visit www.billporter.info for troubleshooting tips");

 else if(error == 3)
  Serial.println("Controller refusing to enter Pressures mode, may not support it. ");

 type = ps2x.readType();
 switch(type) {
  case 0:
   Serial.println("Unknown Controller type");
   break;
  case 1:
   Serial.println("DualShock Controller Found");
   break;
  case 2:
   Serial.println("GuitarHero Controller Found");
   break;
 }
}

void loop(){
 if(error == 1) //skip loop if no controller found
  return;

 if(type != 1) //skip loop if controller type is not ps2
  return;

 memset(read_datas,'\0',15);

 // get comman from PS2 library
 getCommand();

 // for debug (printing command to serial console)
 if(read_datas[0] != '\0'){
  Serial.println(read_datas);
 }

 // controling motor
 motorControl();
}

void getCommand(){
 ps2x.read_gamepad(false, vibrate); //read controller and set large motor to spin at 'vibrate' speed

 if(ps2x.Button(PSB_PAD_UP)){
  read_datas[0] = 'F';
  read_datas[1] = ',';
  sprintf(&(read_datas[2]),"%d",ps2x.Analog(PSAB_PAD_UP));
 }
 if(ps2x.Button(PSB_PAD_DOWN)){
  read_datas[0] = 'B';
  read_datas[1] = ',';
  sprintf(&(read_datas[2]),"%d",ps2x.Analog(PSAB_PAD_DOWN));
 }
 if(ps2x.Button(PSB_PAD_RIGHT)){
  read_datas[0] = 'R';
  read_datas[1] = ',';
  sprintf(&(read_datas[2]),"%d",ps2x.Analog(PSAB_PAD_RIGHT));
 }
 if(ps2x.Button(PSB_PAD_LEFT)){
  read_datas[0] = 'L';
  read_datas[1] = ',';
  sprintf(&(read_datas[2]),"%d",ps2x.Analog(PSAB_PAD_LEFT));
 }
 if(ps2x.ButtonPressed(BLUE_FRET)){
  read_datas[0] = 'S';
  read_datas[1] = 'T';
  read_datas[2] = 'O';
  read_datas[3] = 'P';
 }
 delay(50);
}

void motorControl(){
 // kinectTANKのスケッチからSerialRead()のデータ解析というコメント以下をすべてコピー
 ///////////////////////////////////////////////////////
 //データ解析
 //////////////////////////////////////////////////////
  ・・・略・・・
}

//*************************************
// RetunValue
//*************************************
  ・・・略・・・

Arduinoでラジコン その2

2014-04-14 22:10:46 | arduino
仕事から帰ってきて気力がまだあったので、昨日の続き。

とりあえず、上下左右を前進・後退・右旋回・左旋回、×に停止を割り当ててスケッチを作成。

でもって、Arduinoとブレッドボード、電池を仮止めして実際に動かしてみました。



もう息子はお休みなので、明日帰ったらみせてやろう。