かっぱの覚え書き

とりあえずなんかメモ書きとか

ネオディケイドライバー制作(DXディケイドライバー改造)

ネオディケイドライバーを作ったので改造解説をしようと思います。

※改造は自己責任で行ってください

■必要な物
●DXディケイドライバー
今の所お店もネットオークションも高いのですがジオウが終わったのでレジェンド系もそろそろ値段的に落ち着くかなと。というか落ち着いて欲しい。

●ATTINY85-20PU
http://akizukidenshi.com/catalog/g/gI-09573/
小型化省電力化の為にこちらを使用しました。

●DFPlayer mini
http://akizukidenshi.com/catalog/g/gM-12544/
音声再生に使います。

●5V出力昇圧DCDCコンバーター
http://akizukidenshi.com/catalog/g/gK-13065/
乾電池2本3Vを5Vに昇圧する為に使用。

●PAM8012使用2ワットD級アンプモジュール
http://akizukidenshi.com/catalog/g/gK-08217/
こちらのアンプですが通常の使い方はしていません。LEDを音声と連動させる為、スピーカー出力に繋げているのですが光り方が弱いです。私の環境だけかもしれないですがmp3データの音量を上げるとなぜか音が止まってしまいます。ですのでLEDの出力だけ上げる為アンプを使用しています。本来はコンデンサか何かで出力を上げるのが普通だと思うのですがうまく使えなかったです…

●動作確認用
arduino uno
ブレッドボード
バーコードが正確に読めているかどうかをシリアルモニタで確認する為に使います。prominiやmicroでもいいんですが3.3v出力があるのでunoまたは互換品があるといいです。読み取り機は乾電池駆動に合わせるので3.3vに繋げます。

●その他
microSDカード
抵抗1K
ピンソケット8P
配線
ユニバーサル基板
10µFコンデンサ
ジャンパーケーブル

■ハードウェア
まずは基板を破壊します。
f:id:une-lettre-arrive:20190829222353j:plain

…正確にはスイッチとLEDと読み取り基板しか使わないので邪魔な部分を取っ払います。

まずはATTINY85-20PUをarduinoで使えるようセッティングします。

こちらのページを参考にしました。

ATtiny85を使えるようにする。
http://miraluna.hatenablog.com/entry/tiny85

注意点としてはブートローダは忘れず書き込んで8MHz駆動にしてください。これをしないとmp3モジュールがうまく動作しません。
毎回ブレッドボードで書き込むのは面倒くさいのでこれ用の書き込みシールドを作ると書き換えが楽になります。

私も作りました。
f:id:une-lettre-arrive:20190829222813j:plain


こちらのページを参考にしています。
https://ht-deko.com/arduino/atmega328p.html
元々atmega328用に作ったのでattiny85に書き込む時は変換アダプタを使用しています。

マイコンはピンソケットで外せるようにしています。外す専用の工具がないと足が破損したりするので用意しておいた方がいいです。

私が使っているのはこちらです。
エンジニアIC抜き SS-08
https://amzn.to/2zuwZEN
サンハヤト ピンそろった ICS-01
https://amzn.to/2N10ELp

マイコンについてですが私の以前の環境ではどうやってもうまく書き込めませんでした。今は別のパソコンに代えたら書き込めるようになったのですが相性などがあるのかもしれません。動かなかったら小型のarduinoやatmega328(8MHzクロック変更済み)などに置き換えてください。
実は一度作り直しており最初はatmega328を使っていました。こちらならどの環境でも動くと思います(arduino unoに乗っているマイコンの事です)
f:id:une-lettre-arrive:20190829223320j:plain
f:id:une-lettre-arrive:20190831025511j:plain
 

次にバーコード読み取り機の動作確認をします。
ディケイドライバーに取り付けた状態でarduinoに配線します。
PT1はA0
PT2はA1
COM+は3.3V
COM−はGND

そしてこのスケッチを使ってください。

  1. void setup() {
  2.   Serial.begin(9600);
  3. }
  4.  
  5. void loop() {
  6.  int pt_1 = analogRead(A0);
  7.  int pt_2 = analogRead(A1);
  8.   Serial.print("PT1_");
  9.   Serial.print(pt_1);
  10.   Serial.print(" ");
  11.   Serial.print("PT2_");
  12.   Serial.println(pt_2);
  13.   delay(100) ; // 100ms待つ
  14.   
  15. }
ゆっくり差し込んで白と黒の数値が変化しているか確認してください。
同時に白と黒はどのくらいの数値か調べておくと設定しやすくなります。


次に回路図です。
f:id:une-lettre-arrive:20190831021311j:plain
 
パーツイラストのフォトリフレクタ、アンプ、昇圧器は適当な物を当てはめていますので形が違います。
フォトリフレクタが2本、mp3モジュールが2本、スイッチ2個と合計6端子使います。
attiniy85の8本の内3本はリセット、VCC、GNDとなっており使える端子は5本です。
どのようにしたかというとmp3モジュールを1本にしました。
mp3はシリアル通信でやり取りするのですが送信受信で2本使います。
mp3から送信してる?何を?と思い1本外してみると普通に再生されたので空いた1本をスイッチに当てました。
ただsoftwareserial設定は2本で設定しておかないとmp3が鳴らないので注意してください。

バーコード読み取り機は昇圧前の3Vに繋げてください。5Vでも動作しますがラミネート加工してあるカードは読み取りできなくなります。

アンプは5Vの方が強く光ります。LEDに抵抗をつけるかですが光らせ方が点滅なので私はつけていません。mp3モジュール、アンプ、LEDの+-はちゃんと合わせてください。


レイアウトはこのようにしました。
f:id:une-lettre-arrive:20190831021608j:plain
 f:id:une-lettre-arrive:20190831021539j:plain
アンプは後付けなので裏面にグルーガンで固定してあります。


次に音声関係です。

基本的な音声の流れですが

回転音→カード挿入音→カメンライド読み上げ→待機音→回転音→発動音→回転音→カード引き抜き音

このようになっています。一つ一つ音声を並べていけばいいんですがmp3モジュールの特性上次が再生されるまで若干のラグがありテンポが悪いです。

ですので

回転音→カード挿入音カメンライド読み上げ待機音→回転音発動音→回転音→カード引き抜き音

このように一部の音声を繋げてなるべくラグが気にならないようにしています。

実際の音声の分け方です。
f:id:une-lettre-arrive:20191019222838j:plain
f:id:une-lettre-arrive:20191019222851j:plain
 フォルダ1-20はクウガ-ジオウ、21はディエンド、22はその他で分けています。
共通音声001.002.003.004.005.006.101.102.104(103はライド系の音声に繋げて1つにしていますので使っていません)はすべてのフォルダに入っています。
後記のスケッチをみてもらえばわかると思いますがカメンライドは10の位、フォームライドは50の位とルール付けをしたのですが結構崩れているものもありますw

 ■ソフトウェア
まずはじめにバーコード読み取りの重要な部分は私が作った物ではありません。
自分では出来ず知恵袋に投稿して作っていただいた物です。
それに肉付けしているだけなので私が作りました!って自慢できるものではありませんのでご了承ください。
リンクです。
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10204064080


●50と54行目のフォトリフレクタの数値は自分の環境に合せて設定してください。
●92、93行目の//を外せばバーコードの数値がシリアルモニタで確認できますので利用してしてください。
●スケッチで音量の調整をできるようにしました。223行目にボリュームの項目がありますので1-30の間で調整できます。
●バーコードが登録してあるのは主要の一部です。
下記のサイトを参考にしネオディケイドライバー基準でバーコードの数値を登録しました。

DXディケイドライバーまとめ
https://sites.google.com/site/dxdikeidoraiba/tips

2進数→10進数変換ですが大量に変換したい場合は下記のサイトが便利です。
2~36進数から10進数へ進数変換(基数変換)
http://alphasis.info/2013/03/webapp-radix-converter-to10/

完成はこんな感じです。




なぜyoutubeにあげないのかというと色を塗り直したいのとクレストが一部欠けているのでちゃんと出来たらあげようと考えています。
いつになるかはわかりません。。

これでネオディケイドライバー制作記事は終わりです。作り替えは大変ですが好きな音声を追加できるのは楽しいと思いますのでよかったら参考にしてみてください。
スケッチは粗が多いので動作しなくなったら電源入れ直しでリセットかけています^^;

■スケッチ

  1. //ネオディケイドライバー再現attiny85用
  2. #include <SoftwareSerial.h>
  3. SoftwareSerial mySerial(1,0); // TX
  4. //黄色0 緑1
  5. int folder=1,file;//MP3用変数
  6. int reading_on; //カメンライド 1
  7.                    //ファイナルカメンライド 2
  8.                    //アタックライド 3
  9.                    //ファイナルアタックライド 4
  10.                    //フォームライド 5
  11.                    //ファイナルフォームライド 6
  12.                  
  13. int ride_on; //カメンライド音 11
  14.                    //ファイナルカメンライド音 21
  15.                    //アタックライド音 31
  16.                    //ファイナルアタックライド音 41
  17.                    //フォームライド音 51
  18.                    //ファイナルフォームライド音 61
  19. #define card_in 101 //カードIN
  20. #define card_unplug 102 //カード引き抜き
  21. #define reading_wait 103 //ライド待機音
  22. #define opening_and_closing 104//開閉
  23. #define bgm_on 105 //BGM再生
  24. int reading_sw;//読み取りスイッチ
  25. int ride_sw;//カメンライドスイッチ
  26. #define reading_pin 1 //読み取り開始ピン D1
  27. #define ride_pin 2 //カメンライドピン D2
  28. #define clock_pin 3 //A2/3ピン
  29. #define data_pin 2 //A3/2ピン
  30. int open_clos;
  31. int card_off;
  32. int start_sound;
  33. //バーコード読み取り(フォトリフレクタ)----------------------------------------------
  34. #define bwhite 0
  35. #define bblack 1
  36. unsigned int bardat=0;
  37. unsigned char bitcnt = 0;
  38. unsigned char ck_read( void ){
  39. if ( analogRead( clock_pin ) > 55){ return bblack; }
  40. return bwhite;
  41. }
  42. unsigned char dat_read( void ){
  43. if ( analogRead( data_pin ) > 55 ){ return bblack; }
  44. return bwhite;
  45. }
  46. void bardat_read( void ){ bardat = ( bardat<<1 ) + dat_read(); }
  47. void wb_read( void){
  48. while( ck_read() == bwhite ); // 白
  49. bardat_read();
  50. }
  51. void bw_read( void ){
  52. while( ck_read() == bblack ); // 黒
  53. bardat_read();
  54. }
  55. //----------------------------------------------------------------------------
  56. //バーコード出力----------------------------------------------------------------------
  57. void barcode_read()
  58. {
  59. bardat = 0; bitcnt =0;
  60. while( ck_read() == bwhite ); // 白
  61. while( ck_read() == bblack ); // 黒
  62. delay(10);
  63. bw_read(); // bit 0
  64. wb_read(); // bit 1
  65. bw_read(); // bit 2
  66. wb_read(); // bit 3
  67. bw_read(); // bit 4
  68. wb_read(); // bit 5
  69. bw_read(); // bit 6
  70. wb_read(); // bit 7
  71. bw_read(); // bit 8
  72. wb_read(); // bit 9
  73. bw_read(); // bit 10
  74. wb_read(); // bit 11
  75. bw_read(); // bit 12
  76. //mySerial.println( bardat , BIN );//2進数
  77. //mySerial.println( bardat );//10進数
  78. switch(bardat){//
  79. //カメンライド
  80. case 1149:{folder=1,reading_on=1,ride_on=11;} break;//カメンライドクウガ
  81. case 31:{folder=1,reading_on=1,ride_on=12;} break;//カメンライドクウガアルティメット
  82. case 153:{folder=1,reading_on=1,ride_on=13;} break;//カメンライドクウガライジングアルティメット
  83. case 829:{folder=2,reading_on=1,ride_on=11;} break;//カメンライドアギト
  84. case 47:{folder=2,reading_on=1,ride_on=12;} break;//カメンライドアギトシャイニング
  85. case 79:{folder=3,reading_on=1,ride_on=11;} break;//カメンライド龍騎
  86. case 57:{folder=3,reading_on=1,ride_on=12;} break;//カメンライド龍騎サバイブ
  87. case 1015:{folder=4,reading_on=1,ride_on=11;} break;//カメンライドファイズ
  88. case 87:{folder=4,reading_on=1,ride_on=12;} break;//カメンライドファイズブラスター
  89. case 225:{folder=5,reading_on=1,ride_on=11;} break;//カメンライドブレイド
  90. case 103:{folder=5,reading_on=1,ride_on=12;} break;//カメンライドブレイドキング
  91. case 1601:{folder=6,reading_on=1,ride_on=11;} break;//カメンライド響鬼
  92. case 105:{folder=6,reading_on=1,ride_on=12;} break;//カメンライド装甲響鬼
  93. case 537:{folder=7,reading_on=1,ride_on=11;} break;//カメンライドカブト
  94. case 143:{folder=7,reading_on=1,ride_on=12;} break;//カメンライドカブトハイパー
  95. case 1913:{folder=8,reading_on=1,ride_on=11;} break;//カメンライド電王
  96. case 113:{folder=8,reading_on=1,ride_on=12;} break;//カメンライド電王ライナー
  97. case 169:{folder=8,reading_on=1,ride_on=13;} break;//カメンライド電王超クライマックス
  98. case 1389:{folder=9,reading_on=1,ride_on=11;} break;//カメンライドキバ
  99. case 151:{folder=9,reading_on=1,ride_on=12;} break;//カメンライドキバエンペラー
  100. case 885:{folder=10,reading_on=1,ride_on=11;} break;//カメンライドディケイド
  101. case 13:{folder=10,reading_on=1,ride_on=12;} break;//カメンライドディケイドコンプリート
  102. case 1855:{folder=11,reading_on=1,ride_on=11;} break;//カメンライドW
  103. case 593:{folder=11,reading_on=1,ride_on=12;} break;//カメンライドWエクストリーム
  104. case 1859:{folder=12,reading_on=1,ride_on=11;} break;//カメンライドオーズ
  105. case 795:{folder=12,reading_on=1,ride_on=12;} break;//カメンライドオーズプトティラ
  106. case 1869:{folder=13,reading_on=1,ride_on=11;} break;//カメンライドフォーゼ
  107. case 801:{folder=13,reading_on=1,ride_on=12;} break;//カメンライドフォーゼコズミック
  108. case 1887:{folder=14,reading_on=1,ride_on=11;} break;//カメンライドウィザード
  109. case 843:{folder=14,reading_on=1,ride_on=12;} break;//カメンライドウィザードインフィニティ
  110. case 1941:{folder=15,reading_on=1,ride_on=11;} break;//カメンライド鎧武
  111. case 897:{folder=15,reading_on=1,ride_on=12;} break;//カメンライド鎧武極
  112. case 1975:{folder=16,reading_on=1,ride_on=11;} break;//カメンライドドライブ
  113. case 949:{folder=16,reading_on=1,ride_on=12;} break;//カメンライドドライブトライドロン
  114. case 37:{folder=17,reading_on=1,ride_on=11;} break;//カメンライドゴースト
  115. case 1073:{folder=17,reading_on=1,ride_on=12;} break;//カメンライドゴーストムゲン
  116. case 199:{folder=18,reading_on=1,ride_on=11;} break;//カメンライドエグゼイド
  117. case 1121:{folder=18,reading_on=1,ride_on=12;} break;//カメンライドエグゼイドムテキ
  118. case 477:{folder=19,reading_on=1,ride_on=11;} break;//カメンライドビルド
  119. case 1169:{folder=19,reading_on=1,ride_on=12;} break;//カメンライドビルドジーニアス
  120. case 493:{folder=20,reading_on=1,ride_on=11;} break;//カメンライドジオウ
  121. case 535:{folder=20,reading_on=7,ride_on=12;} break;//カメンライドグランドジオウ
  122. case 219:{folder=20,reading_on=1,ride_on=13;} break;//カメンライドオーマジオウ
  123. case 201:{folder=21,reading_on=1,ride_on=11;} break;//カメンライドディエンド
  124. case 235:{folder=21,reading_on=1,ride_on=12;} break;//カメンライドディエンドコンプリート
  125. //folder=22 オリジナル
  126. case 587:{folder=22,reading_on=1;ride_on=11;} break;//KAMEN RIDEゼロワン
  127. case 1825:{folder=22,reading_on=2;ride_on=12;} break;//KAMEN RIDEルパンレンジャー
  128. case 1979:{folder=22,reading_on=3;ride_on=13;} break;//KAMEN RIDEパトレンジャー
  129. //case :{folder=22,reading_on=1;ride_on=14;} break;//KAMEN RIDEゲイツ
  130. //case :{folder=22,reading_on=1;ride_on=15;} break;//KAMEN RIDEジョーカー
  131. //case :{folder=22,reading_on=1;ride_on=16;} break;//KAMEN RIDEスカル
  132. //ファイナルアタックライド
  133. case 1619:{folder=1,reading_on=4,ride_on=41;} break;//ファイナルアタックライドクウガ
  134. case 673:{folder=2,reading_on=4,ride_on=41;} break;//ファイナルアタックライドアアアアギト
  135. case 445:{folder=3,reading_on=4,ride_on=41;} break;//ファイナルアタックライドリュリュリュ龍騎
  136. case 1235:{folder=4,reading_on=4,ride_on=41;} break;//ファイナルアタックライドファファファファイズ
  137. case 133:{folder=5,reading_on=4,ride_on=41;} break;//ファイナルアタックライドブブブブレイド
  138. case 2043:{folder=6,reading_on=4,ride_on=41;} break;//ファイナルアタックライドヒヒヒ響鬼
  139. case 295:{folder=7,reading_on=4,ride_on=41;} break;//ファイナルアタックライドカカカカブト
  140. case 1039:{folder=8,reading_on=4,ride_on=41;} break;//ファイナルアタックライドデデデ電王
  141. case 1363:{folder=9,reading_on=4,ride_on=41;} break;//ファイナルアタックライドキキキキバ
  142. case 1877:{folder=10,reading_on=4,ride_on=41;} break;//ファイナルアタックライドディディディディケイド
  143. case 1261:{folder=11,reading_on=4,ride_on=41;} break;//ファイナルアタックライドダダダW
  144. case 1287:{folder=12,reading_on=4,ride_on=41;} break;//ファイナルアタックライドオオオオーズ
  145. case 1331:{folder=13,reading_on=4,ride_on=41;} break;//ファイナルアタックライドフォフォフォフォーゼ
  146. case 1427:{folder=14,reading_on=4,ride_on=41;} break;//ファイナルアタックライドウィウィウィウィザード
  147. case 1563:{folder=15,reading_on=4,ride_on=41;} break;//ファイナルアタックライドガガガ鎧武
  148. case 1665:{folder=16,reading_on=4,ride_on=41;} break;//ファイナルアタックライドドドドドライブ
  149. case 1759:{folder=17,reading_on=4,ride_on=41;} break;//ファイナルアタックライドゴゴゴゴースト
  150. case 1783:{folder=18,reading_on=4,ride_on=41;} break;//ファイナルアタックライドエエエエグゼイド
  151. case 1811:{folder=19,reading_on=4,ride_on=41;} break;//ファイナルアタックライドビビビビルド
  152. case 123:{folder=20,reading_on=4,ride_on=41;} break;//ファイナルアタックライドジジジジオウ
  153. //アタックライド
  154. case 981:{folder=6,reading_on=3;ride_on=31;} break;//ATTACK RIDE音撃棒烈火
  155. case 1017:{folder=7,reading_on=3;ride_on=31;} break;//ATTACK RIDEクロックアップ
  156. case 833:{folder=10,reading_on=3;ride_on=31;} break;//ATTACK RIDEスラッシュ
  157. case 851:{folder=10,reading_on=3;ride_on=32;} break;//ATTACK RIDEブラスト
  158. case 819:{folder=10,reading_on=3;ride_on=33;} break;//ATTACK RIDEイリュージョン
  159. case 867:{folder=10,reading_on=3;ride_on=34;} break;//ATTACK RIDEインビジブル
  160. case 749:{folder=10,reading_on=3;ride_on=35;} break;//ATTACK RIDE烈火大斬刀
  161. //フォームライド
  162. case 1307:{folder=4,reading_on=5;ride_on=51;} break;//FORM RIDEファイズアクセル
  163. //ファイナルフォームライド
  164. }
  165. file=reading_on;mp3();//カメンライド待機音ロング
  166. card_off=1;
  167. }
  168. //-------------------------------------------------------------------
  169. //カメンライド------------------------------------------------------------------------
  170. void kamen_ride()
  171. {
  172.    file=ride_on;mp3();//カメンライド発動
  173.    while(digitalRead(ride_pin) == LOW){}//開いたら抜け出す
  174.    file=opening_and_closing;mp3();//開閉音
  175.    while(digitalRead(reading_pin) == LOW){}//
  176.    file=card_unplug;mp3();delay(100);card_off=0;//カード引き抜き
  177. }
  178. //------------------------------------------------------------------------------------
  179. void mp3()
  180. {
  181.  //ファイル指定再生
  182.   mySerial.write(0x7E);
  183.   mySerial.write(0xFF);
  184.   mySerial.write(0x06);
  185.   mySerial.write(0x0F); //「フォルダ指定再生」コマンド
  186.   mySerial.write((byte)0);
  187.   mySerial.write(folder); //この例では、「folder」という変数が指定される
  188.   mySerial.write(file); //この例では、「file.mp3」という変数のmp3が指定される
  189.   mySerial.write(0xEF);
  190.   delay(10);
  191.  //音量指定
  192.   mySerial.write(0x7E);
  193.   mySerial.write(0xFF);
  194.   mySerial.write(0x06);
  195.   mySerial.write(0x06); //コマンド
  196.   mySerial.write((byte)0);
  197.   mySerial.write((byte)0); //
  198.   mySerial.write((byte)20); //ボリューム1〜30 //21
  199.   mySerial.write(0xEF);
  200.   //delay(10);
  201. }
  202. void setup() {
  203. mySerial.begin( 9600 );
  204. pinMode(reading_pin,INPUT_PULLUP); //読み取り開始ピン
  205. pinMode(ride_pin,INPUT_PULLUP); //カメンライドピン
  206. //file=101;mp3();//起動音
  207. //delay(10);
  208. }
  209. void loop() {
  210. if(open_clos == 1){
  211. if(digitalRead(ride_pin) == HIGH){file=opening_and_closing;mp3();open_clos=0;}//開閉音
  212. }
  213. if(digitalRead(ride_pin) == LOW){open_clos=1;}
  214.   if(card_off == 0){
  215.   //while(digitalRead(ride_pin) == LOW){}
  216. if(digitalRead(reading_pin) == LOW){barcode_read();}}//カードIN/バーコードリード
  217. //カードが入っていて閉じると発動
  218. if(digitalRead(ride_pin) == LOW && digitalRead(reading_pin) == LOW ){ kamen_ride();}//発動
  219. }