Raspberry Piに関する話題 #01
(0) どうしてRaspberry Piに興味を持つことになったのか
- 最初はeasy-CとArduino Unoを組み合わせて、easy-Cからおもちゃを制御するという試みをやっていました(今も引き続きやっています)。その過程で、Raspberry Pi Picoに興味を持ちました。・・・Picoは本当に素晴らしいマイコンで、安くて高性能だと思います。
- それで、こんなすごいのなら、こいつに簡単なディスプレイやキーボード&マウスをつけてやれば、ちょっとしたPCもどきが作れるのではないかと考えました。いい感じにOSも書いてやれば、きっとすごく面白いと思うのです。
- これを思いついたのは、Amazonで「480x320 SPIシリアルTFT」が1815円で売っているのを見つけてしまったせいです。
- しかしこんなことをする必要はないのです。なぜなら Raspberry Pi Zero 2 W というのがすでにあるからです。 https://raspberry-pi.ksyic.com/ にいけば2915円で売っています。
- しかしZero 2 Wはメモリが512MBしかないという問題を抱えていて、そのためにwebブラウザの利用が快適ではないと言われています。・・・512MBといえば、私の感覚では十分な容量なのですが、でも確かに現代のwebブラウザを動かすには足りないというのはその通りです。
- これをどうにかしたいなと思って、省メモリなブラウザを作ろうかなと考えたりしました。しかし最近のwebページは多量のメモリを使ってレンダリングすることを前提にしているようなサイトが多いので、ブラウザだけでできることには限界があり、苦労の割には得るものが少ないかもしれないと思いました。
- 一方で、そんな努力をしなくてもすでにメモリ量の多いRaspberry Piが存在していました。Raspberry Pi 4です。1GB/2GB/4GB/8GBのモデルがあって、1GBなら7000円程度、2GBでも8000円程度で売っているようです。これくらいあれば、きっとwebブラウザも安定して動させそうです。
- もっと性能が欲しくなったらさらに上があります。Raspberry Pi 5です。メモリ4GBのモデルが12000円程度で、8GBのモデルが15500円程度のようです。・・・しかし私はこれは微妙だと思います。なぜなら、N100の8GBモデルなら、ケースも電源もSSDもついて、Amazonで18500円程度で売っているからです。
- ちなみに私はすでにN100のミニPCを複数台持っていて、本当に安くて高性能だと日々感じています。
(1)
- 私の現時点での考え方はこうです。「快適なデスクトップ環境をRaspberry Piで安価に実現しよう」という考えは捨てました。それはN100のミニPCという強力なライバルがいるので、優位性を見いだしにくいです。
- N100と価格的に競合しないのは、Raspberry Pi ZeroとRaspberry Pi 4だと思います。私はその中でも、特にZero 2はとても頑張っていると思っています。これはもはや感動的なレベルです。・・・ということで当面はZero 2のことを考えようと思います。
- Zero 2 でなにかおもしろいことができないかなあと思案中です。
- OSの起動時間を短縮する: モバイルじゃないから、起動が速くてもあまりメリットない?
- Zero2があれば、PicoやArduinoを中継しなくても電子部品を制御できる: まあそうなんだけど、そこにメリットを見いだせるかどうかは状況による
- IchigoJamの超高級機として価値を見いだす?: この路線なら優位性はすごくありそう。・・・じゃあeasy-CをZero2向けに移植する?
- 仮想デスクトップというか、重い処理を別のマシンに丸投げして、結果だけ受け取って出力するみたいなことはできないかな?ネットワーク帯域は結構使ってしまうかもしれないけど。
フォーマット変更
2024.04.17(水) #1
- なんかつべこべ言っているだけでは何も始まらないので、Zero 2 W とケースを買いました(たぶん明日届きます)。電源はうちにあるUSB電源とUSBケーブルで何とかなりそうです。mini-HDMIのケーブルもありますから買わなくていいはずです。USBのキーボードやマウスもあります。
- ないものは・・・まずUSBのハブが多分必要ですよね。あとマイクロSDカードがないです。マイクロSDのカードリーダーは・・・手持ちのノートPCにあるようです。
- USBハブはmicroBでつなぐタイプが安くなかったので、microB→typeAに変換するやつと、typeAのUSBハブの組み合わせにしました。
- USBハブは https://www.amazon.co.jp/dp/B0CBBJGGLR/ にしたのですが、559円(タイムセール)でUSB3.0にも対応して、バスパワーだけではなくセルフパワーもできるなんて、こんな気の利いた製品があるのですね!(USB3.0はZero2にはオーバースペックですが)。うちには3.5mmのDC5V電源は余っているので、USB電源の代わりにも使えそうです。
2024.04.17(水) #2
- あっきぃさんによる分かりやすい記事(RasPi5の記事):
- あっきぃさんの日記(Raspberry Pi のレビューがたくさんある):
2024.04.17(水) #3
- とりあえずやってみたいなと思っていること: Zero2WにPicoをUSB接続したい。・・・いや、本来はこんなの不必要で、Zero2Wにピンヘッダを付けるべきなのですが、なんかこうこういう無駄なことを試すのが私は好きなのです。
- LinuxでUSB-COMにデータを送る方法も勉強したいです。
2024.04.18(木) #1
- 「Zero2Wが早く来ないかなー」なんて思いながら予習しています。実際に試したわけじゃないのでよくわからないけど、Raspberry Pi OS には結構な選択肢がありそうな感じです。
- bookworm(最新版のコードネーム?)
- bullseye(ひとつ前のバージョン?)
- Bustar(ふたつ前のバージョン?)
- このコードネームは、ベースになっているDebianのコードネームに対応しているようです。
2024.04.18(木) #2
- Zero2Wでbookwormを使った場合、X11+Openbox WMが起動するらしいのですが、このOpenboxというのは何かなと思ったら、「軽量なデスクトップ環境」として有名なものの一つのようです。それはありがたい!
2024.04.18(木) #3
- Zero2Wが来たらその日のうちにやってみたいこと:
- gccでもclangでもどっちでもいいけど、hello, worldしてみたい。そしてリンカオプションを工夫して小さくしたい。UPXが使えるなら使ってみたい!(Windowsでは使わせてもらえなくなって久しいので)。
- これがすごくいい感じだったら、制約の多いWindowsからはしばらく遠ざかってしまうかも・・・って思ったけど、小学生向けのプログラミング環境を考えたらやっぱりWindowsも併用するかな。
2024.04.18(木) #4
- あっきぃ先生に、「Dillo」という軽量ブラウザを教えてもらいました。どんなものかと思って調べてみたら、以下のページを発見。
- これはおもしろそう!いつか試してみたい!!
2024.04.18(木) #5
- 以下のサイトから、 Raspberry Pi Imager をダウンロード。
- あえてZero2を選択せずに、64bit版のbookwormを選択。
- microSDに書き込めたら、Zero2Wにセットしてケースを閉めて、完成。
- すんなり起動しました!
- mini-HDMIがケース越しだとうまく差し込めないという問題は生じましたが、一度ケースをあけて、基板の位置を微調整してから再度ねじ止めしたら、いつでもうまく差し込めるようになりました。
- gccは入っていたけどclangは入っていませんでした。じゃあgccでやっていくことにします。
2024.04.19(金) #1
- bookwormは基本的な操作は快適に動くものの、OSのupdateをしようとすると途中で固まってしまいます。これはまずいです。ということで、スワップファイルを大きくします。私はとりあえずサイズを2048にしました。
- 私の信条からすると、本当はスワップファイルは増やしたくなくて512MBのメモリの中だけで暮らしたいのですが(microSDの寿命が心配)、さすがにOSのアップデートができないのはまずいと思ったので、ここは妥協することにしました。まあOSのアップデートはそれ程高頻度ではないだろうし・・・。
2024.04.19(金) #2
- スワップファイルのサイズを2048にしたら、VLCメディアプレイヤーで.mp4ファイルを再生できるようになりました。すごい!(フルスクリーンでも動きますが、なんとなくコマ落ちしている気もするので、ちょっと小さいサイズにするのがよさそうです。)
- スワップファイルのサイズがデフォルトの100だったときは、ビデオOFFにしてサウンドオンリーにしないとまともに動きませんでした。
- (怖いもの見たさで)Chromiumを起動してこのwikiを見てみました。・・・おお、見える!・・・だけど遅い。本当に遅い・・・。
- 軽量ブラウザのDilloも試してみます。これは標準メニューに入っていないので、「実行」を選んで、「dillo」と入力しています。・・・うおー速い。なんだこれは!
- うーん、Dilloは本当に快適ですね! このwikiを見る分には全く問題ないです。
- と、ここで、そういえば日本語入力ができないことに気づきました(今まで気づかなかった!)。以下を読んでやってみます。・・・無事にできましたー!(私はiBus+Mozcでやっています)。
2024.04.20(土) #1
- Zero2Wを使うたびにHDMIディスプレイのある所に移動しなきゃいけないのが面倒になってきたので、ビデオキャプチャーを買いました。これでノートPCの画面にZero2Wの画面を出せるようになるはず。
- つまり、ノートPC=Zero2Wのための移動式ディスプレイ!
2024.04.21(日) #1
- ビデオキャプチャーが届きました。ノートPCをディスプレイ代わりにできてとても便利です。これでZero2Wでの作業がはかどります!
2024.04.22(月) #1
- とりあえず以下のプログラムでウィンドウを表示できることがわかりました。Windowsよりも簡単で助かっています。
#include <X11/Xlib.h>
#include <stdio.h>
int main()
{
Display *dis = XOpenDisplay(NULL);
Window win = XCreateSimpleWindow(dis, RootWindow(dis, 0), 100, 100, 256, 256, 4, 0xffffff, 0x000000);
XMapWindow(dis, win);
XFlush(dis);
getchar();
XDestroyWindow(dis, win);
XCloseDisplay(dis);
return 0;
}
- コンパイルするときは、以下のようにしたらできました。
gcc -O3 test.c -lX11
2024.04.25(木) #1
- 数日間くらい格闘して、メモリ上に構築したVRAMイメージをXPutImageで表示できるようになりました!すごく楽しいです!
#include <X11/Xlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
int main()
{
Display *dis = XOpenDisplay(NULL);
Window win = XCreateSimpleWindow(dis, RootWindow(dis, 0), 100, 100, 256, 256, 4, 0xffffff, 0);
XSetWindowAttributes att[1]; att->backing_store = WhenMapped;
XChangeWindowAttributes(dis, win, CWBackingStore, att);
XSelectInput(dis, win, ExposureMask);
XMapWindow(dis, win);
XFlush(dis);
XEvent ev[1];
do { XNextEvent(dis, ev); } while (ev->type != Expose);
// printf("depth=%d\n", DefaultDepth(dis, DefaultScreen(dis))); // 24 !!
XImage img[1];
int32_t *buf = malloc(256 * 256 * 4);
img->format = ZPixmap;
img->data = (char *)buf;
img->width = 256;
img->height = 256;
img->xoffset = 0;
img->byte_order = LSBFirst;
img->bitmap_bit_order = LSBFirst;
img->bits_per_pixel = 32;
img->bytes_per_line = 256 * 4;
img->bitmap_unit = 32;
img->bitmap_pad = 32;
img->depth = DefaultDepth(dis, DefaultScreen(dis));
GC gc = XCreateGC(dis, DefaultRootWindow(dis), 0, 0);
XSetGraphicsExposures(dis, gc, False);
int x, y, c = 0;
for (y = 0; y < 256; y++) { // r
for (x = 0; x < 256; x++) { // g
buf[x + y * 256] = c;
c += 0x100;
}
}
XPutImage(dis, win, gc, img, 0, 0, 0, 0, 256, 256);
XFlush(dis);
getchar();
XDestroyWindow(dis, win);
XCloseDisplay(dis);
return 0;
}

2024.04.26(金) #1
こめんと欄