2012/09/30

docomo ケータイ補償 お届けサービスを解約しました

早いもので,携帯電話をSC-02Cに変更して1年が経過しました. 購入当時のAndroidのバージョンは2.3でしたが,アップデートを繰り返して現在は4.0です. 特に不満もなく使用しているのですが,やはり新しい製品には心が惹かれますね. KDDIやSoftBankでもLTEのサービスが開始されたことですし,1年後には他社乗り換えも視野に入れておきたいところです.

さて,購入後1年というちょうど良い機会なので,ケータイ補償 お届けサービスを解約しました. ケータイ補償 お届けサービスについては,下記リンク先をご一読ください.

新規契約や機種変更の際に,任意加入のオプションサービスとして勧められるサービスの1つです. 私は携帯電話を水没させてしまった経験があるので加入していたのですが,1年経過したので解約することにしました. この1年でスマートフォン事情も変化しましたし,補償対応時の負担金を払うことを考えると,買い替えを考えても良い頃合と言えなくもないからです. 月々399円もかかりますしね.

解約方法

解約に際して不便なのは,My docomo上で解約手続きができないことですね. 今回は携帯電話から「151」に電話をかけて解約手続きを行いました. 近くにドコモショップがないので…. だいたい以下のようなフローで解約手続きが進みます.所要時間は3分程度です.

  1. 携帯電話から「151」に電話する
  2. 自動音声にしたがって番号を入力する.「0」を入力するとオペレータに転送される
  3. 解約の意思をオペレータに伝え,携帯電話番号と氏名を口頭で伝える
  4. もう一度自動音声に切り替わるので,契約時に設定した暗証番号を入力する
  5. 再度オペレータに切り替わり,最終意思確認と注意事項の話が一通りあって終了
製品紹介
2012/09/25

秋月電子通商のテスタを修理・改造

私は,秋月電子通商で販売されているポケット・デジタルマルチメータ(テスタ) P-10を使用しています. 1000円という低価格の製品であるにも関わらず,多機能で,一般的な電子回路製作で困ることはありません.

ただ一つ難点なのは,故障しやすいということだと感じています. 特に多いのがテスタリードの断線です. 本製品のテスタリードは本体に直結されており,本体の中にテスタリードを収納できるようになっているのですが,繰り返しテスタリードを出し入れしていると,断線することがあります. 私の周囲でも,何人かの友人が経験しています.

私のテスタも,テスタリードが断線して使用できなくなりました. 他の製品に買い換えようかと考えましたが,欲しくなる機種は高価で,コストパフォーマンス面でP-10に勝るものがないという結論に至りました. しかし,P-10をもう一度買うというのも気が乗らなかったので,断線したP-10を修理・改造してみることにしました.

修理・改造後のP-10

修理・改造前と作業中の写真がないため,作業完了後の写真になります. 修理に際して故障箇所を確認したところ,電池ボックスの端子の劣化・折損が起きていることも判明しました.


修理・改造後のP-10

電池ボックスの端子はゼムグリップから自作して交換し,テスタリードは市販品に置き換えてみました.

テスタリードを端子接続式に変更しています. 元々はテスタリードの収納スペースだったところに穴を開け,端子を取り付けました. これで断線の可能性が軽減されるはずです.


テスタリードの換装

新しいテスタリードは先端が取り外し可能で,数種類から選択できるものです. このテスタリードのセットは,大阪日本橋のデジットに売っていたものです.当時,確か480円でした.

誰かの参考になれば幸いです.


テスタリードのセット
2012/09/24

京阪5000系 40周年記念ヘッドマーク

HDDを整理していると,2年前に撮影した写真が出てきました.京阪5000系が40周年記念ヘッドマークを掲出して走行していた時の写真です.2010年12月に撮影したものですね.

折角なので,ここに掲載しておきます.

京阪5000系(旧塗装) 40周年記念ヘッドマーク 関目駅

京阪5000系(新塗装) 40周年記念ヘッドマーク 関目駅

京阪5000系(新塗装) 40周年記念ヘッドマーク 守口市駅
細密イラストで見る京阪電車 車両の100年 (NEKO MOOK 1472)

ネコ・パブリッシング
売り上げランキング: 408524
2012/09/20

FPGA入門 - Terasic DE0+FTDI FT232RLでシリアル通信(UART)

前回の記事では,Terasic DE0上のRS-232 Serial Portと自作シリアルケーブルによってシリアル通信を実現しました. しかし,RS-232準拠のシリアル通信に使用するD-sub9端子(COMポート)は既にレガシーインタフェースであり,PCに標準搭載されることも稀となっています.

この代替として使用されるのがUSB-シリアル変換ケーブルやUSB-シリアル変換モジュールです. これらのデバイスはPCに仮想的なCOMポートとして認識され,アプリケーションからは従来のシリアル通信と同様に制御することができます. 前者のUSB-シリアル変換ケーブルを使えば,シリアルケーブルやデバイスのD-sub9端子をPCのUSB端子に接続できます. USB-シリアル変換ケーブルは家電量販店でも販売されており,入手は簡単です. 後者のUSB-シリアル変換モジュールはマイコンなどから直接入出力可能な5.0Vや3.3Vなどの信号電圧に対応しているものが多く,自作電子回路などで仮想COMポートを使用したシリアル通信を実装したいときに便利です. 各社からさまざまな製品が発売されており,電子部品店などで入手できます.

DE0のGPIOの電源電圧(VCCIO)は3.3Vです. 今回はUSB-シリアル変換モジュールを用いてシリアル通信を実装してみました.

USB-シリアル変換モジュール

USB-シリアル変換モジュールに採用されているICは2種類に大別できると思います. 1つはFTDI社のFT232シリーズで,もう1つはSilicon Laboratories社のCP210Xシリーズです. どちらも基本的な機能は同様ですので,細かな仕様の違いのほか,モジュールの寸法,各コネクタ形状や価格などを総合的に比較して製品を選択すると良いでしょう. DE0と接続する場合,3.3Vの信号電圧に対応している必要があります.

私は,Strawberry Linux社から発売されているUSB-シリアル変換モジュール FT232RXを採用しました. このモジュールにはFTDI社のFT232RLが搭載されています.

下の写真は,モジュールのキットを組み立てた状態です. キットにはICと周辺部品が実装済みのプリント基板,USB Type-B端子および2x10ピンヘッダが付属しています. これらをはんだ付けすることで,モジュールが完成します. ここでは,VCCIOの電圧を簡単に切り替えできるように1x3ピンヘッダとジャンパを別途取り付けています. これらの部品がなくても動作しますが,後々他の回路で使いまわす可能性があるなら実装しておいて損はないと思います.


Strawberry Linux社 USB-シリアル変換モジュール FT232RX
DE0と接続する
USB-シリアル変換モジュールを用意したら,後は簡単です. フロー制御を行わず,モジュールへの電源供給にUSBバスパワーを使用する場合は,RXD,TXDおよびGNDの合計3本の信号線のみ結線すればOKです. RXDとTXDはGPIOの適当な入出力端子にアサインします.

これで,PCがD-sub9端子を搭載していない場合でも,UARTによるシリアル通信を仮想COMポートを使用して実現することができます.


DE0とFT232RX
2012/09/18

FPGA入門 - Terasic DE0でシリアル通信(UART)

FPGAとPC間の通信インタフェースを考えたとき,比較的簡単に実装できそうなものとして,UARTによるシリアル通信が挙げられると思います. FPGAボードにD-sub9端子(COMポート)が実装されていれば,この端子とPC側のD-sub9端子をシリアルケーブル(クロスケーブル)で接続することで,RS-232準拠のシリアル通信が可能なはずです. しかし残念ながら,Terasic DE0にはD-sub9端子が実装されておらず,シリアル通信を行うためには一手間必要となります.

DE0のRS-232 Serial Port

DE0はD-sub9端子を備えていないものの,RS-232準拠のシリアル通信を行うために必要なICが実装されており,このICを経由してFPGAに接続されている各信号線を引き出すためのテストポイントが用意されています. ICはADM3202で,これはFPGAの入出力電圧とRS-232準拠の伝送信号電圧の相互変換を行う機能を持っています.

私は,ここにピンヘッダをはんだ付けしました.下の写真はピンヘッダ実装後のものです.


DE0のRS-232 Serial Port(テストポイント)
シリアルケーブルの作成

次に,ピンヘッダに接続するシリアルケーブルを作りました. フラットケーブルのFPGAボード側はQIコネクタ,PC側はD-sub9ピンコネクタ(メス)になっています. ほとんど考慮する必要はないかと思いますが,ノイズの影響を抑えるためにケーブルは短めとしました. このためケーブル長が足りない場合は,ストレートのシリアルケーブルもしくはUSB-シリアル変換ケーブルを接続する必要があります.


シリアルケーブルの配線図

シリアルケーブルのD-subシェル内部
完成

完成したシリアルケーブルをテストポイントに接続した様子です. VHDLでUARTを記述してシリアル通信が行えるかテストしてみましたが,正常に動作しました.


Serial Cable for Terasic DE0
製品紹介
2012/09/09

四日市・名古屋旅行に行ってきました 1日目

青春18きっぷ有効期間の最後の2日間を使って,四日市・名古屋旅行に行ってきました. 1日目は近々廃線が決定される可能性のある近鉄の内部線・八王子線,2日目は名古屋臨海鉄道を訪問しました. 本記事に掲載されていない写真もありますので,よろしければ下記リンク先のアルバムをご覧ください.

四日市・名古屋旅行

自宅からは関西本線経由でJRの四日市駅まで行き,近鉄四日市駅までは三重交通の路線バスを利用しました. 残念ながら,当日午前中は豪雨に見舞われ,あまり写真を撮影できませんでした.午後になってから雨が止み,なんとか屋外で行動できるようになりました.

内部線と八王子線の分岐駅である日永駅で撮影した写真です.軌間762mmの特殊狭軌を走る小型車両で,カラフルな塗装も目を引きます.


日永駅にて

こちらは西日野駅から日永駅に到着する,八王子線の車両です.


日永駅付近にて

日永駅から南日永駅まで歩く間に撮影しました.大きなパンタグラフが特徴的です.


日永駅 - 南日永駅間にて

こちらは南日永-泊間で撮影した写真です.


南日永-泊間にて

写真撮影と同時にコンデジで撮影した動画です.

ふたたびJRの四日市駅です.ちょうど,DD51牽引の太平洋セメントのセメント貨物列車が停車していました.


太平洋セメントのセメント貨物列車
製品紹介
近鉄湯の山特急&内部・八王子・北勢線 [DVD]
テイチクエンタテインメント (2001-07-25)
売り上げランキング: 90,394
2012/09/03

FPGA / Verilog-HDL入門 - スロットマシンの設計

これまで主にVHDLを使用していたのですが,所属環境が変わってVerilog-HDLを使用する機会が多くなりました. 回路設計自体も初心者から抜け出せていないのに,違う言語に手を出すのは危険な気がしますが,仕方がありません. 今回は,Verilog-HDLの練習として簡単なスロットマシンを設計・記述し,FPGAに実装してみました.200行程度のシンプルな回路ですが,スロットマシンとしての主要な機能は抑えていると思います.

スロットマシンの仕様

今回設計したスロットマシンは,下記のような簡単な仕様を基に設計しました.

  1. スライドスイッチをhigh(= 1)にするとリセット動作
  2. 3個の7セグメントLEDに"0"を表示
  3. スライドスイッチをlow(= 0)にすると7セグメントLEDの数字が回転
  4. "0"~"7"(8種類)の数字を順に表示
  5. 各タクトスイッチを押すと対応する数字の回転が停止
  6. 数字が揃えばフィーバーとし,10個のLEDが点滅
FPGAボード

今回使用したFPGAボードは,Terasic社のDE0です. 下記のソースコードは,Quartus II 12.0 Web Editionでコンパイル可能であり,DE0上で正常に動作することを確認しています. ソースコードは自己責任の上でご利用ください.

スロットマシンの回路構成

下図に今回設計したスロットマシンの回路構成を示します. 青色のブロックは順序回路を,緑色のブロックは組合せ回路を表しており,合計5種類のモジュールで構成されています. 斜体の白字はモジュール名を,黄色の字はモジュールの入出力を示していますが,clk入力は字を省略し,赤色の配線で表現しています.


スロットマシンの回路構成
スロットマシン・コントローラのステートマシン

下図にコントローラのステートマシンを示します. 黒字は各状態への遷移条件,赤字は状態遷移時の動作を示しています. 各7セグメントLEDに同時に表示される数字が異なるように,各カウンタの回転開始時期をずらしています(全タクトスイッチ同時押下によるフィーバーの防止).


スロットマシン・コントローラのステートマシン
ソースコードの解説

下にソースコードを示します.slot_machineモジュール内には,コントローラのステートマシンとフィーバー判定器が記述されています. 35行目がフィーバー判定器の記述です. ステートマシンの状態がslot_waitかつ全数字の回転が停止しているときに,3個のカウンタの数字が同一であれば,led10モジュールのen信号を"1"にします.

decoderモジュールは,カウンタが保持している数字を2進数表現から7セグメントLED用の信号パターンに変換する組合せ回路です.

led10モジュールは,フィーバーのときに10個のLEDを点滅させる回路です. slot_machineモジュール内のフィーバー判定器が出力するen信号により点滅動作が制御されます.

counterモジュールは,7セグメントLEDに表示する数字を変化させ,その数字を保持するための回路です. 数字の変化は,slot_machineモジュール内のコントローラが出力するen信号により制御されます.

clk_generatorモジュールは簡易的なクロック分周器です. クロック周波数が高いと7セグメントLEDの数字を視認できないため,クロック周波数を落としています. なお,ここでは,FPGAに外部から入力されるクロックの周波数は50MHzを想定しています.

ソースコード
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
`define max 2
`define length 22
 
module slot_machine(clk, sw, btn0, btn1, btn2, led7_0, led7_1, led7_2, led10);
 
 input clk, sw, btn0, btn1, btn2;
 output [6:0] led7_0, led7_1, led7_2;
 output [9:0] led10;
 
 reg [1:0] state;
 reg en_0, en_1, en_2;
 reg [1:0] cnt;
 
 wire clk_local;
 wire rst;
 wire en_led10;
 wire [2:0] cout_0, cout_1, cout_2;
 
 parameter init = 2'b00;
 parameter slot_start0 = 2'b01;
 parameter slot_start1 = 2'b11;
 parameter slot_wait = 2'b10;
 
 clk_generator uclk_generator(.clk(clk), .rst(rst), .clk_local(clk_local));
 counter ucounter_0(.clk(clk_local), .rst(rst), .en(en_0), .cout(cout_0));
 counter ucounter_1(.clk(clk_local), .rst(rst), .en(en_1), .cout(cout_1));
 counter ucounter_2(.clk(clk_local), .rst(rst), .en(en_2), .cout(cout_2));
 decoder udecoder_0(.din(cout_0), .led7(led7_0));
 decoder udecoder_1(.din(cout_1), .led7(led7_1));
 decoder udecoder_2(.din(cout_2), .led7(led7_2));
 led10 uled10(.clk(clk_local), .rst(rst), .en(en_led10), .led10(led10));
 
 assign rst = sw;
 assign en_led10 = ((state == slot_wait) & ~en_0 & ~en_1 & ~en_2 & (cout_0 == cout_1) & (cout_0 == cout_2)) ? 1'b1 : 1'b0;
 
 always @(negedge clk_local or posedge rst) begin
  if(rst == 1'b1) begin
   en_0 <= 1'b0;
   en_1 <= 1'b0;
   en_2 <= 1'b0;
   cnt <= 2'd0;
   state <= init;
  end
  else begin
   case(state)
    init: begin
     if(rst == 1'b0) begin
      en_0 <= 1'b1;
      en_1 <= 1'b0;
      en_2 <= 1'b0;
      cnt <= 2'd0;
      state <= slot_start0;
     end
     else begin
      en_0 <= 1'b0;
      en_1 <= 1'b0;
      en_2 <= 1'b0;
      state <= state;
     end
    end
    slot_start0: begin
     if(cnt == `max - 1) begin
      en_0 <= 1'b1;
      en_1 <= 1'b1;
      en_2 <= 1'b0;
      cnt <= 2'd0;
      state <= slot_start1;
     end
     else begin
      cnt <= cnt + 2'd1;
      state <= state;
     end
    end
    slot_start1: begin
     if(cnt == `max - 1) begin
      en_0 <= 1'b1;
      en_1 <= 1'b1;
      en_2 <= 1'b1;
      cnt <= 2'd0;
      state <= slot_wait;
     end
     else begin
      cnt <= cnt + 2'd1;
      state <= state;
     end
    end
    slot_wait: begin
     if(btn0 == 1'b0) begin
      en_0 <= 1'b0;
     end
     if(btn1 == 1'b0) begin
      en_1 <= 1'b0;
     end
     if(btn2 == 1'b0) begin
      en_2 <= 1'b0;
     end
     state <= state;
    end
   endcase
  end
 end
endmodule
 
 
module decoder(din, led7);
 
 input [2:0] din;
 output [6:0] led7;
 
 assign led7 = decoder_func(din);
 
 function [6:0] decoder_func;
  input [2:0] din;
   
  case(din)
   3'd0: decoder_func = 7'b1000000;
   3'd1: decoder_func = 7'b1111001;
   3'd2: decoder_func = 7'b0100100;
   3'd3: decoder_func = 7'b0110000;
   3'd4: decoder_func = 7'b0011001;
   3'd5: decoder_func = 7'b0010010;
   3'd6: decoder_func = 7'b0000011;
   3'd7: decoder_func = 7'b1111000;
   default: decoder_func = 7'b0111111;
  endcase
 endfunction
endmodule
 
 
module led10(clk, rst, en, led10);
  
 input clk, rst, en;
 output [9:0] led10;
  
 reg [9:0] led10;
 reg led10_state;
  
 parameter led10_init = 1'b0;
 parameter led10_func0 = 1'b1;
 
 always @(negedge clk or posedge rst) begin
  if(rst == 1'b1) begin
   led10 <= 10'b0000000000;
   led10_state <= led10_init;
  end
  else if(en == 1'b1) begin
   case(led10_state)
    led10_init: begin
     led10 <= 10'b0101010101;
     led10_state <= led10_func0;
    end
    led10_func0: begin
     led10 <= led10 ^ 10'b1111111111;
     led10_state <= led10_state;
    end
   endcase
  end
 end
endmodule
 
 
module counter(clk, rst, en, cout);
 
 input clk;
 input rst;
 input en;
 output [2:0] cout;
 
 reg [2:0] cout;
 
 always @(posedge clk or posedge rst) begin
  if(rst == 1'b1) begin
   cout <= 3'd0;
  end
  else if(en == 1'b1) begin
   if(cout == 3'd7) begin
    cout <= 3'd0;
   end
   else begin
    cout <= cout + 3'd1;
   end
  end
 end
endmodule
 
 
module clk_generator(clk, rst, clk_local);
 
 input clk;
 input rst;
 output clk_local;
 
 reg [`length - 1:0] cnt;
 
 assign clk_local = cnt[`length - 1];
 
 always @(posedge clk or posedge rst) begin
  if(rst == 1'b1) begin
   cnt <= `length'd0;
  end
  else begin
   cnt <= cnt + `length'd1;
  end
 end
endmodule
製品紹介
FPGA ボードで学ぶ組込みシステム開発入門 ~Altera編~
小林 優
技術評論社
売り上げランキング: 80089