• 車種別
  • パーツ
  • 整備手帳
  • ブログ
  • みんカラ+

にゃんカラのブログ一覧

2017年02月14日 イイね!

A型でSRVDのブザーを鳴らそう

今回、A型にSRVDのブザーを追加していますが、機器の構成は以下のようになっています。
CAN BUS に接続するモジュール、Arduino が2台、他励式の圧電スピーカーです。


■CAN BUS Shield 用ライブラリの準備
CAN に接続してデータを取得するモジュールは、MCP2515というICを使っていてるものなら使えると思います。

ただし、以下の Seeed Studio のライブラリは、CAN モジュールの動作クロックが 16MHz として作られています。中華製の CAN BUS モジュールは、動作クロックが 8MHz のものが多いようです。動作クロックが 8MHz の場合は、ライブラリの修正が必要です。(私も修正しようとしましたが、うまく動かすことができませんでした。)
ソフトウェアを修正したくない場合は、水晶発振器を 8MHz のものから 16MHz のものに載せ替えれば動作するハズです。私はそうしました。

今回のプログラムに使用したライブラリは、Seeed Studio の CAN BUS Shield 用のものです。以下に ありますので、ダウンロードして下さい。

http://wiki.seeed.cc/CAN-BUS_Shield_V1.2/

Arduino UNO など、一般的な Arduino を使う場合はそのまま使えますが、今回私が使ったような Digispark の ATTiny85 を載せている Arduino を使う場合、通常の SPI のライブラリが使えないために、ライブラリを一部書き換える必要があります。

書き換えると一般の Arduino では使えなくなってしまうので、コピーを取ってファイル名を変更するのが良いと思います。

CAN BUS Shield 用のライブラリは3つのファイルで構成されていますので、以下のようにファイル名を変更します。

mcp_can.h   →  mcp_can_digi.h
mcp_can.cpp  →  mcp_can_digi.cpp
mcp_can_dfs.h  →  mcp_can_dfs_digi.h

次にファイルの中身を書き換えます。
ファイル:map_can_digi.h
#include "mcp_can_dfs.h"

#include "mcp_can_dfs_digi.h"
に変更。

ファイル:map_can_digi.cpp
#include "mcp_can.h"

#include "mcp_can_digi.h"
に変更。

ファイル:mcp_can_dfs_digi.h
#include <SPI.h>

#include <bitBangedSPI.h> 
に変更。

上記3つのファイルを Arduino のライブラリのフォルダに適当なフォルダを作って格納します。

■SPI ライブラリの準備
次に、Digispark の小型 Arduino で使える SPI ライブラリをダウンロードします。以下にあります。

https://github.com/nickgammon/bitBangedSPI

ファイルの中身を修正します。
ファイル:bigBandedSPI.h
クラス定義の最後に以下の行を追加します。ファイルの一番最後の行でOKです。
extern bitBangedSPI SPI;


bigBandedSPI.h とbigBandedSPI.cpp をArduino のライブラリのフォルダに適当なフォルダを作って格納します。

■Arduino のプログラム
CAN パケット判定用のDigispark 版のプログラムは以下のようなものです。
(非商用なら自由に使って頂いて結構です。改変も自由に行ってくださって構いません。)

// for Digispark
#define __AVR_ATtiny85__
#include "mcp_can_digi.h"
// SPI用
#define MOSI 0    // PB0
#define MISO 1    // PB1
#define SCK  2    // PB2
#define SS   3    // PB3
// ブザー出力用
#define OPIN1  4
// CAN用
MCP_CAN CAN(SS);   // Set SS pin
bitBangedSPI SPI(MOSI, MISO, SCK);  // MOSI, MISO, SCK

// winker flag
unsigned char winkerLeft = 0; 
unsigned char winkerRight = 0; 

// for CAN Message
unsigned char len = 0;
unsigned char buf[8];
unsigned long id;

void setup() {
    pinMode(OPIN1, OUTPUT);   // ブザー ON/OFF 出力用
    digitalWrite(OPIN1, LOW);
START_INIT:
    if(CAN_OK != CAN.begin(CAN_500KBPS)) {  // init can bus : baudrate = 500k
        goto START_INIT;
        delay(100);
    }
}

void loop() {
    if(CAN_MSGAVAIL == CAN.checkReceive()) { // check if data coming
        CAN.readMsgBufID(&id, &len, buf);    // read data,  id: CAN Id, len: data length, buf: data buf
        switch (id) {
          case 0x282:
            (buf[5] & 0x20) ? (winkerRight = 0xFF): (winkerRight = 0);  // right winker flag
            (buf[5] & 0x10) ? (winkerLeft = 0xFF): (winkerLeft = 0);    // left winker flag
            break;
          case 0x25C:
            // Back | something is approaching | something is in the blind spot
            ((buf[5] & 0xC0) | (buf[5] & 0x4 & winkerRight) | (buf[5] & 0x8 & winkerLeft) | (buf[4] & 0x1 & winkerRight) | (buf[4] & 0x2 & winkerLeft)) ? digitalWrite(OPIN1, HIGH): digitalWrite(OPIN1, LOW);
            break;
          default:
            break;
        }
    }
}

ブザーを鳴らすべきだと判定されたら、4ピンが HIGH になります。
ゼビウスの効果音を鳴らすプログラムを使う場合、4ピンとゼビウス効果音のモジュールの 3ピンを接続します。
CAN BUS モジュールへの接続は、SI が 0ピン、SO が 1ピン、SCK が 2ピン、CS が 3ピンです。
(今回使用した中華製のモジュールの場合、CS を繋がないとうまく動きませんでした。SPI は 1モジュールだけの接続の場合は CS を GND に落とすことで代用できるハズなのですが、うまく動かすことができませんでした。)  

Arduino Uno など一般的な Arduino とSeeed Studio の CAN BUS Shield  を使う場合は、以前に整備手帳に記載したプログラムが使えますので、そちらをご覧ください。

Posted at 2017/02/14 22:57:18 | コメント(10) | トラックバック(0) | 日記
2017年02月14日 イイね!

ゼビウスの効果音演奏プログラム

Arduino でゼビウスのブザーを演奏するプログラムを公開しておきます。
IPIN1 で指定したピン(デジタルピンの番号)が HIGH になった時に、曲が演奏されます。
他励式の圧電スピーカーを接続するのは、PINNO で指定したピン(デジタルピンの番号)と GND です。圧電スピーカーの両端を PINNO のピンと GND にそれぞれ接続して下さい。

なお、melody 配列で指定している音程を全て NOTE_CS7 にすれば、B型以降の純正のブザーと同じ音程の音になるハズです。
ゼビウスの効果音がお嫌いな方は、そちらでどうぞ。


#define IPIN1  3  // 入力ピン(HIGH のとき音を出す)

#define BEAT 300  // 音の長さを指定
#define PINNO 2   // 圧電スピーカを接続したピン番号
#define TMPO 11   // 演奏テンポ

// 音程の定義
#define NOTE_B0  31
#define NOTE_C1  33
#define NOTE_CS1 35
#define NOTE_D1  37
#define NOTE_DS1 39
#define NOTE_E1  41
#define NOTE_F1  44
#define NOTE_FS1 46
#define NOTE_G1  49
#define NOTE_GS1 52
#define NOTE_A1  55
#define NOTE_AS1 58
#define NOTE_B1  62
#define NOTE_C2  65
#define NOTE_CS2 69
#define NOTE_D2  73
#define NOTE_DS2 78
#define NOTE_E2  82
#define NOTE_F2  87
#define NOTE_FS2 93
#define NOTE_G2  98
#define NOTE_GS2 104
#define NOTE_A2  110
#define NOTE_AS2 117
#define NOTE_B2  123
#define NOTE_C3  131
#define NOTE_CS3 139
#define NOTE_D3  147
#define NOTE_DS3 156
#define NOTE_E3  165
#define NOTE_F3  175
#define NOTE_FS3 185
#define NOTE_G3  196
#define NOTE_GS3 208
#define NOTE_A3  220
#define NOTE_AS3 233
#define NOTE_B3  247
#define NOTE_C4  262
#define NOTE_CS4 277
#define NOTE_D4  294
#define NOTE_DS4 311
#define NOTE_E4  330
#define NOTE_F4  349
#define NOTE_FS4 370
#define NOTE_G4  392
#define NOTE_GS4 415
#define NOTE_A4  440
#define NOTE_AS4 466
#define NOTE_B4  494
#define NOTE_C5  523
#define NOTE_CS5 554
#define NOTE_D5  587
#define NOTE_DS5 622
#define NOTE_E5  659
#define NOTE_F5  698
#define NOTE_FS5 740
#define NOTE_G5  784
#define NOTE_GS5 831
#define NOTE_A5  880
#define NOTE_AS5 932
#define NOTE_B5  988
#define NOTE_C6  1047
#define NOTE_CS6 1109
#define NOTE_D6  1175
#define NOTE_DS6 1245
#define NOTE_E6  1319
#define NOTE_F6  1397
#define NOTE_FS6 1480
#define NOTE_G6  1568
#define NOTE_GS6 1661
#define NOTE_A6  1760
#define NOTE_AS6 1865
#define NOTE_B6  1976
#define NOTE_C7  2093
#define NOTE_CS7 2217
#define NOTE_D7  2349
#define NOTE_DS7 2489
#define NOTE_E7  2637
#define NOTE_F7  2794
#define NOTE_FS7 2960
#define NOTE_G7  3136
#define NOTE_GS7 3322
#define NOTE_A7  3520
#define NOTE_AS7 3729
#define NOTE_B7  3951
#define NOTE_C8  4186
#define NOTE_CS8 4435
#define NOTE_D8  4699
#define NOTE_DS8 4978

int melody[][8] = {   // メロディー
  {NOTE_CS6, NOTE_CS7, NOTE_C7, NOTE_CS7,
  NOTE_F7, NOTE_CS7, NOTE_C7, NOTE_CS7},
 
  {NOTE_C6, NOTE_CS7, NOTE_B6, NOTE_CS7,
  NOTE_F7, NOTE_CS7, NOTE_B6, NOTE_CS7},

  {NOTE_CS6, NOTE_CS7, NOTE_AS6, NOTE_CS7,
  NOTE_F7, NOTE_CS7, NOTE_AS6, NOTE_CS7},

  {NOTE_C6, NOTE_CS7, NOTE_A6, NOTE_CS7,
  NOTE_F7, NOTE_CS7, NOTE_A6, NOTE_CS7},
};

int noteDurations[][8] = {  // テンポ
  {TMPO, TMPO, TMPO, TMPO,
  TMPO, TMPO, TMPO, TMPO},

  {TMPO, TMPO, TMPO, TMPO,
  TMPO, TMPO, TMPO, TMPO},
  
  {TMPO, TMPO, TMPO, TMPO,
  TMPO, TMPO, TMPO, TMPO},
  
  {TMPO, TMPO, TMPO, TMPO,
  TMPO, TMPO, TMPO, TMPO}
};

int melcnt = 0; // フレーズのカウンタ
int melloop = sizeof(noteDurations) / sizeof(noteDurations[0]); // フレーズの数

void setup() {
  pinMode(IPIN1, INPUT);
}

void playsound(int cnt) {
  for (int i = 0; i < sizeof(noteDurations[cnt]) / sizeof(noteDurations[cnt][0]); i++) {
    int dur = 1000 / noteDurations[cnt][i];
    tone(PINNO, melody[cnt][i], dur);
    int pause = dur * 1.30;
    delay(pause);
    noTone(PINNO);
  }
}

void loop() {
  if(digitalRead(IPIN1) == HIGH) {
    playsound(melcnt);
    melcnt %= melloop;
  } else {
    melcnt = 0;
  }
}
Posted at 2017/02/14 21:40:21 | コメント(0) | トラックバック(0) | 日記

プロフィール

「[整備] #レヴォーグ ステアリングセンサー ハンズフリーの実験(失敗) https://minkara.carview.co.jp/userid/2407630/car/3056290/7756635/note.aspx
何シテル?   04/18 02:02
にゃんカラです。 単なる自慢ではなく、役に立つことを書きたいと思います。 よろしくお願いします。
みんカラ新規会員登録

ユーザー内検索

<< 2017/2 >>

   1234
567891011
1213 1415161718
19202122232425
262728    

リンク・クリップ

12V SOCKETヒューズの行き先は? 
カテゴリ:その他(カテゴリ未設定)
2024/04/16 17:07:08
【備忘録】アンビエント照明交換5(車速信号) 
カテゴリ:その他(カテゴリ未設定)
2024/04/16 16:59:24
矢崎総業 060型LC (HLC) 6極 オスカプラー・端子セット 
カテゴリ:その他(カテゴリ未設定)
2024/04/16 16:56:42

愛車一覧

スバル レヴォーグ スバル レヴォーグ
VM4から乗り換えました。車体色はまたレッドです。 初めてローンを使って購入しました。ロ ...
スバル インプレッサスポーツワゴン スバル インプレッサスポーツワゴン
重い車体に 1.5L NAエンジンで非力でしたが、挙動が素直なクルマでした。 扁平率82 ...
スバル レガシィツーリングワゴン スバル レガシィツーリングワゴン
10年乗りましたが、不注意で少しコスってしまって入庫した時にオイル漏れなどがわかり、いろ ...
スバル レヴォーグ スバル レヴォーグ
現在スバル車3台目です。 A型は初めてです。

過去のブログ

2018年
01月02月03月04月05月06月
07月08月09月10月11月12月
2017年
01月02月03月04月05月06月
07月08月09月10月11月12月
2016年
01月02月03月04月05月06月
07月08月09月10月11月12月
2015年
01月02月03月04月05月06月
07月08月09月10月11月12月
ヘルプ利用規約サイトマップ
© LY Corporation