掃除機Hack して Lチカの代りにモータ動かしてみる

# 環境設定

Arduino_STM32で動かします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/987136b5-2a69-417b-0cf7-3492f19aa93f.png)


Windows/Linux/MacいずれもOKです。


同じ系統のCPUであるAVTOKOYバッジの情報を基に、環境を設定します。
inside of AVTOKYO 10th HACK BADGE
https://qiita.com/lowlevel/items/0fd3402e0dd4584de65f

- (なお、上記の情報は2018年に書かれたものです。最新版の状況は以下を参照してください。)
 - Arduino環境をインストール
 - https://www.arduino.cc/
 - Arduino_STM32をインストール
 - https://github.com/rogerclarkmelbourne/Arduino_STM32/wiki/Installation


# 環境設定の改造



掃除機は CPU として STM32F103VBT6 を搭載しているのですが、ボード設定を「Generic STM32F103V seriies」とするとクロックの設定で動かないので、代わりに「 Nucreo F103 @ 64MHz」で動かします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/27aeb461-1a70-7705-fdb0-80554420876a.png)




# 分解
![IMG_20190420_082233.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/9559040e-5325-5e63-06aa-dc8d8c4e5607.jpeg)
![IMG_20190420_082303.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/5fc7d87a-ab75-9d10-7193-a2d2bbfef01d.jpeg)
![IMG_20190420_082547.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/9e972c45-e0cf-baf5-bc93-b662a00c0389.jpeg)
![IMG_20190420_082619.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/e4068587-79b0-b2d5-95ef-a9eaf0d44040.jpeg)
![IMG_20190420_082851.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/9dc514cb-3f02-9b2f-47cf-102d404552e9.jpeg)


![IMG_20190420_082630.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/cbbe8110-f98e-e9e4-a1de-858ed8cbbb98.jpeg)



![IMG_20190326_201830.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/c2cb10fa-eeee-c998-6c4b-50a2a4962690.jpeg)

# 中身の解説
上側カバーの内部には、センサーがたくさんついています。黒い箱はバンパーが当たったのを検出。青い基板には赤外線距離計、ビーコン受信センサがついています。ビーコン受信センサは充電ステーションの信号と、立ち入り禁止タワーから出るビームを受信します。
![IMG_20190326_201832.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/f4425199-10a5-5c46-78c7-29094ba0661b.jpeg)

下側。2つのモーターはごみを中央に掃き寄せるブラシを動かします。4か所、床を検出するセンサーがついています。
![IMG_20190326_201838.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/0e796e6a-5afb-f1d3-e8e8-30b3f9286d9d.jpeg)




# 書き込みのケーブルを作る

![IMG_20190419_212459.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/84d8e787-702a-1253-4c32-fbb312adf885.jpeg)

![IMG_20190419_213258.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/542901a7-1751-ee92-c5b0-aa0919ff7c9d.jpeg)


![IMG_20190419_212117.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/fd076245-5b44-4533-8f3e-f4b2a28c5a67.jpeg)



![IMG_20190419_214902.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/f65aabf0-e34c-8106-68ae-5010159c5a93.jpeg)

![IMG_20190419_215136.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/655cff48-e530-f90e-2975-26510bef15e2.jpeg)



# ケーブルの接続
このようにして、書き込みをできるようにします。
![IMG_20190326_174245.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/07502289-fb17-88f3-726b-c38cd5650b84.jpeg)


上側カバーを閉めていても、このようにすれば
![IMG_20190420_083329.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/47f0d6b0-a80b-4063-9e20-8e9e6db0ac5a.jpeg)

接続をすることもできます。
![IMG_20190420_083309.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/d5c1895f-b780-e484-41b7-6a33ab378790.jpeg)



# プログラム配線のピン割当
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/6bbdc961-1c44-b68a-0228-2a1cec595e7c.png)

# テストプログラム

このプログラムで、PA7とRB6のピンを0.1秒おきにプラスの電気／マイナスの電気に入れ替えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/4528d254-c9ce-c15e-2b6d-1f6c527e5ac6.png)

PA7には本来は何もつながっていませんが、テスト用にLEDをつなげたものを用意できている場合はそれでLEDが点滅するのを確認することができます。


RB6には、右モーターが接続されています。RB6をプラスの電気にすると右モーターが前進します。
# 書き込み

以下のようになればOKです


```
最大262144バイトのフラッシュメモリのうち、スケッチが16804バイト（6%）を使っています。
最大49152バイトのRAMのうち、グローバル変数が3368バイト（6%）を使っていて、ローカル変数で45784バイト使うことができます。
/home/nanbuwks/Downloads/ardublock/arduino/linux64/arduino-1.8.5_STM32/hardware/Arduino_STM32-master/tools/linux/stlink_upload ttyUSB0 {upload.altID} {upload.usbID} /tmp/arduino_build_934788/DigitalInputPullup.ino.bin 
2019-04-19T21:59:08 INFO src/stlink-usb.c: -- exit_dfu_mode
2019-04-19T21:59:08 INFO src/stlink-common.c: Loading device parameters....
2019-04-19T21:59:08 INFO src/stlink-common.c: Device connected is: F1 Medium-density device, id 0x20036410
2019-04-19T21:59:08 INFO src/stlink-common.c: SRAM size: 0x5000 bytes (20 KiB), Flash: 0x20000 bytes (128 KiB) in pages of 1024 bytes
2019-04-19T21:59:08 INFO src/stlink-common.c: Attempting to write 16804 (0x41a4) bytes to stm32 address: 134217728 (0x8000000)
Flash page at addr: 0x08003400 erased2019-04-19T21:59:09 INFO src/stlink-common.c: Finished erasing 17 pages of 1024 (0x400) bytes
2019-04-19T21:59:09 INFO src/stlink-common.c: Starting Flash write for VL/F0/F3 core id
2019-04-19T21:59:09 INFO src/stlink-common.c: Successfully loaded flash loader in sram
Flash page at addr: 0x08004000 erased
 13/16 pages written2019-04-19T21:59:10 INFO src/stlink-common.c: Starting verification of write complete
 16/16 pages written2019-04-19T21:59:10 INFO src/stlink-common.c: Flash written and verified! jolly good!
```



以下のようになったら、接触不良とか逆接続を疑ってください。

```

2019-04-20T08:37:06 INFO src/stlink-common.c: Loading device parameters....
2019-04-20T08:37:06 WARN src/stlink-common.c: unknown chip id! 0xe0042000
```

以下のようになったらプロテクトがかかっています。

```

019-04-20T08:35:12 INFO src/stlink-common.c: Loading device parameters....
2019-04-20T08:35:12 INFO src/stlink-common.c: Device connected is: F1 Medium-density device, id 0x20036410
2019-04-20T08:35:12 INFO src/stlink-common.c: SRAM size: 0x5000 bytes (20 KiB), Flash: 0 bytes (0 KiB) in pages of 1024 bytes
```
# プロテクトがかかっている場合の解除方法

一度強制的に書き込んでしまうと　ReadProtectビットがクリアされます。その後は通常の書き込み方法でプログラムができます。

## 方法1 

Windows マシンで STM32 ST-Link Utilityを使って書き込む

## 方法2

WindowsマシンのArduinoを使って書き込む

試してみたら、ReadProtectを上書きできてしまいました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/a3e534cd-8cdd-dc38-8a66-d82e6ef94bcb.png)

# ピン割当（抜粋）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/ce5022ff-7a4d-a102-a13e-d40d0bfcdb49.png)


# シリアル接続も試してみる

Serial2でプログラム配線から出力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/7e73635d-01bd-b625-6c6f-93e9e931e2fc.png)


# センサーのポートをスキャンする

ボード設定を変えて、PE15ポートまで使えるようにし、整数値でポートをスキャンできるようにしました。
以下のスケッチで、ポートスキャンしました。

```

  int wait=100;
  int pin1,pin2;
void setup() {
  Serial2.begin(115200);
  for ( int i=11 ; i<79 ; i++)
  {
     pinMode(i,INPUT_PULLDOWN);
  }
  pinMode(2, INPUT_PULLUP);
  pinMode(13, OUTPUT);
  Serial2.println(" Program Start ");
}

void loop() {
  int sensorVal;
  for ( int i=0 ; i<79 ; i++)
  {
     if ( i % 16 == 0)
     {
       Serial2.print(" ");
       Serial2.print(" ");
     }
     sensorVal = digitalRead(i);
     Serial2.print(sensorVal);
     Serial2.print(" ");
     
  }
  Serial2.println();
  int i=0;
  pin1 =PA7; // test LED
  pin2=PA7 ; // RIGHT MOTO
  pinMode(pin1, OUTPUT);
    
    pinMode(pin2, OUTPUT);
    digitalWrite(pin1, HIGH);
    digitalWrite(pin2, HIGH);
    delay(wait);
    digitalWrite(pin1, LOW);
    digitalWrite(pin2, LOW);
    delay(wait);

  // Keep in mind the pull-up means the pushbutton's logic is inverted. It goes
  // HIGH when it's open, and LOW when it's pressed. Turn on pin 13 when the
  // button's pressed, and off when it's not:
  if (sensorVal == HIGH) {
    digitalWrite(13, LOW);
  } else {
    digitalWrite(13, HIGH);
  }
}

```


結果わかったこと

- 右接触センサ PE12 PULLUP必要? PD4( 52 ) をINPUT_PULLUPないしINPUT_PULLDOWNにしないと反応しない
- 左接触センサ PE11 PULLUP必要？ PD4( 52 ) をINPUT_PULLUPないしINPUT_PULLDOWNにしないと反応しない
- 前近接センサ PE8 PULLUP必要？
- 右サスペンション PE4
- 左サスペンション PD6
- 右駆動モータエンコーダ PE6 PULLUP必要？
- 左駆動モータエンコーダ PD5 PULLUP必要？
- 操作パネル●　押すとLo PD0
- 操作パネル▲　押すとLo PD1
- 操作パネル■　押すとLo PD2
- 充電しているとHigh D11

同様に、アウトプットも調べてみました。
- PB6 ( 22 ) 右モータ前
- PB7 ( 23 ) 右モータ後退
- PB8 ( 24 ) 左モータ前
- PB9 ( 25 ) 左モータ後退
- PD12 ( 60 ) BEEP
- PE15 ( 78 )  底面ローリングブラシモーター