OS使わず動作するLLMランタイム「NIGHTRUN」をRaspberry Piで動かしてみた
以前、M5StackのLLMアクセラレーターボードを動かしてみたネタを紹介しました
あれから何度か動かしていたのですが、なぜかボードが破損してしまい推論ができなくなってしまいました…
それ以来Raspberry PiでLLMを動かすことを断念してました。
そんな中、TLでこんなポストが流れてきました。
ラズパイ5をOSなしでLLM専用機に、電源投入から30秒で対話開始 https://t.co/lbrsermWnr
— FabScene(ファブシーン) (@FabSceneJp) 2026年7月29日
OSなしとはずいぶんと過大な表現じゃないか?と思いつつもしこれが出来そうなら手持ち無沙汰になったRaspberry Piを有効活用できるかも?
ということで今回はリベンジ的にこのNIGHTRUNをセットアップしてみます。
NIGHTRUNとは?
NIGHTRUNはMITライセンスのOSSです。

従来はAIと対話するためにOSを立ち上げて、そのOS上で動作するプログラムを起動してモデルを読み込む流れがありましたが、NIGHTRUNではそれらの流れを省いているようです。
Rustで動作しており、OSを立ち上げずにLLMを読み込みチャット画面を立ち上げるファームウェアとなっているようです。ここがOSなしと言われる所以らしいです。
ファームウェアはRaspberry Pi 5向け以外にもx86_64 UEFIに対応したマザーボードにも対応できるようで、レガシーなBIOSには非対応です。
用意するもの
- Raspberry Pi 5
- LinuxがインストールされたPC(NIGHTRUNをビルドをするために必要です。今回はUbuntu 20.04を使用しました。)
セットアップ
必要な依存パッケージのインストール
このNIGHTRUNはRustを使用しているのでビルドに使用するPCにRustをインストールします。
インストールには以下のコマンドを実行します。このコマンドを実行するとRust以外にRustのパッケージ管理ツールのcargoも合わせてインストールされます。
curl https://sh.rustup.rs -sSf | sh
インストールが終わったらパスを通しておきます。
source ~/.bashrc
続けて依存パッケージをインストールします。
sudo apt install acpica-tools uuid-dev
ビルド・書き込み
ビルドに使用するPCにソースコードをクローンします。
git clone https://github.com/hardrave/NIGHTRUN.git
以下のスクリプトで一連のビルド・書き込みが実行されます。
./install.sh
途中で対話形式でインストール作業が行われます。
まずは動かすマシンを選択します。今回は Raspberry Pi 5で動かすので 2 を入力し、次に進みます。

ビルドするファームウェアの内容を確認し、問題なければ 1 を入力するとビルドが実行されます。

ビルドが終わると今回使用するモデルを選択します。今回は最も軽い Llama 3.2 1B Q8_0のモデルを選択します。

続いてモデルの参照先を選択します。ここではダウンロードする方法を選択します。

PCに接続されたリムーバブルディスクの一覧が表示されます。この中で書き込み先になるSDカードを選択し、次に進みます。

書き込みが実行されるSDの中身が消去される旨の同意があるので同意したら、最終確認画面で FLASH 【書き込み先のドライブのパス】 と入力すると書き込み処理が実行されます。

その後指定したパスにビルドしたファームが書き込まれます。

書き込みが完了されると以下の通り書き込みされたか検証するかどうか聞かれます。必須ではありませんが、ここは検証しておくと確実かと思います。

検証が完了されたら E と入力してSDカードを取り出します。

以上で起動に必要なファームウェアの準備は完了です。
トラブルシューティング
今回使用したUbuntu 20.04だとディスクの一覧確認で使用しているfdiskのバージョンの問題でカラムの不整合が起きたことで書き込み先のディスクが読み込まれないという問題が起きてました。
古いバージョンのfdiskでも一覧が表示されるようにスクリプトを修正したら不具合が解消されました。
そして本当に些細な修正なので、本家に修正PRを提出しました!
同じエラーに悩んでるみなさんは参考にしてもらえたらと思います。
動かしてみる
それでは実際に動かしてみます。
Raspberry Piに先程ファームウェアを書き込んだSDカードを接続し、電源を入れます。
起動時にOSが読み込まれて完了するとチャット画面が表示されます。
以下の動画のようにプロンプトを投げてメッセージが返答されれば問題なく動作しています。
OS無しで動くというLLMランタイムNIGHTRUNを試してみた
— KMiura (@k_miura_io) 2026年7月30日
Raspberry Piとは思えんぐらい軽い動作で低レイヤーもサポートしてるRust だからこそ成せる仕組みだと思う pic.twitter.com/2ZhX91D9m3
今回試した限りだとメッセージの返答速度としては5トークン/sでした

新規で会話を始めるときには /clear 、シャットダウンするときには /bye と入力すると終了します。
まとめ
今回はOSなしのLLMランタイムのNIGHTRUNをRaspberry Piで試してみました。
OSを使わないことで計算リソースがLLMの推論に集中できるというのはパワープレイではありながらもRaspberry Piのような限られたリソースで動かすには非常に理にかなっていると思いました。
ただ、現状だとLLMで1対1のやり取りをすることしかできないのでRaspberry Pi使ってるならGPIOを使えるスキルが増えるとさらにやれることが増えそうな予感がします。
ソースコードはClaudeに書かせているようで、今後機会があればコントリビュートしてみようと思います。
Bambu Lab A1 mini開封の儀
僕はその昔ロボット工学を学んでおり、その中で3D CADの勉強をしていました。
で、大学院に在籍してた頃に研究室に3Dプリンターが導入されたことをきっかけに自分でも色々3Dモデルを作って試行錯誤してたりしました。
当時は十数万円出さないときれいに生成できない上、すぐに精度が崩れたりしてメンテコストが大変な印象がありました。

コロナ禍になっても少しだけ自分でモデルを作成してたものの、3Dプリンターで出力する機会はめっきり減りました。
ところがここ最近になって界隈で3Dプリンターを購入した話を聞くようになって、最近では数万円程度でそこそこの完成度の生成物ができるらしいです。
とはいえメンテナンスコストがどうなのか想像もつかないし、買ったけどあまり使わなかったらどうしようと思ってずっと二の足踏んでました。
そんな中、TLでこんなポストを見つけました。
Bambu Lab A1 miniセールで3万円切ってるじゃん。このプリントしたやつですhttps://t.co/iUSl4uJTFQ
— からあげ (@karaage0703) 2026年5月30日
3万円切る価格ならお試し程度で使うなら良さそうだし、YouTubeでも結構好評レビューが出てるし期待を込めて購入しました。
文字通り三日三晩脳内会議した結果、ポチった https://t.co/BzAAtZLUAG pic.twitter.com/AwpnZcoSd0
— KMiura (@k_miura_io) 2026年6月2日
Amazonにしては長めの10日経過後、無事に手元に届きました。
My new gear pic.twitter.com/2QvffDLnTC
— KMiura (@k_miura_io) 2026年6月12日
というわけで前置きが長くなりましたが、今回は購入した3Dプリンターを動かしてみたのでその記録です。
購入物
今回購入した3Dプリンターは「Bambu Lab A1 mini」です。
3Dプリンターのエントリーモデルで通常はAmazon価格で4万近くで買えますが、ポイントとかを意識しないのであれば公式ストアから買えば安く買えます。
(周年だとセールでグッと安くなることも…!)
一緒に買ったアクセサリ
A1 mini単体でもセットアップすればOKですが、追加で買っておくと3Dプリントが快適になるアクセサリを紹介します。
フィラメント用密閉ケース
3Dプリントで必要になるフィラメントを保管するためのケースです。フィラメントは湿気によって仕上がりが悪くなることがあるため、保管する時は湿気を守れるケースがあると便利です。そして、フィラメントをノズルに通すためのチューブをつなげるための穴もあるため、ケースから取り出すことなく直接フィラメントをノズルにわたすことができるので、毎回ノズルからフィラメントを外す必要が無いのは嬉しいポイントです!
さらに除湿計も付属していて、ケース内の湿度チェックに使えます。
ただ問題点挙げるとしたら筐体によってはケースが歪んでおり、ケースの閉まりが悪いことと組み立ての説明書が無いのでAmazonの商品ページを見ながら用意することになります(そこまで複雑な手順は無いですが、さすがに所見殺し…)
乾燥剤
先ほども紹介した通り、フィラメントの最大の点滴は湿気です。湿気から守るために密閉容器以外に乾燥剤を用意しておくと更に安心です。

3極プラグの変換アダプタ
電源プラグがアース付きの3極なので、自宅のコンセントが対応してない場合は変換プラグを買っておくといいです。
開封の儀
それでは開封していきます。付属品にはシールとかサンプルのフィラメントもあります。シールを付けてくるあたり、3Dプリント界のAppleと言われるのも納得(そこじゃない


セットアップ
セットアップとしては多少パーツを取り付けたり、固定器具の取り外しとかがありますが付属のマニュアルにそって作業すればそこまで難しくないです。
特にネジに関してはこのように個別の袋でサイズが書いてあるのでどのネジ使えばいいか迷う心配は無いと思います。

先ほど紹介したアクセサリと合わせてセットアップは無事に完了です!

起動
セットアップも終わったので実際に起動してみます。
初回の起動では以下の画面が表示されるので、あとは専用アプリでQRを読み取ることで初期設定が実行されます。
モーターのキャリブレーションからノイズチェックまでやるので値段の割にかなり高精度な造形物ができるかもと期待しちゃいます!

動かしてみる
ここまでやれば印刷ができる状態になります。
試しに3Dプリンター界のHelloworldと言われている3DBencyという船のモデルを印刷してみます。
これは穴や曲線、文字が入っており3Dプリンターの精度を評価するための手法として採用されているようです。(まぁ趣味で使うからそこまでの精度は求めませんが、とりあえず何か作りたい時の選択としてオススメ
モデル自体はプリセットで入っているので、タッチパネルで保存済みモデルから探せば出てきます。
モデルを選択したら印刷が開始されます。
印刷の様子はアプリからタイムラプスで見ることができるのは結構便利です。

開始から20分ぐらいでモデルが完成しました。
よくあるモデルとはいえ実際に出来上がるとワクワクしますね!

動かしてみて
実際に動かしてみると印刷前にキャリブレーションやノズルチェックが行われるので、PLAのフィラメントであればかなり短時間できれいに仕上げてくれる印象がありました。
ただ、そのノズルチェックで結構な量のフィラメントが消費されて以下のようなカスが出力されてプリンター横に溜まるので、回収用の容器を用意しておくといいと思いました。

オススメの印刷するアクセサリ
A1 miniに付属しているアクセサリは必要最小限で他に必要なアクセサリは買うこともあれば、そこは3Dプリンター。誰かが公開してるモデルを利用して印刷をするということも一つのアイデアです。
この「誰かが公開しているモデル」を探す方法の一つがBambu Labが運営しているモデル共有サービス「Maker World」です。このサービスでは様々なモデルが公開されており、気になったモデルをその場で3Dプリンターに転送して印刷させることも可能です。なので、3D CADを触ったことなくても作りたいものを印刷できるかもしれません。
というわけで、ここで僕がオススメのアクセサリのモデルを紹介します。
スクレーパー
Bambu Labが公式で提供しているモデルです。印刷した造形物をステージから剥がすときに下に隙間を作って差し込んで剥がすための器具です。こちらは印刷時間も20分ぐらいで使うフィラメントも少ないので、サンプルのフィラメントで印刷するのもありです。
小物入れ
A1 miniのディスプレイとステージのレールの間の隙間に収まるサイズの小物入れです。先ほど紹介したスクレーパーやプリンターのメンテナンス器具を入れたりして隙間を有効活用しましょう(入れすぎてステージの動作の邪魔にならないようにw)
カス入れ
先ほどノズルチェックの時にフィラメントを抽出したカスが出ると書きましたが、このモデルはその弾かれたカスを貯めとくためのかごです。これでカスを払い落とす手間が省けます。しかもかごは引き出し式になっていてごみ捨てが楽になります。
まとめ
今回はBambu Lab A1 miniを動かしてみた話をしました。
一昔前の3Dプリンターは遅かったり精度があまり高くない印象がありましたが、A1 miniはスピーディーな上、割と精度が高い仕上がりを実現できてかなりコスパが良いと感じました。
一方で初期装備だとかゆいところに手が届かないところもありますが、大半は有志で公開しているモデルを印刷して解決できたりするので「3Dプリンタは買ったけど印刷したいものがない」時に3Dプリンターを使う口実にもなるのでオススメです。
これから作りたいものは色々あるので、どんどん使い倒して行きたいですね!
M5Stackでも動くOpenClaw「ESP Claw」を動かしてみた
先日、名古屋で初めてM5Stack Japan Tourが開催されました。
会場着きますた
— KMiura (@k_miura_io) 2026年4月27日
LT登壇者向けのおみやまでありがとうございます!
#M5JPTOUR2026 pic.twitter.com/MsxqwyjUx0
Station Aiでの開催ということでスタートアップのM5Stackとは相性が抜群なのでは無いでしょうか。
で、せっかく名古屋で開催するのであればということでも僕もLTで喋りました。
M5Stackチームもいるということでスライドは英語で用意しました。(今見るとスライドのタイトル盛大にTypoしとるw)
LTなので触りの部分しか喋れてなかったのとシンプルにスライドが英語だったので、今回はM5Stack Core S3でESP Clawを動かす手順を紹介します。
ESP Clawとは?
ESP32で今話題のOpenClawのようなAIエージェントを動かすことができるフレームワークで主にIoT向けに特化しています。実装はMiniClawに影響を受けているようです。
以下の画像のようにそれまで自前で開発環境を構築してそこからプログラムを書いていたものがESP Clawのサーバーで自律的にありとあらゆるタスクを作成したり、遂行することができるようになります。
タスクの実行には組み込みで使用されているスクリプト言語であるLuaを使用しているようです。

セットアップできると以下のことができるようです
- 定期実行
- 天気予報
- GPIO制御
- Web検索(検索エンジンのAPIキーが必須)
必要要件
必要な要件としては、少なくとも8MBのフラッシュメモリと8MBのPSRAMです。
執筆時点(2026年5月)だと以下のボードがサポートされています。
- ESP32-S3
- ESP32-P4
- ESP32-C5
上記が使われていればM5Stackでも動かせるというわけですが、先日公式でもESP32-S3が使われているStickS3やCoreS3向けにM5Burnerから書き込めるように対応させたとのことでした。
ESP-Claw supports M5Stack StickS3 & CoreS3 now! 🚀✨
— M5Stack (@M5Stack) 2026年4月22日
Flash with M5Burner and start building your project💻🔧#M5Stack #Espclaw #M5Burner #EmbeddedAI #OpenSource pic.twitter.com/M6qZNJpy4Q
試してみる
ファームウェアの書き込み
早速試してみます。今回は家に転がってたCore S3にセットアップしてみます。
まずは、以下のURLからM5Burnerをインストールします。M5Stackシリーズにファームウェアの書き込みを簡単することができるツールです。
インストールできたら、起動しDevice Typeから Core S3 を選択して、検索窓からESP Clawのファームウェアを探して表示されたファームの右下のBurn ボタンをクリックします。

書き込みが終わって以下の通りザリガニの絵が表示されたらファームウェアの書き込みは完了です。

セットアップ
ファームウェアが書き込まれたら、ESP Clawが動かせるようにセットアップをしていきます。
CoreS3に表示されている文字列がWifiのアクセスポイントになっています。アクセスポイントにスマホかPCで接続したら、ブラウザで http://esp-claw.local/ 、またはデバイスのIPアドレスを指定することで設定画面を開きます。(M5Stack側のアクセスポイントに接続したらおそらく設定画面が開くはずです)
開いたら、まずは接続したWifiのSSIDとパスワードを設定します。

接続先のLLMのAPIの接続情報を設定します。
APIは以下のサービスがサポートされています。その他にカスタムのAPIにも対応しています。
- OpenAI
- Anthropic
- Qwen
今回はAnthropicのClaude Haiku 4.5を使います。

Telegram Botをセットアップ
次にESP Clawで連携するチャットサービスを用意します。
以下のサービスがサポートされていますが、今回は日本でも動かせそうなTelegramを使用します。

TelegramでBotをセットアップするにはBotを管理するBotFatherを自分のアカウントに追加します。
追加は以下のURLからできます。
追加したら以下の通り /newbot スラッグを送信すると、チャットベースのやりとりで直感的にBotをセットアップできます。

作成できると、APIトークンが作成されるのでコピーして設定画面のTelegramの項目にAPIトークンをコピペします。また、作成したBotはあらかじめアカウントに追加してもらいます。
Web検索
追加で必要があればWeb検索が使えるようにAPIトークンを入れると検索機能が使えるようになります。
今回はTavilyのAPIに接続します。

動かしてみる
それでは実際に動かしてみます。
以下のポストの動画の通りメッセージを送ると、Botから返答されるようになります。
M5Stack Core S3でOpenClaw的なことが出来ることを見つけたので試してみた
— KMiura (@k_miura_io) 2026年4月26日
とりあえず返答出来ることは確認できていい感じだ!
明日のLTはこのネタで話す予定#M5JPTOUR2026 #m5stack pic.twitter.com/JtaHoC7rv5
あとは、天気予報や今の時間などを問い合わせたり、定期実行タスクを作成することができます。実際にツールが呼び出されているところもメッセージで返されます。
M5Stack Core S3はハードウェア接続はGroveのみで対応しているモジュールを持ってなかったのでハードウェア連携はまだ試して無いです。

ただClaudeだと複雑なタスクをやろうとすると以下の通り1分あたりの入力トークンの制限に引っかかることがあるので、この対策を色々試行錯誤したほうが良さそうです。
最初は最新のSonnet4.6で試しましたが、ちょっとツール呼び出しただけでコケたので少し古めのHaiku 4.5に変えたらある程度簡単なツール呼び出すタスクはこなせるようになりました。

まとめ
今回はM5Stack Core S3でESP Clawを動かしてみました。
ESP32だと簡易的はWebサーバーを動かせたりしますが、まさかOpenClawインスパイアを動かせるのは面白いと思いました。
ただ、すぐAPI上限が引っかかったりたまにツールの動作が不安定なところもあるので今後の改善に期待したいところです。
M5StackのAIアクセラレーターカード「LLM8850」でLLMを試してみた
気がついたら2026年から2ヶ月経過しましたが新年一発名の投稿ですね(あけましておめでとうございますw)
突然ですが昨年、6年ぶりに深センに行ってきました。社会人になってから初めての海外で結構楽しめました。
深圳に着いた‼︎
— KMiura (@k_miura_io) 2025年11月13日
6年ぶり! pic.twitter.com/ge89xRJLn6
この時、深センではMaker Faireが開催するということで海外のMaker Faireに行けるチャンスだと感じてタイミング合わせて行ってきました。
今日は深圳のメイカーフェアにやってきた pic.twitter.com/YLAO6KPTZr
— KMiura (@k_miura_io) 2025年11月15日
日本とは違った雰囲気で野外で伸び伸びやっているのが印象的でした。
そんな中、M5Stackのブースで気になるやつを見つけました。

デカデカとAIアクセラレータのレプリカが置いてあるそばで実際のボードのデモが行われていました。
画像を認識して骨格や物体を認識したり認識した顔を遠隔操作でスタックチャンがトラッキングするというデモでした。滑らかに画像認識してるしLLMも動かせるなら買うしか無いと思い、その場で衝動買いしましたw。(AIアクセラレータボードを買ったら写真に写ってる新製品はじめいろいろおまけを頂きました!)

で、帰国してから追加パーツも用意せず、ずっと放置してたので今回はこれを開封して実際に触ってみたいと思います
用意するもの
- LLM8850
- Raspberry Pi 5(今回は4GBで検証)
- Raspberry Pi M.2 HAT+
- 5V5Aの電源(AIアクセラレーターを動かすので、十分な電力が供給されるものが必要)
LLM8850はM.2で接続する必要がありますが、PCI接続が前提かつUSBでM.2に接続できるアダプタには対応してないので、M.2 HATを使ってRaspberry Pi5を使う構成で試していきます。
ハードウェアのセットアップ
EEPROMの更新
ハードウェアはM.2 HATにLLM8850を取り付けてRaspberry Piに装着するだけです。電源は必ず外した状態でセットアップを行います。
また、ピンヘッダは先にRaspberry Pi側に差し込んでから接続すると確実に接続できます(HAT側に接続したら接続が不安定でした…)

ドライバのセットアップ
ハードウェアをセットアップしたらLLM8850が使えるようにドライバのセットアップをしていきます。
Raspberry Piを起動したら、以下のコマンドでEEPROMのバージョンを確認します。パソコンのBIOSと同様でEEPROMはマザーボード側に書き込まれる設定なので、Raspberry PiのOSを最新にしてもEEPROMが最新になるとは限りません。
sudo rpi-eeprom-update
結果は以下の通りになります。
BOOTLOADER: update available
CURRENT: Fri 13 Jun 09:39:26 UTC 2025 (1749807566)
LATEST: Mon 8 Dec 19:29:54 UTC 2025 (1765222194)
RELEASE: default (/usr/lib/firmware/raspberrypi/bootloader-2712/default)
Use raspi-config to change the release
この時 LATEST と RELEASE が異なる場合は最新版にアップデートしておきます。
アップデートでは以下のコマンドを実行します。
sudo rpi-eeprom-update -a
アップデートが終わったら一度再起動します。再起動後、 sudo rpi-eeprom-update で確認して最新版になっていればEEPROMの更新は正常に完了しています。
sudo reboot
続けて接続したアクセラレーターカードが認識しているか確認します。以下のコマンドでPCIで接続されたハードウェアを確認します。
lspci
以下の実行結果になるかと思います。
0001:00:00.0 PCI bridge: Broadcom Inc. and subsidiaries BCM2712 PCIe Bridge (rev 30) 0001:01:00.0 Multimedia video controller: Axera Semiconductor Co., Ltd Device 0650 (rev 01) # <- これが表示されてたらOK 0002:00:00.0 PCI bridge: Broadcom Inc. and subsidiaries BCM2712 PCIe Bridge (rev 30) 0002:01:00.0 Ethernet controller: Raspberry Pi Ltd RP1 PCIe 2.0 South Bridge
実行結果にある Multimedia video controller: Axera Semiconductor Co., Ltd Device 0650 (rev 01) がLLM8850にあたります。これが表示されていればハードウェアは正常に認識されています。
もし表示されない場合は、ケーブルの接触不良の可能性があるのでケーブルの接続を確認してください。
ドライバーのインストール
今度はLLM8850のドライバーをインストールしていきます。
まずはドライバーのパッケージを以下のコマンドで取得します
sudo wget -qO /etc/apt/keyrings/StackFlow.gpg https://repo.llm.m5stack.com/m5stack-apt-repo/key/StackFlow.gpg echo 'deb [signed-by=/etc/apt/keyrings/StackFlow.gpg] https://repo.llm.m5stack.com/m5stack-apt-repo axclhost main' | sudo tee /etc/apt/sources.list.d/axclhost.list
以下のコマンドでドライバーをインストールします
sudo apt update sudo apt install dkms sudo apt install axclhost
インストールが終わると、環境変数を反映すればドライバーが使える状態になります。
今作業を行っているターミナルで作業を続ける場合は以下のコマンドを実行すると環境変数が再度読み込まれます。
source /etc/profile
ドライバーがインストールされたか確認するため、以下のコマンドでデバイスのステータスを確認します。
axcl-smi
実行すると以下の通りデバイスの仕様ステータスが詳細に表示されます。ステータスが表示されたらLLM8850を動かすセットアップは一通り完了です。
+------------------------------------------------------------------------------------------------+ | AXCL-SMI V3.6.4_20250822020158 Driver V3.6.4_20250822020158 | +-----------------------------------------+--------------+---------------------------------------+ | Card Name Firmware | Bus-Id | Memory-Usage | | Fan Temp Pwr:Usage/Cap | CPU NPU | CMM-Usage | |=========================================+==============+=======================================| | 0 AX650N V3.6.4 | 0001:01:00.0 | 145 MiB / 945 MiB | | -- 42C -- / -- | 1% 0% | 18 MiB / 7040 MiB | +-----------------------------------------+--------------+---------------------------------------+ +------------------------------------------------------------------------------------------------+ | Processes: | | Card PID Process Name NPU Memory Usage | |================================================================================================|
LLMを走らせてみる
ここまでアクセラレーターカードのセットアップができたので、今度は実際にLLMを試してみます。
今回は公式で紹介されていたDeepSeek R1をセットアップしてみます。
ファイル一式はHugging FaceからGitでクローンしていきます。この時通常のGit Cloneだと取得できない大きいサイズのモデルがあるため、それを取得するためにGit LFSをインストールします。
sudo apt install git-lfs
以下のコマンドでインストールされたか確認します。
git lfs install
Git LFSがインストールされたら、以下のコマンドでファイル一式をクローンします。
git clone https://huggingface.co/AXERA-TECH/DeepSeek-R1-Distill-Qwen-1.5B-GPTQ-Int4
ls -lh 以下のファイル構成・ファイルサイズになっていれば問題ありません。
-rw-rw-r-- 1 pi pi 0 Feb 23 01:06 config.json drwxrwxr-x 2 pi pi 4.0K Feb 23 01:08 deepseek-r1-1.5b-gptq-int4-ax650 drwxrwxr-x 2 pi pi 4.0K Feb 23 01:06 deepseek-r1_tokenizer -rw-rw-r-- 1 pi pi 4.2K Feb 23 01:06 deepseek-r1_tokenizer.py -rw-rw-r-- 1 pi pi 976K Feb 23 01:07 main_axcl_aarch64 -rw-rw-r-- 1 pi pi 999K Feb 23 01:07 main_axcl_x86 -rw-rw-r-- 1 pi pi 932K Feb 23 01:07 main_prefill -rw-rw-r-- 1 pi pi 277 Feb 23 01:06 post_config.json -rw-rw-r-- 1 pi pi 7.4K Feb 23 01:06 README.md -rw-rw-r-- 1 pi pi 533 Feb 23 01:06 run_deepseek-r1_1.5b_gptq_int4_ax650.sh -rw-rw-r-- 1 pi pi 538 Feb 23 01:06 run_deepseek-r1_1.5b_gptq_int4_axcl_aarch64.sh -rw-rw-r-- 1 pi pi 534 Feb 23 01:06 run_deepseek-r1_1.5b_gptq_int4_axcl_x86.sh
クローンされたディレクトリ上でPythonの仮想環境をセットアップします。
python -m venv deepseek
仮想環境を有効にします。
source deepseek/bin/activate
以下のコマンドで必要なPythonライブラリをインストールします。
pip install transformers jinja2
tokenizer parserを起動します。
python deepseek-r1_tokenizer.py --port 12345
別のターミナルを立ち上げてクローンしたレポジトリのディレクトリ上で以下のコマンドを実行し、スクリプトの実行権限を付与します。
chmod +x main_axcl_aarch64 run_deepseek-r1_1.5b_gptq_int4_axcl_aarch64.sh
以下のコマンドでスクリプトを実行します。
./run_deepseek-r1_1.5b_gptq_int4_axcl_aarch64.sh
以下の通り対話環境が起動されればセットアップは正常に完了しています。
pi@raspberrypi:~/Codes/DeepSeek-R1-Distill-Qwen-1.5B-GPTQ-Int4 $ ./run_deepseek-r1_1.5b_gptq_int4_axcl_aarch64.sh
build time: Feb 13 2025 15:44:57
[I][ Init][ 111]: LLM init start
bos_id: 151646, eos_id: 151643
100% | ████████████████████████████████ | 31 / 31 [25.35s<25.35s, 1.22 count/s] init post axmodel okremain_cmm(-1 MB)
[I][ Init][ 226]: max_token_len : 1023
[I][ Init][ 231]: kv_cache_size : 256, kv_cache_num: 1023
[I][ load_config][ 282]: load config:
{
"enable_repetition_penalty": false,
"enable_temperature": true,
"enable_top_k_sampling": true,
"enable_top_p_sampling": false,
"penalty_window": 20,
"repetition_penalty": 1.2,
"temperature": 0.9,
"top_k": 10,
"top_p": 0.8
}
[I][ Init][ 288]: LLM init ok
Type "q" to exit, Ctrl+c to stop current running
>>
どうやら英語か中国語にしか対応してなさそうなので英語で適当なプロンプトを投げてみました。スペースやタブが文字化けするのが気になりますが、それを解消すれば普通に使えそうです。
Raspberry Pi単体だけでLLMを動かしたことがないのでなんともいえませんが、簡単な質問は秒で返答しますしちょっと複雑な質問でも詰まることなくスムーズに返答を出力できてたので、モデルをファインチューニングして日本語に対応できれば、日本語でも全然使えそうな印象があります。(やるかどうかは別だけど…
>> Hello <think>ĊOkay,ĠIĠneedĠtoĠhelpĠtheĠuserĠwithĠtheirĠquery.ĠTheyĠstartedĠwithĠ"YouareDeepSeek-R1,Youareahelpfulassistant."ĠItĠseemsĠlikeĠthey'reĠprovidingĠsomeĠinformationĠorĠaĠprompt.ĠTheĠresponseĠwasĠ"Hello!"ĠwhichĠisĠfriendlyĠandĠwelcoming.ĊĊIĠshouldĠconsiderĠwhatĠtheyĠmightĠneed.ĠTheyĠcouldĠbeĠseekingĠassistance,Ġinformation,Ġfeedback,ĠorĠjustĠhappyĠtoĠbeĠpartĠofĠaĠconversation.ĠMaybeĠthey'reĠlookingĠforĠhelpĠwithĠaĠspecificĠtask,ĠorĠtheyĠcouldĠbeĠseekingĠaĠfriendlyĠgreeting.ĊĊIĠshouldĠrespondĠinĠaĠwayĠthat'sĠpositiveĠandĠhelpful.ĠIĠwantĠtoĠacknowledgeĠtheirĠmessageĠpositivelyĠandĠsetĠaĠgoodĠexample.ĠSo,ĠI'llĠsayĠsomethingĠlike,Ġ"I'mĠhereĠtoĠhelp!ĠLetĠmeĠknowĠhowĠIĠcanĠassistĠyouĠtoday."ĠThat'sĠopen-ended,ĠinvitingĠthemĠtoĠaskĠforĠanythingĠtheyĠneed.Ċ</think>ĊĊI'mĠhereĠtoĠhelp!ĠLetĠmeĠknowĠhowĠIĠcanĠassistĠyouĠtoday. [N][ Run][ 610]: hit eos,avg 13.90 token/s >>
まとめ
今回は、M5StackのAIアクセラレーターカードをセットアップしてRaspberry PiでLLMを動かしてみました。
消しゴムぐらいのサイズのアクセラレーターカードですが、動かしてみるとかなりパワフルでLLMもスムーズに返答できるのはかなり面白いです。
他にもMaker FaireでやってたYOLOを使った画像認識などのサンプルもあったので、色々試してみたいところです!
参考
Jetson Xavier NXをセットアップしてみた
もうすぐ2025年も終わります。
今年はコミュニティ活動も積極的に取り組んだり、仕事でも出張の頻度が多く各地を飛び回ってました。
そんな中、大阪に出張に行ったときに久々に日本橋の電気街を散策していました。
シリコンハウスのガジェット自販機も健在でした!
5年ぶりに来たぞ、でんでんタウン pic.twitter.com/NqDZICUkTr
— KMiura (@k_miura_io) 2025年9月10日
例のガジェット自販機を見つけた
— KMiura (@k_miura_io) 2025年9月10日
せっかくだから何個か買ってみた pic.twitter.com/OgzkaPHCnw
シリコンハウスには用件済ませて閉店間際に駆け込んだのですが、そこでちょっとおもしろそうなものを買ってきました。
それは、簡易梱包されたJetson Xavier NXが搭載されたミニPCです

写真を撮り忘れましたが、レジの前にこの袋が山積みになっている横にJetson Nanoが搭載されたカメラも置いてあり、どっちを買うか迷いましたがすでにJetson Nanoはすでに持っていたのと、モジュールだけでもいい値段するXavierを手に届く価格で試してみたくて、衝動買いしてしまいましたw
オンラインでも販売されていたようで、以下のURLにある商品です。今は現行のJetsonが高騰しているなかで、3万切るのは安いですよね。(新品ではないけど)
とりあえず起動してみたらすでに中にOSがインストールされていそうでした。

ここで終わっても良かったのですが、Jetson Xavier NXに内蔵されたたった16GBのeMMCでしかブートしてなかったようで追加で何かセットアップするには心許なかったです。
で、インストール済のJetPackはUbuntu 18.04に対応していますが、調べてみたら20.04に対応したバージョンまで上げることができそうです。
というわけで今回はこのミニPCでUbuntu 20.04が使えるように一からセットアップしていきます。
今回セットアップするPCのスペック
簡単にPCのスペックをまとめると以下の表になります。
| 項目 | スペック |
|---|---|
| 型番 | NX211B-OL |
| インターフェース | Ethernet、HDMI、SDカードスロット、USB 3.0×2、micro USB(OTG用) |
| ストレージ | eMMC 16GB |
| 電源 | DC12V(ACアダプタは付属) |
用意するもの
- NX211B-OL
- 外付けディスク(SSDやUSBメモリなど)
- OTGに対応したマイクロUSB
- OSを書き込むためのホストPC(Ubuntu、CentOSまたはWindows。今回はUbuntuを用意しました)
セットアップ
sdk managerをインストール
JetsonのeMMCにOSを書き込むためにホストPCにsdk managerをインストールします。
インストーラーは以下のURLからお使いのPCのOSに合わせてダウンロードします。インストールにはNvidia Developerのアカウントに登録する必要があります。
僕の場合は、Ubuntuでセットアップしていたので以下のコマンドでインストーラーを使用してインストールします。
sudo apt install ./sdkmanager_2.4.0-13234_amd64.deb
ホストPCをJetsonにつなげる
続いてホストPCとJetsonを接続してOSを書き込むための準備をします。
OTGケーブルでPC同士を接続したら RECOVERY と書かれた穴にあるボタンを押しながらJetsonの電源を入れるとリカバリモードでPCが起動します。
ボタンは深いところにあるので、細めのプラスドライバーで押し込んでいます。

lsusb コマンドを叩いて、 NVIDIA Corp. APX が一覧に表示されていればJetsonはリカバリモードで接続できています。
koki@koki-desktop:~$ lsusb Bus 001 Device 002: ID 8087:8000 Intel Corp. Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 003 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 002 Device 004: ID 0955:7e19 NVIDIA Corp. APX Bus 002 Device 003: ID 04d9:a088 Holtek Semiconductor, Inc. APX Bus 002 Device 002: ID 1a40:0101 Terminus Technology Inc. Hub Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
OSのインストール
接続できたら、SDK Managerを起動します。
初回起動時にSDK Managerをインストールしたときに登録したNvidia Developerのアカウントでログインします。
ログイン後、Jetsonと接続できていれば、以下の通りデバイスの一覧が表示されます。今回はサードパーティーのキャリアボードと接続して使うので、 Jetson Xavier NX を選択し OK ボタンをクリックします。

まずは、セットアップする内容を設定しておきます。
JetPackはXavierで使える最後のバージョンである5.1.5を設定し、DeepStreamのインストールは任意です。

インストールの内容を確認して一番下のライセンス同意のチェックボックスにチェックを入れたら CONTINUE をクリックします。

ダウンロードしたSDKの保存先が自動作成されるので、確認したら Create をクリックします。
管理者権限の処理があるので、ホストPCのユーザーのパスワードを入力して OK をクリックします。

インストールが実行されるのでしばらく待ちます。

インストール中にJetsonのモジュールに書き込む情報が聞かれるので設定していきます。
SSH接続で必要なIPアドレスは特になにもいじらずにユーザー名とパスワードは任意のものをいれておきます。
Storage Deviceには eMMC を設定しておきます。

Jetsonのストレージの拡張
しばらくすると、Jetson側のファンが動いてOSが立ち上がります。
そして、以下のダイアログが表示されたらJetsonにログインできる状態になったので、ダイアログにあるログイン情報でSSH接続ができます。
OSの立ち上がりには時間がかかるので、ログインできないときにはしばらく待ちます。

SSH以外にも画面を接続すればデスクトップでも操作できる状態になるのでデスクトップで操作したいときにはモニター、キーボード、マウスを用意して操作します。

ここでもう一度おさらいするとこの時点ではeMMCにOSが書き込まれている状態で、Jetson用のSDKパッケージであるJetPackをインストールするにはストレージが不足します。
その証拠にすでにeMMCの使用率はほぼ100%に達しています。
nvidia@ubuntu:~$ df -h Filesystem Size Used Avail Use% Mounted on /dev/mmcblk0p1 14G 13G 0 100% / none 3.3G 0 3.3G 0% /dev tmpfs 3.4G 0 3.4G 0% /dev/shm tmpfs 684M 53M 631M 8% /run tmpfs 5.0M 4.0K 5.0M 1% /run/lock tmpfs 3.4G 0 3.4G 0% /sys/fs/cgroup tmpfs 684M 4.0K 684M 1% /run/user/1000 nvidia@ubuntu:~$
そこでこのタイミングで外付けのディスクを使ってUSBブートをできるようにするための設定を行います。
その手順については以前Jetson互換のreComputerをセットアップするときに一度試したことあり、この手順を参考にセットアップをしていきます。ここではざっと手順をまとめますが、詳細な手順は以下のブログの通りにやれば問題なかったです。
まずは必要なスクリプトのレポジトリをクローンします。
git clone https://github.com/limengdu/rootOnUSB.git
続けて以下のコマンドでスクリプトを実行してOSをext4形式にフォーマットした外付けディスクにクローンします。
コピー先のディスクのパスはディスクアプリかlsblkなどで確認しておきます。
./copyRootToUSB.sh -p /dev/sda1
/boot/extlinux/extlinux.conf を開き、rootのパスをコピー先のディスクのパスに書き換えます。
- APPEND ${cbootargs} root=/dev/mmcblk0p1 rw rootwait rootfstype=ext4 console=ttyTCU0,115200n8 console=tty0 fbcon=map:0 net.ifnames=0 video=efifb:off nospectre_bhb nv-auto-config + APPEND ${cbootargs} root=/dev/sda1 rw rootwait rootfstype=ext4 console=ttyTCU0,115200n8 console=tty0 fbcon=map:0 net.ifnames=0 video=efifb:off nospectre_bhb nv-auto-config
書き換えたらJetsonを再起動して、再度dfコマンドでストレージの空き容量を確認したときに外付けディスクで追加した容量が認識されていたらストレージの拡張は成功です。
nvidia@ubuntu:~$ df -h Filesystem Size Used Avail Use% Mounted on /dev/sda 234G 9.9G 212G 5% / none 3.3G 0 3.3G 0% /dev tmpfs 3.4G 36K 3.4G 1% /dev/shm tmpfs 684M 27M 657M 4% /run tmpfs 5.0M 4.0K 5.0M 1% /run/lock tmpfs 3.4G 0 3.4G 0% /sys/fs/cgroup tmpfs 684M 20K 684M 1% /run/user/124 tmpfs 684M 28K 684M 1% /run/user/1000
再びホストPCのSDK Managerに戻り、残りのインストールを再開させたらインストールは成功です。

まとめ
今回大阪出張のときに買ったJetson Xavier NX搭載のミニPCをクリーンインストールしてみました。
同じようにシリコンハウスでこのミニPCを買った人たちのブログも見かけますが、なかなかうまくセットアップされなかったりしたのでメモがてら自分がうまくいった手順をまとめました。
なかなか忙しくてあまりさわれてなかったので、年末年始の積みガジェットの消化が一つできて良かったです。
これでUbuntu 20.04が使えるようになったのでLLMとかのセットアップをして色々遊べたらと思います!
ultraArmと吸引ポンプを繋いでみた

先日、ソラコムさんが開催されている年次カンファレンス「SORACOM Discovery」に参加してきました。
僕はコロナ禍が収まってからオフライン参加がメインになってきて、何かしら登壇や出展という形で爪痕を残してきました。
今年もIoTプロトタイピングで出展してきました!
今年で10回目の記念すべき回でまた自分の作品を出展することができるのはとてもありがたい話です。
前回はスマートコーヒーメーカーを展示しまして、そのときに使ってたセンサーの使い方をブログで紹介しました。
で、今年は30歳になったこともあり、せっかくなので僕が前から作りたかったものを作ろうと思い2年前にモニター提供していただいたultraArmを使ってマルバツゲームの対戦相手を展示しました。
完成品はこんな感じです。
正直当日まで間に合うか心配でしたが、無事前日にギリギリ完成し当日も無事安定稼働で終えることができました!(余談ですが、2年前に登壇したときにもデモとしてロボットアームを持ち込んだのに電源忘れて持ってきたデモが動かせなかったという失敗をしたので今回はそのリベンジを達成できたまでありますw)
早入りして無事セッティングDone
— KMiura (@k_miura_io) 2025年7月15日
プロトタイプコーナーでお待ちしております!#soracom #soracomug pic.twitter.com/89h1sOQLEf
プロトタイピングコーナー大盛況!#soracomug #soracom pic.twitter.com/q5ROru3pL2
— KMiura (@k_miura_io) 2025年7月16日
で、このプロトタイピングを作るにあたってミソになったところの一つがハンドエフェクターとして吸引ポンプを採用したことです。
こんな時間だけどさ、今日スイッチサイエンスから来たmyCobotのアクセサリーで遊びたいよね pic.twitter.com/xg4l0sihKa
— KMiura (@k_miura_io) 2025年7月2日
もともとmyCobotに対応している機種で最初はmyCobotを使って作品を想定してしましたが、関節に使われているロボットがすぐオーバーヒートを起こして思い通りの姿勢に動かなくなってしまったので急遽ultraArmを使う作戦にピボットすることになりましたw(去年もそんな調子でしたね…)
ピボットしたとて、調べてみると吸引ポンプをultraArmで使う事例がそんなに出て来ず苦戦しました。(そもそも日本語のultraArmの記事このブログしか出てこないw)
というわけで前置きが長くなりましたが、今回は久々のultraArmネタとしてこの吸引ポンプをultraArmと連携する方法を紹介しようと思います。
用意するもの
- ultraArm P340
- myCobot 280用吸引ポンプ
- Raspberry Pi(PythonがインストールされたUSBでシリアル通信ができるPCであれば何でも可)
ハードウェアのセットアップ
ポンプの先端はultraArmに付属のLEGOコネクタに対応したフランジで取り付けておきます。(実際にはUltraArm用ピッキングキット付属の吸引ポンプを使うのがよさそうです)

ポンプは付属のGroveケーブルを使いultraArmの本体裏側の「Switch」端子に接続します。(ピンボケで分かりづらいですが、同じGrove端子になっているのでお分かりいただけるかと思います)

ハードウェアのセットアップはこれで以上です。
PCの環境構築
今回はサクッと動かせるようにPythonを使います。
Pythonのライブラリである pymycobot にultraArmを操作するためのモジュールがあり、それをつかえば ultraArm内臓のインターフェースも操作することができます。
まずはターミナルで以下のコマンドでインストールします。
pip install pymycobot
インストールしたら以下のコードを pump_sample.py で保存します。PORT はお使いのPCの接続先のポート合わせて書き換える必要があります。
from pymycobot import ultraArm # Connecting the mechanical arm PORT = '/dev/ttyUSB0' ua = ultraArm(PORT, 115200) ua.sleep(0.5) # Open suction pump ua.set_gpio_state(0) ua.sleep(2) # Close the suction pump ua.set_gpio_state(1) ua.sleep(2)
ultraArmで吸引ポンプを動かすサンプルが見当たらないと書きましたが、以下の公式ドキュメントに接続方法から使い方までシンプルにまとめられてましたw
これで python pump_sample.py を実行するとポンプの吸引、停止の一連の動作を行うことができるので吸引しやすいカードや平たい小物を使って動作確認を行うことが出来ます。
以下の動画はmyCobotだし、適当なモーションを入れてますがポンプの挙動はイメージいただけるかと思います。
やっぱりバンドエフェクタあるとロボットアーム使ってる感出るねー
— KMiura (@k_miura_io) 2025年7月2日
(なお、コーディングにはAmazon Q Dev CLIを使用 pic.twitter.com/coEoLoUGEk
まとめ
今回はSORACOM DiscoveryのIoTプロトタイピングで使われていた吸引ポンプをultraArmで動かす方法を紹介しました。
ロボットアームを持っていても何かしらハンドエフェクターが無いと面白みが無いよなーとふわっと思ってましたが、Discoveryを期に試すことが出来たのが良かったです。
何より昔あこがれてた某T社系列の会社が開発してた将棋ロボットのようなロボットアプリケーションとAlpha GoのようなゲームAIをあわせた作品を自分の手で実現出来たのが個人的に大きな成果です。
これでまた、一度やってみたかったことをまた一つ達成できました!
Amazon Q CLIでPyGameを使ったゲームを作ってみた
最近Amazon Qを使ってゲームを作成したらTシャツをゲットするキャンペーンをやっているようです。
結構TLでもAmazon Qを使っている人たちがたくさんいますが、僕は他のAIエージェントを使っていたこともあってAmazon Qをわざわざ触るメリットが無いかなーと思って触っていなかったです。
ですが、TシャツにつられてAmazon Q CLIだけでゲームを作成してみることにしましたw
今回作ったゲーム
今回はAWSのアーキテクチャアイコンを使ったツムツム風のゲームを作ってみました。

その昔新卒時代に働いてた会社ではツムツムのようなパズルRPGの開発に携わっていました。(今はそのゲームはサービス終了しています…)
なので、その頃のことを思い出して懐かしくなったのとこれまでPythonを結構触っていましたが、一度もPyGameで自分でゲームを作成したことなかったのでAIのちからを使って自分だけのゲームを作ってみようと思ったのがモチベーションだったりしています。
事前準備
本当はそこからAIで用意すべきな気もしますが、さすがに膨大なAWSのアイコンを取得させるのは負荷がおもすぎる気がするのであくまでアセットとして用意することにしました。
AWSのアイコンは以下のリンクにアクセスします。
リンク先ページ「開始方法」のプルダウンからアイコンパッケージをダウンロードします。

ダウンロードしたzipファイルを展開したらサービスアイコンのディレクトリ名を arch_icons に変更してプロジェクトディレクトリに配置します。
そして、今回の主役であるAmazon Q CLIをパソコンにインストールします。
以下のリンクからお使いのOSに合わせてCLIをインストールします(正直今回大事なところはここw)
あとは今回はPyGameを使うので以下のコマンドでインストールします。
pip install pygame
これで準備は完了です。
実装
ここからは実装です。
試しに「AWSのアーキテクチャアイコンを使ってディズニーツムツムのようなゲームをつくってください。制限時間内に3個以上のアイコンが揃ったら削除し、制限時間内で削除したアイコンのサービス名を一覧で表示するようにしてください」とプロンプトを叩いた結果が以下のポストの動画です。
Amazon QでAWSのアーキテクチャアイコンを使ったツムツムを作ってみた
— KMiura (@k_miura_io) 2025年6月4日
難易度調整一切ないのでそれなりに難しいw(ただでさえ似たアイコンが多いし) pic.twitter.com/kxo4DRFBgz
雑に投げたのにそれっぽい完成度になりました!ただ、見ての通り縦に2つ消したときに一つしか隙間が埋まってなかったり、ちょこちょこバグがありました。
ただ、それも気になったバグを逐一報告していくと都度修正してくれるし、もちろんUIの修正も細かくやってくれました。
そして、動画をご覧いただくとお分かりいただけるかと思いますが、隣合わせのブロックをいちいちクリックしないといけないのはツムツムらしさがまるでないのでツムツムのように連鎖的に消去する改修にも対応してくれて、本当にAmazon Qだけで全部実装を簡潔することができてしまってびっくりしました!
こんな感じでどんな修正をしたかを毎回リッチなUIこんな感じで丁寧に説明してくれるのも良かったです
### 1. 連鎖選択機能の追加
chain_select という新しいメソッドを追加し、選択したアイコンと同じ種類のアイコンを周囲から自動的に選択するようにしました
:
python
def chain_select(self, row, col, service_name):
# 上下左右斜めの8方向をチェック
directions = [
(-1, -1), (-1, 0), (-1, 1),
(0, -1), (0, 1),
(1, -1), (1, 0), (1, 1)
]
for dr, dc in directions:
new_row, new_col = row + dr, col + dc
# グリッド内かチェック
if 0 <= new_row < self.grid_size and 0 <= new_col < self.grid_size:
neighbor = self.grid[new_row][new_col]
# 隣接アイコンが同じタイプで、まだ選択されておらず、マッチしていない場合
if (neighbor and
neighbor.service_name == service_name and
not neighbor.selected and
not neighbor.matched):
# 選択状態にする
neighbor.selected = True
self.selected_icons.append(neighbor)
# 再帰的に連鎖選択を続ける
self.chain_select(new_row, new_col, service_name)
### 2. select_icon メソッドの改良
select_icon メソッドを改良して、アイコンを選択した後に連鎖選択を行うようにしました:
python
def select_icon(self, row, col):
icon = self.grid[row][col]
# If icon is already selected, deselect it
if icon.selected:
icon.selected = False
if icon in self.selected_icons:
self.selected_icons.remove(icon)
return
# Check if the icon is the same type as already selected icons
if self.selected_icons and icon.service_name != self.selected_icons[0].service_name:
return
# 連鎖選択のために、すでに選択されているアイコンに隣接しているか確認
can_select = not self.selected_icons # 最初の選択は常に可能
if self.selected_icons:
# 隣接チェック
for selected_icon in self.selected_icons:
# 選択済みアイコンの位置を探す
for r in range(self.grid_size):
for c in range(self.grid_size):
if self.grid[r][c] == selected_icon:
# 隣接しているか確認(上下左右斜め)
if abs(row - r) <= 1 and abs(col - c) <= 1:
can_select = True
break
if can_select:
break
if can_select:
icon.selected = True
self.selected_icons.append(icon)
# 連鎖的に周囲の同じタイプのアイコンを自動選択
self.chain_select(row, col, icon.service_name)
# If we have enough selected icons, match them
if len(self.selected_icons) >= self.match_min:
self.match_selected_icons()
### 主な変更点
1. 連鎖選択の実装: 選択したアイコンの周囲8方向(上下左右斜め)に同じ種類のアイコンがあれば、自動的に選択します。
2. 再帰的な連鎖: 連鎖選択は再帰的に行われるため、連続して同じ種類のアイコンが並んでいる場合、すべて選択されます。
3. 選択条件の調整: 最初のアイコン選択は常に可能で、2つ目以降は隣接しているかつ同じ種類のアイコンのみ選択可能です。
### ゲームプレイへの影響
この変更により、ゲームプレイが以下のように変わります:
1. より簡単な操作: プレイヤーは1つのアイコンをクリックするだけで、周囲の同じ種類のアイコンがすべて選択されます。
2. より大きなコンボ: 同じ種類のアイコンが多く隣接している場合、一度に多くのアイコンを消すことができます。
3. 戦略性の向上: プレイヤーは同じ種類のアイコンを隣接させるように移動させる戦略を考えるようになります。
完成品
何度もCLIと会話をしたことでだいぶ完成度高めのゲームが出来上がりました!
更にバグ修正、ブラッシュアップをさせたらよりツムツムっぽいゲームになった!
— KMiura (@k_miura_io) 2025年6月4日
これで知らないAWSアーキテクチャを知るいい機会になったんじゃなかろうか? pic.twitter.com/ZSkEDZw2qk
それなりに難易度高かったので簡単な難易度調整も入れました(最小で消せるブロックの数や画面上のブロックの数)
まとめ
今回はAmazon Qを使ってPyGameを使ったゲームを作成してみました。
学生時代にPyGameでゲームのロジックを組むのが難しくて断念していたのですが、Amazon Qを通じて思ってたよりも細かいUI操作ができることに気づけてそれは挫折しても仕方ないと思えてしまいましたw。
何よりAmazon QはAWSのサービスに特化したツールだと思っていましたが、それとは関係ないコーディングにも対応しているうえに1円も課金せずにここまで作ってしまうのは恐ろしいと思いましたw。(そのうち制限が掛かりそう)
後日談
あれから今回作成したゲームでキャンペーンに応募したところ、無事にTシャツをゲットしました!
応募してから大体1週間ぐらいで審査が通り、更にもう1週間ぐらいで配送手配してもらい思ってたよりもスピーディーに対応してもらえた印象です。(配送業者の提示してた配送予定日より1日遅れたけど、AWSさんは関係ないw)
例のTシャツ届いたぞー‼︎
— KMiura (@k_miura_io) 2025年6月19日
早速明日の #jawsug_nagoya で着ていきます!#AmazonQDevCLI pic.twitter.com/snfkxzZLTS