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 電池付き! )が出てるなぁ…。

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

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

2016年5月27日金曜日

Arduino空気質センサー+OLED



3年ぐらい前に作ったArduinoニオイセンサーの記事が未だにアクセスが多い。ありがたいことです。

でも、あっちの記事で使っているTGS2450は、いろいろタイミング制御やら電圧制限やらが厳しくて、気楽に使えません。

ので、先日ESP-WROOM-02でも使った空気質センサーを使って、作りなおしてみました。

なお、上の写真でグラフが急上昇しているのは、地味なので消臭スプレーを噴射してみたところです。人間の感じるいい匂いと空気質が必ずしも一致しない、という図です。でも、私が「ハー」ってやると確実に上昇します。ちなみに冬の早朝、部屋の空気を入れ替えた状態が一番低い値を示していました。

■使用部品■

Arduino nano(他のArduinoや互換機でも問題ないはず), 空気質センサー, OLED 0.96インチです。なお、安いところで買うと詳しい説明書いてないのですが、ピンの配列や対応する電源電圧などが異なる場合がありますので、十分ご注意ください。

なお、配線のためにミニブレッドボードとメス-オスのジャンプワイヤを使いました。

■配線■

Arduino nano/unoAirQuality Sensor0.96インチ OLED
A0AO(Analog out)
5VVCC
GNDGNDGND
A4SDA
A5SCK(SCL)
3v3VDD


■プログラム■

ESP-WROOM-02の記事では別のライブラリを使っていますが、ここではAdafruitさんのライブラリを使ってみました。大きなフォントが今ひとつなんですが、グラフィックスの命令が豊富なのでこのあとグラフ化も簡単でした。

コードのほとんどはOLEDへの表示です。

AirQualityセンサーからの値はアナログ値なのでanalogReadで読みます。読んだ値は64桁のバッファに格納して、これを用いてグラフを描画しています。

ソフト屋としては、「単純バッファで毎回シフトw」「グラフの描画で座標を二重に計算ww」など、ちょっと恥ずかしいのですが、わかりやすさを優先しました(真顔

あと、ドットを描画する命令がわからなかったので、drawLineで同じ座標を指定してます。ドキュメント読めば書いてあると思うんだけどw


2016年5月26日木曜日

FPGA評価モジュール:BeMicro到着


基板を手に持つとずっしり重いです。多層基板でベタGND / ベタVccがあるから?ってことだけじゃないと思うけど、とにかく存在感のある基板っす。

FPGAを使ってみたいと思ったのは、高速性とか自由度などいろいろ理由はあるんですが、GPIOが多いというのが大きいです。

このBeMicro MAX10でもコネクタに出ているだけで
  • 2x40pinのピンヘッダ
  • 80ピンカードエッジ
  • 2個の2x6pin

…こんなにあります。もううんざりするレベル。

ピン番号が横に長いExcelのセル番号みたいになってますww

LPC1114で8x8マトリクスのLED駆動してI2Cつなぐと残りが足りないわー…

MSP430G2552で4桁の7セグLEDをドライブするともうI2Cしか繋げないわー…

とか言ってた人生がイヤになります(もちろんMSP430の超低消費電力はこのFPGAが太刀打ちできる世界じゃないですし、そういう人生好きですけどね)。

さらにGPIOが多いだけでなく、標準の状態で以下のようなデバイスが付いているので、USBつなぐだけである程度のことができてしまいます。

  • 8MB RAM
  • ADC
  • 温度センサー
  • 3軸加速度センサー(ADXL362)
  • CDS
  • LED 8個
  • スイッチ2個
  • オンボードプログラマ(USB Blaster)

これで4000円(chip1stop.com…入手先によって値段は違います)。もちろん難しいんですけど、マニュアルの通りにCPU(Nios II / e)を作りこんで、多少必要な回路をその周囲に貼り付けるぐらいであれば、mbedを扱える人ならそんなにハードル高くないと思います。

この基板にはついてませんが、個人的にFPGAで何とかしたいブツとして「CMOSカメラの接続」っていうテーマがあります。ずっと前にaitendoで1.3MのCMOSカメラを「安い!」って飛びついて買ったんですが、Arduinoや下位のmbedでは簡単に御せる世界ではありません(mbed LPC-4088で制御した作例は見たことありますが)。でもMAX10ならCMOSカメラからの出力が16ピンもあってμ秒単位でいろいろ処理しなきゃならなくても、ぜんぜん余裕な世界です。

…もちろん、使いこなせれば…の話ですけどね。

パッケージ

中身
がんばります!

2016年5月25日水曜日

Chip1Stopさんからお荷物届いた

長さ1mぐらいある細長い箱。

開けるとBeMicroその他の入った袋と、レールが1本。あれ?今回レールに入れるほどIC頼んだっけなぁ…と思ったら、8pin DIPが2個入っていました。


Amazonの過剰包装にも驚くけど、これはびっくり。

こういう小口相手の商売じゃないんだろうなー。ゴメンナサイ。

2016年5月23日月曜日

FPGA学習で頭を抱える

ビールと棒々鶏とFPGA

トランジスタ技術2015年11号 p113に、16ビットのカウンタを2個使って32ビットのカウンタを構成する際の下位から上位へのキャリーの処理が以下のように記述されていまして。

CNT(15 downto 0) <= CNT(15 downto 0) + 1;
if (CNT(15 downto 0) = x"FFFE") then
  CARRY <= '1';
else
  CARRY <= '0';
end if;

これが"FFFF"との比較じゃなくて"FFFE"との比較で正しく動作する、というのがどうにも理解できなくて頭を抱えていました。記事には
・CNTとx”FFFE"を比較してCARRYを立てる回路
・CNTを+1する回路
は同時に実行されるので、これでうまく動くのです。
と説明されているのですが、少しデジタル回路をいじった経験からすれば、「下位のカウンタがFFFFから0000になるときにキャリーが1になるべき」で、いくらFPGAがソフトと違って同時に処理されるものだとしても、「今」の値がFFFFの時に「次」のキャリーの値が1になるんではないかなーという違和感が消えません。

そこで、いろいろキャリーの処理について調べてみました。結果、言語と構成は違いますが、以下の記事にこうなった原因と正しいやり方が出ていました。

触って学ぼう FPGA開発入門(6): 順序回路と組み合わせ回路を意識した記述を! (2/4)

トラ技の記事はキャリーの処理を順序回路の中に組み込んでしまったためにキャリー出力がラッチされてしまい、それを補うために1つ手前の値"FFFE"で比較してやらないといけない、ということのようです。

上の「触って学ぼう」の記事では回路図になっているので一目瞭然なのですが、トラ技の説明からはまったく理解できませんでした。というか「同時に処理されるので云々」というトラ技の説明は現象と結びつかない気がします。

いやー、ソフトウェアと違いますね。当たり前だけど。自慢じゃないけど、この落とし穴に何度も落ちる自信あります、私orz

2016年5月18日水曜日

作った基板が動作しない:切り分け編



トラブルには切り分けが大事です。

ESP-WROOM-02が起動しない原因は大きく分けて以下の3つに分類できます。
  • 部品の初期不良または製作時の破損
  • 基板設計がダメ
  • 製作上の問題

前回はESPを交換してみましたが、やっぱりダメでした。

とりあえずESP部分とは別にアナログの動作を確認するためパターンをカットし、別のESPからの信号を直結してみたところ、問題なく動作しました。アナログ回路については特に新しい要素を入れてないので、当たり前といえば当たり前ですが。

また、アナログ部分を切り離した状態でESPを起動してみましたが、やはりboot mode (5, 7)として認識されています。あきまへん。

そして、恐ろしいことに、同様にboot mode (5, 7)を返してきて、ヒーティングガンによって吹き飛ばされた最初のESPを別の基板にリフローしてみたところ、なんの問題もなく動いてしまいました。

部品に起因する問題ではない、ということはほぼ確定しました。

■今回の検証■

ESP部分の基板設計がダメなのかを検証します。ESPとその周辺のプルアップ抵抗やパスコンだけをリフローして起動するかどうか確認します。

…装置の検証としてはあんまり意味ないんですけどね。でも、とりあえず、「ESP部分は動く」ってのを確認しておきたかったもんで。

結果として、動作しました。

…もう何が何だか…orz

真っ先に思い当たるのは前回はESPのIO15あたりのハンダ付けがダメだったってことなのですが、これは端子での電圧を確認してますので、問題ないはずです。

わかってしまえばきっと物凄くくだらない原因なんだろうなーと思うんですが…今のところは no idea です。とほほ。

2016年5月15日日曜日

Arduino+ADXL345で地震酔い対策


■地震酔いとは■

東日本大震災では東京はいくつかの施設を除いては被害を免れました。でも、頻繁に震度3-4の揺れを経験していると、そのうちふと揺れを感じているかのような錯覚を覚えることがあります。本当に揺れているのか錯覚なのかわからないんですよね。

これが地震酔いです。熊本では高頻度で強い揺れが続いているので、地震酔いの症状でお困りの方もおられるのではないかと思います。

ということで、Arduinoで「揺れたら点灯」なデバイスを作ってみました。机の上に置いて、「あれ?地震?」と感じた時に点灯していなければそれは気のせい、という感じに動いてくれればいいのですが(作ってから東京で大きな地震がないので未検証です)。

周波数成分ごとに色を変えたのですが、手に持っているとどんなに心を鎮めても赤(ゆっくりした揺れ)が消えてくれません。

アル中検出器を造ってしまったのかもしれません。

なお、「酔い」と言っても色々あります。上記のように「揺れているように感じる」程度なら、物理的に揺れていないことを確認することが一種の認知療法的な効果につながると思いますが、「常時揺れているように感じて気持ちが悪い」という状態であれば、内耳に作用するタイプの乗り物酔い止めが有効です。こういう症状では「どこの医者にかかって良いかわからない」と思うんですが、メマイや酔いなどについては耳鼻咽喉科に相談してみるのがよろしいです。3.11の時、かなり深刻な症状を訴える同僚もいましたが、でも今はみんなすっきり治っています。不快な症状を我慢しないで、医師に相談しましょう。

■ハード■

Arduino nano+加速度センサーADXL345+マイコン内蔵LED WS2811です。以前、「キーボードを強く叩き過ぎたら、警告する」ってのを作りましたが、その流用です。

Arduino接続先
3.3v出力ブレッドボードの+ライン
GNDブレッドボードの-ライン
5v出力マイコン内蔵LEDのVdd
D2マイコン内蔵LEDのDin
A4ADXL345のSCL
A5ADXL345のSDA


ADXL345接続先
SCLArduino A4
SDAArduino A5
SDOGND
CS3.3v
Vs3.3v
GNDGND
Vdd3.3v

■ソフト■

加速度センサーから読み取った値を3軸分合成してからFFTにかけて、ノイズ分を除外した値が一定値を超えたら帯域ごとのパワーにわけてRGB LEDを点灯します。

当初割り込みを使って連続的に計測するプログラムを書いたのですが、インタラプト処理ルーチンでI2Cを読んだ瞬間にフリーズする、という現象を解決できなかったので、諦めて単純な逐次処理にしました。ただ整数処理のFFTを使っているので、計測漏れはそれほど大きくないです。

ADXL345に限らず3軸加速度センサーには重力加速度が常時計測されます。ので、その影響を取り除く必要があります。また、体感する揺れは三軸の合成ベクトルなので、三軸分のスカラー値を求めて、そこから重力加速度分を引き、感度を高めるためにちょっと掛け算してます。read345というルーチンでは、その後、ムダなdual buffer処理をしていますが、これは最初に書いたように当初割り込みで処理しようとしていた名残です。書き換えるの面倒なのでそのままにしています。

ノイズ処理は単に「静かにしていてもFFTからの出力が0-2程度出ているので、2以下はノイズとしてカット。それを超えた分だけ集計して、集計値が一定値を超えたら、有効と判定」というごく単純な処理です。

FFTには整数型FFTを使いました(Topic: Modified 8bit FFT in c)。ありがとうございます。ただ、開発されてから時間が経っているので、いくつか修正が必要です。まず、include文で「WProgram.h」となっている箇所は「Arduino.h」に置換します。また、データタイプの定義が変わっているので、fix_fft.cppの頭の方に
#ifndef prog_int8_t
#define prog_int8_t int8_t
#endif
を貼っておいてください。

ADXL345のライブラリはAdafruitの新しいunifiedライブラリ版を使いましたが、unifiedなインタフェース(センサーが違っても、重力加速度としての値域に変換して返すなど、センサーごとの差異をわりといい感じに吸収してくれるライブラリ群)は使わずgetX, Y, Zで取ってます。FFTが整数ですし。

WS2811は特に問題ないと思います。


■感謝■

FIX_FFTの作者の方、およびADXL345/WS2811ライブラリを公開してくださったAdafruitに感謝申し上げます。ありがとうございました。