このページについて
作者の電子工作を紹介する。
ハンディ オシロスコープ
手軽に使えるハンディタイプのオシロスコープを作ることにした。
私のオシロスコープの用途は、ほとんどがマイコンの出力信号の確認なので、それほど分解能は必要としない。
ちょっと確かめたいときに、テスターと同じくらいの手軽さで動的な信号を確認する道具がほしい。
私のオシロスコープの用途は、ほとんどがマイコンの出力信号の確認なので、それほど分解能は必要としない。
ちょっと確かめたいときに、テスターと同じくらいの手軽さで動的な信号を確認する道具がほしい。
プロトタイプ
入力アンプは1つのオペアンプで構成したので、入力インピーダンスは低めになったが、用途がほとんどデジタル回路なので、よしとした。測定時に極性をあまり意識したくなかったので、デジタル回路用だが、マイナス側の測定をサポートした。
手軽に使えるをコンセプトに、電源ONで即測定できるようにした。
仕様サンプリング速度 ・・・・最大50kSPS
測定可能電圧 ・・・・±6V (±10Vまで入力を許容)
入力チャネル数 ・・・・4ch
CPU ・・・・H8S/2128 20MHz
画面解像度 ・・・・84x48
電源 ・・・・単4電池 3本
【マニュアル】 マニュアル
【動作状況】
【ユースケース図】
【回路図】
部品配置
このページの最初に移動
手軽に使えるをコンセプトに、電源ONで即測定できるようにした。
仕様
【マニュアル】 マニュアル
【動作状況】
【ユースケース図】
【回路図】
部品配置
ビデオゲーム機
「マイコンを使ったゲームといえば、ビデオゲームだろう」ということで、
今回は、ビデオゲーム機にチャレンジしてみた。
NTSC信号の生成と効果音、ゲーム進行をH8S/2128ワンチップで実現した。
仕様画面表示・・・・224x184ドット 白黒 NTSC出力
サウンド・・・・ビープ 1チャンネル
CPU・・・・H8S/2128 20MHz
電源・・・・単4 3本
RAM(内蔵+外部)・・・・12k Byte(4k + 8k)
ROM(内蔵)・・・・128k Byte
サイズ・・・・82x49x38mm
今回は、ビデオゲーム機にチャレンジしてみた。
NTSC信号の生成と効果音、ゲーム進行をH8S/2128ワンチップで実現した。
仕様
【万能基板を使って試作】
【基板を作って実装したもの】回路
NTSC信号について
今回の製作にあたりNTSC信号について調べたので、以下にまとめる。
偶数と奇数の画面で信号の波形が異なる。
NTSCビデオ信号は、下記の回路を用いて出力した。
映像信号と同期信号は、H8S/2128のI/Oポートなど5V出力端子を利用する。
偶数と奇数の画面で信号の波形が異なる。
NTSCビデオ信号は、下記の回路を用いて出力した。
映像信号と同期信号は、H8S/2128のI/Oポートなど5V出力端子を利用する。
Space Invaders機能追加
後述のポータブルゲーム機にシリアルEEPROMを追加し、電源を切ってもHiScoreが残るようにした。
ゲームにもUFOや基地などを追加してみた。
ゲームにもUFOや基地などを追加してみた。
回路
ポータブルゲーム機
1980年代のマイコンには、数日間でミニゲームなどのアイデアを実装して楽しめる手軽さがあった。
今振り返ると、画面表示や音楽の表現などに制約は多かったが、逆にそのことが、デフォルメしたアイデアを手軽に具体化できるというメリットになっていたように思える。
今のマイコンを使って、当時のマイコンを復活させてみたい。という欲求に、どうせ作るなら、C++を使いたい。ポータブルなものにしたい。などの思いと、時間はかけられないという現実との妥協点を探って、以下のスペックのポータブルゲーム機と、そのマシン上で動くインベーダゲームを作ることにした。
仕様画面表示・・・・84x48ドット 白黒
サウンド・・・・ビープ 4チャンネル
CPU・・・・H8S/2238B 12.288MHz
電源・・・・単4 3本
RAM(内蔵)・・・・16k Byte
ROM(内蔵)・・・・256k Byte
サイズ・・・・70x90x40mm
今振り返ると、画面表示や音楽の表現などに制約は多かったが、逆にそのことが、デフォルメしたアイデアを手軽に具体化できるというメリットになっていたように思える。
今のマイコンを使って、当時のマイコンを復活させてみたい。という欲求に、どうせ作るなら、C++を使いたい。ポータブルなものにしたい。などの思いと、時間はかけられないという現実との妥協点を探って、以下のスペックのポータブルゲーム機と、そのマシン上で動くインベーダゲームを作ることにした。
仕様
回路
マイコンにEE_Type_S/2238を、表示はNOKIA5110のLCDを使用した。最低でも3音を同時に出したかったので、圧電ブザーを4つに時分割して利用できるよう、H8のPWM出力をセレクタICを介して圧電ブザーに接続した。
ソフトウエア部
クラス図
アプリケーションドメインのクラス図は以下のようになった。
DemoとStageがタスクだ。ボタンの操作にしたがって、デモ画面表示時にDemoクラス、ゲームスタート後はStageクラスが動的に生成される。 ゲーム開始後の知識は、敵関連はArmyとInvaderとBeam、自機関連はTankとMissileにまとめた。
DemoとStageがタスクだ。ボタンの操作にしたがって、デモ画面表示時にDemoクラス、ゲームスタート後はStageクラスが動的に生成される。 ゲーム開始後の知識は、敵関連はArmyとInvaderとBeam、自機関連はTankとMissileにまとめた。
動画
迷路探索ロボット
1980年代のマイコン雑誌にマイクロマウスのイベントの記事が大きく取り上げられていたのを覚えている。
当時は、高校の帰りがけにI/Oやマイコンを読みながら、いつかはマッピー君(有名なマイクロマウスの名前)みたいなロボットを作ってみたいと思ったものだった。
当時は部品を買うお金も設計するスキルもなかったが、今なら作れるような気がする。しかし、自由になる時間は少ない。
「何とか数日で、迷路探索ロボットを作りたい。」と思い、立体ではなく平面に描いた迷路を探索するロボットを作ることに決めた。
当時は、高校の帰りがけにI/Oやマイコンを読みながら、いつかはマッピー君(有名なマイクロマウスの名前)みたいなロボットを作ってみたいと思ったものだった。
当時は部品を買うお金も設計するスキルもなかったが、今なら作れるような気がする。しかし、自由になる時間は少ない。
「何とか数日で、迷路探索ロボットを作りたい。」と思い、立体ではなく平面に描いた迷路を探索するロボットを作ることに決めた。
機構部
ユニバーサルプレートの幅(約6cm)をそのまま本体の幅に採用した。
右の写真のようにクランク状になるようにユニバーサルプレートを付属のアングル材を使って固定した。
ステッピングモータを取り付けるプレートは、6cm幅のユニバーサルプレートを半分に切って3cmずつに切り出して使った。ステッピングモータをユニバーサルプレートにねじで固定しようとすると、軸がユニバーサルプレートにあたるので、その部分は三角に切れ目を入れてあたらないように加工した。
ボールキャスタは、37mmの高さになるよう組み立てて、4本の金属スペーサを使って本体に固定した。 車輪はプーリーを使い、ステッピングモータの軸(直径3mm)に直接アルミボスのネジを使って固定した。
プーリーにP-48のオーリングをはめ車輪のゴムにした。
主な部品
ステッピングモータを取り付けるプレートは、6cm幅のユニバーサルプレートを半分に切って3cmずつに切り出して使った。ステッピングモータをユニバーサルプレートにねじで固定しようとすると、軸がユニバーサルプレートにあたるので、その部分は三角に切れ目を入れてあたらないように加工した。
ボールキャスタは、37mmの高さになるよう組み立てて、4本の金属スペーサを使って本体に固定した。 車輪はプーリーを使い、ステッピングモータの軸(直径3mm)に直接アルミボスのネジを使って固定した。
プーリーにP-48のオーリングをはめ車輪のゴムにした。
主な部品
- タミヤ ユニバーサルプレート(2枚セット) ・・・・1セット
- ボールキャスター(2セット入) ・・・・1セット
- 金属六角スペンサー 長さ20mm 6mm ・・・・4本
- レインボープロダクツ 輪ゴムプラプーリー(大) 3mm穴 ・・・・2個
- P-48オーリング ・・・・2本
- ステッピングモータ(SPG20-332)・・・・・・2個
電子回路部
マイコンには、H8S/2238学習キット利用した。このキットのマイコンは、CPUコアに降圧回路を内臓しているので、レギュレータなしに電池をマイコンの電源に直結できる。このキットは、「マイコンの学習をどこから始めてよいかわからない」という方向けに、私が開発したものだ。よかったら活用していただけるとうれしい。(H8マイコンなので秋月などで入手できるマイコンでも代替できるが、敢えて宣伝するとハードウエアを隠蔽するC++のクラスライブラリが付いているので、arduinoライクに初心者でも簡単にマイコン開発を始めることができる)
主な部品
- H8S/2238 学習キット・・・・・・1セット
- トランジスタ(2SC1815)・・・・・・8個
- 抵抗(2.2kΩ)・・・・・・8個
- 抵抗(4.7kΩ)・・・・・・1個
- 抵抗(100Ω)・・・・・・2個
- 半低抵抗(10kΩ)・・・・・・1個
- 半低抵抗(50kΩ)・・・・・・2個
- 赤外線LED(OSIR5113A)・・・・・・2本
- フォトトランジスタ(TPS601A)・・・・・・2本
- LCD(DM1640)・・・・・・1個
- 5V DC-DCコンバータ・・・・・・1個
- ミニブレッドボードBB-601・・・・・・2本
回路は可能な限りシンプルにした。ステッピングモータの駆動は、専用のICを用いずに、一般的なトランジスタ(2SC1815)を用いて最小限のハードウエアで実現した。今回使用したステッピングモータは、12V程度の電源が適当だと思われたが、電池(3.6V)直結でも動作したので、そのまま使用した。
LCDには手持ちのDM1640(16×4行)を使った。3.3Vで動くSC2004CSWBあたりを使えば5V DC-DCコンバータを使わなくて済むので、この記事を参考にされる方はそちらを検討いただきたい。
ソフトウエア部
迷路のモデリング
コースの幅は3cm、1つのブロックを9×9cmであり、ブロックは─│┌┐┘└├┬┤┴┼■のいずれかの形のコースからなる。
このようなブロックを組み合わせて迷路を作ることにした。
スタート地点は直線ブロック(─または│)とし、ゴールは■とした。
コースは、ビニールテープ(ホクレンコーポレーション:黒)を張って作った。
このようなブロックを組み合わせて迷路を作ることにした。
スタート地点は直線ブロック(─または│)とし、ゴールは■とした。
コースは、ビニールテープ(ホクレンコーポレーション:黒)を張って作った。
迷路探索の方法
私自身はマイクロマウスや迷路探索アルゴリズムに関しては、まったくの素人だ。時間を使わずに完成させるために、アルゴリズムをできるだけ簡単にすることが重要と考え、下記のように決めた。
- ブロックの中央かつ、コースに平行な姿勢から探索を開始する。
- 1ブロック分(9cm)移動し、ブロックの形を判別し記録する。
- 記録したマップを元に、未探索のブロックを検索し、未探索ブロックに移動する。
- 2、3を繰り返し、ゴールを見つけたら終了する。
この方法だと、1の状態を如何に正確に作るかが重要になる。1の姿勢が少しでも狂うと、コースアウトしてしまう。(コースから外れたことを検出し、リカバリすればよいが、今回はそこまではやらないことにした。)
そこで次の手順でコースと平行な姿勢をとることにした。
そこで次の手順でコースと平行な姿勢をとることにした。
- 最初の位置で旋回し、車体の前方に着いたセンサーがコースアウトする点を検出する。検出したコースの両端の点を、以降左端1と右端1とする。
- 左端1と右端1の中点が車体の中央(車軸の中央)になるようロボットを移動する。
- 再度旋回し、センサーがコースアウトする左右の点を求める。これらの点を左端2と右端2とする。
- 左端2と右端2の中点を、車体の中央とセンサーを結ぶ線が通過するよう車体を回転する。
この手順により、コースと平行な姿勢を得ることができる。
開始を直線ブロック(─または│)かつ後方にブロックをつなげないというルールにすれば、バックしてコースアウトした点からブロック大きさの半分の距離(45mm)すすんだところが、ブロックの中央ということになる。
迷路を探索するアルゴリズムを以上のように決めた。
開始を直線ブロック(─または│)かつ後方にブロックをつなげないというルールにすれば、バックしてコースアウトした点からブロック大きさの半分の距離(45mm)すすんだところが、ブロックの中央ということになる。
迷路を探索するアルゴリズムを以上のように決めた。
クラス設計
このテーマの概念段階のクラス図を下記のように考えた。
この図で、Planというクラスは、前述の迷路を探索する手順をクラス化したものだ。
Blockは9x9cmのブロック、Mapはその集合だ。Naviは、Planに従いMapとセンサー(LineSensor)を参照し、Driveに移動距離や回転角を指示する。ゴール判定もNaviが行う。クラスの抽出は、人それぞれなので正解はないが、私はこのように考えた。
オブジェクト指向言語を使う時のクラスの抽出方法でお悩みの方には、この本(憂鬱なプログラマのためのオブジェクト指向開発講座))をお勧めする。私もオブジェクト指向初心者のころお世話になり、概念的にクラスを捕らえる方法を理解するのに非常に役に立った。
この図で、Planというクラスは、前述の迷路を探索する手順をクラス化したものだ。
Blockは9x9cmのブロック、Mapはその集合だ。Naviは、Planに従いMapとセンサー(LineSensor)を参照し、Driveに移動距離や回転角を指示する。ゴール判定もNaviが行う。クラスの抽出は、人それぞれなので正解はないが、私はこのように考えた。
オブジェクト指向言語を使う時のクラスの抽出方法でお悩みの方には、この本(憂鬱なプログラマのためのオブジェクト指向開発講座))をお勧めする。私もオブジェクト指向初心者のころお世話になり、概念的にクラスを捕らえる方法を理解するのに非常に役に立った。
アーキテクチャ設計
4つのドメインに分割してアーキテクチャを考えた。
組み込み開発のアーキテクチャ設計に興味がある方は、この本( 組み込みUML―eUMLによるオブジェクト指向組み込みシステム開発 (OOP Foundations) )を読んでみるとよいと思う。わかりやすさという点ではあまりお勧めしないが、この分野に関する本が少なく他によい本を私は知らない。特にタスクをクラス化している部分に関しては、非常に参考になった。
この段階になると、文章で説明してもあまりピンとこないと思うので、APPLI部分のソースを公開する。コードが汚い点に関しては、大目に見ていただきたい。迷路探索ロボットのソース
- このテーマに関連した知識をまとめたAPPLIドメイン
- タスクの実行権の配布などOS的な知識をまとめたOSWrapperドメイン
- CPUとIOポートなど汎用的なIFを介して接続するハードウエアの知識をまとめたUnitドメイン
- CPUに密接に関連するハードウエアの知識をまとめたHALドメイン
組み込み開発のアーキテクチャ設計に興味がある方は、この本( 組み込みUML―eUMLによるオブジェクト指向組み込みシステム開発 (OOP Foundations) )を読んでみるとよいと思う。わかりやすさという点ではあまりお勧めしないが、この分野に関する本が少なく他によい本を私は知らない。特にタスクをクラス化している部分に関しては、非常に参考になった。
この段階になると、文章で説明してもあまりピンとこないと思うので、APPLI部分のソースを公開する。コードが汚い点に関しては、大目に見ていただきたい。迷路探索ロボットのソース
迷路探索ロボ 動画
【ゴール!!】
【開始位置および姿勢の決定】
【開始位置および姿勢の決定】
最後に
高校時代に作れなかった迷路探索ロボを簡易的ではあるが完成させることができた。また、H8S/2238学習キットのライブラリのアーキテクチャについては、実働6日でこのロボを完成できたという点で、有効といってよいと思う。
反省点は、慌ててハードウエアを作ってしまい、ソフトウエア設計の段になってセンサーを8個配置すればよかったことに気が付いたことだ。あらかじめ全体の設計を見通してハードウエアを作れば、それほど時間をかけずに性能を出せたはずでだった。次からこの点には留意したい。(とはいえ、最初は軽い気持ちで始めるので、その時点で気合を入れるのは難しいのだが・・・・経験が力を貸してくれることだろう。)
最後に、この3週間の週末は非常に楽しいひと時だった。やはり、設計から動かすところまでを体験することは、いくつになっても楽しいものだ。今後も暇を見つけて、工作にチャレンジしよう。
このページの最初に移動
反省点は、慌ててハードウエアを作ってしまい、ソフトウエア設計の段になってセンサーを8個配置すればよかったことに気が付いたことだ。あらかじめ全体の設計を見通してハードウエアを作れば、それほど時間をかけずに性能を出せたはずでだった。次からこの点には留意したい。(とはいえ、最初は軽い気持ちで始めるので、その時点で気合を入れるのは難しいのだが・・・・経験が力を貸してくれることだろう。)
最後に、この3週間の週末は非常に楽しいひと時だった。やはり、設計から動かすところまでを体験することは、いくつになっても楽しいものだ。今後も暇を見つけて、工作にチャレンジしよう。
このページの最初に移動
ライントレーサ
この章では、EE_Type_LTマイコンを使ってライントレーサを作る方法と制作結果(動画)を紹介する。
ライントレーサは、床に書かれたライン(コース)に沿って走るロボットカーのことだ。最もシンプルな自律ロボットのひとつだと思われる。
ライントレーサの原理については、下記のページなどに分かりやすく説明されている。
ライントレーサの原理を分かりやすく説明したページ その1
ライントレーサの原理を分かりやすく説明したページ その2
これらのページから、一般的にはライントレーサはセンサによりラインを読み取り、その結果に従って左右の車輪回転速度を変えて、ラインから外れないよう車の進む方向をを制御するものだということが分かる。
ライントレーサは、床に書かれたライン(コース)に沿って走るロボットカーのことだ。最もシンプルな自律ロボットのひとつだと思われる。
ライントレーサの原理については、下記のページなどに分かりやすく説明されている。
ライントレーサの原理を分かりやすく説明したページ その1
ライントレーサの原理を分かりやすく説明したページ その2
これらのページから、一般的にはライントレーサはセンサによりラインを読み取り、その結果に従って左右の車輪回転速度を変えて、ラインから外れないよう車の進む方向をを制御するものだということが分かる。
EE_Type_LTマイコンは、2つのDCモータの回転速度と回転方向をプログラムで制御する機能を持っているので、左右の車輪回転速度を変えて車の進行方向を変える2輪ロボットを作るのに適している。
以降、各部の作り方を紹介する。
動力部の作り方
DCモータを使ったギアボックスのセットの中で、安価で入手性のよいものにタミヤの楽しい工作シリーズがある。
タイヤなどの足回りも含めてシリーズ化されており、使いやすいキットだ。
ギアボックスに、ダブルギアボックス、車輪には、ナロータイヤセットとボールキャスタセットを使った。
EE_Type_LTの拡張ポートの3番ピンA0_OUT(赤),4番ピンB0_OUT(茶)および5番ピンC0_OUT(黒),6番ピンD0_OUT(白)をモータの端子に接続する。
ここでのポイントは、DCモータにノイズ吸収用のコンデンサをつけることだ。
私は、10V10uFの積層セラミックコンデンサを使った。(秋月電子で10本200円)
EE_Type_LTの拡張ポートの3番ピンA0_OUT(赤),4番ピンB0_OUT(茶)および5番ピンC0_OUT(黒),6番ピンD0_OUT(白)をモータの端子に接続する。
ここでのポイントは、DCモータにノイズ吸収用のコンデンサをつけることだ。
私は、10V10uFの積層セラミックコンデンサを使った。(秋月電子で10本200円)
ラインセンサの作り方
赤外線LEDとフォトトランジスタを使って作る。原理については、冒頭の参考のページで解説されているので、参照いただきたい。
ここでは、4つのセンサを接続する。回路図は、下記の通りだ。
部品は、赤外線LEDとフォトトランジスタと抵抗のみ。(赤外線LEDは秋月電子で100本700円で売ってる。
フォトトランジスタは型番は違うがL-51ROPT1D1 10本200円が使える。
EE_Type_LTの5Vの外部で使える容量は40mA程度なので、LEDの電源は電池から直接とる。
EE_Type_LT基板の拡張ポートの7〜13番ピンまでを下記のように接続して使う。
ここでは、4つのセンサを接続する。回路図は、下記の通りだ。
部品は、赤外線LEDとフォトトランジスタと抵抗のみ。(赤外線LEDは秋月電子で100本700円で売ってる。
フォトトランジスタは型番は違うがL-51ROPT1D1 10本200円が使える。
EE_Type_LTの5Vの外部で使える容量は40mA程度なので、LEDの電源は電池から直接とる。
EE_Type_LT基板の拡張ポートの7〜13番ピンまでを下記のように接続して使う。
- 7番ピン 5V 下の回路図のCN5の5V_1に接続する
- 8番ピン GND 下の回路図のCN5のGND_1に接続する
- 9番ピン AN7 下の回路図のCN5のAN7_1に接続する
- 10番ピン AN6 下の回路図のCN5のAN6_1に接続する
- 11番ピン AN5 下の回路図のCN5のAN5_1に接続する
- 12番ピン AN4 下の回路図のCN5のAN4_1に接続する
- 13番ピン 3.6V 下の回路図のCN5の3.6V_1に接続する
動力部とラインセンサを接続すると電子回路は完成だ。
車体を組み立てると、最小限の機能を持ったライントレーサが完成する。
以下に紹介している動画のうち、一番下のものと同じ機能のライントレーサを作ることができる。
しかし、真ん中の2つの動画のように、速度を制限したり、コースを覚えるには、走行距離センサを追加する必要がある。
車体を組み立てると、最小限の機能を持ったライントレーサが完成する。
以下に紹介している動画のうち、一番下のものと同じ機能のライントレーサを作ることができる。
しかし、真ん中の2つの動画のように、速度を制限したり、コースを覚えるには、走行距離センサを追加する必要がある。
走行距離センサの作り方
ロータリエンコーダで左右の車輪の回転数を検出する。
モータに負担をかけずに車輪の回転をロータリエンコーダに伝えるよい方法を思いつかなかったので、フォトインタラプタを4つ使って自作することにした。
まず、回路図から説明する。
左の2つのフォトインタラプタの出力を排他論理和(XOR)した信号をIRQ4に、右の2つのフォトインタラプタの出力を排他論理和(XOR)した信号をIRQ5に接続した。それぞれのフォトインタラプタの出力は、P20〜P23に接続した。
左側のフォトインタラプタのどちらかの状態が変化したときにIRQ4の割り込みが入ることになるので、そのタイミングでP20、P21を読むことによって、2つのフォトインタラプタの状態の遷移を検出しようというものだ。(右の2つも同様)
次に、機構についてだが、フォトインタラプタでギアの回転数を検出するため、ダブルギアボックスの2つギアを下の写真のように加工する。アルミを張っているのは、赤外線の透過を防ぐためだ。 ダブルギアボックスは、4つのギア比を選択できるが、今回は38.2:1にした。加工したギアは、モータから一番遠い2つのギアとして組み付ける。
回路図の左の2つと右の2つのフォトインタラプタが、それぞれ1つのギアの回転を検出するよう縦一列に並べて配置する。(「フォトインタラプタの配置」の写真を参照)
フォトインタラプタを取り付けた基板は、加工したギアを挟み込むように、ダブルギアボックスのモータから一番遠い面に両面テープで固定する。(「ギアボックスへの取り付け」の写真を参照)
※ フォトインタラプタを挿入するダブルギアボックスの面は、予めセンサが入るよう削っておく。
※ フォトインタラプタの取り付けようのネジ穴が邪魔になるので切断しておく。
※ ギアの回転を正確に捉えるために、フォトインタラプタを可能な限り深く挿入する。ダブルギアボックスのギアとフォトインタラプタの先端が接触するので、フォトインタラプタの先端を1mm程度削る。
モータが回転すると、ギアが回転し、ギアボックスにあけた穴(スリット)を2つのフォトインタラプタが順に検出するので、「ロータリエンコーダの出力」(P20、P21の波形)に示すような波形が得られる。
2つのフォトインタラプタのどちらが早く穴を検出するかにより回転の方向が、検出した穴の数によりギアの回転数が分かるので、ギア比と車輪の円周から比例計算し、走行距離を求める。
走行距離センサの回路図
モータに負担をかけずに車輪の回転をロータリエンコーダに伝えるよい方法を思いつかなかったので、フォトインタラプタを4つ使って自作することにした。
まず、回路図から説明する。
左の2つのフォトインタラプタの出力を排他論理和(XOR)した信号をIRQ4に、右の2つのフォトインタラプタの出力を排他論理和(XOR)した信号をIRQ5に接続した。それぞれのフォトインタラプタの出力は、P20〜P23に接続した。
左側のフォトインタラプタのどちらかの状態が変化したときにIRQ4の割り込みが入ることになるので、そのタイミングでP20、P21を読むことによって、2つのフォトインタラプタの状態の遷移を検出しようというものだ。(右の2つも同様)
次に、機構についてだが、フォトインタラプタでギアの回転数を検出するため、ダブルギアボックスの2つギアを下の写真のように加工する。アルミを張っているのは、赤外線の透過を防ぐためだ。 ダブルギアボックスは、4つのギア比を選択できるが、今回は38.2:1にした。加工したギアは、モータから一番遠い2つのギアとして組み付ける。
回路図の左の2つと右の2つのフォトインタラプタが、それぞれ1つのギアの回転を検出するよう縦一列に並べて配置する。(「フォトインタラプタの配置」の写真を参照)
フォトインタラプタを取り付けた基板は、加工したギアを挟み込むように、ダブルギアボックスのモータから一番遠い面に両面テープで固定する。(「ギアボックスへの取り付け」の写真を参照)
※ フォトインタラプタを挿入するダブルギアボックスの面は、予めセンサが入るよう削っておく。
※ フォトインタラプタの取り付けようのネジ穴が邪魔になるので切断しておく。
※ ギアの回転を正確に捉えるために、フォトインタラプタを可能な限り深く挿入する。ダブルギアボックスのギアとフォトインタラプタの先端が接触するので、フォトインタラプタの先端を1mm程度削る。
モータが回転すると、ギアが回転し、ギアボックスにあけた穴(スリット)を2つのフォトインタラプタが順に検出するので、「ロータリエンコーダの出力」(P20、P21の波形)に示すような波形が得られる。
2つのフォトインタラプタのどちらが早く穴を検出するかにより回転の方向が、検出した穴の数によりギアの回転数が分かるので、ギア比と車輪の円周から比例計算し、走行距離を求める。
- 14番ピン 5V 下の回路図のCN1の5V_2に接続する
- 15番ピン ~IRQ4 下の回路図のCN1の~IRQ4に接続する
- 16番ピン ~IRQ5 下の回路図のCN1の~IRQ5に接続する
- 17番ピン GND 下の回路図のCN1のGND_2に接続する
- 18番ピン 3.6V 下の回路図のCN1の3.6V_2に接続する
- 23番ピン P20 下の回路図のCN1のP20に接続する
- 24番ピン P21 下の回路図のCN1のP21に接続する
- 25番ピン P22 下の回路図のCN1のP22に接続する
- 26番ピン P23 下の回路図のCN1のP23に接続する
走行距離センサの回路図
加工したギア
ギアボックスへの取り付け
フォトインタラプタの配置
ロータリエンコーダの出力
走行距離から車体の位置を検出
EE_Type_LTを使って作ったライントレーサの動画だ。
左右の車輪の単位時間あたりの走行距離から、車体の方向と位置を計算してみた。 この動画は、走行を開始した位置に戻ったら停止するようプログラムしたものだ。
軌跡をグラフにしてみるとこのようになった。(グラフの単位はマイクロメータ)
走行距離を測定するロータリエンコーダは手作りで分解能が15mm程度、演算は固定小数点方式という条件だが、この程度の精度は出るようだ。 コースの特徴を記録し2回目以降の走行を最適化することや迷路探索などに応用できる。
左右の車輪の単位時間あたりの走行距離から、車体の方向と位置を計算してみた。 この動画は、走行を開始した位置に戻ったら停止するようプログラムしたものだ。
軌跡をグラフにしてみるとこのようになった。(グラフの単位はマイクロメータ)
走行距離を測定するロータリエンコーダは手作りで分解能が15mm程度、演算は固定小数点方式という条件だが、この程度の精度は出るようだ。 コースの特徴を記録し2回目以降の走行を最適化することや迷路探索などに応用できる。
コースを覚えて2週目以降速く安全に走行
1週目で急カーブの位置を覚え、2週目と3週目は急カーブの手前で減速、カーブ脱出時に加速するようプログラムした。
3週走り終わった時点で止まる。
【速度制御を加え改善】
PD制御などを取り入れ速くライントレースができるようになると、直線でスピードが出るので、直線の後の急カーブ(L字)などでオーバーランするようになる。(下の動画参照)
オーバーランを避けるため、速度を制御し、改良を加えたのが上に示す動画だ。
【PD制御するもL字でオーバーラン】
このページの最初に移動
【速度制御を加え改善】
PD制御などを取り入れ速くライントレースができるようになると、直線でスピードが出るので、直線の後の急カーブ(L字)などでオーバーランするようになる。(下の動画参照)
オーバーランを避けるため、速度を制御し、改良を加えたのが上に示す動画だ。
【PD制御するもL字でオーバーラン】
このページの最初に移動
ポータブルゲーム機
ドットマトリックスLEDと秋月電子のAKI-H8/3052Fを利用してポータブルゲーム機の製作に挑戦してみた。
ドットマトリックスLEDで中間色を表示する。LiPoを電源に使ってコンパクトにまとめる。といった課題を解きつつ、昔懐かしいブロック崩しを作った。
ドットマトリックスLEDで中間色を表示する。LiPoを電源に使ってコンパクトにまとめる。といった課題を解きつつ、昔懐かしいブロック崩しを作った。
ブロック崩し
画面下に赤いLEDのゴーストが映っている。これは、基板スペースの都合上D-FF(74HC273)を1つしかけなかったため、赤の上位8Bitのデータをラッチさせるまでの間の数100nsの間のデータが表示されてしまうものだ。ハードウエアを設計する時点では、うっすらとは表示される可能性はあるとは考えていたが、ここまではっきりと見えるとは思わなかった。
下記の回路図は、ゴーストが出ないよう改善済み。
16×16ドットLED表示 デモ
回路図
【全体】
←ゴースト版
【16×16LEDボード(BD2)】
※ 実装時には、P-CH FETはBSS84に、緑LED用のLEDは150Ωから43Ωに変更した。(緑LEDの抵抗が大きいと、黄色を表示するのが困難になる)
【ROM・RAMボード(BD1)】
←ゴースト版
【16×16LEDボード(BD2)】
※ 実装時には、P-CH FETはBSS84に、緑LED用のLEDは150Ωから43Ωに変更した。(緑LEDの抵抗が大きいと、黄色を表示するのが困難になる)
【ROM・RAMボード(BD1)】
【過放電防止回路】
LiPoを電源に使ったため、過放電防止回路を設計した。
以下に、その部分だけ抜き出した実験回路についてまとめる。
スイッチを入れると8V程度が供給されることを確認した。
OPアンプにはLM358を、P-CH FETにはFDS4675を使った。
FDS4675は、S-G間の電圧が2.2Vより小さいとOFFする。
LiPoの電圧が6.2Vを下回るあたりで、(ツェナーダイオードにより3Vに保たれている)OPアンプの+端子の電圧を-端子の電圧が下回る。
LM358の出力は+側の最大である4.3V程度(VCCの70%と仮定)となり、S-G間の電圧が1.9Vとなるので、FETはOFFする。
以下に、その部分だけ抜き出した実験回路についてまとめる。
スイッチを入れると8V程度が供給されることを確認した。
OPアンプにはLM358を、P-CH FETにはFDS4675を使った。
FDS4675は、S-G間の電圧が2.2Vより小さいとOFFする。
LiPoの電圧が6.2Vを下回るあたりで、(ツェナーダイオードにより3Vに保たれている)OPアンプの+端子の電圧を-端子の電圧が下回る。
LM358の出力は+側の最大である4.3V程度(VCCの70%と仮定)となり、S-G間の電圧が1.9Vとなるので、FETはOFFする。
部品配置
ソフトウエア
【クラス図】
Block(ブロック)、Ball(玉)、Stick(ユーザが操作する棒)、Gameの面を表すStageクラス、ユーザの入力を伝えるJoyStickクラス、クラスの生成をおこなうSystemFactoryクラスをクラスとして抽出した。
このクラス図では、アプリケーションドメインのみ表現している。
【シーケンス図風 振る舞い図】
この図は、クラス間の関連をシーケンス図の記号を使ってまとめたものだ。UMLの決まりに沿ったものではない。以下に、簡単に流れを説明する。
Stickクラス、Ballクラスは周期タスクだ。performというメソッドが割り込みにより周期的に呼び出される。
Stickクラスは、JoyStickの状態にしたがって、Stickを移動する
Ballクラスは、画面の中を移動し、壁やStickやBlockにあたると跳ね返る。BlockにあたるとBlockのOffメソッドを呼び出してBlockを破壊する。Stickにあたらずに画面の外に飛び出すと、StatusがFault状態になる。
メインループでは、Stageクラスの状態を常に監視している。
Stageクラスの状態は、BallがFaultすると失敗、Blockがすべて壊れるとクリアとなる。
Stageクラスの状態が、失敗またはクリアになると、StageクラスのStartメソッドを呼び出して新しいStageを開始する。
Block(ブロック)、Ball(玉)、Stick(ユーザが操作する棒)、Gameの面を表すStageクラス、ユーザの入力を伝えるJoyStickクラス、クラスの生成をおこなうSystemFactoryクラスをクラスとして抽出した。
このクラス図では、アプリケーションドメインのみ表現している。
【シーケンス図風 振る舞い図】
この図は、クラス間の関連をシーケンス図の記号を使ってまとめたものだ。UMLの決まりに沿ったものではない。以下に、簡単に流れを説明する。
Stickクラス、Ballクラスは周期タスクだ。performというメソッドが割り込みにより周期的に呼び出される。
Stickクラスは、JoyStickの状態にしたがって、Stickを移動する
Ballクラスは、画面の中を移動し、壁やStickやBlockにあたると跳ね返る。BlockにあたるとBlockのOffメソッドを呼び出してBlockを破壊する。Stickにあたらずに画面の外に飛び出すと、StatusがFault状態になる。
メインループでは、Stageクラスの状態を常に監視している。
Stageクラスの状態は、BallがFaultすると失敗、Blockがすべて壊れるとクリアとなる。
Stageクラスの状態が、失敗またはクリアになると、StageクラスのStartメソッドを呼び出して新しいStageを開始する。
【ドットマトリックスLED 中間色表示】
緑赤それぞれ4階調の組み合わせで16色表示を実現した。
200usごとに1行表示し、1.6msで1枚の画像を表示する。
2枚の画像をそれぞれ1.6msと3.2msで表示すると、その組み合わせにより緑と赤それぞれで4階調を表現できる。(表示時間:0ms,1.6ms,3.2ms,4.8msの4段階)
200usごとに1行表示し、1.6msで1枚の画像を表示する。
2枚の画像をそれぞれ1.6msと3.2msで表示すると、その組み合わせにより緑と赤それぞれで4階調を表現できる。(表示時間:0ms,1.6ms,3.2ms,4.8msの4段階)