chakokuのブログ(rev4)

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

奇跡のセルフ喫茶店、イチロー

夏の暑い日、休みたいと思って茶店を探していた。が、、近所にはなさそうだった。たまたま見つけた看板があって、セルフ喫茶店、「イチロー」とあった。セルフの茶店??、自動販売機(ベンディングマシーン?)が置いてあるのか?と思って訪問した。
驚いたことに、普通の喫茶店であった。ただ、マスターが常駐していなくて、お客が自分でお湯を沸かしてコーヒーを淹れると。。豆持ち込みでもいいし、お店の豆を使ってもいい。持ち込みかどうかで利用料金も変わるシステムであった。
驚いて店内を見ていると、2Fからマスターが降りてこられて、自分たちが初めての客と分かったので「今回は淹れます」といって、コーヒーを淹れてもらった。昔は喫茶店を経営されていたが、家庭の事情で閉店したものの、再開する声があって、セルフにしたそうだ。なんという画期的なというか、お客を信用しているというか。この場所が客層いいからこういう営業形態がなりたつのかも。マスターに相談必要ですけど、イベントとかにも使えるかもしれません。

f:id:chakoku:20190810145042j:plain
セルフの喫茶店、店内
場所は、中百舌鳥梅町、梅町公園の東側です。

K210が搭載された評価ボード、Sipeed のMaixduinoを買った

64bit RISCコアを2つ、CNN アクセラレータやFFTも内蔵するK210用の評価ボード。おなじみのESP32もボードに乗っていてネットワーク接続も可能。MicroPythonベースのMaixPyで制御可能で、すでに機能てんこ盛りらしく、どれだけ使いこなせるのか?遊べるのか?分からないけど、すぐに売れきれになりそうなのと、高性能の割には安いので買ってしまった。

f:id:chakoku:20190814080917j:plain
MaixPy
MicroPythonで内蔵ハードやTFT、カメラを制御できるようで、とっかかりは楽。とりあえず、、USB/SerialでPCと接続して、シリアルコンソール(TeraTerm)からブートメッセージ等を確認。かなり素っ気ない。。

>>> machine.reset()
&ェイ
   ツj
     [MaixPy] sd_init | SD_CMD0 is FF

 __  __              _____  __   __  _____   __     __
|  \/  |     /\     |_   _| \ \ / / |  __ \  \ \   / /
| \  / |    /  \      | |    \ V /  | |__) |  \ \_/ /
| |\/| |   / /\ \     | |     > <   |  ___/    \   /
| |  | |  / ____ \   _| |_   / . \  | |         | |
|_|  |_| /_/    \_\ |_____| /_/ \_\ |_|         |_|

Official Site : https://www.sipeed.com
Wiki          : https://maixpy.sipeed.com

MicroPython v0.3.2 on 2019-05-15; Sipeed_M1 with kendryte-k210
Type "help()" for more information.

空きメモリを確認500KB??こ、これはかなり少ないのでは。。

>>> micropython.mem_info()
mem: total=45829, current=15489, peak=17007
stack: 1012
GC: total: 518144, used: 13440, free: 504704
 No. of 1-blocks: 103, 2-blocks: 19, max blk sz: 65, max free sz: 15725
>>> gc.mem_free()
504512

https://www.seeedstudio.com/Sipeed-Maixduino-Kit-for-RISC-V-AI-IoT-p-4047.html


宣伝ページで再確認すると、K210(正確には、Sipeedの場合、Sipeed M1 AI Module?)には6MBの汎用SRAMが搭載されているとあるのだが。。

SoC – Kendryte K210 dual core 64-bit RISC-V processor @ 400 MHz with KPU CNN hardware accelerator, APU audio hardware accelerator, 6 MB general purpose SRAM, 2MB AI SRAM memory, and AXI ROM to load user program from SPI flash

実際に動かすには初期化コードが必要ですが、、以下のループでCMOSカメラの映像がリアルタイムでTFTパネルに表示される。このシンプルさ。すばらしい。

while True:
    lcd.display(sensor.snapshot())

描画の遅延も気にならない程の高速で、24fpsぐらい出ているのかも。しかし、、メインのM1チップはかなり熱い。内部でDMAとかバリバリに動かしているのかも。ソース読んでないのでどんな実装か分かりませんが。

■ご参考URL
MaixPyの説明
github.com
https://maixduino.sipeed.com/en/hardware/k210.html

■追記(190901)
ESP32+CMOSカメラの試作で時間が一杯になっていて全く触っていないけど、、これはどうやって遊ぶのだろうか。エッジAIとして使える? とある記事を読んでいると、このボードではAIの学習(誤差逆伝播というやつですか)はできないとあったけど(CPUパワーや動かせるフレームワークの制約により)。

ESP32 WROVER-B を使ってみる(SPI RAM対応版 MicroPython導入)

ESP32+MicroPythonでプログラムしているが、CMOSカメラで画像取得等をするとヒープメモリがすぐに枯渇する。組み込みプログラムではメモリとの闘いなのだが、十分なメモリ空間が簡単に手に入る、ESP32 WROVERだったらどうなのか。。と。

f:id:chakoku:20190814081140j:plain
ESP32 WROVER
ESP32 WROVERはPSRAMが内蔵されたバージョンで、メモリサイズは以下
・SRAM:520KB
・PSRAM:8MB

ファームを焼いていない状態でのブートメッセージ

ets Jun  8 2016 00:22:57

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0x00
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3ffc0000,len:0
load:0x3ffc0000,len:2304
load:0x40078000,len:3788
ho 0 tail 12 room 4
load:0x40098000,len:532
entry 0x4009813c

**************************************
*       hello espressif ESP32!       *
*        2nd boot is running!        *
*            version (V0.1)          *
**************************************
compile time 18:16:58
  SPI Speed      : 40MHz
  SPI Mode       : DIO
  SPI Flash Size : 4MB
Partition Table:
## Label            Usage          Type ST Offset   Length
 0 factory          factory app      00 00 00010000 00100000
 1 rfdata           RF data          01 01 00110000 00040000
 2 wifidata         WiFi data        01 02 00150000 00040000
End of partition table
Loading app partition at offset 00010000
section 0: paddr=0x00000020 vaddr=0x00000000 size=0x0ffe8 ( 65512)
section 1: paddr=0x00010010 vaddr=0x3f400010 size=0x05b64 ( 23396) map
section 2: paddr=0x00015b7c vaddr=0x3ffba720 size=0x01378 (  4984) load
section 3: paddr=0x00016efc vaddr=0x40080000 size=0x00400 (  1024) load
section 4: paddr=0x00017304 vaddr=0x40080400 size=0x126ac ( 75436) load
section 5: paddr=0x000299b8 vaddr=0x00000000 size=0x06658 ( 26200)
section 6: paddr=0x00030018 vaddr=0x400d0018 size=0x325b4 (206260) map
start: 0x400807ac

Initializing heap allocator:
Region 19: 3FFBBA98 len 00024568 tag 0
Region 25: 3FFE8000 len 00018000 tag 1
Pro cpu up.
Pro cpu start user code
nvs_flash_init
frc2_timer_task_hdl:3ffbc564, prio:22, stack:2048
tcpip_task_hdlxxx : 3ffbeca8, prio:20,stack:2048
phy_version: 80, Aug 26 2016, 13:04:06, 0
pp_task_hdl : 3ffc34f0, prio:23, stack:8192

:>enter uart init
uart init wait fifo succeed
exit uart init

IDF version : master(db93bceb)
WIFI LIB version : master(934d079b)
ssc version : master(r283 4d376412)
!!!ready!!!
mode : softAP(32:ae:a4:cc:4d:18)
dhcp server start:(ip: 192.168.4.1, mask: 255.255.255.0, gw: 192.168.4.1)

+WIFI:AP_START


SPIRAM対応版ESP32用MicroPythonを入手
MicroPython - Python for microcontrollers
esp32spiram-20190529-v1.11.bin

ファームの焼き方(一般化ルール)

esptool.py --port <usb_port> erase_flash
esptool.py --chip esp32 --port <usb_port> write_flash -z 0x1000 <firm>

cygwinから焼く場合

esptool.py --port /dev/ttyS11 erase_flash
esptool.py --chip esp32 --port /dev/ttyS11 write_flash -z 0x1000 esp32spiram-20190529-v1.11.bin

焼く前に、ツールが正しく動ているか、無難なコマンドでちょっと確認。以下はchip_id取得コマンドの例

$ esptool.py --port /dev/ttyS11 chip_id
esptool.py v2.6
Serial port /dev/ttyS11
Connecting.....
Detecting chip type... ESP32
Chip is ESP32D0WDQ5 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, BLK3 partially reserved, Coding Scheme 3/4
MAC: 30:ae:a4:cc:4d:18
Uploading stub...
Running stub...
Stub running...
Warning: ESP32 has no Chip ID. Reading MAC instead.
MAC: 30:ae:a4:cc:4d:18
Hard resetting via RTS pin...

大丈夫なようなので、、フラッシュ消去>ファーム書き込みをやってみる。
flash消去

$ esptool.py --port /dev/ttyS11 erase_flash
esptool.py v2.6
Serial port /dev/ttyS11
Connecting.......
Detecting chip type... ESP32
Chip is ESP32D0WDQ5 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, BLK3 partially reserved, Coding Scheme 3/4
MAC: 30:ae:a4:cc:4d:18
Uploading stub...
Running stub...
Stub running...
Erasing flash (this may take a while)...
Chip erase completed successfully in 9.2s
Hard resetting via RTS pin...

ファームを焼いた

$ esptool.py --chip esp32 --port /dev/ttyS11 write_flash -z 0x1000 firm/esp32spiram-20190529-v1.11.bin
esptool.py v2.6
Serial port /dev/ttyS11
Connecting....
Chip is ESP32D0WDQ5 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, BLK3 partially reserved, Coding Scheme 3/4
MAC: 30:ae:a4:cc:4d:18
Uploading stub...
Running stub...
Stub running...
Configuring flash size...
Auto-detected Flash size: 4MB
Compressed 1221600 bytes to 743973...
Wrote 1221600 bytes (743973 compressed) at 0x00001000 in 66.1 seconds (effective 147.9 kbit/s)...
Hash of data verified.

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

ボードをリセットしてブートメッセージを確認、SPI RAM 40mとなっている。こ、、これは、40MBか!!(追記:そんなことはない)

$  cat /dev/ttyS11
ets Jun  8 2016 00:22:57

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0018,len:4
load:0x3fff001c,len:4928
ho 0 tail 12 room 4
load:0x40078000,len:10188
load:0x40080400,len:6736
entry 0x400806e8
I (500) spiram: Found 64MBit SPI RAM device
I (500) spiram: SPI RAM mode: flash 40m sram 40m
I (500) spiram: PSRAM initialized, cache is in low/high (2-core) mode.
I (506) cpu_start: Pro cpu up.
I (510) cpu_start: Application information:
I (515) cpu_start: Compile time:     07:47:57
I (520) cpu_start: Compile date:     May 29 2019
I (525) cpu_start: ESP-IDF:          v3.3-beta1-268-g5c88c5996
I (532) cpu_start: Starting app cpu, entry point is 0x40082e48
I (0) cpu_start: App cpu up.
I (1397) spiram: SPI SRAM memory test OK
I (1398) heap_init: Initializing. RAM available for dynamic allocation:
I (1398) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM
I (1404) heap_init: At 3FFB9DD0 len 00026230 (152 KiB): DRAM
I (1411) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM
I (1417) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
I (1424) heap_init: At 40097B1C len 000084E4 (33 KiB): IRAM
I (1430) cpu_start: Pro cpu start user code
I (106) cpu_start: Starting scheduler on PRO CPU.
I (0) cpu_start: Starting scheduler on APP CPU.
MicroPython v1.11 on 2019-05-29; ESP32 module with ESP32
Type "help()" for more information.
>>>

replから再確認

>>> gc.mem_free()
4093248
>>> gc.collect()
>>> gc.mem_free()
4093344

409K?? 40MのRAMはどこに割り当てられているのやら。。
(追記:あまりに気が焦って桁を間違っている。
(/ 4093344.0 1024 1024) // lisp S式 (Emacs使ってるので)
3.903717041015625
3.9MBで、約4MB使える状態で立ち上がっている。)

起動した直後のヒープの状態

>>> micropython.mem_info(1)
stack: 752 out of 15360
GC: total: 4098240, used: 5776, free: 4092464
 No. of 1-blocks: 45, 2-blocks: 13, max blk sz: 264, max free sz: 255770
GC memory layout; from 3f817740:
00000: h=hhhhMh=DBhhDBBBBhhh===h===hhh==h==============================
00400: ================================================================
00800: ================================================================
00c00: ================================================================
01000: =========================================Bhhh=BDhhLhhhBh===h=h=B
01400: ShTh=h=h===hhh=h=BSh===hThh=h=BhBhh==...h=......h=..............
       (3996 lines all free)
e8800: ............

マークの意味は以下

.	フリーブロック
h	ヘッドブロック
=	テイルブロック
m	マーク付きヘッドブロック
T	タプル
L	リスト
D	辞書
F	浮動小数点
B	バイトコード
M	モジュール

引用元:
https://micropython-docs-ja.readthedocs.io/ja/latest/reference/constrained.html#reporting

ESP32のFlashファイルシステムにファイルを転送する。ampyを使ってみる。

GitHub - pycampers/ampy: Adafruit MicroPython Tool - Utility to interact with a MicroPython board over a serial connection.
これまではIDEでファイル転送を行っていたけど大がかりなので、コマンドラインでさくっと使えるampyでファイル転送等を行う予定。テスト操作

 pip3 install adafruit-ampy

$ ampy -p /dev/ttyS11  get boot.py
# This file is executed on every boot (including wake-boot from deepsleep)
#import esp
#esp.osdebug(None)
#import webrepl
#webrepl.start()


■ご参考
cygwinでシリアルポートのデバイス名の判断方法
cygwinで/devと打ち込むとデバイス一覧が出て、ttyS11だろうとあたりを付ける。合っているか確認のため、cat /dev/ttyS11としてボードをリセット、起動メッセージがずらずら出たのこれでよし

$ ls  /dev
clipboard  dsp     null    scd0  sda3  sdb3    stdin   urandom
conin      fd      ptmx    sda   sdb   shm     stdout  windows
conout     full    pty0    sda1  sdb1  sr0     tty     zero
console    mqueue  random  sda2  sdb2  stderr  ttyS11

cat /dev/ttyS11


https://micropython-docs-ja.readthedocs.io/ja/latest/index.html

iPhoneアプリを作る(目標)

  これまでAndroidiPhoneを使ってきて、中途半端なお試しアプリは作ったが、公式サイトに登録してダウンロードしてもらうのは作ったことがなかった。仕事の関係で、スマフォアプリデプロイも担当することになり、細かいことがよく分からないので、仕事を離れて自分の権限で(失敗してもいい)アプリデプロイできるよう、ミニマム機能に絞ったスマフォアプリを作ることにした。手元にはiPhoneしかないので、SwiftでiPhoneアプリを作ることを目標としたい。昔買って途中で読むのをやめた、本気で作り始める、、というやつをもう一度引っ張り出してへなちょこだけど、公式サイトからDLできるアプリを作る予定。これは仕事にも繋がっているので途中で飽きてやめるわけにはいかない。

本気ではじめるiPhoneアプリ作り Xcode 10.x対応 (Informatics&IDEA)
 

途中で飽きることなく、無事公開に至ったら、作り方とかソースとかはすべて公開するつもりです。

 

補足:

 この記事で自分のサイトの記事の数は800になったそうだ。2006年から使い始めたのだけど、多いのか少ないのか。。一般的な人の記事量が分からず。

以下が最初の投稿()。12年間(11年間?)、はてなダイアリーを使わせてもらったことになる。

茶国 Rev3へようこそ - chakokuのブログ(rev4)

はてなダイアリーから引っ越してきた→Bloggerへ引っ越し

はてなダイアリーが終わるとかメールが来て、ほっといても勝手に引っ越ししてもらえそうだったが、自分でやってみた。

はてなダイアリーと比べて、はてなブログの方がなんか画面が広々している印象。しかーし!カテゴリーとかどうやったら付くのかとかよくわからず。新しい校舎に引っ越しして、勝手が分からずウロウロしている中学生のような感じでございます(そんなフレッシュではないか。。俺)。

 

追伸:

カテゴリーを付けるには、編集中の右側のフォルダアイコンをクリックと分かった。

はてなダイアリーから、はてなブログに移ってみて、アクセス分析とか、総コメント数とかの情報が提示されるようになっていろいろ気づきがありました。

ちなみに、、記事数は800で、コメント数は386だそうで、コメントは対話形式で記事に偏りがあるものの、平均で言うと、記事2本にコメント1つの割合で、、そう思うとコメントって結構多いものだなーと思うのでした。辺境のブログなためか、幸いなことに、炎上したり、叩かれたりすることがないのでありがたいです。

一方で、、無料で使わせていただいて、意見言える筋合いではないですが、、はてなダイアリーよりはてなブログの方が宣伝があちこちに出てきますね。。有料にしたら宣伝でないとなってるけど、月500円だと、レンサバの方が安いのでは。。と。。

 

はてながこれからずっと続くかどうか分からないというのもあるし(と言いながら、自分がネット市民である間は、はてなは大丈夫だろう。。自分は56歳)、記事ポストのたびに出てくる広告が辛いというのもあり、bloggerへの引っ越しを考えてます。比較している記事があり、bloggerは無料だけどコミュニティーがない、自由度高いけど技術必要、一方、はてなは無料枠だと宣伝入るけど、シンプルで使いやすくて、アクセスも伸びやすいというような主旨です。自分はへなちょこでもエンジニアなので、、bloggerでの使いこなし技術ぐらいは分かってるレベルでないと他でもやっていけないだろうというのと、基本自分用の記録+ソース公開、ご紹介用なので、大勢に来てもらわなくてもいいやというわけで、、基本的にbloggerに引っ越す予定です。

 

メモ:はてなダイアリーへのアクセスURL

http://d.hatena.ne.jp/chakoku/admin

BloggerのURL(chakoku(rev5))

https://chakoku.blogspot.com/

Aerophoneのレッスン@関西(ご参考)

ローランドのAerophone(AE10)を買って最初のうちは物珍しさでぴーひゃらと吹いていたけど、段々と腕前が上達しない状況になって、どうやって練習したらいいのかもわからずモチベーションも落ちていた。
レッスンに行こうかと考えたけど、関西ではAerophone専用のスクールがほとんどなく(最近は2か所あり)、どうやって習えばいいのやらと思っていた。
で、、イチかバチかで、Sax教室の先生に連絡して、「Saxとほぼ同じような電子楽器なんですがレッスンしてもらえますか?」と相談したところ、引き受けてもらうことができて、今は月一で通っています(練習時間があまり取れないので、自分には月一が妥当かと)。
レッスン始めてから4か月程度ですが、、プロの先生に習うことで、独学でやっていたのと比べて格段に上達しました(と思っている)。さらに、人(先生)に聞いてもらうということで練習のモチベーションも上がった。ひとまずレッスンの期間は1年間と決めているのであと6か月ぐらいですが、、楽器というものは、お金払って先生に習うべきと痛感した次第です。
ご指導を受けた点

  • 吹き方(アンブシュア?口の使い方?)がクラリネットになっている。
  • 腹式呼吸とはお腹に息を入れるのではない(お腹は内臓が入ってる)。背中も広げることで肺を大きく広げる。
  • ppでも息は太く
  • タンギングは息は吹いたまま(息は止めない)、3種類のタンギングを正しく使えるように
  • B♭は2つを同時に押さえる
  • クレッシェンド、デクレッシェンドは階段作らない
  • 息で拍子を取らない
  • jazzでは表拍長く、裏拍短く強く(強いタンギング
  • サックスハノン本の12キーメジャースケールの運指をマスターすること

■ご参考
大阪で受講できるAerophoneのスクール
島村楽器 梅田ロフト店 (天王寺店でもやっているようです)
https://www.shimamura.co.jp/shop/umeda/instructor/20181209/5120
月3回

トート音楽院 エアロフォンコース 梅田校
http://www.thoth.co.jp/course/%E6%B8%85%E6%B0%B4%E7%8E%B2%E5%A5%88-%E3%82%A8%E3%82%A2%E3%83%AD%E3%83%95%E3%82%A9%E3%83%B3%E3%82%B3%E3%83%BC%E3%82%B9/
月1回だが、平日

梅田ロフト店の体験レッスンに行った方の記事(勝手にリンク)
「ど素人がエアロフォンを始めたよ♪」moomin様
http://aerophone.net/2018/08/30/%E8%A1%8C%E3%81%A3%E3%81%A6%E3%81%8D%E3%81%BE%E3%81%97%E3%81%9F%E5%B3%B6%E6%9D%91%E6%A5%BD%E5%99%A8%E3%81%AE%E7%84%A1%E6%96%99%E4%BD%93%E9%A8%93%E3%83%AC%E3%83%83%E3%82%B9%E3%83%B3%EF%BC%81%EF%BC%81/

 「マンガは描ける!絵が描けない人でも」の備忘録

正月休みに、「マンガは描ける!絵が描けない人でも」を読んだ。人物を描けないなら、自分でポーズとって写真に撮ってトレースしようとかそういう話だったのだけど、、これだけは練習しろと熱い段落があったのでメモ

頬〜顎のラインについて

  • 一番難しく、やり甲斐があり、重要なのが「頬〜顎」のライン
  • 「頬〜顎」のラインと、両目、口のトライアングルを上手くバランス取って描けるかで絵の印象は全く変わる
  • 何度も書き直しをして「自分の気に入る絵柄」を身につけていくしかない

やまなしレイ.マンガは描ける!絵が描けない人でも(Kindleの位置No.264-267)..Kindle版.

髪型について

  • どんな髪型にしようがその人の自由
  • 逆に言えば、「このキャラクターはどうしてこの髪型をしているのか」という【意味】が必要

やまなしレイ.マンガは描ける!絵が描けない人でも(Kindleの位置No.283-286)..Kindle版.