ラベル Energia の投稿を表示しています。 すべての投稿を表示
ラベル Energia の投稿を表示しています。 すべての投稿を表示

2016年7月15日金曜日

MSP430G2553とRaspberry PiをI2Cで繋ぐ


■MSP430G2■

超低消費電力をArduinoと同じコードでさくっと動かすにはMSP430G2553 + Energiaに限ります。クロックを1Mhzに落とせば消費電流220μA、単3エネループ2本で1年近くもってしまう計算になります。

■接続■

GND同士、SDA同士、SCL同士…をつなぎます。3.3vは接続してはいけません。

ラズパイのHDMI端子を手前におき、GPIO端子の手前側の列、左から2番目がSDA、3番目がSCL、SCLの奥がGNDです。

例によって白がSCLです。でも黄色SDA/茶GNDなのは在庫切れorz

MSP430G2553側は、P1.6がSCL、P1.7がSDA、20ピンがGNDです。

Energiaは、I2Cが自動的にプルアップされるので抵抗を外付する必要はありません。海外ブログで ラズパイとArduino Unoをつないでいる記事を見かけて、それによれば「ラズパイがマスターでArduinoがスレーブなら問題ない。ラズパイは3.3vでプルアップされるがArduino側はされてないからだ」とのことなんですが…今手元にArduino unoがないので、確認できません。Nanoパチ(5v)で試したところ、4.5v程度の中途半端な電圧が出ていました。なので、5vロジックのArduinoを使うことはお勧めしません。接続前に電圧を測定してからにした方が無難です。

■Energiaの準備■

TI MSP430 LauchPadにMSP430G2553をセットします。同じMSP430G2でもチップによってジャンパの設定が違いますので、チップを取り替えたらこのページで確認してください。

ソースはこれです。Energiaは単に信号を受けて、1バイト目 x 2バイト目の回数、LEDを点滅させています。2バイト以外の場合はバイト数を高速で点滅します。ただし10以上はカットします。動作確認用なので特に意味はありません。

今回Arduinoではじめてi2cスレーブを書いたんですが、受信も送信もハンドラを書く方式でわかりやすくて良いですね。今後活用したいと思います。




■ラズパイの準備■

ここを参考にして一発でした。ありがとうございます。

あとは、i2cdetectで0x40が現れれば接続はOKです。
pi@raspberrypi:~ $ sudo i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --                      
pi@raspberrypi:~ $ 

あとは、以下のように4バイト書き込めば4回チカチカし、
sudo /usr/sbin/i2cset -y 1 0x40 3 2 2 7 i

こちらで6回ゆっくり点滅すればOKです。
sudo /usr/sbin/i2cset -y 1 0x40 3 2 2 7 i

私は貧乏性なので数千円のラズパイを壊すのがとても恐ろしい。ですが、この構成ならば、例えばリレーやモーターなどの危ないことはマイコンにやらせておいて、ラズパイ様は安全なところで命令だけ下していればいい…という運用も可能になります。

■追記7/24■

i2cdetectで0x40にデバイスが現れない場合には、Energia IDEのバージョンをRelease 0101E0015にしてみてください。Release 0101E0016 / Release 0101E0017でI2Cが動かないという問題で大ハマリしたことがあり、まさにさっき同じ穴に落ちましたのでorz

2016年1月10日日曜日

Energiaでお風呂時計(第二回)


■追記(2016/01/27)■

ついに電池切れました。前回充電したのは12/22だったので、35日ほど動いたことになります。プログラムを改善したのはこの1/10のことだったので、かなり改造が効いている様子です。ついでに、明暗の制御を少し改良しました。

■続き■

前回の「Energiaでお風呂時計」、動くことは動くんですが・・・「無印の化粧品ボックス+ジップロック+ブレッドボード」という見た目があまりにも悲惨なので「100均の瓶+ユニバーサルボード」ですっきり仕上げてみました。

最初、透明な蓋の弁当箱を探したんですが、吉祥寺の100均では見つからず。とりあえず「防水」「透明」「適当なサイズ」というところで食品保存用と思われるプラスチック+金属蓋の容器にしました。

蓋が金属だと影が出来てしまって動作が安定しないのではないか?という懸念はありましたが、いまいち透明度の低いジップロックのロスが想像以上に大きかったようで、「明暗判別」の値を2倍近くにしないと消灯してくれない状態でした。

ユニバーサル基板は、部品沼から出てきた20年物のSUNHAYATO製、150円の値札が貼ってありました。さすがにフラックスが劣化しているのか、ハンダの乗りが悪い悪い。

ボードのレイアウトは下からLED、センサー、CPUです。LEDが割と重いので、安定させるために&蓋の影にならず見やすい位置、センサーは蓋の影にならない場所に上下逆さまに、残ったところがCPU。

明暗センサーはブレイクアウトボードにヘッダピンをがっつりとハンダ付けしてしまったのでIC用の背の低いソケットには使えず、かといってヘッダソケットを使うとLEDよりも出っ張ってしまうのでアウト。ということでユニバーサルボードに直接ハンダ付けしました。100円を越える部品を直接ハンダ付けするのは心臓がドキドキしますw

セグメントの配線には電流制限用の抵抗100Ω☓7個入れました。1kΩでも1.5mAぐらい流れるのでスタティックなら十分明るいのですが、ダイナミック点灯だとさすがに暗くてダメ。試行錯誤の結果と手持ち抵抗により100Ωになりました。

■で、起動しない■

で、組み上がったところでGND/VCCがショートしていないか確認してから電池つないでも起動してくれません。

電源電圧もI2Cのプルアップも正常。何せI2C以外はみんなDigital Outputという単純な回路なので、疑うところは「CPUがちゃんと動いていない」ということぐらい。ごく簡単なLチカプログラムを動かしてみても信号が出てきません。

となるとリセットが原因です。

ブレッドボード上では何も配線しなくても動いていたのですが・・・2553で前にもあったなー。というわけで、47kΩでプルアップしたところ、動作するようになりました。推奨回路ではコンデンサでGNDとつなぐようにも書いてあるのですが(電源を入れた時にしばらくGND近くを保って、リセットさせるため)、まぁ動いているから省略w

■起動したけど■



…なんだこの表示はorz

よくみると、

  • 中央が点灯すべきところで下が点灯している
  • 下が点灯すべきところでドット点灯している

ということで、3本の配線が間違ってました。せっかくワイヤの長さを揃えてきれいに配線したのに台無しですorz


なお、ユニバーサル基板と電池ボックス(単4☓3本)の固定には輪ゴムを利用しました。

■プログラム■

前のバージョンとほとんど変わっていません。変えたのは、前記の通り明暗を判定する値を大きくしたことと、明暗によってLEDの明るさを決める関数の演算式、それに秒表示の時のゼロサプラスをやめたこと、の3点です。

■ユニバーサル基板■

昔はブレッドボードがなかったので、抵抗の値を試行錯誤で決めるのも面倒でした。

今回、アホな配線ミスはありましたが、ブレッドボードで決まった通りに配線するだけなので、昔と比べれば大分ラクになりました。

でも、私は基本的にソフト屋なので、何の痛みも伴わないundoに慣れきっています。ユニバーサル基板で配線しながら考えていたのは「基板設計する方がラクだな」ということでした。配線ミスの修正を含めて、ユニバーサル基板の作成にかかったのは3時間ほどでした。このぐらいの基板設計なら2時間ぐらいで終わりますし、届いた基板へのハンダ付けも1時間かかりません。

昔は自分で1日かけてエッチングするか、数万円だして業者に頼むしかなかったんですが、今はカード決済で送料込み2400円ですからねぇ・・・。

基板を起こせば2枚目以降はあっという間に作れますし。まぁ、大抵の場合は需要ないのでそのまま未使用基板が増えていくだけなんですけどもw

2016年1月1日金曜日

Energiaでお風呂時計(第一回)

完成後、CPUもブレッドボード上へ移動

まぁ、またデジタル時計なんですけど。

使ったCPUはMSP430G2553ですが、開発環境はArduino互換なので、RTCを用意すれば簡単に移植することができます。ただ、nanoを使ったとしても消費電流を押さえるのはシンドいと思います。

■仕様■

  • 表示は4桁7セグメント赤色LED
  • お風呂なので電源は電池
  • 電池は1ヶ月ぐらいもたせたい
  • 時刻と入浴時間を交互に表示

■実装■

省電力で4桁の7セグを動かせる・・・ということで、CPUにはMSP430G2553を選びます。RTCは使わず、G2553に32768hzのXtalを追加して1秒ごとに割り込みを発生させて時計代わりにします。

さすがにLEDを常時点灯していては電池がもたないので、入浴時のみ表示するようにします。入浴中であることを検出するには、
  • 倒立スイッチ、風呂に入ったら時計を立てると点灯→一番簡単
  • PIRセンサーで人の動きを検出→簡単だけどお風呂のお湯で誤動作するかも?
  • 照度センサで明かりを付けたら動作開始
  • ドップラーレーダーで(ry
などいろいろ考えたのですが、ここはAPDS9930という照度・近接センサーを使います。ebayで「gesture sensor」って書いてあったのでAPDS9960みたいなことができるのかと思って買ったら単なる照度・近接センサーだった、というオチ。9960より劇的に安かったんですが、典型的な安物買いの銭失いでした。でも、寝かせて置くのももったいないので、使います。それに携帯電話用のデバイスなので、CDSなどで明るさを検知するよりも電力を消費しません(アナログの達人ならできるのかもしれないけど、動作時の消費電流250μA/待機時90μA,Sleep時2.2μAなんて回路を作るのは私にゃ無理)。

配線にはブレッドボードを使い、7セグLEDと電池ボックスは秋月です。

大きな声ではいえませんが、電流制限抵抗などは一切入れてません。Vf=1.8vの赤色LEDを使う場合には3.3v - 1.8v = 1.5v、5mAも流せば十分なので1.5 / 0.005 = 300Ωぐらいの抵抗をG2553とLEDのセグメント側の間に入れておくのが正しい使い方です。正しくない使い方をしているので「1」を表示している時と「8」を表示している時で明るさが異なってしまう(各桁を接続している端子に7セグメント分の電流が集中するので「8」のときは容量が足りなくなってしまう)のですが、まぁ自分用なので壊れなければOK。そのうちボード起こしたら抵抗入れるから、それまでがんばれG2553。

G2553への書き込みにはTIのLauchPadを使います。

ソフトはArduino互換のEnergia IDEを使って書きます。くれぐれもバージョン0101E0017と0101E0016は使わないようにお気をつけてください。

以下配線表。各セグメント7本と桁4本、電源、I2Cだけです。時計合わせはそのうち考えます。hourとminuteの間にコロンが点灯する表示器が欲しい(こないだaitendoで買ったら全品不良で点灯しなかった)。


MSP430G2553相手ピン備考
P1_47セグLED 11Seg A
P1_57Seg B
P2_04Seg C
P2_52Seg D
P2_21Seg E
P2_310Seg F
P2_45Seg G
P0_012Dig 1
P0_19Dig 2
P1_28Dig 3
P1_36Dig 4
P1_7APDS9930SDA
P1_6SCL
P2_6XTAL
P2_7XTAL


この他、電池の赤をブレッドボードの赤、黒をブレッドボードの青、G2553のVccとAPDS9930のVCCをブレッドボードの赤、G2553のGndとAPDS9930のGNDをブレッドボードの青、にそれぞれ接続します。


最初のバージョンは19日間動作しました(浴室使用時間は1日平均30分ぐらい)。LED駆動のデューティー比をかなり絞り込んだ現行バージョンは現在12日目ですが、さて。


■ハマり■

他のところに書いたネタもありますが:
  • 別のところ(Energia最新版でI2Cが動かない)に書いたけど最新のEnergiaを使ったらI2Cが動かなくなってしまった。2つ前のビルドをダウンロードしたら何事もなかったかのように動いた。うがあ。
  • 作業中にミスで電源逆接とG2553逆差しで2個トバしてしまった。
  • シリアルポートをGPIOでも使うとSerial.printなどを使った瞬間にリセットがかかる。まぁ当たり前なんですが……ライブラリの中のSerial.printで発症したために「ライブラリを呼ぶとフリーズする」という症状になり、ライブラリの問題か?と誤認してしまったために発見が遅れました。いやはや。
  • 明暗のスレッショルド設定にちょっと苦労しました。最終的にはセンサーからの値をLEDに表示させるプログラムを書いていろんんな向きで値を測定して閾値を決めました。やっぱ現場に行かんとダメやで。
  • 風呂場の明かりをつけているのに時計が消灯してしまうことがあって当初は上記閾値の問題かと思ったのですが、どうやらセンサーがLED電球の高速点滅の「滅」を拾ってしまうようで照明の明るさ/閾値設定とは関係なく発生します。なので、平均値を取るようにしました。ただ、センサーの値は1秒に1回サンプリングしており点灯時の明るさで500-700、消灯時の閾値が60という設定なので、LED電球を消灯してもすぐには時計が消えません。
  • ダイナミック点灯の合間にI2Cでセンサーを取りに行くと一瞬時計表示がチラついてしまいます。なので、時刻と入力時間を切り替えるときに読みに行くように変更しました。RTOS欲しい。
  • 照度に合わせてLEDの明るさを変えていますが、違いがわかりません。手で影を作ると少し暗くなるのでソレと判断できるのですが、あまり暗くすると消灯モードになっちゃいますし。

■ソース■

基本的には以前書いたデジタル時計の使い回しです。ArduinoでLEDのダイナミック点灯させるとだいたいこんな処理になっちゃいます。あと、APDS9930のライブラリはArduino用を使いました(APDS9930 Ambient Light and Proximity sensor)。

なんということもないダイナミック点灯プログラムなのですが、CPUのクロックを点灯中には8Mhz、消灯時には1Mhzに切り替えています。切り替えることでI2Cなどに影響がでないか心配だったのですが、問題ありません。1MhzだとG2553の消費電流は230μAで9930は220μA(スリープはさせていないが通信はごく低頻度なので消費電流はもっと低いはず)なので、まったくLEDを点灯させなければ2000時間程度は動くはずですが、点灯しない時計は意味がないので困ったものです。


2015年12月23日水曜日

Energia最新版でI2Cが動かない



Energiaの最新版Energia 0101E0017(と一つ前のEnergia 0101E0016)では、MSP430G2553にてI2Cがうまく動いてくれません。

厳密に信号レベルで見たわけではないのですが、他のデバイスあるいはEnergia 0101E0015で動いていたライブラリ等が動作しません。

回避方法は、とりあえずEnergia 0101E0015に戻せば動きます。はい。

・・・これで休日の貴重な2時間を潰してしまったじゃないかorz

I2C of MSP430G2553 is not working on Energia 0101E0016 and 0101E0017. if you got same problem, please install Energia 0101E0015.

2015年9月23日水曜日

まさにボトルネック

ADCとD級アンプの間の分圧抵抗をどこに入れよう…w

信号処理もどきを作ったのに、ADCがないので音を出して結果を確かめることができません。部品ぐらい買いに行けばいいんですが、膝を壊していて連休中はあまりでかけないで休むというコンセプトを忠実に守っているため、秋月にいや秋葉原にいけません。

せっかくMSP432P401Rで補聴器の着手できるめどが立ったのに…と思いつつ部品沼を整理していたら、一個だけMCP4725/DCコンバータが出てきました! 在庫リストにも記載されていないので、思いつきで買ってそのまま忘れていたのでしょうw

ということで、出力側の部品が揃いました。

秋月秋月秋月

ということで、まず今まで使ったことのないMCP4725を使ってみます。癖のないI2C仕様で割とすんなりつながった…のですが、何だか動作が不安定です。I2CのSDA線にオシロをつなぐとフリーズしてしまいます。基板裏のプルアップ用ジャンパは問題ないですし、オシロの入力インピーダンスはかなり高いので何か影響を及ぼすとは考えにくいのですが…ともかく、フリーズしていないことをLチカで確認することにして、だましだまし動かしてみます。

そして次に素の状態でMCP4725にどのぐらいの速度でデータを流してみようとして問題発覚。Energia/MSP432はI2Cの速度を切り替えられない。Arduinoだとライブラリのヘッダをちょっと書き換えれば400Khzまでは動くんですが、同じような箇所がMSP432版のドライバライブラリなどには見つかりません。i2c.cなんてソースに

    ASSERT(
            (EUSCI_B_I2C_SET_DATA_RATE_400KBPS == config->dataRate)
            || (EUSCI_B_I2C_SET_DATA_RATE_100KBPS == config->dataRate));

という記述はあるのですが、これを呼び出している側が見つからず、configもdefineも見つからず…。

しかたがないので、100khzで動かしてみましたが、1ワードの送信に3バイト必要+様々なオーバーヘッドで、毎秒約4000回≒2khzがやっと、という有様です。電話を遙かに下回り糸電話レベルの帯域orz

うーん、せめてI2cが400kで動けば16khzで出力できるので帯域は十分なのですが。

Energiaなんかで楽していないで、CMSIS使えってことですかね…ああ面倒くさい…。まぁ電子工作再開したばかりこのにLPC810にI2Cで液晶つないだりしてたので、できないわけじゃないんですけども…API調べたりするのが唯々面倒。


2015年9月22日火曜日

スペクトルアナライザー by MSP432P401R+Energia MT

ピンぼけじゃないもん影だもん(趣味:写真)

■Energia MT=マルチタスク■

EnergiaはArduino互換の開発環境ですが、MSP432P401R版はマルチタスクに対応しています。

マルチタスクというにはあまりにも単純でセマフォとかメールとかまったくありません。でも、今までのArduinoと比べれば格段に作りやすくなりました。

使い方は単純で

  • Energia IDEでタブを開き適当な名前を付ける
  • メイン同様setupとloop関数を用意するが、setupDisplay(), loopDisplay()のようにタスク名が後に続くようにするとsetup+loopのペアを別タスクとして認識する
  • メインに置いたヘッダやメイン上のGlobal変数は別タスクでも認識される

排他などについては厳密な排他制御は無理、暫定的にGlobal上にフラグを置いて自分で制御するしかありません。また、プリエンプションやタスク優先度がどうなっているのかも不明。その辺まったく情報がありません。まぁそのうち何とかなるでしょう。

ということで、とりあえず毎度お馴染みのスペクトルアナライザーをマルチタスクで作ってみました。

■材料

MSP432P401R、アンプ付きマイクAE-MICAMP、超小型グラフィック液晶AQM1284A、ブレッドボード、ジャンパ線…すべて秋月で揃います。合計4000円ぐらい? USBシリアルなども不要なのでArduino uno正規品を買うより安いです。

マイクはアナログ出力なのでドライバ等不要です。液晶についてはAQM1284AのコントローラIC ST7565RのライブラリをAdafruitさんが公開しているので、それを少し改造して使います。

FFTは大浦先生のライブラリそのままですが、M4F対応としてdoubleをfloatに置換して使用します。

以上です。

■配線■

マイクはGND, Vcc(5vが推奨されていますが出力電圧が大きくなりすぎるので3.3vにします)を接続し、OUTをEnergiaのP5.0に接続します。

AQM1284Aは以下の通りです。


AQM1284AEnergia MSP432P401R
VDD3V3
CSP3.0 / 18
RESETP2.5 / 19
RSP5.7 / 17
SCLKP1.5 / 7
SDIP1.6 / 15
GNDGND

■使い方■

各ソースは末尾に掲載します。長くてすみません。

Energiaは最新の16を使用してください。起動する前に、ST7565という名前のフォルダを作り、その中にST7565.cppとST7565.hを入れ、Energiaのlibraryフォルダに入れます。

Enegiaを起動したら、新しいプロジェクトを作り、FFTGraph_MTをコピペします。次に、ウィンドウ右上にある下向き三角をクリックして「新規タブ」を選び、TaskLCDという名前を付けてTaskLCDをコピペします(名前は何でも良いです)。

配線の点検をすませたらMSP432をマイクロUSBで接続し、Energiaでcmd+M、ビルドとプログラムの転送が終わるとグラフィック液晶に表示が出る…はずです。

なお、この作り方は厳密にいえば正しいマルチタスクではありません。TaskLCDが表示している最中にメインスレッドが表示バッファを書き換えてしまうこともありえます。でも、表示中にスペクトルが変わったとしても人間の目で追える変化ではないので、大目に見てやってください。

■毎度お馴染みのハマり■

Adafruitのライブラリの移植は、コンパイルエラーが出る→つぶす→ビルド→エラー→潰す…を淡々と繰り返すだけですが、それで終わらないのがコントラスト設定とpagemapでした。

コントラスト設定は秋月版との液晶の違いかAdafruit版だと真っ黒になってしまうのですが、Voltage Resistor Setを指定して回避できました。

pagemapはコントローラ上のページと液晶の表示位置を対応させるための表ですが、配布されているものと秋月のでは仕様が異なるようで、こんなのが出ました。左上隅から右下隅への直線がちょっと下にずれてます。64ドットで8ページ、たぶん2ページずれているのでしょう。


何度かの途中試行錯誤を経て

逆だ

なんだこれ

最終的にちゃんと表示が出ました。ここまで約1時間。



その次はマイクからの入力が常にゼロという現象が。そんなお行儀のいいアナログ入力はありえないのでしばらく頭を抱えていたのですが、これはanalogRead対応のピンにつないだつもりがanalogWriteのピンだった、というオチ。そりゃ値ゼロだわorz

FFTライブラリはつい最近使ったものなので問題なし。マルチタスク対応に関しては、奇跡的にも一発で動きました。何も難しいことしていないので当たり前ですけども、簡単なところで引っかかるのがこの私orz

でも、「自作補聴器」に今までで一番近づいたなぁ。すごいぞM4F、偉いぞM4F。





2015年9月21日月曜日

Energia16(MacOS X Lion) / Failed: Failed to evaluate GEL_LoadProgramOnly

NMAXSQRT大きすぎるな、今気づいた。

MSP432で遊んでいて、ボードに書き込みをしようとしたら
Failed: Failed to evaluate GEL_LoadProgramOnly
というエラーが出て書き込みができなくなりました。Forumにも同じissueが投稿されていたのですが、最終的には「OSとアプリを再インストールしたら直った」ということですが、それは余りにもリカバリコストが高すぎます。

ので、エラーメッセージにも出ている/var/foldersを消してみたり、Energiaアプリを再インストールしてみたのですが症状は変わらず。当然LaunchPadのUSBケーブルを抜き差ししてもダメ。

ただ、/var/foldersを消そうとしたらFinderがお亡くなりになったので、「これはパーミッションの問題だろうか?」と思い、
  • ディスクユーティリティでアクセス権修正
  • セーフティモードで起動
  • /var/tmp削除
などを行ったのですが変わらず。

ふと思い立ってボード上のリセットボタンを押したら…何事もなく復帰しました。ケーブル抜き差ししてもダメだったのにリセットが効くとは…orz

毎回ではないですが、起動直後にcmd+Mで「ビルド後にシリアルモニタを開く」を選ぶと、再発しやすいような気がします。その場合もリセットで復帰しました。

以下余談。

リカバリーのための諸々の操作の何が悪かったのか、Finderがなんだか不調です。Chromeも起動しなくなってしまいました(再インストールしたら直った)。まぁChromeはタブが増えすぎていたし、メモリをバカ食いするから使わなくても良いかな。

セーフティモードでお掃除したせいか、妙にサクサク動くし。まぁ悪いことばかりではなかった…と…考えましょう。

2015年9月19日土曜日

MSP432P401Rがイマイチ速くない?


■追試結果■

イマイチ速くない原因がわかりました。MSP432搭載のFPUは単精度で今回使ったプログラムは倍精度、そのためFPUが寝てる状態でした。ただ、どちらもソフトウェアで演算しているなら、やはりクロック差ほどの性能差が出ていないので疑問は残ります。

追試結果はこちらです(ゴメン、MSP432P401Rやっぱり速かった)。

以下は、新しいCPU到着に浮かれるバカっぷりだけをお楽しみくださいorz

■本文■

ついに届いたぜ、M4Fだぜヒャッハー!

…などと浮かれていたのですが、energia上で浮動小数点64ポイントのFFTを1,000回走らせてみたところ、結果は1143ミリ秒でした。

一方、Arduino nanoに同じソースをコピペして実行したら、1992ミリ秒。

クロック比よりも遅い? 浮動小数点プロセッサはどーなった??

…という残念な結果になりました。

ちゃんとオプチマイズしないとダメですね。ARMに最適化されているであろうCMSIS-DSPはどうかなぁ…。

2015年1月27日火曜日

MSP430/Energia+RTC+秋月巨大LED=デジタル時計

暗いとアラが目立たない

■またデジタル時計だ■

お前は他にやることがないのか、と言われるのは承知で作ります。

前回はダイナミック点灯させたところで力尽きたので、今回はちゃんと時計として動くようにします。TIの低消費電力MCU MSP430G2シリーズの2553、開発環境は同LauchPad + Energiaを使います。2553/LauchPadは日本だとちょっと手に入れにくいですが、RS onlineなどでLaunch Padとして$9.99で売ってます。せっかくなので、チップ単体のMSP430G2553も何個かまとめて買っておくと良いと思います(1個300円ぐらい)。LPC1114FN28と比べるとメモリなどごく限られるのですが、うそみたいに電池が長持ちしますし、かなりフットプリントが小さいので。

表示器は秋月の「超大型4桁7セグLED表示キット」です。低消費電力チップと組み合わせるのもどうかと思いますが。本来、秋月の時計キット用なのですが、巨大なLEDが今どきこの値段(1500円)で手に入るのは珍しいと思います。まぁaitendoで1280円で売ってたけどね…。注意しなければいけないのは、使っているLEDは16セグメントなのですが、秋月のキットでは7セグメントとして使ってます。aitendoのは16セグメント全部使っているけどね…でも16セグメント使いたくてもピンが足りないのよだからこれでいいのよ文句ないのよ(何その未練)

あとはRTCですが、今回は2553内蔵の発振回路 / カウンターを使います。キットには32768hzの水晶発振子が同梱されてます。小さくてLaunchPad基板へのハンダ付け大変ですけども。

温度計も2553内蔵の温度センサを使います。analogReadで華氏☓10の数値が直接返ってくるので便利です。まぁチップが多少なりともあたたまるので正確ではないけども(電源を入れた直後は他の室温計と一致していた)。

■先に落とし穴を書いておく■

内蔵温度センサも同じA/Dコンバータ使ってます。なので、Reference電圧を正しく設定しないと値がズレます。これで30分つぶしましたよ…。

■ハード編:巨大LED■

追記:
キットに付いてくるコロン用のLEDはクリアタイプで、方向によって明るさがかなり異なります(というか正面が眩しい)。「LED光拡散キャップ(5mm) 赤 (50個入)」を被せるか、広角タイプのLEDを用いると良くなると思います。

ほぼキットの説明書通り組み立てるだけなのですが、キットに付属しているコネクタはL型で表示器と平行に下側に伸びるように取り付けます。私は下面をフラットにしたかったので、手持ちの20ピンヘッダを取り付けました。あと、ハンダ付けの注意ですが…

  1. 金メッキ基板にはフラックスを(昔やった
  2. くれぐれもLEDの向きを間違えない(昔やった
  3. くれぐれも水平垂直平行を(昔やった
  4. ハンダ付けは必要十分に(昔(ry
基板と部品はまず最初に必ず仮組みをします。はんだ付けをしないで並べてみて、ぶつからないかちゃんとピンが全部ホールに入るかどうか、などを確認します。

1)のフラックスというのはピンや基板などをハンダで濡れ(?)やすくする処理剤です。小瓶で数百円、まぁ10年ぐらい使えます。キャップをあけると小さな刷毛がついてますので、それでハンダ付けする部分(ランドと言います)に少量塗ってやります。

2)はピンが多い部品を外すのはかなり困難です。確認確認また確認しましょう。

3)はピンを通す穴は案外大きいです。なので、雑に取り付けると微妙に部品が傾いてしまいます。傾く方向は左右だけでなく、基板と部品が平行になっているかも注意しなくてはいけません。なので、最初に1本をハンダ付けしたら、平行になっているかどうかをしっかり確認し、ずれていたらもう一度コテをあてて修正します。これで平行になっていることを確認したら、対角線上にあるピンをハンダ付けして再度確認します。これでOKならば、一応、隣のLEDも支障なくピンに入ることを確認してから、最初のLEDの残りのピンをハンダ付けします。

4)はリズムを身体で覚えるしかないっす。ただ、温度調整機能のついたハンダゴテを使っている分には最近の部品は滅多に壊れないです。それよりも、溶かしこむ時間が短すぎて接触不良になるケースの方が遥かに多いと思います。コテをあててピンを温める、コテというよりピンにハンダを当てて溶かす、ピンに自然にハンダが流れ込んだところでハンダとコテを同時に離す…ここまでまぁ3〜5秒くらい、10秒くらいかかってしまってもOKです。

今回の配線はソースに書いてありますが、こんな感じで。

信号名LEDボードのピン2553のピン番号同ピン名
Anode1桁目43P1_1
Anode2桁目22P1_0
Anode3桁目15P1_3
Anode4桁目56P1_4
Seg A177P1_5
Seg B188P2_0
Seg C129P2_1
Seg D1410P2_2
Seg E1311P2_3
Seg F1612P2_4
Seg G1513P2_5
dp<未使用>
コロン(+)204P1_2
コロン(-)18(GND)
水晶-19XIN
水晶-18XOUT

水晶は、Launch Padにこんなのが付属しています。


袋およびパッケージから取り出すとこんなに小さい。


2553のXIN-XOUTは右側のピンヘッダにもつながっているのですが、水晶発振子はピンから離れると動作が不安定になるので、なるべく近くに取り付ける必要があります。下の写真では中央の2553の右ちょっと上の方にある縦に2つ穴の空いたところがソレです。



貧乏症のワタシはこういう開発キットのようなものに手をいれるのはイヤなのですが、ハンダ付けします。ただ、こんなに小さいものなので、まずテープで止めて位置をルーペで見ながら位置を微調整してからハンダ付け。

これはハンダ付け前

ああしんど。

その他LaunchPadとLEDボード間は、メス−オスのジャンプワイヤで一本ずつ配線していきます。

■ソフト編■

MSP430/Energia用のRTCライブラリを使います。ライブラリ、ありがとうございます。なお、同ライブラリのライセンスはGPLです。
リンク先フランス語ですが、英語に切り替えられます。リンクからダウンロードすると、他にも面白そうなライブラリが並ぶのですが、今回はsRTCだけを使います。sRTCフォルダをEnergiaのディレクトリ下にあるLibraryに入れます。

使い方は簡単で、ヘッダをインクルードし、setup()で.begin()を呼び出し、秒単位の割り込みルーチンで秒をインクリメントします。あとは時分秒を取ってくるだけ。2秒間時計〜1秒間温度表示、を繰り返します。



あとはもういつものダイナミック点灯方式のよくあるデジタル時計ルーチンです。

以下ソースを公開しますが、ライセンスは一応GPLで。難しいことはしていませんが、ご質問いただければ喜んでお答えします。この後は、これに赤外線リモコン受光器か時刻合わせスイッチを取り付けてから、久々にプリント基板にしてみようと思います。


■使ってみて■

いやー、デカい。存在感ありすぎます。3.3vでのダイナミック駆動なのをいいことに電流制限抵抗もドライバも入れてないので少し表示が暗いのですが、ちょっと昭和の薫りがしていい感じw 昼間でも見えますし夜電灯を消すと睡眠の邪魔にならない程度の明るさで動いてくれています。何より、乱視+近視でも目を凝らさず見えるのが良いです。

ピンがあと2本空いているので照度センサと時刻合わせスイッチ(または赤外線受光器)は取り付けられるか…。プリント基板が遠のくなぁ。

■更新■

  • 2015-01-31
    コロンの出力をPWMに変更。ほどよい明るさになったけど点滅が見えてウザい

2015年1月6日火曜日

Energia + MSP430G2でのハマりポイント

そうさ、またデジタル時計さ。MSP430G2553+RTC+秋月巨大LED
小数点のポートはデバッグ用に使用中

■UART関連■

同じG2でも、UARTのTxとRxが逆になっているものがあるので気をつけましょう。2553でもRevision 1.4以前とRevision 1.5は異なります。これはLauchPad基板のジャンパで切り替えるようになっています。

Guide to the MSP430 LaunchPad (MSP-EXP430G2)

シリアルモニタでLaunchPadからSerial.write / printで出力されてくる値を見るにはTxを使うのですが、ジャンパが違っていると書き込みできません。Energiaからの書き込みは正常にできるので、てっきり正しくつながっているものと思い込んでいたら、違いましたorz

■sprintfがクラッシュ■

複雑な書式指定をするとメモリ領域がメチャメチャになってクラッシュします。小さなプログラムだと通っちゃうことが多いのですが、10KBを越えるようなプログラムで、例えば、
sprintf(buf, "%02d%02d%03d%d", h, m, t1, t2);
とやると、以下のような症状が出たりします。

  • bufに値が入らない
  • 数秒ごとに繰り返しsetupが呼び出される
  • シリアルポートが文字列の途中でぶっちぎれる
  • 一度電源引っこ抜かないとEnergiaから書き込めなくなる


解決策としては、バッファとして使うメモリにvolatile指定を行い、sprintfの書式、特に数値変換については極力単純にして、あとは(上の行と同等のことをするには):
volatile char buf[16],temp1[16], temp2[16];
sprintf((char *)temp1, "%d", 10000 + h*100 + m);
sprintf((char *)temp2, "%d", 10000 + t1*10+t2);
sprintf((char *)buf, "%s%s", (char *)temp1+1, (char *)temp2+1);
で1つにまとめます。temp1,temp2を+1しているのは最初の'1'をスキップさせる古いc言語のテクニックです(懐かしい…)。

■MSP430G2553について■

これ温度センサー内蔵なんですね。analogRead(TEMPSENSOR)使うと華氏*10で返ってくるので、楽です。ワンチップで温度計作れます。我が家の他の温度計とも誤差1度以内なので、まぁ合っているんだろうなぁ、みたいなw

で、巨大LEDですが…3.3v駆動+PWMで制御しているのをいいことに、電流制限抵抗なしでつないでます。良い子は真似してはいけません。

さて、あとはRTCとの接続か…。

一応Xtalを外付けしてオープンソースのライブラリをつかえばリアルタイムクロックとしても動くのですが、年月日まで管理してくれないのでその辺を自前で実装するのが面倒くさい。かといって、RTCについても以前RTC-8564NBをArduinoにつないだときのソースを探すのが面倒くさい。

昨日今日とsprintfで全能力を使い果たしてしまったので、まぁそのうち元気が出たら作ります。

私を何より元気にするのは現金なんすけどねw

■追記■
これをデジタル時計として動くようにしました。ソース公開してます。予定ではRTCチップを外付けする予定でしたが、水晶発信しだけ外付けして使いました。

2014年7月12日土曜日

MSP430 Launchpad + MacOS X


さて、というわけでLauchPad届きました。月曜の朝Mouser.comに注文してテキサスを発送、木曜日の昼に東京都下に届くんだから地球も小さくなったもんやで。一緒にFRDM46も届いたので、こっちも楽しみ。



LauchPadにはいくつか環境があります。純正環境はMacでは動きませんが、サードパーティなら大丈夫。Xcodeから動かすツールなどもありますが、とりあえず手っ取り早く動かしたいので、それも後回し。レジスタなどを調べるのもめんどくさいし、とにかく週末まで待たされたのだからすぐ動かしたいのが人情じゃないっすかw

まずは勝手知ったるSkitchで書くことのできるEnergiaを試してみます。ところでEnergiaって何て読むんでしょう。つい「エネルギア」って読んじゃったりするんですが@シンフォギア的な意味で 

参考にするのはこのページ(https://github.com/energia/Energia/wiki/Getting-Started)です。ここでは先にドライバ落とせって書いてあるけど、アプリ本体にドライバ入っているので次に進んで大丈夫です。

Energia本体のダウンロード。「download」から「energia-0101E0012-macosx.dmg」を落とします。ダウンロードしたら解凍します→フォルダが開きます。


Energia.appアイコンをApplicationsアイコンへドラッグ&ドロップします。そしてドライバをインストールしましょう。MSP430LPCDC 1.0.3b.pkgをダブルクリック、「開発元が未確認なのでインストールできません」が出てきたら、そこは自己責任でpkgを右クリック→開く→「未確認だけど開く」で。インストール後再起動を求められますので、他に問題ないことを確認してからクリック。

なお、Java for OS Xも必要ですので、普段インストールしていない方はこちらでどぞ(MacでのJavaのインストール方法)…EnergiaのサイトにJDKのバージョン書いてないけど、Java 7なら大丈夫、かな…。

その間に開封します。しまった、開封直後の写真を撮り忘れたw


再起動が終わったら、Energiaも起動します。懐かしいArduino IDEを赤くしたようなアプリが起動します。Macと付属のUSBケーブルで接続。さっそく赤と緑のLEDが交互に点滅します。ちょっとウザいので、LED近くのSwitch2を押すと黙ります。


さて、Getting Startedに戻ります。USBのシリアルポートを選び、ボードとチップの種類を選びます。シリアルは「Macの場合は/dev/cu.uart-XXXXを選べ。/dev/tty.uart-XXXX」はダメって書いてあるんだけど、cuが出てこねぇorz ターミナルで見ると/dev/cu.uart-C1FF4A7AB7450931ってのが出てくるんですが…とりあえずこれを選んでおきます。

ボードは当然LaunchPadですが、チップは一応LaunchPad上のMSP430を確認してください。老眼にはしんどいですが、2553がついていたので、Toolsメニューから「LauchPad w/msp430g2553」を選びます。

まずは動作テスト(上のシリアルポートのこともありますので)、手っ取り早くテンプレートを動かしてみます。 ファイル>スケッチ例>1.Basics で、Skitch Windowが開いたらUpload Buttonをクリック。赤のLEDがのーんびりと点滅を始めれば、とりあえず問題なし、ということになります。

さて、環境は整った(環境を整えるのは30分もかからないんだけど、ブログ書いたり再移動するついでにメンテしてたら2時間かかってしまった…)。次は恒例のデジタル時計を…と思ったら、ジャンパ線の在庫が足りないっぽい…。