Raspberry Pi・Arduino・電子工作

2021年6月 6日 (日)

Raspberry Pi 4でmediapipeを動かしてみた

今年の1月に、姿勢推定の仕組みである「mediapipe」を使って遊んでみました。

高精度な手足、身体の姿勢推定API「MediaPipe」を使って体の姿勢を数値化させてみる: EeePCの軌跡

が、ちょっと思うところがあり、Raspberry Pi 4で動かせないかと調べていると、そのやり方が出てきました。

と、いうわけで、そのプロセスをまとめておきます。

なお、Raspberry Pi 4上でmediapipeを動かすにはOSを64ビット版にする必要があり、Raspberry Pi OSの64ビット版か、Ubuntu辺りをインストールする必要があります。

ここでは、64ビット版Raspberry Pi OSを入れます。

まず、下記サイトにアクセスします。

Index of /raspios_arm64/images

Raspi6400

あまり新しいバージョンはだめらしいので、ここでは「2020-08-24」を選びました。

ゲットしたいバージョンのフォルダーをクリックすると、その中に一つ「zip」の拡張子のがあるので、それをダウンロード。

で、その圧縮ファイルを展開すると、なかからimgファイルが出てきます。

続いて、下記のサイトから、Raspberry Pi Imagerをダウンロードしておきます。

Raspberry Pi OS – Raspberry Pi

ちょっと下の方に「Download for Windows」というのがあるので、それをクリックすると、Raspberry Pi Imagerが得られます。

インストーラーがあるので、それをインストールし、起動。

「CHOOSE OS」をクリックすると、こんな選択画面が出ますが、

Raspi6401

これをずっと下までスクロールし、一番下にある「Use custom」を選択。

Raspi6402

するとファイル選択画面が出てくるので、先ほどダウンロードしたイメージファイルを選択します。

Raspi6403

で、StrageはSDHC CARDを選択するんですが、

Img_0434

一度、痛い目にあってますからね。またUSB HDDを消されないように、抜いておきました。

Raspi6404

ドキドキしながら、書き込みを待ちます。

Raspi6405

無事、終了しました。

Img_0436

で、これを8インチのアナログディスプレイにつないで起動。

5インチのやつでは、画面表示しませんでした。仕方なく、最初は8インチで。

最初に、パスワードの設定や言語選択、Wi-Fiの設定などをした後、解像度も一番低いやつに変えておきました。

で、リブートすると、いよいよmediapipeのインストールです。

やり方は、以下のサイトを参照。

GitHub - PINTO0309/mediapipe-bin: MediaPipe Python Wheel installer for RaspberryPi OS aarch64, Ubuntu aarch64, Debian aarch64 and Jetson Nano.

ここの「2.Install」の項目から忠実に実行しました。

あ、Installには2つの項目があって、Raspberry Pi OS 64bit BrusterとUbuntu 20.04 aarch64がありますが、ここでは64bit Brusterの方を実行。

で、「3.Sample」にある通り、サンプルコードをgitで入手し、「python3 sample_hand.py」を実行。

Img_0437

動きました。先のページにある通り、だいたい8fpsくらいで動きますね。

Img_0438

ちなみに、「python3 sample_pose.py」を動かすと、上のように身体の骨格推定も動きます。こちらは、だいたい5fpsくらいでした。

まあまあの速度ですね。Raspberry Piであることを思えば、悪くありません。

Img_0439

せっかくなんで、5インチの方でも動かしてみました。

ちょっと狭いですが、かなりコンパクトになりました。ただ、なぜかWi-Fiが動きません。電力不足か?

これのよくある使い方ですが、これを工場や作業場に持ち込んで、細かい作業姿勢や手の動きを分析させてみたいなぁと思ってます。

そうなると、小型のRaspberry Piが便利なんですよね。

ただ、実際の動きと画像が1秒ほどずれるのが気がかり。ちゃんと推定できているので、問題はないんですが、画面を見ながら動くとちょっと戸惑いそうです。

Raspberry Pi 3B+ばかり使ってて、しばらく4の方はほったらかしでしたが、これを機にRaspberry Pi 4も使ってみましょうかね。

2021年5月 8日 (土)

ダイソーのBluetoothスピーカーとmicroHDMI変換コネクター買ってみた

ダイソーネタも、久々ですね。よく利用はしているんですが、あまりこちらのネタになるものはないので。

Img_0372

購入したのはこちら、HDMI→microHDMI変換ケーブルと、Bluetoothスピーカー。

なお、スピーカーの方は550円(税込み)です。

Img_0373

なんとなく、スピーカーの方が気になるので、こっちからレビュー。

Img_0374

裏面はこの通り、スイッチに、充電用microUSBコネクター、メディア用のmicroSDスロットとUSBコネクター。

Img_0375

上面は、こんな感じに4つのスイッチが搭載。

Img_0385

ぺらっとした説明書を見ると、こんな感じです。「M」はメディアの切り替えボタンで、プラスとマイナスは音量や曲送り、逆くの字のボタンは再生です。音量以外は、直接メディアを挿したときに機能するやつですね。

Img_4446

Bluetoothスピーカーなので、iPhone辺りと接続してみました。

ちょっとぼやぁ……とした音ですね。まあ、500円ですから。

ガンガン聞くには物足りないですが、動画の音くらいならこれでもOKではないかと。

ところで、説明書には「電話に出る」というのがあったのですが、マイクはなさそうです。スピーカーのみ。

ところで、結構前に買った、Anker製Bluetoothスピーカーですが。

 AnkerのBluetoothスピーカー”Anker SoundCore mini”購入: EeePCの軌跡

今、これはどうなっているのかというと、実は会社に置いてあります。

というのも、突発的に入ったリモート会議(Zoom、Teams)の時にこれ、とても便利なんです。

一応、マイクがついており、2、3人程度なら声もちゃんと拾ってくれるので、重宝してます。しかも、USBではなくてイヤホンジャックで接続できるのが手軽さの理由。

もっといいリモート会議用のスピーカーはもちろん職場にもあるんですが、わりと取り合い気味。そんなわけで、これを会社に持ち込んでいるんです。

もちろん、メーカーの使用想定外です。おすすめはしませんが。

で、話をこっちのBluetoothスピーカーに戻すと、これが手元にないので、ちょっと不便。iPhoneのスピーカーではちょっと聞きづらいというのもあって、これを買った次第です。

てことで、Bluetoothスピーカーとして使えればいいので、機能上は問題ないのですが、メディアもちょっと試してみました。

Img_0386

使ったのは、この3種類。容量がバラバラですが、microSDが32GBと256GB、USBが128GBです。

これらの中に、iTunesで買った音楽(.m4a)と、普通の音声ファイル(.mp3)を入れて再生。

Img_0387

microSDはこんな感じに、端子側を上向きにしてから挿入。カチッとはめます。

Img_0388

USBの方は、身もふたもないですね。

なお、メディアを挿した状態で電源を入れると、Bluetoothではなく、メディアモードで起動し、いきなり中の音楽を再生し始めます。

といっても、.mp3はいけましたが、.m4aはダメでした。

なお、256GBのmicroSDでもOK。先ほどの3種類、全て読めます。

さて続いて、microHDMIコネクターの方です。

Img_0380

これを買った理由はこいつ。Raspberry Pi 4です。

こいつのコネクターが標準HDMIではないので、ちょっと不便なことに。

以前、こいつ用に買った5インチモニターに変換ケーブルがあったはずなのですが、どこかに行ってしまいまして……

でもまあ、もはや国民一人に一台のRaspberry Pi(!?)ですから、こういうものもダイソーで売られるのが当然かと。

Img_0378

さっそく、使ってみます。

Img_0376

使うのはこのモニター。以前、うちのX1用に買った8インチのVGAモニター、LCD-8000Vです。

 自作デジタル8ピン-VGA変換ケーブル+Century LCD-8000Vでシャープ X1F起動成功!: EeePCの軌跡

デスクトップ機ではなくなったため、Raspberry Pi用のモニターって今、これを使うしかないんですよね。わざわざ23インチを出すのは面倒です。

Img_0377

こいつに、HDMI→VGA変換コネクターをつけて、その先にmicroHDMI変換コネクターをつけます。

大丈夫かな、そんなにつけて。

Img_0384

なお、コネクターの形状が広いため、HDMI0にはUSB-Cケーブルと干渉するため挿さらず。

仕方なく、HDMI1に挿します。

Img_0381

さっそく、電源オン。

なんだか、特に赤色が怪しげ。

Img_0382

ですが、無事に起動。

800×480という解像度ですが、起動しました。

Img_0383

変換コネクターを挟み過ぎたため、ちょっと文字が読みにくいですね。

が、許容範囲。ターミナル画面だともうちょっと見えるので、これなら問題なく使えます。

久しぶりにダイソーにてデジタルガジェットを購入しました。

ららぽーとにある3Coinsが便利で、そちらをよく使ってましたが、ダイソーもなかなかです。目が離せませんね。

Anker Soundcore mini (コンパクト Bluetoothスピーカー)【15時間連続再生 / 内蔵マイク搭載/microSDカード & FMラジオ対応】(ブラック)

2021年5月 6日 (木)

Raspberry Piでピザ窯の温度制御

秋葉原に現れたピザ屋台で、Raspberry Piを用いたピザ窯の温度制御をやっているという記事を発見。

ラズパイでピザ窯制御——秋葉原にIoTピザ屋台「おとめし」が登場 | fabcross

これによれば、このピザ屋台「おとめし」では、Raspberry Piを用いてこのピザ窯の温度制御を行っているとのこと。

焼くのは、直径20cm程度の、一人で食べきれるサイズのピザ。これを、窯内2か所の熱電対で計測した温度をもとに、Raspberry Piにて窯の温度を制御しているようです。

いずれは、音声対応、ベルトコンベヤーのオートメーション化などを考えているとのこと。

なお、単なるピザ屋台ではなく、電子工作の普及にも貢献しようと考えているようで、実際にここのRaspberry Piの回路はむき出しで公開されている模様です。なかなか、秋葉原らしいです。

ただ……とても素晴らしい屋台なのですが、非常に細かい突っ込みが一つ。

それは、この仕組みそのものを「IoT」と称しているのですが、見る限り、IoT要素が全然ないんです。

IoTとは、「Internet of Things」、つまり、モノのインターネットという意味。ですが、これがネットに接続されている雰囲気が全然ない。

電子工作としては、素晴らしいです。なにせこの熱い窯と、熱に弱いコンピューターボードとの組み合わせを実現しているんですから。

それゆえに、IoTという言葉への違和感がちょっと……いや、ほんとに細かい話なんですけどね。

もしかすると、温度制御の情報が逐一ネット上で公開されていたり、あるいはRaspberry Piはエッジ側で、クラウド上に温度制御のコードが置かれていて、そこに送信して制御してるってことなのかもしれませんが。

Raspberry Piを使ったこの手の応用の話は、なかなかユニークなものが多くて面白いですよね。こちらもそろそろ何か、考えたいものです。

LABISTS Raspberry Pi 4 4GB キット(技適マーク入)MicroSDHCカード32G/Raspbianシステムプリインストール/カードリーダ /5.1V/3A Type-C スイッチ付電源/MicroHDMI-to-HDMIケーブルライン/三つヒートシンク/簡単に取り付けケース/日本語取扱説明書(4GB RAM)

2021年3月14日 (日)

Keyestudio CCS811という二酸化炭素濃度センサーを使ってみた

今、まさにコロナ禍です。

このため職場では、部屋の換気をよくやります。

が、気温がまだ低い時期でもあるので、換気が終わればすぐに閉めたいところ。

その換気の目安に、この二酸化炭素濃度センサーが使えそうという話を聞いたので、さっそく買ってみました。

Img_0283

Keyestudio CCS811搭載のKS0457というセンサーです。

Amazonで1499円。ほかにもっと安いのがあったんですけど、Primeマーク付きじゃないところからはなるべく買わないようにしたら、これが最安値でした。

Img_0284

本当はRaspberry Piで使いたかったんですが、I2Cながらやや特殊な接続の仕方(通常のI2Cなら4本で済むところが、5本接続)だったので、Arduinoに接続して使用することに。

で、あとは下記のサイトに従って、使えるようにします。

 [電子工作]Arduinoで二酸化炭素濃度測定器を作ってみた(Vol.1)|ホッタ|note

まず、Arudinoとこのセンサーを接続。メス-メスのジャンパー線で、それぞれ

  センサー  …  Arduino

・GND …  GND

・VCC  …  5V

・SDA  …  A4

・SCL  …  A5

・WAKE  …  GND

に接続します。

続いて、メーカーの提供するコードとライブラリを以下からダウンロード。

Dropbox - KS0457 keyestudio CCS811 Carbon Dioxide Air Quality Sensor - 日常をシンプルに

得られたZipファイルを展開し、ライブラリフォルダにある「CCS811」というフォルダを丸ごとArduinoIDEのライブラリ用フォルダ(たいていはドキュメントの中の「Arduino」-「libraries」というフォルダ)に入れます。

で、ArduinoIDEを開き、以下のコードをコンパイルします。


#include <CCS811.h>

/*
 * IIC address default 0x5A, the address becomes 0x5B if the ADDR_SEL is soldered.
 */
//CCS811 sensor(&Wire, /*IIC_ADDRESS=*/0x5A);
CCS811 sensor;

void setup(void)
{
    Serial.begin(115200);
    /*Wait for the chip to be initialized completely, and then exit*/
    while(sensor.begin() != 0){
        Serial.println("failed to init chip, please check if the chip connection is fine");
        delay(1000);
    }
    /**
     * @brief Set measurement cycle
     * @param cycle:in typedef enum{
     *                  eClosed,      //Idle (Measurements are disabled in this mode)
     *                  eCycle_1s,    //Constant power mode, IAQ measurement every second
     *                  eCycle_10s,   //Pulse heating mode IAQ measurement every 10 seconds
     *                  eCycle_60s,   //Low power pulse heating mode IAQ measurement every 60 seconds
     *                  eCycle_250ms  //Constant power mode, sensor measurement every 250ms
     *                  }eCycle_t;
     */
    sensor.setMeasCycle(sensor.eCycle_250ms);
}
void loop() {
  delay(1000);
    if(sensor.checkDataReady() == true){
        //Serial.print("CO2: ");
        Serial.println(sensor.getCO2PPM());
        //Serial.print(" ppm, TVOC: ");
        //Serial.print(sensor.getTVOCPPB());
        //Serial.println(" ppb");
        
    } else {
        Serial.println("Data is not ready!");
    }
    /*!
     * @brief Set baseline
     * @param get from getBaseline.ino
     */
    sensor.writeBaseLine(0x847B);
    //delay cannot be less than measurement cycle
    //delay(1000);
}

実は元コードはCO2濃度とTVOC(総揮発性有機化合物濃度)の2種類を出力できるようになってますが、二酸化炭素濃度値しかいらないので、コメントアウトしてます。

これをArduinoIDEでArduinoに流し込んでおきます。

一方、Raspberry Pi側には、以下のコードを入れます。

co2sens_ar.py


import serial
import datetime

ser = serial.Serial('/dev/ttyACM0'115200)
date_file = datetime.datetime.now()

while True:
    with open("/home/pi/co2_{0:%Y%m%d%H%M%S}.csv".format(date_file),"a"as f:
        now = datetime.datetime.now()
        String_data = ser.readline().decode('utf-8').rstrip()
        print(now," , ",String_data)
        print(now," , ",String_data, file=f)
        f.flush()

ser.close()

シリアルポート(USB)から値を読むだけなので、簡単なコードです。

なお、二酸化炭素濃度値の前に日付・時刻をつけるようにしてます。

これを使う前に、「pip3 install pyserial」を実行しておいてください。

Img_0285

あとはRaspberry PiのUSBにArduinoを接続し、上の「co2sens_ar.py」を実行します。

> python3 co2sens_ar.py

すると、以下のようにターミナル上に日付と二酸化炭素濃度が表示されるはずです。

Co2sens01

※上はWindowsのTeraterm上

なお、このセンサーの下限値は400ppmだそうです。つまり、400ppm以下は測定不可。

実はこれを一晩ほど動かしてみましたが。

Co2sens02

新室内の二酸化炭素濃度が2260ほどまで上昇。

えっ!?ちょっと待って、これほんと!?

ちなみに、労働衛生上の基準値は1000ppm以下です。これを倍ほど上回る値をたたき出してます。

が、ここで外からRaspberry Piにアクセスできなくなってしまったため、一旦、Raspberry Piを再起動して、もう一度値を取り直してみたら……

なぜかですね……400ppmからスタートしました。

それから何度かプログラムを起動してみたんですが、どうやらこれRaspberry PiのコードがArduinoにシリアル接続するたびに「400ppm」からスタートしてるみたいです。

ううん、なんか怪しいなぁ……

でも、息を吹きかけると一時的に1000ppm程度まで上昇し、その後は下がるという挙動を示すため、確かに二酸化炭素の濃度を即手はしているような気がします。

プログラムコードを読むと、Arduino側はシリアル接続したときに値を出力している節があります。つまり、シリアル接続するまではLEDがちかちかしているものの、値を取得していなさそう……ていう理解で、いいのかな?

まあ、ともかく、換気の目安として使えるかどうかが問題。二酸化炭素濃度を正確に測定することは、今回の狙いではないので。

ということで一度、部屋を閉め切ってしばらく二酸化炭素濃度を上昇させたのちに、部屋の窓を開けて一気に換気して、値がどう動くかを調べてみました。

Img_0286

1時間ほど寝そべって過ごした後、こんな勢いで部屋の窓を開けました。ちょっと雨が降り気味な日でしたが、構わず開けてます。

で、その時のグラフが以下。

Co2sens03

ちょうどかくっと下がっているところがありますが、そこが換気した時間。

一気に二酸化炭素濃度は400程度まで下がるんですが……なぜかですね、2度ほど900ppmまで上昇しました。

何なのでしょう?ノイズでしょうか、それとも私の息でも降りかかったのか、あるいは外の排気ガスか何かでも拾ったんでしょうか……?

なんだかこのセンサー、ちょっと怪しい。

と思ったら、スイッチサイエンスのこんな記事を発見。

空気品質を測定し、記録する - AmbientでIoTをはじめよう

これを読むと、どうやらCSS811ってセンサーは、エージング(慣らし運転)というのをやらないといけない。

おまけに最初の20分は不安定らしいので、開始から20分の値はあてにしちゃだめだということのようです。

なんてこった……ということで、まず48時間のエージングというのを実施。

あまり意味はないですが、その48時間(正確には48時間と28分)の変化をグラフ化してみると、こんな感じに。

 

Ccs811_04

※ データが多すぎるので、ここだけGoogleスプレッドシートを使ってます

分かりにくいですが、最大6000ppm近くまで上昇してます。

労働安全衛生法での事務所の基準値は5000ppm以下(空調設備により調整可能ならば、1000ppm以下)とされているので、それを上回る値が出てますが……ただ、その時間が昼間の15時半ごろで、これを設置した部屋には誰もいないはずの時間。ちょっと怪しいです。

まあ、ともかく48時間のエージングを終えたので、測定を再開してみた。

Ccs811_03

30分ほど経過し、安定しているはずの時間での値は、大体600くらいになりました。

で、そのまま一晩動かした結果

Co220210312

こんな感じです。安定してますね。

ただ、逆に言うと安定しすぎ。

部屋を閉め切っているので、もうちょっと濃度が上昇してもおかしくはないかなぁと思うのですが。

とまあ、信用してよいのか悪いのか、よく分からないセンサーですね。

しばらく、様子見です。


KEYESTUDIO DC 5V CCS811 CO2 二酸化炭素 TVOC 大気質 センサー モジュール for Arduino アルドゥイーノ アルディーノ 電子工作

2021年3月 3日 (水)

4つのカメラを取り付け可能にするアダプタ「Raspberry Pi用マルチカメラアダプタ」

こんな製品があるとは、つい最近まで知りませんでしたね。

Raspberry Pi用マルチカメラアダプタ V2.2 - スイッチサイエンス

Raspberry Pi用マルチカメラアダプタという製品。バージョンが2.2ということは、既に存在していた製品だったようです。

要するに、4つのPiCameraを取り付け可能なHAT基板です。ただし、4つ同時にカメラが使えるというわけではないようです。あくまでも切り替えが可能というだけらしいですね。

使い方としては、標準、望遠、広角、赤外線を切り替える等でしょうか。あるいは前後左右をタイミングで切り替えて監視するという用途ならいけそう。たいしてケーブル長さがないカメラなので、視点切り替えとして使うには難がありそう。

無茶は承知で言いますが、同時使用が可能なら面白い画像が撮れそうですね。2眼カメラによる深度推定ができれば、色々使えそうなんですが、残念ながら同時に一つです。

こんな感じのRaspberry Pi関連の隠れた珍製品が、まだあるかもしれませんね。注意せねば。

LABISTS Raspberry Pi カメラモジュール V2 ソニーIMX219PQ CMOS画像センサ 8メガピクセル 4B、3B 、3B、2Bに対応可能

2021年2月27日 (土)

Raspberry Pi × 画像認識 で「後出しじゃんけん機」作ってみた

久しぶりの、Raspberry Piネタです。

今日は、どちらかというと「教育用」なネタです。

Raspberry Piと画像認識を応用した「後出しじゃんけん機」なるものを作ってみました。

なんじゃそら?という名前ですが、簡単に言うと、

(1) グー、チョキ、パー をラズパイカメラで撮影して記録 (各30枚づつくらい)

(2) 上の写真を用いて深層学習(CNN)を実施

(3) できたモデルを使い、カメラで撮影した「手」を推論する

(4) 推論結果に対し、勝つ手の画像を表示する

……という、Raspberry Piを使った一種のAIです。

これ、要するに、身近なもので画像認識AIを体感しよう!って趣旨の工作&プログラムです。

通常なら、Raspberry PiとPCを組み合わせるところですが、この両者の行き来が煩わしいので、学習用のデータ取りから学習、そして推論までを、すべてRaspberry Pi上でできるようにしてます。

まず、準備ですが、以下の3つのコードをコピペして持って行ってください。

「1_camera.py」


import glob
import time
import os
import io

# for Raspberry Pi
import RPi.GPIO as GPIO
import picamera

GPIO.cleanup()

#for Raspberry Pi
GPIO.setmode(GPIO.BCM)
port1 = 17 # gu
port2 = 27 # choki
port3 = 22 # pa

GPIO.setup(port1, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(port2, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(port3, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

count = 1
flag = 0

# File remove
file_list = glob.glob('./data/0_gu/*')
for file in file_list:
    os.remove(file)
file_list = glob.glob('./1_choki/*')
for file in file_list:
    os.remove(file)
file_list = glob.glob('./data/2_pa/*')
for file in file_list:
    os.remove(file)

print('Ready!')

try:
    while True:
        sc = str(count)
        ssc = sc.zfill(4)
        #GPIOの17,27,22がオンになったら、画像を取り込んで認識を開始
        if GPIO.input(port1):
            label = '0_gu'
            flag = 1
        elif GPIO.input(port2):
            label = '1_choki'
            flag = 1
        elif GPIO.input(port3):
            label = '2_pa'
            flag = 1
            
        if flag ==1 :
            print(ssc + ':' + label)
            with picamera.PiCamera() as camera:
                    camera.resolution = (12896)
                    camera.start_preview()
                    camera.capture('./data/'+label+'/'+label+ssc+'.jpg')
            count +=1
            flag = 0

        time.sleep(0.01)

except KeyboardInterrupt:
    GPIO.cleanup()

「2_train.py」


#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import sys
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt

import keras
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense,Dropout,Flatten
from keras.layers import Conv2D,MaxPooling2D
from keras.preprocessing.image import array_to_img,img_to_array,load_img
from keras import backend as K
from sklearn.model_selection import train_test_split
from keras.models import load_model
from keras.callbacks import ModelCheckpoint

# ======= hypter param =====
batch_size = 10
epochs = 50
# ==========================

path=os.getcwd()+'/data/'

class_count = 0
folder_list=os.listdir(path)

for folder in folder_list:

  class_count = class_count+1

NUM_CLASSES = class_count
IMAGE_SIZE = 28

# Loss
def plot_history_loss(fit):
    # Plot the loss in the history
    axL.plot(fit.history['loss'],label="loss for training")
    axL.plot(fit.history['val_loss'],label="loss for validation")
    axL.set_title('model loss')
    axL.set_xlabel('epoch')
    axL.set_ylabel('loss')
    axL.legend(bbox_to_anchor=(10), loc='lower right'borderaxespad=1fontsize=10)

# Accurascy
def plot_history_acc(fit):
    # Plot the loss in the history
    axR.plot(fit.history['acc'],label="loss for training")
    axR.plot(fit.history['val_acc'],label="loss for validation")
    axR.set_title('model accuracy')
    axR.set_xlabel('epoch')
    axR.set_ylabel('accuracy')
    axR.legend(bbox_to_anchor=(11), loc='upper right'borderaxespad=1fontsize=10)

if __name__ == '__main__':

    count=0
    folder_list = sorted(os.listdir(path))

    train_image = []
    train_label = []
    test_image = []
    test_label = []
    X = []
    Y = []

    label = 'label.txt'
    
    f = open(label, 'w')
    for folder in folder_list:
        subfolder = os.path.join(path,folder)
        file_list = sorted(os.listdir(subfolder))

        filemax = 0

        i = 0

        for file in file_list:

            i = i + 1

            img = img_to_array(load_img('./data/' + folder + '/' + file,target_size=(28,28)))
            X.append(img)
            Y.append(count)
        
        label_name = folder + ' ' + str(count) + '\n'
        f.write(label_name)

        count +=1

    X = np.asarray(X)
    Y = np.asarray(Y)
    X = X.astype('float32')
    X = X / 255.0

    Y = np_utils.to_categorical(Y, NUM_CLASSES)

    train_image, test_image, train_label, test_label = train_test_split(X,Y,test_size=0.20)
    
    f.close()
    print(u'画像読み込み終了')

    input_shape = (IMAGE_SIZE, IMAGE_SIZE, 3)

    model = Sequential()
    model.add(Conv2D(32,kernel_size=(3,3),
                     activation='relu',
                     padding='same'
                     input_shape=input_shape))
    model.add(MaxPooling2D(pool_size=(2,2)))

    model.add(Conv2D(64, (3,3), activation='relu'padding='same'))
    model.add(MaxPooling2D(pool_size=(2,2)))

    model.add(Flatten())
    model.add(Dense(512activation='relu'))
    model.add(Dropout(0.5))
    model.add(Dense(NUM_CLASSES, activation='softmax'))

    model.compile(loss=keras.losses.categorical_crossentropy,
                  optimizer=keras.optimizers.Adadelta(),
                  metrics=['accuracy']
                  )

    chkpt = './model_28.h5'
    cp_cb = ModelCheckpoint(filepath = chkpt, monitor='val_loss'verbose=1
                            save_best_only=Truemode='auto')

    history = model.fit(train_image, train_label,
              batch_size=batch_size,
              epochs=epochs,
              verbose=1,
              validation_data=(test_image, test_label),
              callbacks=[cp_cb],
              )

    model.summary()

    score = model.evaluate(test_image, test_label, verbose=0)

    fig, (axL, axR) = plt.subplots(ncols=2figsize=(10,4))

    plot_history_loss(history)
    plot_history_acc(history)

    fig.savefig('./loss_acc.png')
    plt.close()

「3_atdashi.py」


#!/usr/bin/env python

import os
import sys
import numpy as np
import tensorflow as tf

import keras
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense,Dropout,Flatten
from keras.layers import Conv2D,MaxPooling2D
from keras.preprocessing.image import array_to_img,img_to_array,load_img
from keras import backend as K
from sklearn.model_selection import train_test_split
from keras.models import load_model
import time

import RPi.GPIO as GPIO
import picamera

i = 0
label_name = []

label = 'label.txt'

f = open(FLAGS.label,'r')
for line in f:
  line = line.rstrip()
  l = line.rstrip()
  label_name.append(l)
  i = i + 1

NUM_CLASSES = i
IMAGE_SIZE = 28

if __name__ == '__main__':
    test_image = []
    
    # model read
    model = load_model('./model_28.h5')
    model.summary()
    
    # for Raspberry Pi

    GPIO.cleanup()

    #for Raspberry Pi
    GPIO.setmode(GPIO.BCM)
    port1 = 24 # switch

    GPIO.setup(port1, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

    print('Ready!')
    try:
        while True:
            if GPIO.input(port1):
                with picamera.PiCamera() as camera:
                    camera.resolution = (12896)
                    camera.start_preview()
                    camera.capture('./tmp.jpg')
                
                img = img_to_array(load_img('./tmp.jpg' , target_size=(28,28)))
                test_image.append(img)
                test_image = np.asarray(test_image)
                test_image = test_image.astype('float32')
                test_image = test_image / 255.0
    
                predictions = model.predict_classes(test_image)
    
                print(label_name[predictions[0]], u'です。')
                
                test_image = []
            
            time.sleep(0.01)

    except KeyboardInterrupt:
        GPIO.cleanup()

事前に、TensorFlow、Keras、numpyなどのライブラリをpip3コマンドで取り込んでおいてください。

(なお、TensorFlowは1.14、kerasは2.2.4 を推奨)

で、Raspberry Piの回路図は以下の通り。4つのタクトスイッチを使います。

Atdasi01

ちょっとわかりにくいですが、各タクトスイッチにつながる線で、黒は「GPIO24」、青は「GPIO17」、黄は「GPIO27」、緑は「GPIO22」、そして赤は「3.3V」につながってます。

あ、Raspberry Pi用のカメラも当然、つないでおきます。

で、先の3つのプログラムコードを、一つのフォルダに入れます。

Atdashi02

また、同じフォルダ内に「data」という名前のフォルダを作り

Atdashi03

その下に、上のような「グー」「チョキ」「パー」に当たる3種類のフォルダを作っておきます。

Img_0159

で、我が家のRaspberry Piで組んでみました。

Img_0164

こんな感じに、4つのタクトスイッチとつないでます。

なお、カメラは5インチ液晶の裏に両面テープで張り付けておきました。

これで、準備完了です。

(1) グー、チョキ、パー をラズパイカメラで撮影して記録 (各30枚づつくらい)

まず、自分の手を使って、「グー」「チョキ」「パー」の手を集めます。

Raspberry Pi上でターミナルを開き、

> python3 1_camera.py

と入力し、実行。

ターミナル上に「Ready!」と表示されたら、準備完了です。撮影を開始します。

Raspberry Piのカメラの前で「グー」「チョキ」「パー」の3種類の手を構えて、先の回路図にあるボタン「グー」「チョキ」「パー」で、手にあったものを選んで押します。

Img_0162

すると以下のような感じに、各フォルダ内に画像がたまっていきます。

Atdashi04

各ラベルごとに、20~30枚づつくらい撮影してください。

なお、合計が100枚を超えると、Raspberry Pi 3B+ではメモリーが飛ぶっぽいです(うちは飛びました)。

(2) 上の写真を用いて深層学習(CNN)を実施

(1)で教師データができたので、学習を実行します。同じフォルダ内で、

> python3 2_train.py

と実行します。

デフォルトでは、50エポックほど流れます。大体5分くらいで終わります。

なお、この50エポック内の最良のモデルのみが保存される仕組みになっているため、学習が終わればそのまま(3)へと移行します。

が、その前に、学習の状況を確認しておきましょう。

作業フォルダー中に、「loss_acc.png」という画像ファイルができているはずです。

Loss_acc

その名の通り、Loss(損失)値とAccuracy(精度)値のグラフが出てきます。Loss値は0に近いほど、Accuracyは1に近いほど、高精度なモデルができている目安になります。

が、よく見るとどちらも2色あります。これは、学習用データでの検証値(Train)と、評価用データでの検証値(Val)となります。

簡単に言うと、上の画像のようにLoss、Accuracy共に、この両者がほぼ同じところに収束していれば、学習としてはまずまずです。

これがTrainとValとが離れていると、いわゆる”過学習”と呼ばれる状態になります。その場合は汎用性が落ちているので、パラメータを変更するなり、(1)からやり直すなりして、再学習する必要が出てきます。

(例えば、batchの値を10→20に変えてみる 等)

単純に、何も変えずにもう一度実行するだけでよくなることもあります。何度実行しても改善されないときのみ、パラメータをいじるか、あるいは写真の撮り直しを実行してみてください。

グラフを確かめてから、(3)へ行きます。

(3) できたモデルを使い、カメラで撮影した「手」を推論する

ここでは、「3_atodashi.py」を使います。

> python3 3_atodashi.py

と実行したのち、

Img_0163

こんな感じに、カメラの前で手を構えます。

もし、写真のようにチョキを出しているときに、プロンプト上で

 > 2_choki

と表示されたら、推論成功です。

グーやパーだと勘違いしていたら、学習に失敗している可能性があります。

(1)か、(2)あたりからやり直してください。

あるいは、手が近すぎる or 遠すぎることもあります。何度か実験した経験での話ですが、ちょっと動かしてみると、精度が上がる距離がどこかにあることが多いです。

さて、画像認識としてはここまでで終了ですが、これではまだ「後出しじゃんけん機」ではありませんね。

(4) 推論結果に対し、勝つ手の画像を表示する

Raspberry Piに後出しじゃんけんをさせるために、「3_atodashi.py」を以下のコードに置き換えます。


#!/usr/bin/env python

import os
import sys
import numpy as np
import tensorflow as tf
import cv2

import keras
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense,Dropout,Flatten
from keras.layers import Conv2D,MaxPooling2D
from keras.preprocessing.image import array_to_img,img_to_array,load_img
from keras import backend as K
from sklearn.model_selection import train_test_split
from keras.models import load_model
import time

import RPi.GPIO as GPIO
import picamera

i = 0
label_name = []

label = 'label.txt'

f = open(label,'r')
for line in f:
  line = line.rstrip()
  l = line.rstrip()
  label_name.append(l)
  i = i + 1

NUM_CLASSES = i
IMAGE_SIZE = 28

if __name__ == '__main__':
    test_image = []
    
    # model read
    model = load_model('model_28.h5')
    model.summary()
    
    # for Raspberry Pi

    GPIO.cleanup()

    #for Raspberry Pi
    GPIO.setmode(GPIO.BCM)
    port1 = 24 # switch

    GPIO.setup(port1, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

    print('Ready!')
    try:
        while True:
            if GPIO.input(port1):
                with picamera.PiCamera() as camera:
                    camera.resolution = (12896)
                    camera.start_preview()
                    camera.capture('./tmp.jpg')
                
                img = img_to_array(load_img('./tmp.jpg' , target_size=(28,28)))
                test_image.append(img)
                test_image = np.asarray(test_image)
                test_image = test_image.astype('float32')
                test_image = test_image / 255.0
    
                predictions = model.predict_classes(test_image)
    
                print(label_name[predictions[0]], u'です。')

                #後出し処理
                if predictions[0] == 0# 「グー」だった時
                    reac = "pa.png" # 「パー」を返す
                elif predictions[0] == 1# 「チョキ」だった時
                    reac = "gu.png" # 「グー」を返す
                else# 残り、すなわち「パー」だった時
                    reac = "choki.png" # 「チョキ」を返す

                img = cv2.imread(reac)
                cv2.imshow("reaction",img)
                key = cv2.waitKey(1000
                cv2.destroyAllWindows()
                
                test_image = []
            
            time.sleep(0.01)

    except KeyboardInterrupt:
        GPIO.cleanup()

「#後出し処理」というコメント行がある後ろ当たりに、その後出しじゃんけんの処理が追加されてます。

また、画像表示にはOpenCVを用いてますので、pip3コマンドでOpenCVをインストールしておいてください。

> pip3 install python-opencv

で、このほかに画像が3枚、つまり、グー、チョキ、パーの画像をそろえる必要があります。

私はいらすとやで落としましたが、なんでもいいです。

Atodashi05

こんな感じに「グー」「チョキ」「パー」それぞれ「gu.png」「choki.png」「pa.png」として、Raspberry Pi上のプログラムコードの入った同じフォルダに入れておいてください。

で、この状態で(3)と同様に動かすと、推論の直後に、Raspberry Piが勝つと思う手を表示してきます。

Img_0205

こんな具合です。

(3)でそこそこの精度が出るモデルであれば、正しい「勝ち手」を出してくれるはずですね。

はい、以上が「後出しじゃんけん機」を作るまで、です。

(2)で使う「Train.py」という学習用コードを読めばわかる通り、28×28の画像で学習、推論させてます。この解像度じゃないと、Raspberry Piでは学習できません。

かなり低い解像度ですが、案外この解像度でも、じゃんけんくらいは認識できるようです。

もっとも、一筋縄ではいかないところもありますね。背景に依存しちゃったり、あるいは過学習で現実の手をうまく認識しなかったり……その辺りは、トライアンドエラーで実験してみるのがよいかと思います。

今回入れてませんが、Grad‐Camを使ったりして、モデルの確からしさを調べるのもいいですね。実際、会社にある同じコードでは、Grad-Camを組み込んでます。

どちらかというと、画像認識の理屈よりも、それを実際に使ってみてノウハウっぽいものを学ぶというのが狙いのプログラムコード。やってみると、思ったよりも精度は出ることもあるし、思い通りにいかないこともあります。

もちろん、ここに書いただけでは不十分な話が多いです。パラメータまで含めたら、一介のブログ記事では書ききれないほどいろいろあります。

このほか、精度におけるカメラと手の距離の依存性が高いので、HC-SR04などの距離センサーと組み合わせて撮影させてみるなど、電子工作の題材にもぴったりですね。

とまあ、我ながらうまい仕掛けを作ったものだと思っていたんですが。

これを作り上げた後に、「人気ブロガーからあげ先生のとにかく楽しいAI自作教室」(日経BP)という本にも、同じようにじゃんけんの手を学習させるというコードがあることが判明。

で、Kindle版で購入してみてみたんですが……あちらはRaspberry Pi上ではなく、しかも画像セットはあらかじめ準備されたものを使用、かつ、Google Colab上で動かすというものでした。いやはや、幸いにもこちらのやってることとは、かぶってませんでしたね。

まあ、似たようなことは皆さん、考えるものですね。

ちなみにこの本、画像だけでなく、自然言語など、幅広いカテゴリーの話が載っていたりと、なかなか面白い本です。買って損はありません。

著者のからあげ氏のブログは、Raspberry Pi関係のコードではとてもお世話になってますね。私もよく、参考にさせてもらってます。

以上、「画像認識を体で覚える」仕組みを作ってみた、というお話でした。


人気ブロガーからあげ先生のとにかく楽しいAI自作教室

2021年1月23日 (土)

550円のラズパイの名を冠するボード「Raspberry Pi Pico」

このところ、Twitter上でもざわざわしている「Raspberry Pi Pico」。お値段が550円とかなり衝撃的な価格が目を引きますが、名前こそRaspberry Piながら、随分と違うボードのようです。

550円のマイコンボード「Raspberry Pi Pico」が登場 - PC Watch

どちらかというと、Arduinoに近いボードでしょうか?ただ、MicroPythonというPythonの一種が動くらしく、そこがArduinoとの大きな違いのようで。なお、C/C++も動作可能。

CPUにはCortex-M0(2コア/133MHz)、メモリーは256kB(MBじゃなくて)、フラッシュメモリーは2MBというかなりミニチュアなコンピュータボードです。

Linuxは動作しないため、なんとなくシングルタスクなボードのようですね。あまり詳しく書かれていないため、よくわかりませんが。

これなら、Raspberry Pi Zero(ver.1.3ならスイッチサイエンスで660円/個)の方が個人的には使い勝手がよさそうですね。比べるのが間違いな気もしますが。

使い道や活用法がもう少し出てみないと、いまいちよく分からないボードというのが正直なところ。でもやっぱり、気にはなりますね。

Raspberry Pi Zero W - ヘッダー ハンダ付け済み - ラズベリー・パイ ゼロ W ワイヤレス

2021年1月10日 (日)

Raspberry Piは壊れやすいのか!?

Raspberry Piというと、壊れやすいというイメージ、ありますね。私自身、起動しなくなるという事態をしょっちゅう経験しております。

ですが、Raspberry Piそのものではなく、単にOSイメージがぶっ壊れて起動しなくなるということであって、どちらかというとSDカードのデータが壊れたという方が正解かなぁと思ってます。

それを、耐久テストで実験してみた人がいます。

Raspberry Piは本当に壊れやすいのか

10000回、電源やUSB、Wi-Fi、LANなどを切ってみたなどというわりと過激めなテストが続きます。

やはり、SDカードイメージが壊れるというのが多いですね。静電気や宇宙線で壊れるのは……まあ、たいていのコンピューターなら普通、壊れますね。

耐久性を上げるには、工業用SDカードをチョイスの上、リードオンリーにして、RAMに書き込むという方式にするのが一番有効だという結論ですね。それはその通りですが、そうは言いつつも私の使い方では書き込みたい事情があって、それができないのが普通。SD以外でもいいので、何か安定した書き込みメディアはないものでしょうかね。


【国内正規代理店品】Raspberry Pi4 ModelB 4GB ラズベリーパイ4 技適対応品【RS・OKdo版】

2020年12月31日 (木)

2020年まとめ

今年も、いろいろありましたね……

何といっても今年は新型コロナ禍の年。コロナで始まり、コロナで終わる。いや未だに、先が見えておりません。だからというわけではありませんが、どちらかというと今年は、私にとってあまりいいことはなかったですね……

このブログにとっては、毎日更新をやめた年でもあります。

とはいえ、やはりまとめができるほどの出来事が満載。今年を振り返ってみます。

【1月】

画像異常検知のデモ機「AIビー玉選別機」を作ってみた: EeePCの軌跡

さて今年は、いきなりRaspberry Pi工作から始まりました。

昨年末に買ったRaspberry Pi 4を使ってますが、結局今年は、Raspberry Pi 3B+をよく使った年でした。

それはともかく、いわゆる画像異常検知にトライしたこの事例。社内でも、使われつつあります。

【2月】

プロジェクター買いました: EeePCの軌跡

2月はせいぜい、これくらいですかねぇ。プロジェクターを買いました。

結論から言うと、ほとんど使ってません。家ではまるで使い道がないですね、これ。

【3月】

このあたりからコロナ禍が猛威を振るい、学校が休みになったり、外出自粛が叫ばれたり、インフラもないのに在宅勤務が推奨されたり……などなど、ストレスマッハな時期がはじまります。

そんな中でも、地道に活動しておりました。

 Raspberry Pi Camera V1.3の「互換カメラ」買ってみた: EeePCの軌跡

ブログが13年目に入る3月9日の記事がこれ。Raspberry Piカメラの互換品を安く手に入れたというお話。

このカメラ自体、今でも使っていて重宝してますが、そんな話題とは裏腹に、しれっとこの記事の最後に「毎日更新をやめます宣言」をしております。

ちょうど12年目のこの日を境に、自身の活動を中心とした記事のみを乗せようと心がけてます。

当ブログをhttps化しました: EeePCの軌跡

さて、このブログもう一つの大きな変化点は「https化」。

あまり意味があるような、ないような変化点ですが、ブラウザによってはかなりうっとおしい警告が出るため、切り替えてみました。

今ではほとんどセキュリティ警告が出なくなっているはずです。

 Ankerのロボット掃除機”Eufy”買ってみた: EeePCの軌跡

こんなものも買いました。

自動掃除機です。2万円以下で、わりと賢い掃除機を入手。週1で2階をせっせと掃除しております。これは良い買い物でした。

おかげさまで、コロナ太りが捗り過ぎて、夏の健康診断に引っかかるというおまけが付いてきましたが。

【4月】

子供の春休みが、終わりません。そんな4月には、こんなものを買ってます。

iPad用トラックパッド・キーボード付きケース買ってMacBookっぽく使えるか試してみた: EeePCの軌跡

結局、ほとんど使ってないのですが、iPad用キーボードです。トラックパッド付。

iPadOS 13がリリースされて、iPadがトラックパッド対応したため購入。

といってもうちにはMacBook Airがあるので、どうしてもそちらにいってしまいます。

使い勝手は、やはりクラムシェル端末には敵いませんね。

小説家になろう 第8回ネット小説大賞 一次選考に2作品が選ばれました: EeePCの軌跡

で、そんなMacBook Airの成果というべきものがこれ。

今年もなんとか1次通過しました。しかも、2作品。相変わらず、2次は全滅しましたが……

来年はもっと、飛躍できないかなぁ。

なお今年はブログ上のネームを、この「小説家になろう」にそろえて「ディープタイピング」としました。Twitterも同じく。ようやく発音可能な名前になりましたね。

特に記事にはしてませんが、この4月頃から会社でZoomをよく使うようになります。今ではすっかりZoom使いです。

【5月】

サーマルセンサー「AMG8833」とRaspberry Piで非接触体温計っぽいものを作ってみた: EeePCの軌跡

コロナ禍ということで、こういうものを作ってみました。

非接触体温計……っぽいもの。頑張れば使えそうなやつです。お値段も5000円ほどと、お手軽なセンサーです。

この記事ですが、このブログの今年のアクセス数トップ記事になっておりますね。

それにしても今年は、久しぶりにRaspberry Piをよく使った年です。

【6月】

6月は、あまり実りのない月でしたね。健康診断に引っかかったことくらいでしょうか?

が、こんな出来事がありました。

Apple ID詐欺……やられかけました……: EeePCの軌跡

Appleっぽい詐欺サイトに誘導されかけました。

特に実害はなさそうでしたが、警戒してすぐにApple IDのパスワードを変更してます。

そういえば周りにも、Facebookを乗っ取られた人がいました。世の中が乱れると、なぜかこういう輩が暗躍するようです。こういう時期、要注意ですね。

【7月】

コロナ禍がややおさまった名古屋 大須へ行って参りました: EeePCの軌跡

すごく久しぶりの大須探訪記です。長男と2人で、行ってきました。

コロナ禍でどうなっていることかと心配でしたが、ここは相変わらずでしたね。

といっても、細かい店がいくつか閉店(または閉店予告)しておりました。大須と言えども、やはり爪痕はあるようです。

長男と共に、大須の雰囲気を満喫した夏でした。

クラムシェル端末風に使えるタッチパッド付iPadキーボードケースを買ってみた: EeePCの軌跡

性懲りもなく、こんなものを購入。

最新版のiPad向けの商品を買ったため、サイズが合いませんが、何とか無理やり使ってレビュー。

使用感は、悪くありませんね。ただし、やはりMacBook Airには敵わず、結局これも使わずじまい。

【8月】

ミラー型ドライブレコーダー購入: EeePCの軌跡

ドライブレコーダーを買いました。

ルームミラーを電子ミラー化 & 後方カメラ付きというもので、今どきの煽り運転対策には最適。

夜でも後方を確認しやすくなりました。これは買いです。

【9月】

Surface Goがようやく実用形態に: EeePCの軌跡

今年はついに、Surfaceを買いました。

やはり、Zoomやらを使っていると、この手の軽くて起動が速い端末が欲しくなります。

スマホ世代には、ピッタリなWindows端末ですね。おすすめです。

ららぽーと東郷へ行ってきました: EeePCの軌跡

一方、うちの近所に馬鹿でかいショッピングモールが誕生です。

50km圏内をカバーする目的で作られたこのショッピングモール、SIMフリーiPhoneが調達できる店が、まさか徒歩圏内にできようとは思ってもいませんでした。

が、私にとってのこのショッピングモール最大のインパクトはヴィレッジヴァンガードが入っていること。

福袋入手は、ここで決まりです。

【10月】

久しぶりにEeePC 1000H-Xを起動してみた: EeePCの軌跡

ふと見つけた32ビットOSの話題につられて、久しぶりにEeePC 1000H-Xを起動してみました。

バッテリーは完全に死んでますが、本体はまだ生きてます。

とはいえ、さすがにもう遅いですね……12年前の、しかも最底辺のPCですからね。

Tensorflow.js + WebGLで顔検出してくれるWebアプリ: EeePCの軌跡

顔検出のWebアプリの紹介です。マスク顔でもこの通り、検出可能。

何気に、私の顔が出ております(ただしマスク付き)。

【11月】

Raspberry Pi + 磁気センサーで ドアの開閉をセンシングしてみた: EeePCの軌跡

ドアセンサー、作ってみました。会社のトイレIoTの要望に応えての工作です。

いかにもRaspberry Piらしい(?)電子工作ですね。

3COINSのBluetoothイヤホン買ってみた: EeePCの軌跡

瞬発的なアクセス数としては、今年一番バズった記事です。

3COINSで買ったBluetoothイヤホン。

1500円という金額にしては、とても使いやすく音質も悪くないです。

もっとも、ノイズキャンセリングがあるわけではないので、外ではそれなりの音質。

おまけに、よく途切れることがあります。室内でも時々、ぶちぶちと切れますね。安定性はいまいち。

でもまあ、1500円ですから、これ。そう思えば妥当かと。

ゲーム&ウォッチ型スーパーマリオ復刻版ゲーム: EeePCの軌跡

ところで、11月はいろいろなものを買った月です。その一つがこれ。スーパーマリオ35周年記念で、ゲーム&ウォッチ型のゲーム機。

ちなみに、スーパーマリオ1の方はクリアしました。

3年ぶりにiPhoneを購入!iPhone 12 グリーンをららぽーと東郷で入手!: EeePCの軌跡

で、今年最高額の買い物は、これ。

iPhone 12です。128GBで、色はグリーン。

これまでiPhone 5c以降、様々なカラバリモデルが出ましたけど、白・黒以外を買ったのはこれが初めてです。

画面サイズも6.1インチと、我が家では最大サイズのiPhone。おかげでとても見やすいです。

【12月】

11月はガジェット購入祭り的な月でしたが、その余波は12月にも残ります。

Amazon Echo Show 5買ってみた: EeePCの軌跡

とうとう買ってしまいました、Amazon Echo show 5。家電リモコンなどはつけてませんが、音楽再生に使ってます。

音声認識は高いですが、Googleに比べると、あまり遊び心がないですね。真面目です。はい。

と、本年のガジェットな買い物はこれで終わるはずだったんですが……

 ドスパラのゲーミングノート「GALLERIA GR1650TGF-T」を購入!: EeePCの軌跡

やっぱり、無理でした。

フィニッシュは、こいつが飾りました。これが今年2番目の買い物(ちなみに3番目はSurface Go)。

ゲーミングノートPCではコスパ最高と謳われたドスパラのGALLERIA GR1650TGF-Tを、メインPCとして購入。

スマホやSurface Goのおかげで起動時間の速さに慣れすぎてしまい、HDDオンリーのデスクトップ機ではやはり使い物にならないことがしばしば。とうとう勢い余って購入。

おかげさまで、すごく快適です。起動も使い勝手もよくなり、机の上も広くなっていいことづくめ。

Ryzenの6コアも、なかなかいいです。

もっと早くこうするべきだったかと。

ただ、その副産物として、Surface Goを使わなくなりましたが……

しかし、これで快適なら、プロセッサ性能の向上ぶりが段違いといわれるM1チップ搭載のMacBookなど手に入れようものなら、どうなることか……次は、Apple Siliconかな?よだれが止まりません。

久しぶりに、PC界隈が活気づいた年ですね。振り返ればiPhoneよりも、こっちの方がインパクト大きいです。

◇◇◇

とまあ、コロナ禍で外出も控えめなこの年でしたが、それでも振り返ると案外、いろいろとありましたね。

個人的には、あまり良い年ではありませんでしたね。ブログにはほとんど書いてませんが、裏ではいろいろトライしては、成果を残せずという事柄が多いです。

うーん、どうしてこうなった……振り返れば、今年はブログ開設以来初めてヴィレッジヴァンガードの福袋を買わなかったからでしょうか?あんなもの(?)にジンクスがあるとは思いたくないのですが……

その反動で、来年はもうちょっと、羽ばたきたいところです。叶うでしょうか、そんな願望。

と、まずは、ヴィレヴァン福袋を買うところからスタートですね。

今年の更新は、これでおしまいとなります。

来年も、よろしくお願いいたします。皆様、よいお年を。

エンスカイ 鬼滅の刃 2021年 カレンダー壁掛け B3サイズ

2020年11月 7日 (土)

キーボード一体型Raspberry Pi 4が2021年に国内発売

キーボード一体型PC。かつては普通だったこのPCは、ノート型PCの普及した現代においてはほぼ皆無な存在。


ですが、Raspberry Pi 4による一体型PCが登場です。


Raspberry Pi 4を組み込んだキーボード型のパソコン「Raspberry Pi 400」が登場。スイッチサイエンスにて2021年以降に販売開始予定。|株式会社144Labのプレスリリース



Raspberry Pi 400というそうです、このPC。欧州、北アメリカ、カナダではすぐに売られるようですが、日本では来年以降となる模様。


その代わり、日本語キーボードへの対応などが行われるようです。


正直言うと、あまりRaspberry Piらしくないモデルですね。Raspberry Piと言えば電子工作な私にとっては、あまりにも綺麗すぎるモデル。


もっともこれ、背面にその40ピンのGPIOがちゃんとつけられています。そういう用途にも利用可能なわけですが。


でもどうせなら、画面くらいはつけてほしいところですね。などと言い出すと、結局ノート型PCになってしまいますね。


以前にも、キーボード一体型PCというのは売り出されましたが、売れたという話はほとんど聞きません。


最近だと、こういうニュースがあったくらい。


Windows 10 Pro搭載のキーボード一体型PCが税込1万円、未開封品が再入荷 (取材中に見つけた○○なもの) - AKIBA PC Hotline!


そこまでやるなら一体型にしてくれということなんでしょうね。


ということで、この一体型Raspberry Pi PC、受け入れられるんでしょうか?


【国内正規代理店品】Raspberry Pi4 ModelB 4GB ラズベリーパイ4 技適対応品【RS・OKdo版】


より以前の記事一覧

当ブログ内検索

スポンサード リンク

ブログ村

無料ブログはココログ