(別室)動く作品のページ
※このページは個人的な趣味によって書かれており、著者は全ての内容について、いかなる責任も負いません。
このページは、PICや他のCPUを使った、動く作品の製作を紹介しています。
また、知識データベースで自走する大型ロボットを作る事を一つの目標にしています。
このページでは、内容が複雑になるので計算式は省略しています。計算式については、
「(別室)計算のページ」 で説明しています。
●重要なお知らせ(訂正とお詫び)●
1.ADM3202のコンデンサの接続について
このHPのADM3202を使った回路図では、ADM3202の2ピンにつながっている0.1μFのコンデンサをGndにつないで
実験していますが(図a)、ADM3202のデータシートでは、このコンデンサはVccにつなぐようになっています(図b)。
実験では、このようなつなぎ方でもICのチャージポンプは正常に動作していますが、データシートでは(図b)のように記述され
ているので、データシートの通りに(図b)のようにしたほうがいいと思います。
小さな作品を作る
●簡単なマイコンバギーを作ってみる①
マイコンを乗せた簡単な実験用バギーを作ってみました。
赤外線リモコンで操作したり、知識ベースを載せて自走させる実験に使うためのものです。
1.まずは、車体(シャーシー)の製作 (シャーシー部分の制作費:1500円程度)
CPUボードを取り付けるための木片(ダイソーで100円で購入)に、田宮模型のギヤセットとバギー用のタイヤセットを
取り付けます。
自作した軸受け以外の製作に必要なものはドライバー1本と、付属の6角レンチくらいで、2時間もあればできてしまいます。
田宮模型のギヤセット「ダブルギヤボックス:No168」は、ギア比を高速~低速までの4段階から選択して組み立てられるように
なっているが、ギア比は最も低速の「344.2:1」を選択しています。
このギア比だと、モーターに3Vの電圧をかけると、手では止められないくらいのトルクがあります。
タイヤセットは、田宮模型の「オフロードタイヤセット:No96」を2台使用しました。
このタイヤは空気タイヤで、力を加えると適度に変形してゴムが密着するため、オフロードでなくても強いグリップ力があります。
実験では30度くらいに傾斜させたテーブルの上でも、タイヤが空回りする事無く登っていました。
ただし、前輪タイヤの軸受けだけは、市販のものでは寸法がこの木片に合わないので、ホームセンタで買ったL字アングル
で自作(軸受け用に穴をあけただけだ)しています。
シャフトは、ギアボックスについてくる50mmでは足りないので、100mmのものに交換しています。
写真
2.次に、ドライバーを載せる (この部分の制作費:1000円程度)
電池ボックスと、モータをドライブするためのトランジスタを載せます。このモータは上限が3Vです。
トランジスタに手持ちの小型のものを使ったために損失に余裕がなく、やむなくダイオードで電圧を落として使っています。
本当は、もっと大きなトランジスタを使うか、パワーMOSFETを使うべきです。
モーターはかなりノイズを発生するので、モーターの両端には0.047μFのコンデンサをつけています。
この方法は、ラジコンやマイコンで模型用のモーターを動かす時には一般的ですが、
実際には、コンデンサ程度ではノイズ対策は充分ではなく、オシロで測定すると、電源ラインにはかなりノイズが乗っていて、
マイコンを誤動作させる可能性はあります。
写真
回路図(電源部)
回路図(モータードライバー部)
3.次に、センサーを取り付ける
(1)超音波センサーを取り付ける (この部分の制作費:1500円程度)
障害物を検知し、障害物までの距離を測定するために、超音波センサーを載せます。
このセンサーボードを使った事例は、「PIC奮闘記」や「別室AVRのページ」で取り上げています。
超音波センサーは、マイコンを使って、障害物までの距離に応じた制御ができるので、この種のセンサーには最適です。
写真
回路図 ※詳細は「PIC奮闘記」や「別室AVRのページ」で取り上げています
(2)測離センサーを取り付ける
秋月電子で販売されているシャープ製の測離モジュールは、光学式で、10~80cmの距離がモジュール単体(追加の回路も
マイコンも不要)で測定できるので、この類の障害物センサーとしては最適です。
また、価格が400円程度と安いので、大量に使っても、大きな出費にはなりません。
写真 ※適合する3Pコネクタは購入できなかったので、ジャンク屋で購入した10Pのものを切断して使っています
(3)フォトリフレフタを取り付ける
(4)赤外線センサーを取り付ける
工事中!!
4.CPUボードを載せれば完成
工事中!!
知識ベースを作る①
●CYGWINとGCCによる簡単なシミュレーション
※注)CYGWINについては、
「(別室)Cygwinのページ」 で説明しています。
プログラムやリモコンで動かすだけではつまらないので、いくつか簡単な知識ベースを作ってみました。
CYGWINでGCCを使ったのは、組み込み型CPUへの移植を容易にするためです。
PIC、AVR、SH、ARM等に載せる事を想定していますが、ここでは具体的な移植の配慮はしていません。
それらの詳細は、「大型ロボットを作る」の項で紹介していく予定です。
サンプルは、Windowsパソコンでそのまま見れるように、パソコン用にコード変換してあります。
日本語は使っていないので、文字コードは気にしなくていいのですが、このサンプルをCYGWINで使うためには、
エディタで保存する時の指定で、ファイルの改行コードを \r\n(0D0A) => \n(0A)にして保存する事が必要です。
※Cygwinの日本語処理は完全とは言えないので、日本語は使わない方が無難です。
エディタのファイルを保存する時の指定 画面は使用しているエディタにより異なります
1.迷路を解いて、いろいろなルートを一筆書きで進む
簡単な迷路のサンプル
準備中!!
(2)出発点と到着点を設定し、一筆書きルートを解析する。
(ルートが複数考えられる場合、乱数でルートを選択する)
(1)で作成されたデータベースから、進むべきルートを作成するプログラムです。
毎回同じルートではつまらないので、複数ルートが考えられる場合は、乱数で、ルートを選択するようにして
あります。
重複するデータを複数書いてやれば、特定の区間が選択される確率を高くする事もできます。
簡単で短いC言語のプログラムですが、再帰呼び出し(リカーシブコール)を使っているので、C言語を使い慣れて
いないとわかりにくいプログラムかも知れません。
実行イメージ
上記の「迷路」で、出発点;A1、到着点;D4を設定すると、そのルートが表示されています
データベースのフォーマット
Cygwinの場合、PostageSQLを使ったほうが簡単ですが、移植の容易さのために単なるテキスト形式にしています
・レコードの並び順番は、バラバラで良い
・項目の区切りは、半角の1文字スペース
重複するレコードを書くと、その区間が選択される確率が高くなります
プログラムソースサンプル(CYGWIN gcc用 C言語プログラム)
データベースサンプル(CYGWIN 上記プログラム用 サンプルデータベース)
2.GIS(地図情報システム)への応用
(1)出発点と到着点を設定し、地図上で一筆書きルートを解析する。
(ルートが複数考えられる場合、乱数でルートを選択する)
1のサンプルプログラムは、文字列を検索しているだけなので、事象でも、地名でもどんなデータでも利用可能です。
例えば、データとして、緯度経度情報を与えてやれば、地図上でルートを検索するような使い方もできます。
但し、緯度経度情報をデータで持つような電子地図は、私が知っているメーカのものは、かなり高価です。
また、この検索結果を地図に重ね合わせるためには、地図システムの基礎知識が必要となります。
簡単な地図のサンプル 数字は緯度・経度情報を想定しています
実行イメージ 数字は緯度・経度情報を想定しています
プログラムソースサンプル(CYGWIN gcc用 C言語プログラム) ※注)1と全く同じプログラムです
データベースサンプル(CYGWIN 上記プログラム用 サンプルデータベース)
3.ネットワーク型演算で、ロボットの自由な意志で行動を行なわせる
乱数やプログラム通りに動く作品ではつまらないので、リアルタイムに更新される知識ベースを作成し、予測不可能な動きを、
なるべく簡単な方法でおこなわせようというものです。
プログラム自体は、簡単なネットワーク型の演算で、動作の全てはデータベースの演算結果により確定されます。
ここでは内容が難しくなりすぎるので、このサンプルは簡易バージョンです。
本バージョンとして検討しているものは、個々の事象を標準偏差(多次元関数)で加重するものです。
ネットワーク型計算用データベースのイメージ図
一般的なプログラムで書いた場合のイメージ図
イメージ図
(2)知識ベースから、次の行動を確定させる
簡易バージョンのプログラムを作ってみました。
シミュレーションなので、入出力は画面から行なっていますが、実際の入力はセンサーから、出力はモータ等を
想定しています。
データベースサンプルは、動作がわかるレベルの簡単な行動パターンをデータベースにしただけです。
簡易バージョンは確率計算をしていないので、経験則等は反映されず、どのアクションが選択されるかは単に乱数に
よっていますが、重複するレコードを書くことで、特定の項目の選択される確率を高くする事はできます。
実行イメージ
データベースサンプルの内容(図は多少簡略化して書いてあります)
データベースのフォーマットは上記と同じだ
ただし、それぞれの項目に値を持たせるように記述する事もできます。
例1)特定の条件を満たした時のみ、条件を成立させる場合
(項目)=(条件値) (項目)[=(条件値)]
例2)項目の値をチェックする(シミュレーションでは、画面より応答を求める)
(項目) (項目)?
プログラムソースサンプル(CYGWIN gcc用 C言語プログラム)
データベースサンプル(CYGWIN 上記プログラム用 サンプルデータベース)
(3)自由な行動から、知識ベースを更新する
1)新規項目の追加
上記の簡易バージョンのプログラムに、説明のために、知識ベースに定義を追加するデータを書き足したものです。
(プログラムは、同じものです。)
事例は、前方、左方、右方のいずれかに障害物があって進めない時に、新たな解決方法を追加知識として入力するように
応答を求められたので、「後方をチェックして、障害があれば右方をチェックせよ」という新たな知識を追加したものです。
実行イメージ
サンプルの内容(図は簡略化して書いてあります)
プログラムソースサンプル(CYGWIN gcc用 C言語プログラム)
※プログラムは上記サンプルと同じものです
データベースサンプル(CYGWIN 上記プログラム用 サンプルデータベース)
※上記サンプルにネットワークの追加要求の項目を書き足したものです
(項目) (項目)#と書くと、ネットワークの追加定義の要求を求めてきます
準備中!!
(4)その他
知識ベースを作る②
●AVRマイコンとAVR-GCCによる簡単な知識ベース
※注)アトメル社のAVRマイコンについては、
「(別室)AVRのページ」 で説明しています。
CYGWINでGCCを使って作った上記簡易型知識ベースを、AVRマイコンに移植してみました。
AVRマイコンはフリーのGCCコンパイラーが使えるので、コードの書き換えは比較的容易です。
CPUは、ATmega128/ATmega64を使用しています。
1.AVRで知識ベースを動かす① (ATmega128/ATmega64)
CYGWINで作った簡易型知識ベースを、ATmega128/ATmega64で動かすものです。
サンプルは簡単なシミュレーションですが、例えばポートにセンサーやモータをつなげば、そのまま多目的に使用可能です。
このサンプルは、「(別室)AVRのページ」で紹介している「実験ボード・タイプ1D(ATmega128/ATmega64)」
の「②ルーレットアダプタをパソコンにつなぐ」をそのまま使用し、モニタ用にWindowsパソコンの
「ハイパーターミナル」とルーレットのLEDを使っていて、モータを動かす代わりに該当のLEDが点燈します。
ヒューズビットや、「ハイパーターミナル」等の設定は、この記事の中で紹介している通りです。
基本的に、この類のデータを扱うプログラムは、データ用のメモリーが、CPUのメモリーだけでは足りず、外部にSRAMや、
データ保存用のメモリーの増設が必要になります。
このプログラムの場合も、本来はメモリーを増設し、データは外部のメモリーに書き込むような使い方を想定しています。
このサンプルでは、簡素化のために、これらメモリー関係の増設を省略して、初期データはプログラム中に埋め込んでいます。
このままではメモリーが少ないので、処理できる知識ベースは、このサンプル程度が上限です。
また、外部のメモリーにデータを保存しているわけではないので、変更されたデータは、電源を切ると初期状態に戻ってしまいます。
写真(「(別室)AVRのページ」と同じです)
回路図(「(別室)AVRのページ」と同じです)
サンプルの内容(上の図は多少簡略化して書いてあります)
実行イメージ
プログラムソースサンプル(AVR ATmega128/ATmega64 avr-gcc用 C言語プログラム)
2.AVRで知識ベースを動かす② (ATmega128/ATmega64)
「1.AVRで知識ベースを動かす①」のメモリー増設バージョンです。
それ以外は、上記のサンプルと同じものです。
このサンプルは、「(別室)AVRのページ」で紹介している「実験ボード・タイプ2D(ATmega128/ATmega64)」をそのまま
使用しています。
上記同様、モニタ用にWindowsパソコンの「ハイパーターミナル」と、ADC/パラレルポート(PORTF)に
上記でも使ったルーレットのLEDをつないでいます。
ハイパーターミナルへの接続条件や、ヒューズビットの設定は、この記事の中で紹介している通りです。
初期データは、24C型のSerial EEP Rom(AT24C256)の0番に書き込んでおく必要があります。
Serial EEP Romへの書き込みは、どんな方法でもいいのですが、このサンプルでは、秋月電子の「Serial EEP Programer」
※注)PIC Programer Version4バージョンアップキットに付属している を使用しています。
写真(「(別室)AVRのページ」と同じです)
回路図(「(別室)AVRのページ」と同じです)
サンプルの内容(上の図は多少簡略化して書いてあります)
プログラムソースサンプル(AVR ATmega128/ATmega64 avr-gcc用 C言語プログラム)
プログラムソースサンプル(Atmel AT24C256 Serial-EEP-Programer用 ASMファイル)
3.AVRで知識ベースを動かす③ (ATmega128/ATmega64)
ハイパーターミナルの画面ではつまらないので、上記ボードの「ADC/パラレルポート」に、簡単なアダプタ(LEDとSW)を
つけてみました。
マイコンバギーに載せる事を意識したものです。
前方(左/前/右)に障害物がある時(該当のSWが押された状態)、進むべき方向をLEDで表示します。
進む以外に、知識ベースがそれ以外の解決方法を選択する可能性もありますが、その時は中央のLEDが点燈します。
全てのボタンを同時に押すと、進める方向がないので、中央のLEDが点燈するのみになります。
写真
イメージ図
ハイパーターミナルのイメージ
※入力はSWなので、パソコンにつながなくても動作するが、ハイパーターミナルにつなげば動作をモニタできます
回路図
サンプルの内容(このサンプルの入力はSWだけなので、ノウハウ入力の知識レコードは割愛してあります)
プログラムソースサンプル(AVR ATmega128/ATmega64 avr-gcc用 C言語プログラム)
※このサンプルは、シリアルEEPは使っていません
知識ベースを作る③
●V850による簡単な知識ベース
※注)V850は、NECの32ビットCPUです。詳細は、
「(別室)おまけのページ」 で取り上げています。
1.V850で知識ベースを動かす (V850:μPD70F3716GC)
上記「1.AVRで知識ベースを動かす① (ATmega128/ATmega64)」で作ったものを、「インターフェース」2007年5月号
付録のV850ボードに移植してみました。
USBでパソコンにつないで、ハイパーターミナルを起動し、「Enter」キーを押すと、プログラムが起動します。
この付録ボードは開発が簡単なので(USBから電源が取れるので、仕事の移動中でも作業できる)移植してみたものです。
但し、ハイパーターミナルの設定が38400[BPS]で、AVRのサンプル(9600[BPS])とは異なるので注意が必要です。
注意!! V850のポートは、PICやAVRのような、大きな電流は流せません。
このサンプルのような、V850のポートに直接LEDをつなぐ使い方は、V850マイコンの故障の原因に
なるかも知れません。
写真(「(別室)おまけのページ」のV850の実験基板をそのまま使用しました)
回路図(「(別室)おまけのページ」のV850の実験基板をそのまま使用しました)
サンプルの内容(AVRのサンプルと同じです)
ハイパーターミナルのイメージ ※注)通信スピードは38400[BPS]です
プログラムソースサンプル(V850用 Gnuツール・Gnu-gcc用 C言語プログラム)
上記、Gnuプログラムを含むフォルダ全て ※コンパイル方法は、Cygwin上でmakeするだけです
●H8/3664(Tiny)による簡単な知識ベース
※注)H8/3664(Tiny)は、ルネサステクノロジー社の16ビットのCPUです。
詳細は、
「(別室)H-8で遊ぼうのページ」 で取り上げています。
1.H8/3664(Tiny)で知識ベースを動かす① (H8/3664F + gcc)
上記「1.AVRで知識ベースを動かす① (ATmega128/ATmega64)」で作ったものを、H8/3664に移植してみました。
ボードは、「(別室)H-8で遊ぼうのページ」で作成した実験ボードをそのまま使用しています。
このCPUは、RAMが2Kバイトしかないので、プログラムは多少変更してあります。
(プログラム用のROMの容量は充分なのですが、標準関数をそのまま使うと、データ用のRAMが足りなくなってしまいます)。
ハイパーターミナルの設定は、上記のV850のサンプルと同様で、通信スピードは38400[BPS]です。
写真(「(別室)H-8で遊ぼうのページ」の「実験ボード・タイプ1A」をそのまま使用しています)
回路図(「(別室)H-8で遊ぼうのページ」の「実験ボード・タイプ1A」をそのまま使用しています)
サンプルの内容(AVRのサンプルと同じです)
ハイパーターミナルのイメージ ※注)通信スピードは38400[BPS]です
プログラムソースサンプル(H8/3664用 Gnuツール用 C言語プログラム)
H8/OSの開発環境 ※上記、C言語プログラムを含むフォルダ全て
※コンパイル方法は、Cygwin上で「make」を実行するだけです
2.H8/3664(Tiny)で知識ベースを動かす② (H8/3664F + H8/OS + gcc)
上記の知識ベースを、バギーに載せるために、もう少し具体化したものです。
詳細は、上記のAVR Mega128/64で作ったものと同じです(Mega128/64で作ったアダプタをPORT5につないだだけです)。
ハイパーターミナルの設定は、上記同様、通信スピードは38400[BPS]です。
注意!! H8/3664のPORT5は大電流ポートではありません。
このサンプルのようなLEDを直接PORT5につなぐ使い方は、H8マイコンの故障の原因になるかも知れません。
写真(Mega128/64で作ったアダプタを、H8/3664のPORT5につないだだけです)
回路図(Mega128/64で作ったアダプタを、H8/3664のPORT5につないだだけです)
サンプルの内容(入力はSWだけなので、ノウハウ入力の知識レコードは割愛してあります)
イメージ図 (AVR Mega128/64の例と同じです)
ハイパーターミナルのイメージ ※注)通信スピードは38400[BPS]です
プログラムソースサンプル(H8/3664用 Gnuツール用 C言語プログラム)
H8/OSの開発環境 ※上記、C言語プログラムを含むフォルダ全て
※コンパイル方法は、Cygwin上で「make」を実行するだけです
●SH2(SH7125F)による簡単な知識ベース
※注)SH2マイコンについては、
「(別室)SH-2(SH7125F/SH7144F)で遊ぼう」のページで取り上げています。
1.SH2で知識ベースを動かす (SH7125F + HEW)
上記「1.H8/3664(Tiny)で知識ベースを動かす① (H8/3664F + H8/OS + gcc)」で作ったものを、SH7125に移植してみました。
ボードは、「(別室)SH-2(SH7125F/SH7144F)で遊ぼう」のページで作成した実験ボードをそのまま使用しています。
このCPUは、RAMが8Kバイトもあるので、AVR/MEGA128バージョンでも、そのまま移植が可能です。
(CPUのスペックは、SH7125のほうが、AVR/MEGA128やH8/3664よりも上になります。)
ハイパーターミナルの設定は、通信スピード9600[BPS]にしてありますが、このCPUの場合は、38400[BPS]にしても何も問題はありません。
9600[BPS]にしたのは、PICやAVRに合わせただけです。
このプログラムはHEWで開発していますが、GCCで開発しても全く問題はありません。
写真(「(別室)SH-2(SH7125F/SH7144F)で遊ぼう」の「実験ボード・タイプ1」をそのまま使用しています)
回路図(「(別室)SH-2(SH7125F/SH7144F)で遊ぼう」の「実験ボード・タイプ1」をそのまま使用しています)
サンプルの内容(AVRのサンプルと同じです)
ハイパーターミナルのイメージ ※注)通信スピードは9600[BPS]です
プログラムソースサンプル(SH7125用 HEW C言語プログラム)
●SH2(SH7144F)による簡単な知識ベース
※注)SH2マイコンについては、
「(別室)SH-2(SH7125F/SH7144F)で遊ぼう」のページで取り上げています。
1.SH2で知識ベースを動かす① (SH7144F + HEW)
上記「SH2(SH7125F)」用を、SH7144Fに移植したものです。
ボードは、「(別室)SH-2(SH7125F/SH7144F)で遊ぼう」のページで作成した実験ボードをそのまま使用しています。
ハイパーターミナルの設定は、通信スピード9600[BPS]にしてあるが、もっと高速にしても何の問題もありません。
9600[BPS]にしたのは、PICやAVRに合わせただけです。
このプログラムも、上記同様、HEWで開発したが、GCCで開発しても全く問題はありません。
写真(「(別室)SH-2(SH7125F/SH7144F)で遊ぼう」の「実験ボード・タイプ1」をそのまま使用しています)
回路図(「(別室)SH-2(SH7125F/SH7144F)で遊ぼう」の「実験ボード・タイプ1」をそのまま使用しています)
サンプルの内容(AVRのサンプルと同じです)
ハイパーターミナルのイメージ ※注)通信スピードは9600[BPS]です
プログラムソースサンプル(SH7144用 HEW C言語プログラム)
2.SH2で知識ベースを動かす② (SH7144F + HEW)
Mega128/64で作ったアダプタを使ったバージョンです。
写真
回路図(電源が3.3Vなので、LEDは赤色でないと動作しません)
サンプルの内容(AVRのサンプルと同じです)
イメージ図 (AVR Mega128/64の例と同じです)
ハイパーターミナルのイメージ ※注)通信スピードは9600[BPS]です
プログラムソースサンプル(SH7144用 HEW C言語プログラム)
3.SH2で知識ベースを動かす③ (SH7144F + TOPPERS/JSP)
準備中
TOPPERS/JSPを使ったバージョンです。
リアルタイムOSを使うと、プログラムの処理を多機能にしやすくなります。
●PIC(PIC24FJ64GA002)による簡単な知識ベース
※注)マイクロチップ社のPICマイコンについては、説明する必要はないと思われますが、
「PICのページ」 で
取り上げています。
1.PICで知識ベースを動かす (PIC24FJ64GA002)
上記で作った簡易型知識ベースを、PIC24FJ64GA002に移植してみました。
内容は、上記AVR(Mega64/128)や、V850、SH-2で作ったものと同じものです。
マザーボードは、
「PIC奮闘記」 の「16ビットPIC 実験ボード タイプ1」で紹介したものをそのまま使用しています。
パソコンとの接続条件は、AVRのサンプルと同じ(通信速度9600BPS、データビット:8、パリティー:なし、ストップビット:1、フロー制御:無し)です。
また、モニタ用に、PORTBに、AVRや、V850のサンプルでも使ったルーレットアダプタ(単なる8個の抵抗とLED)
を接続しています。
写真
回路図
サンプルの内容(上記、Mega128/64のサンプルと同じです)
ハイパーターミナルのイメージ
プログラムソースサンプル(PIC24FJ64GA002用 C30用 C言語プログラム)
知識ベースを作る④
●ActiveBASICによる簡単な知識ベース
※注)ActiveBASICについては、
「ActiveBASICのページ」 で取り上げています。
知識ベースを、リソースが豊富なパソコン上に作る事を考えています。
知識ベースはパソコンとロボットの両方に持たせて、ネットや無線で通信させた方が、知識ベースの学習機能が
効率的に働きます。
各独立した知識ベースが、気まぐれな知識交換を行うので、個性的な知識ベースが誕生していきます
ある知識ベースの行動例
工事中!!
小型ロボット(試作機)を作る
工事中!!
大型ロボットを作る
工事中!!
金属のページ
詳細は、
「(別室)金属で遊ぼうのページ」 で取り上げています。
ただいま、準備中!!
問い合わせ先(代表者)E_MAIL BYP03364@nifty.ne.jp
※ウイルス感染防止のため、容量の大きなもの、添付ファイルのあるもの、テキスト形式以外のメールは
全て削除されます。
また、個々の質問については、お答えできません。