chakokuのブログ(rev4)

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

COMANDANTE コーヒーミルを買った

マツコさんのTVでCOMANDANTEコーヒーミル(名称は、HAND GRINDERのようだ)が紹介されていて、興味を持った。Youtubeでも結構商品レポートが掲載されていて、そんなにいい商品なのかと思っていたが、国内はどこも売り切れで買えそうになかった。いろんなサイトを見てるうち、海外の通販サイトではまだ在庫があったので注文してみた。普通便で頼んだので10日以上かかって届いた。
箱を開けてみると、ダンボールの部材が一部ちぎれており、長旅の苦労が偲ばれる(ドイツ(メーカー)→アメリカ(販売店)→日本)。。でもまぁ商品は無事。

組み立てたところ。かなり重いです。コーヒーミルと豆を持ってキャンプに行こうという記事もありますが、このミルは重すぎて、オートキャプでないと持っていく気にはならんでしょう。コーヒーミルの命と言える刃の部分は手が切れそうなぐらいに鋭利になっています(マニュアルにも、ブレードで手を切るから気を付けろと書かれている)。

実際に豆を入れて挽いてみました。これまではハリオのセラミック刃のやつでした。ハリオと比べて、挽き心地はまぁ確かにスムーズで力もそれほどいらず楽ではありますが、値段相応の挽き心地か?と言われると、それほどではありません(コマンダンテファンの方には申し訳ないけど)。時々豆の固い部分にあたるとやっぱり引っ掛かります。ただ、、このミルのすごいのは粒度の揃いっぷりと思います。ハリオのセラミックで挽くとどうしても、粒度にばらつきがでるのですが、コマンダンテだと全体的に粒度が揃っています。これは素晴らしい。

で、、コーヒー*1を飲んでみた印象ですが、、これは主観なので信頼できませんが、、味は旨い。まとまった味で仕上がる印象です。本当はハリオとコマンダンテの両方で挽いて、目隠ししてテイスティングすべきでしょうけど。まぁここは趣味の世界なので。。味がまとまってるように感じるのは、豆を挽いた粉の粒度が揃っているためと思います(主観と想像)。あるいは金曜の夜ということで浮かれ気分のせいかも。
総じて、値段に見合った挽き心地とまでは感じませんでしたが、豆を挽いた粉の粒度の揃いっぷりと飲んだコーヒーの味わいに違いを感じたのでまぁそれだけの価値はあるのかなーという印象でございます。
コマンダンテは収納がちょっとやっかいで、、ハリオのように引っ掛けることができない。適当ですが、ゴムバンドで引っ掛かるようにしてみました。もうちょっと使っていないとこのミルのすごさがわからないのかも。

*1:情熱の店長;ヤスナガコーヒーのブレンド

こだわりの店;ヤスナガコーヒー店で豆を買う

休みの日は、豆を挽いてコーヒーを飲んでます。いろんな店の豆を試しながら飲んでみたいので、まずはブレンドを買って飲み比べています。ストックが無くなったので、JR放出駅から10分ぐらいの所にある、ヤスナガコーヒー店で豆を買ってみた。

ここのご主人はめちゃくちゃこだわってる人(コーヒー店のオーナーは大抵なんらかのこだわりがありそうですが)で、自分が初めてのお客(これまでこの店で一度も買った事がないお客)と分かると、取り扱っているコーヒーについて一通り説明をしてくださいました。いつも通り、100gのブレンドを買いました(ブレンドは400円。一般的な値段かと)。

左は買った豆の状態。多少強めのローストのようです。どれも豆は綺麗な形です(自分は、豆の選別とかはせず、買った豆は何も考えずすべて挽いて飲んでます)。

ドリップで淹れてるところ。ご主人曰く、昨日ローストした分とのことでしたが、さすがに新鮮な豆と思われ、お湯をそそぐと大きく膨れ上がりドームができた。。すばらしい。

で、、肝心の味ですが、いつもの分量で入れると少し薄めになりました。これは店長から、70℃以下で抽出すると香り、甘みがよく出ると説明を受けたのでその通りにしたためと思われ、普段90℃ぐらいで淹れているのに比べて、温度が低いためと思われます。初回は薄めに出てしまったので、2回目は80℃ぐらい*1で、すこしお湯の量を減らしました。この結果、苦みの効いたしっかりした味になりました。確かに、普段よく飲む苦みの効いたコーヒーの味に加え、ロースト香というか、コーヒー味の上にもう一つ何かが乗っかている味となりました。これが店長のおっしゃる甘みなのかどうか、、そこまではちと分からず。苦みが多少強い味ですが、すっきりした味わいで何杯も飲みたくなる味でした。
これまで飲んだ店のコーヒーとの違いは分かるけど、それが旨さなのかどうかはもうちょっと飲まないと分からないです。すみません。ロースト香が残る?ローストしたての豆がベストなのか、あるいは、数日置いてから飲む方が豆の状態も落ち着くのか、、、そのあたりは経験不足なので分かりません。ですが総じて、、すっきりした味で、苦み強めだけど胃にはどっしりこず、すっと体に入り何杯も飲める、、、そんな感じです。と言いながら自分はモカとかの酸味派なので、もうちょっと酸味が強い方が好きではあります。次回はモカブレンドか何かを買おうと思います。

■ご参考URL
ヤスナガコーヒー店
http://www.amai-cafe.net/
JR学研都市線、放出駅から南へ10分ぐらい。通販もあるようです。

安永氏によるコーヒードリップ方法
http://www.amai-cafe.net/howto.html
安永氏のお勧めは、65℃で抽出して、飲むときに温める方法らしいです。温めると香りが落ちるのでは?と思いますが、、安永氏としては、低温抽出で香りを十分だしておけば、温めてもOKということなんでしょう。。多分

■追記(181111)
自宅でコーヒーを飲むのは週末だけなので、買った豆もそんなに早くには消費できず、2週間目ぐらいで使い切る感じです。で、その後の味の変化ですが、買ったばっかりの時は、普段飲んでるコーヒーの味にもう一つ乗っかっている味があると書いていましたが、やはりこれはロースト風味のようで、2週間経過したら、その味はほとんど感じられず、苦みのよく感じられる普通のコーヒーの味になりました。「普通の」と書くと大したことない味のように伝わるかもしれませんが、細かい風味については雑味がなくてシンプルなすっきりした味です。飲んでも体にどっしり来ないですっと体に入る感じはあります。あくまで主観ですけど。まぁあの店主の人となりを思いながら飲んでいるという感じでしょうか。。

*1:温度計電池切れのため計測できず

有馬玩具博物館で買った煙出し人形

明石大橋を渡ってみようと家族で小旅行をして、途中有馬に寄った。たまたま見つけた有馬玩具博物館で、煙出し人形を買った。煙出し人形とは、人形の中にお香を入れて香りを楽しむというものらしい。いろんな大きさの人形があったけど、でかいのは場所も取るしということで、一番小さいのを買った*1。人形の口からお香の煙が出るのでしょう。ドイツ製。

左の写真は、人形の上下を分割したところ。胴体の部分にお香を置くように金属の受け皿が付いてます。お試しのお香も3つ付き。

こういった香りもの、しかも、火を使うものはヨメサンに見つかると、かなり怒られるので、ヨメの不在中に使ってみた。左は台座にお香を置いたところ。結構煙が出ています。

人形の口からはタバコを吸っているような煙がもわーっと立ちのぼってなかなかええ感じです。が、、肝心のお香の香りですが、、煙がよく出るようにと視覚的効果を狙ってか、焦げ臭(いぶし臭?)が強くちょっと自分には合わない。もうちょっと甘みの強い香りが好みなのだが。。日本製のお香を焚くといい感じになるかも。
ヨメが帰ってくるまでには片づけて、しかも香りも消しておかないとばれるのであまり楽しんでいる余裕はないのであった。

■ご参考URL
有馬玩具博物館
http://www.arima-toys.jp/

*1:こっそり買うつもりがヨメに見つかって、少し怒られた。自分はこういう木製の手作り品にめっぽう弱く、一度手に取ると買わずにはいられない

エアロフォンのファーム更新

ぼちぼち練習しているエアロフォンですが、最新版ファームが2018/07にリリースされており、Ver.3.00まで上がっている(音色が増えたのが大きな特徴)。ちなみに、、自分が持っているエアロフォンのバージョンはVer.2.11。普段はアルトサックスしか使っていないので、最新版ファームに上げても特にメリットもないけど、まぁ安定動作のためには最新版が良かろうということで。。

  1. まずローランドのダウンロードサイトに行って、Ver3.00をダウンロード
  2. 圧縮されたファイル;ae10_sys_v300.zipがダウンロードされるので、これを展開、自分のPCではダウンロードフォルダの下*1に更新用ファーム(Ver.3.00)が展開された。
  3. エアロフォンとPCをUSBケーブルで接続、オクターブキー「−2」を押しながら電源投入、エアロフォンの液晶パネルで「Waiting」と表示されるのを待つ
  4. PCでAE-10のドライブが認識されるので、先ほど展開した、ae10_up.binをAE-10ドライブのフォルダにコピー
  5. エアロフォンの表示が「Finished」になるのを確認。PC側でAE-10ドライブを取り出し操作、USBケーブルを抜く。
  6. エアロフォンの電源をOff/Onする。バージョンが3.00になったのを確認。
  7. 作業終わり。

バージョンを上げて気づいた事。設定が戻っている(工場出荷状態に近い)。自分はエアロフォンを使いこなしているレベルには達していないが、やはり細かい動作が変わっている(マウスピースによる音程の上下とか)。また思い出しながら戻さないといけない。細かい点だけど、やっぱり微妙なニュアンスが変わってしまうので、ファーム更新に先立ち、設定パラメータは必ずメモすべき。

追記:工場出荷に戻ったのではなく、Ver3に上げると、BiteSensor関連の設定が一旦OFFに戻るらしいです。

■関連サイト
ローランド AE10 ファームダウンロードサイト
https://www.roland.com/jp/support/by_product/aerophone_ae-10/updates_drivers/7afd8d59-0793-4d49-a9f1-505e124c57d0/

Aerophone AE-10パラメータ設定の記事
https://sax-players.net/aerophone-setting/

https://sax-players.net/blog-170309/

■メモ
昔見たと思われる記事や解説サイトから、、おおよそ以下のような設定だったかと推測。
BiteControl:PIT2
BiteAdjust:5
BiteSense:30

■追記
なぜByteCtrlの設定が電源Offすると無効になる(初期設定に戻る)のか??疑問だった。マニュアルを読むと、BiteCtrlはシステム設定ではなく楽器ごとのトーン設定なので、ユーザ・トーンとして保存操作が必要のようであった。
(これはVer3からの仕様??)
カスタマイズしたトーン設定を保存するにはMENUボタン長押しする。。(マニュアルより)

BiteCtrl:
  PIT1:リードをくわえる強さでピッチを下げる
        (saxの動作)
  PIT2:リードをくわえる強さでビブラート
        (WindowSynthのビブラート動作)

VibSens: PIT2のかかりやすさ
PitDown: ピッチの下がり具合 
PitUp: ピッチの上がり具合 

BiteAdjust: バイトセンサーの基本状態設定
BiteSens:   バイトセンサーの感度(効きやすさ)

■追記(181020)
安定しているならファームを変えるなという経験則もあり、今回の場合は特に音色を増やしたいという希望もなかったので、ファームを変えない方がよかったのかも。しかし、ずっと古いファームを使い続けているとメーカのサポートもされなくなるのでどこかで最新に更新は必要なのだが。

*1:C:\Users\\Downloads\ae10_sys_v300\ae10_up.bin (には自分のログイン名が入ってる)

nrf51822の割り込みについて

nrf51822の割り込み制御ブロック(NVIC(nested vector interrupt controller)の仕様書がないと思っていたらやはり同じような質問がなされていて、Cortex-M0のNVICはARM標準アーキだから、ARMの仕様書を見ろということらしい。URLは以下

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0497a/CIHIGCIF.html

Interruptを有効にするフラグは以下の様で、多分各ビットが割り込みNoに対応してEnable/Disableを管理するのだろう。。と

0xE000E100	ISER	RW	0x00000000	Interrupt Set-enable Register

nrf51822でNVICが配置されているアドレスが何なのか?仕様書を探しても見つけられず。また同様に、RTC/Counterの割り込み番号がどれなのか?も見つけられず。結局、nordicが提供するライブラリ(system_nrf51.h)のヘッダファイルから、以下と判断

  RTC0_IRQn                     =  11,              /*!<  11  RTC0 */
  RTC1_IRQn                     =  17,              /*!<  17  RTC1 */ 

NVICの番地が分からないのだが、、CortexMに連結されているとするなら、、0xE000E100と思われる。

■追記
最終的には、nrf51822のRTC(RealTimeCounter)と割り込み(NVIC)による組み合わせで1秒周期Lチカできるプログラムが組めた。NVICのレジスタの番地が分からなかったが、これはARM Cortex-M0のコア内のハードなので、標準仕様と同じであった(0xE000E100)。また、RTCが起こす周辺IO割り込みベクタが何番か分からかなった件は、上記system_nrf51.hの通り、RTC0は11番であった(ソース必要ならDL可能にしますが、、こんなマイナーなソース要らないですよね)。ひとまず、シリアル通信、割り込みプログラミングまでできたので、ボチボチ俺VTLのポーティングに取り組む予定。。それには、俺VTLの整数仕様を従来のshort(16bit)からint(32bit)に変更が必要(俺VTLでマイコンの周辺IOレジスタを叩けるようにするたため)。

■ご参考URL
以下のリストにもnrf51XXXの割り込みベクタ一覧が書かれている。
https://github.com/pfalcon/cortex-uni-startup/blob/master/nrf51/nrf51.lst

メモ:Cで書いたStartUp
https://github.com/pfalcon/cortex-uni-startup/blob/master/startup.c

nrf51822のLチカをタイマー(RTC)と割り込みで実装してみる

前回nrf51822(micro:bit)でライブラリを使わずLチカを実装した。チカチカせるのはWAITループでぐるぐる回していた。サンプルソースのレベルならこれでOKだけど、実用的なプログラミングではぐるぐる回りしていると、ボタン押下等のイベントが取れないので、タイマ割り込みでチカチカさせる必要がある。
というわけで、SysTickと呼ばれるTimerハードと割り込みプログラミングでLチカを実装してみる。

少し検索していると、SysTick自体のハードは無いそうだ。だからカウンタ(割り込み)で代用しているらしい(らいしというのは、自分がタイマ周りを完全に理解できていないため)。

さらに調べると、、カウンタにTICKイベント、TICK割り込みが存在して、TICKが立つのは、カウンタ変数[COUNTER]が加算されるタイミングらしい(仕様書より)。

■参考にしたライブラリソース
https://github.com/NordicSemiconductor/Nordic-Thingy52-FW/blob/master/external/sdk13/components/drivers_nrf/systick/nrf_drv_systick.c

(ローカルフォルダ)
~/tech/uc/nrf51822/nRF5_SDK_12.3.0_d7731ad/components/drivers_nrf/systick/

■割り込み駆動にしてみるが割り込まれない

https://github.com/goofacz/cortex-m-minimal-c

nRF51822(micro:bitのマイコン)でシリアル通信

micro:bitのボードに対してランタイムを使わず素のマイコンにプログラムを書き込んで動かす取り組みを行ってます。前回はLチカができて、次はシリアル通信の実装に取り組んでます。
シリアルはデバッグ機能を提供しているMKL26Z128VFM4というマイコンを介して通信可能で、そもそもこのMKL26Z128VFM4というマイコンはJ-LINKのデバッグ手段として稼働しています(と理解しています)。J-LINKが仮想シリアルを世話してくれているので、micro:bitの本体のマイコンであるnRF51822のシリアルがJ-LINKを介して、USBでPCと接続され、仮想COMポートが実現され、TeraTerm等でシリアル通信ができるというわけでございます。

以下が動作確認したソース。J-LINKの部分はまったく考慮せず、ただ、micro:bitの回路図が示す通り、RxD:P0.25 , TxD:P0.24となるようにGPIOとSerialを設定して、SerialのRx/Txを実装しました。割り込みプログラミングではないので、滅茶苦茶早くキーを叩くと文字化けします。最低限Lチカとシリアルが動いたので、少しづつ肉付けしていけば、そのうち俺インタープリタも乗るはず。。多分。

#include <stdio.h>
//#include <stdlib.h>
//#include <stdint.h>


#define GPIO_BASE 0x50000000
#define GPIO_PIN_CNF_BASE 0x700
#define GPIO_OUTSET 0x508
#define GPIO_OUTCLR 0x50C

#define GPIO_PIN_3   3
#define GPIO_PIN_4   4
#define GPIO_PIN_13  13
#define GPIO_PIN_24  24
#define GPIO_PIN_25  25

#define GPIO_PORT_H 1
#define GPIO_PORT_L 0

#define GPIO_SETUP_OUTPUT 1
#define GPIO_SETUP_INPUT  0

#define UART0_BASE 0x40002000
#define UART0_BAUDRATE 0x524
#define BAUD38400 0x009D5000

#define UART0_STARTRX 0x000  // Start UART receiver
#define UART0_STARTTX 0x008  // Start UART transmitter
#define UART0_PSELTXD 0x50C  // Pin select for TXD
#define UART0_PSELRXD 0x514  // Pin select for RXD
#define UART0_RXDRDY  0x108  // Data received in RXD
#define UART0_TXDRDY  0x11C  // Data sent from TXD
#define UART0_ENABLE  0x500  // Enable UART

#define UART0_RXD 0x518 // RXD register
#define UART0_TXD 0x51C // TXD register

#define UART_WAIT    0
#define UART_NO_WAIT 1

#define TX_PIN GPIO_PIN_24
#define RX_PIN GPIO_PIN_25

void uart_setup(void);
void uart_send(char);
void led_blink(void);
int wait(int);
void led_setup(void);
void gpio_set(int, int);
void gpio_setup(int, int);
char uart_recv(int);



/*********************************************************************
*
*       main()
*
*  Function description
*   Application entry point.
*/
void main(void) {

  char ch;

  led_setup();
  uart_setup();

  printf("Hello World!\n");

  uart_send('>');

  while (1){
    ch = uart_recv(UART_NO_WAIT);
    if(ch == 0){
      ;
    }else if((ch == '\n')||(ch == '\r')){
      uart_send('\r'); 
      uart_send('\n');
      uart_send('>');
    }else{
      led_blink();
      uart_send(ch);
    }
  } 
}

void led_setup(void){

   gpio_setup(GPIO_PIN_4,GPIO_SETUP_OUTPUT);
   gpio_setup(GPIO_PIN_13,GPIO_SETUP_OUTPUT);

   gpio_set(GPIO_PIN_4,GPIO_PORT_L);// pin_4 to L
   gpio_set(GPIO_PIN_13,GPIO_PORT_H);// pin_13 to H

}

void led_blink(void){
  static int state = 0;

  if(state == 0){
    gpio_set(GPIO_PIN_13,GPIO_PORT_H);
    state = 1;
  }else{
    gpio_set(GPIO_PIN_13,GPIO_PORT_L);
    state = 0;
  }
}


void uart_send(char ch){

   unsigned int * addr;

   addr = (unsigned int *)(UART0_BASE + UART0_TXD);
   *addr = (unsigned char)ch;

   addr = (unsigned int *)(UART0_BASE + UART0_TXDRDY);
   while(*addr != 1){
     ;
   }
   *addr = 0;  // clear TXD Ready 
}

char uart_recv(int wait_mode){

   unsigned int * addr;
   char ch;

   addr = (unsigned int *)(UART0_BASE + UART0_RXDRDY);
   if((*addr == 0) && (wait_mode == UART_NO_WAIT)){
     return 0;
   }
   while(*addr != 1){
     ;
   }
   *addr = 0;
   addr = (unsigned int *)(UART0_BASE + UART0_RXD);
   ch = *addr;
   return ch;
}


void uart_setup(void){

  unsigned int * addr;
   unsigned int flg;

   // set TX_PIN as output
   gpio_setup(TX_PIN,GPIO_SETUP_OUTPUT);

   // set RX_PIN as input
   gpio_setup(RX_PIN,GPIO_SETUP_INPUT);

  // set PinNo for TXD
  addr = (unsigned int *)(UART0_BASE + UART0_PSELTXD);
  *addr = TX_PIN;       // p0.24 for TXD

  // set PinNo for RXD
  addr = (unsigned int *)(UART0_BASE + UART0_PSELRXD);         
  *addr = RX_PIN;         // p0.25 for RXD

  // set baudrate
  addr = (unsigned int *)(UART0_BASE +  UART0_BAUDRATE);
  *addr = BAUD38400;   // Baud38400 0x009D5000

  // UART0 enable
  addr = (unsigned int *)(UART0_BASE +  UART0_ENABLE);
  *addr = 4;

  // START TX
  addr = (unsigned int *)(UART0_BASE +  UART0_STARTTX);
  *addr = 1;

  // START RX
  addr = (unsigned int *)(UART0_BASE +  UART0_STARTRX);
  *addr = 1;

  // Clear RXDRDY
  addr = (unsigned int *)(UART0_BASE +  UART0_RXDRDY);
  *addr = 0;

}

//******************************************************

void gpio_setup(int port_no,int dir){

   unsigned int * addr;

   addr = (unsigned int *)(GPIO_BASE + GPIO_PIN_CNF_BASE + port_no * 4);
   if(dir == GPIO_SETUP_OUTPUT){
     *addr = 0x1;   // dir:output
   }else{
     *addr = 0x0;   // dir:input
   }
}

void gpio_set(int port_no,int level){

   unsigned int * addr;

   if(level == GPIO_PORT_H){
     addr = (unsigned int *)(GPIO_BASE + GPIO_OUTSET);
   }else{
     addr = (unsigned int *)(GPIO_BASE + GPIO_OUTCLR);
   }
   *addr = (1 << port_no);
}


//***************************************

int wait(int rate){
  int i,j;
  for(i=0;i<rate;i++){
      for(j=0;j<0xFF;j++){
      ; // nop
    }    
  }
}