2014年1月9日木曜日

ArduinoでFFT(8bit int)

ハンダ付け作業台、4980円

もちろん(と威張って言うことではないのですが)自分では書けないので、あちこちで公開されているライブラリを漁ってみたのですが…私の目的に一番フィットしていたのがこれでした。
  Modified 8bit FFT in c
Webに貼ってあるfix_fft.hとfix_fft.cppをテキストにしてArduinoライブラリフォルダに入れておく。それからArduino IDEを起動しSketchで以下のようなコードを実行(「マイコンボードへの書き込みが完了しました」という表示が出たところで、すぐにツール>シリアルモニタを開き、ボーレートが違っていたら57600に設定する)すると、意図したようなスペクトル数列が得られました。
#include <fix_fft.h>
char im[128];
char data[128];
char buf[20];

void setup() {
  Serial.begin(57600);
}

void loop(){
  int  i;
  char buf[6];
  for (i = 0; i < 128; i++) {
    //  data[i] = (i % 16) * 16 - 120;  // 三角波  
    //  data[i] = (((i >> 4) & 1) * 255) - 128;  // 方形波
    // 2つの正弦波を合成した波形
    float d = (float)i * (PI * 2.00) / 128.00;   // ラジアンへ変換:dは0〜2pi
    float f = (sin(d * 2.00) * 0.66 + sin(d * 30.00) * 0.33) * 127.00;  // 2fと30fの正弦波
    data[i] = f;
 
    // 虚数部をクリア
    im[i]   = 0;
  }
  Serial.println("");
  dispData("Source  : ", data, 128);
  Serial.println("");

  fix_fft(data, im, 7, 0);  // full scale 2^7=128, FFT mode

  for (i = 0; i < 64; i++) {
    data[i] = sqrt(data[i] * data[i] + im[i] * im[i]);
  }

  dispData("Results : ", data, 64);
  Serial.println("");
  while(1) ;
}

void dispData(char *inMsg, char *inData, int inN) {
  Serial.print(inMsg);
  for (int i = 0; i < inN; i++) {
    sprintf(buf, "%5d", inData[i]);
    Serial.print(buf);
  }
}

よかった良かった。ここ数日これに睡眠時間を削られていたので、安眠できます。

…でも、中学生ぐらいからずっと欲しかったハンダ付け作業台が昨日Amazonから届いたので、やっぱり睡眠不足は続く予感:-)

2014年1月3日金曜日

Arduino時計+温度計

年末年始は電子工作で遊ぶ予定だったのに大掃除の際にハンダゴテを破損。次にいじれるのはいつになることやら…と思っていたら、思わぬところから発掘しました。

何年行方不明だっただろう…。
というわけで、SainSmartのキットからLCDと小型ブレッドボードとLM35(温度センサ)をつかって、デジタル時計/温度計を作ってみました。何を今更と言われようとも、私のデジタル工作の原点は秋月ならぬ信越商会のMN5311デジタル時計キットなので(アナログは今はなき三鷹トリオ商会で買った2石レフレックストランジスタラジオ)、ともかく時計を作らなければいけないのです。

Arduinoはハンダゴテ使わずに試作できてしまうのですが、SainSmartのキット付属の
LCDにはヘッダピンが付いていなかったので、ハンダ付けします。老眼が大いに障害になりましたが、何とか完了。ハンダの溶け込むリズムを思い出すのに時間がかかったぜ。

そして、小型ブレッドボードをパッチベイのように使って配線。まぁパッチベイといってもGNDやらVccなど複数の線が集まるところをブレッドボードのrowを使って配線するってだけですけども。

まずは、キットのテストコードをそのまま入力して実行。最初まったく表示が出なくて焦りましたが、コントラスト調整をしたら文字が出ました。また、LCDバックライトの抵抗を220Ωにしたら物凄く明るくて全体的に薄暗い写真になってしまいました。この後、1kΩまであげてみたのですが、それでもかなり明るいです。


続いて時計スケッチ。あちこちサンプルが上がっているのですが、いまさらArduinoで時計作る人も少ないのか、Timeライブラリの仕様が古かったりして使えません。ので、ググりつつコーディングしてアップロード。

温度計の補正に悩みましたが、それもなんとかクリア。とりあえず、
 温度 = analogPort値 ☓ 基準電圧 ☓ 100 / 1024
で上手いこと動きます。素子の出力電圧が1度=10mVなので基準電圧☓100、1024はフルスケール値です。なお、浮動小数点なら最後の3つの定数を電卓で計算して1つにしてしまえばいいのですが、浮動小数点演算の負荷を嫌って整数を使う場合は演算の順番を考えないとオーバー/アンダーフローを起こします。こういう場合、例えば500と1024を因数分解して演算の途中でも値がintの生の最大値32767を超えないようにします。今回は確実に動くこと優先で浮動小数使いました。また、文字列への変換もsprintfを使っています。書式指定のあるprintf/sprintfはプログラムサイズが大きくなるのですが、まぁここは確実に動くこと優先で…なお、Auduinoのライブラリではprintfの浮動小数への書式指定 %f は使えませんのでご注意を(少しハマりました)。

追記:
ArduinoのADCは基準電圧の切り替えが可能です。unoの場合は電源電圧、外部、内部(1.1V)に設定可能です。設定するには analogReference(type); のtypeにDEFAULT、INTERNAL、EXTERNALのいずれかを使います。EXTERNALの場合にはAREFピンに基準電圧を与える必要があります。詳細については以下のページが参考になりました。ありがとうございます。
  Arduino 日本語リファレンス - analogReference(type)

というわけで、何とか動きました。デジタル時計作ったのは何年ぶりかなー。

次はmbedのLPC1114FN28と適当なRTCを使って、ローコストかつデカイLEDデジタル時計でも作ろうっと。

#include <Time.h>
#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
time_t tokei;

int iYear  = 2014;
int iMonth = 1;
int iDay   = 3;
int iHour   = 18;
int iMinute = 20;
int iSecond =  0;

int lm35 = 0;

void setup() {
  lcd.begin(16, 2);
  setTime(iHour, iMinute, iSecond, iDay, iMonth, iYear);
  tokei = now();

  analogReference(INTERNAL);  
}

void loop() {
  
  while( tokei == now() ) {
    delay(100);
  }
  
  tokei = now();
  digitalTokei();
  digitalOndokei();
}


void digitalOndokei() {
  float val;
  int dat;
  char buffer[5];
  
  val = (float)analogRead(lm35) * 110.0 / 1024.0;
  dat = val * 10;
  sprintf(buffer, "%02d.%1dc", dat / 10, dat % 10);
  lcd.setCursor(11, 0);
  lcd.print(buffer);
}

void digitalTokei(){
  char buffer[20];
  
  sprintf(buffer, "%4d/%02d/%02d", year(), month(), day());
  lcd.setCursor(0,0);
  lcd.print(buffer);

  sprintf(buffer, "%02d:%02d:%02d", hour(), minute(), second());
  lcd.setCursor(4,1);
  lcd.print(buffer);
}


さて、一応時計なのでしばらく動かして精度を見てみようと思いますが、USBにつないだままにしておくのも少し不安があるので、とりあえず使わなくなったスマフォ充電用エネループをつないで放置したところ、約18時間で終了。消費電力150mAってところでしょうか。なお、スマフォ充電用のエネループを使うと写真ではわかりませんが何やら液晶が脈打ってるようになります。他の電源やUSBではこういう症状が出なかったので、電池の3.7V出力を5Vに変換するためのDC/DCがあんまり安定していないのかもしれませんね。



■追記■

その後、別バージョンの時計も作りました。この他にも教材用やアルバイトで3つ作ったw

Arduino時計+温度計(7セグメントLED編)
Arduinoユニバーサルボードにハンダ付けして作りました。私の部屋で元気に稼働中です。

Beaglebone Blackで7セグメントLEDデジタル時計
待ちに待ったBeagleboneがようやく入手してうれしさのあまりついデジタル時計を作ってしまいましたが、BoneScript(Node.js)でセグメントごとに制御しているため表示がちらつきます。digitalOutじゃなくBus命令があればもうちょっと速くなるんですが。とりあえず多セグメント用のLEDドライバを入手したので、そのうち改良します。

Energia + MSP430G2でのハマりポイント
製作途中の巨大7セグメントLEDデジタルクロック。TIの省電力MCU MSP430G2シリーズをArduino互換のEnergiaという開発プラットフォームで動かしています。マカーにはありがたい。

2013年12月28日土曜日

数年ぶりにパーツボックスを発掘

意外なところにありました。当面必要な物はひと通り。


ピンヘッダも貫通、オスメス両方揃ってます。


チタコンやTTL/CMOSの印刷は消えてしまって読めなくなってる。まぁ老眼ってこともあるんだけど。しかし、セメント抵抗を今後使うことはないだろなー。


これなんだろ。フォトカプラー? ご存知のかた、コメントいただけると幸いです。

2013年12月5日木曜日

システム構築のうちとそと

近所の石碑…言葉選びって難しいわ

はてなの匿名記事エクセルでできることができない何百万のシステム・・を読んで。

私はずっとこれを言われてきた人間で、Excel登場前からSOHO向けのビジネスアプリを受託開発してきました。ただ、Excelどころかパソコンのない会社にシステムを導入する場合=システムを導入しなければならないほど定型化した業務が増えてきた場合には、ビシッとした伝票と帳簿システムが固まっている場合が多いんですよね。

なので、期首、月次、週次、日次、都度ぐらいで処理のタイミングを区切って、そこでどんな伝票を起こしてどう記録するかをヒアリングするところから始めてデータの流れに置き換えていき、無駄な処理をあぶりだしたり、一部利用者から「面倒だ」と文句が出るかもしれないけど必要な処理を提案したりでシステムを設計>開発しました。

そこにExcelなどのスプレッドシートが登場します。最初にお目にかかったのはTRS-80版Visicalcだったかな。Multiplanの時代まではあまり「被害」はありませんでした。むしろリレーショナル型データベースと相性が良いので、入力と出力がはっきりしていて打ち合わせもラクでした。それまでプリントアウトや伝票のコピーに赤ボールペンで注釈入れていたのが、キーボードの操作だけで完成イメージに近づけることができるようになったので誤解が生じる余地は少なくなりました。少なくとも帳票デザインに関しては「これで」「わかりました」で大体片付いてたと思います。なにより出来上がってから「これ、イメージと違うよ」ということはかなり少なくなりました。

そこにExcelです。上記記事にある通り、Excelのデータ形式はとても自由です。主要部分を定型化しておいた上で、ちょっとした例外処理を手作業で簡単に追加できるし、年に2回しか使わない帳票であっても慣れている人であれば作ることができます。

この「自分でも作ることができる」という誤解をユーザに与えたのがExcelの最大の罪だと思います。

日本人なら誰でもおにぎりを作れると思いますが、お客さんの心の中にしかないおにぎりの味やら姿やら食感をすべて定義した上でその作り方をコンピュータというやたら頭の回転だけは早い愚か者に一字一句間違いなく教えないといけないんですよね。うっかりすると、「天むす」を頼んだはずが「たぬきうどん」になっちゃうかもしれないし(違

それでも「Excelなら簡単にできる」って言われたら…「おにぎりの作り方を教えることがいかに大変か」と話しても不毛なので、どうしてExcelを使わないのかを相手自身に説明させて自身で理解してもらうところから始めましょうかね。要件定義もトラブルシューティングも大事なのは切り分けですから。

--

なお、タイトルは私が学校行ってたころの名著「コンパイラのうちとそと」へのオマージュです。擦り切れるまで読んだっけなぁ。

余談の余談ですが私は当時BASICのコーディングのアルバイトをしていました。単価は1行100円、コンビニのバイト時給が400円の時代にすげえ!と思ったもんですよ…最初の2週間ぐらいはねw

2013年12月4日水曜日

シールドに関する挫折

Amazonで「サインスマート Arduino(Uno) をはじめよう互換キット(19プロジェクト:LCD、プロトタイプシールド、XBeeシールド付)」 を買った。


それとは別にXBeeエクスプローラUSB を買った。XBee端末(?)が二つ揃った。これでこの週末はXBeeで遊べる!
…と思ったら。どっちもArduinoに載せるためのシールドだけで、XBeeはありませんでした。というわけで、スイッチサイエンスさんに、XBee ZBを2個、ついでにEtherシールドとPoEアダプタを注文しました。

ついでの方が高額ですが。

2013年11月20日水曜日

ひさしぶりにArduinoで遊んでみる:TGS-2450ニオイセンサー

■追記■

簡単に使える空気質センサーで作りなおしてグラフも描画してみました(2016-05-27)。

■ニオイセンサー■

秋月で2個買って来た(ヒーターの制御間違えるとすぐ焼損するらしい)TGS-2450硫黄化合物ガス検出器を使ってみた。

TGS2450は硫化水素などの他にアルコール、アンモニアなど「臭い」を構成する物質をうまいこと検出してくれる素子。ニオイセンサーの完成品は人間の感性に近づけるための回路やら他のセンサーでかなり高いんだけど、この1個300円のセンサーでも「今日の俺、臭い?」かどうかを客観的に知る程度には十分使える。

ADコンバータでそのまま読み取るには抵抗値の変化幅や電源の条件が少し厳しいのでオペアンプを使いたいところだけど、手持ちの在庫がないので我慢。この辺の記事の通り作ってみた。

本格的にArduino > においセンサー

ベースはスイッチサイエンスさんのArduinoをはじめようキット。この他に100Ωの抵抗一袋とトランジスタ2SC1815を一袋、秋月で買って来た。ArduinoとMac/PCとの接続はA-BタイプのUSBケーブルが必要。外付けHDDなどを買うと付いてくるけど、もし手持ちがなければ忘れずに買って来ること。


キットのブレッドボード上に配線、抵抗の足はピンセットなどのエッジを使って曲げるときれいに直角になります。で、適当な長さにカット。長さ揃えた方が仕上がりが綺麗になります。ブレッドボードへのレイアウトはまず足の多い素子から先に配置し、縦方向(a-e, f-j)の穴が足りなくならないように適度にジャンパで逃がして抵抗でまたいだりして決めて行きます。レイアウトが決まったら、ピンセットを使って背の低い素子から深く差し込みます。この写真はまだ途中、完成品撮影するのを忘れた。このあとトランジスタのエミッタから電源につながるジャンパとArduinoにつながる配線(5V電源、GND、スイッチング用デジタル出力2本、アナログ入力1本)を差し込みます。

配線を間違えると良くて動かないかTGS-2450損傷、ヘタすればArduinoまで死にます。滅多にないですが、最悪の場合はMacが死ぬこともありますので、慎重に慎重にチェックしてください。回路図では電源とGNDラインが省略されていることが多いので、そのへんもお忘れなく。


開発ツールのArduino IDEは、Mac版をダウンロードしてインストールするだけ。ドライバは不要。今回使ったのは、安定版の1.0.5。インストールが終わったら、ArduinoとMacをUSBケーブルで接続します。起動したらツール>シリアルポートで、/dev/cu.usbmodem621を選ぶ。末尾の数字は変わるかもしれません。

上記「Arduino @ ウィキ」さんのページからソースをArduino IDEにコピペ。cmd+Rでチェック&コンパイル&実行開始です。数秒するとArduino上の黄色LEDが約1秒間隔と0.25秒間隔で点滅しているはずです。ダメならとりあえずUSBを引っこ抜いて、配線を確認してください。

ツール>シリアルモニタでモニタ画面を開きます。1秒ごとに何か表示が出ます。化けているようなら、通信速度を19200bpsに切り替えます。電圧が1秒に1回、表示されます。ってまたスクリーンショット撮り忘れたわ。

2.5Vぐらいから、ゆっくり数分かけて4V近くまで上昇します。で、数値が安定してきたところで、センサーをなるべく臭くなるように「ハー」っと吹いて見ます。すぐに数字が下がるはず。ティッシュにアルコールなどを染み込ませて近くで振っても下がります。臭いほど下がります。

これで出来上がりです。このままでは持ち運びも不便なので、装置として使うためにはユニバーサルボードを買って来てハンダ付けします。単体で使うには電源と表示器とケースが必要です。PC/MacとUSBと接続したままで使うなら、ADから読み込んだ値を適当な数値に変換してシリアルポートに流すようスケッチを変更し、PC/Mac側はなにか適当なターミナルソフトかターミナルでシリアルポートから読み込んだ値を表示してやれば最低限動きます。

さて、次は何をしようか…。

余談ですが、我が家には死蔵していたテクトロのSTamigoというハンディオシロがあります。テスターとしてもオシロとしても使えて電池で動く、当時としては画期的デバイスだったのですが…さすがに古いせいかオシロ機能がイマイチ正しく働きません。連続してパルス出力が来ているのに(LEDで確認)、表示は4個だけ出てあとは沈黙したり。とりあえずテスタとしては正常に使えるので、良いんですけど…ごめんよ、何年も放置して。


2013年11月13日水曜日

3Dプリント基板

3Dプリンタでプラスチックと銅を盛れるようになったら、ご家庭で簡単に3D構造のプリント基板を作れるようになるなぁ。部品は表面実装するしかないか。

でも、24層基板基板とか12層ドーナツ状プリント基板なんて出来たらいろいろ遊べる。

ただし『クラインの壺』は禁止で。

2013年10月24日木曜日

MavericksのMail.appがgmailに対応していない

gmail.comのメールボックスがこの状態

Mavericksにアップデート、Mail.appは一件正常に起動していますが、「全表示」ではなくgmail.comアカウントのmailbox単体で見ると中身が空になっています。

当該gmail.comアカウントにメールを送信すると、メールボックスにはその1通だけが表示されます。

同期、再構築、一旦アカウントを削除して再登録…など試みましたが、空のままです。

ブラウザから当該gmail.comをアクセスすると以前のメールはそのまま残っていますし、iPhone上では正常に表示されるので消えたわけではないようですが…早急に対策して欲しいものです>Apple

■追記 2013/10/28■

コメントにて、GmailにWebブラウザからアクセスして設定を変更したら解決した、とご教示いただきました。

MacOSX 10.9 Mavericks でのGmailの不具合を解決できたみたい(^^)

残念ながら私のところはすでにそういう設定だったのですが、逆に「非表示」に切り替えたら動いてしまいました。何でしょうねぇ…動いたから良しとします。

ありがとうございました>shigeさん

■追記 2013/11/19■

アップルからアップデータが出ましたね。再ロード(再インデックス?)にかなり時間かかりましたが、とりあえずInboxについては正常に戻りました。

2013年10月22日火曜日

Xcode5にしたら起動しなくなった

品川にて
アップデートが終わり、起動。インストールするから認証してくれ、なんてのを通りすぎたところで即死。ログ見てもこれぞというネタは思い当たらない。何度試しても同じ。マシンを再起動しても同じ。.xcodeprojをダブルクリックしても勿論ダメ。

対策として、

  • Xcodeを削除して再インストール
  • /Library/Developerと~/Library/Developerを削除

したけど、変わりなし。とりあえずhome以下が悪いのか否かを判断するために他のアカウントでログインするとちゃんと起動する。

最悪、開発作業だけ別アカウントでやるしかないなぁ、まったく起動しないよりはマシだし。で、別アカウントで「他のツール」とやらのインストールが終わるのを待ってから元のアカウントに戻る。

…起動しました。

何だったんでしょうか。

2013年9月19日木曜日

HDレコーダー:さよならRD

■過去3代RD■

RD-XS41、RD-XD91、RD-BZ800と過去3代RDでした。

その前はVHSとHDがついたビクター製、これがまだ動くから凄い。見習えよ>東芝

さて、RDは最初からトラブルの多いやつでした。特に予約録画:

  • 予約したのに音声とCMの静止画がずーっと入っているだけ
  • 予約録画したらただただ真っ黒
  • 何の説明もなくすっぽかし
  • バグが原因で2回フォーマットかけるはめになった41
  • とにかく予約録画失敗が多かった91
  • 突然外付けHDDを認証できないとか言い出したBZ800…。

それでも他社製同世代機と比較すると容量の割に安いしパソコンとの連携でできる事が多いので3代も買っていました。

でも、さすがに疲れました…だって、もうエエ加減安定したと思っていたBZ800ですが、よりによって「きんいろモザイク」の録画に失敗しやがったのですから…。


「BZ800世代のRDは最悪だった。でも、今は良い」という人もいます。41の時にも91の時にも同じセリフ聞いたよ、お前はボジョレー・ヌーヴォーかよ。

■機種選定■

というわけで、3番組同時録画の中級機、一応ソニーかパナソニックに狙いをしぼり、とりあえず買った人がレビューを書くAmazonと炎上気味のKakaku.comを参考に、ソニーBDZ-ET2000とパナソニックDMR-BZT750を候補としてヨドバシへ。

なお、3番組同時録画と書きましたが、ソニーはスカパーを含む3番組、パナソニックは3番組+スカパーです。AT-X愛用者の私としてはこれは結構重要な点ですが、最後の最後まで気づきませんでした。ソニーは操作の軽快さで定評があります。



■店頭にて■

実際の操作してみると、ネット上の評価と違ってソニーは意外ともっさり。もちろんRD-BZ800と比べればそこそこ速いんですが、番組一覧のリフレッシュに10秒以上かかるのはちょっとストレスが大きい。一方でパナソニックは爆速じゃった。リモコンを押しっぱなしにしていると、まるでひっかかることなく文字が読めないスピードでスクロールしていく。

機能面ではRDの美点だったフォルダ機能は最近の中級機には搭載されていないのだとか。それは困る。番組別にわけたり、「ヨメがあとで見るアニメ」「私が後で見るかもしれないアニメ」という分類でとりあえず投げ込んでおくことができない。店員さんに尋ねたところ、ソニーには所有者?みたいな機能でタグ付けすることができ、パナソニックは複数の番組を一つにまとめたりバラしたりすることができる。うちの場合とにかくアニメが多いので、まとめる束数に制限のないパナソニックの方が使いやすいと判断。

爆速とまとめ機能、3番組+スカパー同時録画、パナソニックの圧勝でした(※個人の感想です)。

店員さんには30分ほど付きあわせてしまったので、値引きなし(一応交渉はしたけど、無しだったのであまり押さずに1回で諦めた)で購入しました。

■DMR-BZT750を使って■

電源onの起動もまるで一昔前のアナログ液晶か予熱付きブラウン管のような速さ。何より笑ったのが、NHKのデータ放送。RDだとボタンを押してから早くても20秒ぐらいしないと天気予報に辿りつけないんだけど、パナソニックは押した瞬間に出てきやがる。こんなに使える子だったのか、とデータ放送を見直しました。

スカパーからNASに録画した番組もローカルHDの番組も全表示で一覧表示でき、爆速スクロールする。スカパーの番組も問題なく再生できる。もうね、今までのもっさりとろとろ時々クラッシュ、は一体何だったのかと。

■互換性について■

RDで焼いたBlurayディスクは今のところREもRも問題なく再生できてます。LAN経由でRDを見ると番組名一覧は表示できるのですが、選択すると数秒後に「再生できません」とアラートが出ます。