電子趣味の部屋

電子系のガジェットやアプリ開発等の趣味の話題を書いてます

Genuino 101 (Arduino 101) の加速度センサを使ってみる

今回は簡単にGenuino 101 (Arduino 101)の加速度センサを使ってみました。

必要なライブラリは CurieIMU です。
このライブラリはボードマネージャからGenuino 101環境のインストールが終わっていれば、ライブラリをインクルードからインクルードできます。

CurieIMU.begin()で加速度センサを有効化します。
CurieIMU.readAccelerometer()で加速度センサの値を取得できます。

加速度センサのX軸の値をLCDに表示するプログラムを書いたので、参考にしてください

// CurieIMU.hをインクルード
#include <CurieIMU.h>
// 汎用LCDのライブラリ
#include <LiquidCrystal.h>

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

void setup() {
  lcd.begin(16, 2);              // start the library
  lcd.setCursor(0,0);
  lcd.print("Accelerometer"); // print a simple message
  // 加速度センサ開始
  CurieIMU.begin();
}

void loop() {
  char work[32];
  int x = 0, y = 0, z = 0;
  // 加速度センサの値取得
  CurieIMU.readAccelerometer(x, y, z);
  lcd.setCursor(0,1);
  sprintf(work, "X=%6d", x);
  lcd.print(work);
}

Genuino 101

Genuino 101

Genuino 101 (Arduino 101)買いました

ちょっと遅くなりましたが、Genuino 101 (Arduino 101)を買いました。
商標問題で色々あり、アメリカではArduino 101ですが、日本ではGenuino 101という名前になっています。

まだサンプルスケッチのBlink(Lチカ)で動作確認しかしてませんが、スペック的にはいろいろ遊べそうです。

スペックの概要は以下の通りです。

CPU Intel Curie
動作電圧 3.3 V (5 Vトレラント)
推奨入力電圧 7-12 V
最大入力電圧 7-20 V
デジタル入出力端子 14 本 (内 4 本がPWM出力可能)
アナログ入出力端子 6 本
I/Oピン最大出力電流 4 mA
フラッシュメモリ 196 KB
SRAM 24 KB
動作周波数 32 MHz
特徴 BLE(Bluetooth Low Energy)
6軸の慣性計測装置(3軸の加速度センサと3軸のジャイロセンサ)
サイズ: 68.6 mm × 53.4 mm

このCPUは Intel Curie となっており、x86コアなので、インラインアセンブラアセンブラを使ってちょっとしたチューニングをするのも面白いかもしれません。

またシールドを用意しなくても、標準でBluetoothや加速度センサとジャイロセンサが搭載されているのも遊べるポイントです。

Arduino自体も現在標準機扱いのUNOの後継として位置付けているようなので、これから色々試してみようと思います。

Genuino 101

Genuino 101

Flash Air (W-03)をIPアドレス固定で無線LANのアクセスポイントに接続する方法

Flash Air (W-03)をIPアドレス固定で無線LANのアクセスポイントに接続する方法です。

基本的に以下の設定をします。

[Vendor]
APPMODE=5 (カード電源投入時に無線LAN機能を起動。無線LANモードはSTAモード。)
APPNAME=[ネットワーク上の名前]
APPSSID=[無線LANのAPのSSID]
APPNETWORKKEY=[無線LANのAPのパスワード]

[WLANSD] (この項目は初期状態では無いので追加する)
DHCP_Enabled=NO (DHCPを使用しない)
IP_Address=[IPアドレス]
Subnet_Mask=[サブネットマスク]
Default_Gateway=[ゲートウェイアドレス]
Preferred_DNS_Server=[優先DNSサーバアドレス]
Alternate_DNS_Server=[代替DNSサーバアドレス]
Proxy_Server_Enabled=NO プロキシサーバを使用しない)

詳しいな説明はFlashAir Developers - ドキュメント - APIガイド - CONFIGを参照してください。

設定例

[Vendor]

CIPATH=/DCIM/100__TSB/FA000001.JPG
APPMODE=5
APPNAME=[ネットワーク上の名前]
APPSSID=[無線LANのAPのSSID]
APPNETWORKKEY=[無線LANのAPのパスワード]
VERSION=FA9CAW3AW3.00.00
CID=02544d535730384731cad8617900f801
PRODUCT=FlashAir
VENDOR=TOSHIBA
MASTERCODE=7c5cf8952ecd
LOCK=1

[WLANSD]

DHCP_Enabled=NO
IP_Address=[IPアドレス]
Subnet_Mask=[サブネットマスク]
Default_Gateway=[ゲートウェイアドレス]
Preferred_DNS_Server=[優先DNSサーバアドレス]
Alternate_DNS_Server=[代替DNSサーバアドレス]
Proxy_Server_Enabled=NO

TIの関数電卓で迷ったらTI-Nspire(CASの方)でOK

TIは現行機種でもTI-Nspire(CASの方)TI-84TI-89の各シリーズがありますが、
価格も今ではそんなに差がなく、何か1台購入しようと思ったら、初めての人は迷うと思います。
実際に何回か聞かれたことがあります。
特に学校や会社で指定されていない限りはTI-Nspire(CASの方)で決まりで良いと思います。
TI-Nspire(CASの方)がモノクロ液晶ですが電池できるTI-Nspire CASとカラー液晶で充電式のTI-Nspire CX CASがありますが、こちらは用途別で選んできください。

CPUはTI-84がZ80TI-89MC68000で旧世代のCPUに対してTI-NsipreはARMです。
価格差の割りにはスペックの差が断トツで、他の機種の存在意義はわからなくなる。詳しく調べたわけではありませんが、今まで使っていた人の保守用だと思います。
TI-Nsipreはカタログを見るとキーが多く、画面表示も色々ごちゃごちゃして使いにくそうな印象を受けるかもしれませんが、実際に使ってみると、nspire以外の機種はまずどうやるかわからずに戸惑います。
実際にTI-84 Plus Silver EditionNspire CX CASをほぼ同時期に購入して使い始めましたが、Nspire CX CASはマニュアルを読まなくてもグラフまで表示できましたが、TI-84 Plus Silver Editionでは普通の関数計算機能以外の操作が分からず、マニュアルを読まないとグラフを表示することができませんでした。
TI-89は機能がアイコン表示されわかりやすくはなっていますが、TI-Nspire CX CASの方がさらに分かり易いです。

TI-Nspire以外の機種を否定するわけではありません。
実際に自分も数個所有して使い分けています。
ただ、初めてTI電卓を触る人が1台だけ選ぶとして、TI-Nspire以外を選ぶと色々分かった後に公開すると思うので、1台目はTI-Nspireを選ぶことを勧めます。

YAMAHAの音源IC(YMZ294)の使い方の基礎

いつか使ってみようと思いながら、なかなか使わずに部品箱にずっと入れている人も多いと思われる音源ICですが、やってみると意外と簡単なので、基礎を説明しようと思います。

今回は、秋月電子通商でも長年販売しているYAMAHAのPSG(SSG)音源のYMZ294で説明します。
YAMAHAの音源ICはどれも使い方の基本は同じで、FM音源も同じような方法で使うことができるので、音源ICの基本として適切と思われる音源ICです。

今回はArduino Unoで制御しますが、理解すればmbedでもPICやAVRで直接制御するにせよ同じ方法で使うことができるはずです。
初期処理から基準のA(ラ,440Hz)の音を出力するまでの手順を説明します。

個々のレジスタの情報等の詳細な仕様はデータシートを参照ください。

http://akizukidenshi.com/download/ds/yamaha/ymz294.pdf

ハードウェア

下の回路図のようにArduinoとYMZ294を接続しています。

Arduino 2:9 - YMZ294 D0:D7
Arduino 10 - YMZ294 WR,CS
Arduino 11 - YMZ294 A0
Arduino 12 - YMZ294 IC

同じIOに複数個のICを接続しない限りはWRとCSは同じ制御でよさそうなので、Arduinoの同じピンに接続しています。
SOからの出力は結構大きいので、ボリュームとして10kΩの可変抵抗を間に入れてスピーカ(ヘッドホンミニジャック)に接続しています。

実際に動作させるまでの処理

IOの設定

まず、Arduinoに接続されたピンに対して便宜上名前を付けます。

const byte WRCS_PIN = 10;
const byte A0_PIN = 11;
const byte RESET_PIN = 12;
const int DATA_PIN[] = { 2, 3, 4, 5, 6, 7, 8, 9 };

setup()内ですべて出力に設定します。

  for (int i = 0; i < 8; i++) {
    pinMode(DATA_PIN[i], OUTPUT);
  }
  pinMode(WRCS_PIN, OUTPUT);
  pinMode(A0_PIN, OUTPUT);
  pinMode(RESET_PIN, OUTPUT);
レジスタ書き込みファンクション

音源ICの機能は全てレジスタにアクセスすることで制御できます。
これは同じYAMAHA製のFM音源ICも含めて基本的なことなので、この概念を理解すると他の音源ICもレジスタの仕様をチェックするだけで使えるようになります。

WRCS_PINがLOWの状態でDATA_PINにバイトデータをセットし、WRCS_PINをHIGHにするとバイトデータがYMZ294に送られます。このときA0_PINがLOWの場合はレジスタのアドレス、A0_PINがHIGHの場合はレジスタに入れる値となります。

この方法でレジスタに値をセットするファンクションを定義します。

void set_register(byte addr, byte value)
{
  // addr
  digitalWrite(WRCS_PIN, LOW);
  digitalWrite(A0_PIN, LOW);
  for (int i = 0; i < 8; i++) {
    digitalWrite(DATA_PIN[i], bitRead(addr, i));
  }
  digitalWrite(WRCS_PIN, HIGH);

  // value
  digitalWrite(WRCS_PIN, LOW);
  digitalWrite(A0_PIN, HIGH);
  for (int i = 0; i < 8; i++) {
    digitalWrite(DATA_PIN[i], bitRead(value, i));
  }
  digitalWrite(WRCS_PIN, HIGH);
}
YMZ294の初期化

動作の初めにYMZ294を初期化します。
全てのレジスタに0をセットし、ハードウエアリセットします。
ハードウエアリセットはWRCS_PINがHIGH、A0_PINがLOWの状態でRESET_PINをLOWにし、少し間をおいてからRESET_PINをHIGHにします。

この方法で初期化するファンクションを定義します。

void reset() {
  set_register(0x00, 0);
  set_register(0x01, 0);
  set_register(0x02, 0);
  set_register(0x03, 0);
  set_register(0x04, 0);
  set_register(0x05, 0);
  set_register(0x06, 0);

  set_register(0x07, 0);
  set_register(0x08, 0);
  set_register(0x09, 0);
  set_register(0x0a, 0);

  set_register(0x0b, 0);
  set_register(0x0c, 0);
  set_register(0x0d, 0);

  digitalWrite(WRCS_PIN, HIGH);
  digitalWrite(A0_PIN, LOW);
  digitalWrite(RESET_PIN, LOW);
  delay(10);
  digitalWrite(RESET_PIN, HIGH);
}

このファンクションをsetup()内で実行します

  reset();
周波数を指定して出力

指定した周波数の音を出力する場合は、125000/周波数(HZ)の整数値を12ビットで各チャンネルのレジスタにセットします。
レジスタは8ビット構成なので、上位4ビットと下位8ビットに分けて格納します。

チャンネル 上位4ビットレジスタ 下位8ビットレジスタ
A #01 #00
B #03 #02
C #05 #04

チャンネルと周波数を設定するファンクションを定義

void SetFrequency(int ch, word freq) {
  word cal_freqency = 0;
  if (freq != 0) {
    cal_freqency = 125000 / freq;
  }
  cal_freqency &= 0b0000111111111111;
  set_register(0x00 + (ch * 2), cal_freqency & 0xff);
  set_register(0x01 + (ch * 2), (cal_freqency >> 8) & 0xff);
}
演奏設定

今回はチャンネルABC共にトーンのみ出力します。
この設定はレジスタ#07へ0b00111000の値をセットすることにより行えます。

今回はチャンネルABC共にボリュームを0にします。
この設定はレジスタ#08,#09,#0Aへ0の値をセットすることにより行えます。

今回はチャンネルABC共に周波数を0にします。

この処理をsetup()内で実行します

  set_register(0x07, 0b00111000);
  set_register(0x08, 0);
  set_register(0x09, 0);
  set_register(0x0a, 0);
  SetFrequency(0, 0);
  SetFrequency(1, 0);
  SetFrequency(2, 0);
演奏

チャンネルAにA(ラ)の音程の周波数の440Hzをセットします。
チャンネルAのボリュームを15にします。
1秒後にチャンネルAのボリュームを0にし、チャンネルAの周波数に0をセットして演奏を止めます。
周波数に0をセットしただけでは想定外の音が出力されたので、ボリュームも0にしました。
この処理は1回だけ実行するつもりだったので、setup()内の最後に追加しました。

  SetFrequency(0, 440);
  set_register(0x08, 15);
  delay(1000);
  set_register(0x08, 0);
  SetFrequency(0, 0);

これで起動後、1秒間だけ音が出力されるはずです。

最後にソース全文を掲載するので、参考にどうぞ。

// Output Pins
const byte WRCS_PIN = 10;
const byte A0_PIN = 11;
const byte RESET_PIN = 12;
const int DATA_PIN[] = { 2, 3, 4, 5, 6, 7, 8, 9 };

void setup() {

  for (int i = 0; i < 8; i++) {
    pinMode(DATA_PIN[i], OUTPUT);
  }
  pinMode(WRCS_PIN, OUTPUT);
  pinMode(A0_PIN, OUTPUT);
  pinMode(RESET_PIN, OUTPUT);
  
  reset();
  
  set_register(0x07, 0b00111000);
  set_register(0x08, 0);
  set_register(0x09, 0);
  set_register(0x0a, 0);
  SetFrequency(0, 0);
  SetFrequency(1, 0);
  SetFrequency(2, 0);

  delay(100);

  SetFrequency(0, 440);
  set_register(0x08, 15);
  delay(1000);
  set_register(0x08, 0);
  SetFrequency(0, 0);

}

void loop() {

}

// 初期化
void reset() {
  set_register(0x00, 0);
  set_register(0x01, 0);
  set_register(0x02, 0);
  set_register(0x03, 0);
  set_register(0x04, 0);
  set_register(0x05, 0);
  set_register(0x06, 0);

  set_register(0x07, 0);
  set_register(0x08, 0);
  set_register(0x09, 0);
  set_register(0x0a, 0);

  set_register(0x0b, 0);
  set_register(0x0c, 0);
  set_register(0x0d, 0);

  digitalWrite(WRCS_PIN, HIGH);
  digitalWrite(A0_PIN, LOW);
  digitalWrite(RESET_PIN, LOW);
  delay(10);
  digitalWrite(RESET_PIN, HIGH);

}

void SetFrequency(int ch, word freq) {
  word cal_freqency = 0;
  if (freq != 0) {
    cal_freqency = 125000 / freq;
  }
  cal_freqency &= 0b0000111111111111;
  set_register(0x00 + (ch * 2), cal_freqency & 0xff);
  set_register(0x01 + (ch * 2), (cal_freqency >> 8) & 0xff);
}

// レジスタセット
void set_register(byte addr, byte value)
{
  // addr
  digitalWrite(WRCS_PIN, LOW);
  digitalWrite(A0_PIN, LOW);
  for (int i = 0; i < 8; i++) {
    digitalWrite(DATA_PIN[i], bitRead(addr, i));
  }
  digitalWrite(WRCS_PIN, HIGH);

  // value
  digitalWrite(WRCS_PIN, LOW);
  digitalWrite(A0_PIN, HIGH);
  for (int i = 0; i < 8; i++) {
    digitalWrite(DATA_PIN[i], bitRead(value, i));
  }
  digitalWrite(WRCS_PIN, HIGH);
}

mbedで迷ったらこれ STM32 NUCLEO-F446RE

mbedを使いたいと思った時に迷ったら、ST Nucleo Board STM32F446REがおすすめです。

このボードは低価格でArduino互換のピンソケットを持ったSTM32 NUCLEOシリーズのボードです。

CPUはFPUも内蔵されているARM32bit Cortex-M4を搭載し、動作周波数もmbedの中では比較的高速な最大180MHzです。

メインメモリも128KBでフラッシュも512KBと十分です。さらにDAC2ch搭載しているので、ステレオの自作音源制作もできます。NUCLEOは低価格で前から人気だったのですが、メモリを大きいものを選択するとCPUが遅いものだったり、DACをあきらめたり、融通の利く汎用的なスペックがなかなかなかったのですが、今回の機種でやっと一通り満足できるスペックで良いものが発売されたと思います。

もしmbedで迷ったらぜひST Nucleo Board STM32F446REを検討してください。

ST Nucleo Board STM32F446REのスペック

CPU STM32F446RET6
CPUコア ARM32bit Cortex-M4(+FPU)
周波数 最大180MHz
CPU電源 1.7V-3.6V
フラッシュ 512KB
SRAM 128KB+4KB(Buckup)
タイマー(AdvancedControl) x2
タイマー(General Purpose) x10
タイマー(Basic) x2
SPI x4
I2S x2
USART x4
UART x2
USB OTG x1
CAN x2
SAI x2
SPDIF-Rx x1
HDMI-CEC x1
QuadSPI x1
GPIO x50
ADC 12bitx3 16ch
DAC 12bit 2ch

ST Nucleo Board STM32F446RET6

ST Nucleo Board STM32F446RET6

ArduinoでFM音源シールド作成2 (YM2151)

ArduinoでFM音源シールド作成 (YM2413)に続き、今度はX68000等に搭載されていたYM2151(OPM)でFM音源シールドを作成しました。

今回はYM2151Shield | Web::ooISHooを参考にさせて頂きました。
回路図はここのサイトにあるYM2151ShieldKitManual-0.1.pdfを拝借し、arduinoとYM2151とDACのYM3012の回路はそのままです。

アンプ部は面倒だったので、中国から仕入れたデジタルアンプ基板を使いました。
秋月電子通商にあるPAM8403 D級ステレオアンプモジュールや、AmazonにあるEasyWordMall PAM8403 5V 電力 オーディオ アンプ ボード PAM8403 5V 電力 オーディオ アンプ と同じものと思われます。
この基盤はどうもLRのGNDを別にそれぞれのGNDに接続しなければいけないようです。ミニピンジャックは秋月にある変換基板とのセットを使用しているのですが、この基板はLRのGNDが結線されているので、うまく動作しませんでした。いろいろ試行錯誤した結果、LRどちらかのみGNDに接続するだけで問題なく動作するようになりました。

テストとして、今回はArduino UNOを使用しています。YM2151Shield | Web::ooISHooにあるArduinoFileUploaderでMDXファイルを転送し、MDXプレイヤースケッチを動かしてみました。
最新版のarduinoの開発環境ではコンパイルに失敗するので、Arduino - OldSoftwareReleasesから1.0系をダウンロードしてコンパイルしました。

2つのFM音源シールド作成を通して、FM音源の扱い方もわかってきたので、SDカードからMDXを読んで演奏できるプレイヤーもそのうち作ってみたいと思います。


【永久保証付き】Arduino Uno

【永久保証付き】Arduino Uno