2008年11月14日金曜日

90S2323でスリープタイマー付きベッドライト(1)

いやあ、すっかりご無沙汰してしまいました。とはいってもPONGの続きではございません。

私、寝床についてから眠くなるまで本を読むのが日課なんですが、眠くなってきて、いよいよ眠りに就くぞというときに電気スタンドを消す動作をしたとたん、眠さ50%オフ!で、結局入眠できず…(涙)ということを難儀に思っていました。

眠くなったらそのまま何もしないで自然に眠りにつきたい…そういう需要ってちまたにもあるんですね。タイマー付きのベッドライトって市販されています。でも、いまさら買いたくはないし…。

いろいろ逡巡したあげく、以前仕事の関連で購入しておいた超高輝度の白色LEDがたくさんあったことを思い出し、自作することにしました。これのために新たに購入することはせず、手持ちの部品だけでなんとかなりました。

このベッドライトの仕様は
  • 白色LED×9灯=25cd×9=225cd(6灯でやってみてちょっと暗かったもので…)
  • 30分間のスリープタイマー(タイマー起動後30分で消灯)
  • スリープタイマーで消灯するときは徐々に減光するギミック
  • 電源はDC12VのACアダプター
です。

タイマーと減光ギミックの実現のためやはりマイコンの力を借ります。(だからこのブログに載せられる~!)マイコンは部品箱にあったAT90S2323-10PC。8ピンDIPでI/Oが3本しかとれないやつ。それでもフラッシュは2KB積んでいて、GCCでコンパイルできるのはありがたい。その他回路の詳細は回路図を見ていただくことにしましょう。

2008年10月31日金曜日

混沌から秩序へ(ジャンパワイヤ)

秋月で購入したブレッドボードのジャンパワイヤは透明な整理箱に入って付属してきます。いろいろな種類が「そこそこ」分類されているわけなんですが、今まではあまり気にしないで必要な長さのワイヤを「当て勘で」ピックアップし、現物合わせをしながら使っていました。

しかし、最近はこの現物合わせが面倒くさくなってきて、何とかならないかと軽く悩んでおりました。

ふとワイヤの被覆の色と長さに対応関係があるような気がして全部皿の上にひっくり返して調べてみると…なんだ、長さが抵抗と同じカラーコードに対応しているじゃありませんか。つまりこういうことでした。

{被覆なし,赤,橙,黄,緑,青,紫,灰,白}={1,2,3,4,5,6,7,8,9}

イコールの右側の単位はグリッド長で、1グリッド=0.1インチ=2.54mmです。ここから上が10グリッド単位のもので、(さっきのものと重複しますが、長さがまるで違うので見た目で判別がつきます。)

{茶,赤,橙,黄, 緑}={10,20,30,40,50}

なるほど。こりゃ覚えやすい。それじゃあ、分類して入れておけば探すのがもっと楽になるはず…しかし、14種類もありますな。付属のプラケースは仕切りがいくつも入っていない。

さんざん考えてしまいました。100円ショップでピルケースのような仕切りのたくさんあるケースを買おうか、いやもったいないから何か仕切りを立てて使おうか…。

悩みぬいた揚句たどり着いた答えがこれです。通常ICを挿して保存するためのプラスチックフォーム(硬いスポンジみたいなもの)をついたての隙間よりも少し大きめに切って差し込むだけ。このケースでは1グリッドから10グリッドまできれいに仕分けして入りました。めでたしめでたし。

2008年10月15日水曜日

TinyでPONG!(概要)

これから製作例を紹介する「TinyでPONG!」は、非常に安価な8ビットマイコンATTiny2313ひとつでこの黎明期のテレビゲームを「安価に」模倣してみようじゃないかというプロジェクトです。

Tiny2313はプログラムメモリー(ROM)が2Kバイト、RAMが128バイトしかありません。RAMといっても当然VRAMではないので、そのまま映像出力ができるような仕組みは一切ありません。

しかも画面表示解像度は水平192ドット×垂直236ラインですので、VRAMで実現しようとすると1ドットあたり1ビットとして5,664バイトが必要になってしまいます。やはりVRAM方式では無理ということになります。

PONGの映像を出力するのと同時に水平・垂直の同期信号を作ります。テレビ側はこれらの信号に合わせて画面の上端と左端のタイミングをつかみます。この同期信号のタイミングをTiny2313内蔵のタイマ/カウンタで作り出します。

プログラムでは、前述のボール左端カウンタ、右端カウンタ、上端カウンタ、下端カウンタ、左パドル上端カウンタ、下端カウンタ…が変数として使われて、ハードウェアカウンタをシミュレートしているような格好になっています。

1「行」分の映像を出力するところは一番工夫したところで、非常に高速に、かつ、安定した速度で動かなければならないので、かなりトリッキーなことをやっています。AVRの汎用レジスタの数の多さを最大限利用しています。PONGの仕組みを模倣すると言っておきながら、この部分ではちょっとずるをしているのですが…VRAMを使わないことが一番の目的なのでまあ許してもらいましょうか。

パドルは10KΩのボリュームで制御します。ボリュームの位置を検出するのに電圧を直読できるA/Dコンバータがほしいところでしたが、あいにくこのマイコンには内蔵されていません。そこで、簡易A/Dコンバータをソフトウェアで実装してあります。コンデンサを決まった電圧に充電しておいて、ボリュームの抵抗で放電させ、電圧が一定レベルまで下がったときまでの時間を測ります。抵抗が小さければ素早く放電され、抵抗が大きければゆっくり放電されます。詳しく計算すると分かるのですが、抵抗値とこの放電時間は比例します。つまり、ボリュームはBカーブ(=直線)であればそのままBカーブとして使えるのです。

サーブをするためのボタンは電源ボタンを兼ねています。電池を入れるとすぐには映像は出てきません。サーブのボタンを押すと初期画面が現れます。映像が出ているときはいつでもサーブのボタンを5秒以上押し続けることにより電源を切ることができます。

そのほかにも音が出たり、ソフトで電源ランプ(LED)の輝度調節をしていたり、さまざまなことをやっています。

プログラムのソースコードを公開する予定ですので、詳しくはそちらをのぞいてみてください。

2008年10月14日火曜日

なぜPONGなのか(4)

ここまで来てやっと「なぜPONGなのか」がお話しできます。

PONGは今や当たり前となっているコンピュータ+VRAM+ソフトウェアの方式とは構造をまったく異にしています。

テレビがスキャンビームを左から右に、上から下に振って絵を描き出すその仕組みを直に利用しています。テレビ画面はもとから2次元ではなく、織物をほどいて時間軸方向に引き伸ばしたものを、逆の手順をたどって織り上げたものです。今まさにスキャンビームが通るその瞬間を捕まえて輝点を打つ、そのタイミングが画面上の座標に対応します。その瞬間を捕まえるのに多数のカウンタとコンパレータが活躍するのです。

ゲームの進行もコンパレータでの一致検出とカウンタの計数方向の反転だけで実現されています。動物に例えると条件反射あるいは脊髄反射的といえましょう(図らずも同じ「反射」ですね…)。そこにはソフトウェアのソの字もありません。

現代人にとっては、ゲームとしては単純すぎて、遊ぶにはすぐに飽きてしまいますが、コンピュータではなく「デジタル回路」と「テレビジョン技術」の学習としては実によくできた教材になるのではないでしょうか。

2008年10月13日月曜日

なぜPONGなのか(3)

PONGの話に戻りましょう。

実はPONGゲームはまだマイコンが普及してなかったころに作られたものです。その前の年にインテルが世界初のマイコンi4004(4bit)を発表したばかりのころ。マイコンを採用しようという概念は当然なかったでしょう。仮に採用したとしてもメモリーも高価で、たった数キロバイト程度でも使えません。

「VRAM→画面の仕組み」の力を借りずして、どうしてテレビにゲームの画面を映し出すのでしょう?これには前述のOSDの話と関係があります。

テレビはアナログの映像信号1本--時刻とともに上がったり下がったりする電圧が一組あるだけ--で面の情報を映し出します。そのためにスキャンビームが画面を走査(スキャン)するのです。最上部の左端から右端へ、右端に到達したら次の行へ。横書きノートに口述筆記をするのと同じでです。ノートと違うのは最下行に到達したら次のページにめくるのではなく、左上に戻ることです。

幸いPONGは複雑な図柄は必要ありません。画面上の1つの「行」に注目すると、一番たくさんの種類の図柄を描く場合は、①左のパドル、②左のスコア(数字2桁)、③ボール、④センターライン、⑤右のスコア、⑥右のパドルの6種類だけです。

テレビのスキャンビームが左端にあるタイミングは、信号を出す側にとって分かりきったこと。③ボールの位置にスキャンビームが到達したその瞬間、映像信号を叩き「白」を出します。ボールの横幅を過ぎたところで今度は「黒」を出します。

OSDの話ではマイコンのプログラムループでこのタイミングをとっていました。しかし実はこれらはハードウェアだけでできるのです。

ビームの水平位置を示すカウンタを、画面の左端でゼロリセットしてからカウントアップの状態にし、カウンタが出力する値をコンパレータ(比較器)で検出し、映像信号を「白」にセットします。コンパレータへのもう一方の入力値はこの場合はボールの左端の位置です。また別のコンパレータを使って、ボールの右端を検出したら「黒」をセットします。

こうして6つの要素について次々と上記と同様のことを行って1行分を映像出力します。もちろんその行にボールがなかったり、パドルがなかったりする場合は「白」の出力はしません。そのためには「ビームが何行目にいるのか」を数えるカウンタ、「ボールが何行目にいるのか」を検出するコンパレータなどが必要です。

それぞれの要素について左端、右端、上端、下端を保持しておくカウンタや一致検出のためのコンパレータなどのハードウェアが必要になります。ゲームの進行もこれらのカウンタ、コンパレータをうまく使って実現することができます。(たとえば右パドルでボールが左から右へと反射するのは、ボールの右端を覚えているカウンタが右パドルの左端を覚えているカウンタと一致したとコンパレータで検出した瞬間に、ボール用のカウンタの計数方向(上昇/下降)をひっくり返すことに他なりません。)

全体としてなんだかものすごいハードウェアの量になりそうですが、それでも当時としてはコンピュータ+メモリのほうがずっと複雑で物量も大きく、なによりも高価だった。カウンターとかコンパレータが山ほどあってもそれで済むのならまだ経済的だったのです。

2008年10月12日日曜日

なぜPONGなのか(2)

そしていつの間にか私もいい歳の大人になって、おやじになって、世の中はテレビゲームのみならず携帯ゲームが世の中を席捲している状況。ひとえにコンピュータ産業の発展のたまものです。

これらはコンピュータを内蔵し、ソフトウェアで動くという点で世代にかかわらず私から見れば「同じもの」。つまり、画面上の座標と一対一に対応付けられたビデオメモリー(VRAM)に、ソフトウェアで指令されたコンピュータのコア(CPU)がせっせとイチゼロのデータを書き換え続けるということです。VRAMのある番地のデータが書き換われば対応する画面の座標の色が変わります。そういうVRAM→テレビ画面の仕組みがチップ内に組み込まれているのです。

私が生まれて初めて触れたコンピュータは、すでにテレビ用のインターフェースを備え、白黒ではあったが文字表示と簡易グラフィック表示ができるものでした。当然画面への表示は前述のVRAM→画面の仕組み(CRTC = Cathode-Ray Tube Controller)が搭載されていました。テレビに何かを表示したい場合にはそのような仕組みにするのが当然であり、それしか方法はないものだと思い込んでいました。まだ何も知らない若造だったのです。



某電器メーカーのコンピュータ設計部門に就職したその年、先輩エンジニアたちと雑談をしていて、私が愚にもつかない質問をしました。

「テレビのOSD*を出すためのマイコンってどのくらいVRAM積んでいるんですかね?」

(* On-Screen Display: チャンネル番号やボリュームレベルをテレビ映像に重ねて表示する機能)

ちょうどテレビの設計部門から転属してきていた先輩エンジニアはすかさず答えます。

「VRAMなんか持っているわけないじゃん。そんなメモリー積んでたら(値段が)高くなっちゃってしょうがないよ。」

自分の常識を覆す答え。え?それじゃあどうやって文字を出すの?

「スキャンビーム(走査電子ビーム)が、うまい位置を通るちょうどその時に映像信号をONするようにプログラムループを使ってタイミングをとるんだよ。テレビなんて何種類も文字出さないし、文字の解像度もすごく低いからからそんなんで十分。アセンブラでゴリゴリよく書いたもんだ。」

目から鱗でした。なるほど、極小のリソースの中でどれだけ複雑なことができるか、これぞ技術だ、技だと思ったものです。

2008年10月10日金曜日

なぜPONGなのか(1)

私が子供の時分にTVコマーシャルで、そしておもちゃ屋の店頭で見た「テレビテニス」はあまりにも鮮烈で脳裏に焼き付いています。なにしろそれまでテレビに映し出されるものはテレビ番組しかなかったわけで、その画面に何やら番組以外のものを映し出して遊ぶという概念さえ持ち得ませんでした。しかも(遊ぶからには当たり前ですが)コントローラ上のノブを回して自分の意のままにパドル(棒の映像)が動く。それはそれはびっくりこいてしまったのです。

我が家は貧乏ではありませんでしたが、当時このようなものを持っている友人は皆無で、当然買ってもらえるような代物ではありませんでした。いや、あまりにも自分の立場とかけ離れた存在だったので、親に遠慮して欲しがらなかったのかもしれません。

今ネットで調べてみるとこれは1975年にエポック社から発売されたものと判明。定価19,500円とは、当時としてはまったく子供向きの価格ではなかったんですね。

また、こちらの情報によれば「得点を記録する機能がなく、本体に回転式の表示装置が付けられている」って…へーそーだったんだー。てことは、ボールを跳ね返すことしかできなかったんだね。当時は技術立国の直前。それでも家庭用ゲームとしては強烈に画期的だったはず。

日本の「テレビテニス」のおおもとは米国アタリ社のアーケードゲーム "PONG" らしい。1972年の発表だったそうです。こちらの "PONG" はネット上で情報が集めやすく、プレイ中の動画も YouTube などから発掘できます。

こっちにはちゃんと得点表示が画面に表示されています(自分としてはなぜかこっちの画面のほうが記憶に残っています)。

2008年10月9日木曜日

TinyでPONG!(動画)


Tiny2313でつくるPONGゲーム。ようやく動画ができました。WindowsMovieMakerはタダであるがゆえあちこち不満はあるものの、ど素人でもこの程度のビデオが作れてしまうのは驚愕、さすがMSと言えます。

製作記事はまたいずれ後日に。

2008年10月7日火曜日

負電圧の電源を作ろう


秋月でロングセラーの液晶モジュールSC1602。データバスと3本の制御線だけつないでコマンド投げれば文字表示ができる大変お手軽で便利なデバイスです。しかし5V駆動なのが玉にキズ…。最近仕事ではほとんどが3V系のものばかりで、ブレッドボードでの実験などもどうしても3Vで動かないと困ってしまいます。

で、データシートをくまなく読んでみると、ロジックは2.7V以上で動作することがわかりました。ただし、液晶コントラスト電圧(データシート上ではVo)が電源VDDより下がること4V以上が必要。仮にVDD=3VだとするとVo=VDD-4V=-1Vで負の電圧が必要になります。

それでは正電圧→負電圧の変換器(電圧インバータ)を作ってモジュールに抱き合わせてしまおうと思い立ちました。そうすれば3V単一で動作する液晶モジュールになりますから。

電圧インバータは、Vo端子がほとんど電流を食わないため、いわゆるチャージポンプ方式とします。74HCU04×2/6で発振回路を構成し、残りのゲートで駆動力を稼ぎます。その後にCとDiのネットワークを通すとあら不思議!-2.0V程度の負の電圧が得られます。インバータという割にきっちり-3V出ないのは、HCU04の出力電圧が若干電源電圧よりも低いのと、ダイオードの順方向降下電圧(VF)のせいです。ショットキバリアダイオードなどVFの小さいものを使えばもう少し電圧は稼げると思いますが、今回は-1V以上出ればOKなのであまり追及はしませんでした。

  • 液晶モジュールSC1602のデータシートはこちらから(PDF)
  • SC1602内で使われているコントローラMSM6562B(沖)の日本語版データシートはこちらから(PDF)

2008年9月30日火曜日

TinyでPONG!(予告)


こんなものを準備中です。レトロすぎますか?あと2年とちょっとでアナログTV放送も終わるというのに…(涙)…。

Tiny2313(秋月で100円!)を使っています。パドルもボールも滑らかに動きます。音も出ますよ。そのうち動画をアップしようと思います。

2008年9月29日月曜日

AVR書込み器が安い!


毎度おなじみ秋月電子でアトメル純正のAVR用書込み器(ライターとかプログラマーとかとも言いますね)AVRISPmkIIが税込4,000円で販売されています。これは安い。デバッガーの機能などはなくて、ISPコネクタ経由のシリアル書き込みだけしかできませんが、ほとんどの場合これで十分です。

秋月はPICの販売に力を入れていて、AVRはずっと脇役のままだったので、このまま扱いがフェードアウトしてしまうのではないかとひやひやしていたのですが、ほっとしました。安価な純正プログラマーの投入でAVRユーザが増えてくれるとうれしいですね。

ちなみに私はAVRDragonという基板むき出しのデバッガ兼プログラマーも持っているのですが、ISP書き込みに関してはAVRISPmkIIよりもスピードが遅いです。2倍以上違うような気がします。書き込みアルゴリズムが違うんでしょうか、単にチューニングを怠っているんでしょうか…。

2008年9月27日土曜日

Tiny26Lがディスコンに…

AVRの主な入手先である秋月電子。以前からTiny26Lを激安(150円だったかな?)で置いてあったが、いつの間にか品切れに…あらら。どきどきしながらアトメルのホームページで調べると、すでに生産完了品(=ディスコン=mature deviceってやつ)になっていました。なるほど。共立電子とかDigikeyとかには在庫はあるようだけど。

アトメルによれば代替品としてTiny261を推奨しています。ピン配列含めてほぼ互換なのは助かりますね。フラッシュ容量の大きい461/861もラインナップしているのもいいですね。ただ、まだ店頭での入手性があまり良くないのがつらいです。先日マルツ電波のマルツメイク館でTiny461を入手できました。通販でも買えるみたいです。

2008年9月26日金曜日

Tiny26Lで電圧計(4)

Sourceforgeにソースコードと回路図PDFを置いてみました。初めてなので、こんな方法でいいのかどうか不安ですが…。

Tiny26Lで電圧計(3)


電圧計のソースコードです。Cで書いてあります。下の「+expand source」というリンクをクリックすると表示されます。私はWinAVRを導入して、開発環境AVR Studioからビルドしています。

Tiny26Lへのプログラムの書き込みはAVRISPmkIIを使っています。ヒューズ設定をデフォルトのまま「内蔵RC発振=1MHz」として使えばOKです。特にいじる必要はありません。ただし、一度設定をいじったヒューズをデフォルトの状態に戻そうとした場合には注意が必要です。AVR Studio 4.13というバージョンではTiny26Lの構成ファイルにバグがあり、ヒューズの設定をプルダウンメニューから正しく選ぶことができないのです。その場合にはデータシートとにらめっこして、直接ヒューズの下位バイトに数値を入力してください。今回の場合はLow Byte=0xE1です。上のイメージはその時のウィンドウのスナップショットです。

電圧計 main.c

#define F_CPU 1000000L /* システムクロック=1 MHz(内蔵RC発振) */
#define COM_MAX 3 /* LEDのcommon端子の数 */
#define CALIB_REAL_MV 5080L /* リアル校正電圧[mV] */
#define CALIB_ADC_MV 2570L /* ADC校正電圧[mV](リアル校正電圧の約半分で入ってくる) */
#define LED_REFRESH_MS 15 /* LEDのリフレッシュレート[ms] */
#define LUMINOUS_PERSENT 30 /* LED輝度[%] */
#define ADC_REFRESH_MS 200 /* ADCの更新周期[ms] */
#define ADC_REFRESH (ADC_REFRESH_MS / LED_REFRESH_MS) /* ADCの更新周期[LEDリフレッシュ回数] */

#define COM_SWITCH_MS (LED_REFRESH_MS / COM_MAX) /* COM端子1本当たりの時間[ms] */
#define LED_ON_MS (COM_SWITCH_MS * LUMINOUS_PERSENT / 100) /* LEDがONしている時間[ms] */
#define LED_OFF_MS (COM_SWITCH_MS - LED_ON_MS) /* LEDがOFFしている時間[ms] */

#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/wdt.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdio.h>

//
// Globals
//
uint16_t CurVolt;
uint8_t SegRAM[3];
uint8_t CurCom = 0; /* Current COM Number 0, 1, 2, 0, 1, 2, ... */
uint8_t SegFont[10] PROGMEM = {
//_abcdefg
0b10000001, /* 0 */
0b11001111, /* 1 */
0b10010010, /* 2 */
0b10000110, /* 3 */
0b11001100, /* 4 */
0b10100100, /* 5 */
0b10100000, /* 6 */
0b10001101, /* 7 */
0b10000000, /* 8 */
0b10000100, /* 9 */
};

//
// Prototypes
//
void wdt_off(void);
void init_io(void);
void adc_cont_start(void);
void put_digit(void);
void print_volt(void);

//
// MAIN LOOP
//
int main(void)
{
wdt_off(); /* ウォッチドッグタイマーをOFF */
init_io(); /* I/Oの初期化 */
adc_cont_start(); /* ADCを連続変換モードでスタート */

uint8_t adcref = 0; /* ADCのリフレッシュカウンタ */

while(1) {
if (adcref == 0 && (ADCSR & _BV(ADIF))) {
ADCSR |= _BV(ADIF); /* ADCの読み込み */
CurVolt = ADCW; /* 現在電圧の更新 */
}
print_volt(); /* 電圧の表示 */

if (++CurCom >= COM_MAX) { /* 各カウンタの回転 */
CurCom = 0;
if (++adcref >= ADC_REFRESH)
adcref = 0;
}

_delay_ms(LED_ON_MS); /* 輝度調整:ONの時間 */
PORTB |= 0b00111000; /* 全消灯 */
_delay_ms(LED_OFF_MS); /* 輝度調整:OFFの時間 */
}

return 0;
}

//
// Functions
//
void wdt_off(void)
{
cli();
wdt_reset();
MCUSR &= ~(1 << WDRF);
WDTCR |= (1 << WDCE) | (1 << WDE);
WDTCR = 0x00;
//sei();
}

void init_io(void)
{
PORTA = 0xff;
DDRA = 0xff;

PORTB = 0b10111111;
DDRB = 0b00111000;

ADMUX = 0x29; /* REFS[1:0]/ADLAR/MUX[4:0] = 00101001 */
/* AVCCピン基準電圧、左揃え、シングルエンドCH9 */
ADCSR = 0x87; /* ADEN/ADSC/ADATE/ADIF/ADIE/ADPS[2:0] = 10000111 */
/* 完了割り込み禁止、クロック128分周 */
}

void adc_cont_start(void)
{
ADCSR |= _BV(ADSC) + _BV(ADFR);
}

void put_digit(void)
{
uint8_t pb, pa;

pb = PORTB | 0b00111000;
pb &= ~(0b00001000 << CurCom);
pa = SegRAM[CurCom];

PORTB = pb; /* COM端子のスイッチ */
PORTA = pa; /* フォントパターンの出力 */
}

void print_volt(void)
{
uint32_t r;
uint16_t p;

if (CurCom == 0) {
r = CurVolt;
//r = r * VCC_MV / 1000;
r = r * (CALIB_REAL_MV * CALIB_REAL_MV / CALIB_ADC_MV) / 1000L;
p = r >> 16;
if (p > 9)
p = 9;
SegRAM[0] = pgm_read_byte(&SegFont[p]) & 0b01111111; /* 最上位桁+小数点 */

r -= p * 65536L;
r *= 10;
p = r >> 16;
SegRAM[1] = pgm_read_byte(&SegFont[p]); /* 中位桁 */

r -= p * 65536L;
r *= 10;
p = r >> 16;
SegRAM[2] = pgm_read_byte(&SegFont[p]); /* 最下位桁 */

// r -= p * 65536L;
// r *= 10;
}

put_digit(); /* SegRAM[]の内容(フォントパターン)で表示 */
}

Tiny26Lで電圧計(2)



電圧計の回路図です。図中左下のオレンジ枠の部分はブレッドボード用の可変電圧電源であって、電圧計とは直接の関係はありません。ただ、この電源の出力の電圧を表示するという意図で載せてあります。

電圧測定入力はちょうど半分の電圧になるようにR10とR14で分圧してあり、これをTiny26L内蔵のAD変換器に入力しています。こうすることでTiny26Lの電源電圧を超える電圧も読むことができるようになります(フルスイングしても電源電圧どまりになってしまうので)。ただ、この入力抵抗でそこそこ電力消費をしますので、もう少し大きな抵抗値のほうがよかったかもしれません。47kΩずつくらいがちょうどいいかも。

LEDは3コモン×(7セグメント+DP)のダイナミックドライブを構成しています。部品点数が増えるので本当はLEDのコモンも直接AVRでドライブしたかったんですが、十分な輝度を出すためにはチップの定格を超えてしまうので涙をのんでPNPトランジスタでドライブしています。

さあ、次はソースコードの紹介です。

Tiny26Lで電圧計(1)


第一弾は、簡易電圧計を。

実験用のブレッドボードにお手製の可変電圧電源を組み込んで使っているのですが、出力電圧を調整するのにいちいちテスターで測っていました。これが面倒くさくなり、専用の電圧計を作ってしまいました。


ATTiny26Lを使って0.00V~9.99Vで0.01V刻みでLED表示します。実際には可変電圧源の可変範囲1.24V~5.09Vでしか試していません。

電圧計そのものへの電源は、写真では切れていますがお隣の可変電圧電源の一次側(DC7.5~12V)から引いてきています。これを三端子レギュレータで5Vに落として使っています。 LEDのコモン側のドライバーは手元にあったチップトランジスター2SA1202を使っていますが、裏面に実装してあるので写真には写っていません。

回路図とソースコードは次回以降にて。

電子工作ブログを始めます!



ご来訪ありがとうございます。Hazie(へいじー)と申します。 このブログでは私が趣味に仕事に愛用しているAVRというアトメル社の8ビットマイコンを使った工作を中心に紹介していきたいと思います。回路図もソースも公開していきます。皆さんの電子工作ライフに少しでも役に立てばうれしい限りです。

また、電子工作に限らず様々な工作ネタ、技術ネタ、科学教材ネタなども雑多につづっていこうと思います。

インターネットとの付き合いはものすごく長いのですが、いままでずっとROM野郎で、自ら発信するのは初めてです。ちょっと緊張しています。どうかよろしくお願いします。