フォト
2025年3月
            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          
無料ブログはココログ

« 2018年12月 | トップページ | 2019年2月 »

2019年1月の19件の記事

2019年1月30日 (水)

Arduino用フォントライブラリを更新しました

Arduino用フォントライブラリを更新しました。

  更新ライブラリ
    ・Arduino用 美咲フォントライブラリ 教育漢字・内部フラッシュメモリ乗せ版
      https://github.com/Tamakichi/Arduino-misakiUTF16

     変更点
       ・Utf8ToUtf16()の戻り値の型をbyteからint16_tに変更
       ・未使用変数の削除
       ・非AVR対応
       ・マクロ定数 FONT_TOFU (=0x25a1,豆腐"□"コード)の追加
       ・API関数の説明に少々追記

フォントライブラリはいくつか作成していますが、
今回更新したライブラリは1,710文字(教育漢字1,006字+α)に絞ってフラシュメモリに乗せたバージョンです。

文字列にUTF16/UTF8を使用しているので、Arduino IDE環境で
日本語を含む文字列をそのままプログラムソース上に記述出来ます。

収録フォント

   Photo

  フォントは8x8ドットの美咲フォントを利用しています。
  フォントデータは次のような感じでメモリ上に格納します。

    Fontformat

インストール方法

ライブラリ公開先のリンクをクリックし、ページ右上の「Clone or download」を
クリックして、さらに「Dounload ZIP」をクリックするとダウンロードできます。

20190130

ダウンロード後、ファイルを解凍し、フォルダ内のmisakiUTF16 フォルダを
各自のライブラリ配置場所(\libraries)に入れます。


簡単な記述例1(1文字分のフォント取得)

#include <misakiUTF16.h>

void setup() {
  Serial.begin(115200);

  char font[8];              // フォント格納バッファ
  getFontData(font, "あ");   // "あ"のフォントを取得
  
  // 取得フォントの確認
  for (uint8_t row=0; row<8; row++) {
    for (uint8_t col=0; col<8; col++) {
       Serial.write( (0x80>>col) & font[row] ? '#':' ');
    }
    Serial.write('\n');
  }
}

void loop() {

}

実行結果

Test1

フォントデータの取得処理は、getFontData(font,"あ") のみで完了です。
後半のネストしているfor文は取得したフォントの確認用です。


簡単な記述例2(文字列分のフォントを繰り返し取得)

#include <misakiUTF16.h>

void setup() {
  Serial.begin(115200);

  char font[8];                       // フォント格納バッファ
  char *str="Abcあいうえお、埼玉";    // 文字列

  char *ptr = str;
  while(*ptr) {  // 文字列分ループ
     ptr = getFontData(font, ptr);   // 1文字分のフォント取得
     if (!ptr)
        break;                       // エラーの場合は終了
       
    // 取得フォントの確認
    for (uint8_t row=0; row<8; row++) {
      for (uint8_t col=0; col<8; col++) {
         Serial.write( (0x80>>col) & font[row] ? '#':' ');
      }
      Serial.write('\n');
    }
  }
}

void loop() {

}

実行結果

Test2

文字列に対しても、getFontData()関数で処理できます。
UTF8文字コードは可変バイト長なのですが、getFontData()関数は
次の文字へのポインタを返すので簡単に逐次取得処理を実装出来ます。

ちなみに、getFontData()関数の省略している第3引数にtrueを指定すると
半角文字は全角文字に変換してフォントデータを取得します。

こんな感じで、取得したフォントデータを使って、
LEDマトリックスグラフィック液晶への表示が出来ると思います。

2019年1月29日 (火)

MSX用ゲームカートリッジの中身

改造して利用しようと安価なMSX用ゲームカートリッジを探していると、
ヤフオクで格安品を見つけ、2本 21円で落札出来ました。

到着したカートリッジ

Dscn9573

一応、動作もしてゲームもプレイ出来ました。
CASIOブランドのゲームは人気が無いようで、比較的安く入手出来ます。


中身を見てみます。

写真上のカートリッジ(CASIOのゴルフゲーム)

Dscn9566

TMM27128D-20が2つ入っていました。
容量16kバイトの紫外線(UV)で消去可能なEPROMです。

再書き込みするか、安価なW27C512(EEPROM)なんかと交換して利用出来そうです。

写真下のカートリッジ(パナソフトのサッカーゲーム)

Dscn9571

M38128A-F7との刻印、容量16kバイトのマスクROMと思われます。
こちらもW27C512(EEPROM)なんかと交換して利用出来そうです。

参考文献 1)の仕様を見ると、カートリッジの端子のピン番号5~16が無く
利用出来ない状態です。

Lチカでもやろうと思ったのですが、端子11番のIORQ(I/Oリクエスト信号)が無いので
Z80のOUT命令でのポート出力は出来なそうです。

参考文献
・1) テクハンwiki化計画  1部 ハードウェア 4.1 カートリッジ仕様
・2) TMM27128AD-20 のデータシート(TMM27128Dは見つかりませんでした)

2019年1月27日 (日)

IchigoJam ver 1.3がリリースされました

Ichigojamのバージョン 1.3がリリースされました。
久々に大き目な更新です。

01_2

関連情報
ichigojam お知らせ 2019/1/25 IchigoJam version 1.3 リリース
B Inc. こどもIoTを実現する、こどもパソコン『IchigoJam』ver 1.3 をB Inc.がリリース
    ~さくらインターネットの『sakura.io』を利用した通信用コマンドを標準搭載~
福野泰介の一日一創 - 大人も手軽にIoT! IchigoJam ver 1.3 は何が違うのか?
IchigoJam BASIC リファレンス ver 1.3


---

感想としては、「ver 1.3でやっとまともになった」  です。
個人的にはRENUMの不具合対応が嬉しいです。

些細なことですが、RENUMを実行すると、動いていたプログラムが動かなくなるのは
納得がいきませんでした。

ラベルを使えば回避出来るのだから気にする必要がないとの意見もありますが、
行番号でプログラム実行単位を管理するBASIC言語を採用している以上、
行番号の管理は完璧であるべきです。
特に、教育現場での利用を想定しているのであれば、なおさらです。
言語の性質上、ラベルよりも行番号が使われるのは明らかです。

とりあえずver 1.3では改善が出来たようなので、
また積極的に利用していきたいと思います。

安価なボイスレコーダーをMSX用データレコーダに利用する

MSX用のデータレコーダーの代わりになるのでは? 」 と思い、
安価なマイク端子付きのボイスレコーダーを入手し、試してみました。

今回試した製品

  いつものAliexpressでの購入です。レビュアー数が多く、結構売れているようです。
 
  HIPERDEAL Mp3 Player 8GB Digital Audio Voice Recorder

  01

届いた製品

意外とまともな製品で、立派な箱付き、
付属品としては、説明書、USBケーブル、イヤホン、モジュラージャックなどが付属します。

  Dscn9551

  日本語表示にも対応していました。

  Dscn9502

小型軽量、スピーカー付き、充電対応、金属フレーム、
この価格でこの機能、なかなか良い製品だと思います。

USBケーブルでパソコンに接続すると、ドライブとして認識出来ました。
色々といい感じです。

添付の説明書のスペック的な記載は下記の通りです。

Ccf20190127_0001_front_front


MSXでのデータレコーダとして利用を試し見る

まず、MSX CASIO PV-7で試したのですが、ノーマルのままではダメでした。

簡単なプログラムを作成し、このボイスレコーダで保存し、再生しても
ロード出来ませんでした。

直接録音した音を聞いてみると、音質は良いのですが、音が小さいようです。

出力増幅のため、その辺に転がっていたスピーカー用アンプモジュールを使ってみると

   「うお!」

ロード出来ました。

とりあえず、出力を増幅すれば利用出来ることが分かりました。

Dscn9498

  ※ 実は写真のアンプモジュール、BTL方式のため、この使い方はマズかったです。
      アンプ出力の+、-はGNDから浮いているので、-をライン入力のGNDに接続は
      マズかったです。とりあえず、実験ということで..

トランスを使った、入力電圧の昇圧・インピータンス変換 を試してみる

色々と施行していると、SNSにてトランスを使う方法もあるとのアドバイスを頂き、
面白そうなので試してみました。

色々と調べ、山水トランジスタ用小型トランス ST-32 を利用しました。

 

参考にしたサイト
   ・tools4bikeのblog - ヘッドホン出力・ライン入力間用昇圧トランスキット
   ・秋月電子 ST-32使用ヘッドホン出力⇔ライン入力昇圧トランスキット

この方法の理屈等については、キットの「組立説明書」に解説があります。

結線は非常に楽ちんです。
トランスのリード線をコネクタにつなげるだけです。 

Dscn9514

  ボイスレコーダのライン端子とMSXの間にトランスを入れて試してみると、
     「うぉ~!!」
  しっかりとプログラムがロード出来ました。

  Dscn9510

この方法は非常にいいですね、単純で電池不要です。
目から鱗の方法です。


ケース作り

非常に上手くいったので、使い勝手を良くしようと、ケースを作りました。
3Dプリンターでケースを作ろうと思い、まずは段ボールで試作しました。

Dscn9518

Dscn9519

途中で、だんだんめんどくさくなり、
  「マンドクセ、コノママデイイヤ」
となり、予定変更でコルクシールをカットして、貼り付け

Dscn9520

「完成!」
としました。Otz ..

Dscn9538

意外と強度もありそうなので、良しとします。
本物のテープを使ったデータレコーダやラジカセを使うよりは断然いいです。

Dscn9531

保存したファイルは、USB経由で閲覧できます。
ファイルはWAV形式です。

03

録音品質を一番良くしたのですが、ビットレートは192kbpsのようです。

02



実は、機種によっては増幅・昇圧無しに利用出来た

試しに別のMSXパソコン、National(パナソニック)  CF-2700で試してみると、

Dscn9509

悲しい(嬉しい?)ことに、何も細工せずにダイレクト接続で利用出来てしまいました。
MSX2 FS-A1でもOKでした。

個体差があるのでしょうか
CASIO PV-7は、カセットI/Fがオプションで拡張ボックスを使う方式のため、
特殊だったのかもしれません(30年の経年劣化の影響もあるかも)。

  「今までの苦労は何だったのだろう」

と、ちょっと思いつつも、色々と勉強になりました。


2019年1月23日 (水)

「Z80-CP/M 2.2 emulator running on ESP8266」でのファイル転送

Z80-CP/M 2.2 emulator running on ESP8266を試してみました」の続きです。

Dscn8937

パソコンと cpm8266(Z80-CP/M 2.2 emulator running on ESP8266)間で
ファイルのやり取りの方法の質問があり、私も知りたいと思っていたので、
ちょっと調べてみました。

その際の調査のメモです。

方法としては、XMODEMプロトコルを使う方法があります。
XMODEMは昔、電話回線(モデム利用)でパソコン通信をやっていた頃に
ファイル転送手段として使っていました。

cpm8266では、CP/Mの標準コマンドXMODEMコマンドが正常動作しないようで、
cpm8266の開発者さんが別途、専用コマンドを用意しています。
下記のリンク先に、コマンドの使い方が解説されています。

関連情報
  ・ Xmodem for CP/M Z80 for CON:
     https://github.com/SmallRoomLabs/xmodem80


Windows 10上で試してみる

・TeraTermでは転送出来ず
   XMODEMに対応しているTeraTermで試してみたのですが、
   XSにコマンドによる、Winfows => cpm8266   は出来たのですが、
   XRにコマンドによる、cpm8266 => Winfows    は出来ませんでした。

   下記のサイトのページの一番下にTeraTermで転送出来ている記載があるので
   私の環境に問題がある可能性もあります。

   関連情報
   ・ Homecomputer DDR - cpm8226
・Windows 10上で動くUbuntu環境(WSL)のminicom コマンドで転送成功
   環境がちょっとややこしいですが、
   「Windows 10上にWSLを使ってUbuntuをインストールする」で構築したUbuntu環境に
   minicom コマンドをインストールして使ったところ、転送出来ました。

   minicomのインストール
    %sudo apt install minicom

   XMODEM関連コマンドのインストール
    %sudo apt install lrzsz

   minicomの使い方、XMODEMの使い方については、下記の情報を参考にしました。

   参考にしたサイト
   ・ シリアル端末ソフト/minicom
   ・職業としてのプログラミング Linuxでシリアル通信 - Ubuntu+minicom

   日本語環境の場合、セットアップメニューが崩れるので
   LANGを変更して起動した方が良いです。

   minicomのセットアップ
   % sudo LANG=c minicom -s

   -sオプションを付けて起動すると、初期画面にメニューが表示されます。
   管理者権限で起動しないと、シリアルポートのアクセスに失敗します。
   01

   [Serial prot setup] を選択してシリアルポートの設定を行います。
   WSL環境では、シリアルポートは、
     COMn => /dev/ttySn
   の対応となります。

   03

   [Save setup as dfl]で 設定の保存
   04

   [Exit from Minicom]にて一旦、終了します。


minicomでcpm8266を利用する

   % sudo LANG=c minicom

   日本語環境でも動作しますが、メニューボックス内の表示が崩れるため
   英語モードでの利用を推奨します。
   また、日本語環境では画面下のステータスバーが表示出来ないようです。

   起動後、ENTERキーをたたくと、起動メッセージが表示されます。

   05
   minicom を終了する場合は、CTRL-A入力後、Xキーを押します。


   XMODEMによるファイル転送
   
   1)Windows 10(Ubuntu) => cpm8266
    ①cpm8266側でXRコマンドを実行する
     a>A:XR F:test.txt
   06_2

    ②minicomによるファイル転送
     とりあえず、今月のカレンダーを送ってみます。
     ubuntu端末をもう一つ起動し、ユーザーホームディレクトリに
       % cal > test.txt
     と実行し、ファイルを作成しました。
   
    minicomにて、CTRL-X入力後、Sキーを押します。
    カーソルキーでxmodemを選択し、ENTERキーを押します。

   07_2
 
    ファイル選択状態となります。
    カーソルキー[↑][↓]でファイルを選択、スペースキーで確定、
    カーソル[←][→]で下のメニューのコマンドの選択、ENTERキーで実行します。
    [OKay]選択&ENTERキーで転送開始です。

   08

   転送状況が表示され、完了したら何かキーを押します。

   09

  ③転送されたファイルの確認
   転送されたファイルを確認すると、ちゃんと転送出来ていました。
   中身を表示すると改行コードがlinuxと異なるため、ちゃんと表示出来ませんが、
   転送自体は上手くいっています。

   10


   2)cpm8266 => Windows 10(Ubuntu) 
    試しに、GドライブにあるBIO.BASを転送してみます。

   ①cpm8266側でXSコマンドを実行する
     a>A:XS g:bio.bas

   11

   これで、cpm8266側は送信待機状態となります。

   ②minicom側での受信
    minicomにて、CTRL-X入力後、Rキーを押します。
    カーソルでxmodemを選択し、ENTERキーを押します。

    12_2

    ファイル名を入力し、ENTERキーを押します。
    これで転送が始まります。

    13

    転送中は、その状況が表示されます。
    完了したら、何かキーを押します。

    14_2

    転送が正常の場合は、次のメッセージが表示されます。

    15

   ③転送されたファイルの確認
    別端末画面にて、カレントホームにファイルがちゃんとあるのを確認します。

    16

    minicomを管理者権限で実行したため、アクセスが権限がないため
    sudoコマンドでheadコマンドを実行して、先頭の10行を表示しています。

    ちゃんと受信も出来ています。

これで、パソコンとのファイルのやり取りが出来るようになりました。
これで、もう少し使い込めるようになりました。


XMODEMプロトコル、組み込みマイコン用に使いには意外と良いプロトコルかもしれません。
ArduinoにもXMODEMライブラリがあるようなので、ちょっと調べてみたいと思います。
豊四季タイニーBASICでのファイル転送の手段として利用価値がありそうです。
   

関連記事
・「Z80-CP/M 2.2 emulator running on ESP8266」でのファイル転送 (この記事です)

2019年1月21日 (月)

FUSION-C、MSXの開発環境? (2)

注文した書籍「FUSION-C: MSX C Library complete journey.」が到着しました。

思っていたよりも、しっかりしている書籍でした。ちょっとびっくり。

Dscn9462

サイズが大きいです。

Dscn9466

洋書でこの価格この内容は、良心的だと思われます。

Dscn9467

ざっと見た感じだと、フリーで入手できる、MSX_Fusion C Libraryに添付のマニュアル
FUSION-C-Quick Manual.pdf  にMSXの技術情報関連とC言語の解説(100ページ程度)
を追記した内容です。

環境設定や、ライブラリリファレンスは、FUSION-C-Quick Manual.pdf  だけでも
開発は出来ると思います。

2019年1月20日 (日)

FUSION-C、MSXの開発環境?

ちょっと面白そうな書籍を発見、注文しちゃいました otz、あちゃ
到着待ち中です。

FUSION-C: MSX C Library complete journey. (英語)
01

この書籍の販売元のEBSoftのオンラインショップ のREPRO FACTORYのサイトで
開発環境は無料でダウンロード出来ました。

02

ショップを覗くと、面白そうな、キットが販売されています。
MSXカートリッジの自作キットまで販売されています。
この開発環境で最終的にMSXカートリッジまで実装出来るのかもしれません。

03

MSXカートリッジキット、フラシュメモリに書き込むタイプのようです。

Include in this Kit
- 1 x PCB Board
- 1 x Flash Chip Winbond W27C512 (64K / 512 Kbits)
- 1 x Electrolytic Capacitor
- 1 x Ceramic Capacitor
- 1 x Socket
- 1 x Cartridge Case

04

MSXカートリッジの作成は、チャレンジしてみたいです。
Arduinoなんかと連携出来れば、活用の幅がかなり広がりますよね。

4連8x8ドットLEDマトリックスを試してみる 続々編

4連8x8ドットLEDマトリックスを試してみる 続編」で質問があり、
前回のプログラムを少し修正して、4連8x8ドットLEDマトリックスモジュール
3連結、4連結をやってみました。

今回は、手持ちのSDカードシールド(SDカード・ロガーシールド)を利用しました。
前回のバージョンで未対応だった、16ドット以外のフォント、半角フォントに対応しました。

3連結 (24ドットフォントで表示)

Dscn9456

4連結(24ドットフォントで表示)

Dscn9460

4連結の2x2バージョン (16ドットフォントで表示)

Dscn9449

3連結 バージョンの動いている様子(動画)



4連結 2x2バージョンの動いている様子(動画)



実際の利用では、モジュールをキッチリと並べる必要があります。
それと、4連結 2x2の場合、横に結合する必要があるのですが、
私の所有しているものは、隙間が空きます。結合のために加工が必要そうです。


今回作成したスケッチ(プログラム)  ダウンロード max7219_test4.zip (6.5K)

いくつかのファイルに別れますが、取りあえずメイン部はこんな感じです。
コンパイルには別途、下記の必要です。
  ・sdfonts : Arduino用漢字フォントライブラリ SDカード版
    https://github.com/Tamakichi/Arduino-KanjiFont-Library-SD
   (SDカードには上記サイトに記載のフォントファイルを入れておく必要があります)

// max7219_test4.ino
// MAX7179ドライバーライブラリ動作チェック 4連マトリックスx最大4連結対応
// 2019/01/20 たま吉さん

#include <string.h>
#include <sdfonts.h>

#include "MAX7219_matrix.h"
#include "libmatrix.h"

// MAX7219接続
#define MAX7219_DIN   2 // DIN
#define MAX7219_CLK   4 // CLK
#define MAX7219_LOAD  3 // LOAD(CS)

// SDカード接続
#define MOSI_SD   11    // SDカードのMOISへ接続
#define MISO_SD   12    // SDカードのMISOへ接続
#define CLK_SD    13    // SDカードのCLKへ接続
#define CS_SD     10    // SDカードモジュールCSへ接続

// LEDマトリックスの定義(下記のうちとれか1つを1にして選択)
#define MODULE1x2  1    // 4連モジュール 横1x縦2 (横32x16ドット)
#define MODULE1x3  0    // 4連モジュール 横1x縦3 (横32x24ドット)
#define MODULE1x4  0    // 4連モジュール 横1x縦4 (横32x32ドット)
#define MODULE2x2  0    // 4連モジュール 横2x縦2 (横64x16ドット)

#if MODULE1x2 
#define   SCREENS   8   // MAX7219カスケード接続数
#define  SC_WIDTH  32   // マトリック表示横ドット数
#define  SC_HIGHT  16   // マトリック表示縦ドット数
#elif MODULE1x3
#define  SCREENS   12    // MAX7219カスケード接続数
#define  SC_WIDTH  32   // マトリック表示横ドット数
#define  SC_HIGHT  24   // マトリック表示縦ドット数
#elif MODULE1x4
#define  SCREENS   16    // MAX7219カスケード接続数
#define  SC_WIDTH  32   // マトリック表示横ドット数
#define  SC_HIGHT  32   // マトリック表示縦ドット数
#elif MODULE2x2
#define  SCREENS   16   // MAX7219カスケード接続数
#define  SC_WIDTH  64   // マトリック表示横ドット数
#define  SC_HIGHT  16   // マトリック表示縦ドット数
#endif

// 表示設定
#define  BRT       1    // LEDの輝度(0~7)
#define Y_POS      0    // フォント表示開始ライン(0~SC_HIGHT)

uint8_t fbuf[SC_WIDTH*SC_HIGHT/8];  // 表示用バッファ

// 表示用バッファを表示
void update_screen() {
  uint8_t* ptr = MAX7219_getBuffer(); 

#if MODULE1x2 || MODULE1x3 || MODULE1x4
  for (uint8_t i=0; i < 8; i++) { // 1個あたりのマトリックスの縦ライン数分のループ
    for (uint8_t j=0; j < SC_HIGHT/8; j++) {
      memcpy(&ptr[i*SCREENS+4*j], &fbuf[i*4+32*(SC_HIGHT/8-j-1)], 4);  
    }
  }
#elif MODULE2x2
  for (uint8_t i=0; i < 8; i++) { // 1個あたりの4連マトリックスの縦ライン数分のループ
    memcpy(&ptr[i*SCREENS+0], &fbuf[i*8+64], 8);
    memcpy(&ptr[i*SCREENS+8], &fbuf[i*8],    8);
  }
#endif
  MAX7219_update();  
}

// デモ
void demo(char *str, uint16_t font_size, uint8_t ypos) {
  uint8_t font[MAXFONTLEN];
  if(SDfonts.open()) {            // フォントのオープン
     Serial.println("Cannot open font's file");
  }
  SDfonts.setFontSize(font_size);    // フォントサイズの設定

  MAX7219_clear();
  while(1) {
    str = SDfonts.getFontData(font, str);  // フォントデータの取得
    if (!str)
      break;
    scrollInFont(fbuf, font, SDfonts.getWidth(), SDfonts.getHeight(),ypos, 30);
  }
  SDfonts.close(); 
}

// 1文字分スクロール挿入表示
void scrollInFont(uint8_t*ptr, uint8_t *fnt, uint8_t fw, uint8_t fh, uint8_t ypos, uint16_t dt) {
  for (int8_t t = 0; t < fw; t++) {
    scrollBitmap(ptr, SC_WIDTH, SC_HIGHT, B0001); // 左スクロール
    clearBitmapAt(ptr, SC_WIDTH, SC_HIGHT, SC_WIDTH-t-1, 0, fw, fh);
    setBitmapAt(ptr, SC_WIDTH, SC_HIGHT, SC_WIDTH-t-1, ypos, fnt, fw, fh);
    update_screen();
    delay(dt);
  }  
}

void setup() {
  Serial.begin(115200);
  if(SDfonts.init(CS_SD)) {     // フォント管理の初期化
     Serial.println("Cannot initialize SDfont library.");
  } else {
     Serial.println("Start.");
  }
  
  // マトリック表示ドライバの初期化
  MAX7219_init(MAX7219_DIN, MAX7219_CLK, MAX7219_LOAD, SCREENS, BRT);
}

void loop() {
  Serial.println("Now looping.");
  MAX7219_clear(); 
  // 文字列, フォントサイズ, フォント縦表示開始位置
#if MODULE1x2||MODULE2x2
  demo("16ドットフォント Saitama! こんにちは埼玉県!熱いぞ!埼玉県!",16, 0); 
  //demo("14ドットフォント Saitama! こんにちは埼玉県!熱いぞ!埼玉県!",14, 1); 
#elif MODULE1x3
  demo("24ドットフォント Saitama! こんにちは埼玉県!熱いぞ!埼玉県!",24, 0);  
#elif MODULE1x4
  demo("24ドットフォント Saitama! こんにちは埼玉県!熱いぞ!埼玉県!",24, 4);  
#endif
  delay(1000);
}

次の定義の変更することで、2連結、3連結、4連結、4連結2x2に対応出来ます

// LEDマトリックスの定義(下記のうちとれか1つを1にして選択)
#define MODULE1x2  1    // 4連モジュール 横1x縦2 (横32x16ドット)
#define MODULE1x3  0    // 4連モジュール 横1x縦3 (横32x24ドット)
#define MODULE1x4  0    // 4連モジュール 横1x縦4 (横32x32ドット)
#define MODULE2x2  0    // 4連モジュール 横2x縦2 (横64x16ドット)

また、demo()関数の引数で表示する文字列、フォントサイズ、フォントの縦位置を指定出来ます。
SDカードからフォント読み出しが若干遅い影響で、スクロールにおいてカクカク感があります。
SDfatに変更、フォントライブラリをフラシュメモリ版に変更で改善は出来るとは思いますが、
とりあえず、これで良しとします。

fbufは単純な表示用バッファで、バッファ更新後にupdate_screen()関数を呼び出すことで 表示に反映されます。
Adafruit_GFX_Libraryを使って派生クラスを実装すれば、比較的簡単に
グラフィック描画処理も追加出来ると思います。

この続編で、Arduino用Bitmap画像ロードライブラリsdbitmap を使って、
SDカードに保存したWindowsビットマップファイルを表示なんかも試してみたいと思います。

色々と試しましたが、縦に2個連結がちょうど良い感じです。


関連記事
・4連8x8ドットLEDマトリックスを試してみる 続々編 (この記事です)
4連8x8ドットLEDマトリックスを試してみる 続編
4連8x8ドットLEDマトリックスを試してみる

2019年1月19日 (土)

MSX用カートリッジ 「Mapper Megaram」を入手しました

MSXとパソコン間でファイルのやり取りをしたいと思い、色々と調べ、
ちょっとお高いですが、ebayにて「Mapper Megaram(略称)」という製品を入手しました。
(このところ、散財し過ぎなので来月からは引き締めなければ.. otz)

MSX SD Mapper & Megaram 512Kb Expansion better than IDE for MSX1/2/2+/TR

02

製品と特長としては、次の通りです
・増設メモリ 512kバイト(スイッチでメモリーマップの形式を変更できるらしい)
・2スロット SDカード をハードディスク感覚で利用出来る
Nextor搭載(MSX-DOS2の上位互換のOS)

ブラジルの方が開発した製品です。
MSXが海外でも根強い人気があることを分かります。


到着した製品


遥々ブラジルから到着です。
切手ですごいことになっています。側面・裏まで貼られています。

Dscn9017_3

中は、カートリッジとSDカードのみでマニュアルは付いていませんでした。

03

とりあえず、MSX PV-7で動作確認します。
付属のSDカードをカートリッジに装入します。

05

SDカードスロットの横にスイッチが2つあるのですが、今一仕様が分かりません。

04

カートリッジからブートし、SDカードスロットをチェックしているようです。

06

見慣れたMSX-DOSっぽい画面が起動しました。
AドライブがSDカードっぽいです。

07

画面の色を変えてdirコマンドを実行すると、
SDカード内のファイル一覧が表示されました。

09

いい感じですね。MS-DOSと同じ感覚で使えます。
次にBASICコマンドを実行してBASIC環境に移動し、動作確認します。

10_2

BASICもこのカートリッジで拡張されているようです。
簡単なプログラムを作成して、SDカードに保存できるか確認してみました。
SAVEコマンドでファイルを指定して保存出来ました。

12

プログラムをNEWコマンドで消して、
LOADコマンドで読み込みも確認しました。

15

CALL SYSTEM コマンドで、Nextor環境に戻ります。

SDカードをWindows 10で覗くと、当然中を見ることが出来ます。
保存したHELLO.BASもちゃんとあります。

21

非常のいいですねぇ。中々すごいカートリッジです。
30年前に発売されたMSXですが、かなり使える環境になってきました。

このMSX-DOS2の上位互換のOSのNextor、
Konamimansさんという方が開発し、公開しています。
あの1チップMSXなんかでも利用されているようです。

Nextorに関する情報
  ・Konamiman's MSX page
  ・Konamiman/Nextor(https://github.com/Konamiman/Nextor)


SDカード内におまけが入っています^ ^;

購入後、販売元から次のようなメールが送られてきました。
(英語をgoogleで翻訳しています)

ROMファイルを実行するには、
付属のローダーSofarunを使用することができます。
MSX-DOSプロンプト(A:>)でSOFARUNと入力するだけで、
SDカード内のファイルが表示されます。ナビゲートしてROMファイルを選択し、
スペースを2回押すとロードされます。

MSX1とMSX2のためのいくつかのデモと他のものを持つ他のディレクトリがあります、
それはDOSまたはBASICによる通常のローダーによって実行されます。

はじめは全く意味が分からなかったのですが、
とりあえず、SOFARUNコマンドを実行してみます。

17

ゲームカートリッジのROMイメージファイルのようです。

19

選択してみると、RALLY-Xが起動しました。
明らかに海賊版でしょう。う~ん、この販売者、これはちょっとマズいのでは..

20

海賊版ゲームが添付されているのは、ちょっとあれですが、
SDカードをハードディスクのように使えるのは非常に素晴らしいです。
しかも、MSXとしては最低スペック(RAM 8kバイト)のPV-7がかなりつかえるマシンなります。

Nextor 環境には色々とツール類があるようなので、しばらくはいじって調査してみます。

2019年1月16日 (水)

VS1053 MP3 プレーヤー・シールドの調査 (3) 録音機能(2)

前回からの続きです。

目的の、MSXのカセットテープインタフェースでのプログラム保存、
結論としては、録音品質が良くなく、上手くいきませんでした。

01


このボードでは次の問題が発生しました。
1) ライン入力モードはモノラル録音ができない
2) ライン入力モード経由の録音では、録音の音が小さい


前回利用したサンプルスケッチ record_oog では、
下記の部分を true から false に変更することでボード上のコンデンサーマイクからの
録音からライン入力からの録音に切り替えることが出来ます。

musicPlayer.startRecordOgg(false); // use microphone (for linein, pass in 'false') 

ところが、ライン入力では、何故かモノラルでの録音が出来ませんでした。
モノラルをステレオ的に変換結線(LをR・Lの両方に接続)も試したのですが、
録音出来ません。

仕方がなく、ステレオ録音で試したのですが、今度は書き込み速度が追いつきません。
ステレオ録音ではデータ量が2倍なので、当然でしょう。

サンプリングレート 16kHz ステレオ録音に変更することで、
一応、録音は出来たのですが、録音品質以前に音が小さくでダメでした。
このボード、再生のためのアンプは載っているのですが、
録音入力のアンプは載っていないようです。

録音レベルの調整をレジスタ操作で行えるので試してみたのですが、
ノイズが増幅されて、音質が劣化してダメでした。

02

デジタル的に音量を上げているっぽいです。

ちなみに、レジスタの設定は ライブラリの Adafruit_VS1053.cpp ファイルの
startRecordOgg(boolean mic) 関数内の記述を変更すれば可能です。

まとめ

ということで、残念ながらこのボードでのデーターレコーダの実装はダメっぽいです。
ただし、再生機能はかなり優れているので、別途色々と遊んでみようと思います。

今回の実験で参考にしたサイト
放課後の電子工作 - VS1053b 日本語データシート私家版
日本語訳、VS1053Bの理解に大変参考になりました。有益な情報の公開に感謝します。



2019年1月14日 (月)

SCART・HDMIコンバータを使ってMSX2の映像を出力

先日入手したパナソニック MSX2 FS-A1、RGB出力で綺麗な画面を表示したいと思い、
SCART・HDMIコンバータを入手し、試してみました。

結果を先に言うと、いい感じで表示出来ました。

Dscn9378

いつものAliexpressにて入手しました。
amazonでもサンコーさんが類似の製品を販売しているようです。
値段もそんなに差が無いと思います。

SCART to HDMI Converter
04_3

修正:(注意)
  どうも、見た目がまったく同じでも
SCARTのRGB信号ではなく、
 SCARTのNTSC/PAL信号からHDMIに変換するものが出回っているようです。
  その場合はMSX2での利用は出来ないと思われます。
  参考: RETRO GAMING CABLES - SCART to HDMI Converters to Avoid 

  詳細説明の記載には要注意です。微妙に異なります。

    〇 "Support RGB (Hz) and CVBs (ntsc/pal) composite signal input"
    × "convert 480I(NTSC)/576I(PAL) format signal to 720P/1080P"

   ( USプラグ版が無くなったため、商品画像のリンクは削除しました )

   ケーブル自作時、RGB信号しか結線していなので、
   私のは、ちゃんとRGB信号をHDMIに変換している製品だと思われます(たぶん)

このコンバータとMSX2を接続するには、MSX2用のSCARTケーブルが必要です。

形状は同じですが、MSX2用RGB21ピンケーブルは使えません。要注意ですね。

参考: SCART端子RGB21ピン

MSX用のSCARTケーブル見つからなかったため、
今回はセガサターン用の安価なケーブルを改造して利用するこにしました。

Black 1.8M/6FT Scart AV TV Video Cable Lead For Sega Saturn NTSC & PAL Version

02


届いた製品

ビデオコンバータ
Dscn9376

セガサターン用SCARTケーブル

Dscn9397
※ 画像の8ピンDINコネクタは、CASduino製作時に入手したものです


ケーブルの改造

セガサターンのコネクタをカットして、CASduino製作時に入手した
DIN 8ピンコネクタを付けます。さらに、配線を変更します。

Dscn9373

改造作業には、
セガサターンのコネクタ仕様、MSX2のRGBコネクタ仕様、SCARTコネクタ仕様を
の情報が必要ですが、下記のサイトの情報を参考にさせていただきました。

参考にしたサイト
MSX  RESOURCE CENTER - SCART connector
MSX  RESOURCE CENTER - RGB (8-pin DIN 45326)
Game Console RGB SCART Cable Diagrams
gamernium.com MSX2 RGB端子 ピンアサイン
gamernium.com RGB21ピン & SCART ピンアサイン

とりあえず、変換表を作成して配線し直しました。

03

改造したケーブル

Dscn9372

ケーブルをコンバータに接続した様子

Dscn9396

HDMI端子付きの安価な7インチモニターを利用しています。

ケーブルの改造は、ちょっと自信が無かったのですが、問題なく綺麗に映りました。

Dscn9378

NTSCビデオ出力に比べ、非常にきれいです。

Dscn9377

文字も色のにじみもなくくっきり表示されています。

Dscn9382

Dscn9383

SCREEN 1の80x24文字も綺麗に表示出来ました。

Dscn9385

上記の画面の背景色を黒にしてみます。

Dscn9386

落札時にオマケで付いていた、ゲームの表示を試してみます。

Dscn9392

色の表現も問題なさそうです。

Dscn9389

オープニングのBGMもちゃんと鳴っています。

Dscn9390

ちなみに、このコンバータ単体での4:3表示への変更・調整は出来ませんでした。
4:3表示はモニターの方で調整するしかないようです。
とりあえず、やってみました。

Dscn9394

非表示部分がちょと気になります。16:9での表示で使うことにします。


2019/01/16 追記
サンコーの[RGB21-HDMI変換アダプタ」は、4:3画面、16:9画面の設定が
出来るようです。サンコーの製品の方が無難そうです。
amazonでも購入出来るようです。

2019年1月13日 (日)

Ichigojamを1.3 beta4にアップデートしました

IchigoJam のファームウェアの1.3系のベータ版が公開されています。
早速、手持ちのIchigoJamのファームウェアを1.3beta4にアップデートしました。

01

参考サイト
福野泰介の一日一創
  1)1/5はイチゴの日、使い勝手をちょっと向上、IchigoJam 1.3ベータ公開!
  2)定数行番号のRENUMに一部対応! たった24KBのOS、IchigoJam 1.3 beta 3
  3)ゲームで学ぶ、アルファベット! LOCATEの第三パラメーター、カーソルスイッチ実装、IchigoJam 1.3 beta 4

現時点の最新版は、上記サイト3)よりダウンロードできます。


1.3系ではざっと上記記事に目を通した感じでは、次の変更が行われているようです。

主な変更
  1)RENUMコマンドの機能改善
    GOTO文、GOSUB文の引数の行番号も振り直されるように改善されました

  2)I2Cの動作の改善
    ・実装の問題で動作しなかった 温湿度計 AM2320にも対応

  3)メモリマップ・メモリ領域変更
    ・I2C専用の32byte確保など
    ・物理アドレスの変更

  4)カーソルスイッチを実装
    ・LOCATEコマンドの第3引数にてカーソルの表示形式の指定が出来る


個人的には、RENUMコマンドの機能改善はありがたいですね。
改善前はRENUMコマンドを実行すると、
正常に動いていたプログラムが動かなくなり、手作業で修正を行う必要がありました。

実際に試してみると、GOTO文の引数の行番号がちゃんと振り直されました。

02

RENUMコマンド実行後、問題なく正常実行できました。

03

改善前は GOTO文、GOSUB文を多用している長いプログラムで
RENUMコマンドで行番号を振り直し後に不毛な修正作業を強いられることに
非常に不満を抱いていたのですが、今回の修正でその作業から解放されました。

I2C周りも挙動が怪しかったのですが、改善されたようです。
後ほど、改めて調査したいと思います。

2019年1月12日 (土)

おもちゃ「ちっちゃなミーニャ」の修理

ルミちゃんの遊び相手のミーニャ

01

ルミちゃんの度重なる猛攻で、



足が折れてしまいました。

02

折れた足を取り出すと、意外と貧弱。
このミーニャ、イワヤ株式会社さんの製品で、お値段以上の良い動きをするのですが、
この足だとちょっと強度不足ですね。改善して欲しいです。

03

早速、修理を試みます。
材質がポリエステル(ナイロン?)系っぽいし、
この折れ方だと、接着剤での接合は厳しそう ...
う~ん、どうしたものか...

04_2

「!(ひらめいた)」

ちゃらら・ちゃっちゃ・ちゃ~ん

はんだごて(先端がホットナイフ)

05

強引に、切断面を溶かして接合しました。

ちょっと不格好ですが、隠れるのでこれで良いでしょう。
少々力を加えた限りでは、しっかりと接合しているようです。

06

電池を入れて動作確認すると、ちゃんと歩行動作しました。
とりあえず、修理完了です。

07

この「ちっちゃなミーニャ」、現時点では製造されていないようですが、
イワヤ株式会社さん製の類似製品がamazonで販売されています。

あかちゃんスコティッシュ ぬいぐるみ
08

安い!、動画を見ると「ちっちゃなミーニャ」よりもいい動きをしています。
ポッチってしまいました。

2019/01/14 追記

商品が到着しました。

10

お値段の割には、良い感じの製品です。

11

早速、ルミちゃんに対面させてみました。


なんか、興味なしのようで ミーニャのような感じでは遊んでくれませんでした。
ちょっと、ガッカリです。
この差は何なんでしょう?

2019年1月11日 (金)

VS1053 MP3 プレーヤー・シールドの調査 (2) 録音機能

今回はVS1053 MP3 プレーヤー・シールド の録音機能の調査です。

先日利用したライブラリを調べると、録音機能に関するAPIが存在しません。
Wikiにも解説がありません。

このボード、ピン構成やElecrowWiki リンク先を見ると、
SparkFun MP3 Player Shield がベースとなっているようです。

ベースのボードには録音機能(コンデンサーマイク、マイク端子)が無いんですよね。
それで、録音機能については何も解説が無いようです。

  商品  SparkFun MP3 Player Shield  (チュートリアル MP3 Player Shield Hookup Guide V15
  01
  (チュートリアルのMP3 Player Shield Hookup Guide V15 はこれはこれで参考になります)
 

う~ん、困った..
色々と調べると、
VS1053の公式フォーラム(VSDSP Forum)を見るとAdafruitのボード用の
ライブラリ(Adafruit_VS1053_Library)を使うと録画が出来ると判明しました。

  参考: AdafruitのVS1053ボード
  VS1053 Codec + MicroSD Breakout - MP3/WAV/MIDI/OGG Play + Record - v4

 
02
 
チュートリアル Adafruit VS1053 MP3/AAC/Ogg/MIDI/WAV Codec Breakout Tutorial


録音機能の実装


前置きが長くなりましたが、本題の録音機能について試してみました。
Ogg Vorbisという形式にてSDカード上にファイルとして録音します。

まずは、ボード上のコンデンサーマイクを使った録音のお試しです。

Adafruitのチュートリアルを参考にして、Adafruit_VS1053_Library をダウンロードし、
サンプルスケッチのrecode_ogg を動かしてみました。

  05

そのままでは動かないので次の修正を行いました。
  1)利用するピンの変更(=>スケッチの変更)
  2)SDライブラリの利用からSdFatライブラリの利用に変更(=>スケッチ、ライブラリの変更)
  3)VS1053 ogg encoder プラグインの変更(=>スケッチの変更)

VS1053用プラグインのダウンロード

Adafruit_VS1053_Library
のサンプルスケッチ recode_ogg のフォルダに
モノラル 44.1KHz, 高品質録音のプラグイン v44k1q05.img が用意されているのですが、
Arduinoの処理が間に合わず、音飛び発生や、ファイルが壊れて再生出来ずでした。

そこで、別のプラグインを利用しました。
公式サイト(VLSI社) には、別のプラグインが公開されてます。
用途に応じて選択して利用することが出来ます。下記のリンクからダウンロードできます。

  ・VS1053 Ogg Vorbis Encoder Application
    http://www.vlsi.fi/fileadmin/software/VS10XX/vs1053-vorbis-encoder-170c.zip

解凍したフォルダprofilesの中の vencXXkYqZZ.img がプラグインです。
下記の組み合わせで複数用意されています。
  XX: サンプリング周波数 08: 8kHz、16:16kHz、44:44kHz、
  Y:   1:モノラル、2:ステレオ
  ZZ: 品質00~05 or 10 数字が大きいほど高品質

試した感じでは、44kHzでは、ステレオ録音は処理が追いつきません。
  44kHzでは モノラル venc44k1q04.img
  16kHzでは モノラル venc16k1q10.img 、ステレオ venc16k2q5.img
がちょうど良い感じでした。

ここでは、venc44k1q04.img  を v44k1q04.img にファイル名を変更して
SDカードのルートフォルダにコピーします。

ライブラリの修正


Sdfat対応のために、ヘッダーファイル Adafruit_VS1053.hに PREFER_SDFAT_LIBRARY の定義を追加します。

#define ADAFRUIT_VS1053_Hの次の行に追加しました。
  #ifndef ADAFRUIT_VS1053_H
  #define ADAFRUIT_VS1053_H
  #define PREFER_SDFAT_LIBRARY


スケッチの
修正

ピン割り付けを変更しています。録音開始のボタンはD3を使いました。
/*************************************************** 
  This is an example for the Adafruit VS1053 Codec Breakout

  Designed specifically to work with the Adafruit VS1053 Codec Breakout 
  ----> https://www.adafruit.com/products/1381

  Adafruit invests time and resources providing this open source code, 
  please support Adafruit and open-source hardware by purchasing 
  products from Adafruit!

  Written by Limor Fried/Ladyada for Adafruit Industries.  
  BSD license, all text above must be included in any redistribution
 ****************************************************/

// This is a very beta demo of Ogg Vorbis recording. It works...
// Connect a button to digital 7 on the Arduino and use that to
// start and stop recording.

// A mic or line-in connection is required. See page 13 of the 
// datasheet for wiring

// Don't forget to copy the v44k1q05.img patch to your micro SD 
// card before running this example!


// include SPI, MP3 and SD libraries
#include <SPI.h>
#include <Adafruit_VS1053.h>
// SDライブラリからSdFatライブラリの利用に変更 by たま吉さん
//#include <SD.h>
#include "SdFat.h"
SdFat SD;

// ピン割り付けの変更 by たま吉さん
// define the pins used
//#define RESET 9      // VS1053 reset pin (output)
//#define CS 10        // VS1053 chip select pin (output)
//#define DCS 8        // VS1053 Data/command select pin (output)
//#define CARDCS A0     // Card chip select pin
//#define DREQ A1       // VS1053 Data request, ideally an Interrupt pin

#define RESET 8      // VS1053 reset pin (output)
#define CS 6         // VS1053 chip select pin (output)
#define DCS 7        // VS1053 Data/command select pin (output)
#define CARDCS 9     // Card chip select pin
#define DREQ 2       // VS1053 Data request, ideally an Interrupt pin

//#define REC_BUTTON 7
#define REC_BUTTON 3

Adafruit_VS1053_FilePlayer musicPlayer = Adafruit_VS1053_FilePlayer(RESET, CS, DCS, DREQ, CARDCS);

File recording;  // the file we will save our recording to
#define RECBUFFSIZE 128  // 64 or 128 bytes.
uint8_t recording_buffer[RECBUFFSIZE];

void setup() {
  Serial.begin(115200);
  Serial.println("Adafruit VS1053 Ogg Recording Test");

  // initialise the music player
  if (!musicPlayer.begin()) {
    Serial.println("VS1053 not found");
    while (1);  // don't do anything more
  }

  musicPlayer.sineTest(0x44, 500);    // Make a tone to indicate VS1053 is working
 
  if (!SD.begin(CARDCS)) {
    Serial.println("SD failed, or not present");
    while (1);  // don't do anything more
  }
  Serial.println("SD OK!");
  
  // Set volume for left, right channels. lower numbers == louder volume!
  musicPlayer.setVolume(10,10);
  
  // when the button is pressed, record!
  pinMode(REC_BUTTON, INPUT);
  digitalWrite(REC_BUTTON, HIGH);
  
  // load plugin from SD card! We'll use mono 44.1KHz, high quality
  // プラグインの変更 by たま吉さん (mono 44.1KHz, middle quality)
  //  if (! musicPlayer.prepareRecordOgg("v44k1q05.img")) {
  if (! musicPlayer.prepareRecordOgg("v44k1q04.img")) {
     Serial.println("Couldn't load plugin!");
     while (1);    
  }
}

uint8_t isRecording = false;

void loop() {  
  if (!isRecording && !digitalRead(REC_BUTTON)) {
    Serial.println("Begin recording");
    isRecording = true;
    
    // Check if the file exists already
    char filename[15];
    strcpy(filename, "RECORD00.OGG");
    for (uint8_t i = 0; i < 100; i++) {
      filename[6] = '0' + i/10;
      filename[7] = '0' + i%10;
      // create if does not exist, do not open existing, write, sync after write
      if (! SD.exists(filename)) {
        break;
      }
    }
    Serial.print("Recording to "); Serial.println(filename);
    recording = SD.open(filename, FILE_WRITE);
    if (! recording) {
       Serial.println("Couldn't open file to record!");
       while (1);
    }
    musicPlayer.startRecordOgg(true); // use microphone (for linein, pass in 'false')
  }
  if (isRecording)
    saveRecordedData(isRecording);
  if (isRecording && !digitalRead(REC_BUTTON)) {
    Serial.println("End recording");
    musicPlayer.stopRecordOgg();
    isRecording = false;
    // flush all the data!
    saveRecordedData(isRecording);
    // close it up
    recording.close();
    delay(1000);
  }
}

uint16_t saveRecordedData(boolean isrecord) {
  uint16_t written = 0;
  
    // read how many words are waiting for us
  uint16_t wordswaiting = musicPlayer.recordedWordsWaiting();
  
  // try to process 256 words (512 bytes) at a time, for best speed
  while (wordswaiting > 256) {
    //Serial.print("Waiting: "); Serial.println(wordswaiting);
    // for example 128 bytes x 4 loops = 512 bytes
    for (int x=0; x < 512/RECBUFFSIZE; x++) {
      // fill the buffer!
      for (uint16_t addr=0; addr < RECBUFFSIZE; addr+=2) {
        uint16_t t = musicPlayer.recordedReadWord();
        //Serial.println(t, HEX);
        recording_buffer[addr] = t >> 8; 
        recording_buffer[addr+1] = t;
      }
      if (! recording.write(recording_buffer, RECBUFFSIZE)) {
            Serial.print("Couldn't write "); Serial.println(RECBUFFSIZE); 
            while (1);
      }
    }
    // flush 512 bytes at a time
    recording.flush();
    written += 256;
    wordswaiting -= 256;
  }
  
  wordswaiting = musicPlayer.recordedWordsWaiting();
  if (!isrecord) {
    Serial.print(wordswaiting); Serial.println(" remaining");
    // wrapping up the recording!
    uint16_t addr = 0;
    for (int x=0; x < wordswaiting-1; x++) {
      // fill the buffer!
      uint16_t t = musicPlayer.recordedReadWord();
      recording_buffer[addr] = t >> 8; 
      recording_buffer[addr+1] = t;
      if (addr > RECBUFFSIZE) {
          if (! recording.write(recording_buffer, RECBUFFSIZE)) {
                Serial.println("Couldn't write!");
                while (1);
          }
          recording.flush();
          addr = 0;
      }
    }
    if (addr != 0) {
      if (!recording.write(recording_buffer, addr)) {
        Serial.println("Couldn't write!"); while (1);
      }
      written += addr;
    }
    musicPlayer.sciRead(VS1053_SCI_AICTRL3);
    if (! (musicPlayer.sciRead(VS1053_SCI_AICTRL3) & _BV(2))) {
       recording.write(musicPlayer.recordedReadWord() & 0xFF);
       written++;
    }
    recording.flush();
  }

  return written;
}

ボタンを押すと録音開始、再度押して録音終了です。
(ボタン操作がちょっとシビアで、瞬間的に押さないと開始・終了を繰り返します)

動作状況は、シリアルコンソールで確認できます。

04

試してみた感じでは、一応は録音できました。
oggファイルの再生は、ブラウザのChromeにドラッグ&ドロップして再生しました。

ただし、現時点では
  ・音が小さい
  ・音質が今一
でした。

もうちょっとどうにかならないか、調べてみます。


2019年1月10日 (木)

VS1053 MP3 プレーヤー・シールドでMIDIファイルの再生

VS1053 MP3 プレーヤー・シールド」、MIDIファイルの再生が出来るようなので、
どんな感じの音が出るのか、動作確認してみました。

01

先日使ったサンプルスケッチ fileplayer.inoMIDIファイルを再生してみました。


演奏の様子


アンプ付きのスピーカーに接続して音を出しています。
以前どこかで入手したQueenの「Bohemian Rhapsody」のMIDIファイルを再生してみました。



かなりいい感じに演奏出来ています。
(若干ホワイトノイズが乗っていますが、撮影に使ったデジカメのせいです)

このボードでは、MIDIファイルはFormat 0にしか対応していないため、
SMFConverter for Windows」を使ってFormat 0に変換しました。

色々と遊べそうです。
ストリーミングも出来るみたいで、ESP8226を使ったインターネットラジオの実装例があるようです。

このボードに載っているDSPプロセッサのVS1053
結構使われているようで、秋月電子でも単体売りされています。
秋月電子 MP3デコーダ VS1053b
02

MSX用のデータレコーダの実装とは別途、用途を探りたいと思います。

2019年1月 8日 (火)

VS1053 MP3 プレーヤー・シールドの調査

MSXのデータレコーダ用に使えるのではないかと思い、注文したボードが到着しました。

商品購入サイト
  VS1053B Stereo Audio MP3 Player Shield

  06

到着した製品

  01

Aliexpressのため、当然マニュアル等の付属品はなく、本体のみでした。
商品ページにもマニュアル類の記載がありません。

基板上の刻印 「VS1053 MP3 Sheald」でググってみると、
ElecrowGETECHの製品に類似のものがあります。どうもこの製品っぽいです。

それぞれのページにWiki、ライブラリ、サンプルプログラムのリンクがあり、
製品概要が分かりました。

このボードに関する情報

  製品 Elecrow VS1053 MP3 Shield (Wikiページはこちら

   04

  製品 GETECH Arduino MP3 shield board with TF card (Wikiページはこちら

   03


動作確認

まずは、とりあえずボードの製品チェック、サンプルプログラムで動作確認してみます。

上記それぞれのWikiには、ボードで利用可能な、ライブラリ及びサンプルプログラム
のリンクが掲載されています。

だだし、ダウンロードして確認すると、
両方ともライブラリ Arduino_Library-vs1053_for_SdFat の古いバージョンのようです。
Arduino 1.8.7環境では、コンパイルエラーとなりました。
そこで最新版の Arduino_Library-vs1053_for_SdFatを使って動作確認を行いました。

Arduino Unoにシールドを載せ、スピーカー端子にアンプ無しスピーカーを接続します。

07

ライブラリのサンプルスケッチ fileplayer.ino を利用しました。

05

問題なくコンパイル出来ました。
実行すると、メニューが表示されます。

06

SDカードには、あらかじめ2つのMP3ファイル:hello.mp3hello.wav
入れています。
この2つのファイルは「MP3プレーヤーでMSXにプログラムをロードさせる」で
利用したHello,Worldを表示するプログラムデータです。
hello.mp3hello.wavMP3形式に変換したものです。

再生したいファイルリストの番号を入力して送信すると、
スピーカーから「ピー、ガー・ガー」と音が出力出来ました。
問題なく動作しているようです。

このスケッチプログラムでは、mp3形式wav形式の両方を再生出来ました。


MSXでカセットテープ代わりに使えるかのか確認


本来の目的の、MSXのカセットテープインタフェースにてプログラムをロードさせてみました。

デフォルトでは、失敗しましたがメニューの+コマンドでボリュームを最大の -2dBにすると
MSXでロードすることが出来ました。mp3形式wav形式ともOKでした。

機種によては、レベル不足となるかもしれません。間にアンプを入れた方が良さそうです。

08

ロードしたプログラムも実行することが出来ました。

10

とりあえず、ロードは出来たので次はMSXから音声データとしてSDカードに
保存出来るかを確認したいと思います。



2019年1月 7日 (月)

Aliexpressで入手した「タッチスイッチボタン」の動作確認

Aliexpressで面白そうなタッチスイッチボタンを見つけたので入手し、試してみました。

購入した商品のサイト

    Capacitive Touch Switch Button RGB LED Sensor Switch Module

    01_2

到着した製品
 
   とりあえず、4個 (青、緑、赤、黄)を購入しました。

   02

  裏側

   03_2

  作り具合は、意外と良さそうです。はんだ付けも問題なしです。


動作確認

  まずは、掲載されている商品情報にて仕様を確認します。   

     商品購入サイト掲載情報

  04_2

    完全に勘違いしていました。

    単なるタッチセンサー的に使うモジュールかと思いきや、
    3.3V定電圧レギュレータ搭載のようです。しかも500mA流せるようです。

    単体のみで独立したスイッチとして利用出来るようです。
    安価な3.3V電源レギュレータとしても利用出来ますね。

    確認として、このモジュールのVCCGNDにUSBケーブルにて5V電源を供給し、
    OUTピンでLEDの点灯制御を行ってみました。

  ブレットボードでの実装
 
   05_2

  動いている様子

   

  問題なく動作しました。
  タッチにて、OUTピンのオン・オフの制御を行うことが出来ました。

  タッチする度にOUTの状態が切り替わります。
  状態を保持するトグルスイッチ的な用途に使えそうです。
 
  ただし、機械的なスイッチと違ってオフの時もタッチセンサー部分の稼働のために
  電力を消費します。測定してみると、0.66mAでした。

  06_2

  次に、タッチパネル部の発光時に流れる電流を測定しました。
  (OUTピンのLEDは外しています)
  7.5mA(タッチセンサー分も含む)でした。

  07_2

  思っていたほど消費量は少ないですが、
  電池駆動でのスイッチとしての利用は避けた方が良さそうです。

MSX2(Panasonic FS-A1)を入手しました

ヤフオクでMSX2を入手しました。
MSX2ではRGB出力が出来るので、綺麗な映像出力を期待して購入しました。

届いた機種

00

落札機種 Panasonic FS-A1 (付属品 ACアダプタ、JOY PAD、AVケーブル、ゲーム1本)
落札価格 4,730円

このMSX2パナソニックが1986年10月当時、29,800円で販売した機種です。
ヤフオクでは比較的多く出品されています。

ACアダプタが特殊で、ACアダプタ無しの出品の購入には注意が必要です。

03

DC9VとAC18Vの出力、 こんな規格のACアダプタは入手できないと思います。


機器の動作確認

若干問題がある機器でした。

出品者はあの東証1部に上場している大手ブックオフさんなので、
信頼していたのですが、期待を裏切られました。

出品商品説明では、ジャンク品扱いではなく、故障・破損の記載はありませんでが、

04

実際の製品は、カートリッジのふたの欠損しており、
電源を入れてみると、勝手に"2"が無限に入力される状態で、パソコンとして利用出来ません。

01

流石にこれはひどいので、出品者の評価は「非常に悪い」とちょっと辛く評価しました。
(ヤフオクで初めての「非常に悪い」評価です)

このレベルは通常、「ジャンク品」で出品されるべきですね。

一方、商品説明には無かった「FMパナアミューズメントカートリッジ」が付いていました。

05

ラベルが剥がれている状態ですが、これはちょっとラッキーです。


不具合の修理

MSXでは、キーボードの不具合が多いですね。

分解して、サンドイッチになっている2枚のフレキシブル基板(シート?)をチェックしていくと、
癒着している状態で、2枚のシートが張り付いている箇所がありました。

06

2枚をゆっくりと剥がし、接点面を軽くふいて起動してみると

07

デスクパック」という画面が表示されました。
これが、正常時のデフォルトの初期画面のようです。

08

F8キーを押すと、見慣れた画面が表示されました。
キーボードの動作も正常に戻りました。

14


FMパナアミューズメントカートリッジ」の修繕

インターネット上の画像を見つけて、プリンターで印刷して貼り付けました。

09

いい感じに修繕出来ました。見た目も大事ですね。


トラブル発生

FMパナアミューズメントカートリッジ」をFS-A1で動作確認をしたのですが、
FM音源による音の出力が出来ませんでした。

MSX1機で確認するとFM音源で出力出来たのでFS-A1 固有の問題のようです。

内臓音源では音が出るので、
FMパナアミューズメントカートリッジ」とFS-A1 間の接続問題だと思われます。

カートリッジを分解した状態でFS-A1に接続して、調べていくと、

13

10

基板上のオペアンプに-12Vが供給されていないことが判明。

オペアンプの -12Vへの電圧供給

12

オペアンプの +12Vへの電圧供給

11

+12Vは問題ないですが、-12Vが+0.74Vと正常ではありませんでした。
(念のため、正常動作したMSX1機で試すと-12Vが測定出来ました)

FS-A1のカートリッジの-12V端子-12Vが来ていないようです。

これ以上の調査は、FS-A1の基板回路図を調べるまたは入手しないと、無理っぽいです。

±12V
電源はFM音源カートリッジ以外では利用は無く、通常の利用では支障がないので、
とりあえず、放置することにします。

後ほど、改めて調査・修理をいたいと思います。
FMパナアミューズメントカートリッジ」のオマケが無ければ見つからなかった不具合です。ラッキーでした。


最後に

FS-A1は軽くて、机の上においても邪魔ならないサイズです。
キーボードのタッチ感も良いです。これをメインに使っていこうと思います。

次のステップとして、RGB端子でテレビに出力を何とかしたいと思います。

2019年1月 2日 (水)

明けましておめでとうございます。



明けましておめでとうございます。
今年もよろしくお願いします。

Dscn9256

Dscn9249


« 2018年12月 | トップページ | 2019年2月 »