Categoryマイコン

mbed HRM1017で忘れ物防止デバイスを作った話

この記事はmbed Advent Calendar 2016の17日目の記事です。

mbed Advent Calendar 2016 – Adventar


mbed祭り2016 @秋の虎ノ門

2ヶ月ほど前になりますが、mbed祭りで5分間のLT枠をいただき、mbedで作った忘れ物防止デバイスについて話してきました。似たような時間制限のあるプレゼンは何回かやったことはありますが、大勢(しかもほとんど知らない人)の前で話す機会はあまりないので、できてよかったと思います。
また、気がついたらTwitterに写真を上げられていたので初めてTwitter上で顔を晒すことになりましたw

LT用のスライドはdeveloper.mbed.orgに置いてあります。下記ページからpdfでダウンロードできます。

mbed祭り2016 @秋の虎ノ門 「mbed HRM1017で忘れ物防止デバイスを作った話」LT

忘れ物防止デバイス

ここからは作品の紹介です。スライドよりも少し詳しく書いていきます。

一言で言うと、「忘れ物を音や光、スマホの通知で教えてくれる」デバイスです。
忘れそうなものに取り付ける「タグ」とAndroidスマートフォンにインストールするアプリの二つで構成されています。

忘れ物防止デバイス - タグ

忘れ物防止デバイス – タグ

忘れ物防止デバイス - Androidアプリ

忘れ物防止デバイス – Androidアプリ

基板上にジャンパが飛ばしてあるのは気にしないでください。電源線を1本わすれていただけです…

ハードウェアの話

この記事ではハードウェア側を詳しく書いていきます。mbedアドベントカレンダーだから、と言うこともありますが、実際はチーム開発なのでAndroid側をほとんど触っていないからと言う理由が大きいです。

チーム開発なのでハードのことしかわかりません - LT資料10ページ目より

チーム開発なのでハードのことしかわかりません – LT資料10ページ目より

電池持ちを良くする

このデバイスは電池で動くものなのでやはり電池持ちは良くないと困ります。電池持ちを良くするためには、マイコンやRF回路など電力を食うものをできるだけ寝かしておくことも必要ですが、電池から効率よく必要な電源を生成することも必要です。

マイコンやRF回路をいかにスリープにして電力を抑えるか、という話はFirmware側なので置いておいて(友人に任せていたので本当にわからん)、電源回路の話をします。

HRM1017はLDOモードです - LT資料11ページ目より

HRM1017はLDOモードです – LT資料11ページ目より

まず前提として、HRM1017の内部のSoCであるnRF51822のコアは1.8Vで動作します。外部から供給する電源は3.3Vがほとんどですので、その場合は内蔵のLDOレギュレータやDC/DCコンバータで1.8Vを作っています。

これを見分けるにはmbed-srcから該当するコードを探せばいいのですが、めんどくさいので簡単な実験を行いました。電流を測定しながら3.3Vから徐々に電圧を落としていくというものです。LDOモードなら電流は変化せず、DC/DCモードなら電流は大きくなっていくことが考えられますが、実験では電流が変化しないことが確認できた(具体的なデータは取っていないです)のでLDOモードであると判定しました。

LDOモードであるとわかったので、電源は外部で1.8Vを生成して供給することにしました。リポ電池から1.8Vを生成するDC/DCコンバータ回路です。上のタグの写真のUSBコネクタとHRM1017の間にあるインダクタやICがその回路になります。

ピンヘッダなしでの書き込み

完成品はできるだけ小さくしたいと考えていたので、プログラム書き込み用のピンヘッダは邪魔だと思いました。書き込み用ピンヘッダを取り除くためには、あらかじめマイコンにプログラムを書き込んでおいて実装するという方法もありますが、HRM1017はBGAなのでそれも難しいです。さらに、その方法だと一度実装してしまうと書き換えが難しくなってしまいます。

そこで、今回は基板側にパッドを設けて、そこにポゴピンを押し付ける方法を採用しました。今回使用したポゴピンはAitendoで売っているテストプローブ [AKI-P50D2]です。

ポゴピンを利用したライタ

ポゴピンを利用したライタ

3Dプリンタで出力した枠によって、ポゴピンがパッドに正確に押し付けられるようになっています。USBコネクタ等を考慮するのを忘れていたので半田ごてで融かして削っています…

タグへの書き込みの様子

タグへの書き込みの様子

作って書き込みした後に気づいたのですが、BLE経由でOTA-DFUできるので書き込み用治具の出番はあまりなかったのかもしれません。でも、UARTも引き出してあったのでデバッグには役に立っていたみたいです(自分はFirmware書いてないのでデバッグしてない)。

そのほか細かい話

  • この作品でYahoo!JAPANと我が東京高専が主催のHACK U 東京高専で技術賞を頂きました。副賞がTポイント5,000円分!
  • 電池持ちについて上で熱く語っていましたが、実際にどれくらい電池が持つのかどうかは測定していません。HACK Uまで時間がなかったのでそんなことやってられなかった()
  • 記事の最初で引用している、mbed祭り実行委員会さんのツイートですが、「ぐり」の顔が写っているということで、他のツイートより伸びてます。つらい。
  • 顔をフリー素材化・オープンソース化されそうになりましたが、GPLライセンスであると宣言しました。クソコラを作ったら、商用非商用問わず(非商用でお願いします)GPLライセンスを継承し、公開してください。今のところクソコラはありません。作らないでください。

最後に

半分有益、半分無駄、といった感じの内容でしたが、どなたかの電子工作等の役に立てたらいいなと思います。この「忘れ物防止デバイス」は1年前ぐらいに作ったものです。今はHRM1017単体は出回ってないみたいですね。

最後までお読み頂きありがとうございます。明日はen129さんです。期待しています。

オーブントースターを改造したリフロー炉を製作中(1)

こんにちは、NT京都2016に出展応募したぐりです。

さて、今、学校でオーブントースターを改造したリフロー炉を製作しています。リフロー炉の製作はメインでやっているわけではなく、同じく学校のあるチームで開発しているブツの製造のために仕方なくやっている、といった感じです。そのブツにはBGAの部品があり、手はんだできないということで、先生を説得(?)して製作してます。

今回はSwitch Scienceさんが業務でも利用しているというオーブントースターリフロー炉を参考(というか、パクリ?)にして製作しています。本当は時間に余裕があればもう少ししっかり検討してから開発したいんですがね・・・。

主な部品

  • オーブントースター
    • パナソニック オーブントースター ダークメタリック NT-T500-K

[amazonjs asin=”B00O5WWZU2″ locale=”JP” title=”パナソニック オーブントースター ダークメタリック NT-T500-K”]

ハードウェア

Switch Scienceさんで実際に製作した際の例をもとにオーブントースター、SSR等を入手しました。コントローラはArduino互換機(一番近いのはPro nanoかな?)で3.3V 8MHz動作のATmega328P-AU、ディスプレイは20列4行のそこそこ大きいもの(バックライト付きだけど非点灯な回路)、温度測定は熱電対(K型?)、電源制御は先ほど挙げたSSRを2つ(上下のヒーターにそれぞれ)使用してます。Arduinoを卒業してmbedに移行したと(脳内で)宣言していた自分としては不本意なArduino復帰となりましたorz。

ちなみに、操作用にタクトスイッチを2つ増設しています。

本体が学校なので写真はまた今度。

ソフトウェア

こちらもSwitch Scienceさんがgithubで公開しているものを・・・と思いましたが、ゼロから自力で書けって(自分が)うるさかったので(ライブラリを除いて)ほぼ自作です。「ほぼ」っていうのは熱電対から温度を取得するルーチンだけ流用したからです。

主な仕様(予定)は以下の通り

  • プロファイルは2つから選択
  • PCでプロファイルを作成し、転送してEEPROMに書き込める
  • PCで温度のグラフを出力できる
  • ヒーターはPID制御(したい)
  • PID制御の係数(Kp, Ki, Kd)の自動チューニング(したい)

上の3つはほぼ実装済み、PIDの自動チューニングは少し厳しいため、自力チューニングしているところです。ここで実際のグラフを見せたいところですが、編集する気力がないのと文字数が増えてきたので、また次回。

ソースコードは現時点で800行。まだまだ少ないですね。プログラムメモリは半分程度埋まっています。

数日後には運用しないといけないのでそのころまでには次を書きますね。

 

ちなみに、前記事のブルースクリーン、今のところ再発していません。やったね。

2016年2月14日 01:10 公開
2016年2月14日 14:21 リンクを追加

aitendoで特価1000円だったTFTモジュールを試食1

こんにちは、ぐりです。前回、iPhone5sを脱獄しましたけど、入獄しました。修理してもらいました。入獄してればわからないんですかね。というわけで、入獄生活を送ってますが、意外と不自由じゃなかったり。

さて、8/1(金)に雑学追究室のやつらが浜松からわざわざ東京に遊びに来たので、テスト期間中で結構やばいぐりも午後から合流しました。アルバイトの給料も入ったので、せっかくだからARMマイコンに手を出してみようと思ったので、秋月電子通商でLPC1769評価ボードを買ってきました。

LPC1769

こいつ、なかなかすごくて、秋月で3000円なのに、いろんなインターフェースがついてて面白いんです。例えば、Ethernet。秋月のパルストランス内蔵のRJ-45ジャックを配線するだけで、Ethernetに接続できちゃいます。外付け部品は一切不要。さっそく、サンプルプログラムを動かしてみましたが、DHCPクライアントとかも動かせるようで、IoTなものづくりで重宝しそうです。これからは、AVRと並行して、ARMのほうもいじっていきます。

そして、雑追の馬(通称、雑学追究室K)がAitendoに行ってみたいとか言い出したので、勘を頼りにAitendoに向かいました。俺以外Aitendoに行ったことがなかったみたいで、しかも、勘で進むから心配だったみたいです。Aitendoの直営店は、現在、新店舗を作っている最中であり、旧店舗になる直営店では、在庫処分のセールが行われてました。非常に魅力的なものが50%オフでかなりお得だったので、ついついいろいろ買ってしまいましたw

その中の1つが、今回取り上げるTFT液晶モジュールです。こいつは定価1980円ぐらいのところ、セールで1000円で買えました。Kとかも買ってたと思うよ。240x320pixelのQVGAで、画面サイズは2.4inch、タッチパネルとSDカードスロットもついていたので、これは買うしかない!と思って買ってしまいました。型番は、M024C9320TPで、液晶のコントローラはILI9320がのってる、と書いてありました。

ARMマイコンにもなれ、手元にあった7segLEDでGPIOの操作の方法をつかんだら、さっそくつないでみることにしました。が、やっぱり、データシートは英語なんですね。英語のデータシートは読めなくはないですが、ちょっと読んでると飽きてきちゃったりするんで、精神的にはあまりよくなかったりします。いろいろなサイトからサンプルプログラムをかき集め、最初にDeviceCodeを読み取ってみることにしました。

ILI9320のDeviceCodeは0x9320です。もちろん、その値が読み取れることを期待して、プログラムを書きましたが、何と、取得できた値は、0x1505でした。あれ、って思ったので、ビット列を並び替えてみたりしましたが、絶対に合わないんです。そして、0x1505で検索してみたら、ありました。ルネサス社のR61505Uというコントローラです。なんだよ、Aitendoのホームページに嘘書いてあるじゃん、とか思いましたが、調べてみると、ILI9320と一部互換性がある、ということでした。一部といわれても、どの部分かわからないので、しっかり、R61505Uって書いておいてほしかったですね。

というわけで、その型番でサンプルプログラムを探し、それを写すように初期化ルーチンを書いてみましたけど、うまくいってるのか、わからないです。ロジアナがあれば、どういうデータが流れてるか一目でわかるんだけどな。まあ、初期化しただけじゃ目立った表示の変化はないので、もしかしたら、初期化がうまくいってるのかもしれないですけど、黒く塗りつぶす処理がうまくいってないので、どっちにしろ駄目なんです。誰か、LPC1769のサンプル持ってたらください。一度も触ったことないPICのソースを勘で読んでみたりしても、よくわからんレジスタに書き込んでたりするんで、お手上げです。データシート見ろよってことなんでしょうけど。

相変わらず、進捗のほうはダメダメです。液晶のほう、進捗があったら、2として更新したいですけど、更新できるのかな。クロックが早すぎて追いついてないんじゃない?っていうことも思ったので、Arduinoでも試してみるかもしれません。では、よい進捗を願って。

最後まで読んでいただきありがとうございました。何か情報があったらコメントください。

【AVR】_delay_ms()がうまく動かない?

AVRで工作していると、1秒待って欲しいって思うときにディレイ関数を使いたくなります。そのノリで使っていたら、100msと指定していたのに10秒以上待たされるという現象が起きました。なぜでしょう。

まずはじめに疑ったのは、クロック周波数です。_delay_ms()関数では指定された時間とクロック周波数から計算されたサイクル数、待つという実装がされています。つまり、クロック周波数が違えば指定した時間通りに動いてくれません。

というわけでクロック周波数を確認しました。筆者が今回使っていたAVRはATmega328Pです。内蔵RC発信器からの8MHzで動作させています。Hzで書くと8,000,000Hzになります。周波数の指定は、F_CPUで定義することでできます。この場合は、

[code lang=”cpp” highlight=”1″]
#define F_CPU 8000000UL

int main(void){
_delay_ms(100);

return 0;
}

[/code]

このように8,000,000Hzである、と宣言します。最後のULはunsigned Long型の定数であると指定するためのものです。8,000,000という値はintの範囲(-32768~32767)を超えているので、これがないと溢れてしまいます。
今回は正しく定義されていたので別の問題である、ということで考えうる他の原因を考えました。

次に疑ったのは、_delay_ms()関数が引数として取りうる値が制限されていることです。調べてみると過去のバージョンのことで当てはまりませんので割愛します。

最終的に考えたことは、_delay_ms()関数は使ってはいけないのではないかということです。つまり、_delay_ms()関数を使っても正確に測ることは不可能な場合があるということです。
それは割り込みを使った時です。

考えてみればわかるのですが、時間から求めた回数だけ「何もしない」を繰り返しているわけです。その間に割り込みが発生してしまえばおかしくなるのはすぐに分かります。

というわけで、原因が割り込みであるというところまでは確認をしていませんが、LEDのダイナミック・ドライブでタイマー割り込みを積極的に利用しているのでこれが原因であるということで間違いないと思います。どのよう解決するかはまたどこかで書こうと思います。

ATmega328PからSC1602互換LCDを使ってみる。1

久しぶりです。ぐりです。
今回は、マルツでSC1602互換のTC1602E-06TというLCDを買ってきたので、AVRから使えるようにしてみたいと思います。

LCDの仕様

このLCDは、ずっと言ってきたとおり、秋月等で売られているSC1602と互換性があるので、SC1602のライブラリをそのまま流用することができます。

マルツで買った液晶

マルツで買った液晶

電源はDC5Vのみ、5×7ドット構成の文字が16桁、2行表示できます。
また、黄緑色のバックライトを搭載しています。

バックライトだけ点灯。

バックライトだけ点灯。

制御方法

I2CとかSPIとか少ない線でつなぐことができるシリアルインターフェイスではなく、8bit幅の普通のパラレルインターフェースみたいです。しかし、コマンドを送信することで、4bitモードに切り替えることができ、2回に分けて8bit分送信するという手間がかかる代わりに、I/Oが節約できるというメリットが有ります。

今回は、4bitモードでArduinoでも使われているATmega328Pから使ってみたいと思います。

配線してみた。

配線してみた。

写真右上のブレッドボードに刺さっている3本の抵抗は、コントラスト用に手持ちの1kΩを直列に3kΩにしてます。これでも悪く無い。

AVR-LCD間の配線は、PORTC(ArduinoのAnalogIN)と、PORTBの1番の7本を使いました(と言うか、サンプル通り)。

RS(レジスタセレクト)、R/W(読み込み・書き込み)、E(イネーブル信号)、DB4~7(データ4bit)文を接続し、使わないDB0~3はオープンにしました。

バックライトLED用の電源は、ICのVDD,VSSからとるように、はんだジャンパをしました。

JP2とJP3をショートさせてあります。

JP2とJP3をショートさせてあります。

次回、表示させてみたいと思います。(上の写真は表示されてますが・・・)

おまけ

12Vを直にかけたため死んでしまったAVR。"died"と書いておいた。

12Vを直にかけたため死んでしまったAVR。”died”と書いておいた。