一定期間更新がないため広告を表示しています
JUGEMテーマ:鉄道模型
へのへのもへじさんが開発したリレー搭載デコーダをご提供して頂きましたので試してみました。このデコーダ、リレーが沢山載っているのが特徴で結構リッチな仕様です。使い方もポイント切り替えモードやロコモードがあります。DCCベースのコントローラから操作すればのポイントやアクセサリを色々と一斉に操作できるので、ジオラマ向けには打ってつけな多機能なデコーダだと思います。
◇巨大なコンデンサが付く、割と大柄なデコーダです
ターミナルが4CH分用意されているので操作したい対象物が多い程、このデコーダが得意とする所だと思います。つなぎ方次第でかなり効果的な使い方が出来そうなのですが、まだ細かい部分の使い方が良くわかっていないので、最低限の繋ぎ方で試してみます。
お試しはポイントモードで動かしました。リレー式と巨大なコンデンサーのバックアップでかなりパワフルにポイントをサクサクと切り替えてくれます。切り替えミスは皆無で非常に心地良い動きをしてくれます。
1CH当たりどれくらいポイントをぶら下げられるのか、能力の限界はわかりませんが、今回Nゲージ用のKATOとTOMIXの混合で3ポイントマシーン分を繋いで試してみましたが、これでもまだまだ余裕綽々な感じでした。
◇こんな使い方が良いものなのかわかりませんがあやのさんのフィーダ基板を使ってKATOとTOMIXのポイントをミックスして繋いで動かしています。
1CHでも非常にパワフルに切り替えてくれますが、これが4CH分装備されています。ポイントを沢山並べたヤードの様なジオラマには最適そうな一品がまた一つ生まれたみたいです。
JUGEMテーマ:鉄道模型
先日、秋葉原のとある中華系の部品屋に電子部品を買いに行った時に、激安のキーパットを見つけました。何かに使えると思いその時は特に考えもせず、ただ安いというだけで買ってしまったのですが、買ったことを忘れてしまわない内に何か物にしないといけないと思い、なごでん様が頒布しているMP3サウンドキューブに着けられそうだったので、チャレンジしてみました。
◇この様な商品です。安いというだけで購入してしまいました。一応「KP16121C4×4」の品番で商品管理されているみたいです
_
買った物はI2C接続の4×4キーパットのキットです。価格はワンコインです。キット形式ですが激安だと思います。だた、適当な包装に基板と部品しか入ってなく、組み立て説明書などはありません。お店のサイトには「びんぼうでいいの+<Keypad_I2C.h + Keypad.h>ライブラリで動作を確認しております。」とだけ記載があります。これでよく売っているなあと思いますが、(買う方も買う方なのですが・・)極限までコストを切り詰めるとこうなるのだと思います。あとは「購入者の技量でなんとかしろ」というジャンク屋級の販売スタンスのようです。
組み立てはハンダ付けになります。10分程度です。ピンヘッダは付いていないので手持ちのものを使いました。ここまでは何も問題はありません。ここからが中華Aお決まりの迷走への旅が始まります。
◇キーパットのブツだけの完成はハンダ付けだけですぐ終わります。(ここから完成までが長い・・)
組み立ては済んだので、MP3サウンドキューブに接続するためのソフトの準備です。本当にこれだけで動くのか不安になるようなあっさりとした説明の<Keypad_I2C.h + Keypad.h>ライブラリを取り合えずダウンロードして、動くと噂のKeypadライブラリーを適当に取り込んで改造しました。
使えそうなライブラリーは下記でした。
・Key.h
・Key.ccp
・Keypad.h
・Keppad.ccp
・Keypad_I2C.h
・Keypad_I2C.ccp
この時点で店側の嘘っぱちな情報が露呈してます。<Keypad_I2C.h + Keypad.h>とありますが、Key.hのライブラリもとりこまないとビルドで怒られます。
サンプルスケッチでコンパイルできるところまでは確認できたので、実際にMP3デコーダのスケッチに組み込んでみます。まずヘッダ周りで必要そうな#include等の定義文(<-部分)を追加しました。
・例題はディーゼルサウンドスケッチ「MP3V5_SQ_DL112_Turbo.ino」で冒頭部分は以下です。
//
// MP3 Sound Decoder V5 DL1 Rev.exp.10
// Copyright(C)'2016- Nagoden / Desktop Station / Fujigaya2 / MECY
//
#include <Arduino.h>
#include <string.h>
#include <avr/pgmspace.h>
#include <avr/eeprom.h>
#include <SoftwareSerial.h>
#include "motor_func.h"
#include "motor_ctrl.h"
#include "VVVF_sound.h"
#include "NmraDcc_x.h"
//#include "TimerOne_x.h"
#include "DFPlayer_Mini_Mp3_x.h"
//I2C KeyPad KP16I2C4X4
#include "Keypad_I2C.h" <-
#include "Keypad.h" // GDY120705 <-
#include "Key.h" <-
#include "Wire.h" <-
/*************************************************
・次に80行目あたりにI2Cコントローラ「PCF8574A」の アドレスを定義しておきました。
お店のサイトには”デフォルトI2Cアドレス:0x38”となっていましたので、一応信じてみました。
//#define I2CADDR 0x38 // keypad on PCF8574A
--------------------------
・次,170行目あたりにキーマップをサンプルコードを参考に追加しました。ここも後からわかったのですが罠がありました。
// I2C keyPAD KP16I2C4X4
const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {0, 1, 2, 3}; // connect to the row pinouts of the keypad
byte colPins[COLS] = {4, 5, 6, 7}; // connect to the column pinouts of the keypad
//initialize an instance of class I2C Keypad KP16I2C4X4
Keypad_I2C kpd(makeKeymap(keys), rowPins, colPins, ROWS, COLS, I2CADDR, PCF8574);
----------------------------
・次,170行目あたりにKey変数定義を追加しておきます。
//I2C KP16I2C4X4
void I2C_Swich_KP16I2C(char Key);
/*************************************************
*
* Functions
*
*************************************************/
--------------------------------
・次,360行目あたりのvoid setup()の中にKeymapをシリアルにセットするコードを追加しました。
void setup()
{
// ソフトウエアシリアル通信レートセット:
Serial.begin(9600);
mp3_set_serial (Serial); //set softwareSerial for DFPlayer-mini mp3 module
pinMode(PIN_BUSY, INPUT); //Mp3 Busy pin 設定
digitalWrite(PIN_BUSY, HIGH); //Internal pull up enabled
//I2C KeyPad KP16I2C4X4
kpd.begin(makeKeymap(keys));
Serial.println("start");
----------------------------------
・次,390行目あたりがこのKeypadのコードのキモにあたるのですが、シリアルのkey信号を割り込みのタイミングで
下部に作った”I2C_Swich_KP16I2C(keys)”へ引き渡す処理を追加しました。
//********** keypad **********************
if ( (millis() - gPreviousL7) >= 500)
{
//I2C Keypad KP16I2C4X4
char keys = kpd.getKey();
if (keys != NO_KEY) {
Serial.println("keys");
I2C_Swich_KP16I2C(keys) ;
}
else if (keys == NO_KEY) {
switch (kpd.getState()) {
case RELEASED:
break;
}
}
//Reset task
gPreviousL7 = millis();
}
------------------------------------
/
次、1365〜1480行目あたりにキーパットが押された時に送られてくるシリアル信号
(この場合はキー配列上にマッピング定義した文字)
がmp3ファイルNo毎に音を出すようにswitch文で割り付けました。
最後はお遊び機能として"*"キーを押した時はランダム再生する感じにしてみました。
//I2C Keypad KP16I2C4X4
//MP3ファイル:0001-0014 に各SWを割り付け
//*SWはMP3ファイル:0001-0014をランダム再生
//#SWはMP3をリセット
void I2C_Swich_KP16I2C(char keys)
{
switch (kpd.getState()) {
case PRESSED:
switch (keys) {
case '0':
mp3_set_volume (gCV58_MP3_Vol);
delay (WAIT_VOLMP3);
mp3_play(1);
break;
case '1':
mp3_set_volume (gCV58_MP3_Vol);
delay (WAIT_VOLMP3);
mp3_play(2);
break;
・
・
・
case '*' :
//PlayMP3_Simple_Foward();
int i, r;
for (int i = 0; i < 14 ; i++) {
r = rand() % 14 + 1; // 乱数を生成する
}
mp3_set_volume (gCV58_MP3_Vol);
delay (WAIT_VOLMP3);
mp3_play (r + 0); // MP3 ファイルNO (1-15)をランダムに指定
break;
}
}
}
keypadとして動かすのに必要そうなコードをスケッチ上に実装して、ビルドエラーも出なくなった所でいよいよMP3サウンドキューブにスケッチを流し込んで動作確認です。セオリーであればでkeypadのキーを押した時にシリアルモニターが想定した信号でちゃんと出てくることを確認するべきなのですが、とにかく動くがどうか速く確認したかったので、MP3サウンドキューブとkeypadをI2C接続して適当にキーを押してみました。反応は今一でしたが、所々キーを押すと鳴りだしたので、おー!!まあまあ出来てるじゃん!とぬか喜びしました。だだ色々といじっていくと音がでるはずのキーで押しても音が出なかったり、音は鳴るけどコード上で想定したキー割り付けになっていないことに気が付きました。
キーマップがミスってるのかと思い少しいじってみましたが、余計音が出なくなったり、症状が悪化する方向だったのでセオリー通りシリアルモニターでキーを押した時に何が出てくるのか調べることにしました。
シリアルモニターでキーを押した時、何が出てくるか観測したところ、数字や文字はとりあえず出してくるのですが、まったくあさっての方向の物が出ていることがわかりました。よくよく見るとどうやらキーマップの定義と90度ずれて基板のパターンが作られている感じでした。「やはり中華品質の罠かよ!」とぶつぶつ独り言をつぶやきながら「でも500円だしな」とも思いました。文句を言える値段ではないのです。しかたなくキーマップのコードは下記の様に調整しました。
// I2C keyPAD KP16I2C4X4
const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
//byte rowPins[ROWS] = {0, 1, 2, 3}; // connect to the row pinouts of the keypad
//byte colPins[COLS] = {4, 5, 6, 7}; // connect to the column pinouts of the keypad
// KP16I2C4X4基板のパターン表示が90度ずれているため[ROWS][COLS]入れ替え
byte rowPins[ROWS] = {4, 5, 6, 7}; // connect to the row pinouts of the keypad
byte colPins[COLS] = {0, 1, 2, 3}; // connect to the column pinouts of the keypad
スケッチを直して、ようやく思う通りのボタンでMP3の音が出る様になったのでこれで完成ー!と喜んでボタンを押しまくって暫く遊んでいましたが、数回キーを押すと音が出なくなる謎の症状が出ることに気がつきました。とうやら電源をONにして数分でkeypadが反応しなくなる感じです。電源が不安定で動きがおかしくなるのかも?と思い色々、電源やGND周りを付け替えてみましたが症状が一向によくなる感じがしません。「これじゃー使い物にならない。ああまた中華品質地獄かよー!」と頭をかかえました。
殆ど諦めモードでI2Cコントローラー「PCF8574A」の情報を漁りながら試行錯誤すること半日あまり・・「アドレス固定しないと動作が不安定になる」との記述が目に留まりました。ふと基板を見ると使っていないランドにそれらしいパターン文字が印刷されています。「これかよー!」と気が付きました。組み立て見本の写真もこのランドは使っていないですし、取り扱い説明書などは一切ないので気が付きませんでしたが、どうみてもピンヘッダーを立ててジャンパーを固定して設定出来そうな感じです。「PCF8574A」の仕様書を見ると確かに、VSSとGNDの固定でI2Cのアドレスが設定出来る事も書いてありました。早速、ピンヘッダを取り付けてアドレスの設定を固定化してみました。
◇蜘蛛の糸の助け、急遽ピンヘッダーとジャンパー(右上部分)を増設しました 設定アドレスは”0x3A”です
コードも下記の様にしてみました
//I2C KeyPad KP16I2C4X4
//#define I2CADDR 0x21// keypad on PCF8574 デフォルト ADRESS
// A2 A1 A0
//#define I2CADDR 0x38 // keypad on PCF8574A L L L デフォルト ADRESS
//#define I2CADDR 0x39 // keypad on PCF8574A L L H
#define I2CADDR 0x3A // keypad on PCF8574A L H L
//#define I2CADDR 0x3B // keypad on PCF8574A L H H
//#define I2CADDR 0x3C // keypad on PCF8574A H L L
//#define I2CADDR 0x3D // keypad on PCF8574A H L H
//#define I2CADDR 0x3E // keypad on PCF8574A H H L
//#define I2CADDR 0x3F // keypad on PCF8574A H H H
ジャンパーでアドレス設定を確実に固定したところ、数分で動かなくなる謎の現象はなくなりました。始めI2Cコントローラ[
PCF8574A]が中途半端に動いていたので気付かずいらぬ迷走をしてしまいましたが、原因が判ってしまえば当たり前の事だと思います。しかし中華Aの罠、わざとユーザを試しているのか、はたまた謎解きパズルのお楽しみを仕込んだつもりなのでしょうか・・。
とにもかくにも1日無駄にはしてしまいましたが、出来てしまえばこちらの勝ちでございます。超格安のI2C keypadがMP3サウンドキューブと合体して使える様になりました。動画を撮ってみましたので、動きを確認ください。
◇音の出具合確認なので車両は特に必要はないのですが、アナログ車両の動力デコーダも兼ねてキハ110を走行させてます。
キーボタンの反応が今一ですが、機能を盛り込みすぎでマイコンの処理が追い付かなくなってきている感じです。デコーダのプログラムサイズもかなり肥大化してきているためギリギリになってきました。
今回試した中華Aのkeypadが動くDLとELのスケッチを作ってみましたので貼っておきます。
(SL版も作ろうと思ったのですが容量制限の上限オーバで作れませんでした)
・DL版
・EL版
中華AのI2C keypad 値段それなりのチープな入力機材ですが、そこそこに使える事や使い方のクセが分ったので、その気になればDsAir2やミント缶の機能拡張機材として応用できるのではないかと思います。
(C) 2024 ブログ JUGEM Some Rights Reserved.