ユーザー名:

パスワード:


パスワード紛失

新規登録
ビートス オンラインショップへ
アブソリュート株式会社様へ

アナログジョイスティックの対応方法

前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 .2 .4 .6 .7 | 投稿日時 2017-9-5 18:17
tom  <ROOKIE>   投稿数: 8
REVIVE USBにアナログジョイスティックを接続して使用したいです。
値は0or1ではなく、0から1として受け取るにはどのように設定をすればよろしいのでしょうか?
ご存知の方がおられましたら、ご教示していただけると大変助かります。
よろしくお願いします。
イイね!の数:0
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2017-9-6 21:39
himono  <REGULAR>   投稿数: 29
ここAssembly DeskのREVIVE USBトップページのリンクにある
「REVIVE USB ANALOG(試作)」というファイルはお試しになりましたでしょうか。
以前のトピック
「REVIVE USBアナログ対応(人柱募集バージョン)をアップ」
http://a-desk.jp/modules/forum_module/index.php?topic_id=17
に詳細が記載されていると思うのですが、これではダメということでしょうか?

もしまだお試しになってないのであれば上気トピックを参考に試してみてはいかがでしょうか。
イイね!の数:0
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2017-9-7 10:33
tom  <ROOKIE>   投稿数: 8
返信ありがとうございます。

本日、朝から悪戦苦闘して試してみました。
結果、アナログジョイステック(X/Y方向)の動作が確認できました。

もうひとつ質問です。
あと1本分のアナログ入力が欲しいです。
P8/P9以外(例えばP10等)に追加するには、どのようにすればよろしいでしょうか?
イイね!の数:0
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2017-9-8 3:06
himono  <REGULAR>   投稿数: 29
必要なのはあと1軸だけで、2軸ではないということでしょうか?
1軸だけであればP10がアナログに対応しているようなので
抵抗R1を取り外しP8/P9の場合と同様にアナログ軸を接続し
ファームウェアも対応のピンをA/D変換するように
(P8/P9のアナログ対応ファームウェアを参考に)書き換えれば
アナログ軸を一つ追加できるのではないでしょうか。
2軸以上必要となると、集合抵抗の部分について接続し直さなければならず
改造には少し手間がかかると思われます。
イイね!の数:0
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2017-9-14 10:49
tom  <ROOKIE>   投稿数: 8
ご返答ありがとうございます。
他の事でドタバタして遅くなりました。申し訳ございません。

はい。あと1軸だけです。
あれからPIC18F14K50のPinDiagramを睨めっこして、仰る通りP10(PIC側は14Pin AN6)がアナログ対応してることを確認しました。

抵抗R1を取り外しP8/P9のソースを参考に修正しましたが、まだ認識できておりません。

Pic3を注文しましたが、まだ手元に届いていないためデバッグが出来ない状態です。

進展がありましたら再度書き込みさせていただきます。
イイね!の数:0
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2017-9-29 10:54
tom  <ROOKIE>   投稿数: 8
連絡が遅くなりました。
Pickit3とPIC18F14K50ではデバッグができないみたいでした。

一応、オリジナルのPICが壊れたら大変ですので、秋月でPIC18F14K50を購入しました。

ブートローダーをMPLAB IPEで焼いて、MPLIB IDEでプログラムを焼いております。

当方で変更したコードは下記の通りです。
間違いや不足等がございましたら、ご指摘願います。
修正はmain.cのみになります。

【main.c】
87行目
BYTE joystick_buffer[4];

BYTE joystick_buffer[5];

129行目
BYTE joystick_input[4];

BYTE joystick_input[5];

389行目
ANSEL = 0x00;

ANSEL = 0x40; // AN6を使用

394行目
ADCON0 = 0b00101001; //AN10, en

ADCON0 = 0b00011001; //AN6, en

449行目(追加)
joystick_buffer[4] = 0x80;

601行目と602行目の間に追加
if(eeprom_data[fi][EEPROM_DATA_VALUE] & 0x04)
joystick_buffer[4] = 0x0;
if(eeprom_data[fi][EEPROM_DATA_VALUE] & 0x08)
joystick_buffer[4] = 0xff;

630行目と631行目の間に追加
ADCON0 = 0b00011001; //AN06
ADCON0bits.GO = 1;
while(ADCON0bits.GO);
joystick_buffer[4] = (ReadADC() >> 2);

753行目と754行目の間に追加
joystick_input[4] = joystick_buffer[4];

758行目と759行目の間に追加
joystick_buffer[4] = 0x80;

以上が追加修正箇所になります。

よろしくお願いします。
イイね!の数:0
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2017-9-29 14:02
himono  <REGULAR>   投稿数: 29
まず確認したいのですが
「修正を行ったが上手くいかず、動作するようにしたい」のか
「修正を行ってある程度は動作したが、よりよくしたい」のどちらでしょう?
記述のある追加修正だけではおそらくtom様の望みの動作はしていないのではないかとは思うのですが
当方はジョイスティックの機能を使っていないので念のため確認させてください。
合わせて、もし上手く動作していないということであれば
現在どのように動作しているかも記載していただけると
よりアドバイスを得られやすいのではないかと思います。

また、tom様が追加したアナログ3軸目はどのような用途で使うための物でしょうか?
ジョイスティックのX、Y軸に加えてZ軸を追加したいのでしょうか?
用途によって修正する部分等が変わってきますので
そこを明記していただいた方が他の方も改善・修正点を指摘しやすいのではないかと思います。

以上、まずは具体的な指摘の前に確認させていただけますでしょうか。
イイね!の数:0
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2017-9-29 14:38
tom  <ROOKIE>   投稿数: 8
先ほどはloginしないで書き込んでしまいました。
申し訳ございません。

himono様
ご返信ありがとうございます。
返答させていただきます。

>>「修正を行ったが上手くいかず、動作するようにしたい」のか
>>「修正を行ってある程度は動作したが、よりよくしたい」のどちらでしょう?
→「修正を行ったが上手くいかず、動作するようにしたい」になります

>> ジョイスティックのX、Y軸に加えてZ軸を追加したいのでしょうか?
→Z軸と言えるか分かりませんが、スピード値として追加したいです。
X軸の値とスピード値で移動させる距離に変化を持たせたいです。
Y軸も同様になります。

よろしくお願いします。

イイね!の数:0
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2017-9-29 15:58
himono  <REGULAR>   投稿数: 29
なるほど、先ほどの投稿にあった追加修正だけでは上手く動作しなかったということですね。

>>Z軸と言えるか分かりませんが、スピード値として追加したいです。
とのことですが、どちらかというとPC側のソフトの処理についてになりますでしょうか。
PC側のソフトの設定ではジョイスティックの何の値をスピード値として扱っているのか分からないので明言はできないのですが
上手く動作しないのは
「ディスクリプタの記述を修正していない」
が原因ではないかと思います。

ディスクリプタについてはmain.c以外のファイルの修正も必要にななります。
usb_descriptors.cのゲームパッド(ジョイスティック)の記述の修正と
usb_config.hのディスクリプタ関連の数値も修正する必要があります。
この辺りについては「USB ディスクリプタ」等で検索すると詳しく解説しているページが見つかるかと思います。

PCへ送信するデータの形式はディスクリプタで記述されていますので
main.c内で送信用のバッファのサイズを変更してもPC側は
ディスクリプタに記述してある形式と違うのできちんと理解できません。

例えばジョイスティックにアナログZ軸を追加する場合、
usb_descriptors.cの388行目と389行目の間に
0x09,0x32, // USAGE(Z)

を追加し、392行目を以下のように修正
0x95,0x02, // REPORT_COUNT(2)

0x95,0x03, // REPORT_COUNT(3)

以上の追加修正を行うと、修正を行った以下の配列(370行目)
ROM struct{BYTE report[HID_RPT02_SIZE];}hid_rpt02
のサイズが(388行目と389行目の間に一行追加したため)変わるので

usb_config.h内の135行目
#define HID_RPT02_SIZE 49

#define HID_RPT02_SIZE 51
と修正する必要があります。

その上でmain.c内のジョイスティックのバッファいのサイズを1つ増やし
追加したバッファにZ軸のデータを入れてPCに送信することになります。

以上がおそらく必要な修正になるかと思いますが、
tom様が必要としているアナログ3軸目の入力が
Z軸なのか、Rx軸などなのか、その辺りはこちらでは分かりませんので
tom様が必要な入力を追加してみてはいかがでしょうか。
イイね!の数:0
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2017-10-2 19:14
tom  <ROOKIE>   投稿数: 8
himono様

色々ご教示いただき、本当にありがとうございます。
上記を追加/修正して、3軸目がPCで表示するようになりました。

もう1点だけ質問させてください。
3軸目(Rx軸:当方ではスピード値)の値の取得を実装するとき、なんとなくでコードを書きました。
なんとなくなので、正常に取得はできておりません。

コード
601行目と602行目の間に追加
if(eeprom_data[fi][EEPROM_DATA_VALUE] & 0x04)
joystick_buffer[4] = 0x0;
if(eeprom_data[fi][EEPROM_DATA_VALUE] & 0x08)
joystick_buffer[4] = 0xff;

3軸目(Rx軸)のポテンショメータを動かすと、他の軸の値も変化してしまいます。
これは、私の書き方がいけないのは分かっておりますが、3軸目(Rx軸)もX軸、Y軸同様に単独に取得するには、どのように修正したらよろしいのでしょうか?

何度も質問をして申し訳ございません。

よろしくお願いします。
イイね!の数:0
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2017-10-2 22:44
himono  <REGULAR>   投稿数: 29
tom様

無事3軸目も認識したとのことで、まずはおめでとうございます。

3軸目の入力を他のアナログ軸同様に単独で取得したいとのことですが

>>コード
>>601行目と602行目の間に追加
>>if(eeprom_data[fi][EEPROM_DATA_VALUE] & 0x04)
>>joystick_buffer[4] = 0x0;
>>if(eeprom_data[fi][EEPROM_DATA_VALUE] & 0x08)
>>joystick_buffer[4] = 0xff;

この部分は特に問題と思われます。
他の(元のサンプルプログラムから)修正した部分を記述していただかないことには
具体的なアドバイス等は他の方も含めて難しいかと思います。

また、ソースコードに問題がなくとも
アナログ軸の接続部分など、回路側に問題があった場合も
似たようなことは起こりますので
まずはどこか間違って接続してしまっていたり
ショートしてしまっているところがないかどうかを確認してみてはいかがでしょうか。
イイね!の数:0
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2017-10-14 15:37
tom  <ROOKIE>   投稿数: 8
himono 様

返信が送れて申し訳ございません。
当方で修正した内容は下記の通りでございます。

また、
> まずはどこか間違って接続してしまっていたり
> ショートしてしまっているところがないかどうかを
> 確認してみてはいかがでしょうか。
ですが、再確認をしたところ、接続ミスやショートしてしまっているところはございませんでした。

以下、修正箇所になります。

【ハード側】
基板上のR1/R2/R3の二つの抵抗を取り外しました

【ソフト側】
(main.c)
87行目
BYTE joystick_buffer[4];

BYTE joystick_buffer[5];

129行目
BYTE joystick_input[4];

BYTE joystick_input[5];

389行目
ANSEL = 0x00;

ANSEL = 0x40; // AN6を使用

394行目
ADCON0 = 0b00101001; //AN10, en

ADCON0 = 0b00001001; // AN6 & AN10 & AN11

416行目(修正)
joystick_input[3] = 0;

joystick_input[3] =

417行目(追加)
joystick_input[4] = 0;

449行目(追加)
joystick_buffer[4] = 0x80;

601行目と602行目の間に追加
if(eeprom_data[fi][EEPROM_DATA_VALUE] & 0x04)
joystick_buffer[4] = 0x0;
if(eeprom_data[fi][EEPROM_DATA_VALUE] & 0x08)
joystick_buffer[4] = 0xff;

630行目と631行目の間に追加
ADCON0 = 0b00011001; //AN06
ADCON0bits.GO = 1;
while(ADCON0bits.GO);
joystick_buffer[4] = (ReadADC() >> 2);

753行目と754行目の間に追加
joystick_input[4] = joystick_buffer[4];

758行目と759行目の間に追加
joystick_buffer[4] = 0x80;

(usb_descriptors.c)
388行目と389行目の間に追加
0x09,0x32, // USAGE(Z)

392行目(修正)
0x95,0x02, // REPORT_COUNT(2)

0x95,0x03, // REPORT_COUNT(3)

(usb_config.h)
135行目(修正)
#define HID_RPT02_SIZE 49

#define HID_RPT02_SIZE 51

となります。

よろしくお願いいたします。
イイね!の数:0
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2017-10-14 18:50
himono  <REGULAR>   投稿数: 29
tom様

修正なさった内容について確認してみました。

まず、AN6はREVIVEの回路図でいうところのP10に当たりますので
main.c内のPIN10の記述を修正する必要があります。
具体的には
507行目
result_button_press_set2 = (!PIN10 << 1) | (!PIN11 << 2) | (!PIN12 << 3);

result_button_press_set2 = (!PIN11 << 2) | (!PIN12 << 3);

と修正しなければ、P10にアナログ入力が入るにもかかわらず
P10をデジタル入力として判定してしまい、予期せぬ挙動をしてしまいます。


また、601行目と602行目に追加したコードは必要ありません。
「REVIVE USBアナログ対応(人柱募集バージョン)をアップ」
http://a-desk.jp/modules/forum_module/index.php?topic_id=17
のトピックにもありますように、Configuration Tool上でアナログ軸を接続したピンには何を設定しても
ジョイスティックのX軸、Y軸、(今回は3軸目のZ軸も)になるようにソースコードができていますので。


とりあえず気になったのは以上です。
特に507行目については、前回の投稿にありました
3軸目のみ他の軸の値も変化してしまう原因になりそうなので
まずは修正してみてはいかがでしょうか。
イイね!の数:0
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2017-10-19 15:51
tom  <ROOKIE>   投稿数: 8
himono 様

お世話になっております。

ご指摘の箇所を修正して、新品の可変抵抗器を購入して動作確認しました。

結果、3軸それぞれの可変抵抗器の値が単独で変化することが確認できました。

ご対応どうもありがとうございました。
イイね!の数:0
返信する

このトピックに投稿する

題名
投稿本文