☆☆活動記録☆☆2014年10月23日

アサブロでブログを始めた。

********************************

キーワード

********************************

 Arduino AVR  Android アプリ  Linux RaspberryPi centos  オーディオ DAC ハイレゾ 真空管 ヘッドフォーンアンプ  DTM  自転車  スノーボード スキー場

********************************

サイクルコンピューター2014年10月23日

今は、サイクルコンピューターを作成中です。
ルームランナーにつけている自転車用のサイクルコンピューターを作成中。

**********************************
センサーはリードスイッチを使用します。
クランクとタイヤから回転数を計測します。

計算式は

1回転ごとに取得したデータを10回移動平均する。(ゼロデータを除く)

ケイデンス= 60000 / クランク1回転に要する時間ms)] RPM
   1分 = 60s * 1000ms

車速 = 3600000 / タイヤ1回転に要する時間ms)] * 2.086 / 1000 Km/h
   1時間 = 60m * 60s * 1000msm           m→Km

** 2.086 は700 x 20Cのタイヤ周長

Arduino UNO互換ボード2014年10月24日

Arduino UNO互換のボードを購入しました。SainSmart UNO R3です。

UNO R3からUSBインターフェースにATmega16U2を使用しているので大変興味があったので互換機を探していました。AmazonでSainSmart UNO R3を見つけ、価格で即クリックとなりました。ついでにLCD4884 Shieldもクリックしてしまいました。
初期テストを兼ねてサンプルスケッチを動かしています。

Arduino Leonardo、Arduino Micro、Arduino UNO R2、R3などで使用されているATMega8U2、ATMega16U2、ATmega32U4といったUSB機能内臓のAVRマイクロプロセッサーを使用しています。このUの付いたAVRプロセッサーはLUFA(Lightweight USB Framework Library for the USB AVR Series Microcontrollers)というbootloaderファームウエアを書き換える仕組みを搭載しています。ファームウエアを書き換えることでPC-Arduino間の接続した利用の際に具合の良いUSBデバイスとしてPC側に認識させることが可能です。
USBキーボードやUSBマウス(USB HIDデバイスやUSB MIDIデバイス)として認識させることでフリーソフトや市販ソフトでArduino機器を直接利用することが可能になります。これは便利ですね。たとえばArduinoでMIDIコントローラーを作成し、USB MIDI機器として認識してくれれば市販のDAWソフトからフィジカルコントローラーとして利用できます。

  • USB シリアル:
    Arduinoとシリアルデータ通信したい場合に使用します。スケッチの書き込みで利用します。
    Arduinoをインストールしたディレクトリー下のhardware\arduino\firmwares\atmegaxxu2にあるHEXファイルを同じ手順で書き込みます。
  • USB HID:
    キーボードやマウスとして認識させることでPCの操作をArduinoから行うことが可能です。
    あまりサンプルがないのですが作者のページが参考になります。
  • USB MIDI:
    MIDI機器として利用できます。プログラマブルなコントローラー、シーケンサーなどができます。もちろん楽器を作るのもよいでしょう。(私は楽器が弾けません)

ArduinoとMIDI vol.12014年10月25日

ArduinoでMIDI【リサーチ】

ArduinoにはMIDIシールドなどMIDIに関連したシールドが販売されています。また、ArduinoクローンメーカーでMIDIに 特化したMIDUINOもあります。ArduinoはMIDIを使用したフィジカルコントローラーを作成するのに大変都合が良く出来ています。 Arduinoを使用した楽器を作ったり、MIDIコントローラ、MIDIシーケンサーやMIDIデータのアナライザーとして作成したり、コネクターや変換器として利用したりとArduinoは結構活躍しています。 最近のMIDI機器はPCでの利用が前提のせいでしょうかUSB MIDIになっています。Arduino UNO R2、R3でもUSBコントローラーに使用されているATmega8U2やATmega16U2はファームウエアを書き換えることで特別な ハードウエアなしでUSB MIDIに変身できます。

MIDIに関するメッセージ仕様はこちらを参照ください。

MIDI KITSではキット販売と一緒にサンプル回路とスケッチが掲載されています。大変参考になります。
その他にSDカードの保存したMIDIファイルを再生するMr. MIDI2プレーヤーがあります。 このプレーヤーはArduinoと同じAVRマイコンを使用しています。このプレーヤーの出力はMIDIですので音源に接続して音を出します。YAMAHAのピアノプレーヤーなどにも出力できます。

ArduinoとMIDI vol.22014年10月25日

ArduinoでMIDIコントローラーを作成する。(プロトタイプ)

SainSmart UNO R3がうまく動作したので目的のMIDIコントローラーの作製に入ります。ATmega328Pはアナログポートが6ポートしかありませんので74HC4051や74HC4052などLOGIC ANALOG MULTIPLEXERSを利用してアナログポート数を拡張する必要があります。今回は9個のVRを接続します。

  • MIDI出力で接続:
    Arduinoのシリアル出力を使用します。Arduino MIDI Libraryを使用してスケッチを作成します。
  • USB MIDI:
    LUFAでbootloaderを書き換えてUSB MIDI化します。

Arduinoで作成したMIDIコントローラーがUSB MIDI機器として認識してくれれば市販のDAWソフトのフィジカルコントローラーとして利用できます。

ArduinoとMIDI vol.32014年10月25日

ArduinoでMIDIコントローラーを作成する。(スケッチ)

Arduino MIDI コントローラーを参考にLOGIC ANALOG MULTIPLEXERSは手持ちのTI 4052を使用したスケッチを書いてみました。 MIDIチャネルの選択にKeypadを使用しています。いくつかの問題はありますが、一応動いています。

MIDI Control Change for SC-88Pro
#include <MIDI.h>
#include <Keypad.h>

MIDI_CREATE_DEFAULT_INSTANCE();

#define LED 13
#define A4052 10
#define B4052 11

const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
//connect to the row pinouts of the keypad
byte rowPins[ROWS] = {9, 8, 7, 6};
//connect to the column pinouts of the keypad
byte colPins[COLS] = {5, 4, 3, 2};
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

int sensor1Pin = 0;
int sensor2Pin = 1;
int volumePin = 2;
int sensorValue;
int midiValue = 0;
int old_midiValue[8];
int old_volValue;

int midiCh = 1;

int r0 = 0;     // 4052 Abit
int r1 = 0;     // 4052 Bbit
int row = 0;
int count = 0;
byte bin[] = {0,1,10,11};    //bin array org

int cc[] = {10,11,91,93,94,64,65,66};   // SC-88Pro Control change
// PAN, EXP, Reverb, Chorus, Dely, Hold1, Portamento, Sostenuto

boolean checkChange(int val1,int val2, int range){
  int l,h;
  l = val2-range;
  h = val2+range;
  if((l > val1)||(h < val1)){
   return true;
  } else {
   return false;
  }
} 

void control(){
    if(count > 3){
      count = 0;
    }
    row = bin[count];
    r0 = row & 0x01;
    r1 = (row>>1) & 0x01;
    digitalWrite(A4052,r0);
    digitalWrite(B4052,r1);
    
    sensorValue = analogRead(volumePin);  // read volume
    midiValue = sensorValue / 8;
    if(checkChange(midiValue, old_volValue, 2)){
       MIDI.sendControlChange(7,midiValue,midiCh);
       old_volValue = midiValue;
    }

    int ccc = count;
    sensorValue = analogRead(sensor1Pin);  //read Y ch
    midiValue = sensorValue / 8;
    if(checkChange(midiValue, old_midiValue[ccc], 2)){
       MIDI.sendControlChange(cc[ccc],midiValue,midiCh);
       old_midiValue[ccc] = midiValue;
    }
    
    ccc = count + 4;
    sensorValue = analogRead(sensor2Pin);  // read X ch
    midiValue = sensorValue / 8;
    if(checkChange(midiValue, old_midiValue[ccc], 2)){
       MIDI.sendControlChange(cc[ccc],midiValue,midiCh);
       old_midiValue[ccc] = midiValue;
    }

    count++;
}

void setup(){
  pinMode(LED, OUTPUT);      //LED13
  pinMode(A4052, OUTPUT);    //4052 Abit
  pinMode(B4052, OUTPUT);    //4052 Bbit

  old_volValue = 0;
  for(int i=0; i>7; ++i){
    old_midiValue[i] = 0;
  }

  MIDI.begin(1);
}

int keybuf = 1;
int keycnt = 0;

void loop(){
  char key = keypad.getKey();
  if(key){
    if (key == '#'){
      midiCh = keybuf;
      keybuf = 1;
      keycnt = 0;
    }else{
      if(keycnt > 0){
        keybuf = keybuf * 10 + atoi(&key);
      }else{
        keybuf = atoi(&key);
      }
      keycnt += 1;
    }
  }

 control();
}

使用したArduino IDEのバージョンは1.0.6です。
ソースプログラム中のカギ括弧にご注意ください。HTMLのタグとの区別ため一部に全角文字を使用しています。Arduino IDEの置換え機能で半角に変換してからコンパルしてください。

作成したMIDIコントローラーはUSB MIDI機器として認識してデバッグにはMIDI-OX というMIDIユーティリティーソフトを使用しています。フィジカルコントローラーとしてはいまいちですがこれからブラシアップしていく予定です。

AVRライター2014年10月26日

AVRISP MkII クローン(プロトタイプ)

UNO R3がうまく動作したのであらためて今までのArduinoとの違いを調べてみました。
大して違いはないのですが、USBインターフェースのICが違います。今まではFTDI社のFT232RというUSBシリアル専用のICが使用されていました。 UNO R2からArduino本体のICと同じAtmel社のATmega8U2、UNO R3ではATmega16U2といったUSB内蔵タイプの汎用マイクロプロセッサーを使用しています。 Arduino leonardoやmicroはATmega32U4を使用し、USBインターフェースまで本体のマイクロプロセッサーで賄っています。

ATmega8U2、ATmega16U2はATmega32U4同様にまだどこでも扱っていないようです。ATmega32U2なら秋月電子で取り扱っています。ATmega32U4は44ピン TQFPパッケージでが、ATmega8U2、ATmega16U2、ATmega32U2は32ピンTQFPパッケージです。秋月のTQFP変換基板が使えます。0.8mmピッチならハンダ付けは OKというわけで使い道も考えずに早速購入しました。ネットリサーチの結果、AVRISP MkII互換のAVRライターを作製してる方がいました。私もという ことで作製してみました。

参照したサイトです。
  AVRISP mkII クローン製作   AVRISP mkII clone の製作
  FRISK USBTiny MkII

AVRライターのファームウエアはATMEL社からダウンロードしてきたFlipというツールを使用してAVRISP-MKII-avrdude.hexを書き込みます。このAVRISP MkII クローンを使用してArduino IDEからbootloaderの書き込みができることを確認しました。
AVR Studio 6.2を使用する場合はAVRISP-MKII-studio.hexを書き込みます。

Arduinoクローン2014年10月28日

Arduinoクローン(ATmega32U2)

ATmega32U2でAVRISP MkII互換のAVRライターがうまく動作したので今度はArduino Leonardo、Arduino Microもどきが作れないかと思うのは欲張りでしょうか。
Arduino LeonardoやArduino microはATmega32U4を使用しています。理由はATmega32U2にはアナログポートとI2Cインターフェースがないためでしょう。 デジタルポートのみでもUSBインターフェースを内蔵していることの魅力にはかないません。

参照したサイトです。
  ATMEL ATmega8U2-32U2データシード(日本語版)

  ATmega32U2でArduinoモドキを作る
  ATmega32U2 USB Development Board, Arduino compatible
  ATmega32U2 USB Atmel AVR Arduino compatible development board DIL32 bootloader

  Minimus board with Arduino
    プロジェクトサイトはprojects/minimusです。

今回のテストではMinimus board with ArduinoのCaterina-Minimus.hexをAVRISP MkIIで書き込んで使用しました。スケッチの作成には同じサイトにあるArduino IDE 1.0.2も一緒にダウンロードして使用します。これは普通のArduino IDEはATmega32U2をサポートしていないためです。

【追記】

Arduino Leonardo、micro、Minius boardなどATmega U系のスケッチはATmega系のスケッチと異なり多少修正する必要があります。一例がSerialクラスです。ATmega32U2のUART(8ピンRXD、9ピンTXD)に出力しようと思ったらSerial1を指定する必要があります。詳細はこのページを参照してください。
また、ATmega系にはないKeyboardクラスとMouseクラスががあります。このクラスを使用するとArduinoボードがPCからはキーボード、マウスになります。サンプルプログラムはけっこうおもしろいです。これは使えるかもしれません。

コントローラ基盤 Vol.12014年10月29日

ちょっと、光もので遊んでいます。

e-bayで1個 $1.03で見つけた16桁2行、20桁4行表示のキャラクターLCDをI2C接続するためのコントローラーモジュールで遊んでみました。使用しているコントローラーICは汎用IO拡張ICのPCF8574、またはPCF8574Aです。このコントローラはI2Cバスから受け取ったデータをそのままP0~P7データピンに出力します。I2CバスにLCDのコマンドやデータを順次送ることで表示させます。今回購入したものはさすが中国製、5個注文して内2個はPCF8574で残りはPCF8574Aを使用したものが届きました。I2Cアドレスの割り振りが異なる以外に違いはないのでOKです。国内ではaitendoで同種のコントローラー基板を販売しています。


ArduinoにキャラクターLCDを接続するとデジタルピンを最低6個消費してしまします。I2C接続ならアナログピンを2個使用するだけで接続できます。ArduinoのLCDライブラリーと同じ機能を提供するI2C接続LCDライブラリーがあります。


aitendoにはPCF8574を使用したGPIOエキスパンダという汎用のGPIO拡張基板もあります。こちらはすべてのピンが引き出されています。PCF8574ライブラリーが利用できます。


【ツール】
I2Cバスに接続されている機器を検索しIDを表示してくれるスキャナーがあると便利です。

  • Raspberry Pi (Linux)ではコマンドが用意されていますから叩くだけです。ツールのインストールは、apt-get install i2c-tools で行います。
    $ sudo i2cdetect 0
    WARNING! This program can confuse your I2C bus, cause data loss and worse!
    I will probe file /dev/i2c-0.
    I will probe address range 0x03-0x77.
    Continue? [Y/n] y
    0 1 2 3 4 5 6 7 8 9 a b c d e f
    00: -- -- -- -- -- -- -- -- -- -- -- -- --
    10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    20: -- -- -- -- -- -- -- 27 -- -- -- -- -- -- -- --
    30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    70: 70 -- -- -- -- -- -- --

  • Arduinoでは簡単なスケッチを書き込むことでI2Cバスに接続されている機器のアドレスをシリアルに出力してくれます。Arduino Playgroundを参照してください。