2016年6月10日金曜日

デジタルマイクSPM0405HD4Hがデジタルで動いた!

このまま「またデジタルマイクが動かない」「やっぱりデジタルマイクが動かない」「まだまだデジタルマイクが動かない」と長編化するかと思われたデジタルシリコンマイク、ついに動きました!


■考察■

今までも動いていたけどノイズに埋もれてわからなかった、というのが真相だと思います。

動かなかったバージョンでは100-10000回のカウントを終えるとLoopを抜けていました。これはESP-WROOM-02にはWDTがついていて、約1秒間loop()から抜けないとリセットがかかるのです。

何となくloop()抜けてもすぐに帰ってくるんだろ、ぐらいに考えていたんですが、これが想定以上に大きくて、抜けるたびに処理が止まってノイズとなっていました。loopから抜けるのをやめてESP.wtdFeed()にしたところ、かすかなノイズは入りますがマイクの前の音声がちゃんとADCから出力されるようになりました。

■ソース■

loopの値は100(サンプリング周波数10khz)ぐらいが良いようで、10(100khz)だとDACに出力するためのブランクの比率が著しいノイズとなり1000(1khz)にすると割れて何が何だか、という感じでした。また、countとして++だけでなく--も入れてみたところ、音量がかなり大きくなりました。100の場合で値は-100〜+100まで振れるので、精度は8bit、速度は10khzということになります。





お騒がせしました&ありがとうございました>電子工作部各位殿

もうちょっと高速のCPUが使えれば、DAC出力その他のための中断を回避できるので、もっといい音になると思います。現状で160Mhzクロックの32bit CPUなので、これより上のCPUを用意するよりはFPGAで作るべきものだと思います。約400円で専用チップ売ってるんですけどねw

ちなみにマイクの性能には「14bit相当・10khz」とのこと。うーん、どういう演算処理をすればそういう信号が得られるのでしょう。思いついたらまた試してみます。

■使用部品紹介という名のCM■

今回の実験では、
同社サイトより


同社サイトより

同社サイトより

を使用しました。

マイクモジュールとアンプへの3v3はBoard1搭載の安定化電源から供給しています。何かと電源にシビアなESPですが、(プログラムのバグ以外では)安定して動作しています。

タフな電源にしといてよかった…と設計者は胸をなでおろすのであった(完)。

2016年6月9日木曜日

デジタルマイクが動かない(SPI DAC出力編

Board1 - Mic - ADC+D級AMP

■ノイズしか出ねえ■

前回のあらすじ。秋月で300円のデジタルマイクモジュールを試してみたものの、マイコンからパルスを入れてもそれっぽい信号が取れている気がしない。でも、出力をLPF通してアンプにつないだら音が出ていた。

ということはPDMとしての動作はOKであとはデジタルとしてどうやったら信号を取り込めるか、ということになります。

ESP-WROOM-02を160Mhzで動かし、約1mhzでデューティー比50%近いパルスを入れてダウンエッジから約60nSecぐらいのところで取り込んだデータを集計してDACから出力してみたのですが…雑音しか出て来ませんでしたorz

ということで、以下失敗の記録です。なお、失敗記録を読んでもしょうがない、という方は先にこちら(デジタルマイクSPM0405HD4Hがデジタルで動いた!)をどうぞ。

■SPIと競合しちゃう■

最初GPIO12から信号を読み込んで居たのですが、ずっとゼロでした。SPIライブラリの内部で何かに使っているようです。GPIO5からクロック出力、GPIO4からデータ入力…という形にしたところ、読み込みできました。

なお、DACはMCP4922を使い、配線は以下の通りです。正しく動作しているかどうかは例によってノコギリ波で確認しました。

ESP8266SPM0405HD4HMCP4922
GPIO4DAT
GPIO5CLK
3v3Vcc1, 1, 11, 13
GndGnd, L/R12 GND
GPIO135 SDI
GPIO144 SCK
GPIO153 !CS
GPIO168 !LDAC


■最適化されちゃう■

タイミングやデューティー比を調整するために意味のないインクリメントを入れてみたのですが、localで宣言した意味のない演算は最適化で消されちゃうみたいですね。
for (int i = 0; i < n; i++) {
  int a = 0;
  a++;
  a++;
}
a++を増やしても結果変わりません。

void loop()の外で
int a = 0;
を宣言すると1つあたり25nSec程度の遅延が得られます。

digitalWrite(x, HIGH)で225nSec、digitalWrite(x, LOW)で212.5nSec程度の処理時間がかかります。

■試行錯誤しちゃう■

  • 現在のソースではダウンエッジだがアップエッジでも試す。ダウンエッジとアップエッジをLRライン=LOW/HIGH両方で試す。
  • ループ前にcountを0にして入力HIGHなら加算。あるいはLOWなら加算
    ▶ノイズだけ
  • ループ前にcountを毎回初期化せず、HIGHなら加算, LOWなら減算。あるいは逆
    ▶発散しました
  • ループ回数を減らしたり増やしたり
    ▶ノイズの音質が変わりますw
  • パルス出力からサンプリングまでのタイミングを増やしたり減らしたり
    ▶ノイズの音質が変わりますw
浩一はもう疲れました…。


■ソース■

loop内でforループから抜けた後のSerialは、タイミングなどを確認した後にコメントアウトしてます。処理時間がものすごく長いので。それとArduino IDEではツールメニュー>CPU Frequencyで160Mhzを選んでください。80Mhzだとクロック500khzしか出ませんので。


■そして…■

2016年6月5日日曜日

ハンダ付け:拡大鏡からUSB顕微鏡へ

「EDI」に見えるのは「103」天地逆

えー、老眼です。

ハンダ付けにはルーペのついたハンダ付け作業台が必須です。

でも覗き込んで作業するのは首やら腰に負担が大きいので何とかしたいなと、以前USB顕微鏡を購入しました。

が。

  • 附属のLEDランプが明るすぎる
  • ランプが真上から照らすのでハンダの金属光沢が見えづらい
  • 専用アプリでは遅延が大きすぎて作業に支障出まくり

ということで、買ってすぐオクラにしてました。「誰か買ってー(泣)」とfacebookで呼びかけたものの、「こういう欠点ある(きっぱり)」なものが売れるはずもなく。

が。

ちょっと顕微鏡的なことに使いたくて、久しぶりにパッケージを開けてみました。専用ソフトは消してしまったので、「またインストールするのも面倒くさいな」と手っ取り早くPhotoBoothを起動してみたら…表示されました。ははは。

それもほとんど遅延なしで表示されてます。あははははは。

ただPhotoBoothだと鏡像なので、QuickTimeで試してみたら…ちゃんと見えます。問題なく。遅延なくフルスクリーンで表示できて鏡像/正像の表示ができればOKなので何でも良いのですが。さがすの面倒くさいのでAppStoreで240円のアプリを買いました。
で。

作業台に取り付けようとUSBケーブルをたぐっていたら、ケーブルの途中に見慣れないツマミが。ボリュームとスイッチがついてます。ボリュームを動かすと何とLEDランプが暗くなり、消すこともできるじゃありませんか。だははははは。

というわけで、撮影したのが一番上の写真。赤っぽいのは電球色LEDで撮影したせいです。ハンダ付けには倍率大きすぎるんですが、でも冒頭の欠点はすべて解消しました。強いて言えば割と発熱するので使わない時は切っておきたいんですが、アプリ等からオフにできないので使わない時はUSBハブから引き抜かないといけない=使うときに引っぱり出さなければいけない、というのが欠点かしら(ズボラっぷりをカミングアウトしているだけとも言う)。

ということで、微細なハンダ付けをきれいに仕上げたい方にお勧めです。

BeMicro MAX10のPMOD

A, B, C, DのAだから端についているだろと思ったら、甘かったw 写真手前から二段目です。

奥から順にPMOD_C, PMOD_D, PMOD_A, PMOD_Bの順番で並んでいます。


PMODとしてのピン番号は右から1-6、一番左の6番が3v3, 5番がGndなのは共通です。

BeMicroの端子とピンの配置については、bemicrom10_getting_started.pdfって資料に出てます。

PMODはこんな感じ。毎回さがすの面倒くさいから貼っておきます。


デジタルマイクが動かない(ESPとFPGAでクロック生成 )◀アナログ出てました

秋月のディジタルシリコンマイクモジュール(細ピンヘッダ版)を試してみました。

秋月のサイトより

このモジュールは1-3.25MHzのクロックを入れればPDMフォーマットでデジタルデータが取り出せます。PDMなのでローパスフィルタを通せばそのままアナログ信号として使えます。しかも300円。素晴らしい。

…しかし使えなければ意味がありません。結果として動作させることができませんでした。

今週は何をやっても動かないなorz

■追記6/6■

電子工作部の方から「LPFの出力をアンプに繋いでみたら何か信号出てるんじゃない?」というアドバイスをいただき、FPGAで作った1.25Mhzのクロックを入れて、LPF出力をカップリングコンデンサ経由で27dBのアンプにつないでみました。

そしたら!

小さいですが確かに音が出ています!! いえええええ!!! アドバイスありがとうございました。うれしー。小さすぎてオシロでは見えなかったけど、信号出てたのね。

というわけで、今週末はデジタルでの処理に再挑戦します。

それまでは以下のマイコンでの試行錯誤からFPGAでのクロック発生回路でアナログとしての取得に成功、最終的にデジタル信号として取り込みDACから音が出るまでのドタバタ劇をお楽しみいただければ幸いですw

■SPIでデジタル入力(失敗)■

今度はSPIです。SPIのクロックを1Mhzに設定し、SPI modeをいろいろ変えたりしてみたのですが、結果は似たようなもので値が123-127の間をパラパラ上下するだけでした。

#include <SPI.h>
const uint8_t BITS_COUNT_TABLE[256] = {
    0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,
    1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
    1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
    2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
    1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
    2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
    2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
    3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
    1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
    2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
    2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
    3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
    2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
    3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
    3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
    4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8,
};
int numofbits2(uint16_t bits)
{
    return BITS_COUNT_TABLE[((unsigned char*)&bits)[0]]
         + BITS_COUNT_TABLE[((unsigned char*)&bits)[1]];
}
void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  SPI.begin();
  SPI.setFrequency(1000000);
  SPI.setDataMode(SPI_MODE0);
  noInterrupts();
}
static int mabiki = 0;
void loop() {
  // put your main code here, to run repeatedly:
  int num = 0;
  for (int i = 0; i < 16; i++) {
    num += numofbits2(SPI.transfer16(0xffff));
  }
  char buf[6];
  sprintf(buf, "%4d", num);
  if (mabiki == 20) {
    Serial.println(buf);
    mabiki = 0;
  } else {
    Serial.print(buf);  
  }
  mabiki++;
}
なお、ビットカウントはこちらの記事から使わせていただきました。

テーブルを使う方法は思いついたのですが、そのあとに記載されているアルゴリズムは本当にびっくりです。1960年代のコンピュータサイエンスは凄まじいですね。

■GPIOでデジタル入力(失敗)■

GPIOでクロックを生成し、ポートを読み込んで積算する方法を試してみました。帰ってきた値は見事にデタラメでグラフ化しても波形になりませんでした。
#include <Arduino.h>
void setup() {
  // put your setup code here, to run once:
  Serial.begin(230400);

  pinMode(14, OUTPUT);
  pinMode(12, INPUT);
}
void loop() {
  // put your main code here, to run repeatedly:
  int count = 0;
  for (long l = 0; l < 1000; l++) {
    digitalWrite(14, HIGH);
    if (digitalRead(12) == HIGH) {
      count ++;
    }
//    else {
//      count --;
//    }
    digitalWrite(14, LOW);
  }
  Serial.println(count);
}

なお、コメントアウトの部分はLOWならデクリメント、というサンプルを見たので試してみたのですが…結果がマイナスに振れただけで同じでしたたたたた。

■マイコン発振 / アナログ出力(失敗)■

1MHz強のクロックを入れ、出力に約20khzのローパスフィルタ(R=1kΩ,1=10nF)を通してマイク前から信号を入れてみました。ローパスフィルタは出力端子>抵抗>コンデンサ>Gndとつないで、抵抗とコンデンサがつながっているところから出力取ります。1MHz強のクロックはESPを160MHzクロックで動かして、以下のプログラムで生成します。デューティー比50%にならないけど、気にしない。デューティー比を考えれば少しでも演算の早いshortの方が良いのですが、shortだと約32mSecごとにシステム?に戻ってしまうのでオシロで波形見るときに邪魔かなと。
#include <Arduino.h>
void setup() {
  // put your setup code here, to run once:
  pinMode(14, OUTPUT);
}
void loop() {
  // put your main code here, to run repeatedly:
  int count = 0;
  for (long l = 0; l < 1000000; l++) {
    digitalWrite(14, HIGH);
    digitalWrite(14, LOW);
  }
}

さて出力は…見事に直流です。本当にありがとうございましたorz

■FPGA発振 + アナログ出力■

最後にFPGAでちゃんとした1.25 / 2.5MHzのクロックを作って試してみます。でもまだちゃんと作る自信がないので、「FPGA電子工作スーパーキット」のp112ページからの手順やソースをまず動かして見て、そこにクロック生成を追加します(弱気

なお、同誌附属の基板はまだ組み立てていないので、BeMicro MAX10を使います。
  1. Quartus起動
  2. New Project Wizardでディレクトリ,プロジェクト名ClockGenを入力し、BeMicro搭載デバイスの10M08DAF484C8GESを選び、Finish。
  3. Fileメニュー>New...からVerilog HDL Fileを選びOK
  4. Velilogソースを打ち込む
  5. TasksのAnalysis & Synthesisを右クリックしてStartを選ぶ。エラーが出たら直してもう一度
  6. Assignmentsメニュー>Pin Plannerを選び、ピンを割り当てる(下図1)
  7. TasksのCompile Designを右クリックしてStartを選び、コンパイルし、「…Quartus Prime Full Compilation was successful」が出たらOK
  8. Toolsメニュー>Programmerで、Programmerを起動
  9. USB-Blasterが選択されていることを確認(表示されていなかったらHardware Setup...ボタンから選択ダイアログへ)
  10. Add Fileボタンをクリックし、output_filesの中のClockGen.sofを選ぶ。デバイスと書き込みファイルが表示される(下図2)
  11. Startボタンをクリック、瞬時に書き込みが終わり、LEDがチカチカ。


図1

図2
基本動作が確認できたので、2.5Mhzとその1/2, 1/4, 1/8のクロックをPMOD端子から出力するように書きなおします。
  1. QuartusのEntity欄でClockGenをダブルクリックしてVerilogソースを開きます。
  2. ソースを修正して保存します。
  3. 青の「▶」をクリックすると「変更するか?」と聞いてきますのでYES
  4. Full Compilation was successfulが出たらToolsメニューからProgrammer
  5. Startボタンをクリックしてコンフィグ(書き込み)
と、いうわけで、(少し)きれいな1.25Mhzと2.5Mhzが出ました。で、本題のデジタルマイクですが。同じです。ローパスフィルタを通しても何も出ません。

はい終了。

■FPGAのソース■



■最後に■

デジタルマイクは製品として販売されているからには、動くはず。でも何が悪いのかわかりません。もう涙も枯れ果てました…でもFPGAでクロック出すのはうまく行ったから良しとしよう(問題をすり替えてはいけません)。

続きはこちらをどうぞ。

Verilog:「-1」と「- 1」が違うなんて・・・

ツールに慣れるための素振りとしてFPGAでLチカやったんです。

そしたら、LチカどころかL(数分)チカになってしまいまして。何度見直しても違いがわかりません。原因がこの行なのは間違いないのですが。
assign period_1sec = (counter_1sec == (`CYCLES_1SEC -1);

ただ、defineをやめて
assign period_1sec = (counter_1sec == (48000000);
と書くとちゃんと動きます。
assign period_1sec = (counter_1sec == (`CYCLES_1SEC);
でも大丈夫。

そこで「-1」になっていたところを念のため「-<スペース>1」に変えてみたら…動きました。

うーん、「-<スペース>1」は1減算として動くようです。

となると「-1」って、何?

…調べても出てこないので当面は放置、そのうち文法書でそれについての記述に出会うことだろう(遠い目

いやー…辛いわー(笑顔

2016年6月4日土曜日

ESP8266:I2S MP3 webradio streaming example(give up)


ESP-WROOM-02でI2Sを動かせないかと思ってググっていたら、上記記事がヒットしました。
Web StreamingがESP8266で出来る!

そりゃあやるしかありませんよね。残念ながら「現在は16bitのモノラル」だけど「サンプル・レートは96-320KBit MP3でテストしてうまくいってるっぽい」そうです。スゴいのか凄くないのかよくわかりませんw

なお、記事をよくみるとSPI RAMはSD_D0など見慣れないピンにつながっています。これ32pinのESPじゃないとダメですね。幸いなことにDACもSPI RAMもなしで動く、と書いてありますので、SPI RAMなしで行きます。ES9023も微妙に高かったので、同じように動作するはずのPCM5102ってのを買いました。ebayで1000円ぐらいでした。

上記リンクの通り配線しますが、ES9023ボードはライン出力なので別にアンプを用意する必要があります。
  • PCM5102(ES9023)ボード用電源(とりあえずUSBから取ります)
  • ブレッド‐ボードなど配線材料

数日間チャレンジしたのですが、動かすことができませんでした。最終的な原因はシリアルのコンフリクトだと思います。私は一旦ギブアップしますが、引き継いでくださる方のために記録を残しておきます。

■ダウンロード&ビルド■

このサンプルはfree-rtosで書かれています。ので、まだfree-rtosの環境がなければ、こちらをご参考にどぞ。

各種設定は mp3/user/playconfig.h で行うことができます。上から順番に見ていきます。

接続先のWIFI SSIDとパスワードをAP_NAMEとAP_PASSに設定します。

MP3_DECODERをダウンロードしたままの状態だとローカルのサーバからMP3をダウンロードする設定になっていますが、面倒なのでやめます。リストされているうちでは icecast.omroep.nl ってところだといい感じに接続できました。そのすぐ上の #if 0 を #if 1 に書き換えます。そして #if 1になっている 192.168.33.128 のところを #if 0 に書き換えます。ご自宅にラズパイなどでストリーミングサーバを立てている場合には、それを活かしてみましょう(動作を確認した後で)。

I2Sをつないでいるので DELTA_SIGMA_HACK をコメントアウトします。 PWM_HACK はそのままコメントアウトですね。

上記の通りSPI RAMは使わないのでFAKE_SPI_BUFFの行のコメントを外します。

ビルドはgithubに書いてあるとおり、コマンドラインで当該ディレクトリに移動してからmakeです。たぶん問題ないと思います。ツールが見つからない旨のエラーが出る場合にはパスを設定していあるか確認してください。make対象がないというエラーはディレクトリが違います。
 make COMPILE=gcc BOOT=none APP=0 SPI_SPEED=80 SPI_MODE=QIO SPI_SIZE=1024
エラーがでなければ、ESP-WROOM-02にダウンロードします。なお、元記事にも書いてありますが、コンパイル後に出る eagle.irom0text.bin---->0x40000 は間違っています。下記のように0XA0000から書き込みをしてください。USBシリアルとESP-WROOM-02をつないでPROGとRESETを一緒にGNDに落とし、RESETを先に離してからPROGを離し、ダウンロードモードにしておきます。Board1の場合には白ボタンと赤ボタンを一緒に押して先に赤ボタンを離してから白ボタンを離します。コマンドラインで
cd mp3
esptool.py --port /dev/tty.usbserial-AH016T8K --baud 115200 \
write_flash 0x00000 ../bin/eagle.flash.bin 0xA0000 ../bin/eagle.irom0text.bin

これでConnecting...以下の表示が出ればOKです。
Connecting...
Erasing flash...
Writing at 0x00009c00... (100 %)
Erasing flash...
Writing at 0x000df800... (100 %)
Leaving...
動作はあまり安定しておらず、起動してすぐにexception、数秒走ってはexceptionが出る…を繰り返して、Rxのランプが点灯しっぱなしになったらGPIO15とRxをオシロで見てみます。数MHzのパルスが出ていればひとまず動いてます。

…ここまでplayconfig.hを試行錯誤して数時間かかりました。

ただ、LR切り替え信号が出てません。この信号がDATAのスタート信号になっているので、これがでないとDAC動いてくれません。

ソースを見ると、Tx / RxをI2Sの信号に使っているのにSerialにprintfでメッセージを出しているのですが…これ問題ないのでしょうか? UART_SetBaudrateをコメントアウトして動作に影響しないようにprintfをコメントアウトしてみましたが、ダメでした。

うーん、あと一歩だと思うのですが…ここまで動かしてギブアップするのは残念です。ただ、I2Sの使い方についてはいい勉強になりました。Tx/RxはDMAでバッファを使えるんですね。当面使う見込みないけどもw

以上お目汚し、失礼しました。

2016年5月31日火曜日

BeMicro MAX10にNios IIを入れてLチカ(part 2:完結編)


はい、続きです。せいぜい2時間もあれば終わるだろうと思っていたNios II Lチカで4時間かかってしまいました。初心者ってしんどいわぁ。

■STEP3' コンフィグ書き込み■

前回、これだけ終わってませんでした。ここで初めてBeMicroをの電源を入れると、赤い電源LEDが点灯し、緑のLEDが2進カウンタとして動き始めます。懐かしなー。

と、TK-80時代を振り返るのは止めて、まずVirtualBoxでDevicesメニュー>USB> Altera USB-Blaster [1000] を選びます。次にQuartusのToolsメニューからProgrammerを選びます。もしHardware Setup...のとなりが「No Hardware」になっていたら、Hardware Setup...をクリックし、USB-Blasterを選びます(Currently selected hardware)。私は最初ここのところにUSB-Blasterが現れない→Device>USBのところにもない→もしかしてUbuntu対象外??と焦ったのですが、単にハブが落ちてたようでMacを再起動したら治りました。MacOS X El Capitainにしてからこういうことが多くてホント不便。本社新築する前にちゃんとしてくださいよお>Apple

…と余談はさておき、あとは記事通りです。

記事通り、書き込みが100%()Successfulになっても何も起こらなければ正常です。前回も書いたように、まだソフトウェアを書いてませんので。

■STEP4 Cプログラムを書き込む■


  1. Quartus IIからNios II EDSを起動
  2. ソフトウェア・テンプレートを利用する
    原因はわかりませんがうちのUbuntだとメニューバーがありませんw 左から二番目の下向きの三角にカーソルを合わせると「New」だと言ってますので、ここから「Nios II Application and BSP from Template」を選びます。
    SOPC Information File name:の「...」をクリックしてプロジェクトフォルダ下のmaxlab.sopcinfoを選びます。あとは記事通りでFinishまで。テンプレートはHelloWorldの下にあるHello World Smallなのでお間違えなく。
  3. C言語ソースの中身を加速度センサ制御用に書き換える
    雑誌にはソース掲載されていないので、ダウンロードしたものからのコピーです。
  4. 作成したソフトウェアをFPGAで実行する
    やっと こ こ ま で 来 た か って感じ。まぁreset_reset_nが無ければ大変なことは何一つなかったのですがw ここはまったく記事通り。
    …なのですが、私の場合、ここで一晩経過して電源を引っこ抜いているので、上のSTEP3'に戻ってコンフィグ書き込みを行い、それからソフトウェア書き込みを行いました。
    するとLEDがたくさん点灯するはずです(なんだよ「たくさん」ってのはよ)。BeMicroの向きを傾けていくと、真横にした辺りでパッと消え、背面になるにつれてピコピコとLEDが増えていくはずです。

    うごいた!

と、いうわけで、Nios IIが動きました。ソフト屋な私はつい「やった! これで何でもできる!!」という方向に安易に走りがちなのですが、旨いこと使いこなして行きたいと思います。はい。

とはいえ、なんにもフィードバックがないと辛いので、とりあえずは液晶でもつないでみますかね。

…そのうちに。

…マイコン駆動で。

2016年5月30日月曜日

BeMicro MAX10にNios IIを入れてLチカ(part 1:構成編)

トランジスタ技術2015年11月号 p61からの「第三章 [STEP2] コピペであっさり! 32ビット・コンピュータを作りこんで動かす」を試してみます。

前回マクニカさんの記事を参考にしたら、これが見事に「わかっている人向けの記事」だったので大いに悩んだのですが、今度は我が心の師匠・岩田利王氏の記事、きっと大丈夫です。でも、もしQurtusの操作についてわからないことがあれば、「FPGA電子工作スーパーキット」が参考になります。

ま、人の作ったもんだから何とかなるでしょ。

■と思ったら■

いきなり「前章で作成したmaxlabプロジェクトを開いて」と来ましたorz ということで、トラ技のダウンロードページから2015年11月号STEP1のプロジェクトをダウンロードして、Velilog下にあるmaxlabを適当な場所にコピーします。

Quartusを起動します。私のはQuartus Prime Lite 15.1.2です。

FileメニューのOpen Project...からmaxlabフォルダの中にあるmaxlab.pdfを開きます。ToolsメニューからQsysを選びます。

…と記事のまま書いてもブログにする意味がないので、以下は記事のわかりにくいところだけ説明します。

  1. Nios II プロセッサをシステムに追加する
  2. オンチップ・メモリをシステムに追加
  3. オンチップ・メモリのサイズを調整
  4. オンチップ・メモリの配線設定
    ちょっと悩みました。本には「マウスでクリックして繋ぐ」とありますが、どこをクリックしてもドラッグしても反応しません。クリックするのは「◯」のところです。例えば、 -<clk と ->clk1 を繋ぐ場合には、nios2_gen2_0のところにある ->clk の左にある「◯」と ->clk1 のところにある「◯」をクリックすると線が太くなって配線!となります。どうでもいいですが「はいせん!」とか書きたいですな(何がだ)。
  5. Nios IIがオンチップ・メモリから起動するように設定
    記事では「画面を閉じます」と書いてありますが、閉じるとこの後の辻褄があわなくなってしまうので閉じません。閉じるときにファイル名をnios2e.qsysにしていれば問題無いです。もし閉じてしまったら、またQuartusのToolsメニューからQsysを選びます。で、メモリベースアドレスの設定をするのですが、「図9のように」という本文の説明は大変わかりにくいです。配線図のところのonchip_memoryの下にあるs1の行の右に「BASE」という欄がありますので、ここをダブルクリックして記事にあるように「0x0001_0000」にしてみます。記事には0xついてないですが、付けます。
なお、記事はこれで「エラーが消えます」とあるのですが、「clk_0, clk_in_reset must be connected to a reset source」というエラーが残ってます。記事の図を見ても接続されていないですが、マクニカの記事だとつながっているのでつないで見たのですが、それだと最後の最後でコンパイルエラーがでます。


調査の結果わかったのは、Qsysでclk_0のckl_in_resetがexportされていないのが原因でした。clk_in_resetの行のExport欄をダブルクリックして表示が「reset」になるのを確認してください。こんな形になればOKです。雑誌の図だと「export」が隠れてて見えないんですよね…困ったもんだ。



■STEP2-2 Nios IIにI/Oを追加■

  1. 加速度センサとSPI通信するためのPIOを追加
    Qsysは開いたままです。1bitのoutputを3つと1bitのinputを1つ追加します。
  2. LED制御用PIOを追加
    width 8のoutputを1つ追加します。
  3. PIOの設定とそれぞれの接続設定をします。記事通りです。

■STEP3 FPGAに書き込む■

  1. Quartus IIで使うためのファイルを生成する
  2. Qsysで生成したファイルをQuartus IIに追加する
  3. MAX 10でNios II/eを使うための設定をする
  4. HDLソースとピン・アサインのファイルを更新
    QuartusのProject Navigator(右上の一覧)からmaxlabをダブルクリックするとmaxlab.vが表示されます。で、リスト1を打ち込みます。すぐお気づきかと思いますが、赤い文字だけが変更箇所ではないのでご注意を。あと「それらをアサインしましょう」はFileメニューからOpen Fileを選び、Files of typeをAll Filesにするとmaxlab.qsfが見えますので、開きます。もっと簡単な開き方ご存知の方、教えてくらさい。開くと雑誌リスト2の中身と大幅に違うものが出てくるのですが、set_global_assignmentは放置しておいて、set_location_assignmentを雑誌のリストと同じにしてみました。結果的にはそれでよかったみたい。
  5. コンパイルの後、FPGAにプログラムする
    ProcessingメニューからStart Compileを選びます。順調にいけば、0:errors, 22 warningsって感じで終わるはずです。

さて、あとはNios IIの上で走らせるソースをコンパイルしたりFPGAをコンフィグ(書き込みのこと)しなきゃいけないんですが、もう眠いっす。

続きは明日…無事動作しました。

2016年5月28日土曜日

生活感のあるリフロー


皿洗いと洗濯の合間にリフローしております。

最近になって、ようやくホットプレートリフローのコツがつかめてきたような気がします。基本に忠実たれ、と言いますが、やっぱり余熱は大事ですね。

最近の手順はこんな感じです。
  1. プロファイルを見ると150度で60-120秒と書いてあることが多いですが、ホットプレートの場合は熱が回りにくいので、何も入れず蓋をした状態で160度前後を数分間維持して全体の温度を上げておきます。
  2. ブツを入れて60-120秒余熱。その間、あまり温度はシビアに調整しなくても大丈夫ですが、あくまでも余熱なので150度を超えないようにしましょう。
  3. 蓋を開けて放射温度計でホットプレート面が240度を越えないように監視しながら、ハンダが十分に溶けこんだのを確認したらホットプレートのスイッチをオフ
  4. 命がけでウチワなどで扇いで温度を下げる
  5. 150度まで下がったらピンセットなどで取り出して冷ます。

余熱後〜ハンダが溶け込むまで30-45秒くらい、ウチワで150度まで冷ますのに2分ぐらいかかってしまいます。本当はもっと早く下げたいのですが…。

慣れてきたのでハンダの状態を見ればだいたい温度が推測できるんですが、それでもホットプレートの温度ムラや基板表面への熱伝達遅れなどがあるので、やっぱり放射温度計でのチェックは欠かせません。

ハンダペーストは最近また中国製のを使っています。シリンジ入のペーストと模型工作用注射針をebayから取り寄せました。作業時に十分室温に戻しておき、基板をしっかり余熱すれば特に問題ないようです。注射針は数種類の太さがセットになっているものが安いので、それを取り寄せて自分に合った太さをいろいろ試してみることをお勧めします。



ホットプレートは相変わらず山善(YAMAZEN) グリル鍋 1200W 容量2L(直径23 深さ5cm) ブラウン GN-1200(T) です。私が買った時は1445円でしたが、今は2500円に上ってますねぇ。

放射温度計は私のやつより測定範囲の広い新型(サインソニック 【-50~+380℃】 非接触式 赤外線放射温度計 SS300 電池付き! )が出てるなぁ…。

そういえばソフトチップピンセット はぜんぜん使っていません。先が太いというか分厚いので、せっかく乗せた他の部品にぶつかってしまうので。

ルーペは相変わらず安物を使っています。もうちょっと良いものが欲しいです。