inside of AVTOKYO 10th HACK BADGE

AVTOKYO 2017
http://ja.avtokyo.org/avtokyo2017
で配布されたバッジ。

![IMG_20171117_220158.jpg](https://qiita-image-store.s3.amazonaws.com/0/165002/e8df529f-46ac-aed2-6b18-c7b9a6fc1e9b.jpeg)
左：フル版（個人スポンサーなど向け用）　　右：ボタン３つ版（一般参加者頒布用）


# 内蔵プログラムの機能

- Drink Ticket Request
- clicker（ミニゲーム）
- mini CTF（ミニゲーム）
- username edit
- credit
- factory reset

内蔵プログラムについての解説はこちら
https://qiita.com/lowlevel/items/12c55ce9260e7d369989

## フル版とボタン3つ版の違い

ボタンの数の違いだけです。
なお、内蔵プログラムはボタン３つしか使用していません。

#　Inside Hardware

![image.png](https://qiita-image-store.s3.amazonaws.com/0/165002/1afb2630-2b79-6a13-e143-9f921b571485.png)


## 搭載マイコンチップ

STM32F103C8

STMicrosystem の、32bit ARM マイコンです。

- Cortex-M3 Core
- CPU Clock 72MHz
- Flash 64KBytes(※)


スペック上は64KBytesですが、実際には128KBytesが搭載されています。

STM32の開発環境についてどのようなものがあるかの説明はこちら
https://qiita.com/nanbuwks/items/594568db3f5dc1d6c5fd

## 搭載しているマイコンボード

STMマイコンチップをバッジに直接搭載しているのではなく、RobotDyn社の「STM32F103C8T6 STM32 ARM Mini System Dev.board」を使いました。
これをバッジのサブ基板として搭載しています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/165002/2524b0ce-a787-0466-84f0-12c0cf1cef6a.png)

「STM32F103C8T6 STM32 ARM Mini System Dev.board」自体の使い方はこちら
https://qiita.com/lowlevel/items/47b0a8ba17f8afc473a6

## 回路図、パターン図

![image.png](https://qiita-image-store.s3.amazonaws.com/0/165002/71867275-c9c5-dbdf-1f06-8a1d6166a380.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/165002/79a50e0b-0fa9-8d5c-ac1c-e164906bdcb4.png)

## Pin assaignments

||HACK BADGE|Discription|
|---|---|---|
|BUTTON A|PA0 |Active High|
|BUTTON B|PC14 |Active High|
|BUTTON UP|PB5  |Active High|
|BUTTON DOWN|PB6  |Active High|
|BUTTON LEFT|PB7  |Active High|
|BUTTON RIGHT|PB8  |Active High|
|SPEAKER1|PA10 |Active High| 
|SPI OLED D0|PA5|CLK|
|SPI OLED D1|PA7|MOSI|
|SPI OLED RES|PA3|Reset|
|SPI OLED DC|PA6|DC(Data/Command)|
|SPI OLED CS|PA4|Cable Select|
|IR RECIEVE|PB11|RX3|
|IR SEND TRIGGER|PB10|TX3|
|IR SEND LED|PB0,PB1||

シルク印刷のSW-DOWN,SW-LEFT,SW-RIGHT,SW-UPはデタラメです。Sorry!



# 開発環境のダウンロード

様々な開発環境がありますが、ArduinoIDEを使って開発する場合は以下の通り。

## Arduio_STM32 環境構築

1. Arduino 開発環境をインストールします。
https://www.arduino.cc/

2. Arduino_STM32 をダウンロードし、展開します
https://github.com/rogerclarkmelbourne/Arduino_STM32

 1. 展開したものを、Arduinoフォルダ（後述）の中のhardwareに配置し直します。
 （Arduinoフォルダ）/hardware/Arduino_STM32-master
と配置します。先のgithubからZIPでダウンロード→展開したフォルダがArduio_STM32-masterだとすると、（Arduinoフォルダ）に、hardwareのフォルダを作成し、そこにArduino_STM32-masterを入れ、その中にLICENSE,README.md,STM32F1・・・などが入るようにします。

 ~~2. 更に、その中のexamplesにboards.txtという名前の空ファイルを作成します。
 これが無いと起動時に  「.....hardware/Arduino_STM32-master/examplesにboards.txtがありませんでした。1.5以前のものですか？」 というエラーが出る）~~ 



(2018/11/1時点での最新版で確認したところboards.txtの作業はしなくても良くなったみたいです)


3. Arduino IDEを起動して、＜ツール＞ー＜ボード＞ーボードマネージャで「Arduino SAM Boards(32-bits ARM Cortex-M3)」を追加します

## Windows

Arduino フォルダ：「ドキュメント」フォルダの中のArduinoフォルダ

また、Windowsのみの作業として、Arduinoフォルダ中のhardware/Arduino_STM32-master/drivers/win/install_drivers.bat を管理者で実行してください。
"install drivers for the Serial and DFU (upload devices)"
ということだそうです。

なお、ST-Linkを使う場合はST-Linkのドライバのインストールも必要となります。
http://www.st.com/ja/development-tools/stsw-link009.html

このページから STSW-LINK009 をダウンロード、インストールしてください。

更に、書き込み時にST-LINK_CLI.exeを使いますがこのプログラムはMSVCR100.dllおよびMSVCP100.dll、mfc100.dllが必要となります。
これらが無いエラーと鳴った場合には、Microsoft Visual C ++ 2010再頒布可能パッケージをダウンロードし、インストルします。
Microsoft Visual C++ 2010 再頒布可能パッケージ (x86)
https://www.microsoft.com/ja-jp/download/details.aspx?id=5555
Microsoft Visual C++ 2010 再頒布可能パッケージ (x64)
https://www.microsoft.com/ja-jp/download/details.aspx?id=14632
環境のテスト時にはx64,x86両方インストールしました。x86は必須ですが、x64も必要かどうかは未チェックです。


## Mac OSX

Arduino フォルダ：「書類」フォルダ中のArduinoフォルダ

## Linux

Arduino フォルダ：/home/<ユーザ名>/Arduino

また、Linuxのみの作業として以下の2つの作業が必要。

まず、
(Arduinoフォルダ)/hardware/Arduino_STM32-master/tools/linux64/install.sh
を実行して再起動。


また、
http://stm32duino.com/download/file.php?id=1360
から
77-mm-usb-serport-blacklist.rules.tar.gz
ダウンロードして解凍、できた77-mm-usb-serport-blacklist.rulesを
/etc/udev/rules.dに配置し、再起動する。

これは本家のmodemmanagerに付属の77-mm-usb-serport-blacklist.rulesにSTM32の仮想ポートを加えたもの。ArduinoUnoなどの記述も増えているのでこれを使おう。

これを配置する目的は、書込やリセットなどでモード遷移してUSBシリアルデバイスが消えたり現れたりするときに、Linux側の悪いmodemmanagerが悪いことをしてATコマンドを送ったりするのを防ぐため。

(cf,http://stm32duino.com/viewtopic.php?f=22&t=1892#p25160)

これをしないと、シリアルモニタを開くときに port busy とか言われる。




# Test Program

BadgeにはUSB Bootloaderが書き込まれているため、MicroUSBメモリを使って書き込みができます。

方法
![image.png](https://qiita-image-store.s3.amazonaws.com/0/165002/075e29f7-57d7-6984-dc97-9a7d2fc6c030.png)

1. Arduino IDEをセットアップする
2. バッジとPCをmicroUSBケーブルで接続する
3. Bボタンを押しながらリセットをする。Bボタンはリセットを離しても2,3秒押しておく
4. 3.がうまくいくと永続ブートローダーモードになる。永続ブートローダーモードになると青LEDが1秒間に約4回点滅します。
5. Arduino IDEで以下のようにスケッチ（プログラムのこと）を作り、設定を合わせて書込を行う
![image.png](https://qiita-image-store.s3.amazonaws.com/0/165002/34c8de4e-3d86-12cd-57f2-086a573b43bf.png)

以下は永続ブートローダーモードとまぎらわしくなくするため、LEDを脈動するようにしたもの。

```

void setup() {
  pinMode(PC13, OUTPUT);
}

void loop() {
  int wait=1;
  for ( int i = 1; i < 12; i++){
    digitalWrite(PC13, HIGH);
    delay(wait);
    digitalWrite(PC13, LOW);
    delay(wait);
    wait=wait*2;
  }
}
```
「ファイル」-「環境設定」-「書込設定」（Mac OSXの場合は「Arduino」 - 「Preferences」- 「書込設定」）で「より詳細な情報を表示する」で「書き込み」にチェックを入れると書込時に以下のように表示がされるようになります。

書込は、下の画面の右矢印ボタンです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/165002/82e9a07e-4899-f61c-e831-dec41a0bd20d.png)




# ST-Linkを使って書くやりかた

そのままだと、ブートローダーモードを使ってUSBケーブルで書けますが、操作に失敗してブートローダーを壊したりした場合はST-Linkを使って書き込みます。
配線は以下のようになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/165002/ceb651d5-1cfa-9bf5-a1e6-50a3f9f369d3.png)


ST-Linkを使えば、ブートローダーを使わないスケッチの書込をして起動の早いアプリを作成したり、ブートローダーの復旧などもできるようになります。

ST-Linkを使った場合の書込方法やブートローダの復旧方法などはこちらをご覧ください。
https://qiita.com/lowlevel/items/47b0a8ba17f8afc473a6


# Arduinoと違うところ

## ポート指定の方法

PC13という名前にしてください。


# OLEDディスプレイのプログラムを行うには

こちらを参照してください

https://qiita.com/nanbuwks/items/25ccb1ac38ebb237f94a