人気ブログランキング |

体重と今日食べたもの

k1segawa.exblog.jp

ダイエット

ブログトップ

カテゴリ:ポケコン( 50 )

こちらにポケコンのイメージでBAD Appleを作った方がいらっしゃって、すごいな~と思って紹介。
Movie data in one PNG image
a0034780_1843961.jpg

もちろん同じことを本当にポケコンでやろうとすると、解像度やスピードの点で頑張らないといけないが、こうやって最近?のネタで取り上げられているのを見るのはうれしい限り。
再生は液晶画面でクリック後、何かのキーを押す。
元々はこちらのサイト様の作ったページ。
ポケコンで Bad Apple !! - Simple Inspiration
by k1segawa | 2015-06-01 18:08 | ポケコン | Comments(0)
プログラム完成!

【BASICプログラム】
10:*MAIN
20:REM POKE &H60,1,1
30:OUT &H60,1
40:OUT &H61,1
50:*INIT C=10:D=0
60:*READ READ A
70:IF A=99 RESTORE *RESTORE:GOTO *INIT
80:REM POKE &H62,(A AND &HFE)
90:OUT &H62,(A AND &HFE)
100:IF (A AND 1)=0 GOTO *READ
110:REM A= PEEK &H62
120:A= INP &H62
130:REM NullBit SKIP
140:IF C=10 GOTO *NEXT
150:IF A=1 THEN D=D+(2^C)
160:IF C=0 PRINT D
170:*NEXT C=C-1
180:GOTO *READ
190:*RESTORE
200:DATA 8,0,2,6,2,6,0,4,2,6,0,5,0,5,0,5,0,5,0,
5,0,5,0,5,0,5,0,5,0,5,0,5,8,12,8,12,99

REM文のPOKE,PEEKはPC-E5,U系のためのもの。REM文をはずしたら対応するOUT/INPにREM文を付加すること。
Z80系 PC-E2,14系,G8,G85系がOUT/INP(システムバス入出力)命令を、11ピンに対してもサポートしている事(アドレス60H辺りも可能)を前提にしている。(ひょっとするとG8系はミニI/Oしかサポートしていない?そうならコマンド書式が違うし、そもそも入力3ピン、出力3ピンが異なる。もしくはE2系は命令自体がない可能性も)

まあそういう心配があるからずっと前のプログラムでは5バイト程度のマシン語を使ったのだが。それはたぶんG8系なら大丈夫と思いたい。

【解説】
10:メイン
20:E5系用
30:11ピンをパラレルポートに設定する
40:4ピン(最下位ビット)のみ入力、それ以外は出力に設定
50:初期化。Cは入力ビットのビット位置に合わせた重み(2のn乗)のカウンタ、
Dは最終入力データ(アナログ値):0-1023(2^10ビット)まで示す。
ここでは5V入れてるので5*(D/1024)Vを示す。まあ変化すれば何でもいいんだけど。
60:データリード(1CLK毎の各ピンへの出力設定値)
70:データ末尾を検出したらデータを先頭に戻して初期化へ
80:E5系用
90:4ピン用のデータの最下位ビットを除いたビットにしてから、4ピン以外へ出力。
100:4ピン用のデータの最下位ビットが立っていなければ以下の処理をスキップ
110:E5系用
以下4ピン用の処理(最下位ビットが立っていればそれは4ピンから読み込むタイミングなので)
120:パラレルポートから読込みAにセット
(設定で4ピンのみ入力に設定しているので実質4ピンのON/OFFしか読み込まれない)
130:次がNullBitの処理であることを示すコメント
140:重みのカウンタがまだ10ならそれはNullBitなのでNEXTへ飛ぶ(わざわざ10にした理由)
150:Aが1(ON)ならB9-B0のいずれかなので重みCで累乗して、Dへ加算。
160:重みCが0になったら10ビット全て処理したのでDを表示。
170:*NEXT 重みCを減算
180:データリードへ戻る
190:*RESTORE
200:データ列(末尾に99付加)

まあ自分でも読み返しづらいとは思うが、備忘録的なものとしてはこんなものかな。
最初4ピンと5ピンの結線を間違ったのは秘密だ。

これでCDSを手でさえぎったりすると800台から400台に変化するのでうまくいってるようだ。

youtube:ポケコンによるA/D変換
a0034780_12225044.jpg

(6/8訂正:動画では修正していないが実体配線図(fritzing)のプルダウン抵抗を5→4ピンに直した)
【応用】
このA/D変換入力に赤外線センサーや超音波距離センサー、温度湿度気圧センサー、CH1も使って(コマンドをCH0/1変わりばんこに送って)2次元傾きセンサーやタッチパネル(電圧で測るもの)を繋いだりすれば夢は膨らむ。

まあREADが遅いので配列化したり、Cに置き換えればもうちょっと早くなるだろう。
早くし過ぎてもタイミングチャートのMINを越えなければいい。

それにラズパイやArduinoでは何でもシリアル通信やSPI通信のライブラリを使ってしまって、ブラックボックス化しているが、これなら素のGPIO制御だけで出来ているので、回路をどんなマイコンに持っていってもインプリメント可能。(ラズパイでもArduinoでもAVRだろうがライブラリは最低限のPIN OUTPUT/INPUTだけでいい)
by k1segawa | 2015-06-01 11:24 | ポケコン | Comments(0)
プログラムの前に、回路を考えた。

今までCADLUSサーキットを使っていたのだが、MCP3002の部品がないので、簡単に部品が作れるというBSch3Vを使ってみる。

有名なので、どうかと思っていたが、案外使い方はすっと入っていけて、なんで最初からこっちにしなかったのかと(日本語も自由自在なので)ちょっと後悔。

部品も自作でき、前回のサイト様(ラズパイ用だったが)を参考に描いたのがこれ。
a0034780_16543034.jpg


CDSを使ったA/D変換という事で、CDSを繋いでいるが、別に固定抵抗や可変抵抗でもよい。
10kΩを直列につないでいるのは「分圧」。(あんまりわかってない)なのでこの値にこだわる必要はない。
CH1は使わない時はいろいろぐぐるとGNDに落とすらしい。で3ピンはGNDへ。
ポケコン側の4ピンは入力なので、いわゆるプルダウン抵抗(10kΩ程度)を接続。勉強の成果。
これがあるとLOWがはっきりGNDに繋がって安定するのだ。

あとはポケコン側の2、3ピンをショートカットっぽく描いてあるがこれでいいのかな~

MCP3002部品もデータシートを見て描いたので一応ちゃんとしているはず。

さて結線してプログラム組むぞー
by k1segawa | 2015-05-31 17:02 | ポケコン | Comments(0)
これ(前頁)を元に、いつものように、BASICのDATA文やCの配列データを組み立てる。(もちろんデータ駆動っぽくするため。別に手続型っぽく書いてもいいが)

以下の図はGoogle Sheetで記述。
a0034780_16293851.jpg

タイミングチャートのHI/LOWを1/0に変えて表現。

行2~5がタイミングチャートの青文字のピンに当たるところ。
B列C列が、行3のCLKの2拍分余計にLOWを出力している感じを表している。
C2がCSがCLKの1拍前にLOWになっているのを示す。

M5がNullBitをCLK=HIの時のみ読み出す事を示している。
以下は同じタイミングでB9~B0の値を読み出すタイミングを示す。

赤線の長いのが、データ列になるのだが、そのまま渡すのではなく、ちょっと加工しておいた。
4ピンのビット(0x62で最下位ビット)が読み出しなので、空いているのでそこを1にして読み出しタイミングを知らせようと画策した。
(別に14番目とか16番目のデータであるとかカウンタで制御してもいいのだが)

で、行9のようにビットを立てたデータ列を使う事にする。最下位ビットは0にして出力。

最初の最下位ビットが立っている場合はNullBitなので0が読み出されることを確認し、それ以降はそのタイミングで読んだデータを2の9乗~0として扱えば、シーケンシャルに10ビット入力したことになる。

最後に青線の部分だが、CSをHIに戻すのもCLK2拍分でいいかなと思い、倍加している。この36セットを1組にして繰り返せば、MCP3002からA/D変換したデータを10ビットの解像度で取得できるハズ。
by k1segawa | 2015-05-31 16:45 | ポケコン | Comments(0)
A/D変換の準備を行った。

まず、MCP3002を購入してあったのでそれを使う。
データシートはこれ
参考にしたサイト様はこちら。
ADコンバーターとフォトレジスタを使って部屋の明るさを取得しよう。 - Raspberry Pi 電子工作
[電子工作]ADコンバーター MCP3002 を使ってみた

最初SPI通信というのが、シリアル通信と勘違いし、シリアル通信ができないとインプリメントできないと思っていたのだが、たぶんそんなことはない。
単に同期クロックに合わせて、「コマンド」と言われる信号列をポケコン側から出力(MCP3002からみると入力)、クロックに合わせて変換データをシーケンシャルに入力(MCP3002からみると出力)すればいい。

そのタイミングチャートがこちら。
a0034780_15351385.jpg

この中でコマンドと言われるデータ列はサイト様を参考に「1101」とした。
スタートビット=1、シングルエンド(差動入力でない方)=1、CH0使用=0、MSB(最上位ビット)から入力=1、だ。
a0034780_1543431.jpg

この赤線で引いたところを選択した。

さてタイミングチャートを自分なりに解析した。
a0034780_15452834.jpg

クロックに合わせて縦線を引き、その時にどの信号をあらかじめタイミングよく立ててやるか、そして信号をどのポケコンのピンに割り当てるかを決めた。
青い字がポケコンのピンで、7~5が出力、4ピンを入力モードで使う。赤い線が実際にピンに与える値で、ちょっとずつずれている。

まず元の図からは、CSは最初のクロックがLOWになる直前より少し前にLOWに落としてやらないといけないという風に読める(つまりCS=LOWとCLK=LOWは同じタイミングではない)ので、じゃあクロックでいう一拍分前からLOWにしてやることに。
それが7ピンの最初の前倒しでLOWの理由。

次に灰色の所は何でもいいようなのでLOWにし、そうするとCLKはCSの前倒しに引っ張られて2拍前からLOWに。

5ピンは、前回(だいぶ前3/下)までのHPで解説したように、クロックの立上がり前からHI/LOWにしておくという事でStartのHIを最初のCLK=LOWの時からHIにしておく。CLK=HIの間もHIをキープ(つまり2拍分)。以下同様にSGL=HI、ODD=LOW、MSBF=HIもCLK2拍分キープ。

最後に、ポケコンの4ピンは入力ピンなのだが、最初のNullBitも同じ考え方で、CLK=LOWになったらNullBit=LOWになり、CLK=HIの間はキープされ、次のCLK=LOWの立下り直前まで安定していると読めるので、CLK=LOWの時はあえて読み出さず、CLK=HIの時に読み出す。それが4ピンが赤の点線になっている理由。

もちろんB9以降は点線が2本になっているがHI/LOWのどちらかという意味。NullBitはLOWだからね。
by k1segawa | 2015-05-31 16:04 | ポケコン | Comments(0)
次にA/D変換でMCP3002を使ってみるので、前回の回路をfritzingで描いておく。
a0034780_1914855.jpg

by k1segawa | 2015-05-30 19:14 | ポケコン | Comments(0)
しばらく間が空いてしまった。

リハビリを兼ねて5/6のBASICプログラムをC にしてみる。

【BASICプログラム】
10:OUT &H60,1
20:OUT &H61,1
30:A=INP &H62
40:IF A=1 THEN OUT &H62,2 ELSE OUT &H62,0
50:PRINT A;
60:GOTO 30

TEXTモードにして入力(メニューからEditを選ぶ)。

【Cプログラム】
10  main() {
20 unsigned char a;
30
40 outport(0x60,1);
50 outport(0x61,1);
60 loop:
70 a=inport(0x62);
80 if(a==1) {
90 outport(0x62,2);
100 } else {
110 outport(0x62,0);
120 }
130 printf("%d",a);
140 goto loop;
150 }
念の為、TEXTモードでセーブ(メニューからSAVEを選ぶ。)
FileName=SW.C とする。

Cモード(Shift+TEXTボタン)にして、コンパイル(メニューからCompile)して実行(メニューからGo)すると、画面には0がずらーっと。SWを押すと0の後に1が続けて表示。押すのをやめると、0に戻る。
a0034780_20571068.jpg

BASICよりは全然早いが目に留まらぬほどでもない。画面表示が遅いのか?
従ってチャタリングによるSW押下時の101010みたいなSWの接点バウンド(バウンダリング)は、見られなかった。
by k1segawa | 2015-05-27 21:03 | ポケコン | Comments(0)
512KRAMカードを購入した。

使い方がわからないので、メモ。
・買ったばかりはバックアップ電池が付いているのでCR1616は買わなくてよい。
・バンク1、書込み可にSWはなっているのでそのまま差し込めばよい。
・RAM用裏蓋を開けたら、本体の右側の矢印のついた引っかけ器具をしっかり引っ張って引っかける事。すこしやりずらい。
・電源ONしてもなにもでない。
・FRE0でも増えない。
・でもFiles"S2:"とやると空で、SAVE"S2:XXX.BAS"とやるとFiles"S2:"でXXX.BASが表示される。
Files"S1:"でデフォルトのファイル(DATA/TEXT/AER/KEY?)が保存されているのがわかる。

念の為、電源OFFにして、電源ONキーを押しながらリセット穴を突き、突きをやめてから電源ONキーから手を放す。
ナイゾウメモリ(S2:)
シヨウシマスカ?(Y/N)・・・1
ショキカシマスカ?(Y/N)・・・2
ナイゾウメモリ(S1:)
ショキカシマスカ?(Y/N)・・・3

と出てくるようになる。
1でY,2はXXX.BASを消したくなかったのでN,3はNでデフォルトのファイルを残した。

相変わらずメモリは増えない。(3.2万/6.6万)

ところが、
MEM$="S2"
としたら、Files"S2:"でデフォルトのファイル(DATA/TEXT)が自動作成された。
これは!と思って、
FRE0とやると26万ぐらいの値に増えた。
やったー!
Files"S1:"とやるとデフォルトのファイルは残っている。

つまりMEM$="S2"は256/512KBRAMではMEM$="B"と同じらしい。(MEM$="B"は出来ないらしい)
ただし本体のメモリは統合されず、256KB。(+32/64KBではない)
でもその代り、Files"S1:"で本体の32/64KBのエリアにファイルを置くことはできる。

つまり、
【MEM$="S1"実行後】
S1=32/64KBが本体メモリ(プログラムエリア)とファイルデータエリア。
S2=256KBがファイルデータエリア。

【MEM$="S2"実行後】
S1=32/64KBがファイルデータエリア。
S2=256KBが本体メモリ(プログラムエリア)とファイルデータエリア。

ここでいう256KBは256KBRAMカードの事。512KBRAMカードのバンク1/2でもある。

~RAMファイルというのとは違う。RAMファイルとはRAM上にランダムアクセスできる仮想のデータファイルを作ること。ファイルエリアは領域確保(HDDのようなもの)だが、RAMファイルはファイルの確保。~
(まあRAMファイルはめったに使わないので忘れてよい―住所録のような”データ”を保存するのにファイルオープン関数を使う時ぐらい)
by k1segawa | 2015-05-15 00:57 | ポケコン | Comments(0)
だいぶ間が空いたが、ポケコンに入力を行う回路の作成を再開する。

2つ方式があって、チャタリングをソフトで行う場合とハードで行う場合のケースがある。

回路を単純にするならソフトで行うのだが、ポケコンがチャタリングの短い読み出し間隔で処理できるかが、問題となる。もちろんC言語でコンパイルして速度を上げてもいいし、一部をマシン語で組んでもいい。

ハードならチャタリングを解消するのはシュミットトリガ・インバータ(74HC14)とRC回路という抵抗とコンデンサを合わせたものが必要になる。
第1章 電子回路の基礎知識様の下の方にRC回路の話とシュミットトリガ・インバータの話がある。

あと、再開前のポケコン PC-G850Vで電子回路工作(4/12)では、プルダウン抵抗、さらに前のポケコン PC-G850Vで電子回路工作(3/31)では、プルアップ抵抗を検討していたが、なんで両方ともVccやGNDに直結でいいのか疑問だった。よくある回路ではTTLだろうとMOS-FETだろうとVcc・GND側にも10kΩ程度の抵抗が入っていた。

教えて!goo の IC未使用端子処理のプルダウン/プルアップ抵抗でそのことが分かった。

結局直結でいいのだが、プルダウンかプルアップにするかはポケコン内部の回路がNPNかPNPかわからないと本来危ない。なのでどちらでも大丈夫なように?(この理由がわかるのが当然のように書かれているが私にはわからない)抵抗を入れるらしい。で1K~100KΩでよいのだが、のちの改造を考えて10kΩらしい。
さらにマイコンポートは出力との切り替えもできるから誤って出力(やりそう・・・)その時直結はまずいので抵抗を入れるというのはNo.1回答者の答えにある。

うーん、以前作った回路にはやっぱり10kΩを入れとこう。そしてチャタリングを解消するようなソフトを第一弾で作成する事にする。前回までのは、スイッチ離しっぱなしか押しっぱなしの時の入力値だからね。
by k1segawa | 2015-05-06 13:33 | ポケコン | Comments(0)
さらに、MOS-FETトランジスタ(頭痛が痛いで気持ち悪いが)は、N型、P型の違いで特徴がある。

N型:ゲートに+を加えるとソース/ドレイン間に電流が流れる。
P型:ゲートに-を加えるとソース/ドレイン間に電流が流れる。

ソースはVssでGND、ドレインはVddで+3.3~の電源で、N型・P型で電流の向きが変わる訳では無い。あくまでもドレインの+からソースの-へ流れる。

これは、CMOSデジタル回路様の図を見るとわかる。
N型の説明だが、
N型だとゲート付近に「電子」が集まり、N型の間に電子の橋ができソース←ドレインの方向に電流が流れ、
P型だとゲート付近に「正孔」が集まり、P型の間に正孔の橋ができソース←ドレインの方向に電流が流れるのだ。

===============================

これを踏まえるとCMOSの原理がわかる。
CMOSのWikipediaより、CMOSによるインバータという図で、上の○があるのがそれ全体でP型MOS-FETであり、下の○無しがN型MOS-FETである。

A(IN)に+の電圧をかけると両方のゲートにかかる。P型だけ○で-になる訳では無いことに注意。
すると上記の特徴からN型のみ機能しVssへ電流が流れてQ(OUT)から電流が流れ込み-を示すことになる。
A(IN)に-の電圧をかけると、P型のみ機能しVddから電流が流れてQ(OUT)へ電流が吐き出され+を示すことになる。

つまり+をかけると-を示し、-をかけると+を示し、インバータ(反転)機能となる。

===============================

【プッシュプル回路】
MOS-FETで上記のWikiの回路を組むとCMOS(インバータ)と言われ、
バイポーラトランジスタで組むとプッシュプル「増幅」回路と呼ばれるようだ。
MOS-FETで組んで”プッシュプル回路”と呼んでいるのは一部の古い書籍だけのようだ。
よってプッシュプル回路はバイポーラトランジスタによる(コイルでもできるようだ)増幅回路の事であり、
最初に戻ってGPIOの出力回路に採用されているのは、CMOSインバータ回路と呼ぶべきだろう。
by k1segawa | 2015-05-06 01:10 | ポケコン | Comments(0)