諸々の記録

その時々 興味にある事について

MachiKaniaでPCとファイル送受信できる簡易ファイルマネージャーを作ってみた

前回、前々回の記事で、MachiKaniaとPCでファイルの送受信のプログラムをPowerShellを使って作ってみました。

このファイルをMachiKaniaからPCを送信するプログラムでは、ファイル名をプログラムに書いておく必要があり、これはちょっと手間がかかり、使い勝手がよくありません。
なので、MachiKaniaのSDカードにあるファイルを選択するプログラムを作成してプログラム中にファイル名を書く必要がない様にしたいと思い、簡易的なファイルマネージャーを作ってみました。

MachiKaniaの SAMPLES にSDカードのファイルを操作するファイルマネージャーのサンプル(FILEMAN.BAS)があるので、ファイル名を配列に格納して表示する方法やキーのスキャン方法等を参考にさせていただきました。

この簡易ファイルマネージャーのプログラムリストは下記。

FMANL.BAS

REM -------------------------------------
REM  File Manager lite
REM    for Machikania Ver. 1.7 or later
REM -------------------------------------
USEGRAPHIC
USEVAR PX,PY,FCNT,SELF,REDISP,MODE,BRTE
MODE=0:REM Set File mode (1:Dir mode)
BRTE=9600:REM Set Baud Rate

LABEL TOP
REDISP=0
DIM F(280):REM MAX (40Col*22Row)/4Byte
CLS:LINE 0,195,310,195,5

COLOR 4:PRINT "Dir: "+GETDIR$()
GOSUB FOOTDSP:REM Print foot area

REM Read file/dir FINFO=16:Dir
COLOR 7:N=0
IF MODE=1 AND LEN(GETDIR$())!=1 THEN GOSUB STRCPY,F,"/[Root]":N=1
S$=FFIND$("*")
DO WHILE LEN(S$)
 IF MODE=0 AND FINFO(3)!=16 THEN
  GOSUB STRCPY,F+N*13,S:N=N+1
 ELSEIF MODE=1 AND FINFO(3)=16 THEN
  GOSUB STRCPY,F+N*13,S:N=N+1
 ENDIF
 IF N>=66 THEN BREAK:REM MAX 66 items
 S$=FFIND$()
LOOP
FCNT=N-1:REM FCNT=Item count

REM Print file/dir list
E=F:COLOR 7
IF MODE=1 THEN COLOR 6
PX=0:PY=0
FOR I=0 TO FCNT
 PX=I%3:PY=I/3:REM Calc disp position
 CURSOR 1+PX*13,PY+2:PRINT E$
 E=E+13
NEXT
DELAYMS 10:REM Wait 10mS

REM Select file/dir
SELF=0:REM Selected file No.
GOSUB DSPCUR,SELF,0
DO
 IF J=KEYS() THEN
  L=0
 ELSE
  L=KEYS():J=L
 ENDIF
 K=((READKEY() AND $FF00)>>8)
 IF K=27 OR L=33 THEN BREAK
 IF (K=39 OR L=8) AND SELF=1 THEN
  GOSUB DSPCUR,SELF,-1:SELF=SELF-1
 ELSEIF (K=38 OR L=1) AND SELF-3>=0 THEN
  GOSUB DSPCUR,SELF,-3:SELF=SELF-3
 ELSEIF (K=40 OR L=2) AND SELF+3<=FCNT THEN
  GOSUB DSPCUR,SELF,3:SELF=SELF+3
 ELSEIF K=82 OR L=20 THEN
  GOSUB RCVFIL
  IF REDISP=1 THEN BREAK
 ELSEIF K=13 OR L=32 THEN
  GOSUB FILOPE
  IF REDISP=1 THEN BREAK
 ELSEIF K=68 OR L=16 THEN
  MODE=MODE+1
  IF MODE>=2 THEN MODE=0
  REDISP=1:BREAK
 ELSEIF K=191 THEN
  SETDIR "/":REDISP=1:BREAK
 ENDIF
 DELAYMS 10:REM Wait 10mS
LOOP
IF REDISP=1 THEN GOTO TOP

CLS:GCLS
IF SYSTEM(40)=0 Then PRINT "Push START button to RESET"
END

REM ----Subroutin-----
REM Copy a string -----
LABEL STRCPY
 VAR D,S
 D=ARGS(1):S=ARGS(2)
 DO WHILE PEEK(S)
  POKE D,PEEK(S)
  D=D+1:S=S+1
 LOOP
 POKE D,0
RETURN

REM Disp cursor N:ItemNo M:Relative ----
LABEL DSPCUR
VAR N,M:N=ARGS(1):M=ARGS(2):COLOR 5
CURSOR (N%3)*13,N/3+2:PRINT " "
N=N+M
CURSOR (N%3)*13,N/3+2:PRINT ">"
RETURN

REM File operetion -----
LABEL FILOPE
VAR S
S=F+13*SELF
IF MODE=1 THEN
 MODE=0
 IF LEN(GETDIR$())!=1 AND SELF=0 THEN
  SETDIR "/":REDISP=1:RETURN
 ELSE
  SETDIR GETDIR$()+"/"+S$:REDISP=1:RETURN
 ENDIF
ENDIF
COLOR 7:CURSOR 0,25: PRINT S$+"                    "
COLOR 6:PRINT "D/"+CHR$($1D)+":Del R:ReName S/"+CHR$($1C)+":Send ESC/"+CHR$($1E)+":Camcel":COLOR 7
DO
  K=((READKEY() AND $FF00)>>8)
 IF K=27 OR KEYS()=1 THEN
  GOSUB FOOTDSP:BREAK
 ELSEIF K=68 OR KEYS()=4 THEN
  CURSOR 15,25:PRINT "Delete ? Y(F)/N "
  K=0:J=0:WAIT 10
  DO WHILE K=0 AND J=0
   K=INKEY()
   J=KEYS()
  LOOP 
  IF K=89 OR J=32 THEN
   FREMOVE S$:REM Delate a file
   GOSUB FOOTDSP:REDISP=1:BREAK
  ELSE
   CURSOR 15,25:PRINT "                   "
  ENDIF
 ELSEIF K=82 THEN
  CURSOR 13,25:PRINT ">>New name= ";
  A$=INPUT$()
  IF A$!="" THEN
   FRENAME S$,A$:REM Rename a file
   GOSUB FOOTDSP:REDISP=1:BREAK
  ELSE
   CURSOR 13,25:PRINT "                     "
  ENDIF
 ELSEIF K=83 OR KEYS(8) THEN
  GOSUB SNDFIL:REM Send a file
  REDISP=1:BREAK
 ENDIF
 DELAYMS 10:REM Wait 10mS
LOOP
RETURN

REM Disply foot area -----
LABEL FOOTDSP
CURSOR 0,25:COLOR 6
IF MODE=0 THEN PRINT "Enter/(F:Select file                      "
IF MODE=1 THEN PRINT "Enter/(F:Select Dir                       "
CURSOR 0,26
IF MODE=0 THEN PRINT "D/(S:Dir R/"+CHR$($1D)+"+(S:Recv ESC/"+CHR$($1E)+"+(F:End     "
IF MODE=1 THEN PRINT "D/(S:File ESC/"+CHR$($1E)+"+(F:End            "
COLOR 7
RETURN

REM Send file -----
LABEL SNDFIL
DIM B(0)
CURSOR 0,26:PRINT "Run receive program on PC(start with #)"
SERIAL BRTE,0
DO
 K=((READKEY() AND $FF00)>>8)
 IF K=27 OR KEYS()=1 THEN RETURN
LOOP WHILE NOT(SERIALIN()=ASC("#"))
WAIT 100:D=0
FOPEN S$,"r"
FOR I=0 TO LEN(S$)-1
 SERIALOUT ASC(S$(I)):REM Send file name
NEXT
SERIALOUT 13
WHILE FGET(B,1)>0
 D=D+1:SERIALOUT B(0)
 CURSOR 20,25:PRINT D;:PRINT " bytes sent"
WEND
FCLOSE:WAIT 10
RETURN

REM Receive file -----
LABEL RCVFIL
CURSOR 0,25:PRINT "                        "
COLOR 6:CURSOR 0,26:PRINT "ESC"+CHR$($1E)+":Camcel                       ":COLOR 7
CURSOR 0,25:PRINT "Start file send from PC";
A$="":SERIAL BRTE,0,1000

DO
 C=SERIALIN()
 IF ((READKEY() AND $FF00)>>8)=27 OR KEYS()=1 THEN REDISP=1:RETURN
 IF C>=0 THEN
  IF C=13 THEN BREAK
  A$=A$+CHR$(C)
 ENDIF
LOOP

WAIT 30:FOPEN A$,"w":D=0:USETIMER 1000
DO
 C=SERIALIN()
 IF C>=0 THEN
  FPUTC C:D=D+1
  CURSOR 0,25:PRINT "Recive ";:PRINT A$+" ";:PRINT D;:PRINT " bytes"
  TIMER 0
 ENDIF
 IF ((READKEY() AND $FF00)>>8)=27 THEN BREAK
 IF TIMER()>=3000 THEN BREAK
LOOP
FCLOSE:REDISP=1
RETURN

ファイルの送受信以外の機能で、標準のファイルマネージャーの補助的なファイル操作として、ファイルの削除、リネームもできる様にしてSDカードの抜き差しせずにSDカード内のファイルの整理もできるようにしました。
(標準のファイルマネージャーではディレクトリの作成可能で、ファイルコピーはエディタで一度読み込んでから別名で保存すればよいので)

キーボード接続していなくても、MachiKania標準のボタン方向ボタン、Start、Fire でもリネーム以外の操作はできる様にしています。(画面上の表記はそれぞれ (S(F
操作説明は下記。
(画面下部にも表示されます)

・ファイル/ディレクトリ表示時
   ファイル/ディレクトリの選択: 方向キー/方向ボタン
   ファイル決定: Enter/Fireボタン
   表示モード(ファイル/ディレクトリ)変更: Dキー/Startボタン
     ディレクトリ表示モードでディレクトリを選択した直後はファイル表示モード
   ファイル受信: Sキー/右方向ボタン+Startボタン
   終了: Escキー/上方向ボタン+Fireボタン

・ファイル操作時(ファイル決定後)
   ファイル削除: Dキー/左方向ボタン
   ファイル名変更: Rキー (ボタンでは操作不可)
   ファイル送信: Sキー/右方向ボタン
   ファイル選択に戻る: Escキー/上方向ボタン 
 
MachiKaniaにキーボード接続していない状態でボタンで終了した場合は Hit Any Key が表示されずリセットするしかなくなりますので、Startボタンを押してリセットしてください。

プログラムの起動直後は、プログラムのカレントディレクトリにあるファイルの一覧が表示されます。

Rキーを押すと、カレントディレクトリにPCからファイルを受信します。
表示可能なファイル数は最大66ファイルです。
プログラムをシンプルにするため(というかメンドクサかった)スクロールはできず66を超える数のファイルは表示できません。まあ、実用上はあまり問題にならないと思います。
この状態でDキーを押すとディレクトリ一覧が表示され、ディレクトリを選択してEnterキーを押すとカレントディレクトリがそのディレクトリに移動し、そのディレクトリのファイル一覧が表示されます。
プログラムをシンプルにするため(というかメンドクサかった)一つ上のディレクトリには戻れず、上位のディレクトリに戻りたい場合は、[Root]を選択して一旦ルートディレクトリに戻ります。

方向キーでファイルを選択してEnterキーを押すと、ファイル操作モードになります。

画面下部に選択したファイル名が表示され、Dキーで削除、Rキーでリネーム、Sキーでファイル送信が可能です。

実際に操作したMachiKaniaの画面の動画はこちら

PC側の操作は、前回、前々回の記事の通りです。

MachiKaniaにPCからファイルを送信をしてみる(PowerShell版) - 諸々の記録

MachiKaniaからPCにファイルを送信をしてみる(PowerShell版) - 諸々の記録

PCからファイルを送信するときは、ファイルを右クリックして「送る」を選択、PCにファイルを送るときは、フォルダを道クリックして「送る」を選択します。

必要なファイルが複数のブログに分かれているので、必要なファイルを1つにまとめて下記からダウンロードできるようにしました。

https://img.atwiki.jp/machikania/attach/25/31/fmanl.zip

拡張子が ps1 のファイルは、C:\ttl に配置。
拡張子が bat のファイルは、ウインドウズキー + R で shell:sendto と入れて OK で表示されたフォルダに配置します。

また、MachiKania 側は、 MACHICAP.INI の UART pins の設定で URRT で使うピンを設定する必要があります。

詳しくは下記の記事を参照してください。(TeraTermは不要です)

これでSDカードを抜き差ししなくても、ファイルの送受信とファイルの整理が出来るようになりました。
自分で使ってみて、結構使い勝手が良いものが出来たと思っています。

MachiKaniaからPCにファイルを送信をしてみる(PowerShell版)

前回はMachiKaniaにPCからファイルを転送するプログラムをPC側はPowerShellにしたことでエクスプローラーの「送る」を使って簡単にファイルを送れるようにしました。

今度は、逆にMachiKaniaからPCにファイルを送信するプログラムをPC側はPowerShellを使って作成してみます。

以前作成したPC側に TeraTermを利用した例はこちら。


まず、MachiKaniaからPCへファイルを送信するための、PC側のPowerShellスクリプト。


recv.ps1

# --- 設定 ---
$portName = "COM17"
$baudRate = 9600

# --- SerialPort オブジェクト作成 ---
$port = New-Object System.IO.Ports.SerialPort $portName, $baudRate, "None", 8, "One"
$port.ReadTimeout = 3000   # 必要に応じて調整
$port.Open()

Write-Host "Receiving data..."
$port.Write("#")
Start-Sleep -s 1

# Write-Host "Waiting for file name..."

# --- ファイル名を受信(改行まで) ---
$filenameBuilder = New-Object System.Text.StringBuilder

while ($true) {
    try {
        $b = $port.ReadByte()
        if ($b -eq 10 -or $b -eq 13) {  # LF or CR
            break
        }
        $null = $filenameBuilder.Append([char]$b)
    }
    catch {
        continue
    }
}

$recvFile = $filenameBuilder.ToString()
Write-Host "File name: $recvFile"

# --- 受信バイト数カウンタ ---
$byteCount = 0

# --- 受信ループ ---
$fs = [System.IO.File]::Open($recvFile, [System.IO.FileMode]::Create)

try {
    while ($true) {
        $byte = $port.ReadByte()   # 1バイト受信
        if ($byte -ge 0) {
            $fs.WriteByte([byte]$byte)
            $byteCount++

            # 受信バイト数を表示
            Write-Host "`rReceived: $byteCount bytes" -NoNewline
        }
    }
}
catch {
    Write-Host "`r`nReceive stopped."
}
finally {
    $fs.Close()
    $port.Close()
}

Write-Host "Saved to $recvFile"

これもほとんど copilot に作ってもらいましたw
設定 の $portName は環境に合わせて変更してください。
このプログラムは、以前作ったTeraTerm版と同様、# が送られてきたらファイルの受信を開始するようにしています。
この recv.ps1 を任意のフォルダに置いておきます。
私は、 前回の send.ps1 と同じ C:¥ttl¥ に置きました。

そして、これを実行するための batファイル

MKファイル受信.bat

@echo off
rem カレントディレクトリを引数のディレクトリ(エクスプローラーで右クリックしたフォルダ)に移動
cd /d %~1

rem PowerShellスクリプトを実行
powershell -NoProfile -ExecutionPolicy Unrestricted -File "C:\ttl\recv.ps1"

pause

このファイル名は、エクスプローラーの「送る」で使うので、この例のように日本語で分かりやすいファイル名にしておくと良いです。

次に、この bat ファイルを、「送る」フォルダにおきます。
「送る」フォルダは、Windowsキー + R を押して「ファイル名を指定して実行」で shell:sendto と入れて [参照] ボタンをクリックすると表示されます。

 

そして、MachiKania で実行する受信プログラムは下記。

SEND.BAS

S$="SEND.BAS":REM Set send file name
DIM B(0)
CLS
PRINT "Run receive program on PC(start with #)"
PRINT "Send "+S$
SERIAL 9600,0
DO
 IF INKEY()=27 THEN RETURN
LOOP WHILE NOT(SERIALIN()=ASC("#"))
WAIT 100:D=0
FOPEN S$,"r"
FOR I=0 TO LEN(S$)-1
 SERIALOUT ASC(S$(I)):REM Send file name
NEXT
SERIALOUT 13
WHILE FGET(B,1)>0
 D=D+1:SERIALOUT B(0)
 CURSOR 0,2:PRINT D;:PRINT " bytes sent"
WEND
FCLOSE
ENDこ

送信するファイル名を1行目に記述しておきます。
このプログラムをMachiKaniaで実行します。


次に、PCのエクスプローラーで受信したファイルを保存するフォルダをマウス右クリックして、「その他のオプションを確認」をクリックし「送る」から「MKファイル受信.bat」を選択します。
ファイルを受信するのですが「送る」を選択しますw


すると、ファイル転送が始まり、MachiKaniaとPCの方で転送byte数が表示されます。

MachiKania側の画面

PC側の画面

転送が終わると、PCのフォルダに受信したファイルができています。


これで、前回は PCからMachiKania、今回は MachiKania から PCへファイル転送がエクスプローラーの「送る」を使ってできるようになり簡単にファイルを送受信できるようになりました。

欲をいえば、MachiKaniaからファイルを送信するときに、プログラムの中に送信するファイル名を記述しないといけないのが面倒なのでなんとかしたいですね。
それには、MachiKania側でファイル選択プログラムを作る必要があるので簡単ではないですが。





MachiKaniaにPCからファイルを送信をしてみる(PowerShell版)

以前、MachiKaniaからPCへファイル転送するプログラムを作ってみました。
※ ここで紹介しているPC側の操作は Windows11です


この時は、PC側はTeraTermを使ってみましたが、ファイルを転送するだけでわざわざTeraTermをインストールしなくても、Windows なら PowerShell でシリアル通信できることが分かったので、PC側は PowerShell とし、ついでにMachiKania側のプログラムももう少し使い勝手のよいものに変更してみました。

また、PC側は PowerShellのスクリプトを batファイルから呼び出し、その batファイルをエクスプローラーの 「送る」 に設定することでPC側の操作性がアップしますのでその方法も紹介します。

まず、PCからMachiKaniaのファイルを送信するための、PC側のPowerShellスクリプト。

send.ps1

# --- ファイル名を引数から取得 ---
param(
    [Parameter(Mandatory=$true)]
    [string]$sendFile
)

# --- 設定 ---
$portName = "COM17"
$baudRate = 9600
#$sendFile = "TEST2.TXT"
$chunkSize = 64   # 一度に送るバイト数(調整可能)

# --- SerialPort オブジェクト作成 ---
$port = New-Object System.IO.Ports.SerialPort $portName, $baudRate, "None", 8, "One"
$port.Open()

Write-Host "Sending file: $sendFile"

# --- ファイル名を送信 ---
$port.Write($sendFile)
$port.Write("`r")
Start-Sleep -s 1

# --- ファイルをバイト配列として読み込み ---
$data = [System.IO.File]::ReadAllBytes($sendFile)
$total = $data.Length
$sent = 0

# --- 分割送信 ---
while ($sent -lt $total) {
    $size = [Math]::Min($chunkSize, $total - $sent)
    $port.Write($data, $sent, $size)
    $sent += $size

    Write-Host ("`rSent: {0}/{1} bytes" -f $sent, $total) -NoNewline
}

Write-Host "Send complete. ($total bytes)"

$port.Close()

ほとんど copilot に作ってもらいましたw
設定 の $portName は環境に合わせて変更してください。
この recv.ps1 を任意のフォルダに置いておきます。
私は、 C:¥ttl¥ に置きました。

そして、これを実行するための batファイル

MKファイル送信.bat

@echo off
rem カレントディレクトリを送信ファイルの場所に移動
cd /d %~dp1

rem PowerShellスクリプトを実行 (%~nx1 は引数指定したファイルのパスを除いたファイル名)
powershell -NoProfile -ExecutionPolicy Unrestricted -File "C:\ttl\send.ps1" "%~nx1"

pause

このファイル名は、エクスプローラーの「送る」で使うので、この例のように日本語で分かりやすいファイル名にしておくと良いです。

次に、この bat ファイルを、「送る」フォルダにおきます。
「送る」フォルダは、Windowsキー + R を押して「ファイル名を指定して実行」で shell:sendto と入れて [参照] ボタンをクリックすると表示されます。


そして、MachiKania で実行する受信プログラムは下記。

RCIVE.BAS

CLS
SERIAL 9600,0,1000

PRINT "END: ESC Key"
DO
 A=SERIALIN()
 IF INKEY()=27 THEN GOTO ENDP
 IF A>=0 THEN
  IF A=13 THEN BREAK
  F$=F$+CHR$(A)
 ENDIF
LOOP

CURSOR 0,0:PRINT "File name: ";:PRINT F$
FOPEN F$, "W"

WAIT 30:B=0:USETIMER 1000
DO
 A=SERIALIN()
 IF A>=O THEN
  FPUTC A:B=B+1:TIMER 0
  CURSOR 0,2:PRINT B;:PRINT " Bytes recived"
 ENDIF
 IF TIMER()>=3000 THEN BREAK
LOOP
FCLOSE
LABEL ENDP
END

PCからファイルを送信するには、まずこのプログラムをMachiKaniaで実行します。
すると、下記の画面になります。(ESCキーで中断)

次に、PC側のエクスプローラーで送りたいファイルを右クリック
「その他のオプションを確認」→「送る」→「MKファイル送信.bat」
を選択します。


すると黒い画面が表示されて転送が開始され、送信バイト数がカウントアップされ、送信が終了すると下記の表示になります。

MachiKania側もこのような画面になり、転送状況が分かります。
MachiKaniaのプログラムはTIMERを使って、データの受信が途絶えてから3秒経過すると終了するようにしています。


送信が終了すると、RCIVE.BAS と同じフォルダにPCから送信したファイルが転送されています。

PC側は、エクスプローラーでファイルを選択して「送る」という操作でファイルをMachiKaniaに送信することができるので、操作も直観的で簡単になりました。
特に複数のファイルをMachiKaniaに転送するときに便利だと思います。

自作キーボードファームエアで作成したゲームパッドをメンブレン化してみる

※ このゲームパッド(mk-gamepad)の作成に必要な3Dモデル、PCBガーバーデータ等を https://github.com/momoji-san/mk-gamepad で公開しています。

以前、VialファームウエアでRP2040-Zeroを使ったMachiKaniaやPCで使えるキーパッド(ゲームパッド)を作成しましたが、ボタンにタクトスイッチを使っているので押したときにカチカチ音がするのが気になっていました。


まあ、音が気になる以外特に不満はなかったのですが、最近下記のXiamoconのボタンにPS4のゴムパッドを使っているのを見て、この方法で作り変えてみようと思い基盤の設計から作り直しをしてみました。

エンクロージャ — xiamocon documentation

基盤の修正は、回路に変更はないのですが、タクトスイッチの代わりにメンブレイン用に接点が接触したときに導通するようなフットプリントを作成しました。

KiCadで作成したフットプリントはこのようなもの


これは、下記のようなパットを組み合わせて作成しています。


そして、ボタンの位置合わせをするために、コントローラーのゴムパッドを入手しました。
ボタンのゴムパッドはXiamoconと同様にPS4の補修部品を使います。
Amazonで次のものを購入しました。

 

コントローラーのバージョンによりセット内容が異なるようですが、PS4の場合今回使うボタン4つついている2つのパーツについてはどのバージョンでも同じ形みたいです。
(なので、一番安いやつを選択w)
ちなみに、PS5は初期バージョンのコントローラーのみ同じ形のようです。


上のAmazonの商品写真の左上の形のパーツは半分に切って、十字キー以外のボタンに使い、右上の形のパーツを十字キーに使います。


KiCadでボタン位置を変更しながら、等倍でPCBのイメージをプリントアウトして調整。
KiCadでの基盤設計が出来たら、安い、早い、きれいの3拍子揃った安定のJLCPCBに発注。
ちなみに、最近下記で紹介されているプラグインをKiCadにインストールしたので、ガーバーデータを作成して発注するのがめちゃくちゃ楽になりました。(ボタンを押して作成されたzipフィルをJLCPCBの発注画面にドラッグ&ドロップするだけ)


発注した基盤が1週間ほどで到着。


早速、RP2040-Zero を基板にハンダ付け(ピンヘッダなしで基盤直でハンダ付け)
写真のようにピンヘッダをつけてずれないようにして、まず5Vの端子をハンダ付けしてずれてないことを確認してから、ピンヘッダを取って他の端子をハンダ付けしました。


そして、ファームウエアをインストールして動作確認。
問題なく動作しました。


これに3Dプリンターでケースを作成します。

Fusion でモデリング。
前回作成したものをベースにボタンの位置の修正と、ゴムパッドを固定する構造などを追加して調整しています。


これを3Dプリンタで出力し、各パーツを組み合わせます。

ケースにボタンをセット

ゴムボタン乗せる

基板をのせてねじ止め

ネジは、M3x8mm の木ネジを使っています。


完成


これでMachiKaniaのインベーダー、カプコムタウン(captown.capcom.com/ja)のクラッシックゲームにある1942をプレイした操作感は、まさにファミコンのコントローラー。
タクトスイッチのようにカチカチ音がしなくて良いです。


ゲームパッドをUSBケーブルでPCに接続して、https://vial.rocks/ に接続するとボタンの割り当てを変更できます。
MachiKaniaの操作のために、デフォルトのLayer0、Layer1 は次の様に設定しています。
MachiKaniaを起動した直後にエディタが表示された場合は、SELECTボタンを押して Layer1(青) にし、 F1、Enter、Escと方向キーを使って実行したいプログラムを選択してからSELECTボタンを2回押してLayer0(白)にしてプログラムを実行します。
(MACHIKAP.INI の EMULATEBUTTONxxx は全て# を削除して有効にしておく前提) 


タクトスイッチを使用した前作に比べて厚さも薄くなったのでコンパクトになり、実用的なものが出来ました。


【おまけ】
裏面は基板そのままでRP2040-Zeroの基板のチップがそのままむき出しになっているので、これを保護する目的で裏面に透明のプラバンを取り付けました。
使ったのは、100均で売っているオーブントースターで温めると縮まってマジック等で描いた絵がアクセサリーみたいになるおもちゃとして売ってるプラバンです。

購入したのは下記のもの。厚さが0.3mmのものが多いですがこれは0.4mmで他の物より厚かったのでこれを選択。



これを 40mm X 10.5mm で切り取り、4つの角は丸めてカットしておきます。

ゲームパッドの裏に合わせて、ネジ位置をマジックでマーキングして、マーキングした点をキリで小さな穴を空けてから3mmのピンバイスで穴をあけました。


そして、ネジを締めて完了。
これで裏面の保護ができますし、スケルトンモデルみたいでちょっとカッコよくなりました。





Ender-3 V3 SE + OrcaSlicer で1層目をきれいに印刷する

現在私が使っている3Dプリンターの環境では、Ender-3 V3 SE でスライサーにOrcaSlicer を使っていて、特に設定変更せずにデフォルトの設定で印刷品質・速度と、OrcaSlicer の使いやすさにほぼ満足しています。

ただ、時々1層目が完成物の表面になるものを作成したときの印刷ムラが気になることがあります。
印刷ムラを抑えるためには、1層目の印刷速度を落とせばよいと思い、設定方法を調べてみたら簡単にできたので1層目の印刷速度を変更してみて印刷ムラが改善されるかどうかを確認してみました。

1層目の印刷速度の変更方法ですが、デフォルトのままだと設定ができないので、下記の「詳細パラメータの表示/非表示」ボタンをクリックし、「速度」というタブを表示させます。(OrcaSlicer のバージョンは 2.3.2)


速度のタブの一番最初の項目が1層目の印刷速度になっていますので、これを変更します。
デフォルトは 30mm/sですね。

デフォルトの 30mm/s で印刷すると、こんな感じで印刷ムラが出ています。


この1層目の印刷速度を、20mm/s、15mm/s に変更して印刷してみました。
まず、20mm/s

次に 15mm/s

比較用に同じ角度から 30mm/s


20mm/s と 15/mm/s はもちろん15mm/s の方がムラが少ないですが それほど大きな差がなく、30mm/sと20mm/s は大きな差が出ています。

印刷速度は、OrcaSlicer に表示される時間で
  30mm/s   59分43秒
  20mm/s   1時間0分0秒
  15mm/s   1時間1分0秒
と、1層目だけの速度の変更なのでトータルの印刷時間はそれほど変わりません。

印刷するものにもよると思いますが1層目を表面にする場合などの印刷ムラが気になる場合はこの1層目の印刷速度を遅くする設定はあまり印刷時間を犠牲にせずに品質を上げられるので、とても有効と思いました。

さらにコンパクトなMachiKaniaを市販(100均)のケースに入れてみる

前回の記事で、作成したさらにコンパクトなMachiKaniaをケースに入れてみます。

 前回記事 ⇒ さらにコンパクトなMachiKaniaを作ってみる - 諸々の記録

私は3Dプリンタを持っているのですが、ここでは敢えて誰でも入手可能な市販品(100均で購入可のもの)を加工してケースを作ってみます。

元々、名刺カードサイズを目指して作成したものですが、100均に売っている名刺カードケースの薄いタイプだと入らず、厚いタイプだと大きすぎ、セリアに売っていたプチプラケースMがちょうど良いサイズなので、これに入れます。
プチプラケースはダイソーにも売ってます。(写真はダイソーネットストアより)

プチプラケース M


基板をケースに収めるため、ケースにスイッチやコネクタの穴をあけていきます。
ケースのフタを裏面にして、LCDの画面をケースの底面方向にする形にしますので、LCDを底にしてケースに入れてタクトスイッチの場所にマジックで印をつけて、最初はキリで穴を空け、ドリルで穴を大きくしました。


このケース、柔らかい素材なので加工はしやすい方だと思いますが、ドリルで穴を空けると粘り(?)があるのできれいな穴をあけるのはちょっと難しいです。

横のUSB端子等の穴は四角い穴をあけるために、マジックで枠を書いてから枠の内側をドリルで連続た穴をあけてニッパで穴をつなげてカッターやヤスリで四角くなるように削りました。

 


一番悩んだのは、基板の固定方法。
LCDの前面になる方にスペーサーを付けてねじ止めするのが一番早いのですが、ちょうどよい長さのスペーサが無いため、ケースの側面に穴をあけてそこに取り付けたネジのナットで押さえる形にしてみました。

基板の四隅にナット(今回は半透明のケースに合わせてプラのナット)を瞬間接着剤で接着してケースに入れて穴の位置をマジックでマーキングしてドリルで穴あけしました。

 


ネジ穴をあけて、ネジを付けました。
あと、マイクロSDカードの穴とPicoのUSBコネクタの穴をあけてます。
この基板固定の方法でうまく固定できるのか不安でしたが、タクトスイッチを押しても特に不安なく固定されました。


LCDの画面はケースに穴をあけようかと思いましたが、ケース越しではっきり文字が判別できているのでこのままにします。(ケース加工がも面倒くさい....)
ケースが半透明なので、MachiKaniaスケルトンモデル って感じでしょうかw


マイクロキーボード
MachiKania 用マイクロキーボード(PCでも利用可)を作ってみた - 諸々の記録

を接続。
サイズ的にもちょうど良いですね。
ケースもコンパクトで持ち運びも便利になりました。

GPIOにデバイスを接続する場合は、裏蓋を開けてピンソケットに接続します。
ジャンパー線をピンソケットに接続した状態だと裏蓋が半開きになって、画面に角度がついて、ちょうど良い感じになりますw


ケースの加工がもう少しきれいにできれば良かったのですが、サイズ感と使い勝手はなかなか良いものが出来たと思います。


さらにコンパクトなMachiKaniaを作ってみる

以前、コンパクトなMachiKaniaを作成しましたが、M5Stackと比べるとまだまだ大きく、もう少し小さくできないかと思い、基盤設計をし直すことにしました。

 前作の記事 ⇒ コンパクトなMachiKania Type P を作ってみる ~制作編~ - 諸々の記録


目標は名刺サイズです。

前作で部品を表裏両面に取り付けましたが、さらに表裏で重ねられる部品は重ねて配置することとし、可能な限り余分なスペースを削る設計とします。
また、LCDサイズを2.4インチから1サイズ小さくして2.2インチにします。
SDカードスロットは、LCDについているSDカードがフルサイズのため、SDカードを挿してある状態だとスペースをとるので、SDカード装着時のサイズも考慮して別途マイクロSDカードスロットを付けます。

回路はこのようになりました。

コンパクトにはしましたが、ファーム(uf2ファイル)を入れ替えればこれ1つで Type Pにとしても Type PU としても使えるようにビデオ出力にも対応させました。PとPUはスライドスイッチで切替できるようにします。
また、GROVEコネクタの端子はGPIO0とGPIO1とし、MACHIKANIA.INI で設定することで、I2C と UART どちらでも利用できる様にしました。 

基盤のデザインは(3回ほど作り直し...)最終的にこのようになりました。
大きさは 57mm X 80mm で名刺より横幅が少し小さいくらいの大きさです。

LCDをハンダ付けすると、LCDについているSDカードスロットの方がピンヘッダのスペーサより厚いので浮いてしまうため、SDカードの部分をカットしていますが、2.2インチのLCDは物によって位置が異なる2種類あるようで、どちらでも付けられるようにしました。
LCDのSDカードスロットのピンは4本と5本のものががあり、5本のものに合わせて5つ穴としています。
小型化するために電源スイッチは省略、PicoのUSBコネクタにOTGアダプタを接続してUSBキーボードを接続する場合の切替えはスイッチでなくジャンパーとしました。(頻繁に切り替えるものではないと思われるので)
各部品はシルク印刷がある面に付けます。

パーツリストは下記

パーツ パーツ詳細 主な入手先
Raspberry pi pico  pico/pico 2/pico w/pico 2w何れか
ピンヘッダ付orハンダ付け
秋月電子, 電子工作sta, Amazon
LCD 2.2" ILI9341 240x320 SPI TFT Amazon
タクトスイッチ 6x 6x  7個(2本足、4本足両方可)
高さはLCD面より高くしたい場合10mm
秋月電子, 電子工作sta, Amazon
抵抗 10KΩ, 1KΩ, 75Ω 各1個 秋月電子, 電子工作sta
コンデンサ 積層セラミック 0.1μF, 820pF 各1個 秋月電子, 電子工作sta
ブザー 圧電ブザー 1個 秋月電子, 電子工作sta
USBコネクタ Aタイプ メス 1個 秋月電子, 電子工作sta
USB-Cコネクタ 電源供給用 (Micro-Bも可) 1個 秋月電子, 電子工作sta
スライドスイッチ 基板用(1回路2接点) x3個 秋月電子, 電子工作sta
ピンソケット ピンソケット (メス) 64ピン分 秋月電子, 電子工作sta
L型ピンヘッダ1列 必要数 2ピン 1個 秋月電子, 電子工作sta
SDスロット マイクロSDストレージ拡張ボード 電子工作sta
ジャンパー線 2本 (メスの方を利用) 秋月電子, 電子工作sta, Amazon
 Groveコネクター L型 x 1個 電子工作sta

秋月電子: 秋月電子通商( https://akizukidenshi.com/catalog/default.aspx )
電子工作sta:電子工作ステーション( https://electronicwork.shop/ )

マイクロSDカードスロットとUSB-C(電源供給用)は下記の形状のものになります。


前作では、ピンソケットは秋月の低背のものを使いましたが、LCDはソケット使わず、ハンダ付けし、Picoは通常のピンソケットでの装着とします。

準備ができたので組み立てていきます。

注意点としては、LCDは一番最後にハンダ付けします。
前作ではソケットで取り外し可能にしましたが、今回はLCDはハンダ付けするので、LCDを先にハンダ付けすると他の部品が取り付けられなくなります。
よって、部品のハンダ付けは裏面(LCDと逆側)の方からしていきます。

セオリーどおりに、背の低い部品から。


次に、マイクロSDカードスロットを取り付けます。
前述のとおり、LCDにはフルサイズのSDカードスロットが付いていますが、今回はサイズをコンパクトにしたいため別途マイクロSDカードスロットを取り付けます。
ちなみに、LCDについているSDカードスロットも使え、LCDのSDカードの方が優先されます。

このSDカードスロットの足はそのままだと裏に取り付けるLCDに干渉するので、写真のようにニッパで切断しておきます。


ブザー、ピンソケット、スイッチ、USB-A端子をハンダ付けするとこのようになります。


下の方にある Pico Kyeboad にはPicoのUSBにOTGアダプタを付けてUSBキーボードを接続して使えるようにする場合、ピンソケット(2ピン分)を取付けてジャンパーできるようにしておきます。

USB-A 端子にUSBキーボードを接続する場合は、次に説明するPicoの裏側の小さなパッドにハンダ付けが必要で、少しハンダ付けのスキルが必要ですし、Pico本体にハンダ付けするのに抵抗がある場合はこの Pico Kyeboad をショートさせてPico本体のUSBにOTGアダプタを付けてUSBキーボードを接続します。

USB-A 端子にUSBキーボードを接続する場合、Picoの裏面のUSB端子近くにあるパッドTP2、TP3 に配線する必要があります。
互換品等ではこのパッドが無い場合がるので、その場合はUAB-Aでのキーボード接続はできません。

Picoが取り外しが出来るように、このパッドにピンヘッダ2本の短いほうをペンチで少し曲げてパッドにハンダ付けします。

これに、ジャンパー線を切断してソケット(メス)の方を取り付けます。



ソケットの方をPicoの裏面にハンダ付けしたピンに挿し、基盤の方の D+/D- にハンダ付けします。
TP2をD-に、TP3をD+に接続します。


これで、裏面の部品は取付できましたので、次に表面にUSB-C(電源供給用)とタクトスイッチとLCDの取り付けをします。
USB-C端子は、足を写真のように曲げてハンダ付けします。

表面は、USB-C(電源供給用)とタクトスイッチをハンダ付けして取付忘れが無いか確認し、最後にLCDをハンダ付けします。
LCDはハンダ付けすると取り外しは困難ですので、可能なら事前にブレッドボードなどで動作確認をしておきます。

LCDまで付けて完成したものがこちら。
タクトスイッチはケースに入れても押せる高さにしたので、高さ10mmのものを付けました。

M5Stack BASICとの比較。
たて幅は同じくらいの大きさにできましたw

マイクロキーボード

MachiKania 用マイクロキーボード(PCでも利用可)を作ってみた - 諸々の記録
を接続。
サイズ感がちょうど良いです。