LoginSignup
5
1

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-04-20

環境設定

Arduino_STM32で動かします。
image.png

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

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

環境設定の改造

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

image.png

分解

IMG_20190420_082233.jpg
IMG_20190420_082303.jpg
IMG_20190420_082547.jpg
IMG_20190420_082619.jpg
IMG_20190420_082851.jpg

IMG_20190420_082630.jpg

IMG_20190326_201830.jpg

中身の解説

上側カバーの内部には、センサーがたくさんついています。黒い箱はバンパーが当たったのを検出。青い基板には赤外線距離計、ビーコン受信センサがついています。ビーコン受信センサは充電ステーションの信号と、立ち入り禁止タワーから出るビームを受信します。
IMG_20190326_201832.jpg

下側。2つのモーターはごみを中央に掃き寄せるブラシを動かします。4か所、床を検出するセンサーがついています。
IMG_20190326_201838.jpg

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

IMG_20190419_212459.jpg

IMG_20190419_213258.jpg

IMG_20190419_212117.jpg

IMG_20190419_214902.jpg

IMG_20190419_215136.jpg

ケーブルの接続

このようにして、書き込みをできるようにします。
IMG_20190326_174245.jpg

上側カバーを閉めていても、このようにすれば
IMG_20190420_083329.jpg

接続をすることもできます。
IMG_20190420_083309.jpg

プログラム配線のピン割当

image.png

テストプログラム

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

image.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

ピン割当(抜粋)

image.png

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

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

image.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 ) 底面ローリングブラシモーター

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1