環境設定
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」で動かします。
分解
中身の解説
上側カバーの内部には、センサーがたくさんついています。黒い箱はバンパーが当たったのを検出。青い基板には赤外線距離計、ビーコン受信センサがついています。ビーコン受信センサは充電ステーションの信号と、立ち入り禁止タワーから出るビームを受信します。
下側。2つのモーターはごみを中央に掃き寄せるブラシを動かします。4か所、床を検出するセンサーがついています。
書き込みのケーブルを作る
ケーブルの接続
プログラム配線のピン割当
テストプログラム
このプログラムで、PA7とRB6のピンを0.1秒おきにプラスの電気/マイナスの電気に入れ替えます。
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を上書きできてしまいました。
ピン割当(抜粋)
シリアル接続も試してみる
Serial2でプログラム配線から出力します。
センサーのポートをスキャンする
ボード設定を変えて、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 ) 底面ローリングブラシモーター