電子工作

PIC, AVR, ARM...

2018年9月22日 (土)

ミネルバ放出

小惑星探査機「はやぶさ2」が、ミネルバ2の放出に成功したようだ。
ミネルバ2は、はやぶさ2に搭載されている地上探索用ローバである。
はやぶさ2にはミネルバ3台が収納されており、このうち2台を地上に投下した。
初代はやぶさもミネルバを搭載していたのだが、放出に失敗してしまい、ミネルバは宇宙をさまようことになった。

ミネルバ2は地面に着地した後、地面の様子を調べることができる。
あと、撮影できたり、ジャンプして移動することができる…らしい。

私なんて、RaspberryPiに無線通信させるだけでひいひい言っているというのに。

2018年9月 7日 (金)

RPiでPSG #5

RaspberryPiでPSG(※1)を演奏する回路に取り組んでいたが、なんとかXEVIOUSは演奏できた。
XEVIOUSの曲は、数秒の長さしかないし、いろんな機種に移植されているから、どの曲が正解なのかさえわからない。音が多少おかしくても非難されることはない。

▽ここに音声

これがGRADIUSだったりしたら、名曲ぞろいだから苦情殺到になる。
前にも書いたが、データフォーマットはこんな感じ。

//    ----------------------------------------
//    ┌──┬──┬──┬──┐
//    │ffnn│nnnn│cccc│cccc│
//    └──┴──┴──┴──┘
//    f=func, t=note, c=count(length)
//    ----------------------------------------

Sound-Cortexはエンベロープに対応していないから、音色はこれが限界。
まだタイやスラーにも対応していないが、それに対応したらもうちょっとマシになるかな。

※1. Sound-Cortexを書き込んだLPC810をPSGとして使っている。

2018年8月25日 (土)

砂粒にハンダ

中国から輸入した電子部品のハンダ付け。

一部の部品は向こうでハンダ付けされている。表面実装の部品は機械だから問題ないが、手ハンダのデキはひどいもので、部品が傾いているなんて当たり前。

それどころか裏側は短絡していた。もちろんこちらも修理した。

Ftdi232rlerror

可能な限り修理するが直せない物もある。いっそ部品を組み立てないまま送ってくれればいいのに。
チップ抵抗の型番が間違っているやつも交換した。
チップ抵抗は0603サイズというものだが、これが手持ちのピンセットの先より細い。挿し木に使う川砂の砂粒くらいといえばわかるだろうか。
この作業には、度数2.0の老眼鏡を2枚重ねる必要がある。

台風で寝たままになっていたシシトウに支柱を立てた。トウモロコシが出穂したので、アワノメイガ対策の農薬をまいた。

2018年8月11日 (土)

RaspPiでPSG #4

LPC810をPSG代わりにして、RaspberryPiで曲を演奏したいが、RaspberryPiではまともなタイマ割り込みが使えないため、音源ICがあっても音楽演奏するのは難しいようだ。
タイマ割り込みを普通にやると割り込み間隔は10ms程度になる。

テンポ120は、1分間に4分音符を120個演奏できるという意味である。音の間隔は、60sec / 120 = 0.5sec = 500ms となる。
32分音符を演奏するには、その1/8なので62.5msだね。
音と音の切れ目を、音長の1/8程度入れたいなら、さらに1/8して7.8125msとなる。
これくらいの精度が出せるのタイマ割り込みが欲しいのだ。

しかたがないので、タイマ割り込みのことはいったん忘れて、全力で音楽演奏してみよう。
タイマを監視して、その値を見て演奏のタイミングをはかればいい。

int timeLap, timeNow, timeOld;
struct timeval tim;
//	----------------------------------------
// ---------------------------------------- void usTest() { static int count = 0; gettimeofday(&tim, NULL); timeNow = tim.tv_sec * 1000000 + tim.tv_usec; timeLap = timeNow - timeOld; printf( "%dus", timeLap ); timeOld = timeNow; count++; if((count&7)) printf(", "); else printf("\n"); }

こんな感じのコードを書いて1000回ほど実行すると、こんな結果になった。

>gcc xevious.c -o xevious.x -l wiringPi
>sudo ./xevious.x

0us, 62us, 3us, 3us, 3us, 3us, 2us, 3us
42us, 4us, 2us, 3us, 3us, 3us, 2us, 3us
65us, 4us, 3us, 3us, 3us, 2us, 3us, 3us
51us, 4us, 3us, 2us, 3us, 3us, 2us, 3us
45us, 4us, 3us, 3us, 4us, 2us, 3us, 3us
46us, 4us, 2us, 3us, 3us, 2us, 3us, 3us
44us, 4us, 6us, 3us, 3us, 3us, 4us, 2us
45us, 4us, 3us, 3us, 2us, 3us, 3us, 2us

単位はmsではなくusだ。思っていたより高速だな。
左端の値が大きいのは、改行時に画面の更新が入るためだろう。

2018年8月 9日 (木)

RaspPiでPSG #3

LPC810をPSG化したら、RaspberryPi3に接続して音を出してみよう。
LPC810から見た結線図はこんな感じ。

LPC810----RaspPi3
-----------------
1.SCL---------SCL
2.SO---R510---SPK
6.VDD--------3.3V
7.VSS---------GND
8.SDA---------SDA

raspi-configで、I2Cを選択して、有効(enable)にする。

>sudo raspi-config

Interfacing Options→I2C→enable? [OK]
として、I2Cデバイスを有効にする。
I2Cデバイスが有効になっているかどうか調べてみよう。

>sudo i2cdetect -y 1

無事に接続できていれば、こんな感じの表示になる。
LPC810がI2Cデバイスとして、0x50-51を使っているのがわかる。

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: 50 51 -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

あとは音を出すだけ。
アンプとかよくわからないので、ブレボにイヤホンジャックを載せて、あとは外付けアンプとスピーカ任せで音を出せばいい。

Psgtest

アセンブラでPICマイコンをいじっていた時から、音ネタの第一歩はXEVIOUSと決まっている。スイッチ二つと赤いLEDは必須。

2018年8月 8日 (水)

RaspPiでPSG #2

トラ技が届いたので、LPC810が1個手に入った。
このLPC810に、PGGとSCCをエミュレートするファームを書かねばならない。
ファームを書くにはLPCライタが必要になるが、LPCライタは次の号の付録らしい。ディアゴスティーニみたいだ。
専用のライタは便利だが、LPC810はじつによくできている。
起動時にPIN5をLOWにしておけば、シリアルに流れてくるデータをファームとして書き込めるらしい。
中華製USBシリアルモジュールがあったので、それでやろう。

 

LPC810----FT232RL
-----------------
2.TXD---------RXD
5.ISP---------GND ←これでISPモードに
6.VDD--------3.3V
7.VSS---------GND
8.RXD---------TXD

PIN5をGNDに落として起動=USBケーブルを接続すると、LPC810がISPモードになる。

Lpc810ftdi

FlashMagicでHEXファイルを書き込めばPSGのできあがり。
転送速度などはマイコン側が自動判別するが、COMポートはデバイスマネージャでFT232RL(COMx)を探して指定しなければならない。

2018年8月 6日 (月)

RaspPiでPSG #1

先日、STM32F401RExで、三重和音の曲を演奏することに成功したので、RaspberryPiでも同じことを試してみたい。
だがRaspberryPiには、同時に使えるPWMが二つしかないようだ。二重和音である。

外付けの音源ICを…とも考えたが、たとえばPSGを制御するだけでも大量の信号線を接続しなければならない。
RaspberryPi単体でも二重和音が出るのに、信号線を10本以上使って三重和音ではコスパが悪い。
いい方法がないか調べていたら、SoundCortexというものがあった。
LPC810というマイコンにPSGをエミュレートさせるファームを焼いて、それを音源ICとして使おうというものだ。
接続方法はI2Cのわずか2線だけで済む。これはいいぞ。

まずはLPC810を入手しなくてはならない。だがLPC810は既にディスコンとなっていて、そう簡単に入手できないようだ。
海外から輸入できるようだが、届くのがいつになるのかわからない。

トランジスタ技術の2014年2月号に付録として付いているらしい。とりあえずバックナンバーを購入した。

2018年7月14日 (土)

TRONで音楽 #3

Nucleoボード、STM32F401RET6でMusicDriverを作っている。
リアルタイムにMMLを解析しながら演奏するのではなく、
MMLを解析していったん曲データをバイナリデータに変換してメモリに配置する。
それを別の関数で再生するという方法を取る。
まあ、関数名だけでわかると思う。

int setTrack(int track, char *mml);
int bgmSet(int ch, int track);
int bgmPlay(int ch);
int bgmStop(int ch);
int sePlay(int track);

同時に3chをON/OFFできる。三重和音すべてを演奏するならbgmPlay(7)を指定。
sePlay()は効果音を演奏する。ch.2を停止して効果音を演奏する。
データフォーマットはこんな感じにした。

//    ----------------------------------------
//    MMLをバイナリに変換
//    c4=ドの四分音符, b8=レの♪
//    MMLについては以下を参照
//    http://www15.big.or.jp/~annex-hp/anxmid/nyumon.html
//    ┌──┬──┬──┬──┐
//    │ffnn│nnnn│cccc│cccc│
//    └──┴──┴──┴──┘
//    f=func, n=note, c=count(length=1-192)
//    ----------------------------------------

以前、同じことをPICマイコンでやろうとしたことがある。
が、メモリが少なくて、MMLをリアルタイムに変換するのはできなかった。
arduinoでも同じことを経験した。
今回のSTM32は三度目の正直である。
続きはお盆明けの予定。

2018年7月10日 (火)

TRONで音楽 #2

STのNucleoボード、STM32F401RET6をいじっている。
このマイコンボードには、PWMが複数搭載されている。

PWMの出力をそのままスピーカに入れたら、CPUの負担なしに音を出すことができた。同時に複数のPWMを使えば和音の演奏も可能なはず。

Timer1-3それぞれにPWMを設定したところ、きれいな三重和音で曲を演奏することができた。

音源ICを使うことなく、そこそこの音楽を演奏できたのは大満足だが、こんなハイスペックのマイコンボードが、曲を奏でるだけではもったいない。

次は曲を演奏したまま、何かの処理ができるようにしたい。

2018年7月 6日 (金)

STM32F103C8T6の不具合

今年になってから、ARM系のマイコンボードばかりいじっている。
NucleoのNano型ボードを愛用していたが、STM32F303K8は1,600円と安くない。
最近気に入っているのは、STM32F103C8T6だ。
このマイコンボードは、クロック72MHz、Flash64KB、SRAM20KBで300円。じつにコスパがいい。

ところが、このボードを認識しないPCがあるようだ。
うちのPCでは動作していたので、気付かなかったがワークショップでは都合が悪い。

原因はこういうことだった。

ようするにマイコンボードの不具合である。
マイコンボードの裏面を見て、R10というシルク印刷を探す。そこに付いているチップ抵抗の値が103=10KΩだったらアウト。
この不具合は、自分で修理することもできる。チップ抵抗を152=1.5KΩに交換すればいい。
チップ抵抗はサイズが色々あるが、0603 R1.5K=152 1/10Wが適している。
中国から輸入すると200個が200円。送料込みである。いったいどうなっているのだ。
届いたらまた書く。

より以前の記事一覧

最近のトラックバック