chakokuのブログ(rev4)

テック・コミック・DTM・・・ごくまれにチャリ

M5 Stick C PlusでBLEを動かしてみる

M5 StickCだからどうということはなく、ESP32のBLEを動かすのと等しいのだが、、最後にBLEを使った時は、MicroPythonのBLEライブラリはサブセットのためWindowsとはペアリングできなかったと記憶している。iOSなら大丈夫だったはず。。過去に試作したMIDI-Keyboardのサンプルを再度動かしてみる

import bluetooth
from ble_advertising import advertising_payload

_IRQ_CENTRAL_CONNECT = const(1)
_IRQ_CENTRAL_DISCONNECT = const(2)
_IRQ_GATTS_WRITE = const(3)

MIDI_SRV_UUID = bluetooth.UUID('03B80E5A-EDE8-4B33-A751-6CE34EC4C700')
MIDI_CHR_UUID = bluetooth.UUID('7772E5DB-3868-4112-A1A9-F2669D106BF3')

payload = advertising_payload(
    #name="BLE MIDI 0.01",
    #services=[bluetooth.UUID(0x181A)],
    services=[MIDI_SRV_UUID],
)
BLE_MIDI_CHR = (MIDI_CHR_UUID, bluetooth.FLAG_READ | bluetooth.FLAG_NOTIFY)
BLE_MIDI_SERVICE = (MIDI_SRV_UUID, (BLE_MIDI_CHR,))
SERVICES = (BLE_MIDI_SERVICE, )

interval_us=500000
    
def bt_irq(event, data):
    # Track connections so we can send notifications.
    if event == _IRQ_CENTRAL_CONNECT:
        conn_handle, _, _ = data
        print("New connection", conn_handle)
    elif event == _IRQ_CENTRAL_DISCONNECT:
        conn_handle, _, _ = data
        print("Disconnected", conn_handle)
        # Start advertising again to allow a new connection.
        bt.gap_advertise(interval_us, adv_data=payload)        
    elif event == _IRQ_GATTS_WRITE:
        conn_handle, value_handle = data

bt = bluetooth.BLE()
bt.irq(bt_irq)
bt.active(1)
((midi,),) = bt.gatts_register_services(SERVICES)
print("start advertise")
bt.gap_advertise(interval_us, adv_data=payload)

print(payload)
#print(decode_name(payload))
#print(decode_services(payload))

iOS側でBLE開発ツール(LightBlue)でBLEを接続した。以下のようにBLE MIDI Keyboardとして認識されている。


このサンプルは、M5 Stick CをBLE MIDI Keyboardとして動かした例なので、これらのService UUID/Characteristic UUIDをMIDI Keyboardとして実装すれば、カメラのシャッターボタンとして使えるはず(音量Up/Downのキー操作でシャッターが押せるとメモがあった)。BLEのシャッターボタン実装のサンプルがGitにあるはずなので、それを参考に実装すれば動くと思われる。

Bluetoothキーボードから音量アップキー「KEY_MEDIA_VOLUME_UP」を送信することで、シャッター操作が行われるらしい
(https://wak-tech.com/archives/1796)

MicroPythonを使ってBLE接続のHIDを実装して、Keyboardの自動入力のサンプルを掲載してれている記事があるので、
この処理を参考に、VOLUME_UPのキーを送信できるようにすればシャッターが切れるはず。

■参考URL
まず見るべきGitHubのソース
micropython/examples/bluetooth at master · micropython/micropython · GitHub

https://gitee.com/walkline/esp32-ble/blob/master/ble/ble_hid.py
https://github.com/Heerkog/MicroPythonBLEHID/blob/master/examples/simple/keyboard_example.py

M5 StickC Plus用LCDドライバ(ST7789)を導入する

M5 StickCの電源がOnかOffか分かりづらいためLEDを点灯させているが、そもそもLCDに何か表示されていればいいわけで、ST7789用のドライバを探してみた。簡単に見つけられるドライバはC言語で実装されており、C言語版のドライバはビルドが必要なので、Pythonで書かれたドライバをさらに探してみる。MicroPythonで書かれたドライバがあったので入れてみる。

st7789.pyがFlashに書き込まれている状態で以下を実行

from machine import Pin,SPI
import st7789py
lcd_width=135
lcd_height=240
hspi = SPI(1, 1000000, sck=Pin(13), mosi=Pin(15), miso=Pin(14))  # 1MHz
cs = Pin(5,Pin.OUT)
dc = Pin(23,Pin.OUT)
reset = Pin(18,Pin.OUT)
lcd = st7789py.ST7789(hspi,lcd_width,lcd_height,reset=reset,dc=dc,cs=cs)

塗りつぶしをやってみたが、表示が変わらない。なぜか?

lcd.fill(0)
lcd.fill(255)

回路図を見ると、AXP192というチップからLCDコントローラにLCD_BL_VCC / LCD_LOGIC_VCCという線が伸びている。バックライト調整用の電圧と推測。AXP192を制御しないとLCDが表示されないのでは?と推測
さらに探すと、AXP192用のMicroPythonドライバを提供してくださっている人を発見(GitHub上で)。ドライバを入れてみる。

以下でLCD用バックライトの電圧がかかるはずなのだが。。まだ表示されない。なぜだろうか

from machine import I2C
import axp192
sys_i2c  = I2C(0, sda=Pin(21), scl=Pin(22))
axp = axp192.AXP192(sys_i2c)
axp.setup()
axp.set_LD02(True)

AXP192の制御は合ってそうなので、別の人が開発したLCDドライバを使ってみる。
Sebastian Wicki 氏が提供されている、ドライバを使うことで表示が可能になった。
試したドライバは、github/gandroで公開されている、st7789.py と colors.pyを使用
以下のテストサンプルで正常動作を確認(AXPによるバックライト電圧は出ているのを前提)。。したのだが、成功したのは一回だけで、あとはまた真っ黒なのであった。少し頭を冷やして考えよう。

import machine
import colors
import st7789

spi = machine.SPI(1, baudrate=20_000_000, polarity=1,
                  sck=machine.Pin(13, machine.Pin.OUT),
                  miso=machine.Pin(4, machine.Pin.IN),  # NC
                  mosi=machine.Pin(15, machine.Pin.OUT))

tft = st7789.ST7789(spi, 135, 240,
                    reset=machine.Pin(18, machine.Pin.OUT),
                    dc=machine.Pin(23, machine.Pin.OUT),
                    cs=machine.Pin(5, machine.Pin.OUT),
                    buf=bytearray(2048))

c = colors.rgb565(3,3,8)
tft.fill(c)
tft.text("Hello World", 10, 30, colors.WHITE, c)

USBケーブルを抜き差しして本体リセットしたつもりだが、M5は電池内蔵だったので、リセットできていなかった。電源ボタン長押しで再度テスト。以下のコードにより、Hello Worldが描画できた。

from machine import I2C, Pin, SPI
import axp192
import colors
import st7789

sys_i2c  = I2C(0, sda=Pin(21), scl=Pin(22))
axp = axp192.AXP192(sys_i2c)
axp.setup()
axp.set_LD02(True)

spi = SPI(1, baudrate=20_000_000, polarity=1, sck=Pin(13), miso=Pin(14), mosi=Pin(15))
tft = st7789.ST7789(spi, 135, 240,
                    reset=machine.Pin(18, machine.Pin.OUT),
                    dc=machine.Pin(23, machine.Pin.OUT),
                    cs=machine.Pin(5, machine.Pin.OUT),
                    buf=bytearray(2048))
tft.fill(colors.BLACK)
tft.text("-- Power On --",10,120,colors.rgb565(8,8,8),colors.BLACK)

最終的なboot.pyは以下

from machine import I2C, Pin, SPI, PWM
import axp192
import colors
import st7789

LCD_WIDTH = 135
LCD_HEIGHT = 240

# set AXP device
sys_i2c  = I2C(0, sda=Pin(21), scl=Pin(22))
axp = axp192.AXP192(sys_i2c)
axp.setup()
axp.set_LD02(True)


#turn on LED for check power on
pwm_led = PWM(Pin(10), freq=100)
pwm_led.duty(1000)   # 0-1023

# set message on LCD
spi = SPI(1, baudrate=20_000_000, polarity=1, sck=Pin(13), miso=Pin(14), mosi=Pin(15))
                    
rst = Pin(18, Pin.OUT)
dc = Pin(23, Pin.OUT)
cs = Pin(5, Pin.OUT)
buf = bytearray(2048)

tft = st7789.ST7789(spi, LCD_WIDTH, LCD_HEIGHT, reset=rst, dc=dc, cs=cs, buf=buf)
tft.fill(colors.BLACK)
tft.text("-- Power On --",10,120,colors.rgb565(8,8,8),colors.BLACK)

電源投入後は以下のような表示となる。相変わらず地味ですが、、LCDが焼き付いたりするのが嫌なので暗いカラーで表示

だいたい準備はできたので、、次は本来の目的である、BLEによるシャッターボタン作成にとりかかる。。。のだが、IoT勉強会の資料を作らないといかん。逃避している。あっという間に1月になりそうだ。

■ご参考URL
st7789py_mpy/st7789py.py at master · russhughes/st7789py_mpy · GitHub
GitHub - karfas/M5StickC-uPy: Micropython utilities for the M5StickC
Micropython M5StickC LCD Driver · GitHub

正常動作が確認できたLCDドライバ(st7789.py)
GitHub - gandro/micropython-m5stickc-plus: Micropython modules for the M5StickC Plus
Micropython | M5Stack Community

M5 Stick-C Plusを買った。MicroPythonを入れて使いたいが結構面倒な印象->場当たり的だがESP32のGeneric版ファームで動いた(駄文)

ESP32のDevKit等でMicroPythonを動かしてきたけど、電源供給が必要なため単独では動かせなかった。M5 Stack/M5 StickならLCDも付いているし、LiPoバッテリー内蔵なので、使いたいときにサクッと動かせて便利だ。ということでこぶりでかわいいM5 Stick-C Plusを買ってみた。

買った理由は、大量に積読になっている平凡社の太陽とか芸術新潮をヨメが捨てろと叫んでいて、スキャンしてから捨てたいと思った。PFU製の大判のスキャナはめちゃ高い*1ので、スマフォのカメラでページの写真とったらええやんとなった。スマフォで写真とるにしても、シャッターボタンをどうするか?となり、100均ではスマフォ用シャッターボタン売られてるらしい。が、マイコン小僧(苦笑)としてはシャッタボタンを自作したいと思い、BLEでシャッターボタンを作れると知りまして、だったら、ESP32+MicroPythonで作ったらええやんとなって、使いたいときに使えるEPS32といえばバッテリー内蔵のM5だとなって、M5 Stickを買ったのでした。

まだMicroPythonをインストールしていないが、、M5 StcikにMicroPythonを焼くのは多少面倒な感じであった。そもそも、M5 Stack/M5 StickCってMicroPythonで全面サポートしているのだろうか。全面サポートとは、、、M5についてるLCDとかセンサ類のドライバは自分で探して入れる感じなんだろうか。。M5 パッケージとかないのかも。
M5のサイトでもメインでサポートしているのはArduinoのようなのだが。。なぜMicroPythonは手厚くサポートされないのだろうか。。MicroPythonのサイトでは、M5 Stack ATOMがサポート対象になっている。M5 Stack ATOMは、M5シリーズの一番コンパクトなやつで、ATOMに搭載されているESP32はPicoで、Flashサイズも4MBなので、、ハード仕様はM5 Stickと同等だ。LCDや加速度センサ等のドライバ類は無視して、MicroPythonの標準ライブラリの範囲ではそのまま動くのではないかと推測、、M5 Stack ATM用ファームを焼いてみる。

ESP32側をダウンロードモードにしないといけないのかもしれませんが、、適当にesptoolで焼いてみる。
flash_idは取得できた

$ esptool.py --port  /dev/ttyS16   flash_id
esptool.py v2.8
Serial port /dev/ttyS16
Connecting....
Detecting chip type... ESP32
Chip is ESP32-PICO-D4 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, Embedded Flash, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: 94:b9:7e:xx:xx:xx
Uploading stub...
Running stub...
Stub running...
Manufacturer: c8
Device: 4016
Detected flash size: 4MB
Hard resetting via RTS pin...

MicroPythonのサイトの手順に倣って焼いてみる

esptool.py --chip esp32 --port /dev/ttys16 erase_flash
esptool.py --chip esp32 --port /dev/ttys16  write_flash -z 0x1000 esp32-20190125-v1.10.bin

と思ったが、、肝心のファームが無いようだ

No firmware is available for this board.

ソースを取ってきてビルドしてねということか??
他の人の事例を見てもUIFlowが関係していて、UIFlowは使いたくないから、UIFlowとまったく関係なしに素でMicroPythonを入れたいのだが。。だとしたら、、M5Stickにくっついている周辺デバイスは無視して、、ESP32PICOだけが存在するボードと思ってファームを焼けばいいのか。(そうすると、液晶パネルとかのデバイスは自力でドライバを入れないといけなくなる。めんどうくさい)

GitHubには、esp32の下にPICO用のソースが置かれていて、これをビルドしてくれということなのかもしれない。
micropython/ports/esp32/boards/LOLIN_S2_PICO/
ARMのビルド環境はあるけど、ESP32用はないので、そこから作らないといけない。。はぁ。。

今日の結論
M5 Stick-Cはコンパクトでかわいいが、標準の開発環境はUIFlowとかArduinoのようで、MicroPythonはメインではサポートされていない。いろんな人が自力でインストールしている。また、コアがESP32-PICO-D4なので、genericなESP32用のファームだと多分動かないと思われる(Flashの配置方法が違うので(自分の理解))(だめもとで焼いてみてもいいけど)

手元にあった古いMicroPythonの普通のESP32用ファームを試しに焼いてみた
まずflashを消去

$ esptool.py --chip esp32 --port /dev/ttyS16 erase_flash
esptool.py v2.8
Serial port /dev/ttyS16
Connecting.....
Chip is ESP32-PICO-D4 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, Embedded Flash, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: 94:b9:7e:xx:xx:xx
Uploading stub...
Running stub...
Stub running...
Erasing flash (this may take a while)...
Chip erase completed successfully in 5.2s
Hard resetting via RTS pin...

ファームを焼く

$ esptool.py --chip esp32 --port /dev/ttyS16  write_flash -z 0x1000 esp32-idf3-20191220-v1.12.bin
esptool.py v2.8
Serial port /dev/ttyS16
Connecting....
Chip is ESP32-PICO-D4 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, Embedded Flash, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: 94:b9:7e:xx:xx:xx
Uploading stub...
Running stub...
Stub running...
Configuring flash size...
Auto-detected Flash size: 4MB
Compressed 1247280 bytes to 787794...
Wrote 1247280 bytes (787794 compressed) at 0x00001000 in 70.8 seconds (effective 140.9 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...

焼くには焼けた。。ブートして動くのかどうか。。(REPL用のシリアルとか違ってるかもしれないし。。)
ブートすると以下のようなダウンロードモードで立ち上がってきた

ets Jun  8 2016 00:22:57

rst:0x1 (POWERON_RESET),boot:0x0 (DOWNLOAD_BOOT(UART0/UART1/SDIO_FEI_FEO_V2))
waiting for download

ブートできないからだろうか。それとも、ブートスイッチが働いている??
最新版ファームを落としてもう一度焼きなおしてみる

$ esptool.py --chip esp32 --port /dev/ttyS16  write_flash -z 0x1000 esp32-20210902-v1.17.bin
esptool.py v2.8
Serial port /dev/ttyS16
Connecting......
Chip is ESP32-PICO-D4 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, Embedded Flash, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: 94:b9:7e:xx:xx:xx
Uploading stub...
Running stub...
Stub running...
Configuring flash size...
Auto-detected Flash size: 4MB
Compressed 1527504 bytes to 987584...
Wrote 1527504 bytes (987584 compressed) at 0x00001000 in 88.8 seconds (effective 137.7 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...

シリアルコンソールで確認
適当に改行を打つとプロントが返る。。汎用のESP32ファームで動いた。Flashの接続方法とか違ってるはずなんだけど。。番地が同じだから動いてしまうのだろうか。。よくわからない。

>>>
MPY: soft reboot
MicroPython v1.17 on 2021-09-02; ESP32 module with ESP32
Type "help()" for more information.
>>> help()
Welcome to MicroPython on the ESP32!

For generic online docs please visit http://docs.micropython.org/

For access to the hardware use the 'machine' module:

import machine
pin12 = machine.Pin(12, machine.Pin.OUT)
pin12.value(1)
pin13 = machine.Pin(13, machine.Pin.IN, machine.Pin.PULL_UP)
print(pin13.value())
i2c = machine.I2C(scl=machine.Pin(21), sda=machine.Pin(22))
i2c.scan()
i2c.writeto(addr, b'1234')
i2c.readfrom(addr, 4)

Basic WiFi configuration:

import network
sta_if = network.WLAN(network.STA_IF); sta_if.active(True)
sta_if.scan()                             # Scan for available access points
sta_if.connect("<AP_name>", "<password>") # Connect to an AP
sta_if.isconnected()                      # Check for successful connection

Control commands:
  CTRL-A        -- on a blank line, enter raw REPL mode
  CTRL-B        -- on a blank line, enter normal REPL mode
  CTRL-C        -- interrupt a running program
  CTRL-D        -- on a blank line, do a soft reset of the board
  CTRL-E        -- on a blank line, enter paste mode

For further help on a specific object, type help(obj)
For a list of available modules, type help('modules')
>>> help('modules')
__main__          gc                ubinascii         urandom
_boot             inisetup          ubluetooth        ure
_onewire          machine           ucollections      urequests
_thread           math              ucryptolib        uselect
_uasyncio         micropython       uctypes           usocket
_webrepl          neopixel          uerrno            ussl
apa106            network           uhashlib          ustruct
btree             ntptime           uheapq            usys
builtins          onewire           uio               utime
cmath             uarray            ujson             utimeq
dht               uasyncio/__init__ umqtt/robust      uwebsocket
ds18x20           uasyncio/core     umqtt/simple      uzlib
esp               uasyncio/event    uos               webrepl
esp32             uasyncio/funcs    upip              webrepl_setup
flashbdev         uasyncio/lock     upip_utarfile     websocket_helper
framebuf          uasyncio/stream   upysh
Plus any modules on the filesystem

仕事だったら、なんとなく動きましただとクビだけど、、趣味だから結果オーライでいいだろう。ちゃんとファイルシステムも使えるので非常に楽。ただし、、LCDドライバとかは自力でいれないといけないだろう。UIFlowに頼らずにやっていくので、ある程度の不便はしょうがないだろう。

>>> from upysh import *

upysh is intended to be imported using:
from upysh import *

To see this help text again, type "man".

upysh commands:
pwd, cd("new_dir"), ls, ls(...), head(...), cat(...)
newfile(...), mv("old", "new"), rm(...), mkdir(...), rmdir(...),
clear

>>> ls()
     139 boot.py
>>> cat('boot.py')
# This file is executed on every boot (including wake-boot from deepsleep)
#import esp
#esp.osdebug(None)
#import webrepl
#webrepl.start()

電池内蔵でポケットに入れて持ち歩けるパッケージでMicroPythonが動くといろいろ楽しめる気がする(こんな動かし方でいいのかどうか分からないけど)。

素で入れるとLEDも点灯しないので、電源がOnかOffか分からない。自動でPowerOffにはならないだろうから、電源Onの場合はLEDを点灯させる必要あり。何も工夫しない場合は以下で点灯する。が、、これでは明るすぎてすぐにバッテリーが減るだろう。PWMで暗くするか、tickタイマで瞬間光る程度にすべきかと。

from machine import Pin
led = Pin(10, Pin.OUT)
led.off()                                #  LEDのアノード側が3.3Vに接続され、カソード側がGPIOに接続されていると思われる

もう少し改良して、電源Onの時にPWMでLEDが暗く点灯するように仕込みました(Flash上のファイル、boot.pyにPWMによるLED点灯コードを追加)
file:boot.py

import machine
pwm_led = machine.PWM(machine.Pin(10),freq=100)
pwm_led.duty(1000)   # 0-1023

M5 Stick-Cの電源が入るとLEDが薄暗く光るので、電源切り忘れが起きにくくなることを期待。下記は薄暗く点灯しているところ

■ご参考
https://docs.m5stack.com/en/core/m5stickc_plus
https://micropython.org/download/M5STACK_ATOM/
https://github.com/micropython/micropython/tree/master/ports/esp32/boards/LOLIN_S2_PICO


■追記
How do you compile and flash micropython to M5StickC plus? - MicroPython Forum
コンパイルしてMicroPythonをStick-Cに入れたいのだが?という質問に対して、Generic版のMicroPython入れたらええやんという回答

*1:例:ScanSnap SV600等、6万する。これで300ページスキャンしたとして、1ページあたり200円、1ページ200円ってどんだけ高い情報やねんとなってやめました。

Googleからのアラートメール「保存したパスワードの一部がウェブ上に漏洩しました」

Googleから、「保存したパスワードの一部がウェブ上に漏洩しました」とメールが来て、てっきりgoogleアカウントのパスワードが漏えいしたとの警告と思ってしまった。メールの文書は以下

最初はメール自体がフィッシングか?と思って、「パスワードを確認」も押さなかったのだけど、メールのソースを表示してFrom行を見ると google.comとなっているし、まぁ本物のメールだろうと思って、リンクの方をクリックした、*1
漏えいした可能性のあるサイト一覧が出てきて、ブラウザに覚えてもらっているパスワードのサイト一覧がずらずらと表示された。

上記結果より、googleアカウントのパスワードの漏えいなのではなく、Chromeに覚えさせているパスワード(WebサイトにアクセスするとChoromeが勝手に入れてくれるパスワード)が他人に使い回されているという警告ではないかと推測した(結構ブラウザに覚えてもらっていて楽しているので)(この記事を読んでる人は、この記事をうのみにせずご自身でご確認ください)。リストの大半は管理の甘い開発メンバで共有しているテスト用ID/PWDであった。
だけどまぁ、googleでは同じパスワードをずっと使い続けてきたので、これが良い機会かと思ってパスワードを変更することにしました。

*1:リンクのURLは、 http://passwords.google.com/checkupであった

餃子を作ってみる(按田優子氏のレシピ)

NHK「今日の料理」(プロ直伝)で、按田優子さんによる餃子の作り方をやっていて、皮も簡単にできそうなので作ってみた。味としては、もっちりした皮で旨かった。一方で醤油の分量を間違って、少し塩味が濃くなってしまった。

材料は以下(TVでは20個分で説明していた。今回試作なので半分に減らして餃子10個分)

  • 餃子の皮
    • 強力粉 70g
    • 水 35cc
  • あん
    • 豚肉 50g
    • 白菜 100g (絞ると50gになる想定)
    • 絞りしょうが
    • 醤油(小さじ1/2)

餃子のあんを作る
白菜は100g、塩を振って絞る(反省点:ついついギュウギュウに絞ってしまうが、水気がなくなって餃子を食べた時にジューシーさに欠けてパサついた感じになる。白菜の水分はざるの上で自然に落ちる程度にしておくべきかも)

肉は50g、本来は豚ミンチですが、ミンチがないので、豚小間切れで代用

ミンチ風になるよう包丁でたたく(反省点:包丁研いでなくて切れ味悪いし、叩き足りず、練り足りず、食べた時に餃子の具としての一体感に欠けた)

叩いた肉と絞った白菜をまぜる。ショウガを絞ったのも加える(忘れていた)。あんは練った後冷蔵庫で休ませると(水分が行きわたるのか、脂肪分が硬くなるのか)締まるらしいです(別の番組での説明)(反省点:肉を練らずに、野菜と混ぜようとしているが、今回は叩いた肉でさらに混ざりにくいので、野菜を混ぜる前に、肉だけで十分に練るべき)

皮を作る
強力粉は70g

水は強力粉の半分、35g(レシピ上は35ccだが、液体を少量測るのが難しいのでグラムで代用)

まずは箸でグルグルまぜることで水がまわって段々と固まってくる

一回目こねた状態。こねて休むを繰り返す

まずドーナッツ状にしてから10等分する

10等分したところ。小麦粉をまぶしてくっつかないようにする

丸い団子状から手のひらですこしつぶす

のばしたところ。包んで茹でると形変わるし、真円でなくてもいいだろう。(注意点:のばした皮はくっつきやすいので、十分に打ち粉すべし)

包んだところ。今回水餃子なので、多めのお湯でゆでる。(注意点:すぐにくっつくので離しておくか、小麦粉をまぶす。)(反省点:餃子10個分だけど、10分割がかなりイマイチで不正確。不正確だとどうなるか、、味にばらつきが出る(茹であがりも変わってくる)。いくら手作りといっても、量は均等になるようにすべき。)

水餃子のできあがり(茹で時間は4分~5分)

餃子の味わい

  • 皮は旨い。皮を楽しむには、もっとデカくてもいいかも(10個にせず8個ぐらいでもいいかも)
  • 餃子の中の具は一体感に欠ける。肉と野菜という感じ
  • 具材の味が醤油でおおわれている(醤油の分量を間違えた)
  • 本来のレシピとしては何もつけずにおいしく食べられる配分(醤油の量を間違えなかったら素材の味がさらに活きたはず)

今回の反省点

  • あんにはミンチ肉を使う。ミンチが無ければ豚肉を叩くが、十分に叩かないと餃子の味わいとしての一体感がない
  • あんを練るときは、まず肉だけ練って粘り気を出してから野菜を入れる。野菜を入れてから練ってもまとまらない
  • 醤油をはかり間違った(味が濃くなり過ぎた)
  • 白菜を塩もみする際、水分を絞りすぎない。絞りすぎると餃子を食べた時のジューシーさに欠ける
  • 包む時は、皮やあんが等しく分けられていること。(TVでは、皮と案は同じ重さとの説明)
  • 皮はくっつきやすいので、十分に打ち粉をする

今回の気づき

  • 餃子は皮を作るのが手間と思っていた。TVで紹介された方法では、休ませるのに時間がかかるが、こねてる時間は3-4分程度で済み、もっちり生地ができる。
  • 市販の皮で包む時は水をつけて、しっかり握らないとうまく包めないけど、手作りの皮だとすぐにくっつくので包むのが楽
  • ゆえに、市販の皮で作るより、手作りの皮で餃子を作る方が楽。しかも、もっちりして旨い(今回一人で作って1時間ぐらい)
  • 皮の味わいの楽しむには大ぶりにして、餃子一つに、皮は10g以上を使うのがいいのでは (13gぐらい?)
  • 按田さんのレシピはシンプルで分かりやすい。
    • 餃子の皮は、小麦粉と水が2:1
    • 餃子のあんは、肉と野菜が1:1
    • 餃子の皮とあんは、1:1
    • 餃子の皮は、(こね:1分、休ませ:5分)を3回

まとめ

  • 手作り餃子は思っていた以上に作るのが楽(按田さんレシピのおかげかと)。餃子鍋に向けたn増しも容易
  • あんの作り方が良くなかったせいで、トータルの味わいがいまいち。
  • ケーキ作った方が満足感と報酬感が強い(単に成果物が甘いから??)。

■ご参考URL
プロ直伝! 「ギョーザを極める」 - きょうの料理 - NHK
暮しの手帖(最新号)でも、按田優子さんによる餃子の作り方が掲載されています。
暮しの手帖社 | 暮しの手帖 第5世紀14号

STEVAL-DRONE01用MicroPython拡張モジュールの試作

理解不十分だけど、STEVAL-DRONE01をMicroPythonで制御できるように、加速度センサ(LSM6DSL)のドライバをC言語で作成した。以下は動作させた例

>>> MicroPython v1.16-243-g8c4ba575f-dirty on 2021-11-07; STEVAL-DRONE01 with STM32F401CC

>>> import stdrone
>>> dir(stdrone)
['__class__', '__name__', 'STM32_LED', 'STM32_LSM6DSL', 'STM32_SPI3W']

>>> spi = stdrone.STM32_SPI3W()
>>> sens = stdrone.STM32_LSM6DSL(spi)
>>> dir(sens)
['__class__', 'start', 'get_gyro', 'get_xl']

>>> sens.start(2,2)

>>> sens.get_gyro()
(3, -5, -51)
>>> sens.get_xl()
(867, 4271, 15834)

get_xl()でLSM6DSLの加速度センサの値を取得する。DRONEをほぼ平坦に置いた状態なので、Z軸の1G分が検知されている。ジャイロ(角加速度)は誤差が出ている(置いたままでも0にならない)。
PWMはMicroPythonに実装されているのをそのまま使えるので、これで制御するための下回りはそろった。次は本命の制御プログラムの試作になる。

■追記
DRONEをいろんな角度にして、加速度センサの計測値を確認
DRONEを水平に置いた場合(Z軸で1Gを検知)

(292, -272, 16572)     # 0x40bc 

DRONEを真横に倒した場合(X軸で90度回転、Y軸で加速度を検知)

(-410, 16192, -1770)   #0x3f40

DRONEをつんのめるように倒した場合(Y軸で90度回転、X軸で加速度を検知)

(-16270, -991, 7740)   #0xc072

センサの値は符号付き16bit長なので、本来値域は-32768(0x8000) ~ 32767(0x7fff) かと思えるが、実際の計測値は値域の半分になっている。。なぜだろうか??仕様書を読み直さないと理由が分からない。

■追記
6DOFセンサを初期化する際、サンプリングレートを指定できるようにしているのだが、1,2,3の数値を直接指定するのはあまりよろしくないと思い、クラスの定数を定義した。

>>> sens = stdrone.STM32_LSM6DSL(spi)
>>> dir(sens)
['__class__', 'start', 'HIGH', 'LOW_POWER', 'NORMAL', 'get_gyro', 'get_xl']
>>> sens.HIGH
3
>>> sens.LOW_POWER
1
>>> sens.NORMAL
2
>>>

これで、sens.start(sens.NORMAL, sens.NORMAL)と呼び出すことができる。動作は、sens.start(2, 2)と同じなのだが。。

■追記
時間のある時はずっと飛ばないDroneプログラミングをやっていたが、またヨメから、いつもドローンばっかりやってからに!とえらく怒られた。ちょっと静かにする予定。

プロフェッショナル 仕事の流儀の効果音を作ってみる

子供が遊びでYoutubeの動画を作っていて、某放送局の「プロフェッショナル 仕事の流儀」の効果音を使ってパロディを作りたいと言ってきた。効果音自体ネットにあると思うが、多少アレンジもできるようにと思い、先人の情報を参考に作ってみた。スペアナで見てないし、和音を聞き取れる耳持ってないので、自分が作ったコードが合っているかどうか分からないが、、素人の耳にはかなり近いように思える。使った和音はソ+ラ+レの3音で、音源は、FL-Studioに同梱されているSytrusというFMシンセ、音はプリセットのPiano/Realisticを使用
f:id:chakoku:20211107171108p:plain

SoundCloudにアップしてみた
Stream episode Sound Effect; inspired The Way of the Professional by dune geek podcast | Listen online for free on SoundCloud

SoundCloudにアップすると音圧の波形が出ますが、ネット上には本効果音の音圧の波形を上げている人がいて、それと見比べると減衰が遅いようです。シンセのパラメータをいじれば、減衰を早めるのも可能だけど、、いじり始めるとまたバランスがおかしくなったりするので・・・残る課題はあるが、Ver0.01はこれでFIX