2018年4月2日月曜日

M5Stack、ちゃんとPDM音が出ますね

命令を見るとtone系なので「あれ、せっかくのスピーカーなのにビープだけ?」って思ったんですが、回路図を見るとGPIO25がアンプ入力につながってます。

ってことで、下記の通り初期化して

void set_16k_16() {
  i2s_set_pin(I2S_NUM, NULL);
  i2s_config_t i2s_config;
  i2s_config.mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_TX | I2S_MODE_PDM);       // Only TX
  i2s_config.sample_rate = 16000;
  i2s_config.bits_per_sample = BITS_PER_SAMPLE;
  i2s_config.channel_format = I2S_CHANNEL_FMT_ONLY_RIGHT;                //right channels
  //  i2s_config.channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT;                //right left
  i2s_config.communication_format = I2S_COMM_FORMAT_PCM;
  i2s_config.dma_buf_count = 4;
  i2s_config.dma_buf_len =  1024;
  i2s_config.intr_alloc_flags = ESP_INTR_FLAG_LEVEL1;                    //Interrupt level 1
  i2s_driver_install(I2S_NUM, &i2s_config, 0, NULL);
}

これつかって PCMデータ(符号なし16ビット)を渡すと音声出ますね。

  i2s_write_bytes(I2S_NUM, (const char *)ching, sizeof(ching),   portMAX_DELAY);
  i2s_zero_dma_buffer(I2S_NUM);

2018年3月30日金曜日

ダンボールでないAIYケース


私は不器用なので、ダンボール製のAIYは見事に基板が斜めになってあちこちスキマがorz

これではちょっと家に置いておきにくい、ということで、またCAD頼みで工作しました。


makercase.comで設計してAdobe Illustratorで穴あけ指示を行い、Elecrowでカットしてもらいました。接着剤なしでぴったりと組み上がり、基板ももちろん水平です(笑)。

難点は分解がちょっと大変w

音出してみたらダンボールと違って結構良い音がでます。

【追記】取説

わりと好評だったのでスイッチサイエンスさんから売ってもらおうかと思っていたのですが、MakerCase作者の方とコンタクトが取れません。権利関係がわからないものを売るわけにはいかないので、販売予定はありません。ご了承ください。

以下は商品化のために書いていたマニュアルです。せっかく書いたので貼っておきます。

レーザーカットしたときのアクリルの匂いが凄いので荷物が届いたらまず窓を開けます。

中にはプチプチにくるまったアクリル板と2つのビニール袋とゴム足シートと品質管理/組立ライン用手袋が入ってます。

ビニール袋は白い柱みたいなのがM2.6のラズパイ固定用で底面から順番にネジ|アクリル板|10mmスペーサー|ラズパイ基板|12mmスペーサー|ワッシャー|ナットの順。もう一つ白いのはスピーカー用で外からネジ|ワッシャー|アクリル板|スピーカーフレーム|ワッシャー|ナットの順。

アクリル板から保護シート剥がす前に、底面のどのへんにゴム足を付けるかポンチかキリで印つけておくとずれないです。ラズパイ固定ネジ穴と干渉しないように気をつけること。

あとアクリル板同士をがっちり噛ませてしまうとほぼ外すのは無理(特に6面のうちの最後の2面)になるので、まずどの組み合わせになるのかをざっと並べてみておくこと。ラズパイのコネクタ穴は似通っているので注意。側面パネルは4種類とも違うけど、手前にスピーカーが来た場合、右がSD、左がEther+USB、奥がHDMIその他になります。地板の向きを側板に合わせます。天板はスピーカーの反対側にマイク。いずれも対称軸に注意。

このへんで手袋します。保護シートを剥がすには強めの荷造りテープを貼って剥がすか、目立たない隅っこを尖ったピンセットなどで剥がします。

まず底面の片面の保護シート剥がします(内側)。外側になるシートは全部剥がさずにラズパイ部分だけはがしておいて、ラズパイ取り付けます。向きに注意。ホコリに注意。キムワイプなどで拭いても静電気が強くなるだけなので、エアーブロワーなどで吹き飛ばします。

スピーカー、これは両面剥がして取り付けるほうが良いっすね。スピーカーがずれないように注意。ネジは対角線の位置から締めること。くれぐれもホコリに注意。

スイッチとマイク基板取り付け。マイク基板は3MのW-18という透明両面テープで貼るのがおすすめです。この手袋だとテープの接着面に触っても糸くず等があまり残らないので、素手で扱うよりも楽です。素手だと確実に指紋が付きますからね。

残りのアクリル板、内側の保護シートを剥がしつつ組み立てて行きます。はめるときには水平垂直を維持しながらまっすぐ押し込む方が入りやすいです。というか板が傾いていると入らないです。組み立てながら内側のホコリを取る。

最後の一枚を入れる前にちゃんとブートすること機能することなどを確かめましょう。ピンセット使えば外からSDカード出し入れできますが、配線ミスなどを直そうとしても閉めちゃってからまた開けるのはかなり難しいので。

最後の一枚をはめたら残る保護シートをはがします。ゴム足を貼ります。ゴム足は一度貼ると簡単には剥がれないので一発で確実に貼ります。

完成です。手袋はずして鑑賞して下さい。

ホコリはとにかくものすごく目立つのでご注意を。

2018年3月23日金曜日

Pmod MTDSに一言

MTDS Library Programmers's Reference Manualさん。

word形式なのは許す。

でも目次がないってどゆこと?

もしかしてwordで開くと目次出てきたりするんだろうか。

いずれにしても、もう一生Pmodは買わない。

2018年3月19日月曜日

超低価格大容量SPI Flash(ただし遅い)

【写真】予備を作ると壊れもせず一発で動く…私はそういう星の下に生まれた男だ。

W25Q32FVSSIGっていうチップを入手しました。SPI接続のフラッシュメモリです。

結論として、消去がやたら遅い(6秒程度)ので別タスクで消す等の処理は必要ですが、4MBのストレージが約50円しかも1.27mmピッチのSOICパッケージというのは扱いやすくて良いんじゃないでしょうか。

digi-keyなどでは生産中止品扱いなのですが、中国でセカンドかサードソースかコピー品が生産されているのでしょう。

■準備■

とりあえず使ってみる場合、「Arduino チップ名」か「ESP32 チップ名」でググってみると何かライブラリが出てきます。安心して配線しましょう。

SOIC、手元に変換基板がなかったので秋月のSOP8用で代用します。パターンが足の下に隠れてしまうので手ハンダではなくリフローしました。最近0.2mm間隔のチップを相手にしていたので、1.27mmなんて鼻歌です(表面張力のおかげですが)。

何度でも書きますが、自宅リフローにつかうクリームハンダはサンハヤトに限ります(笑)。これはハンダの粒子もきめ細かいですしパターン乗りもよく本当に扱いやすいです。フラックス活性が高いのかなんだか知りませんがボールなどが発生しにくいです。価格はわりと高いんですが、どうせ有効期限内に使い切れないので丁度いいのです(笑)。

Arduino IDEでESP32を選び、Library Managerで「SPIFlash」と入力するといくつかヒットしますが、とりあえずPrajwal Bhattaram氏作のSPIFlashを選びます。接続する前にESP32にFlashDiagnosticsを書き込んで起きましょう。ESP32への電源を切ってから以下の配線をします。

接続はESP32としては標準的なSPIの接続です。SOとSIはプルアップしていません。

ESP32W25Q32
IO051 CS
IO192 SO
3V33 WP
GND4 GND
IO235 SI
IO186 SCK
3V37 HLD
3V38 Vdd

■動かしてみて■

消去がものすごく遅いです。4MB消すのに6秒かかります。
Erase Chip: Data I/O test PASS Time: 5.967 s
Erase 64KB Block: Data I/O test PASS Time: 158.449 ms
Erase 32KB Block: Data I/O test PASS Time: 120.735 ms
Erase 4KB Sector: Data I/O test PASS Time: 91.357 ms

このチップ、こんなに安いんですが、100,000サイクルの消去が可能って書いてありますので、Wear Levelingは行われているみたいですね。小さい廉価品なのに大したもんだ。

【追記2018年9月5日】セクター(256bytes)で同一アドレスにひたすら消去・書き込み・読み出し…を繰り返す実験をしたら100万回越えてもエラー出ませんでした。約150万回で初めてエラーが出ました。テスト前にも相当使っていましたのでもうちょっと長いかもしれません。個体差もあるのでこの結果が保証されるというわけではありませんが、少なくとも仕様の10万回は問題ないと言えるでしょう【追記終わり】

読み書きはuSの単位なので普通に使えそうですが…Flashは消去してからでないと書き込みができない宿命なので、別タスクでメモリ消すとかリングバッファ的に管理して使う必要があります。あと、64KBずつ消すと10秒近くかかってしまいますが、一括消去だと6秒で終わるのも注目点ですね。まぁ「たかが二倍」とも言えますが。

アルゴリズムとしては1ブロック64KBとして状態を示すフラグを64個の配列にしておき、それぞれが使用中か消去済か消去要求か消去中か…を示すようにして、消去用タスクの中でループで状態を監視し、消去要求のブロックがあれば消去中に変更して消去を実行し、完了後消去済みに書き換えてから次のループ…という形でうまく動きました。タスクを使う場合は競合などに配慮する必要がありますが、この場合はタスクごとに変更可能な状態を制限しておくことで回避することができます。

使用したいブロックが消去済より少ない場合にはランダムにスキップしてやればある程度消耗度を分散させることもできます。使用中フラグは正の整数ということにして次のブロック番号を指すようにすれば簡単なシーケンシャルファイルを実装できます。

なお、Prajwal Bhattaram氏のライブラリはGNUなので、実際の装置に組み込む場合には注意が必要です。

私は例によって書き終わってからこれに気づいたので、自分で書き直しました。SPI Flashを扱うことのできるライブラリはいくつかあるんですが、みんなGNUなんですよね。幸い処理は比較的簡単です。

私が書いたやつは、そのうちお掃除したらApacheかなにかで公開します。

ESP32でI2Sから音を出す・その2

その1の方法だと再生が終わるまで帰ってきてくれないので、音が出ている最中に止めたり他の音に変更することができません。そのヘン改良したのがこちらです。

なおこちらはKickstarter製品で使ったコードの一部です。

setupではI2S関連の初期化と音を出力するためのタスクsound_loopを準備しています。

loopでは割り込み要素として加速度計を使っていて、3軸合成加速度が平均値(ほぼ重力)を一定以上越えたら音を出力するフラグsoundOnを立てます。

sound_loopではループをぐるぐる回って、大きな加速度を検知してsoundOnがonになったら音源番号iSoundを変更して再生位置iを初期化し、内側のループでi2s_push_sampleを使って1音ずつバッファにプッシュし、音を出力します。再生が終わるか、音源番号が変わったらループを抜けます。

内側のループにはウエイトを入れていないですが、DMAバッファがいっぱいになるとi2s_push_sampleで止まるので、大丈夫っぽいです(ポイかよ)。

まぁこんな感じで…。


2018年2月24日土曜日

NTT関連の電話料金を調べる

先日インターネット回線を取り替えたときに、我が家には数年間使われていないADSL回線があることが判明しました。

どうも元々のADSL回線を速いADSLに契約変更をした時に、古い契約が解除されていなかった模様。

解除するには電話番号 / 回線番号が必要だけど、クレジットカードの引き落としには「99月99日 NTT東日本(99月分) 9,999,999円」としか書いてない。電話番号はともかく昔使ってたインターネットの回線番号なんてわからんがな。

ってことで、ちょっとたらい回しになりましたが、なんとかわかりました。私は昔ちょっと会社をやっていましたが、その名義のままだったりかみさん名義の回線があったりで大騒ぎでした。

調べ方としては、まずNTTファイナンスに電話(0800-3330111:フリーダイヤル)して、本人確認などの後、クレジットカードの名義、カード番号、何月分の金額がいくらか、ということを伝えます。その場ですぐにはわからないので折り返し電話をもらいます。これで電話番号 / 回線番号を教えてもらえます。

次にNTT東日本に電話します(これもフリーダイヤル)。番号がわかれば簡単。本人確認と契約者名義(複数あるのでこれ?それともこっち?といくつか並べてもOK)と番号を伝えると、その回線の契約内容を教えてもらえます。これでようやく今使っていない回線が判明しました。完全に前のADSL担当のミスじゃねーかよ(苦笑)。

あとは、解約手続きです。何故かその回線の名義がツマだったので、ツマから連絡してもらいます。いやはや。

今回、116担当の方には本当にしっかりとサポートしていただきました。なんとか調べる方法がないか相談したところ、こういう方法があるということを教えてくださり、NTTファイナンスの担当さんに電話を直接転送して、結果として解決することができました。

…しかし、数年間数千円ずつ払いつづけてきた料金は戻ってこないんですよね。ざっと30万円ぐらいです。しくしく。

あと、電話だと本人確認の後で教えてもらえるのですが、私は聴覚障害者で電話できず、Webで調べたりしたものの文書のやり取りが必要で遅々として進みませんでした。しかし、iPhoneとBluetoothと接続可能な補聴器Widex Beyondを使ったので、普通の人と同じように電話できるようになり、数時間で解決できました。私は補聴器なしだと「いち」と「はち」、「さん」と「よん」を聞き分けできないレベルの感音障害なので、この補聴器なしだと例えば電話番号を教えてもらうのに一桁ごとに「えー? 2ですか? ツー?」てな落語のようなやり取りをしなければいけないんですが、先方がプロの電話仕事人ということもあってか、実にスムーズに会話できました。

補聴器変えた直後は耳に合わずに苦労したのですが、周波数特性などを念入れに調整していただいたおかげでここまで便利になりました。補聴器の調整にご尽力くださった眼鏡市場吉祥寺店の店長さん、心よりお礼申し上げます。

PmodMTDSループ



ちょっとマルチタッチ液晶ディスプレイでデモを作りたくて、PmodMTDSを物色

→事前にArduinoのサンプルがビルド通ることを確認。ソースを見ても他CPUへの移植はそんなに難しくなさそうだなと判断して注文

買ったのはShield版ではないですがArduino unoで動きました。

デモを動かすには別途microSDカードが必要です。

配布されているFAT32でフォーマットしたSDカードにダウンロードしたArduino版ツールを解凍するとDocumentation, Libraries, Resources, Sketchesフォルダがあります。

Resources下にある2つのフォルダごと画像をコピーしてmicroSDのルートにコピーして、MTDSにセットします。

もしArduino IDEが起動していたら終了し、Arduinoのlibraryフォルダの下にMTDSというフォルダを作り、その中にLibraries下の2つのフォルダの中身をコピーします。

Sketches下の.pdeを.inoにrenameしてダブルクリックすればArduino IDEが起動します。念のためですが、結線前のArduino unoにコードをダウンロードしておいてから結線します。

MyDispDemo1は表示だけ、2は読み込み後☆をタップすると画像が変わる、3は待ち時間wheelを表示した後でボタンをタップすると画像が変わる。3にはチェックボックスっぽいボタンが表示されているのでいろいろ期待しちゃうんだけど、ただのデモみたいっすね。

あmicroSD上の画像の処理はぜんぶPmodMTDS上で行われます。でも画像の書き換えは遅いですね。書き換えているところが目に見えます。MTDS上のCPUはPIC32なのでそんなに遅くないはずなんですが。

あとでArduinoより速いCPUでも試してみようと思ってRaspberry pi用のPmodHATも注文してしまったんですが、無駄になっちゃいましたね…。

以下はPmodMTDSとArduino unoとの結線図。

PmodMTDSArduino uno
P1 : ~CSdigital 10
P2 : MOSIICSP4 : MOSI
P3 : MISOICSP1 : MISO
P4 : SCLKICSP3 : SCK
P5 : GNDGND
P6 : VCC3V3
(下段 : NC)


2018年2月10日土曜日

ArduinoでSG90をゆっくり滑らかに動かしたい(失敗)



サーボSG90を20度/秒ぐらいで滑らかに動かしたいと思ったのですが、どうも難しいです。割り箸をホットボンドで接着するといういかにも共振したりハンチング起こしそうな条件ではありますが。

試行錯誤としては、
  • Arduino標準のServoライブラリのexample
  • 同じく、値を変えるごとにdetachしてdelayし再度attach
  • ESP32のLEDCを使って15bit PWM
  • ESP32 / Arduino unoでdelayMicrosecondsを使って正確なパルスを出す
などを試みたのですが、いずれも動画のようなブルブルっぷりでした。強いて言えばLEDCを使ったものが一番良かったですが、やっぱり震えます。今回使ったのはSG90のパチ品です。本物あるいはもっと高価なサーボを使えば滑らかに動いてくれるのでしょうか?

うーむ。

一応LEDC版のソースです。delayは「次のPWMパルスが出そうなところでledcWrite命令を出すとパルス列がコケるのではないか?」ということで一つだけ出るようなタイミングにしてみたりPWM周期を変えてみたりしましたが特に大きな変動は見られません。

こっちはdelayMicroseconds版。

2018年2月5日月曜日

Arduino nanoで肩こり対策デバイス・その2


■原理■

同僚さんから、「肩こりがひどいので電子工作で何かできないか」というご相談をいただいて作ってみたシリーズ第二弾です。第一弾は首肩の傾斜で振動するパターンでした。

今度は「ふと気がつくとモニタに近づきすぎている。近づいたら警告を」というデバイスです。モニタの上端に貼り付けて使います。

距離計測は超音波とToFを試してみたのですが、超音波は人間の顔だとあまりうまいこと検出できず、手持ちのToFは計測レンジが微妙に遠くてNG。シャープの赤外線距離測定デバイスを使うことにしました。

■製作■

Arduino nanoのパチを使いました。

距離センサー

表示にはNeoPixels / WS2812b的なLED

回路は、それぞれのGND同士をつなぎ、ArduinoのVinとセンサーとNeoPixelsの電源同士をつなぎます。距離センサーは最大約2.8vのアナログ出力なのでアナログ入力A0、ArduinoのA1とNeoPixelsのDinをつなぎます。

今回、0.19mmのエナメル線で配線しました。ワイヤリングペンも作ったので、GND-GND-GNDとつながるような場所が大変楽です…と言いたいところですが、所要時間的には架橋ポリエチレン被覆線とあんまり変わらなかったです。



ワイヤリングペン、シャープペンに通すのに例によって30cmほどに切ったワイヤを先端から差し込んで後ろの本体と接合して引っ張り出す作戦を取りました。が、前回は0.3mmだったので突き合わせでハンダ付けできたのですが、今度は0.19mm、さすがに細くて無理だったので、瞬間接着剤使いました。この時期は空気が乾燥しすぎていてなかなか固まらないので困ったもんです。今度、接着促進剤ってのを使ってみたい。

見た目は悪いけど使い勝手は良いですw


■プログラム■

起動したら、5秒間距離を計測して平均値を取ります。これが基準値で、これより近づいたら=値が大きくなったらLEDを点灯させます。

loop()ではanalogReadからの値を簡易的な移動平均処理で測定誤差をツブして無駄なチラツキを減らしています。距離センサーからの値は最大で500ぐらいなので、上記の平均値と500との中間点までは黄色、それを越えて近づいたら赤で点灯するようにしました。


2018年1月31日水曜日

補聴器の医療費控除

■補聴器代金を医療費控除する■

わりと著名なサイトに「処方箋が必要」と書かれていたので耳鼻科でそうお願いしたところ「処方箋なんて無いですよw」と言われました。

改めて、武蔵野税務署の窓口で相談してみたところ、まず、医師で聴力検査を受けた上で診断書(仕事をする上で必要なので、重度・高度難聴用の補聴器を購入する必要がある云々)を書いてもらい、その上で補聴器を購入し、他の医療費と一緒に医療費明細書(平成30年から医療費の領収書は不要になりました)に記載して、翌年の確定申告で申告する、とのことでした。

ついでに補装具費支給制度での支給を受ける場合、通常は片側のみ(1個のみ)についての支給なのですが、両耳装着によって言語明瞭度が上がるなど計測結果を添付するか、仕事の都合上両耳装着でないと業務に支障をきたす、等の事情がないと認められません(1個分のみの支給となります)。私はまだ現役の技術者であり、会議で聞き違いなどのリスクを避けるために少しでも明瞭な聞こえが必要なこと、取引先などと打ち合わせをする際に片耳だけ補聴器を装着して身体を斜めに突き出して聞き返すような形になるのは失礼なので両耳に装着する必要があること、などを記載して申請しました。

判定の結果がどうなるかはわかりませんが(追記:両耳装用が必要と認定されました)。

いずれの場合にも自治体により運用が異なる場合がありますので、医療費控除については税務署の相談窓口、補装具費支給制度については自治体の障害者福祉課などに、まず相談しましょう。

そして、医療費控除では診断書、補装具費支給制度についても医師により意見書(用紙は自治体の窓口で)が必要です。診断書と意見書が必要である胸を指定耳鼻科の窓口で伝えて診察と聴力検査を受けて、交付してもらいましょう。私の行った耳鼻科では診察1,900円、意見書と診断書がそれぞれ2,000円でした。

以上ご参考になれば幸いです。