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

« 2019年4月 | トップページ | 2019年6月 »

2019年5月の9件の記事

2019年5月29日 (水)

Arduino STM32のWS2812Bライブラリ(NeoPixel制御ライブラリ) その1

Arduino STM32には、WS2812Bライブラリ(NeoPixel制御ライブラリ)が、
標準で(最初から)用意されています。

このライブラリを使いたいと思い、ドキュメントが無いので
プログラムソースから日本語ドキュメントを作成しました。

Arduino STM32 リファレンス 日本語版
 ┗  WS2812Bライブラリ(NeoPixel制御ライブラリ)

ドキュメントを作成し、ライブラリの仕様を理解した上で
さっそく、BluePillボードで動作確認してみました。

ダメです。このライブラリ、まともに動作しません。
LEDが全く点灯出来ません。
色々とソースを修正して現時点で、やっとLED点灯するももの、
意図したとおりに制御出来ません。

01_8

このライブラリはSPIを使ってパルスを生成しています。
システムクロック72MHzを1/32に分周した2.25MHzのパルス幅 0.444μSを使っています。
  パルス幅 0.444μSは許容範囲、
  1ビットのデータは3パルス幅、
  1つのLEDのRGBデータが24ビット、
  1つのLEDは3×24=72パルス、
   SPIは8パルス(8ビット)なので9バイト分、

これなら1個のLED単位でなんとか制御出来そうなのですが、リセット信号のがマズいようです。
ソースを見た限り、リセット信号の送信がされていないみたいなのですが..

更新
1ビット分の3パルスが0.444μS×3= 1.332 μS、
1.25 μS を超えているのがマズいようです。仕様では±0.6μSは許容範囲なのですが駄目っぽい。
24ビット分のデータの前半と後半部分がちゃんと受信されていないようです。
データはGRB(緑、赤、青)の順番で送信するのですが、
1点ルーレット表示は赤しかちゃんと点灯しません。

現在、ライブラリ修正中です。

2019年5月25日 (土)

ココログのリニューアル後の不具合、2ヶ月経っても改善されず...

ココログのリニューアル後の数々の不具合、
サポートに、連絡しても「調査中」との回答のまま放置されています。
一ヶ月後、再度、問い合わせても「調査中」...
更に一ヶ月後、再度、問い合わせても「調査中」...
この塩対応はちょっとひどい

会員が他のブログに移行出来ない対策として、
「エクスポート機能」が使えないようにしているのもひどい ..
(ひどいというか、ずる賢いですね、いやらしい点には抜け目ないが、不具合についてはザル状態)

現在、プログラムソースの掲載が以前のように簡単に出来ず、
勝手に書き換えらてしまうHTMLタグを1行、1行修正して
ちゃんと表示できるよう調整する修正が必要です。

非常に面倒な作業です。

NIFTYがノジマに移ってからなのか、
NIFTYはもう終わった感んじですね ...

Arduino STM32のADC(アナログ・デジタル コンバータ)周辺の調査(2)

前回の続きです。

Arduino STM32で手っ取り早くADCを使うには、analogRead()を利用します。
このanalogRead()を利用した場合、変換に要する時間はどれ程なのでしょうか?

疑問に思い、調べてみました。

STM32F1xでは、次のパラメタの設定値が変換時間を決定します。
1)ADCCLK
      ADCのベースとなるクロックです。次の設定が可能です。
      ・システムクロックの1/2
      ・システムクロックの1/4
      ・システムクロックの1/6
      ・システムクロックの1/8

      Arduino STM32では、デフォルトではシステムクロックを1/6 に分周したクロックが設定されています。

 2)サンプリングタイム 
      サンプリングタイムはADCCLKサイクルを単位として、次の設定が可能です。
      ・1.5 × ADCCLK サイクル
      ・7.5 × ADCCLK サイクル
      ・13.5 × ADCCLK サイクル
      ・28.5 × ADCCLK サイクル
      ・41.5 × ADCCLK サイクル
      ・55.5 × ADCCLK サイクル
      ・71.5 × ADCCLK サイクル
      ・239.5 × ADCCLK サイクル

 
変換に要する時間は次の式で求めることが出来ます。
   Tconv = サンプリングタイム + 12.5 サイクル (サイクル)

デフォルトでは 55.5 × ADCCLK サイクル が設定されています。 

Blue Pillボードをシステムクロック 72MHzで利用した場合、
   ADCCLK  = 72MHz / 6 = 12MHz
   Tconv(サイクル)  =  12.5 + 55.5 = 68 サイクル 
   Tconv(μ秒)         =  1/12e6 × 68 × 1e6 =  5.67 μ(マイクロ)秒

となります。

実際にBluePillボードで測定してみました。

テスト用スケッチ

void setup() {
  Serial.begin(115200);
  pinMode(PA0,INPUT_ANALOG);
}
void loop() {
  uint32_t t1,t2;
  uint16_t v;  
 t1 = micros();  
 v = analogRead(PA0);  t2 = micros();  Serial.print("v=");Serial.print(v);  Serial.print(" t=");Serial.println(t2-t1);  delay(1000); }

実行結果

01_7

測定結果としては、おおよそ7~8μ秒 でした。
呼び出しのオーバーヘッド等もあるので妥当な値でしょう。

次に、変換時間が最短になるよう、ADCCLKとサンプリングタイムを変更してみました。
次の設定に変更します。
  ADCCLK                : システムクロックの1/2
  サンプリングタイム  : 1.5 × ADCCLK サイクル

この設定の場合、変換に要する時間は、
   ADCCLK  = 72MHz / 2 = 36MHz
   Tconv(サイクル)  =  12.5 + 1.5 = 14 サイクル 
   Tconv(μ秒)         =  1/36e6 × 14 × 1e6 =  0.38 μ(マイクロ)秒

変更したスケッチ

#include <libmaple/adc.h>
void setup() {
  Serial.begin(115200);
  adc_set_prescaler(ADC_PRE_PCLK2_DIV_2);
  adc_set_sample_rate(PIN_MAP[PA0].adc_device,ADC_SMPR_1_5);
  pinMode(PA0,INPUT_ANALOG);
}
void loop() {
  uint32_t t1,t2;
  uint16_t v;  
 t1 = micros();  
 v = analogRead(PA0);  t2 = micros();  Serial.print("v=");Serial.print(v);  Serial.print(" t=");Serial.println(t2-t1);  delay(1000); }

実行結果

02_4

測定結果としては、おおよそ2~3μ秒 でした。
デフォルト設定の実測値 7~8μ秒より、約5μ秒短縮出来ました。
計算値上でも5.3μ秒の短縮(5.67⇒0.38)ですので、オーバヘッドが2μ秒程度であることがわかります。
ですので、高速化時の測定結果 2~3μ秒(うちオーバヘッドが2μ程度)は妥当な値でしょう。

高速化のスケッチのADCCLK、サンプリングタイムの変更は、前回 ちょっこと触れた
 ・アナログ - デジタル変換(ADC)のサポート Analog to Digital Conversion (ADC) support(adc.h)
のAPI関数を利用しています。

analogRead() を使って、簡単なADCを行う分においては、
デフォルト設定と高速化でそれほど大きな差はないので、デフォルトのまま利用して問題ないと思います。
ただし、DMAを使って多チャンネルのADCを行う場合は、このパラメタの変更はかなり有効になってきます。

2019年5月24日 (金)

Arduino STM32のADC(アナログ・デジタル コンバータ)周辺の調査(1)

BluePillボード(STM32F103C8T6搭載) + Arduino STM32 の環境で、
ADC(アナログ・デジタル コンバータ)を使うためのライブラリを調べています。

STM32のADC機能はArduino Unoと比べるとかなり高機能・高性能なのですがその分、複雑です。
下図は「中容量及び大容量 STM32F101xx 及び STM32F103xx 高性能 ARM ベース32bit MCU(RM0008)」
の「10.3 ADC の機能詳細」からの引用です。雰囲気的に高機能だとわかると思います。

01_6
図を簡単に解説すると、
  ・最大16チャンネルをグループ化して不定期 or 周期的サンプリングが出来る(レギュラー・グループ)
     ADCx_IN0~ADCx_IN15(ただし、ADCコンバータは2機or3機なので同時にではなく各チャンネルを順次変換)
  ・上記のグループに割り込んでADCして最大4つのデータが別途保持できる(インジェクト・グループ)
  ・AD変換開始の様々なトリガーの設定が出来る
  ・サンプルレートの設定が出来る(ADCCLK×選択サイクル数、ADCCLKはシステムクロックの分周選択)
  ・AD変換完了の割り込みが利用可能(レギュラー・グループ 変換完了、インジェクト・グループ完了、アナログ閾値監視ウオッチドック)
  ・DMAを使って、CPUが介在しないマルチチャンネルサンプリングが出来る
  ・マルチチャンネルサンプリング において、各チャンネルに異なるサンプリング周期の指定が出来る 

ADCを使うにあたり、次のライブラリ or APIが用意されています。
1)analogRead()関数       ・・・  Arduino互換関数(ただし分解能は12ビット)
2)STM32ADCライブラリ  ・・・  多チャンネルサンプリング、DMA利用等の機能が利用できる
3)Analog to Digital Conversion (ADC) support(adc.h)  ・・・下位ライブラリ

これらは下記にてリファレンスマニュアルとまとめ中です。

 Arduino STM32 リファレンス 日本語版
    ┣ 1) analogRead()関数
    ┣ 2) STM32ADC 高機能アナログ - デジタル変換(ADC)ライブラリ
    ┗ 3) Analog to Digital Conversion (ADC) support(adc.h) アナログ - デジタル変換(ADC)のサポート

現在、2)STM32ADCライブラリを詳しく調査しています。
このライブラリは、ADCブログ図のかなりの部分をカバーしているライブラリで、
DMAを利用した高速多チャンネルサンプリング等をサポートしています。
中々、強力なライブラリです。

ただし、調査そ進めていくと、いくつかの不具合を見つけました。

現時点で見つけた不具合
 (1)コンパイル時、一部の関数のリンクに失敗する。
     その関数を呼び出すと、暴走(フリーズ?)する。
 (2)readVcc()、readTemp()で取得する値が正しくない。

このライブラリの実装、イージーミスが多く、テスト不十分のようです。

Blue PillボードではADCは2個、ADC接続端子は外部端子として10チャンネル、
内部端子は2チャンネル(内部温度センサ用、内部基準電圧測定用)があります。
このあたりの機能について、上記のライブラリと合わせてもう少し調べてまとめて行きたいと思います。


2019年5月19日 (日)

Arduino用 MML文演奏ライブラリの作成 その2

前回からの続きです。

Dscn1761

Arduino および Arduino STM32環境で利用できる
MML(Music Macro :ミュージック・マクロ・ランゲージ) 演奏ライブラリを作成しました。

  ・MML_Play MML文演奏ライブラリ
     https://github.com/Tamakichi/MML_Play

バックグラウンド演奏にも対応するよう、実装しましたが
実際にどこまで利用出来るかは、評価不足です。

とりあえず、豊四季Tiny BASIC for Arduino、Arduino STM32のMML文処理は
このライブラリを使って一元管理しようと思います。

今回のライブラリ作成で、次の点で少々ハマってしまいました。
1)tone()の引数durationの挙動
2)attachInterrupt()

Arduinoで周波数を指定した音だしは、tone()関数が用意されています。
出力長さを指定する第3引数 durationはミリ秒で指定するのですが、
  tone(8,400,500);
  tone(8,800,500);

と実行すると、1番目の400Hzの音出し500ミリ秒を待たずに
2番目の800Hzの音出しが実行されます。
指定時間音出し完了の上、次の処理に移ると思い込んでいました。

tone()は長さ指定しても、即時完了して次の処理に移ります。
並行動作で、500ミリ秒後に勝手に音が止まります。
ですので、1番目の音だしの処理後すぐに2番目の音出しに移り
演奏としてのタイミングが意図しないものになってしまいました。
対策としては、duration分、delay()で時間待ちする必要があります。

次にattachInterrupt()ですが、
ArduinoとArduino STM32で仕様が異なります。

Arduinoでは、
  attachInterrupt(interrupt, function, mode)
といった感じで第1引数には割り込み番号を指定します。

ところが、
Arduino STM32、micro:bit 用Arduino(arduino-nRF5) の同関数では
  attachInterrupt(pin, function, mode)
ピン番号を指定します。

Arduinoでもピン番号を指定するものと思い込んでプログラムを作成したところ
動作せず、しばらく原因が分からずハマってしまいました。

微妙に、仕様が異なるのはちょっと困りますね。

2019年5月18日 (土)

MSX casio PV-7の代替えACアダプタ

MSX casio PV-7、ヤフオクではACアダプタ無しであれば1000円~2000円程度で入手可能です。
魔改造等、実験等にはもってこいのマシンです。

Dscn1760

専用ACアダプタは、DC 10Vで 外径 5.5mm 内径 2.1mmのプラグなのですが、
外側がプラス、内側がGNDと一般的でなく通常とは逆になっています。
ちょっと入手しにくそうな規格のACアダプタです。

Dscn1757

ところが、ファミコンがちょうどこの規格のACアダプタを使用しています。
「CASIOはなんでこんなACアダプタの規格にしたのだろう」と思っていたのですが、
当時のファミコンを意識して規格を合わせたようです。

試しに、互換品のACアダプタを入手して試してみました。
新品でもamazon等で送料込みで1000円以下で入手できます。
ハードオフ等ではもっと安く入手出来ると思います。

電圧、電極、プラグ形状的には適合しており、実際に利用してみても問題無く利用出来ました。

Dscn1758

比較するとかなり小さいです。
「小さいは正義」、こちらの方が断然使い勝手が良いですよね。

Dscn1755

交換したところ、コンセント周りがスッキリしました。
今後これを使っていくことにします。

 

2019年5月10日 (金)

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

前回からの続きです。
FUSION-Cを使ったMSX用プログラム開発環境をWindows 10上に構築しました。

開発環境としては、
  ・テキストエディタ Sublime Text 3
  ・クロスCコンパイラ SDCC
  ・ライブラリ FUSION-C
  ・MSXエミュレータ Open MSX
  ・その他支援ツール(Hex2BIN、etc)
となります。

とりあえず、”Hello,world"を表示するプログラムを作成し、
(クリックすると拡大表示します)
02_3

ビルドしてみました。
(クリックすると拡大表示します)
09

MSXエミュレータが起動し、MSX-DOSのプロンプト状態になります。
(クリックすると拡大表示します)
10

カレントディレクトリには、コンパイルしたプログラム HELLO.COMが格納されています。
実行すると、"Hello,world"と表示されました。
C標準ライブラリを使った記述でも問題なく実行出来ました。
(クリックすると拡大表示します)
03_2

このプログラムをMSX2実機 FS-A1Fにて動作確認をしてみます。

Windows 10機にUSB接続のフロッピディスクドライブを接続して、
MSXFormで2DDフロッピディスク(以降FDと表記)をフォーマットし、
同FDにMSX-DOS、COMMAND.COM、HELLO.COMをコピーしてMSXにてMSX-DOS起動させました。
プロンプト表示状態でhelloを実行、エミュレータと同じように問題なく実行出来ました。

(クリックすると拡大表示します)
Dscn1754

これで、とりあえずはC言語を使ったMSX-DOS上で動くプログラムが作成できる環境が整いました。

このFUSION-Cの開発環境は、Repro Factoryがフリーソフトとして公開しています。
(無料ですが、ユーザー登録して0円商品の購入手続きが必要です) 

(クリックすると拡大表示します)
07

今回の環境構築では、上記の"Fusion-C Library""FUSION-C Tools-Chain"を利用しました。
"Fusion-C Library" が FUSION-Cライブラリパッケージです。
"FUSION-C Tools-Chain" には、最新版では無いかもしれませんが、
  ・テキストエディタ Sublime Text 3
  ・クロスCコンパイラ SDCC
  ・MSXエミュレータ Open MSX
  ・その他支援ツール(Hex2BIN、etc)
が含まれています。これだけで開発環境が構築出来ます。

"Fusion-C Library" にはクイックマニュアル(PDF 全108ページ)が添付されていて
これでけでも十分利用出来ます。
05_1

テキストエディタ Sublime Text 3は、デフォルトでは日本語対応していません。
私は下記のサイトの情報を参考にして日本語環境設定を行いました。
Sublime Text 3のインストールと初期設定

ちなみにこのFUSION-Cのライセンスは、次のように記載されています。
08


2019年5月 6日 (月)

液晶ディスプレイRDT193WMは15kHz対応っぽい

MSX2用に三菱電機製液晶ディスプレイ、RDT193WMを使っています。
RGB to HDMIコンバータ、HTMI to VGAコンバータを連結して映像出力しています。
このディスプレイはHDMI端子がありません ;^^

最近、ネットで
  「三菱製の液晶ディスプレイは非公式で15kHz、24kHz(水平同期信号)に対応している製品が多い」
とのうわさを聞き、
うちのディスプレイも対応しているか、ちょっと実験してみました。

ブレッドボード上にRGB信号をVGA信号に変換する回路を組み試してみると ... 

Dscn1743

表示出来ました。
う~ん、いいですねぇ。
コンバータが無いので表示の遅延も発生しないですね。

ただし、若干映像に縦縞があります。
ブレッドボードのためノイズを拾いやすいのかもしれません。

Dscn1747

水平同期信号は15.9kHzと認識、200ライン系もOKのようです。

Dscn1745

この子(ディスプレイ)、いいですね。
HDMI端子が無く、使い勝手が良くないので処分を考えていたのですが、
捨てなくて良かったです。
レトロPCやゲーム機のモニター用に需要がありそうです。

ちなみにRGB信号からVGA信号への変換は、下記のサイトの情報を参考に実装しました。
特に文献2)は方式を理解することが出来き、大変参考になりました。

参考にした文献
・1)LCD-8000VとMSX: うみゅ
      http://miyako.asablo.jp/blog/2015/06/21/7677303
・2)試運転の資料館 - 複合同期信号分離出力化改造工事設計図
      http://shiuntenlos.ie-yasu.com/psma0020.htm
・3)MSX2 RGB端子 ピンアサイン
      http://gamernium.com/archives/1472
・4)Wikipedia - RGB21ピン
      https://ja.wikipedia.org/wiki/RGB21%E3%83%94%E3%83%B3
・5)Arduinoを用いたVGA映像信号の出力
      http://www.net.c.dendai.ac.jp/~anada/

文献2)「試運転」さんの公開回路図を参考にして、下記の回路図を起こし、
ブレッドボード上にて実装しました。

Photo_1

マルチバイブレータ(74HC221)で水平同期信号のタイミングとパルス幅を確保しています。
時定数を決める抵抗は半固定抵抗に変えて、同期信号のタイミングを調整出来るように
修正した方が良さそうです。

ブレッドボード上ではなく、フレキシブル基板上に実装してケースに入れて
使い勝手を良くしようと思います。


追記 2019/05/09

色々と調整したのですが映像はコンバータ(映像はRGB to HDMIコンバータとHTMI to VGAコンバータを連結)を
利用した方が鮮明で映りが良いです。





2019年5月 2日 (木)

ヤフオクでFS-A1Fを入手したのですが...

ヤフオクでパナソニックのMSX2機 FS-A1Fを入手しました。

Msx

私が入札後、2人の方が競り合っていたのですが何故か、2人ともキャンセルのため
格安で落札出来ました。ラッキー!

FS-A1Fが到着し、動作確認をしてみると、
Dscn0067

画面がまともに表示出来ません。ありゃ..

Dscn9984

実際の起動の様子



はずれを引いたっぽいです。
まあ、2,100円なのでパーツ取り用でも元はとれるでしょう。

試しに、フロッピーディスクドライブにフロッピーディスクを入れて起動してみると
モーターが高速回転しているような感じです。
恐らく内部のベルトが切れていると思われます。

とりあえず、分解してしてみました。

Dscn9988

不具合の発生率が高いHIC-1と呼ばれているボードのコンデンサを見ると、なんとなく怪しい。
根元が錆びているような、液漏れしているような感じです。

Dscn9995

とりあえず、コンデンサを取り換えてみました。

Dscn0021

再度動作確認してみたのですが、状況は「変わらず」でした。残念。。
ここが原因では無いようです。

改めて画面の表示を見て分析してみると、
表示内容の一部が壊れているような感じです。映像出力の同期は出来ている、サウンド出力もOK。
もしかしたらVRAMが怪しい? そこでDRAMを交換してみました。

基板上のDRAMを4つ交換しました(下の写真)

Dscn0044

この交換、意外としんどかったです。
ボードが鉛フリーはんだ?のようで、はんだが溶けにくいです。
結局、DRAMをニッパーで切り離したのち、新しいDRAMを取り付けました。

Dscn0034

再度電源ON、やっと見慣れた画面が表示出来ました。やったー

Dscn0051

パナソニックのMSXではおなじみのコックピット画面が立ち上がりました。

Dscn0048

BASICに移動すると、BASICも起動できました。う~ん、いいですねぇ

Dscn0054

次にフロッピーディスクドライブを修理してみました。

やはりベルトが切れています。

Dscn9979

分解してベルトの破片を取り除きます。
粘土のように柔らかくなっていて、へばり付いていて取り除くのに意外と苦戦しました。

Dscn9997

フロッピーディスクドライブの解体は、こちらを参考にしました。
 (こちら「Restoring a MSX2 Panasonic FS-A1F」が元ネタっぽいです)
下の写真の真ん中のネジは外すとダメとのことです。

Dscn9998

モータについているプーリー(スピンドル?)にべっとりとベルトが溶けてくっついているのを剥がすのが大変でした。

Dscn9999

ベルトはとりあえず、モビロンバンドで代用してみました。
モビロンバンド 折径80mm 黒  50g
MSXの修理ではメジャーな方法ですね。

Dscn0068

組立てて、再度動作確認、フォーマットで動作確認。
最初はエラーとなったのですが、数回やってみるとベルトが馴染んできたのか、
何回やってもフォーマットエラーが発生しなくなりました。やったー

Dscn0061

フロッピーディスクドライブの修理はとりあえず、これで良しとします。
ヘッドは問題ないようなので、一安心です。
利用で難儀するようであれば、ちゃんとしたベルトを調達して対処したいと思います。

ちゃんと動くようになったので、次は掃除です。
キーボードがかなり汚いです。キーボードを1つ1つ外して掃除しました。

Dscn0028

Dscn0027

Dscn0026

修理完了、いい感じになりました。
キーボードは全て問題なく文字入力出来ました。

FS-A1F、フロッピーディスクドライブ付きでコンパクトなボディ、
重くもないので、使いたいときに取り出して使えてます。

  Dscn1737


追記 2019/05/03

メインRAM 128kバイト化の改造をやってみました。
下記の記事を参考にさせていただきました。
 ・MSX - FS-A1Fについて - FS-A1F RAM増設
    http://usbsecretbase.michikusa.jp/a1f/index.html

Dscn0042

同記事で公開しているメモリチェックプログラムを利用して確認したところ、
増加分のメモリが認識されているようです。

Dscn0045

「NG:8」 の表示は無視して良いとのことです。

« 2019年4月 | トップページ | 2019年6月 »