PasocomMini MZ-80CでSPI通信の実験

PasocomMini MZ-80CでSPI通信の実験をしてみました。

▲PasocomMiniとラズパイ3をジャンパーワイヤーで接続します。
ワイヤーのオスメスが合わなかったので、ブレッドボードで中継してます。

▲回路図です。PasocomMiniがSPI通信のマスターです。
ラズパイ3をスレーブにします。

▲SPI通信のタイミングです。タイミング設定は0にします。

▲PasocomMini側のプログラムはSPISENDという命令を呼ぶだけです。
通信速度はかなり遅めの4800clock/secにしました。

▲実行結果です。テスト用の文字を256バイト送信し続けます。

    • -

以下、ラズパイ側のプログラムです。
マシンパワーにものを言わせて、強引にPythonを走らせてますので、ラズパイZeroでは処理速度が足りずうまく動きません。
ラズパイ3がおすすめです。

#spi recv by takuya matsubara
import RPi.GPIO as GPIO
import time

PINCE = 31
PINCLK = 33
PINTX = 35
PINRX = 37

GPIO.setmode(GPIO.BOARD)
GPIO.setup(PINTX ,GPIO.OUT)
GPIO.setup(PINRX ,GPIO.IN)
GPIO.setup(PINCLK ,GPIO.IN)
GPIO.setup(PINCE ,GPIO.IN)
time.sleep(0.01)
#---
def spi1byte( senddat ):
	mask = 0x80
	recvdat = 0
	while (mask > 0):
		state = 0
		if (senddat & mask):state = 1
		GPIO.output(PINTX ,state)
		while 1:
			if (GPIO.input(PINCLK)==1):break
			if (GPIO.input(PINCE)==1):break
		#clk = rising
		if (GPIO.input(PINRX)):	recvdat |= mask
		while 1:
			if (GPIO.input(PINCLK)==0):break
			if (GPIO.input(PINCE)==1):break
		#clk = falling
		mask = mask >> 1
	#wend
	return recvdat
#---
def spisendrecv( sendstr,bytecnt ):
	while 1:
		if (GPIO.input(PINCE)==1):break
	#ce = rising
	while 1:
		if (GPIO.input(PINCE)==0):break
	#ce = falling

	recvstr = ""
	for i in range(0,bytecnt):
		if sendstr=="":
			ch=0
		else:
			ch=sendstr[i]
		#endif
		ret = spi1byte(ch);
		recvstr += chr(ret)

	while 1:
		if (GPIO.input(PINCE)==1):break
	#ce = rising
	return recvstr

#---main
print("start")
while 1:
	buf = spisendrecv( "",256 )
	print(buf)
	print("recv "+str(len(buf))+" Bytes")


▲ラズパイ側の実行結果です。
無事に受信できました。

ポケットコンピュータ(サンプルプログラム)



▲趣味で作ったポケットコンピュータのサンプルプログラムの動画を作ってみました。
自作のインタプリタ(NicoBASIC)で動いてます。

▲長いプログラムを入力するのは大変なので、パソコン側のプログラム転送ツールを作りました。
テトリスもどきのプログラム。1kバイトの空き容量のうち993バイトを使っています。

DIM B(3)
DIM K(3)
DIM D(8)
*NG
FOR I=0 TO 6
D(I)=&HC03
NEXT
D(7)=&HFFF
GOSUB *BN
G=0:V=40
*MA
E=X:W=Y:T=0
IF SW=31 THEN G=V
IF SW=28 THEN E=E-1:GOSUB *HC
IF SW=29 THEN E=E+1:GOSUB *HC
IF T=0 THEN X=E
IF SW=30 THEN
FOR H=0 TO 2
K(H)=B(H)
B(H)=0
NEXT
FOR H=0 TO 2
FOR J=0 TO 2
B(H)=B(H) << 1
M=K(J) >> H AND 1
B(H)=B(H) OR M
NEXT
NEXT
GOSUB *HC
IF T THEN
FOR H=0 TO 2
B(H)=K(H)
NEXT
ENDIF
ENDIF
G=G+1 % V
IF G=0 THEN
E=X
W=W+1
GOSUB *HC
IF T THEN
GOSUB *FIX
IF D(0) AND &H3FC THEN GOTO *NG
ELSE
Y=W
ENDIF
ENDIF
BITMAP D,0,0,8
BITMAP B,-X,Y,3,1
GOTO *MA
*HC
T=0
FOR H=0 TO 2
M=B(H)<<E AND D(H+W)
T=T OR M
NEXT
RETURN
*FIX
FOR H=0 TO 2
D(H+Y)=B(H)<<X OR D(H+Y)
NEXT
FOR H=0 TO 5
IF D(H)=&HFFF THEN
FOR I=H TO 1 STEP -1
D(I)=D(I-1)
NEXT
D(0)=&HC03
IF V>0 THEN V=V-1
ENDIF
NEXT
GOSUB *BN
RETURN
*BN
I=RND % 7
B(0)=2
B(1)=2
B(2)=0
IF I=0 THEN B(2)=2
IF I=1 THEN B(2)=6
IF I=2 THEN B(2)=3
IF I=3 THEN B(1)=7
IF I=4 THEN B(1)=3:B(2)=1
IF I=5 THEN B(1)=6:B(2)=4
IF I=6 THEN B(0)=6:B(1)=6
X=5:Y=0
RETURN


テトリスもどきの実行画面です。
BASICプログラムはEEPROMに格納しています。
回路図とプログラムはこちら。
https://sites.google.com/site/yugenkaisyanico/pokecom

プチコンロボット

プチコン3号」で動くロボットを作ってみました。
ロボットの頭脳となるのがニンテンドー3DS
台車側はArduinoで制御してます。
Arduinoプチコンの間は4極のプラグで接続して、ピーガー音で通信しています。

ポケットコンピュータ


▲ロースペックなポケットコンピュータを作ってみました。
名前は決めてないのですが、とりあえず「DIY Pocket Computer」と呼んでます。
手のひらサイズで持ち運びできます。
材料費はおよそ1500円です。
昔作ったNicoBASICをArduinoに移植してみました。
こちらで回路図とプログラム、基板のCADデータを公開中です。
https://sites.google.com/site/yugenkaisyanico/pokecom

▲今回使用した秋月のLEDドライバです。
順方向に電気を流すとドットマトリクスLED(16x8ドット)が光り、逆向きに電気を流すとキーボードマトリクス(13x3点)として使うことができます。価格は250円。

▲ユニバーサル基板の裏側。配線がめちゃくちゃです。

▲プリント基板バージョンも作ってみました。こっちは配線がごちゃごちゃしていません。

プリント基板はP板.comに発注しました。7枚で27556円でした。1枚あたりの価格は3936円です。
100枚くらい作れば単価をもっと安くできると思います。

▲液晶搭載バージョン。まだプログラムが未完成です。

▲裏側。昇圧して5Vを供給してます。

▲動画です。