2017年8月9日水曜日

amazonのISBNなURL

 本のISBNからタイトルが欲しいのだけど、いい感じのAPIが見つからない。ISBNで検索できるサイトは掃いて捨てるほど有るけど、ISBNで直リンクになるようなところが無い。

 しかし、どうやらamazonがISBNで商品ページにリンクを作れるらしい、ということでやってみた。
 https://www.amazon.co.jp/dp/487783219X みたいなURLでいけるらしい。ただし、ISBN10限定であり、ISBN13では404になってしまう。
 ISBN10とISBN13は相互に変換が可能らしく、頭の978の有無でISBN10かISBN13かが決まるらしい。ただしチェックデジットは有効だから、ISBN13でamazonリンクを作るにはチェックデジットを再計算する必要がある。ということで、勝手にやってくれるJavaScriptコードを書いてみた。

 下のテキストボックスにISBN10/ISBN13を入れればamazonのリンクを作ってくれる。チェックデジットは評価されるから、入力ミスをするとエラーになる。ただし9文字/12文字の場合は入力値の正しさは気にせず、入力された値からチェックデジットを生成してくれる。間違いなく入力できるなら、チェックデジットを省いてもURLを作れる。
 例のごとく、ちゃんと動作確認してないから、動かなかったらごめんね。

 amazonのリンク、ISBN13やJANでも開けるようになったらすっげー便利だと思うんだが。。。

ISBN:

2017年8月8日火曜日

SDカードアダプタ

 ZEROPLUSのSDカードアダプタを買ってみた。今回買ったのはSDカード用とmicroSDカード用の2種類。

 ZEROPLUS SDカードアダプタ - ネット販売
 ZEROPLUS マイクロSDカードアダプタ - ネット販売

 ZEROPLUSは言わずと知れたロジックアナライザのメーカー。
 近年ではいくつかのロジックアナライザがホビー向けとして投入されているが、やはりZEROPLUSは一日の長があると思う。特に最近では各種プロトコルすべてが無料公開されており、デジタルバスを見るには必需品と化している。

 話を戻して。

 SDカードアダプタというのは商品画像を見ればわかると思うが、SDカードソケットとSDカードの間にピンヘッダを生やすための基板。
 基板の途中にピンをはんだ付けしてもいいが、ちょっと気軽じゃない。あらかじめロジックアナライザ用のピンヘッダを用意しておくのも手だが、後からは使わないのは確実だし、何より面積取って邪魔。
 その点、カードアダプタを使えば気軽にロジックアナライザを挿入することができる。

 microSDカードアダプタの方は、商品説明に挿入しづらいと書いてあるが、僕が買ったものは基板がt0.7mmくらいと、microSDカードとほぼ同程度の厚さになっており、特に挿抜で引っかかるということは感じなかった。


 SDカードアダプタは8bitアクセス対応で、ちゃんと等長配線されている。microSDカードアダプタの方は大きさが小さいせいか、パターンは直線で構成されていた。その代わりmicroSDの方はダンピング抵抗が実装されている。SDカードの方はパターンは有るが、抵抗は未実装。ソルダブリッジすらないので、ダンピング抵抗とは全く別の用途なのかも。あとSDカードの方はパスコンや電源ランプがついている。

 カードアダプタのデメリットとして、単体ではCDやWPを監視できないという点が有る。WPは正直どうでもいいが、CDはカード挿入を検出して自動的に初期化するようなコードを作る場合に、タイミングを予想するのが難しいかも。
 逆に、アダプタのVDDをロジアナで監視し、SDカードに給電されてからどれくらいの時間で初期化が始まるか、といったことは見れるかも。

 それにしても、マイコンから15cmでSDカードソケット基板へ、そこからアダプタで延長し、さらに15cmのワイヤを通ってロジアナへ。ノイズ対策もへったくれもないな。まぁ現在のところSPIは328kbpsくらいの速度なので気にするまでもないという感じだけど。

 気軽にSDカードのロジックを覗けるようになると、FATアクセス全体を見たくなってくる。でもメモリ128kモデルを持ってしても全くメモリが足りない。この上となると、最上位の32ch2Mモデルになるのか。お値段20万円。ZEROPLUSの計略恐るべし。

2017年8月7日月曜日

Speed Wi-Fi HOME L01を買った

 ここ数年、plalaの「ぷららモバイルLTE」というモバイル回線をメインで使っていたのだが、11月末でサービス終了とのことなので、代替サービスを探す必要に迫られた。
 僕は月50-100GBくらいの帯域を使っているようなので、よくあるモバイル回線は使用不可能のため、とりあえず今のところ大きな制限のないUQ WiMAXのUQ Flatツープラスギガ放題(3年)を契約してみた。このプランは月々の容量に対する制限はないが、直近3日に10GBという制限がある。日3GB程度までなので月90GBくらいまで。全く足りないというほどではないが、十分というほどでもない。いままでの回線でかなり制限されて月60GBとかなので、制限無しで使ったらどうなることやら。
 
 まず地域的な話をすると、僕が住んでいる上富良野町は約1万人程度が住んでいる町で、人口密集地では光回線が使えるらしい。しかし僕が住んでいるところは数百mで町境という過疎地域で、固定回線はISDNしか使えない。昔は国の政策によりADSLを敷設していたらしいが、だいぶ前に回線は撤去されている。

 本当はぷららモバイルが終了する直前くらいにUQ WiMAXを契約するつもりだったが、日に日に回線品質が悪化しているのが体感できてしまうので、慌ててUQ WiMAXを契約したという次第。なんで日に日に悪化するか、というのはぷららモバイルが鳴り物入りで始まった頃のネット記事に書いてあるのでそちらを参照のこと。

 で、回線はUQ WiMAXを使うとして、モバイルルータを何にするか、という問題がある。
 ネットの評価を見ると、「固定型は持ち運べないし、可搬型とくらべて性能がいいわけでもないし、可搬型一択」みたいな評価が多い。が、今回は強い意志を持って固定型のSpeed Wi-Fi HOME L01というモデルを購入した。
 理由は、今まで使ってきたモバイルルータはことごとくバッテリーが膨らんで使い物にならなくなったため。基本的に常にUSBで給電して使っているが、本来のモバイルルータの想定としてこういう使い方はされていないから、浅いとは言え常に充放電が繰り返されている状態となり、バッテリー寿命をどんどん削っていくらしい。
 ということで、電池内蔵モデルを除外して、固定型を選択した。
 可搬型は電池が入ってるから停電しても使える、という利点は魅力的だが、そもそも停電時はデスクトップPCが使えないから本格的な作業はできないし、数日間とかそういうレベルで停電するのが確実ならカーバッテリーからDCACコンバータを使えばいいし、みたいな割り切り方をしてる。
 経験的にこの地域では落雷によって数分間停電するということは有るが、それ以上に長時間停電することは無いから、停電時の想定をする必用はない、という見込みも有る。

 ということで、HOME L01の話。
 買う前は円筒形という外見から、ゴミ箱MacProくらいの大きさをイメージしていた。が、届いてみるとかなり小さかった。太さはそれなりにあるが、高さは500mlのペットボトルより少し低いくらい。


 保護色で見づらくて申し訳ない。心の目で見てください。
 LEDは計6個あり、稼動状態や受信強度の表示がされる。上3個が受信強度で、1/3だからだいぶ環境が悪い。
 LEDがかなり明るい気がしたので、気休め程度にカプトンテープで輝度を落としてある。

 設置作業はかなり簡単。コンセントを刺してLANケーブルをつなぐだけ。電池の容量とか、電源スイッチとか、一切気にする必要がない。
 ただデフォルトのIPアドレスが192.168.100.1/255.255.255.0で、DHCPが100-200なので、いままで使ってたルータとはちょっと違う。そのため、明示的にDHCP再割当てを行わないと通信できない。
 Winならネットワークアダプタを無効化、有効化することで再割り当てが行われる。RasPiはピンヘッダにTTL232を接続して固定IPのコンフィグを書き換えてから再起動を行った。残るはHDDレコーダだが、コイツはどうやったら再割り当てされるのか不明。まぁ数日ほっとけば自動再割当てされるかなーと思っているが、どうなることやら。たぶんネット接続がないので自動録画とかができないので、早いとこ解決しておく必要があるが。
 HOME L01のIPアドレスにブラウザからアクセスするとステータスや設定を表示できるが、内臓のWebサーバーはかなり応答が遅く、表示するのに時間がかかったり、表示途中で切断されたりする。ただ、ファームウェアのアップデートを行えば改善するかも(届いてから未アップデート)。

 まだ届いて数時間しか経っていないのだが、ぷららモバイルとくらべてかなり快適になったと実感できる。
 ぷららモバイルは朝の通勤・通学時間帯、昼休みの時間帯、そして夕方から深夜にかけての時間帯はHTMLの読み込みも危ういほどに回線が遅かった。なのでこの時間帯はほぼネットが使えない状況だった。
 しかしUQ WiMAXでは、今の時間(23時頃)でもほぼストレス無くニコ動をストリーミングできる。もちろんyoutubeも。今まではこの時間HTMLが読めるか読めないかくらいに遅かったから、雲泥の差と言える。
 ちょっと大げさな言い方をすると、インターネットが遅いと世界から拒絶されてるような気分になるが、逆にインターネットが快適だと、世界中とつながっていられるような気になる。精神安定的にインターネットの快適さはかなり重要な要素だと思う。昨日までは世間の動きを考慮するのが当然だったが、そういうのが気にならないというのはすごく安心感が有る。
 まだ使い始めて数時間だが、既に3GBほど通信しているらしい。かなり久しぶりにニコ動をBGVにしてるから、それが効いてるかな。この調子で使い続けるとあっという間に帯域制限されそうだが、まぁしばらくすれば落ち着くでしょう。

追記:2017/08/08
 DIGA(DMR-BRW1000)のDHCP再割当ては、スタートボタンから左に入ってネットワーク関係の初期設定を開き、IPアドレスを手動に設定してから戻り、再びIPアドレスの設定を開いて自動を設定して戻る。この際、手動に設定した際に、IPアドレス等は打ち込まなくても良い。これでDHCP再割当てが行われる。注意点として、IPアドレス設定画面で手動・自動を切り替えただけでは再割当ては行われない。手動に設定してからIPアドレス設定画面を閉じる事により、DHCP割当されたアドレスを開放するような挙動。

 あとPCからRasPiにPINGは通るのに、インターネットにつながらない(PINGが通らない)という問題にだいぶ手間取った。症状からしてDNSだろうとあたりは付けてたが、コンフィグファイルにDNSを明示しても反映されない。ゲートウェイのIPを指定したり、オンラインのDNSを指定してもダメ。
 結局、別の設定ファイルに書いてあった旧ネットワークの設定が優先されていた、というオチだった。何年も前に設定したヤツだから、どこに設定したかなんて覚えちゃいない。「別のファイルにDNSの設定書いてみるか~」という軽い気持ちで開いたら、たまたまそれに古い設定が書いてあって判明した、という次第。

追記:2017/08/12
 数日に1回程度の頻度で、インターネットの接続ができなくなる不具合がある。HOME Wi-Fiのコンフィグ画面とかは開けるけど、ルーターの向こうへパケットが通らない感じ。ローカルのPINGは通るけど、オンラインのサーバーへはPINGは通らず、IPアドレスを指定したPINGも通らない。
 解決策としては、とりあえずHOME Wi-Fiのコンフィグ画面で再起動を行うくらいしかできない。それでも数回再起動しても復旧しないことがあり、その場合は電源を抜挿しての強制再起動しかない。さすがに電源を落としてしまえばどうにかなる。
 まだHOME Wi-Fi L01は発売から半年足らずで、バグはいろいろありそう。
 現在のバージョンは11.191.01.00.824で、これが最新らしい。それにしてもなんというバージョンナンバーだ。

 当初の予想通りというか、やはり10GB/3dayは簡単に超えてしまう。いままで制限してそれ未満だったから、制限が外されたらどうなるかなんて、ねぇ。
 でも時間を問わずyoutubeがストリーミングできて、アニマックスオンデマンドとかでアニメが見れて、みたいなのは結構快適。特に4k液晶だとHDのストリーミングでも画面の片隅で見れるし。
 帯域制限は、20時頃まではあんまり気にならない感じ。0時頃だとかなり制限されてる気がする。規則正しく早寝早起きすれば問題ない感じ。

 サービスエリアの隅の方で使ってるから、設置場所は結構シビア。ちょっと動かすだけでいきなり電波がつかめなくなったりする。WiMAXの波長は11cmくらいなので、5cmくらい動かすと改善するかも。最初に置いた位置に印をつけて、そこから半径10cmくらいで動かせばある程度受信強度高い場所は見つからるかな、という感じ。
 契約的にはLTEも追加無しで使えるはずだけど、こっちはまだ試してない。

XNAでサウンド出力

 C#で音をリアルタイムに作って出したかったので、XNAでやってみた。前にWin32でやった気がするけど覚えてない。

 XNAが開発終了って以外は、あんまり欠点のない方法、だと思う。

 DynamicSoundEffectInstanceのコンストラクタでサンプリングレートとチャンネル(Mono/Stereo)を選択。最初のデータをSubmitBufferで設定してPlayで開始。データが無くなるとBufferNeededイベントが来るので、ハンドラ内でデータを生成してSubmitBufferで追加。たぶんStopとか使えば止められるんじゃないかなー。
 Playは最初の1回だけでいいが、予めSubmitBufferでダミーデータでも追加しておかないと、ブツブツ途切れて再生してしまう。ちょっとしたダブルバッファみたいな感じになってるんだと思う。ということでPlayの前にBufferNeededを蹴っている。
 あとFrameworkDispatcher.Update()のタイミングが結構シビア。場所を変えると例外が投げられる。とりあえず今は動いているが、いつ動かなくなるかはわからない。
 それとFrameworkDispatcher.Updateを呼ぶタイミングは、SubmitBufferで設定した時間よりも短い間隔で呼ぶ必要がある。例えばBufferが50msec分なら、Updateは50msec以下のインターバルで呼ぶ必要がある。とはいえ、Thread.Sleepは往々にして設定時間の数割増しのインターバルとなるが、それでも正常に動いてるから、よほど大きく離れてない限りは問題ない様子。

 C#は例外的にSerialPortがある程度で、ファイルアクセス以外はほとんどIOが無い(マウスやキーボードはFormの機能)。音声IOも例外ではなく、使いたいならWin32とかで工夫する必要がある。
 XNAは前述の通り開発が終了しているが、ちょっとした音声IOで遊びたいなら有効なツールだと思う。


using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using System;
using System.Threading;
using System.Windows.Forms;

namespace WindowsFormsApplication9
{
    public partial class Form1 : Form
    {
        Thread t;
        bool loop;

        public Form1()
        {
            InitializeComponent();

            loop = true;

            t = new Thread(new ThreadStart(hoge));
            t.IsBackground = true;
            t.Start();

            FormClosed += Form1_FormClosed;
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            loop = false;
        }

        void hoge()
        {
            using (DynamicSoundEffectInstance audio = new DynamicSoundEffectInstance(44100, AudioChannels.Mono))
            {
                audio.BufferNeeded += Audio_BufferNeeded;
                Audio_BufferNeeded(audio, EventArgs.Empty);

                FrameworkDispatcher.Update();

                audio.Play();

                while (loop)
                {
                    Thread.Sleep(10);
                    FrameworkDispatcher.Update();
                }
            }
        }

        private void Audio_BufferNeeded(object sender, EventArgs e)
        {
            DynamicSoundEffectInstance audio = sender as DynamicSoundEffectInstance;
            if (audio == null)
            {
                return;
            }

            byte[] buff = new byte[audio.GetSampleSizeInBytes(new TimeSpan(0, 0, 0, 0, 50))];

            Random rand = new Random();

            for (int i = 0; i < buff.Length;)
            {
                Int16 data = (Int16)rand.Next(-16384, +16383);
                byte[] datas = BitConverter.GetBytes(data);
                Array.Copy(datas, 0, buff, i, datas.Length);
                i += datas.Length;
            }

            audio.SubmitBuffer(buff);
        }
    }
}

2017年8月4日金曜日

スライドスイッチ機能付感圧センサ

 秋月で売ってるアナログなスイッチを試してみた。
 スライドスイッチ機能付感圧センサ: センサ一般 秋月電子通商 電子部品 ネット通販


 青が位置、赤が圧力。圧力が0の時は位置データを無効としている。
 まずスイッチの端から端へスライド、次に逆へスライド。中央を押し、端を押し、反対の端を押し、中央を押す。その後、中央部に指を置いたまま、押す力を変える。そして強めに押しながら指をスライド、最後に触れる程度にスライド、という感じでテストしてみた。だいたいその通りの結果になっている。
 押す強さを変えた時に位置が動いたり、指をスライドする際に圧力の変動が大きかったり、といったところはあるが、それ以外は特に問題なさそう。

 軽く触れて動かせばスクロール、強く押せば確定、みたいな感じで指1本をひとつのパネルから動かさずに操作できるUIが作れそうで、面白そう。
 ミュージックプレイヤーなら、スクロールで音量変更、1回押し込み後のスクロールで曲移動、1回強押し込み後のスクロールでシーク、とかかな。電源ボタンを除けば、スイッチ1個だけのミュージックプレイヤーとか作れそうだ。
 このスイッチはクリック感等は皆無だが、裏に圧電素子とかつけて振動を与えればいろいろな表現ができそう。

 ちょろっと遊ぶくらいなら、かなり面白いスイッチだと思う。
 ただ、機器に組み込むのは、ちょっと面倒な感じ。端子部のフレキ基板がかなり硬いので、基板の向きの自由度がかなり低い。まぁそのあたりは工夫次第かな、という感じ。

2017年8月3日木曜日

OKL-T/6-W12N-C

 秋月で売ってる、ムラタのOKL-T/6-W12N-CというPOL降圧DCDCを試してみた。
 ムラタ表面実装DC-DCコンバーター OKL-T/6-W12N-C: 電源一般 秋月電子通商 電子部品 ネット通販

 単純に降圧DCDCとして使いたいなら、基板実装済みのモジュールが有るので、それを使うほうが遥かに楽。
 しかし今回は比較的狭いスペースに2個入れたかったので、ユニ基板に実装してみた。


 とりあえず、なんとか動いてるみたい。
 実装する際は、GND/Vin/Vout以外のパターンをカプトンテープで絶縁し、GND/Vin/Voutが接するスルーホールにハンダを充填する。またGND/Vin/Voutもハンダメッキする。メッキというか、BGAのように盛り上げる感じ。
 その後ユニ基板に正確に位置を合わせてVinあるいはVoutの裏側からハンダゴテで熱しながらハンダを入れる。GNDはパターンが広いのでかなりの熱量が必用のため、まずはVin・Voutで位置合わせをした方がいい。
 基板とDCDCの間には0.5-0.8mmくらいの隙間を開けると良さそう。薄いプラスチックカード(使い古しのamazonギフト券とか、もうちょっと薄いもの)をジグにして高さを調整すると良いかも。
 ある程度ハンダを入れて、基板とDCDCの間にボールになるようにする。ただし入れすぎるとGND/Vin/Voutで短絡するので注意した方がいいと思う。

 その他の端子、TrimとON/OFFとSenseを接続する必要があるが、これらの端子はほとんど電流は流れないはずなので、モジュール横の端面スルーホールに配線を通せばいい。

 ちゃんと6Aまで負荷をかけたわけじゃないが、とりあえずちゃんと動いている気がする。
 効率は素晴らしいと言うほどではないが、酷いと言うほどでもない。よほど電位差がない限りは、発熱はそこまで多くないはず。とはいえそれなりの発熱量は有るので、何らかの放熱は必用だと思う。



 Trimの抵抗値と電圧はこんな感じ。横軸が抵抗値、縦軸が電圧。
 代表的な電圧はデータシートに書いてあるが、3.3Vなら抵抗が2個、5Vなら抵抗が3個必要になる。中途半端な抵抗器を特注できるとかなら1個でも良いだろうが。


 ま、ちょっと大電流な降圧DCDCが欲しいだけなら秋月の変換基板を使ったほうが楽。多回転ボリュームがついてるので電圧調整が楽だし。人間がユニ基板に実装したモノの信頼性とかかなり低そうだし。


 僕は普段、片面基板を多用している。今回、久しぶりにスルーホールのユニ基板を使った。どんどんハンダが吸われるし、かなり面倒。ノンスルーホールな両面基板とかあると便利そうだけど、そうなると今回みたいに裏に熱を伝えたい時に困るんだよなぁ。かといってスルーホールを全部ドリルで削るのも大変だし。