電子趣味の部屋

電子系のガジェットやアプリ開発等の趣味の話題を書いてます

Raspberry Pi で X68000 (Raispberry Pi OS Bullseye以降)

Raspberry Pi 5 やuConsole Kit RPI-CM4 LiteでX68000のエミュレータをインストールする場合に、過去に書いた方法だと64bitのOSではmakeできなかったので、新しく調べた方法を書きます。
今回の方法は64bit/32bit両方のBullseye以降のデスクトップ環境で動作します。
コンソール環境で実行したい場合は、『Raspberry pi 400で遊ぶ X68000編』を参考にしてください。(要: Raspberry Pi OS Buster


前準備

gitをインストールします

sudo apt update
sudo apt install git

SDL2をインストールします

sudo apt install libsdl2-dev

圧縮ファイルの展開のため、unzipとlhasaと7zをインストールします。

sudo apt install unzip lhasa p7zip-full

px68kの構築

px68kはユーザのホーム以下のpx68kディレクトリ(~/px68k)へインストールすることを想定して進めます

cd
git clone https://github.com/TurtleBazooka/px68k.git
cd px68k
make

BIOSファイル配置

実行にはiplrom.datとcgrom.datが必要。
色々なサイトを参考にX68000 LIBRARYとXM6 Pro-68kから拝借

cd
mkdir ~/.keropi
wget http://www.retropc.net/x68000/software/sharp/x68bios/X68BIOSE.LZH
lhasa x X68BIOSE.LZH iplrom.dat
mv iplrom.dat ~/.keropi/iplrom.dat
chmod 644 ~/.keropi/iplrom.dat
wget https://mijet.eludevisibility.org/XM6%20Pro-68k/XM6%20Pro-68k%20DLL%20Package.7z
7z x "XM6 Pro-68k DLL Package.7z" CGROM.DAT
mv CGROM.DAT ~/.keropi/cgrom.dat
chmod 644 ~/.keropi/cgrom.dat

動作確認

X68000 LIBRARYからHuman68kのディスクイメージを取得して起動してみます。
起動はディレクトリ~/px68kに作られたpx68k.sdl2を実行します

cd
wget http://www.retropc.net/x68000/software/sharp/human302/HUMN302I.LZH
lhasa x HUMN302I.LZH human302.xdf
chmod 644 human302.xdf
px68k/px68k.sdl2 human302.xdf

[F11]で全画面、ウィンドウ表示を切り替えられます。
[F12]でメニューを開いてディスクの入れ替えや、リセット、終了を行うことができます。

uConsole Kit RPI-CM4 Lite 手に入れました

前にDevTermを入手したことを書きましたが、今回はuConsole Kit RPI-CM4 Lite 手に入れました。

今回はRaspberryPi CM4 Liteのモジュールを使ったバージョンを注文しましたが、他にはオリジナルのARMのモジュールやRISC-Vのモジュールのバージョンもあります。

2023年4月に注文して2024年2月に届きました。
下の写真のようにパーツで届き、自分で組み立てます。

パーツ数は多くないので、比較的簡単に組み立てられます。

完成後はこんな感じです。

OSはRaspberry Pi OSをカスタマイズしたものです。

今回の主な目的はPICO-8に適した環境を作りたいと思ってました。
www.lexaloffle.com

実用は考えてなく、BASICやPython等の言語やコンソールメインで使用してポケコンみたいな感覚で遊びたいですね。

DevTermは画面サイズが特殊で横に長すぎていまいち使いにくいので手放してしまいましたが、uConsoleは普通のHDワイド(720p)のサイズです。
こちらの方が使いやすく、コンパクトなのでこちらは長く使えそうだともいました。

DevTerm Kit RPI-CM4 Lite 手に入れました

この度DevTerm Kit RPI-CM4 Liteを手に入れました。
DevTerm自体は前からあるもので、コア部分がモジュール化されてARMベースのモジュールやRISC-V、RPI-CM3+Liteのモジュールがありました。
それまで気になってたのですがなかなか購入まで至らず、RPI-CM4 Liteのモジュールが発売されたのを機に購入しました。
4月に注文して届くまで4か月かかりました。

このキットの面白いところは下の写真のようにプラモデルみたいなものを組み立てます。

完成するとこんな感じです。

OSはモジュールに合わせてLinuxをカスタマイズしたDevTerm OSがあるのですが、RPI-CM4 LiteはRaspberry Pi OSがベースのものでした。

画面やキーが小さく正直実用性はないと思いますが、コンパクトで邪魔にならないので、SSHで他のサーバに接続したりターミナル的な使い方をすると意外と便利だと思いました。

サイズ、デザインから現代版ポケコンみたいで触ってるだけで楽しいです。

Raspberry Pi Zero 2 Wでスーパーコンピュータをつくってみた

Raspberry Pi Zero 2 Wでスーパーコンピュータをつくってみました。
とは言っても非常に非力なのは承知で、単純に遊んでみたかったのと、並列処理のプログラミングに興味があったので環境が欲しいと思ってました。

Raspberry Pi Zero 2 Wにしたのは最小のものにしたくてネタ的にも面白いと思ってたからです。
しかし現在入手が難しく、約1年かけて色々なショップをウォッチして3個入手できたので、これでクラスタ化した環境を作ってみました。

今回Raspberry Piでスーパーコンピュータを作るのにちょうど良い本を見つけたので、これを読みながら構築してみました。
Raspberry Piでスーパーコンピュータをつくろう!

今回は色々試しながらで何回もやり直したりしながらだったので構築手順は特に覚えているわけではなく、説明しにくいので詳細は書きません。興味のある方は、『Raspberry Piでスーパーコンピュータをつくろう!』を読んでみてください。

概要的には以下の手順で構築しました。

1. Raspberry Pi OSをセットアップ
それぞれIPアドレスは固定にして、ホスト名を変更します。

2. /etc/hosts を編集
お互いにホスト名でアクセスできるように/etc/hostsを編集します
今回は以下のように同じものをすべてのサーバに設定しました

192.168.0.41    rpisc01
192.168.0.42    rpisc02
192.168.0.43    rpisc03

3. 3台とも必要なものをインストール

sudo apt install build-essential manpages-dev gfortran nfs-common nfs-kernel-server openmpi-bin libopenmpi-dev openmpi-doc keychain nmap

スレーブとなる2台目以降はnfs-kernel-serverは必要ないのですが、あっても困らないので統一しました。

4. NFS設定
コンパイルした実行ファイルは全てのサーバで必要になります。
マスターサーバに適当な作業ディレクトリを作成し、スレーブからマウントして同じものが各サーバから使用できるようにします。

簡単ですが以上のように構築しました。

テストとして本に書いてあったπの値を求める計算をしてみました。
ソースコードは著作物で公開してよいかわからないのでここでは書きません。

ソースはmpiccコマンドでコンパイルします。

mpicc test1.c -o test1

これで実行ファイルとしてtest1が生成されます。

実行はmpiexecコマンドで実行できます。

例:プロセス(スレッド)を1で実行する場合

mpiexec -n 1 test1

実行時間を見るためにtimeコマンドを使用してまずコアを1個使用する状態で実行してみます。
"Enter number of segments:"と表示され入力を求められますが、本の例と同じように300000で実行してみます。

$ time mpiexec -n 1 test1

#######################################################

Master node name: rpisc01

Enter number of segments:

300000

*** Number of processes: 1

     Calculated pi = 3.14159265359071326
              M_PI = 3.14159265358979311
    Relative Error = 0.00000000000092015

real    46m38.851s
user    46m32.714s
sys     0m0.784s

処理の実時間をreal+sysとすると約46分39秒でした。

次はコアを4個使用してみます。

$ time mpiexec -n 4 test1

#######################################################

Master node name: rpisc01

Enter number of segments:

300000

*** Number of processes: 4

     Calculated pi = 3.14159265359071326
              M_PI = 3.14159265358979311
    Relative Error = 0.00000000000092015

real    11m44.018s
user    46m48.134s
sys     0m0.617s

real+sysで約11分45秒なので、処理速度も4倍になりました。

次にスレーブも含めた全てのコアを使って実行してみました。
実行に-n 12 とかの指定ではエラーになりスマートなパラメータの指定方法がわからず、とりあえず-Hで指定しました。

$ time mpiexec -H rpisc01,rpisc01,rpisc01,rpisc01,rpisc02,rpisc02,rpisc02,rpisc02,rpisc03,rpisc03,rpisc03,rpisc03 test1

#######################################################

Master node name: rpisc01

Enter number of segments:

300000

*** Number of processes: 12

     Calculated pi = 3.14159265359072037-
              M_PI = 3.14159265358979311
    Relative Error = 0.00000000000092725

real    5m20.207s
user    17m6.587s
sys     2m8.557s

real+sysで約7分28秒でした。
期待したほどではなかったのですが、1台の時よりは速くなりました。
realの時間は倍以上になっているので、単純な処理では速くなっているのですが、sysの時間が増えてしまいました。
マスター+スレーブ1台の場合でも2分近くかかったので、恐らくサーバ間の通信処理辺りがボトルネックになっていそうです。

並列処理の分野は経験が無く、どう応用すればよいかもわかりませんが、これから遊んでみたいと思います。

Raspberry Pi Pico W でWifi接続のメモ (MicroPython)

Raspberry Pi Pico W でWifi接続するコードのメモ

ネットワークインターフェースを有効化

import network
wlan = network.WLAN(network.STA_IF)
wlan.active(True)

Wi-Fiの接続

ssid = "(アクセスポイントのSSID)"
password = "(アクセスポイントのパスワード)"
wlan.connect(ssid, password)

接続が完了するのを待つ

while not wlan.isconnected():
    pass

これで接続できる

以下はWifiに接続して、IPアドレスを表示するまでのサンプルコード

# ネットワークインターフェースを有効化
import network
wlan = network.WLAN(network.STA_IF)
wlan.active(True)

# Wi-Fiの接続
ssid = "(アクセスポイントのSSID)"
password = "(アクセスポイントのパスワード)"
wlan.connect(ssid, password)

# 接続が完了するのを待つ
while not wlan.isconnected():
    pass

# IPアドレスを表示
ip_address = wlan.ifconfig()[0]
print("IP address:", ip_address)

PiCar-Xで遊ぶ 2 各モーター制御のメモ

今回は PiCar-X のモーター制御メソッドのメモです。

範囲はサンプルプログラムから推測した実用的な範囲です。
範囲を超えても指定できますが、可動に無理があるので範囲内に収めた方が良いです。

Picardクラス

PiCar-Xで遊ぶ 1 初期セットアップのメモ』 でセットアップをすると、picarxモジュールが使用できるようになりその中にPicardクラスがあります。
Picardクラスに各モーターを制御するメソッドがあります。

カメラの縦の角度

set_camera_servo1_angle(角度)
実用的な角度の範囲は-35~75

カメラの横の角度

set_camera_servo2_angle(角度)
実用的な角度の範囲は-90~90

前輪の角度

set_dir_servo_angle(角度)
実用的な角度の範囲は-30~30

前進

forward(速度)
速度の値の基準は不明
都度適当な値を設定して調整する

後退

backward(速度)
速度の値の基準は不明
都度適当な値を設定して調整する

簡単なサンプル

正面を向いて速度10で前進させるだけの簡単なサンプルです。

#!/usr/bin/env python3

from picarx import Picarx

px = Picarx()

# 正面を向く
px.set_camera_servo1_angle(0)
px.set_camera_servo2_angle(0)

# 前進
px.forward(10)

PiCar-Xで遊ぶ 1 初期セットアップのメモ

ロボット的なもので遊んでみたいと思い、価格も手ごろでカメラも扱える PiCar-X を買ってみました。

似たようなものは簡単なものでmicro:nbitを使用したものやESP32を使用したものを持っているので今度紹介したいと思いますが、今回はsshで接続してPython等でコードを書いたらすぐに実行できれば手軽だなと思いRaspberry Pi用のものが欲しいと思ってました。
今まで所有してたものは距離センサーがあって障害物を回避したりはできたのですが、今回はカメラと組み合わせて色々と遊びたいと思って探してたところ、1万円前後で手に入る PiCar-X を購入してみました。
実際に購入したのは2,3か月前なのですが、やっと組み立てました。

初期セットアップは公式ドキュメントPython環境の公式ドキュメントの方に詳しく書いてあるのですが、初期セットアップは何回も行いそうなので、簡素にコマンドを中心にメモを残しておきたいと思います。

RaspberryPi SDカード作成

Raspberry Pi Imager で「CHOOSE OS」→ 「Raspberry Pi OS(other)」 を選択。
Raspberry Pi OS(Legacy)かRaspberry Pi OS Lite(Legacy)を選択してDebian Busterをインストール

pythonモジュール

sudo apt update
sudo apt upgrade
sudo apt install git python3-pip python3-setuptools python3-smbus

robot-hatインストール

cd /home/pi/
git clone https://github.com/sunfounder/robot-hat.git
cd robot-hat
sudo python3 setup.py install

vilibインストール

cd /home/pi/
git clone https://github.com/sunfounder/vilib.git
cd vilib
sudo python3 install.py

picar-xインストール

cd /home/pi/
git clone -b v2.0 https://github.com/sunfounder/picar-x.git
cd picar-x
sudo python3 setup.py install

i2s アンプに必要なコンポーネントインストール

cd /home/pi/picar-x
sudo bash i2samp.sh

最後に「Would you like to reboot now?」と聞かれるので、yを入力し再起動
再起動後に音が出ない場合は、i2samp.sh スクリプトを数回実行する