免責事項

注意、免責事項について
・高電圧、大電流その他高エネルギを扱う実験を行う際にはくれぐれも安全に配慮し、細心の注意を払って行うようにしてください。
・当ブログの記事を参考にして発生した損害についてFEL研究室はいかなる責任も負えませんでご了承ください。

2016年11月18日金曜日

I2C機能が無いAVRで秋月のLCDを動かす

KKTです…。まさかの連続更新です。
最近マイコンいじりたい欲が出てきているので今回もAVRの記事です。
毎度毎度次回予告から外れているのですが、今回は予告通りI2Cと液晶の記事を書きます。

急にLCDがいじりたくなったのですが、僕がよく使うATtiny13AではI2Cの液晶以外はピン数の関係で接続できません。しかし、ATtiny13AにはI2C機能はありません。
ということで、まずI2Cの仕組みを理解してから、アセンブラで同じ機能を実装することにします。I2Cの説明はggればいくらでも出てくるので割愛しまして、具体的にマイコンにやらせることをメモ的に書いていきます。使用したのは秋月のこの液晶です。

・ピンの設定
I2Cにはマスタとスレーブなるものがありまして、マスタが通信を統括して、スレーブはそれに従うというルールがあります。データの送受信はマスタスレーブ無関係ですので、マスタがデータを読みたいと言えばスレーブは送信を開始しますし、マスタがこれを読めと言えばスレーブはデータを受信します。
I2Cにはクロスストレッチ(クロックストレッチでした)なるものが存在していて、本来通信は全てマスタの言う通りに進めないといけないところ、どうしてもスレーブが忙しい時や送受信データを処理している時には、スレーブがクロックをLowレベルに固定してマスタを待たせることができるという機能です。
ということは、I2Cの信号ラインはLowレベルかHiインピーダンスの二通りということになります。AVRのピン設定では、Lowは出力ピンモードで、Hiインピーダンスは入力ピンモードにすればそれぞれ設定可能です。要はオープンコレクタ/ドレインみたいになれば良いということです。以下Hiインピーダンス状態をHi、LowはそのままLowと記述します。

・スタートコンディション
まずI2Cの信号ラインは何も無い時はクロック、データともHiで待機します。次にマスタとして通信を開始したいデバイスがデータをLowにしてからクロックをLowにします。
簡単ですね。ちなみにデータをLowにしてからどれくらいの時間待ってからクロックをLowにすれば良いというのは各デバイスのデータシートに書いてあると思います。

・ストップコンディション
スタートコンディション同様通信の終了も同じようなのがあります。今度はクロックをHiにしてからデータをHiにします。
簡単ですね。これに関する時間もデータシートにあると思います。

以上をアセンブラで実装するのはまぁ簡単ですね。I/Oレジスタのbit操作だけでできます。続いてデータ関連の話です。

・スレーブアドレス送信
通信がスタートされたら、まず最初にマスタが誰を相手にするか、というのを送信します。I2Cはマスタに対して複数のスレーブが存在することができますが、同時に通信できるのは1人なのでまず誰と通信するかを指定します。誰を差すのがスレーブアドレスと呼ばれる7bitのデータです。デバイスごとに固有の値が振られていて、これもデータシートに記載されています。そして、実際にデータを送信する時は、この7bitのデータの後に更にもう1bit加えて合計8bitのデータをまず最初に送信します。スレーブアドレスの尻尾に付け足した1bitはマスタが受信するか、送信するかの指定に使用します。RWなどと呼ばれているbitでマスタが送信なら0、マスタが受信なら1を書かれます。
後術しますがこの操作で呼ばれたスレーブは「いますよ」を返します。
上の図ではスレーブアドレスとして「0111110」を、RWのbitは「0」を送信しています(この液晶は読み出しは出来ないようです)。ですからデータはRW→スレーブアドレス0bit→スレーブアドレス1bit…というように下位から順番に送られていいきます。アセンブラの操作では、まずレシスタにスレーブアドレスにRWを加えた8bitデータを入れて、それを左シフトさせて順番にクロックに乗せていくという感じでしょうか。

実際に信号の波形を見てみるとこんな感じになります。
上がデータ、下がクロックです。手書き図同様0x7C(01111100)を送信しています。クロックがHiのときにはデータを変化させてはいけないので(→スタートコンディションになってしまう)注意しましょう。

・Acknowledge
ACK、アク、アクナレッジなどとも呼ばれます。認めるみたいな意味の英単語ですが、このbitはマスタ又はスレーブが発行する「正常にデータを受信しました」のしるしですね。最初スレーブを呼ぶときには「いますよ」のようなものです。実際にどのようにACKを出すのかというと先程の図の続きで見てみましょう。
詳細は省いてますがこんな感じになります。マスタ側はACKを確認するために、第7クロックを出し終えたらデータ線をHiにしておきます。もしスレーブが正常にデータを受信していたら、データ線をLowにし異常ならHiのままにします。よってプルアップのデータバスなのでLowが優先され、正常に受信出来ていていたらLow、異常ならHiということになります。ここでマスタが第8クロック目を立ち上げてACKを読みます。つまりマスタ側は第8クロックを立ち上げてLowなら正常、Hiなら異常とわかるわけです。この動作は8bit(モードによっては10bit)のデータを受信したらマスタ、スレーブ関わらず必ず行われます。実際にACKが返ってきている様子を以下に。
最後のチョンと出ているのがACKですね(ホントは出ない方が良いと思う)。最後のクロックの立ち上がりできちんとLowになっています。スレーブのLowはマイコンのポートほどシンク電流が流せないようで若干電圧が残っていますが許容内ですので問題ありません。最後のクロックの立ち下がりでデータがピョコっと跳ね上がっているのは、スレーブが「もういいかな」と思ってLowをやめたからだと思います。なおACKを確認した後はクロックをLow→データをLowにして待機させましょう。ACKを確認できなかったらこれから送信するデータ等も意味を成さないのでエラー表示するなりなんなりしましょう。実は最初に貼ったオシロのキャプチャと同じのを送信しているのですが、最初のはスレーブを繋がず、こちらはスレーブを繋いで撮影しました。
今回は省きますが、スレーブのプログラミングをする時は、スレーブアドレスと称号して合ってたらACKを出す、間違ってたら出さないというようにすれば良いと思います。その後のデータのやり取りでは、単にクロックを数えてちゃんと8クロック来てたらACKを出すようにすれば良いんじゃ無いかと思います。

・コントロールバイト
ここからは通信するデバイスによりますが、冒頭で書いた秋月のLCD準拠で説明します。LCDに送るデータには実際に表示させる文字データの他に、コントラストの設定値やDRAMアドレスの指定などがあります。これらを単に送るだけでは表示させたら良いのかコントラストの設定値に使えば良いのかわかりませんのでコントロールバイトというのを送ってから、データを送ります。コントロールバイトでは「この次に送るデータが(コマンド/DRAMアドレス/表示させるデータ)ですよ」というのを指定します。データシートを読むと書いてありますが、単一コマンドを送る前は「0x00」、連続コマンドを送る前は「0x80」、データを送る前は「0x40」を送ります。
もう少し詳しく書くと、コントロールバイトの次に送るデータをデータバイトと言って、さらにこのコントールバイトとデータバイトをまとめて「コントロールワード」と呼びます。つまり単一コマンド(=データバイトに書く)を送る場合は、0x00→任意のコマンドとなります。連続して送る場合は、0x80→任意のコマンド→0x80→任意のコマンド→0x80→任意のコマンド→…→0x00→任意のコマンド でおしまいとなります。要はコマンドワードを繰り返すかという感じです。この辺はよく分からなくてちょっと悩みましたね。

・データバイト
8bitのコントールバイトを送信し終わったら次はコマンドや文字データ等のデータビットを送信します。これと言った注意は無いです。

・初期化について
LCDのデータシートを見ると初期化処理は大体載っているのでこの通りすれば問題なく表示できます。しかし、僕がデータシート通りにやったところ、LCDのコントラストが異常に高く画面が■で埋められて文字が読めませんでした。色々いじっているとどうやら「Follower control」の値「6C」を「69」に変更することで解決しました。取り敢えず治りましたがよくわかりません。

他にも機能としてはCGRAMなどがあるのですが、まだやっていないのでよくわかりません。

ソースは縦に長いのでこちらのページに記載しました。興味のある方は御覧ください。
原理がわかれば処理自体は簡単ですので大したことは無いですが、待ち時間とかクッソ適当なのでもし参考にされる場合はご注意ください。あらぬところへジャンプしたり読みにくいですが、バグ等有りましたら報告していただけると助かります。
アセンブラの練習用にプログラム領域にデータ置いたりしてるのでたぶんまた解説記事を書くと思います。なんとなくコメントは書いてありますがあんまり真剣に見ないようお願い致します。

ちなみに上記のソースは実行するとこうなります。

Web拍手反応(もう届いているのか…(うれしい))
>おぱっい
プルンプルン!!

>◯◯たです
どう?


それでは、今日はこの辺で。

http://clap.webclap.com/clap.php?id=fellabo

11/26追記:誤字を修正 参考リンクを貼り忘れていたので貼っておきます。
 I2C通信の使い方:http://www.picfun.com/c15.html

2016年11月17日木曜日

AVR書き込み冶具を作ってみる

KKTと申します。
定期的に更新するのは難しいですね。
続きがあるっぽい記事をかなり放置していますがまた真新しいことを書きます。

今回は題名通りAVRマイコンを使う時の書き込み冶具を作ります。
今までは、ブレッドボードとかとArduinoを適当に配線して書き込んでいましたが、なんとなく取り回しとかが気に食わないのとマイコンを変えるたびに配線をいちいち差し替えないといけないのが面倒なのでZIFソケット(ワンタッチでIC外したりできるやつ↓)
こういう奴です。これで書き込んですぐ外して基板に付けたりできると便利じゃないかと。

で、できたのがこれ。
 一応ボード上で簡単な動作確認ができるように圧電素子スピーカとLED、セラロックと電源ラインくらいは付けてみました。チップによって書き込みに使う端子の場所がバラバラなのでチップによって右の方のコネクタの位置を変えないといけません。6pinのピンヘッダがそうです。上からATtiny13,AT90s2313,ATmega88系となっています。クロックを自分で生成できない子もいるのでセラロックを接続できるようにしています。
お気づきかもわかりませんが、使用しているカラフルなケーブルは8本線が出ているのに対し、ピンヘッダは6pinです。これでは挿し間違いが起きる可能性大です。対策として
コネクタの穴を半田で塞ぎました。これでコネクタの向きも含めて常識的な方向で挿せば動作するという感じになりました。

Arduinoと接続している様子。
そこそこ使いやすかなぁといったところです。

しかし、このボードを作っていざ書き込みテストを行ったところ、全く書き込めません。
どうやらArduinoのICSPピンからちゃんと信号が来ていないようです。
調べていくと、ICSP書き込みする際にターゲットのマイコンのリセット端子はArduinoのディジタル10番ピンに繋がないといけないのですが、Arduino側のリセットに繋がっています。これではいかんのでArduinoを少し改造しました。
PEWで直接10番ピンにバイパスさせます。

元のリセットと繋がったままだとまずいので、パターンもカットします。
最初間違えて手前のパターンをカットしてしまい(カットすべきは奥のピン)焦りましたが大丈夫なようです。

動きました。
使用した青LEDはおずやで分けて頂いたものです。感謝しています。

ついでに、ソフト側も少し使いやすくしてみましょう。
僕は最近までAVRStudioから出てきたhexファイルをコマンドプロンプトからいちいち指定してAVRdudeから書き込んでいたのですが、バッチファイルを使うと幾分楽に書き込めるみたいです。
メモ帳を開いて下のような文字を打って、保存する時拡張子を.batにします。ファイル名はなんでも良いです。

cd %~p1
avrdude -c avrisp -P COM7 -b 19200 -p t13 -U flash:w:%~nx1
pause


赤字にしたところは皆さんお使いのArudinoが繋がっているポート番号、緑字のところはお使いのマイコンの識別子(?)に読み替えてください。mega88ならm88です。
このファイルをデスクトップなり好きなところに置いて、AVRStudioから出てきたhexファイルをドラッグ&ドロップすると接続が正常なら書き込めるはずです。終わったら何か入力するように促されるのでなんでもいいのでキーボードのボタンを押すと終了します。
僕はこれをよく使うマイコンごとに幾つか用意して書き込んでいます。純正の書き込み機を使わないのはやはりこういうとこで手間ですね。

次回(次の記事とは限らない)予告

Web拍手反応
>すこ
おもしろスコープ

>今日誕生日です
>おめでとうございます(脅迫)
なかたくんもワイも誕生日遅いんよね

>ティッシュを被せる→バシュッって致してそう
被せるだ?

>わい!
芋!

>タイトル変わってててててててて
こっそり記事の通し番号ズレてたの直したけどバレちゃってたか…

>ピキッ!
パシュッみたいな音したような気がする

>なかた
なかたでぇ~す
なかたくん記事書かないなぁ

>だれかなぁ〜^^
ペロッ…これは…
クチビル^^

>み て い る ぞ
ジロジロ

>わんわん
わんわんお

>クワーッ!
ショベルカーが威嚇する時そんな音しそう

>ぽんぽんすき
ぽんぽんすき(宣伝)

>マルクス主義で対決?
マルクス思ってたよりも難しそうで困ってる。
なかたくんはどうかなぁ~?

それでは、今日はこの辺で。

http://clap.webclap.com/clap.php?id=fellabo

2016年11月7日月曜日

失敗集 その3

はい。KKTです。
たぶん1番要望が多かった皆さんお待ちかね失敗集です。
あんまり写真撮ってなかったので少なめですね。

いつもの光景です。過電流でお亡くなりになられました。

ま た か
これも過電流だったと思います。

これはATX電源のトランスのコアを取り出そうとした時のですね。
僕は茹でてトランスがまともに分解出来た試しが無いです。
まぁ失敗するだろうなぁと思いながら作業したので失敗とは言い難いかもしれませんね。

これはTACDに電流を流しすぎてしまった時の様子です。
IHの実験をしていたのですが、流れとしては
電流をたくさん流す

熱くなるので濡れティッシュ(ここで割りとがっかりしていた(熱くなることに対して))

ティッシュに水を差しつつ実験

パシュッ(青白い光)

マジか~
という感じです。2シリパラで使っていたのですがこうなるとは思いませんでした。
割りとTACDは信じていたのですが残念です。TACDからしたら信じたらいけるみたいな精神論でいきなり許容オーバの電流流されて壊れたら壊れたで期待ハズレみたいな対応されて…ひどい話です。

Web拍手反応

>さいきんLinuxをはじめて体験しましたがコマンドラインに慣れていないもので言語でした
ワシもXP難民やった頃にUbuntuを使うなどしたがもう何も覚えていない。
ターミナル叩いてるとなんかかっこいいよね。

>うちゅう人田中太郎
僕にもわかる言語でお願いします

>ポンポンBBってご存知ですか!?

>たのしみみ!
マルクス完成するかなぁ~?
ワイは勝つ気まんまんやで

>おやは
は や お

>毎日更新でもええんやで。
>(ええんやで。)
なかたくんと僕が2日に1回更新するだけで実現しそうやけど最初のタイミングミスってずっと2人一緒に2日ごとに投稿してそう(伝わった?)。

>今日誕生日です。お祝いしてください(脅迫)
おめでとうございます。
失敗集で返信してしまってなんかすいません。

>楽しそう
実際楽しい

>なかたくんの筋肉とKKTくんの筋肉どっちが強いかなぁ
カッターマット万力に挟んでそう

>はやおです。
ホントかなぁ~?

それでは、今日はこの辺(へん)で。

http://clap.webclap.com/clap.php?id=fellabo

2016年11月4日金曜日

FBTを駆動する

どうも、KKTです。
10月中に部屋を片付けてしまう予定だったんのですが片付かなくて笑っています。


今回は題名の通りFBTを駆動してみます。
読んで欲しい方
・どうしてもFBTを1石で駆動したい。
・どうしてもFBTの1次側を共振させたい。
・どうしても電源電圧を高くしたい。
・どうしても555を使いたい。
たぶんいませんね。

面倒なのでいきなり図です。
共振型のFBT駆動回路を考えました。
LC並列共振の理想の電圧印加タイミングはLの電流の0クロス点です。
そこで、FBTの巻線を2つ使用し片方は励磁用、もう片方は電流検出に使用しています。ゼロ電流になった後はまた正弦波状に電流が上昇していくのでその上昇端で左のトランジスタをONさせ、555をトリガし、所定のON時間した後ターンオフの繰り返しです。R1の抵抗値とC2でON時間を変えられますので可変抵抗にすれば出力が調整できそうです。あんまり大きくすると素子の耐電流を超えてしまうので注意しましょう。
書き忘れましたが、R2と並列に100pFくらいのコンデンサを入れるともっとZCSに近くなって良い感じになります。R2の抵抗値は電流検出用の巻線によるのですが、1k~10kくらいの間で最初の一発以降スイッチングが続かないようなら小さくしてみると良いでしょう。
これも書き忘れていますが、電源投入後スイッチングが始まらないと思うので(致命的仕様)Qと並列に押し釦スイッチでも付けてやってチョン押しすると始まると思います(適当)。
L1はFBTの出力短絡時(放電させている時とか)に過電流が素子に流れて火柱が上がるのを防ぐ奴です。数十uHとかでよさそう。
C2はFBTの1次コイルの共振用でFBT内蔵の1次コイルを使用するなら100n~300nくらいのを使用するといい感じに20kH付近で発振してくれます。図で102って書いちゃってすいません(作り直せ)。

動作中の波形です。
↑のでは定数ちょっとイマイチで微妙な感じですが、大体ZCSしてくれるはずです。
素子が許すならAC100V突っ込むとそれなりにアーク放電したりします。FBTの出力オープンなら消費電力はかなり小さいですね。さすが並列共振。

FBTのピンですが
ちょっと机がやばいですがお気になさらず。
95割くらいの確率でFBTの1次側は赤2ピンです。電流検出用のコイルは適当に1次側に導通が無いコイルをテスターなりで探しましょう。
コイルの巻き始めと巻き終わりがわからない問題がありますが、スイッチングさせてみて判断しましょう。異常な周波数で発振するようなら逆にしましょう。ミスると共振せずに素子がアッチッチになてアラ~なことになるので弱めの電源で試そう。
試したところでは、ATX電源に入ってた素子でアーク4cmくらいでしょうか。共振電圧が高い割に全然電圧が出ませんのでもうちょっと改良が必要ですね。いつもの書く書く詐欺になるかもしれませんがこの記事は続きを書く予定です。

Web拍手反応

>クチビル^^

>わい!


>おっぱい…
アノードキャップ貼ってそう

>トリックオアトリート
トリートメント^^

>お守り可愛いですね
これはなかたくん宛かな…

>いますよ
>いますよよ
>いませんよ
いる、いないのデューティ比2/3だから右半身とちょっとくらいが現れてそう。

>33x33=999だとおもってそう
一瞬考えたけど9999やで

>わい!
お名前入力してもいいですよ

>KKTすき
>です
FEL研究室ご優待券とか発行したあげたい(無い)。


●お知らせ(?)●
先日アクセス数が15000を突破しておりました。いつもありがとうございます。

当ブログも開始して3年と半年ほど経過いたしました。
さて、FEL研究室はなかたくんと私の2人で運営しておりますが、これまでの製作物等を見ましてもそれぞれ別々に活動しているようです。
これでは「集まっているだけ」「FEL"研究室"の意味ある?」などと言われかねないということで、何度か共同製作をしようという話は上がっておりました。が、特に何も起きず今まで通りそれぞれ工作をしておりました。
そこで、共同製作ではなく、作ったもので勝負しようという案が出ました。
例えばコイルガンなら初速が速いほうが勝ち!など、勝負形式にすることでモチベーションを維持しようという試みです。勝つための創意工夫も技術力の向上に繋がるだろうとうことで。
協議の結果、第1回はマルクスジェネレータを製作し、その威力で勝負することになりました。
威力と言ってもなかなか計測が難しい部分もありますので、最終的には何か投票のようなシステムを使って客観的に判断して貰えたらなあと思っておりますのでその際はよろしくお願いします。
現在なかたくんと私で絶賛製作中ですが、お楽しみのために途中経過は上げない予定です。
対決(?)は冬休み、1月か2月頃までには行いますのでもう暫くお待ちください。

それでは、これからもFEL研究室をよろしくお願いします。

http://clap.webclap.com/clap.php?id=fellabo