2015年2月25日水曜日

妖怪ウオッチ零式 改造大実験

妖怪ウオッチ零式 改造大実験 Pimona Laboratory 「ピモナの好奇心・実験記録」 妖怪ウオッチ零式を改造して、
いろいろな妖怪を召還してみたいと思います。

妖怪の召還スイッチと種族変更スイッチを追加して、
AVRのATtiny2313マイコンを組み込み制御します。

よいこのみなさんは、まねをしないでくださいね、
うまくゆくとはかぎりません。
こわしてしまうかもしれません。
メーカの保証も修理も受け付けられなくなってしまいます。
改造は自己責任でお願いします。


ではマイスターに提出する実験レポートを書いて行きます。
1・妖怪ウオッチ零式 プログラム編
   ・イントロダクション
   メダルパターンデータ
   メダルデータ出力      
   テスト
   落とし穴
   メダルデータ解析結果
   プログラムソース

2・妖怪ウオッチ零式 工作編
   ・分解
   加工 (2015.02.28 修正
   組み立て
3・其の二(赤外線)
  妖怪ウオッチ零式 改造大実験 其の弐





2015年2月15日日曜日

妖怪ウオッチ零式 工作編 分解

1.それでは順に分解していきます。
電池ボックスの蓋を開け
オレンジの丸の中のネジを
外します。





2.そうすると上面のドームが引き抜けます、
メダル識別SW S3、S4、S5、S6が見えます
この状態でSWに結線し、テストすることが出来ます
そのときは電源は電池ボックスの端子につなぎます。







3.次に赤丸のネジを外すと
裏蓋が開きます。線を切らないように
そーっと開いていきます。








4.ケーブルは上部の基板のある方の丸い穴のなかに
折り畳んで差し込んであります。(引き出します)
スピーカーのケーブルはハンダ付け部分が切れやすいので
注意が必要です。
裏蓋を開けると、電池ボックスの両端に+とーの端子が見えるので、ここにクリップで電源をつなぐと簡単です。
サーチライトの透明カバーはハサミ込み部が円ではなく
楕円になっているので、組み立てのときにはめ込む向きがあります。

戻る




2015年2月14日土曜日

妖怪ウオッチ零式 工作編 加工

最初にCPUを取り付けるための加工をします。
基板を外して、基板の下にAVR2313を配置します。
基板を汚したくなかったので、ケースに取り付けることにしました。




基板の裏にあるコンデンサをよけて、CPUを置く位置を決め、足を差し込む穴を開けます。
手持ちの2mmのドリルで穴をあけました。




ケーブル引き出しの丸い穴がCPUでふさがれるので
その分穴を広げておきます。






CPUの足に線をハンダ付けして、足穴におさめます。






ウオッチのS3、S4、S5、S6につなぐ線を上部に引き出し。基板の表側でSWにつなぎます。





これで基板との接続はおわり、
ポート出力はダイオードを介して接続します。
相手先がどうなってるかわかりませんし、S3,4,5,6がメダル投入でONになったときに逆流しないようにです。


ダイオードにチューブをかぶせて被服します。






修正
S3,4,5,6 sw接続は細い線にしないと、メダルの挿入が微妙にキツくなり心地よくありません。
ですから、細い線に張り替えました
電源の+は電源スライドSWの真ん中にハンダ付けします。
GNDはウオッチの電池BOXのマイナス側端子まで持って行きハンダ付けします。

さていよいよ難題のSW取り付けです。
作業がしやすいように、裏蓋単体にします。
赤い電池BOXの部分も外し、ます。
穴はタクトSWの高さ6mmが収まる位置に開けますが
右側にはネジの受け柱があってぎりぎりの位置にしか

配置できません。仕方なく受け柱を削って、正確にはヤスリ
が入らないので、半田ごてでとかしてかわしました。
SWの下部が少しケースにあたるので、そこも溶かしてスペースを確保、非常に危険な作業です、失敗したら取り返しがつきません、後からですがいま思えばアクリルカッターで削ることが出来たも。
配置できません。仕方なく受け柱を削って、正確にはヤスリ
が入らないので、半田ごてでとかしてかわしました。
SWの下部が少しケースにあたるので、そこも溶かしてスペースを確保、非常に危険な作業です、失敗したら取り返しがつきません、後からですがいま思えばアクリルカッターで削ることが出来たも。

接着面積がすくないので、SWの接着材は仮止めとして、
後ろの隙間をアクリル板のかけらで埋めることにします。
そのためには赤い電池BOXの部分との間に挟み込まなければなりません。作業のため、やむなく電池BOXの電源ラインとスピーカーの線を外しました。
なんとかSWも固定できたので。
あとは外した配線をもどし、
追加SWのGNDは電池BOXへ、CPUからの割り込み入力をSWに接続して、配線はおわりです。




部品データ  
・小信号用ダイオード 4本
・ATTINY2313-20PU  1個 ¥230(税込)2015.2.25(株)秋月電子通商
・タクトスイッチ(白) (10個)1パック ¥120(税込)2015.2.25(株)秋月電子通商


戻る

                                                     

2015年2月13日金曜日

妖怪ウオッチ零式 工作編 組み立て

 1.裏蓋を閉じてネジを締めます。
閉じるときに、ケーブルを上部の基板のある方に
押し込んでやる必要があります。
ケーブルを押しつぶさぬよう、位置決めにマスキングテープなどで固定すると良いでしょう。
2.裏蓋を閉めたら、上部のドームを取り付けます、
取り付け穴を覗いて、線が横切っていたなら、もう一度裏蓋を開けて、どかします。
(写真が古いのでダイオードが付いていません実際はS3.4.5.6SWにダイオードが付きます 加工参照)



3.ドームをのせます。
4.裏のネジを締めれば完成です。






戻る

2015年2月12日木曜日

妖怪ウオッチ零式 プログラム編 イントロダクション

AVR2313を使ってプログラムを作っていきます。
基本は追加SWの状態を見て、妖怪ウオッチのメダル識別SWをON/OFFすることです。
まずは回路図を。

召還SWと種族切替えSWを割り込み端子につないで
SW割り込みにより、プログラムが起動されるようにします。
押されたSWが決まれば次は、メダルのパターンを出力ポートに順次出力するだけです。
このときメダル挿入時の出力と、メダル抜き出し時の出力は
出力パターンが真逆になるので、それぞれ処理を用意します。

・プログラム構成
 プログラムは以下のような構成にします。
  ・初期化処理
  ・割り込み処理
    INT0:召還SW割り込み処置
    INT1:種族変更SW割り込み処理
  ・アイドル処理
    召還処理
    種族変更処理
    スリープ処理
・初期化処理
 a)PORTB、PORTDの方向設定とプルアップルの指定を行います。
   DDRB  = 0xff//方向設定レジスタの指定  x1111 1111
  DDRD  = 0xb3//方向設定レジスタの指定  x1011 0011
  PORTD = 0xff;    // データレジスタの指定
 b)スリープモードの指定。
 SWが押されずなにもすることがないときにスリープ状態にして
 電池の消耗を押さえることが目的です。初期化処理で
  #include <avr/sleep.h>
  set_sleep_mode(SLEEP_MODE_PWR_DOWN); と指定することで、
パワーダウンモードのスリープとなり、クロック発信器を停止させ、クロックの供給を停止します。外部割り込みは動作を継続します。WDTを停止させておけば 0.3μAしか電池を消耗しなくなります。 電池で動く物には必須ですね。

・割り込み処理
  #include <avr/interrupt.h>
ISR (INT0_vect,ISR_BLOCK) // 召還 SW 割り込み
{
    //召還 SWが押されたことを記録
    sw_stat = NEXT_SW;
}

ISR (INT1_vect,ISR_BLOCK) // 種族きりかえ SW 割り込み
{
    //種族きりかえ SWが押されたことを記録
    sw_stat = CHANGE_SW;

}

sw_stat変数は、アイドル処理で参照するので、volatile指定にします。
volatile unsigned char sw_stat = 0;//割り込みSW押下状態(族切り替えSW,召還 SW

・アイドル処理
  アイドル処理は、SWの押された状態を判断して、各々の処理を行います
そして最後にスリープします。次にSWが押されるまで停止します。
for (;;)
{
   //SW 状態により各、メダルパターン出力処理を実行
   sleep_mode(); //スリープ開始。

}

戻る

2015年2月10日火曜日

妖怪ウオッチ零式 プログラム編 メダルパターンデータ

メダルのパターンデータは、メダルの裏の突起で決まります。
頭の方から4列になる4ビットのデータ列です。
そのうちの最後の列はターミネータのようで、
0b1010固定となっています。
このメダルの場合固定データを除くと以下のように
なります。
{0b0110,0b0101,0b1100},//ダークニャン
このデータをテーブルに登録して順に出力して行きます。



const uint8_t pat_array[][3] = {
{0b0110,0b0101,0b1100},//ダークニャン
・・・・・・・・・・・・・
・・・・・・・・・・・・・
};
しかしAVR2313はデータエリアが128バイトしかありません100種類以上もの妖怪をおさめきれません。 そこでこのデータはPROGMEMをつけてプログラムエリアに配置することにします。
PROGMEM const uint8_t pat_array[][3]  ={

全てのデータは一元管理され、順番に取り出すことが出来ますがあまりに多すぎます、そこで種族ごとに切り替えて、その種族の先頭から順に取り出すことにします。その種族最後までいったら、またその種族の先頭に戻ります。
別の種族に行くには種族切り替えSWで切り替えます。

種族の先頭を管理するために、一つ管理テーブルを用意します。
ここには各種族ごとの先頭、最終オフセットを格納します。
struct CTL_TBL{ //族情報インデックス管理テーブル
    unsigned char top_offs;//族情報先頭オフセット
    unsigned char end_offs;//族情報最終オフセット
}ctl_tbl[ZOK_MAX]={
    {ZOK1_TOP,ZOK1_MAX-1},           //イサマシ族
    {ZOK2_TOP,(ZOK2_TOP+ZOK2_MAX)-1},//フシギ族
    {ZOK3_TOP,(ZOK3_TOP+ZOK3_MAX)-1},//ゴーケツ族
    {ZOK4_TOP,(ZOK4_TOP+ZOK4_MAX)-1},//プリチー族
    {ZOK5_TOP,(ZOK5_TOP+ZOK5_MAX)-1},//ポカポカ族
    {ZOK6_TOP,(ZOK6_TOP+ZOK6_MAX)-1},//ウスラカゲ族
    {ZOK7_TOP,(ZOK7_TOP+ZOK7_MAX)-1},//ブキミー族
    {ZOK8_TOP,(ZOK8_TOP+ZOK8_MAX)-1},//ニョロロン族
    {ZOK9_TOP,(ZOK9_TOP+ZOK9_MAX)-1},//カイマ族
    {ZOK10_TOP,(ZOK10_TOP+ZOK10_MAX)-1},//レジェンド族
    {ZOK11_TOP,(ZOK11_TOP+ZOK11_MAX)-1}//その他族
};

種族切り替えSWはこのテーブルのオフセットでぐるぐる切り替えます。
召還SWは現在相対位置インデックスをもとに、このテーブルのメンバ
top_offs;//族情報先頭オフセット
end_offs;//族情報最終オフセット
の内容をもとに、現在種族のメダルパターン位置を算出しとりだします。

戻る

2015年2月8日日曜日

妖怪ウオッチ零式 プログラム編 メダルデータ出力

メダルデータの出力は、AVR2313のポートと
妖怪ウオッチのメダル識別SWをつないで行います。PORT出力”1”でSW ONです。
PORTDのPD0→S3
PORTDのPD1→S4
PORTDのPD2→S5
PORTDのPD3→S6
 メダル投入時にメダルパターンを4列分出力した後は
メダルぬき出しとして必ず先の逆の順序で4列のパターンを
出力してやらなければ、ウオッチは混乱してしまいます。
連続して妖怪を召還したいので、次のメダルパターンを出力する前に、ちょくぜんのメダルパターンを逆出力して、自動抜き出し動作することにします。
そのために、メダルパターンを取りだして置いておく場所を用意します。
//メダルSW出力メダルパターン格納バッファ
unsigned char pat_buff[4]={0,0,0,0b1010};
固定値のターミネータ0b1010は先に入れておきます。
先頭から3バイトには登録してあるメダルデータを取り出し格納します。
メダル投入(召還)、抜きだし処理は、ここのデータを参照してポートに出力します。

出力タイミングは以下のようにしました。
PORTD=pat_buff[0];
_delay_ms(60);
PORTD=0;
_delay_ms(60);
PORTD=pat_buff[1];
_delay_ms(60);
PORTD=0;
_delay_ms(60);
PORTD=pat_buff[2];
_delay_ms(60);
PORTD=0;
_delay_ms(60);
PORTD=pat_buff[3];
_delay_ms(60);
PORTD=0;

またメダルの抜き出し時には、抜き出し音声が発生するので。
抜き出し出力処理
_delay_ms(2000);
次の召還出力処理
 と言うように、抜き出し音声の終了を待ってから次の召還を行います。
戻る