Arduinoでクルマのエンジンが動く？　オープンソースECU Speeduino (3)クランク角センサー信号の生成

#クランク角センサー信号をつくる
[前回記事 (2)まずは動かしてみる](https://qiita.com/covao/items/dd8a4640cb13edfbfa33)


- Speeduinoで、エンジン制御を動かすには、エンジンが回転している情報をマイコンに与える必要があります。
- その準備として、Arduinoマイコンを使い、クランク角センサの疑似信号をつくります。:smiling_imp:

##クランク角センサーって
- エンジンの回転を検出するセンサーです。
- エンジン回転数の計測、燃料噴射・点火タイミングの基準に使われます。
- ４サイクルエンジンでは、2回転(720 deg)で一通りの工程（吸気，圧縮，膨張，排気）が行われるため、カム角センサーなどを併用してエンジンの工程を識別しています。

クランク角センサー（カム角センサー）の波形パターンは、メーカーや車種等により様々です。
下記に、Speeduinoで対応しているクランク角センサーの情報があります。:sunglasses:
https://speeduino.com/wiki/index.php/Decoders


クランク角センサー信号には、回転角の目印となる歯欠けがあり、波形の生成が面倒です。:pensive:
SpeeduinoのコミュニティサイトのBEGINNER'S GUIDEに、Ardu-Stimというツールが紹介されてました。これを使って、Speeduinoにクランク信号を入力します。
https://speeduino.com/forum/viewtopic.php?f=21&t=221

###用意するもの
 Arduino Uno、または、互換ボード
(SPeeduinoとは別に、クランク角センサーの疑似信号生成に使います)
###インストール
1. Ardu-Stimのソースコード
https://gitlab.com/libreems-suite/ardu-stim/tree/master

2. DeviceDruid(Ardu-StimのGUIに使用)　Windows10(64bit)とLinuxに対応
https://devicedruid.com/downloads/

###Ardu-Stimのビルド
1. Arduino IDEを起動
2. スケッチ→ライブラリをインクルード→ライブラリの管理より、SerialUIライブラリをインストールします。
3. ビルドし、マイコンボードに書き込みます。

![ArdStim_Build.png](https://qiita-image-store.s3.amazonaws.com/0/329764/f129020c-bb42-140b-7640-ed6c35b860ca.png)

###DeviceDruid
1. DeviceDruidを起動します。
2. シリアルポートを指定し、9600bpsに設定します。
3. メニュー画面で、Wheel Optionsに進みます。
4. List wheelsをクリックすると、クランク角センサの一覧が表示されます。
（定期的にpingが行われており、テキスト画面がスクロールしてしまうため、Druid Settings>Device poll intervalを最大にするといいみたいです。）
5. Choose wheelsで25を入力します。
(ここでは、25: 36-1 crank with 2nd trigger on teeth 33-34というパターンを使用します。)
![Devicecdruid_wheel.png](https://qiita-image-store.s3.amazonaws.com/0/329764/b51ca636-6891-68a3-3f35-557ae96e2047.png)


4.Topメニューに戻り、Set Fixed RPMで回転数（例えば1500）を入力します。
![Devicecdruid_menu.png](https://qiita-image-store.s3.amazonaws.com/0/329764/2b136bd3-9ee1-7fad-e1c4-5d2b971923ef.png)

###クランク角センサ信号の確認
ArduinoのIOピンから、設定した回転数のクランク角センサ信号が出力されます。 

- Pin8: クランク角センサ信号
- Pin9: カム角センサ信号(2ndクランク角センサ信号）
 
![IMG_000.png](https://qiita-image-store.s3.amazonaws.com/0/329764/35b8bde6-d959-bc87-9500-a040f459f81e.png)

###クランク角センサー（カム角センサー）波形データ
Ardu-Stimのソースコードwheel_def.hに以下のようなデータで記述されています。
（bit0:パルス1,bit1:パルス2  0-3の値をとる）
[wheeldef.h](https://gitlab.com/libreems-suite/ardu-stim/blob/master/ardustim/wheel_defs.h#L34)

```ruby:wheel_def.h
//  const unsigned char thirty_six_minus_one_with_second_trigger[] PROGMEM = "CM1/2,36,35t,1m:cM1/2,36,16m,1t,19m";
 /* 36-1 with second trigger pulse across teeth 33-34 on first rotation */
 const unsigned char thirty_six_minus_one_with_second_trigger[] PROGMEM = 
   { /* 36-1 */
     1,0,1,0,1,0,1,0,1,0, /* Teeth 1-5 */
     1,0,1,0,1,0,1,0,1,0, /* Teeth 6-10  */
     1,0,1,0,1,0,1,0,1,0, /* Teeth 11-15 */
     1,0,1,0,1,0,1,0,1,0, /* Teeth 16-20 */
     1,0,1,0,1,0,1,0,1,0, /* Teeth 21-25 */
     1,0,1,0,1,0,1,0,1,0, /* Teeth 26-30 */
     1,0,1,0,3,2,3,2,1,0, /* Teeth 31-35, second trigger during 33-34 */
     0,0,                 /* 36th tooth MISSING */
     1,0,1,0,1,0,1,0,1,0, /* Revolution 2  Teeth 1-5 */
     1,0,1,0,1,0,1,0,1,0, /* Teeth 6-10 */
     1,0,1,0,1,0,1,0,1,0, /* Teeth 11-15 */
     1,0,1,0,1,0,1,0,1,0, /* Teeth 16-20 */
     1,0,1,0,1,0,1,0,1,0, /* Teeth 21-25 */
     1,0,1,0,1,0,1,0,1,0, /* Teeth 26-30 */
     1,0,1,0,1,0,1,0,1,0, /* Teeth 31-35 */
     0,0                  /* 36th MISSING tooth */
   }; 
   
```

##参考
- Speeduino Forum Speeduinoのコミュニティサイト   
https://speeduino.com/forum/
- Speeduino manual          
https://speeduino.com/Speeduino_manual.pdf

##最後に
クランク角センサの信号が生成できるようになりました。:smile:
[次は](https://qiita.com/covao/items/374a4c86cc352a59f206)、Speeduinoと接続して回転数を確認する予定です。