USBシリアル変換ボードだが、秋月で以下の組立キットを購入済みで、これを元に作る予定
・FT232RL USBシリアル変換モジュールキット
が、先にボードの動作確認するために、別途、aitendoで買ったSilicon Laboratories社USB-シリアル変換チップCP2103を使ったDIP24ピン実装済みのものがあった(50%offの時に買ったので500円以下で買えた)ので、ブレッドボードで動作確認。

Arduino IDEからシリアルに1秒ごとに"OK"を表示させるスケッチを書き込んで無事動作することを確認。
はじめて、スズメッキ銅線とポリウレタン銅線をつかって結線したのですが、上手くいきました。

スズメッキ銅線は0.32m、ポリウレタン銅線は0.4mを使用。
たしかに安くできるのですが、やっぱりハンダ付けがとっても面倒だ、、、^^;
AVR用ISP書込アシストツールというのがあるようなので、これを買えば次からはISP回路は載せなくてもいいのでちょっと楽になるかも。
残りはモータードライバとPS2コントローラ用のピン、電源をつなげれば完成だ
・FT232RL USBシリアル変換モジュールキット
が、先にボードの動作確認するために、別途、aitendoで買ったSilicon Laboratories社USB-シリアル変換チップCP2103を使ったDIP24ピン実装済みのものがあった(50%offの時に買ったので500円以下で買えた)ので、ブレッドボードで動作確認。

Arduino IDEからシリアルに1秒ごとに"OK"を表示させるスケッチを書き込んで無事動作することを確認。
はじめて、スズメッキ銅線とポリウレタン銅線をつかって結線したのですが、上手くいきました。

スズメッキ銅線は0.32m、ポリウレタン銅線は0.4mを使用。
たしかに安くできるのですが、やっぱりハンダ付けがとっても面倒だ、、、^^;
AVR用ISP書込アシストツールというのがあるようなので、これを買えば次からはISP回路は載せなくてもいいのでちょっと楽になるかも。
残りはモータードライバとPS2コントローラ用のピン、電源をつなげれば完成だ
トラ技の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シリアル変換ボードをつなげてプログラムが動作するかを確認予定。
ひとまず、以下のページをもとに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シリアル変換ボードをつなげてプログラムが動作するかを確認予定。
シールド化 もしくは 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
//*************************************
・・・略・・・
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
//*************************************
・・・略・・・