XIAO ESP32C3を使ってみる⑤〜ブラウザからリクエストしてLEDをONOFF

Webサーバーを使ってLEDをON/OFFさせてみる

せっかくのESP32系なので、IoTっぽいことをしてみましょう。
Webサーバーへのリクエストに応じて、LEDを点けたり消したりしてみます。

前回のHelloServerをベースに改造してみます。
リクエストの最後に"/ledon"でLEDを点灯、"/ledoff"でLEDを消灯させてみます。

回路

Lチカ例と同じ"D10"ピンにLEDをつなげるのは前回と同じく。
kana-yaz.hatenablog.jp

https://files.seeedstudio.com/wiki/XIAO_WiFi/pin_map-2.png
Seeedより引用

コード

#include <WiFi.h>
#include <WiFiClient.h>
#include <WebServer.h>
#include <ESPmDNS.h>

#define LED_PIN D10

const char* ssid = "ssid"; //SSIDを指定
const char* password = "password"; //キーを指定

WebServer server(80);

void handleRoot() {
  digitalWrite(LED_PIN, 1);
  server.send(200, "text/plain", "hello from esp32!");
  digitalWrite(LED_PIN, 0);
}

void handleNotFound() {
  digitalWrite(LED_PIN, 1);
  String message = "File Not Found\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET) ? "GET" : "POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  for (uint8_t i = 0; i < server.args(); i++) {
    message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
  }
  server.send(404, "text/plain", message);
  digitalWrite(LED_PIN, 0);
}

void setup(void) {
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, 0);
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.println("");

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  if (MDNS.begin("esp32")) {
    Serial.println("MDNS responder started");
  }

  server.on("/", handleRoot);

  server.on("/inline", []() {
    server.send(200, "text/plain", "this works as well");
  });
  
  server.on("/ledon", []() {
    digitalWrite(LED_PIN, 1); //LEDをONにする
    server.send(200, "text/plain", "LED ON!");
  });

  server.on("/ledoff", []() {
    digitalWrite(LED_PIN, 0); //LEDをOFFにする
    server.send(200, "text/plain", "LED OFF!");
  });

  server.onNotFound(handleNotFound);

  server.begin();
  Serial.println("HTTP server started");
}

void loop(void) {
  server.handleClient();
  delay(2);//allow the cpu to switch to other tasks
}

結果




XIAO ESP32C3を使ってみる④〜HelloServer

XIAO ESP32C3を使ってみる記事。

kana-yaz.hatenablog.jp
kana-yaz.hatenablog.jp
kana-yaz.hatenablog.jp

Webサーバーにしてみる

せっかくのESP32系ですので、まずはWebサーバーにしてみましょう。
ライブラリ標準の"Hello Server"をベースに、ステータスLEDのピン宣言部分だけ変えてみます。

const int led = 13;

int型になっているので

#define LED_PIN D10

#defineにかえておきました

回路

Lチカ例と同じ"D10"ピンにLEDをつなげて…
kana-yaz.hatenablog.jp

https://files.seeedstudio.com/wiki/XIAO_WiFi/pin_map-2.png
Seeedより引用

コード

#include <WiFi.h>
#include <WiFiClient.h>
#include <WebServer.h>
#include <ESPmDNS.h>

#define LED_PIN D10 //サンプルから変更

const char* ssid = "ssid"; //SSIDを指定
const char* password = "password"; //キーを指定

WebServer server(80);

void handleRoot() {
  digitalWrite(LED_PIN, 1);
  server.send(200, "text/plain", "hello from esp32!");
  digitalWrite(LED_PIN, 0);
}

void handleNotFound() {
  digitalWrite(LED_PIN, 1);
  String message = "File Not Found\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET) ? "GET" : "POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  for (uint8_t i = 0; i < server.args(); i++) {
    message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
  }
  server.send(404, "text/plain", message);
  digitalWrite(LED_PIN, 0);
}

void setup(void) {
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, 0);
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.println("");

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  if (MDNS.begin("esp32")) {
    Serial.println("MDNS responder started");
  }

  server.on("/", handleRoot);

  server.on("/inline", []() {
    server.send(200, "text/plain", "this works as well");
  });

  server.onNotFound(handleNotFound);

  server.begin();
  Serial.println("HTTP server started");
}

void loop(void) {
  server.handleClient();
  delay(2);//allow the cpu to switch to other tasks
}

結果

シリアルモニタに出力されたIPを叩いて、表示されたらOkayですね

XIAO ESP32C3を使ってみる③〜PWMでBeep編

XIAO ESP32C3を使ってみる記事。

kana-yaz.hatenablog.jp
kana-yaz.hatenablog.jp

Beep音を鳴らしてみる

予定しているアプリケーションで使いたいので、PWMを使ってBeep音を鳴らしてみます。
従来のESP32だとESP8266Audioと内蔵DACトランジスタあたりの組み合わせをよく使っていたのですが、ESP32C3はDACを内蔵していないですので
、PWMを使ったBeepで簡易に済ませちゃいます。

回路


muRataの圧電サウンダ「PKM13EPYH4000-A0」を使います。
Lチカと同じくD10ピンに雑な感じで接続。

https://files.seeedstudio.com/wiki/XIAO_WiFi/pin_map-2.png
Seeedより引用

コード

#define BUZZ_PIN D0   // ブザーのピン番号
#define BUZZ_CH 0 // ブザーのチャネル番号

#define BEAT 500      // 音の長さ(0.5秒間隔)

void setup() {

  delay(BEAT*4); //ちょっとディレイ
  
  ledcSetup(BUZZ_CH, 12000, 8);     //ledcの初期化
  ledcAttachPin(BUZZ_PIN, BUZZ_CH); //ピンの初期化

  ledcWriteTone(BUZZ_CH, 262); // ド
  delay(BEAT);
  ledcWriteTone(BUZZ_CH, 294); // レ
  delay(BEAT);
  ledcWriteTone(BUZZ_CH, 330); // ミ
  delay(BEAT);
  ledcWriteTone(BUZZ_CH, 349); // ファ
  delay(BEAT);
  ledcWriteTone(BUZZ_CH, 392); // ソ
  delay(BEAT);
  ledcWriteTone(BUZZ_CH, 440); // ラ
  delay(BEAT);
  ledcWriteTone(BUZZ_CH, 494); // シ
  delay(BEAT);
  ledcWriteTone(BUZZ_CH, 523); // ド
  delay(BEAT);
  ledcWriteTone(BUZZ_CH, 587); // レ
  delay(BEAT);
  ledcWriteTone(BUZZ_CH, 659); // ミ
  delay(BEAT);
  ledcWriteTone(BUZZ_CH, 698); // ファ
  delay(BEAT);
  ledcWriteTone(BUZZ_CH, 784); // ソ
  delay(BEAT);
  ledcWriteTone(BUZZ_CH, 880); // ラ
  delay(BEAT);
  ledcWriteTone(BUZZ_CH, 988); // シ
  delay(BEAT);
  ledcWriteTone(BUZZ_CH, 1049); // ド
  delay(BEAT);
  ledcWriteTone(BUZZ_CH, 0);    // 消音
}
void loop()
{
}

結果

ヨシ!

www.youtube.com

XIAO ESP32C3を使ってみる②〜Lチカ編〜

XIAO ESP32C3を使ってみる記事。

kana-yaz.hatenablog.jp

Lチカしてみる

お作法らしいので、Lチカしてみる。
XIAO ESP32C3にはオンボードLEDがありませんので、適当なLEDをつないでみます。

回路

OptoSupplyの"OSBG5111A"をD10に接続。
Vfが3.6V、20mAのLEDなので、制限抵抗なし&ハンダもピンヘッダもなしでやっちゃいました。

https://files.seeedstudio.com/wiki/XIAO_WiFi/pin_map-2.png
Seeedより引用

コード

#define LED_PIN D10 //LEDピン
 
void setup() {
  //ピンの初期化
  pinMode(LED_PIN, OUTPUT);
}
 
void loop() {
    digitalWrite(LED_PIN, HIGH);
    delay(500);
    digitalWrite(LED_PIN, LOW);
    delay(500);
}

結果

ヨシ!

www.youtube.com

XIAO ESP32C3を使ってみる①~紹介と環境構築~

待ってた

Seeed社のXIAO ESP32C3の国内販売が開始されたので、お迎えしてきました。Seeed社の新製品って、発売日数日以内に入手しないとしばらく手に入らないのがつらいんですよね。

wiki.seeedstudio.com

って感じでした。秋月の店頭で無事捕獲。しばらくしたら安定入荷すると思うけど。

これはなに?

  • ESP系のマイコンボード。
  • Wi-FiBluetoothが使える。
  • 安い…概ね1,000円以下?
  • 小さい…20mm x 17.5mm
  • Type-C
  • LiPoの充電回路入り

スペックなど

詳細はココに譲るとして

CPU ESP32-C3 32-bit RISC-V @160MHz
無線 Wi-Fi(2.4G帯),Bluetooth5.0(BLE)
メモリ 400KB SRAM,4MB Flash
センサ なし
インターフェース 1x UART, 1x I2C, 1x I2S, 1x SPI,11x GPIO(PWM), 4x ADC
電源 Type-C,充電回路付

という感じ。待ちに待った「充電回路入りの小さいESP系」ってとこですか。

DACやBUILTIN-LEDがない、といったところはアプリケーションによっては困るかもしれませんが、DACはI2Sでカバーできるでしょうし、BUILTIN-LEDはLチカぐらいしかしないでしょうし…。

比較

似たような子たちと比較してみる。もちろんメインのマイコンチップによる違いはあるので、user-friendliness的な視点での比較。Wi-Fi載ってる云々やメモリ容量とかは抜きで。

一長一短ですけど、今までのXIAOたちでできることは賄えそうな感じ。

ESP32系と比較すると、性能を犠牲&DACがないものの、LiPo充電回路が載ってるのは大きい。

M5 Atom、M5 Atomの中の人、最近よく使ってる充電モジュール、当該と比較してみるとこんな感じ。充電回路を外部付けすると、せっかくの小ささが死んでしまいますよね。

小さいESP他機種と

  有利 不利
v.s. M5 Atom ・LiPoの充電回路
・外装がないので組込やすい
・外部アンテナ
・GROVE端子でサクッと遊べない
DACがない
・汎用ボタンがない
・LEDが載ってない
v.s. STAMP-PICO-Mate ・LiPoの充電回路
・USBシリアルが載っている
・Type-Cから電源をブチ込める
・GROVE端子でサクッと遊べない
DACがない
・汎用ボタンがない
・LEDが載ってない

各種XIAOと

  有利 不利
v.s. XIAO SAMD21 ・LiPo充電
・I2Sがある
・リセットボタンがある
Python使えない
・LED載ってない
v.s. XIAO RP2040 ・LiPo充電
・I2Sがある
Python使えない
・LED載ってない
・USBStorageとして認識されない
v.s. XIAO nRF52840 (Sense) ・I2Sがある
・ボタンが押しやすい(重要)
Python使えない
・PDM/6DOF-IMUが載ってない
・AnalogI/Oが少ない
・LED載ってない

開発環境を作る

Arduino IDEベースで遊びます。

1.[ファイル]→[環境設定]の「追加のボードマネージャのURL」に以下をコピペ

https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_dev_index.json

2.[ツール]→[ボード]-[ボードマネージャ]から"esp32"で検索し、2.0.4以降をインストール

すっごく奥深くにいますね…というよか、ESP32系、増えましたね…。

今回はここまで。

続きとか

kana-yaz.hatenablog.jp kana-yaz.hatenablog.jp

「おうちカレーのレシピ教えて?」と言われて

知人に「おうちカレーのレシピを教えて欲しい」と言われましたので、メモしておきます。
分量とか計ったこともないし、大体ありもので適当に作るのが「おうちカレー」なんだけどなー、とは思いつつも、 普段作ることが多いレシピにあわせてみました。そして分量がわかんないので、実際に作ってメモしました。

f:id:kana_yaz:20201129152051j:plain

原材料

工程

  1. 肉の下準備
    お肉は一口大に切り、チキンなら塩と胡椒を軽く振り、その他だったら塩、胡椒、ナツメグ、クミンを軽く振り、数分なじませる。ナツメグやクミンがないなら、ハーブソルトで代用してもいい。
    キッチンポリにおにく、小麦粉を小さじ2、カレー粉を小さじ1+1/2と入れ、軽くフリフリしたあとに5〜10分なじませる。
    モツや豚ブロックを使う場合は、事前に下茹でしておく。生姜、ネギの青いところ、白ワインで下処理したり、事前に軽く圧をかけておくといいかも。

  2. 野菜の下準備
    じゃがいも、にんじんは一口大、玉ねぎと生姜は荒みじん。きのこ類も一口大。個人的に、じゃがいもは大きめ、にんじんは乱切りが好き。
    じゃがいもとにんじんは耐熱皿に入れ、半分隠れるくらいのお水を入れて、レンジ600Wで2分。終わったらザルにあげてさっと表面を水で流す。
    玉ねぎはオリーブオイルで炒める。自分は甘すぎるのが嫌いなので飴色までは炒めない。ここらへんはお好みで。

  3. 炒める
    オリーブオイルをフライパンで熱し、生姜を軽く炒める。夏場ならにんにくチップでも。
    両面に軽く焼き目がつくまでおにくを焼く。
    じゃがいも、にんじんを表面が透き通るまで炒める。あらかた火が通ったら、きのこ類もあわせて炒める。生唐辛子はちぎってここで投入。

  4. 煮る
    圧力鍋を軽く温める。炒めた具材を油ごと圧力鍋へ。炒めた玉ねぎもここで。トマト缶と白ワイン、チキンブイヨンを投入。
    圧力がかかったら、弱火で10分煮込んだあと、圧力が抜けるまで放置。

  5. 味付け
    カレー粉大さじ3、小麦粉小さじ1、ソース大さじ2、ケチャップ大さじ1を投入。
    弱火でとろみがつくまでかき混ぜながら煮込む。味の調整はカレー粉、塩コショウで適当に。

感想

はじめてテキスト化したのですが、こうしてみると結構違うね?
Nさん、これでいいの?いつものカレーこんな感じなんだけど、大丈夫?記事になる?

トリイソースについて

何の躊躇いもなく「トリイのウスターソース」と記載したので、軽く補足。
トリイソースは静岡県浜松市の地ソースでして、特徴としては…おいしい(語彙力)
www.torii-sauce.jp

スパイスやお酢のトゲがなく、すごくまろやか。 そして「ソースと醤油の間みたい」って仰る方が多いのですが、おダシの味がほのかにするんです。 お魚とか、天麩羅なんかにも合うんですよね。 目玉焼き醤油派と目玉焼きソース派の抗争を鎮めるためにも使えますね。

購入は直販、もしくは浜松市ならスーパーで売ってます。
www.torii-sauce.jp

都内だと日本百貨店に置いてますかね。自分は秋葉原の「しょくひんかん」でいつも買っています。
nippon-dept.jp

Amazonにもありますけど…高ぇよ…。

ATOM Matrix のLEDマトリクスの使い方

ATOM Matrix のLED関連の概念について

公式ドット絵ツールATOM Pixel Toolを使って作成したアイコン類の表示についてのメモ。
void animation()とかvoid displaybuff()で使うやつ。

ATOM Pixel Toolの使い方

色を選んでポチポチして絵を描く。
編集が終わったら、[TOOLS]→[SAVE]で保存する。
画像データはunsinged charで吐き出されるので、使うコードにコピペ。
f:id:kana_yaz:20200608235329p:plain

複数のアイコンなどを表示するとき

6つのアイコンを表示させたければ、ATOM Pixel Toolのパレットサイズ、W30にすればいい。
要するに、5×表示させたいアイコン数
f:id:kana_yaz:20200608235335p:plain

表示するアイコンを指定するには

displaybuff()を使うと表示ができる。
displaybuff(uint8_t *buffptr, int8_t offsetx = 0, int8_t offsety = 0)
* buffptr:画像データ(配列)
* オフセット(W)
* オフセット(H)

位置の指定に関してはあくまでもオフセット位置なので、例えば、
* 一番左のアイコン → offsetx = 0
f:id:kana_yaz:20200609001838j:plain * 次のアイコン → offsetx = -5
f:id:kana_yaz:20200609001842j:plain * 今度のアイコン → offsetx = -10
となる。

順繰りに表示するサンプル


ATOM Matrix Icon Demo

#include <M5Atom.h>

int iPos=0;

const unsigned char image_default[602]={
/* width  040 */ 0x28,
/* height 005 */ 0x05,
/* Line   000 */ 0xff,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xff,0x00,0x00, 0x00,0x00,0x00, 0x55,0xaa,0xff, 0x55,0xaa,0xff, 0x55,0xaa,0xff, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xff,0xff,0x7f, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xff,0xff,0x7f, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xff,0xff,0x7f, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xff,0xff,0x7f, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xff,0x00,0x7f, 0x00,0x00,0x00, 0xff,0x00,0x7f, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, // 
/* Line   001 */ 0x00,0x00,0x00, 0xff,0x00,0x00, 0x00,0x00,0x00, 0xff,0x00,0x00, 0x00,0x00,0x00, 0x55,0xaa,0xff, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x55,0xaa,0xff, 0x00,0x00,0x00, 0xff,0xff,0x7f, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xff,0xff,0x7f, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xff,0xff,0x7f, 0xff,0xff,0x7f, 0xff,0xff,0x7f, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xff,0xff,0x7f, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xff,0x00,0x7f, 0x00,0x00,0x00, 0xff,0x00,0x7f, 0x00,0x00,0x00, 0xff,0x00,0x7f, 0x00,0x00,0x00, 0xff,0x00,0x7f, 0x00,0x00,0x00, 0xff,0x00,0x7f, 0x00,0x00,0x00, // 
/* Line   002 */ 0x00,0x00,0x00, 0x00,0x00,0x00, 0xff,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x55,0xaa,0xff, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x55,0xaa,0xff, 0xff,0xff,0x7f, 0xff,0xff,0x7f, 0xff,0xff,0x7f, 0xff,0xff,0x7f, 0xff,0xff,0x7f, 0xff,0xff,0x7f, 0xff,0xff,0x7f, 0xff,0xff,0x7f, 0xff,0xff,0x7f, 0xff,0xff,0x7f, 0xff,0xff,0x7f, 0x00,0x00,0x00, 0xff,0xff,0x7f, 0x00,0x00,0x00, 0xff,0xff,0x7f, 0xff,0xff,0x7f, 0x00,0x00,0x00, 0xff,0xff,0x7f, 0x00,0x00,0x00, 0xff,0xff,0x7f, 0xff,0x00,0x7f, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xff,0x00,0x7f, 0x00,0x00,0x00, 0xff,0x00,0x7f, 0xff,0x00,0x7f, 0xff,0x00,0x7f, 0x00,0x00,0x00, // 
/* Line   003 */ 0x00,0x00,0x00, 0xff,0x00,0x00, 0x00,0x00,0x00, 0xff,0x00,0x00, 0x00,0x00,0x00, 0x55,0xaa,0xff, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x55,0xaa,0xff, 0x00,0x00,0x00, 0xff,0xff,0x7f, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xff,0xff,0x7f, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xff,0xff,0x7f, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xff,0xff,0x7f, 0xff,0xff,0x7f, 0xff,0xff,0x7f, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xff,0x00,0x7f, 0x00,0x00,0x00, 0xff,0x00,0x7f, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xff,0x00,0x7f, 0x00,0x00,0x00, 0x00,0x00,0x00, // 
/* Line   004 */ 0xff,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xff,0x00,0x00, 0x00,0x00,0x00, 0x55,0xaa,0xff, 0x55,0xaa,0xff, 0x55,0xaa,0xff, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xff,0xff,0x7f, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xff,0xff,0x7f, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xff,0xff,0x7f, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xff,0xff,0x7f, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xff,0x00,0x7f, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, // 
};

void setup() {

  Serial.begin(115200);
  
  M5.begin(true, false, true);
  M5.dis.displaybuff((uint8_t*)image_default, iPos, 0);

}
void loop() {

  iPos=iPos-5;
  if(iPos<-40){
    iPos=0;
  }

  M5.dis.displaybuff((uint8_t*)image_default, iPos, 0);
  
  delay(500);
  M5.update();
}

ハートふわふわサンプル(位置指定して表示)


ATOM Matrix Icon Demo

#include <M5Atom.h>

const unsigned char image_default[602]=
{
/* width  040 */ 0x28,
/* height 005 */ 0x05,
/* Line   000 */ 0xff,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xff,0x00,0x00, 0x00,0x00,0x00, 0x55,0xaa,0xff, 0x55,0xaa,0xff, 0x55,0xaa,0xff, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xff,0xff,0x7f, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xff,0xff,0x7f, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xff,0xff,0x7f, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xff,0xff,0x7f, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xff,0x00,0x7f, 0x00,0x00,0x00, 0xff,0x00,0x7f, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, // 
/* Line   001 */ 0x00,0x00,0x00, 0xff,0x00,0x00, 0x00,0x00,0x00, 0xff,0x00,0x00, 0x00,0x00,0x00, 0x55,0xaa,0xff, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x55,0xaa,0xff, 0x00,0x00,0x00, 0xff,0xff,0x7f, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xff,0xff,0x7f, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xff,0xff,0x7f, 0xff,0xff,0x7f, 0xff,0xff,0x7f, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xff,0xff,0x7f, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xff,0x00,0x7f, 0x00,0x00,0x00, 0xff,0x00,0x7f, 0x00,0x00,0x00, 0xff,0x00,0x7f, 0x00,0x00,0x00, 0xff,0x00,0x7f, 0x00,0x00,0x00, 0xff,0x00,0x7f, 0x00,0x00,0x00, // 
/* Line   002 */ 0x00,0x00,0x00, 0x00,0x00,0x00, 0xff,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x55,0xaa,0xff, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x55,0xaa,0xff, 0xff,0xff,0x7f, 0xff,0xff,0x7f, 0xff,0xff,0x7f, 0xff,0xff,0x7f, 0xff,0xff,0x7f, 0xff,0xff,0x7f, 0xff,0xff,0x7f, 0xff,0xff,0x7f, 0xff,0xff,0x7f, 0xff,0xff,0x7f, 0xff,0xff,0x7f, 0x00,0x00,0x00, 0xff,0xff,0x7f, 0x00,0x00,0x00, 0xff,0xff,0x7f, 0xff,0xff,0x7f, 0x00,0x00,0x00, 0xff,0xff,0x7f, 0x00,0x00,0x00, 0xff,0xff,0x7f, 0xff,0x00,0x7f, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xff,0x00,0x7f, 0x00,0x00,0x00, 0xff,0x00,0x7f, 0xff,0x00,0x7f, 0xff,0x00,0x7f, 0x00,0x00,0x00, // 
/* Line   003 */ 0x00,0x00,0x00, 0xff,0x00,0x00, 0x00,0x00,0x00, 0xff,0x00,0x00, 0x00,0x00,0x00, 0x55,0xaa,0xff, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x55,0xaa,0xff, 0x00,0x00,0x00, 0xff,0xff,0x7f, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xff,0xff,0x7f, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xff,0xff,0x7f, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xff,0xff,0x7f, 0xff,0xff,0x7f, 0xff,0xff,0x7f, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xff,0x00,0x7f, 0x00,0x00,0x00, 0xff,0x00,0x7f, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xff,0x00,0x7f, 0x00,0x00,0x00, 0x00,0x00,0x00, // 
/* Line   004 */ 0xff,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xff,0x00,0x00, 0x00,0x00,0x00, 0x55,0xaa,0xff, 0x55,0xaa,0xff, 0x55,0xaa,0xff, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xff,0xff,0x7f, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xff,0xff,0x7f, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xff,0xff,0x7f, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xff,0xff,0x7f, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xff,0x00,0x7f, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, // 
};

void setup() {

  Serial.begin(115200);
  
  M5.begin(true, false, true);
  M5.dis.displaybuff((uint8_t*)image_default, iPos, 0);

}
void loop() {

  M5.dis.displaybuff((uint8_t*)image_default, -30, 0);
  delay(500);
  M5.dis.displaybuff((uint8_t*)image_default, -35, 0);
  delay(500);

  M5.update();
}

kana-yaz.hatenablog.jp

ATOM Matrix についてのメモ(2020/06/08現在)

ATOM Matrix

f:id:kana_yaz:20200608235053j:plain f:id:kana_yaz:20200608235026j:plain f:id:kana_yaz:20200608235020j:plain

これはなに?

M5 Stack シリーズの新型。
ESP32-picoが入った、とても小さい開発モジュール。
24mm x 24mm でとても小さい。江戸間でいうと0.0004畳くらい。

イケてんの?

USB Type-C
ESP32 PICOベース
4 MBフラッシュメモリ
2.4G SMDアンテナ:Proant 440
MPU6886 6軸センサ
25 x RGB LED(WS2812B)
1 x 赤外線LED
1 x プログラム可能なボタン
1 x リセットボタン
6 x GPIOピン
Grove互換インターフェース
プログラムプラットフォーム:Arduino、UIFlow
電源入力:5 V / 500 mA
動作環境温度:0 ~ 40 ℃
製品サイズ:24 x 24 x 14 mm
製品重量:14 g

技適あんの?

今のロットはあるみたいですね f:id:kana_yaz:20200608235032j:plain

どこで買えるの?

スイッチサイエンスとか Amazonとか

どうやって使うの?

  • 公式のQuick Start
  • 公式のGit Hub
  • あとはここを参照して
  • 公式のドット絵ツールは公式のGit HubにあるAtomPixTool.exeってやつ f:id:kana_yaz:20200608235329p:plain

気にしとくところ(2020/06/08現在)

  • LEDのところを押し込むとボタンが押されたことになる。リセットボタン押しまくって、サンプル動かねーぞクソが、ってなった。ドキュメント読め自分。
  • バッテリは内蔵してない。そのうちピンヘッダにつけるAdd-onsが出そう。
  • FastLEDライブラリを入れるの忘れないようにする。
  • Arduinoのライブラリマネージャからダウンロードされるライブラリが最新じゃなくて、fillpix()が利用できなかった。
     M5Atom\src 内の M5Atom.h、30行目のvoid clear();の上にvoid fillpix(CRGB Color);を追加したらいけた。
     この解決方法が合っているかはわからない f:id:kana_yaz:20200608232920p:plain
  • 公式のドット絵ツールがWindows版しかない。他のOSに対応したやつもそのうち出るんじゃないかな。知らんけど。

万年筆インクをひたすら消費する

万年筆インクは無限増殖する

万年筆インクって、使い切るのがなかなか難しいですよね。ボトルインクって、それなりに使っていても年単位で保つし、使い切らないのに他の色が欲しくなるし。n年前から使ってるiroshizukuの月夜。。

太いペンでも好きな色を使いたい

f:id:kana_yaz:20200220133851j:plain 万年筆インクを他の用途に使うと言うと、思い付くのはローラーボールとかですよね。 エルバンのローラーボールとか便利。

エルバン ボールペン コンバーター付き スケルトン hb-pen08

エルバン ボールペン コンバーター付き スケルトン hb-pen08

  • 発売日: 2017/02/03
  • メディア: オフィス用品

ただ、水性インクのボールペンを使う文化がない方もいらっしゃいますよね。紙にしか書けないとか、汚れるとかで。 気分はアガるんだけどね、好きなインクを気軽に使えるボールペン。

気付かなかった

ヨドバシ行ってなんとなしにペンコーナーを見てたら、うまく使えそうなものがありましたね。これ。

子供の頃に教師のデスクで見た、採点ペン。パッケージを見ると、万年筆用カートリッジって書いてある。これコンバーターいける???

純正コンバーターをブチ込む

さっそく買ってみましょう。これですね。

うし

f:id:kana_yaz:20200220134022j:plain

おら

f:id:kana_yaz:20200220134017j:plain

問題ないですね

f:id:kana_yaz:20200220134010j:plain

ドンキ格安ノート「MUGA」の上位モデルを使ってみた感想

インターネットでバズったドンキ格安ノート

年末に話題となった、ドンキホーテの19800円ノート「MUGA ストイックPC」。 何よりも19800円という格安価格に加えて、出来や品質に関してもいろいろと話題になったようで。

www.donki.com

若い人たちのほとんどが自らのパソコンを持たなくなった現代で、こういった挑戦的な商品が出回ることはいいですね。 以前から格安の2in1やタブレットなども出していましたけど、こういった形で普通のラップトップが出回るとは。。

このクラスにはそこまでたくさんの製品はないのですが、やはり2万円前半というのは魅力的。 価格的には中華ノートがライバルになると思いますが、技適PSEの問題もあるので、安心して使うことができないですよね。

  • ASUS E200HA エイスース 11.6型ノートパソコン ASUS VivoBook E200HA ホワイト(KINGSOFT Office Standar) E200HA-8350W
  • hp Stream 11 【Officeセット】HP Stream 11-y003TU Windows10 64bit Celeron 2GB 32GB 光学ドライブ非搭載 無線LAN IEEE802.11ac/a/b/g/n Bluetooth USB3.0 HDMI webカメラ microSDカードスロット 11.6型液晶搭載ノートパソコン バッテリー長持ち最大約10.75時間 Microsoft OneDrive100GB(2年間使用可)
  • Jumper Ezbook2 Jumper EZbook 3S (Windows10 /14.1inch /フルHD 1920x1080 /Intel N3450) (6GB/256GB SSD)(USB3.0 /HDMI /Bluetooth4.0) (シルバー/銀) [並行輸入品]

元モデルが格安放出されている

f:id:kana_yaz:20180111132742j:plain
ドンキPCこと「MUGA」の元モデルこと、恵安「WiZBOOK KBM14HD」の修理上がり品が1万円台前半で売っているので、今回はそこらへんを触ってみます。
KEIAN WiZBOOK ノートPC フルHD 14.1インチ IPS液晶 1920x 1080ドット クアッドコア メモリ4GB Windows 10 KBM14HD www.keian.co.jp

  MUGA KNW14FHD-SL KEIAN KBM14HD
CPU Intel ®ATOM x5-Z8350(Cherry Trail) Intel ®ATOM x5-Z8350(Cherry Trail)
モリー LPDDR3-2GB LPDDR3-4GB
ストレージ eMMC 32GB eMMC 32GB
無線LAN IEEE802.11b/g/n IEEE 802.11a/b/g/n/ac
ディスプレイ 14.1インチ IPS 1920x1080 14.1インチ IPS 1920x1080
インカメラ 30万画素 200万画素
カラー シルバー ブラック

差異をまとめてみましたが、なんとも微妙なところでコストを抑えていますね。メモリー半分&Webカメラの画素数がかわっています。
モリーが2GBになっているのは痛いですが、価格に直結するところですから、やむを得ないですかね。 「MUGA」は2万円切りというインパクトを重視した結果だと思います。
レビューなんて腐るほど掲載されていますし、製品のスペック自体もそこらへんのWindowsタブと大してかわりませんので、気になったところを適当にまとめてみます。

いいところ、ダメなところ

もちろんこの値段なので贅沢は言いません。普通に作業する分には十分な性能を持っていますね。 ただ日常使うに当たって気になる点はもちろんあります。

  • 【いい】画面がものすごくきれい
    このPCの売りなのがIPSのフルHD液晶というところ。映り込みはそれなりにあるんですが、高精細で発色も悪くない。 動画や写真なんかを見るには非常にいいんじゃないんでしょうか。

  • 【いい】意外とサクサク
    動作はスムーズですね。さすが軽量なWindows10なだけあります。 もちろんあれもこれも、なんて言っていれば不満点が出るのは当然ですけど、軽めの作業であれば全然問題ない。
    VisualStudioCode、ChromeでのYoutube視聴などは快適にこなします。Onedrive経由のOffice Onlineも問題ないですね。

  • 【ダメ】ヒンジがゆるい
    ヒンジがやわいせいで、文書を売っているだけでディスプレイがゆらゆらします。 乗り物酔い的な感覚になるのはNGです。 軽量なLEDパネルの液晶&ヒンジのコストを削っているせいですけど、このクラスでかっちり作っているモデルを見たことがないですので、値段相応なのかもしれません。

  • 【ダメ】無理矢理感があるキーボード配列
    日本語キーボードの金型を作るコストがねー、っといったところなんでしょうけど、これは絶望的にダメ。 特に[BS][Del][Return]あたりが致命的で、[Del]を誤爆しまくる&カッコを閉じようとして[Enter]を押してしまいます。
    かといって、US配列のまま出すのも微妙ですので、

  • 【いい】割と広いキーボード 配列はともかくとしてキーピッチは19mm近く確保してありますので、この配列に慣れてしまえば、それなりにタイプできます。 薄さの問題もあるので底付き感があって疲れはしますが、少なくともメインエリアでの誤タイプはかなり少ないです。

  • 【ダメ】タッチパッドが微妙
    面積や反応自体は悪くない。いっちょ前に二本指スクロールとかにも対応しているので、機能的にも問題ない。 ただカーソル飛びと反応の悪さにストレスがたまります。 これはTrackPointに慣れている自分の感覚もあると思いますので、タッチパッドならそんなものなのかもしれません。

  • 【いい】お求め安い
    この価格がすべてを許してくれますね。なにせ12000円です。ちょっといいところで飲み食いするのと同じ値段で入手できるんですから。 正規の値段で買うか?っていうと微妙なんですけど。

もしかしてここが不良だったの?

今回買ったのは修理再生品ですので、不具合があることは承知の上で購入しています。
何度か使っているうちに、特に何もしていないのにスリープに入ってしまう不具合に気づきました。 特に何のきっかけもなくスリープに入りまくるので、とてもイライラします。
イベントログを見ると、カバーを閉じたというイベントがひたすら記録されている。 ということで、電源設定からカバー閉じの動作を切ってみたところ、不意にスリープに入る問題は発生しなくなっています。 閉じるところのセンサーがダメなんですかね。
直ってねえじゃん。。

はたしてこれは誰向きのラップトップなの

これの下位モデル、ドンキで売っていいものなんだろーか?とは思います。パワーユーザーが割り切って使うのなら問題無い気はするんですけど、普通の方だったら何かあったときが不安だよなー、と。
ストレージもeMMCの32GBですから、普通のラップトップのようにいろいろインストールして使うことは難しいでしょう。WindowsUpdateですら難しい容量なんですから。 microSDHCをさしてシンボリックリンクを貼って、なんてやり方をすればある程度使えるようになる…かなとは思うんですが、一般の方はそこまでしないですよね。

Webサービスを利用するためのインターフェイスと見れば、Web閲覧、Webメール、ストリーミング動画視聴などは問題無くこなせます。 スマホテザリングモバイルルーターを利用して出先で軽く使うとか、自宅のテレビが埋まってるときに動画を見る、自宅のパソコンが埋まってるときに軽い作業をする、とか。 スロットがmicroなのでカードリーダーが必要なのが微妙ですが、出先で写真をたくさん撮るシチュエーションでの撮影画像確認とかにも使えそうですね。カメラマンさんとかレイヤーさんとか。

というわけで

万人にすすめられるマシンでないことは確かです。メインとして使うには不十分。ストレージも容量が少ないですし、キーボード配列はおかしいし。
ただこの値段で買える&IPSだから液晶がきれいということは十分なメリットですので、その点が気に入ることができるのなら、ありですね。

そして。何かトラブルあっても泣かない。恵安だし。おけいあんだし。
パソコンの大先生Linuxに入れ替えて云々言いますけど、それなりに使えるディストリってWindows10より重い気がするので、Windowsのまま使う方がいいと思います。 どうしても入れ替えたいんなら、Chroniumあたりがいいんじゃないんでしょうか。
あと、バラして基板を云々いうんだったら、メインボードだったらLattePanda、液晶だったら秋月のIGZOかAliで適当な液晶と変換基板買うか、eDPでつなぐことができるiPad液晶がいいと思います。