Dream Ware DPASS 緊急地震速報発報システム MODEL SH200-Jの分解
注意:この記事の内容を鵜呑みにし、事故や損失を招いた場合でも当方は一切の責任は負いかねます。自己責任でお願いします。
電子機器分解シリーズです。
本機は緊急地震速報の情報をネットワークを用いて受信するための装置です。
本体裏面にあるシリアルIDをサービス提供会社に知らせることで、緊急地震速報の情報を取得できます。(有料、月額約10000円?)
地震が来るまでの秒数を含めた警報を表示できます。主に法人向けの装置です。
本体には"3SOFT"と印字された上から"DPASS"シールが貼られています。
同様に"Digital Catfish"と印字された上から"Dream Ware"シールが貼られています。
3SOFTの「デジタルなまず」のOEM版ということでしょうか?
専用ACアダプタ : DEP-1208A 12V 800mA
ICの生産年は2006年台が多いです。
MCUは沖電気のML674000 ML67Q4003-INNN (ARM7/TDMI)が入っていました。
「OKI L67Q4003-INNN」 沖電気 ML67Q4003-INNN ML674000シリーズ ARM7/TDMI 32bitマイクロコントローラ BootROM:4KB, Flash:512KB, SRAM:32KB
沖電気のマイコンが使われているのは珍しいですね。
JTAGだけでなく、UART書き込みにも対応しています。
開発環境さえ手に入れば再利用できそうです。
「OKI L2216-016」 沖電気 ML2216 ADPCM2 Algorithm-Based Speech Synthesis LSI
MaskROM品 ROM番号016
音声再生LSIです。
内部にサンプリングデータが入った8MbitのROMがあり、フレーズ番号を指定することで音声が再生されます。(最大256フレーズ)
音声データの書き換えはできないもものの、地震に関する音声(震度や秒数、効果音)が入っているので、何かしら再利用できそうですね。
フレーズ番号ごとの音声データとArduinoサンプルプログラムは、このページ一番下に示します。
「S353 90A」 ABLIC S35390A リアルタイムクロック
「Atmel ATmega168V 10AU」 Atmel ATmega168V10AU 8bit AVRマイクロコントローラ Flash:16KB, SRAM:1KB
フラッシュのAVRマイコンです。再利用できそうです。
「SAMSUNG K4S641632H-UC75」 SAMSUNG K4S641632H-UC75 4M*16bit 64Mbit SDRAM
「PROCHILD VER 1.3 CS449XJPAA」 詳細不明 無線モジュール
周波数 : 449.7125~449.8750MHz
変調方式 : FSK
「ATMEL614 93C46」 ATEMEL AT93C46 1Kbit EEPROM
「RTL8019AS」 REALTEK RTL8019AS 10BASE-T イーサネットコントローラ
「SIPEX SP3243ECA」 SIPEX SP3243ECA RS-232トランシーバ
・基板裏面
デバッグ用にUART端子(ミニジャック3P)が用意されています。
このUART端子はAVRマイコンへ接続されています。
シルクRXDが出力(ジャック中端SH200-J→ホスト)、TXDが入力(ジャック先端SH200-J←ホスト)、ボーレートは38400bpsです。
通電中はRSSI(電波強度?)の状態の情報を吐き出します。
おそらくこの端子は無線モジュールまわりのデバッグようでしょう。
・LCD
「SK0621」 バックライトパネル印字
「221-3059-0657 S0 060521-0016」 LCD本体シール印字
「11-NE084 0619」 LCDフレキ印字
詳細不明の26pin LCDです。
回路起こしをした結果、SLG12864PというLCDの仕様に近いことがわかりました。
SLG12864PのコントローラはNT7538というものが使われています。
SLG12864P自体は28pinのLCDですが、このLCDは27pinと28pinが省かれています。
このLCDは、秋月電子などでよく販売されている12864系のものとバス制御方式が違います。
80系のバス制御に近い/RD, /WE, /CS, A0コントロールとなっています。
LCDコマンドも微妙に異なっているため、よくある12864LCDをそのまま付け替えることはできないようです。
SH200-JのLCD駆動用チャージポンプ回路をみると、3倍電圧回路(3x step-up voltage circuit)となっています。
NT7538はチャージポンプ回路次第で2, 3, 4, 5倍の任意の倍電圧回路とすることができます。
電源電圧が3.3Vの場合は3倍電圧、3.0Vの場合は4倍電圧にすると良いでしょう。
SH200-JのLCD周りの回路
SLG12864Pのピンアサイン
・ML2216-016のサンプリングリスト
ROM番号016
サンプリング番号 : 音声の内容
0 : "ぜろ"
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 : 効果音 1 ピ
54 : 効果音 2
55 : 効果音 3
56 : 効果音 4
57 : 効果音 5
58 : 効果音 6
59 : 効果音 7
60 : 効果音 8
61 : 効果音 9
62 : 効果音 10
63 : 効果音 11
64 : 効果音 12
65 : 効果音 13
66 : 効果音 14
67 : 効果音 15 警告音
68 : 効果音 5
69 : 効果音 10
70 : 効果音 15 警告音
71 : 効果音 16
72~255 : なし
・ArduinoでML2216再生テストプログラム
//ML2216再生 テストプログラム
//https://oykenkyu.blogspot.com/2024/10/sh200-j.html
//©oy
#include <avr/pgmspace.h> //プログラムフラッシュから文字データを読み込むのに必要
#define SERIALSPEED 38400 //UARTのボーレート38400bps@16MHz
//ピン
#define GPIO_MOSI 11 //ML2216 : 29pin
#define GPIO_CLK 13 //ML2216 : 28pin
#define GPIO_CS 10 //ML2216 : 27pin
#define GPIO_RST 9 //ML2216 : 26pin
//ML2216の25番ピンDIPHは常にLにしておく
unsigned char input_num_buf[64];//数値入力バッファ
void setup()
{
pinMode(GPIO_CLK, OUTPUT);//CLK
pinMode(GPIO_MOSI, OUTPUT);//MOSI
pinMode(GPIO_CS, OUTPUT);//CS
pinMode(GPIO_RST, OUTPUT);//RST
digitalWrite(GPIO_CLK, 0);//CLK
digitalWrite(GPIO_CS, 0);//CS
digitalWrite(GPIO_RST, 0);//RST
delay(500);
digitalWrite(GPIO_RST, 1);//RST
Serial.begin(SERIALSPEED);
}
void loop()
{
long input_num = 0;
Serial.print(F("ML2216 PLAY TEST\r\n"));
Serial.print(F("\r\n"));
spi_out(0b00000000);//パワーオン
//再生したい番号を入力してEnter
while (1)
{
Serial.print(F("PLAY.NO 0~255?\r\n"));
input_num = serial_get_dec();//数値を入力してEnter
Serial.print(F("\r\n"));
spi_out(0b01100000);//音声停止
spi_out(0b10100000 | 14);//音量 値が小さいほど大きい音量となる
spi_out(0b01000000);//再生
spi_out(input_num);//再生するサンプリング番号
spi_out(0b10000000);//ループ再生有効
}
//1秒ごとに再生するサンプリングIDを切り替えるやつ
/*
for (int i = 0; i < 256; i++)
{
spi_out(0b01100000);//音声停止
spi_out(0b10100000 | 14);//音量
spi_out(0b01000000);
spi_out(i);
delay(1000);
}
*/
}
//SPI出力
void spi_out(unsigned char data)
{
delayMicroseconds(100);
digitalWrite(GPIO_CS, 0);
delayMicroseconds(10);
send_data_msbf(data, 8);
delayMicroseconds(10);
digitalWrite(GPIO_CS, 1);
delayMicroseconds(20);
}
//UART10進数値入力待ち
long serial_get_dec()
{
int i;
unsigned char inByte = 0x30;
unsigned char in_pos = 0;
unsigned long ret_num = 0;
while ((inByte != '\n') && (inByte != '\r') && (in_pos < 128))
{
if (Serial.available())
{
inByte = Serial.read();
Serial.write(inByte);
if((inByte != '\n') && (inByte != '\r'))
{
input_num_buf[in_pos] = inByte;
in_pos++;
}
}
}
Serial.print(F("\r\n"));
for(i=0;i<in_pos;i++)
{
if((input_num_buf[i]>='0') && (input_num_buf[i]<='9'))
{
ret_num = (ret_num*10) + (input_num_buf[i] - '0');
}
else{
ret_num = -1;
break;
}
}
ret_num = (ret_num < 0) ? -1 : ret_num;
//現在までに入力されたバッファを破棄
while (Serial.available())
{
Serial.read();
}
return ret_num;
}
//任意のビット数送信(MSB側から送信、最大32bit)
void send_data_msbf(unsigned long data, char len)
{
len--;
for(int i=len;i>=0;i--)
{
digitalWrite(GPIO_MOSI, (data>>i) & 0x00000001);
delayMicroseconds(4);
digitalWrite(GPIO_CLK, 1);
delayMicroseconds(4);
digitalWrite(GPIO_CLK, 0);
}
}