@happytar0この広告は、90日以上更新していないブログに表示しています。2013-05-24CoreDataのFetchRequestテンプレートで配列を指定Objective-Cクライアントアプリのコード内にSQL分を書くのがどうもしっくりこないので、FetchRequestのテンプレを使うようにしている。単純なデータを格納することが多いせいか、テンプレだけで問題になったことはない。fetchRequestFromTemplateWithNameメソッドでテンプレ名とプレースホルダの変数を渡すのだけど、IN句を使う必要が出てきて少し悩んだ。いうもんなのかと思い、プレースホルダにカンマ区切りの文字列を渡してみたがエラー・・・。NSArrayをそのまま渡せばいいだけのようだ。substitutionVariables:subs];何度も使う場合、テンプレを使うことでSQL文のパース処理を省くことができるので若干高速化するようだ。21:31CoreDataのFetchRequestテンプレートで配列を指定Tweet広告を非表示にするもっと読むコメントを書く2013-05-16PSCollectionViewでハマるObjective-CPinterest風の表示にしたいと思って色々ライブラリをあさって見たところ、PSCollectionViewという便利そうなライブラリを発見した。iOS6以上であれば、UICollectionViewというそのものズバリのものがあるようだ。heightForRowAtIndexメソッドの戻り値に個々の高さを指定してやることで、高さを個別に設定することも可能だった。戻り値にCGFloatで値を返すのだけど、小数部の桁数が増えると誤差が生じて、上手くタップを認識しなくなることがあるみたい。調べてみると、セルの大きさをNSStringFromCGRectでNSString化して管理しているようだ。numberWithFloat:heightOffset]];}セルのタップは、UITapGestureRecognizerを使っているようで、shouldReceiveTouchメソッドで、どのセルがタップされたか判定して、didSelectメソッドが呼びされるようだ。heightForRowAtIndexで返される高さの小数部が増えてくると、下記のrectStringと値が一致しなくなり、タップを認識しなくなる。}}解決方法は簡単で、heightForRowAtIndexで値を返す際に、小数部が増えないようにしたり、丸めてやればいい。floorf(100.123456789f);}投稿しようとして気づいたのだけど、Objective-C(Cocoa)ネタ書いたの初めてだった。iPhoneアプリを作っていると、ブログに書くようなネタがなかなか見つからない...ちょっとググれば情報がたくさん見つかるし書くまでもないかなーとか思っちゃうせいだろうか。電子工作7セグも使うことが出来たので、次は温度センサーを使っていくことに。これで無事に温度が表示出来れば、ほぼ完成したようなものだ。温度センサーはLM60というものを使う。このセンサーには3つの足が付いていて、それぞれVs、Vout、GNDとなる。Vs(VCC)は電源、GNDにマイナスを接続すると、Voutに現在の温度を表す電圧が出力される。AVRにはA/D変換の機能が標準で付いているので、これを利用することで現在の温度を取得できる。A/D変換とはそのまんまなのだけど、アナログ値をデジタル値として変換することだ。変換するには、マイコンの変換用ポートPD0〜5を利用する。変換するために使う基準電圧は、内部基準電圧使うか、外部電圧を使うか選択できます。LM60のデータシートを見るまずはLM60の仕様を把握することにした。データシートはこちらhttp://akizukidenshi.com/download/LM60.pdf40度〜125度まで測定出来るらしく、DCオフセット424mV、6.25mV/°Cということらしい。使用する電圧の範囲は174mV〜1205mVとなる。基準電圧は出力される電圧以上なければいけないので、1.1Vだと以下になる。内部基準電圧だと108度くらいまでしか計測出来ないが、今回は良しとした。(108度を越える環境で使わないし...)A/D変換を使って温度を取得まず配線は、マイコンのAREFとGND間に0.1μFのコンデンサ、GNDとAVCCは電源に接続する。PC0には温度センサーのVoutを接続する。続いてコードだが、A/D変換を利用するには、ADMUXとADCSRA、ADCH、ADCLレジスタなどを使う。ADMUXの7ビットと6ビット目で基準電圧を指定する。両方「1」にすることで内部基準電圧となる。5ビット目は、左揃えにするか右揃えにするかという設定だが、これは取得できる電圧が0〜1023の10ビットの値なので、レジスタ2つ分使うことになる。その際に上位ビットをどのように格納するかの設定が、この5ビット目になる。0〜4ビット目は接続しているポートを表すビットを指定する。ADCLは変換した値の下位ビット、ADCHは上位ビットになる。ADCSRAで実際にA/D変換を有効にする設定だ。詳しくは下記のサイトを見るのが手っ取り早いかもしれない。変換でボリューム(可変抵抗)値を読む変換される電圧は前述した通り、0〜1023の範囲で変換されて返される。174mV〜1205mVを1.1Vの基準電圧を使って、0〜1023の範囲で変換されて返されるのだけど、この精度のことを分解能と言うらしい。0.002基準となる電圧によって精度も変わってくるようだ。A/D変換された値を使って温度を求める計算式は下記のようになる。18.0975度あとは計算して出てきた値を7セグへ表示するだけだ。無事に成功!実はドハマリしてたなぜか上手く温度が取得出来なくて、あーだこーだと試行錯誤していた。原因はマイコン右側ポートのAVCCとGNDを接続していなかったことだ。内部基準電圧を使うから必要ないと思っていたが、内部基準電圧はAVCCとGNDから確保されるらしい...。記事で1桁の7セグ表示することができたので、今回は3桁点灯させてみることにした。3桁点灯させるにはトランジスタが必要ということで、いよいよトランジスタを使うことになる。ここでトランジスタやダイナミックドライブについて調べていくと、ATMEGA328PのI/Oピンは最大40mAなので、カソードコモンをマイコンに接続すると最大電流量を越えてしまうようだ。各セグメント10mAで8本、合計80mA流すと、カソード側が80mAになる。これを回避するためにトランジスタを使うらしく、少ない電流から大きい電流に増幅出来るので、最大40mAを超えないで制御できるそうだ。トランジスタを使うとにかくトランジスタを使ってみることにした。使うトランジスタはNPN型の2SC1815GRというものだ。他にPNP型というものもあるようだけど、今回はカソードコモンの7セグなので出番はないようだ。トランジスタには、コレクタ、ベース、エミッタという3本の足があり、ベースに電流を流すことで、エミッタに増幅された電流が流れていくらしい。この増幅率をhFEというようだ。エミッタを7セグのコモン端子に繋ぎ、ベースにマイコンのPB0〜2ポートへと繋ぐ。エミッタとベース間には安定化させるための抵抗10kΩ、ベースとマイコンポート間には4.7kΩを繋ぐ。以前にすでに計算しているのだけど、マイコンとトランジスタ間に繋ぐ電流制限抵抗値は、以下のようにして計算した。このトランジスタの電流増幅率(hFE)は100で、トランジスタを通すことによって0.7Vほど電圧降下がすることを考慮して、以下ように計算した。4.3kΩ4.3kΩに近い4.7kΩの抵抗を使うこととした。ダイナミックドライブさせる3桁の7セグを高速で切り替えることで、3桁とも点灯しているように見せるのが、ダイナミックドライブ(ダイナミック点灯)と言うらしい。表示する桁のポートにビットを立てながら切り替えるだけなので、コードはさほど難しくなかった。下記のように関数を作って、表示したい桁と数字(ドットなど)を指定できるようにした。}}3桁順番に数字などを表示させてみた。配線が汚くて恥ずかしい...。04:477セグLEDの3桁表示に挑戦Tweet広告を非表示にするもっと読むコメントを書く2012-12-277セグLEDを使う電子工作いよいよ7セグLEDを使う時がきた。7セグLEDを使えば、0から9までの数字(あとドット)を表示させることができるのだ!温度計には無くなてはならないものと言っていい。購入した7セグLEDは、赤色で3桁表示するもので、C-533SRという型のものだ。ネット通販7セグには足が12本付いていて、どこから手を付けていいか全くわからない。今回はこんな流れでやってみようと計画を立てる。7セグの各配線の意味を調べる1セグメント点灯させてみるマイコンから数字を表示させてみる7セグの足(各配線)はどうなっているのか3桁表示できる7セグなので3つの7セグがくっついている。各配線の意味を調べるためにデータシートを見てみることにした。http://akizukidenshi.com/download/ds/paralight/C-533SR.pdf分かるような分からないような...集中して何度も確認してみた。各セグメント(数字を構成する各LED)ごとに、AからGまでのアルファベットが割り当てられている。そのアルファベットの下には数字が書いてあるので、配線の順番ということだろう。アルファベットを各配線に割り当てるとこうなる。1セグメント点灯させる続いて1セグメントだけ点灯させてみることにした。図でいうと左上の「F」の箇所だ。ちなみに、DIG1〜3にはカソードコモンなのでGNDを接続する。データシートを見るとVf1.8〜2.2で、最大20mAまで流せるようだ。以前と同じ240Ωの抵抗をそのまま使うことにした。無事に左上が点灯したところマイコンから数字を表示させる次はマイコンに接続し、数字を表示させることにした。ここからが勝負の時だ...。トランジスタを間に挟んで接続する予定だったが、とりあえず動作確認のためにマイコンと一桁(8本)直結させることにした。ATMEGA328Pの最大電流量は200mAなので、各セグメントに10mAずつ流しても十分に足りると考えた。マイコンには、PB0〜7まで各セグメントA〜Gを接続。することでマイコンから制御する際に分かりやすくなるとのこと。指定セグメントを点灯させるには、LEDと同じように指定ポートのビットを立てるだけだ。GitHub無事に数字を表示させることができた。数字を表示させただけでも嬉しくなってしまった。たいした事をしてなくてもその気になってしまうのだから危険だ。トランジスタと温度センサーの出番なので気は抜けない。01:407セグLEDを使うTweet広告を非表示にするもっと読むコメントを書く2012-12-26ATMEGA328Pを使う電子工作LED点灯を試すためにATTINY2313を一番最初に買ったのだけど、7セグLEDを使うためには少しポート数が足りなくなってきた。思い切ってATMEGA328Pを買うことにした。単純にATTINYと置き換えればいいと思っていたがそうは問屋が卸さない。割り当てられているポートの順番なども違うようで、ATTINYと比べながら置き換えていく必要があるようだ。流れとしてはこんな感じだ。三端子レギュレータを使って5V降圧した電源を使うATMEGAにプログラマを接続して認識させる以前作ったLED点灯回路・プログラムをそのまま流用し、動作を確認するプログラマとATMEGAを接続する各ポートに接続する配線については、以前に接続したことがあるATTINYを参考にした。下記のサイトも見ながら試行錯誤してみた。始めるAVR各ポートの用途はデータシートを参考に。http://akizukidenshi.com/download/mcu/avr/attiny2313.pdfhttp://akizukidenshi.com/download/mcu/avr/atmega48-88-168-328_A_P_PA.pdf結果的には、こんな感じで接続してみると上手く認識させることができた。ATMEGAでLEDを点灯させてみる試しに以前作った2つのLEDを交互に点灯させる回路を組んでみることにした。PD3とPD4それぞれにLEDと抵抗を接続した。プログラムもそのまま同じもので問題ないのだが、コンパイルする際にATMEGA用に一部Makefileの書き換えが必要になる。こんな感じでMakefileをATMEGA328P用に書き換えた。フタなしカンヅメ無事に点灯したところ三端子レギュレータの問題が解決してからはスムーズに進んで気持ちがいい。次はいよいよ7セグLEDを使うことになるので、わくわくが止まらない。意を決してマイコンいじってみることにした。今まで電池ボックスを利用していた箇所をACアダプタから電源を確保することにした。三端子レギュレータを使ってみたかったのが理由だ。12Vではマイコンに繋ぐことができないので、5Vほどに降圧する必要がある。三端子レギュレータはLM7805CVを利用する。これはかなりメジャーなものでよく使われるものらしい。秋月電子で販売されている「ブレッドボード用DCジャックDIP化キット」を使うことにした。ブレッドボード用DCジャックDIP化キットを組み立てるこのキットには、DCジャック、ブレッドボードに挿すための足、基盤が付属されている。半田を使って組み立てる必要があるようだ。半田ごてを使うのは久しぶりな上に、半田する箇所が小さかったので緊張したのだけど、あっさりできた。半田した後に基盤を上下逆にしていたことに気づく...これが後々悩む理由になるとは。本当ならばプラスとマイナスが印刷されている面を上にした方がいい。三端子レギュレータを使って5Vに降圧ACアダプタをブレッドボードに挿した後、テスターを使い12Vが出ていることを確認した。三端子レギュレータの出番だ。型番が印刷されている方を前面と見て、左がIN(12V)、中央がGND、右がOUT(5V)ということらしい。発振を防ぐために、INとGND間に積層コンデンサ0.33μF、GNDとOUT間に0.1μFを接続する。しながらOUTの5Vをテスターで計測してみる...ん?5Vになってないどころか電圧がふらふらしている。三端子レギュレータが異常な熱を帯びていて持てないくらいだ。コンデンサの繋ぎ方が悪いのかと、繋げ方を変えてみるが変化なし。数日悩んだところで、お手上げ状態なのでマイコン先生に聞いて見ることにした。三端子レギュレータの謎が解ける先生に状況を説明している段階で、あることにふと気づいた。ACアダプタの基盤を逆に半田付けしていたことだ。そのせいで、プラスとマイナスも逆転していたらしい。なんと、INにマイナス、中央にプラスを接続していたのだ...。話を聞いたところ、これはかなり危ないミスらしい。三端子レギュレータの異常な熱の原因も分かった。プラマイ逆にしたところ、無事に5Vにすることができた。テスターで12V測れていたのだろうと考えたところ、よくよく見るとテスターの左側に「-」の記号が...どうやら「-12V」と表示されていたことに気づかなかったようだ。今回はソフトのようにエラーコードを吐かないハードの難しさを思い知ることとなった。慎重に進めていきたいと思う。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。